Nomor Campuran ke Fraksi yang Tidak Benar
Dalam tantangan ini, Anda akan mengonversi angka campuran menjadi fraksi yang tidak tepat.
Karena pecahan yang tidak tepat menggunakan angka lebih sedikit, kode Anda harus sesingkat mungkin.
Contohnya
4 1/2
9/2
12 2/4
50/4
0 0/2
0/2
11 23/44
507/44
Spesifikasi
Anda dapat menganggap penyebut input tidak akan pernah menjadi 0. Input akan selalu dalam format di x y/z
mana x, y, z adalah bilangan bulat non-negatif yang berubah-ubah. Anda tidak perlu menyederhanakan output.
Ini adalah kode-golf sehingga kode terpendek dalam byte menang.
code-golf
number
parsing
rational-numbers
Downgoat
sumber
sumber
x
,y
danz
menjadi negatif?x,y,z
input yang dipisahkan? Sebagian besar jawaban menganggap format input memang wajibx y/z
, tetapi beberapa tidak, maka pertanyaan ini memiliki jawaban yang pasti.Jawaban:
Japt, 10 byte
Woohoo, saat ini mengalahkan CJam!
Cobalah online!
Bagaimana itu bekerja
sumber
LabVIEW, 29 LabVIEW Primitif
sumber
CJam,
161514 byteatau
Uji di sini.
Penjelasan
Versi lain menghindari penggunaan variabel dengan menggunakan sedikit lebih banyak perpindahan tumpukan.
sumber
'//~\S/1$b'/@
ini adalah 13 byte. Sunting : oh saya lupa inputl
.Mathematica, 58 byte
Ini mengembalikan hasil yang disederhanakan. Jika mengeluarkan bilangan rasional alih-alih string baik-baik saja, kita dapat menyimpan 19 byte:
sumber
PowerShell,
474442 BytesDicoret 44 masih teratur 44; (
Golf beberapa byte dengan menggunakan regex
-split
. Golf beberapa lagi berkat TessellatingHeckler dengan menukar regex.The
$args-split'\D'
mengambil argumen masukan dan membagi pada karakter non-digit. Di sini ia melakukan dua pemisahan, satu di spasi, yang lain pada/
karakter. Hasilnya kemudian disimpan dalam tiga variabel menggunakan tugas simultan. Kami kemudian merumuskan output string sebagai ($l
jumlah eft kali$d
enominator ditambah$n
umerator) dieksekusi sebagai blok kode,/
slash, dan kemudian$d
enominator lagi.sumber
-split ' |/'
untuk menyimpan satu karakter dengan regex "cocokkan ini | atau itu", atau gunakan-split '\D'
untuk membagi pada apa pun yang bukan digit dan s (h) ave dua karakter. Jika @Downgoat bersedia sedikit fleksibel pada format output,'{0}*{2}+{1};{2}'-f($args-split'\D')|iex
adalah 40 byte dan memiliki output yang lebih keren karena angkanya bahkan satu di atas yang lain!$l,$n,$d=$args-split'\D';+$l*$d+$n;$d
lebih pendek lagi di 37, dan secara logis mengikuti pola yang sama seperti di sini.Java dengan Ten Foot Laser Pole 1.03, 79 + 25 (import) = 104 bytes
Membutuhkan
import sj224.tflp.math.*;
Ini hampir pasti akan bekerja dengan 1.04 juga, tetapi sejauh ini saya hanya mengujinya dengan 1.03 karena saya sudah memiliki proyek java yang diatur dengan 1.03 di jalur build.
sumber
JavaScript (ES6),
4441 byteDisimpan 3 byte berkat @ETHproductions !
Penjelasan
Sangat sederhana.
Uji
Tes tanpa merusak penugasan untuk bekerja di sebagian besar browser.
Tampilkan cuplikan kode
sumber
[p,q,r]=
di tempatp=
, kemudian gantip[0]
,p[1]
danp[2]
denganp
,q
, danr
masing-masing. Setelah perubahan ini, saya mendapatkan 41:m=>([p,q,r]=m.match(/\d+/g),+q+p*r+"/"+r)
m.split(/\W/g)
sebagai gantinya untuk menyimpan byteJulia,
5850 byteIni adalah fungsi anonim yang menerima string dan mengembalikan
Rational
objek tipe. Untuk menyebutnya, berikan nama, misf=s->...
.Kita dapat mengambil keuntungan dari kenyataan bahwa input dapat sedikit dimanipulasi untuk menjadi ekspresi yang dievaluasi menjadi rasional. Secara khusus, bilangan bulat ditambah rasional adalah rasional, dan rasional dilambangkan dengan garis miring ganda. Jadi jika kita berubah
4 1/2
menjadi4+1//2
, hasil yang dievaluasi akan menjadi9//2
.Tidak Disatukan:
sumber
Smalltalk - 76 karakter
Masukan persis cocok dengan pembatas array dan representasi fraksi yang melekat dari Smalltalk. Kalau saja tidak begitu bertele-tele, itu bisa menjadi pesaing serius!
Penyederhanaan yang terlalu buruk bukanlah keharusan, Smalltalk melakukannya secara otomatis!
sumber
Bash + coreutils, 28
$@
mengembang ke semua parameter baris perintah, jadi${@/\// }
mengembang ke semua parameter baris perintah dengan/
diganti dengan, yang diletakkan di
dc
atas tumpukan. Sisanya adalah manipulasi tumpukan dan aritmatika sederhana.sumber
Haskell ,
746763 byteCobalah online!
Penjelasan
Seperti yang diketahui oleh H.PWiz , kita dapat menggunakan lexer Haskell di sini untuk memecah string menjadi bagian-bagiannya. (Sebelumnya saya menggunakan
span(>'/')
) Dan Laikoni menunjukkan bahwa itu<$>
berfungsi sepertimapSnd
dariData.Tuple
.Pengawal pola memecah kode kami menjadi tiga angka yang ingin kita gunakan
lex
.lex
memanggil haskell's lexer untuk memutus token pertama. Ini mengembalikan daftar dengan masing-masing elemen yang mewakili cara yang mungkin untuk mengurai string. Elemen-elemen ini adalah tupel dengan elemen pertama menjadi token pertama dan sisanya dari string menjadi elemen kedua. Sekarang karena format input sangat teratur, kami hanya akan memiliki satu parse, jadi kami selalu dapat mengambil yang pertama. Hal pertama yang kita lakukan adalah memanggillex
inputLalu kami membuka bungkusnya dari daftar itu memberi kami 2-tuple
Token pertama akan menjadi seluruh bagian dari fraksi campuran yang meninggalkan fraksi yang didahului oleh spasi untuk tetap diuraikan. Kemudian karena tupel
Functors
kita dapat menggunakan(<$>)
alias untukfmap
menerapkanlex
ke elemen kedua tupel.Ini memakan ruang dan memutuskan token berikutnya, pembilang dari fraksi kami. Sekarang kita ikat ini ke pencocokan pola menggunakan
<-
. Pola kita adalaha
meraih seluruh bagian dari fraksi, token pertama kami.:_
membuka daftar yang dihasilkan dari yang kedualex
.c
meraih token kedua yang kami lexed, yaitu pembilang dari pecahan. Segala sesuatu yang tersisa terikat padas:d
yang membaginya menjadi karakter pertama, dijamin oleh format menjadi/
dan sisanya yang akan menjadi penyebutnya.Sekarang kita telah mem-parsing input, kita melakukan perhitungan yang sebenarnya:
Di mana
r
fungsi baca yang kita ikat sebelumnya.Penting untuk dicatat bahwa
lex
mengembalikan daftar kosong jika gagal dan tidak kosong jika berhasil. Kenapa ini bukanMaybe
saya tidak tahu.sumber
/
Javascript ES6, 62 byte
sumber
[b,c]=
di tempatb=
, lalu menggunakanb
di tempatb[0]
danc
di tempatb[1]
. Selain itu, Anda dapat mengatur ulang persamaan sehingga Anda tidak memerlukan tanda kurung sama sekali:p=prompt;[b,c]=p(a=+p()).split
/;alert(+b+c*a+"/"+c)
Perl,
826138 byteIni mungkin bisa lebih banyak golf.
Perubahan
split
, dan 5 dengan menggunakan<>
bukan<STDIN>
.sumber
#!perl -paF/\D/
(9 byte), Anda dapat menggunakan$_=$F[0]*$F[2]+$F[1]."/$F[2]"
.#!perl
dari shebang dan linefeed tidak masuk hitungan. Ini hanya 38 byte.Mathematica, 51 byte
Menariknya, Mathematica mendukung ini dengan built-in. Jika mengeluarkan nomor diperbolehkan, maka kita hanya perlu 28 byte:
sumber
Jawa,
159148142120110 byteMenyimpan banyak byte berkat FlagAsSpam.
sumber
Long b=new Long(a[0]),c=new Long((a=a[1].split("/"))[0]),d=new Long(a[1]);
ARBLE , 13 byte
Cobalah online!
sumber
"x y/z"
wajib untuk tantangan khusus ini, tapi kalau-kalau saya sudah meminta OP untuk memverifikasi.05AB1E ,
1715 byte-2 byte terima kasih kepada @MagicOctopusUrn .
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Dengan input-dan output-format yang fleksibel, mengambil bilangan bulat dalam urutan
x,z,y
dan mengeluarkan nominator dan penyebut pada garis yang terpisah itu akan menjadi 4 byte (itulah sebabnya saya menambahkan -tag penguraian ke tantangan ..):Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
4 1/2
wajib untuk tantangan khusus ini. Jika tidak saya akan menggunakan saya versi 4-byte (atau jika keluaran adalah wajib, tapi masukan fleksibel saya akan menggunakan ini 6-byter:*+'/²J
)a
ke dalam tumpukan " .. o.Ô Persis apa yang saya butuhkan untuk tantangan ini! Dan cerdas dengan bergabung dengan "/". Terima kasih! :)a
ke dalam tumpukan " daripada menggunakan'`'
..Python 3 ,
7876 byteCobalah online!
sumber
return'%s/'%(int(a)*int(c)+int(b))+c
lebih pendek 2 byteStax , 1 byte
Jalankan dan debug itu (meskipun tidak banyak yang bisa di-debug)
Spesifikasi tantangan mengatakan, "Anda tidak perlu menyederhanakan output." Dengan asumsi itu diizinkan untuk disederhanakan, maka ada instruksi bawaan untuk melakukan ini. Masukan secara implisit ditafsirkan sebagai bilangan bulat dan bilangan rasional. The
+
instruksi melebar baik untuk rasional, menambahkan, dan menyederhanakan. Hasilnya dicetak secara implisit.sumber
Perl 5 dengan -la -Mfeature = katakanlah,
32 byte25 byteCobalah online!
(-7 byte terima kasih kepada Dom Hastings)
$_
adalah seluruh inputx y/z
, yang mengevaluasi nilaix
dalam konteks numerik (seperti di*
sini).$'
adalah string pasca-pertandingan regex, yang di sini berisi apa pun yang muncul setelah/
- jadiz
,. Untuk mendapatkany
nilai, kami menggunakan-a
flag yang membagi input pada spasi dan menempatkannya dalam@F
array. Jadi di sini,,@F = ("x", "y/z")
yang berarti$F[1]="y/z"
yang mengevaluasi dalamy
konteks numerik (karenay
adalah urutan awal angka yang berdekatan$F[1]
).sumber
-p
bendera dalam hitungan byte Anda; alih-alih Anda menghitung bahasa sebagaiPerl 5 with -p flag, 32 bytes
. Lihat meta ini untuk konsensus saat ini.$'
adalah satu-satunya perbedaan nyata di sana!$'
dan-a
-$F[n]
untuk mendapatkan bagian dari string adalah ide yang cukup bagus, saya harus ingat itu! Terima kasih, perbarui posnya.Lua, 123 Bytes
sumber
Bima Sakti 1.6.0 , 31 byte
Akhirnya menjadi lebih lama dari yang saya kira.
Penjelasan
Pemakaian
sumber
Python 2.7, 88 Bytes
Cobalah online !
Anda harus mengetikkan input dalam tanda kutip.
Mungkin bukan yang terbaik ...
sumber
C, 64
Membaca input dari STDIN. Cukup jelas, saya kira.
sumber
Periksa , 120 byte
Cobalah online!
Saya mungkin dapat menyimpan beberapa byte dengan tidak mencoba menggunakan kembali parsing loop (baris kedua). Dengan begitu saya bisa membuat loop lebih spesifik, menghindari kekacauan besar kondisional, dan saya bisa menggunakan register untuk hal-hal lain.
sumber
Ruby , 23 byte
Cobalah online!
sumber
C #, 112 byte
Versi Lengkap / Diformat:
sumber
APL (Dyalog Unicode) , 31 byte
Cobalah online!
Terima kasih ngn untuk
⊃⊥1∘↓
triknyasumber
PHP, 65 Bytes
Cobalah online
Kode
Penjelasan
sumber
Java 10, 87 byte
Seekor lambda dari
String
keString
.Cobalah secara Online
sumber