Tantangan CodeGolf
PWSSHHHH! Anda terbangun di laboratorium cryogenics pada tahun 3000. Setelah diantar ke kantor penugasan untuk menerima chip karier Anda, mungkin seorang pengantar kiriman, seorang penyelidik mendeteksi bahwa Anda berasal dari tahun 2000. Karena itu, dan beberapa stereotip, Anda dianggap bodoh dibandingkan dengan manusia modern saat ini dan dipaksa untuk mengulang sekolah dasar.
Anda memasuki ruang kelas satu dan guru memberi tugas. Dia akan mengatakan atau menulis nomor hingga 50. Jika dia menulis nomor di papan tulis (misalnya: 25) maka Anda harus mengatakan angka hingga angka itu "satu, dua, tiga, ..., dua puluh lima ". Jika dia mengatakan nomor itu keras-keras (misalnya: "enam") maka, di tablet Anda, Anda harus menulis angka hingga angka itu "1, 2, 3, 4, 5, 6"
Ini menjadi sangat membosankan dan Anda memutuskan untuk mengotomatiskan proses dengan pengetahuan pemrograman abad ke-21 yang masih berfungsi.
Objektif:
Program Anda harus mengambil input. Input ini akan berupa angka desimal ( 1 thru 50
) atau angka yang dituliskan ( one thru fifty
).
• Jika input adalah angka desimal, output Anda harus dihitung dari satu ke angka tersebut, menggunakan gaya penulisan. (mis. tiga puluh dua )
• Jika input adalah angka yang ditulis, output Anda harus dihitung dari 1 hingga angka tersebut, menggunakan gaya desimal. (mis. 32 )
Aturan:
Input dan Output dapat dalam hal apa pun yang Anda pilih (sehingga Anda dapat membuat program yang hanya menerima huruf besar jika diinginkan).
Input angka desimal tidak harus dari tipe angka (misalnya int), mereka dapat berupa string input yang berisi angka (25 vs "25"). Keduanya baik-baik saja dan Anda dapat memilih mana yang Anda inginkan untuk diterima oleh program Anda. (Program Anda tidak perlu menerima keduanya)
Gaya tertulis TIDAK memerlukan tanda hubung di antara kata-kata majemuk, tetapi Anda bisa jika diinginkan.
Nilai output harus dipisahkan dalam beberapa bentuk, pemisah apa pun baik-baik saja 1,2,3
1 2 3
etc
Anda tidak dapat menambahkan pustaka tambahan seperti num2words (python) dll. (Namun pustaka sistem baik-baik saja)
Meskipun cerita belakang mengatakan bahwa Anda berasal dari tahun 2000, Anda dapat menggunakan bahasa yang dibuat setelah tanggal tersebut (lol)
Ini adalah kode-golf , sehingga program dengan bytecount terpendek menang!
Jawaban:
Perl 6 ,
119113 byteBasis data Unicode FTW!
Menggunakan angka-angka yang ditulis dalam huruf besar tanpa hip, misalnya
TWENTYTWO
.Mengembalikan daftar string, atau serangkaian angka. (Keduanya menggunakan ruang sebagai pemisah saat dicetak dengan
put
.)sumber
Python3,
276271269243237235232217 byteMengambil isyarat dari pengiriman perl @smls ...
Saya kira itu mungkin golf sedikit lebih jauh.
Itu menggunakan perpustakaan sistem
unicodedata
untuk mencari nama untuk angka. Ini membutuhkan nama-nama nomor huruf besar (dipisahkan oleh spasi :)FORTY TWO
) atau bilangan bulat desimal sebagai input.(Ini adalah pengiriman golf kode pertama saya.)
(Saya juga baru menyadari bahwa saya salah menghitung panjang (penyandian), jadi beberapa byte lebih sedikit dari yang diperkirakan sebelumnya. Namun, saya hanya memperbarui jumlah byte yang terbaru. Ups.)
sumber
unicodedata
adalah pustaka sistem yang datang dengan instalasi default, bukan pustaka "ekstra" yang perlu diinstal secara terpisah.for
lingkaran dan memiliki baris baru di antara setiap output.print()
tidak peduli apakah itu bilangan bulat atau string. Cobalah online!import*
daripadaimport name
menyimpan beberapa byteGangguan umum,
297253243242144128Detail
~[ 0 ~; 1 ~; ... ~:; else ~]
adalah switch, berdasarkan nilai argumen yang tersedia berikutnya, yang melompat ke format sub-kontrol yang sesuai. Di sini, saya hanya memiliki case "0" dan untuk "lain". Ini digunakan untuk menyisipkan pemisah sebelum setiap angka kecuali yang pertama, terima kasih kepada U mulai dari nol.~:[ FALSE ~; TRUE ~]
adalah format bersyarat; di sini kita menampilkan berbagai hal secara berbeda apakah input s adalah string atau tidak.~R
tulis nomor sebagai nomor kardinal bahasa Inggris, sedangkan~D
cukup cetak nomornya.Contohnya
sumber
f
sehingga "(f 2)" mencetak "satu, dua" dan(f "two")
mencetak "1, 2", apakah itu terlihat baik bagi Anda?JavaScript ES6,
559 526 381 368 364 358 332 327315 byteTerima kasih kepada Kritixi Lithos untuk gagasan pemisahan array dan Arnauld untuk trik 1 / n.
sumber
var
dan Anda dapat mengubah array['one,'two',..]
ke"one0two0three0...".split(0)
null, Array(n)
.!isNaN(n)
dengan1/n
. Ini memberi AndaNaN
untuk string (falsy), float non-nol untuk integer non-nol (benar), atauInfinity
untuk 0 (juga benar).Python 2 ,
503499494490479 byte-5 dengan terima kasih kepada @JonathanAllan
Cobalah online!
Masukkan angka atau spasi ejaan angka yang terpisah.
Versi sedikit kurang golf dan lebih mudah dibaca:
sumber
l="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
e
darinineteen
.Skema,
161,152, 149Terkompresi:
sumber
string->number
apakah ini, saya memeriksa dengan cepat dan tampaknya digunakan untuk mengkonversi misalnya dari string"4"
ke angka4
.(string->number "four")
kembali#f
.PHP -
397372349344329 byteTerinspirasi oleh solusi JS TomDevs
Disimpan 25 byte dengan mengganti
$a=[...]
oleh$a=explode(...)
Menyimpan 23 byte lainnya dengan beralih kembali ke array tanpa pembatas string dan dengan menyimpan
teen
dalam sebuah variabel, terima kasih kepada @ user59178Menyimpan 5 byte lainnya dengan menghapus
(int)
typecastingDisimpan 15 byte lagi dengan menjatuhkan
$b
,$i
dalamfor
deklarasi, dan kurung kurawal, terima kasih kepada @ user59178 lagiTidak Disatukan:
Cobalah untuk string input atau untuk nomor input
sumber
teen
dalam variabel daripada mengulanginya setiap kali. Dengan demikian akan menjadi:$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];
;)
$b
dan meletakkan array kedua langsung ke foreach, 6 byte lebih banyak dengan menjatuhkan semua kurung kurawal (meskipun Anda harus memasukkan$a=$c
ke dalam pengaturan loop for) dan 6 byte lagi dengan post-incrementing$i
ketika Anda menggunakannya daripada di 'setelah' sedikit untuk loop.for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Python 2, 262 byte
repl.it
String input dan output adalah huruf kecil dan bersambung *, jadi untuk menguji input string masukkan, misalnya,
"thirtyfive"
pada prompt.Buat daftar semua kata (plus
"fiftyone"
to"fiftynine"
),,x
lalu uji apakahinput
kata dengan proxyv>50
(string lebih besar dari angka di Python 2, dan semua angka dalam rentang input yang valid dari spesifikasi tersebut<=50
) danprint
apakah sesuai nilai dengan mengiris daftarx[:v]
,, atau membangun berbagai bilangan bulatrange(1,x.index(v)+2)
,.* Menambahkan tanda hubung pada kedua biaya 11 byte, dengan mengganti
a+"ty"b
dengana+"ty"+'-'*(b>'')+b
.sumber
Bahasa Wolfram, 92 byte
(Saya baru dalam hal ini, beri tahu saya jika saya melakukan sesuatu yang salah)
sumber
Do[Print@If[#>0,i,,IntegerName@i],{i,If[#>0,#,,Interpreter["SemanticNumber"]@#]}]&
JavaScript (ES6), 261 byte
Catatan: string yang ditugaskan ke z dikodekan dengan
atob
. Dalam string yang disandikan ada 11 byte yang saya tidak bisa posting ke situs ini, bahkan jika mereka karakter yang valid dalam string javascript. Jadi saya menggunakan hex escape dalam bentuk \ xHH. Masing-masing lolos ini dihitung sebagai 1 byte.String asli yang tidak dikompresi adalah versi yang kurang golf .
Kurang golf
Uji
sumber
ö\x89ÞöÜ(öØ...
barang ini sangat bagus hahaaPython 3 ,
305303 byteDikonversi ke Python 3 setelah saran dari @ nedla2004. Sekarang juga tidak ada ruang antara angka tertulis pada input atau output misalnya masukkan dua puluh dua
Cobalah secara online 3!
Python 2 ,
327320313308 byteCobalah online 2!
163170177 byte lebih pendek dari jawaban asli saya jadi saya mempostingnya sebagai alternatif. Ini digunakanfor
pada dua daftar untuk membangun daftar lengkap semua representasi string dari angka-angka kemudian mengidentifikasi yang benar dalam daftar dan mencetak semuanya hingga itu baik dengan nilai atau indeks. Menghasilkan baris baru untuk setiap nilai.sumber
Python 2,
432 422 416403 byteSaya yakin ini bisa diperbaiki. Paling tidak jika saya bisa lolos dengan hardcoding nilai untuk dikerjakan dan tidak membutuhkan fungsi saya dapat menyimpan 20. Perlu ruang untuk memisahkan kata-kata dalam input teks. Disimpan 6 byte berkat komentar JonathanAllan pada jawaban ElPedro, 4 untuk mengatur ulang matematika.
(NB: Versi aktual ini menggunakan tab untuk indentasi alih-alih spasi. QPaysTaxes menambahkan spasi tunggal karena itu tidak merender dengan benar, untuk memastikan bahwa kode yang dikompilasi. Tidak seharusnya mengubah jumlah byte.)
sumber
len(`f`)>2
bisa...`f`[2:]
untuk 3 lagi saya percaya. (abaikan yang...
sepertinya tidak bisa membuat backtick bekerja dengan benar)f>50
6. (dan satu lagi dengan tidak menggunakand
)TypeError: 'int' object has no attribute '__getitem__'
. Jika saya melewatkan input numerik sebagai string,f[2:]
semakin dekat tetapi masih gagal ketika dijalankan sebagai boolean (print f[2:] and True
mencetak garis kosong jika len (f) <2, tidakTrue
atauFalse
)f>50
bekerja, terima kasih. Menjatuhkand
tidak begitu sederhana karena saya selalu memasukkan nilai akhir dari loop ke dalamf
sehingga baris 8 tidak dapat diubahif f>50
karena tidak akan pernah benar.C ++ 11,
484480477 byteInput teks dalam huruf kecil tanpa tanda hubung.
sumber
PowerShell , 362 byte
Cobalah online! input kata atau input angka
Ini adalah kekacauan yang tepat, dan saya tidak terlalu senang dengan itu, tapi ini dia. Saran bermain golf diterima.
Baris pertama
$z
menjadi array kata-kata bahasa Inggris penuh. Anda dapat melihat-split0
angka-angka1
untuk12
, dan loop untuk membangun semuateen
, dan kemudian ada banyak logika untuk menyatukan semuanya dengan benar. Cobalah online!Baris kedua dimulai dengan beberapa logika. Kami mengambil input
$args
(sebagai string),-split
itu di spasi, menyimpannya$n
untuk digunakan nanti, mengambil[0]
kata pertama , dan[0]
karakter pertama dari itu, dan memeriksa apakah itu adalah-in
rentang48..57
(yaitu, ASCII0
ke9
). Jadi, kami sedang memeriksa apakah kami memiliki input desimal atau input bahasa Inggris. Cobalah online!Dalam kasus pertama, kami membuat rentang berdasarkan input desimal
$n[0]..$n[2]
dan menggunakannya untuk mengindeks$z[...]
. Dalam kasus lain, kami menemukan.indexOf()
kata pertama dan kata terakhir, dan hanya membangun rentang numerik dari itu. Dalam situasi apa pun, kami sekarang memiliki array objek pada pipa (baik string atau integer), dan implisitWrite-Output
pada penyelesaian program memberi kita garis baru antar elemen.sumber
Swift3, 402 byte
Tidak Disatukan:
Tidak ada yang istimewa di sini, hanya menggunakan array untuk membuat cadangan angka yang ditulis.
Saya awalnya berpikir solusi ini menggunakan cara lain ini untuk menghitung
values
array:Yang bisa golf ke:
mengganti baris ke-3 dalam kode golf
Saya bisa saja mencetak 381 byte, tetapi, ada kesalahan kompiler yang mengatakan: "ekspresi terlalu rumit untuk dipecahkan dalam waktu yang wajar", info lebih lanjut tentang kesalahan dapat ditemukan di sini
sumber
R,
452430424 byteTempatkan angka-angka dalam data.frame dengan angka-angka yang ditulis sebagai nama kolom, membuat terjemahan antara keduanya (dan pencetakan berikutnya) cukup mudah.
Upaya utama dalam bermain golf adalah menciptakan angka-angka yang ditulis untuk 20-49, mungkin lebih banyak untuk bermain golf di sini.
Saya berusaha dengan
as.matrix
mencetak data.frame hanya dengan angka-angka, tetapi saya masih pergi dengan header matriks. Semoga tidak apa-apa.Tidak Disatukan:
sumber
o=c("","one","two","three","four","five","six","seven","eight","nine") ; v=c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"); w=c("twenty","thirty","forty"); a=data.frame(0:50, c(o,v, sapply(w[1:3],function(y) sapply(o,function(x) paste0(y,x))),"fifty")); b=which(a==i); a[if(b<52) 2:b else 2:(b-51),ifelse(b<52,2,1)]
C,
342331 byteCobalah online!
sumber
SAS, 179
Output ditulis ke log yang dipisahkan oleh baris baru. SAS memiliki format bawaan untuk mengonversi angka menjadi kata-kata, yang merupakan keuntungan utama untuk tantangan ini, tetapi yang menjengkelkan tidak memiliki informasi untuk melakukan sebaliknya.
sumber