Tantangan ini mirip dengan yang lain ini , namun saya membuat batasan (lihat teks tebal di bawah) yang menurut saya akan membuatnya jauh berbeda dan (saya harap) juga menyenangkan.
Tantangan
Tulis program atau fungsi dalam bahasa pemrograman apa pun yang menggunakan input bahasa Inggris dari bilangan bulat positif yang n
tidak melebihi 100
dan kembali n
sebagai bilangan bulat.
Celah standar dilarang dan Anda tidak bisa menggunakan fungsi bawaan, alat eksternal, atau pustaka yang sudah melakukan pekerjaan ini .
Kode sumber terpendek dalam byte menang.
Uji
Di sini semua input->output
kasus:
one -> 1
two -> 2
three -> 3
four -> 4
five -> 5
six -> 6
seven -> 7
eight -> 8
nine -> 9
ten -> 10
eleven -> 11
twelve -> 12
thirteen -> 13
fourteen -> 14
fifteen -> 15
sixteen -> 16
seventeen -> 17
eighteen -> 18
nineteen -> 19
twenty -> 20
twenty-one -> 21
twenty-two -> 22
twenty-three -> 23
twenty-four -> 24
twenty-five -> 25
twenty-six -> 26
twenty-seven -> 27
twenty-eight -> 28
twenty-nine -> 29
thirty -> 30
thirty-one -> 31
thirty-two -> 32
thirty-three -> 33
thirty-four -> 34
thirty-five -> 35
thirty-six -> 36
thirty-seven -> 37
thirty-eight -> 38
thirty-nine -> 39
forty -> 40
forty-one -> 41
forty-two -> 42
forty-three -> 43
forty-four -> 44
forty-five -> 45
forty-six -> 46
forty-seven -> 47
forty-eight -> 48
forty-nine -> 49
fifty -> 50
fifty-one -> 51
fifty-two -> 52
fifty-three -> 53
fifty-four -> 54
fifty-five -> 55
fifty-six -> 56
fifty-seven -> 57
fifty-eight -> 58
fifty-nine -> 59
sixty -> 60
sixty-one -> 61
sixty-two -> 62
sixty-three -> 63
sixty-four -> 64
sixty-five -> 65
sixty-six -> 66
sixty-seven -> 67
sixty-eight -> 68
sixty-nine -> 69
seventy -> 70
seventy-one -> 71
seventy-two -> 72
seventy-three -> 73
seventy-four -> 74
seventy-five -> 75
seventy-six -> 76
seventy-seven -> 77
seventy-eight -> 78
seventy-nine -> 79
eighty -> 80
eighty-one -> 81
eighty-two -> 82
eighty-three -> 83
eighty-four -> 84
eighty-five -> 85
eighty-six -> 86
eighty-seven -> 87
eighty-eight -> 88
eighty-nine -> 89
ninety -> 90
ninety-one -> 91
ninety-two -> 92
ninety-three -> 93
ninety-four -> 94
ninety-five -> 95
ninety-six -> 96
ninety-seven -> 97
ninety-eight -> 98
ninety-nine -> 99
one hundred -> 100
Jawaban:
C, 160 byte
Menguji
Bagaimana itu bekerja
Setelah beberapa kali mencoba, saya menemukan fungsi yang memetakan "luar biasa" nomor
one
,two
,three
,four
,five
,six
,seven
,eight
,nine
,ten
,eleven
,twelve
,thirteen
,fourteen
,fifteen
,sixteen
,seventeen
,eighteen
,nineteen
,twenty
,thirty
,forty
,fifty
,sixty
,seventy
,eighty
,ninety
,one hundred
, dengan karakter ASCII yang dapat dicetakk
,.
,[
,<
,*
,,
c
,K
,w
,y
,e
,(
,S
,_
,-
,C
,)
,7
,=
,4
,&
,o
,]
,s
,Y
,g
,m
,N
, Masing-masing.Fungsi ini adalah:
Program golf menghitung
hash
fungsi input hingga mencapai akhir string atau karakter-
. Kemudian mencari hash dalam stringk.[<* cKwye(S_-C)7=4&o]sYgmN
dan menentukan angka yang sesuai. Jika akhir dari string input telah mencapai angka dikembalikan, jika sebaliknya sebuah-
telah tercapai, maka itu dikembalikan nomor ditambah hasil program golf yang diterapkan ke seluruh string input.sumber
JavaScript (ES6),
175166163156153147 byteDisimpan 7 byte berkat @Neil
Verifikasi di sini:
Tampilkan cuplikan kode
Bagaimana itu bekerja
Ide dasarnya adalah untuk membagi setiap angka menjadi digit-kata-katanya, lalu memetakan setiap kata ke digit yang sesuai. Hampir semua kata diatur untuk dicocokkan dengan benar dengan regex sederhana, tetapi ada beberapa anomali:
eleven
throughnineteen
: jika kata tersebut mengandung ael
, atau ate
di tengah (untuk menghindariten
), kami menambahkan aon-
ke awal, mengubahnya menjadion-eleven
lewaton-nineteen
.twenty
,thirty
, Dll .: menggantikan Trailingy
dengan-d
perubahan initwent-d
,thirt-d
, dllSekarang kita berpisah pada tanda hubung, spasi, dan
dr
s. Ini membagi semuanya dari 11 menjadi 99 menjadi angka-kata yang sesuai, dan"one hundred"
menjadi[one,hun,ed]
. Lalu kami memetakan masing-masing kata ini melalui array regex, dan menyimpan indeks yang cocok terlebih dahulu.Sekarang, setiap input akan menjadi array dari digit yang tepat. Yang harus kita lakukan adalah bergabung dengan mereka
join``
, mengonversi ke nomor dengan unary+
, dan kita sudah selesai.sumber
.findIndex(y=>x.match(y))
bekerjareplace
.sh + coreutils, 112 byte
Dapat dijalankan di semua testc sekaligus, satu per baris.
Penjelasan
The backticked
awk
mengevaluasi kesed
skripyang mengubah bagian-bagian angka menjadi representasi numerik mereka.
Baris tambahan skrip sed
jaga
-ty
s danone hundred
.Akhirnya, hapus
+
s dan semua yang bukan+
,*
atau digit.Hanya ekspresi matematika yang tersisa
dan bisa disalurkan ke
bc
.sumber
Pyth,
79767568 byteTerima kasih @ETHproduk selama 7 byte.
Pada dasarnya periksa dulu kasus sudut 100, kemudian gunakan array dari dua huruf pertama dari angka 0 hingga 11 untuk menentukan semantik input dan memodifikasi nilai sesuai dengan akhiran ("-ty" dan "-teen"; " lv "dalam 12 adalah kasus sudut lain). Pertama membagi input menjadi daftar kata, lalu memetakan masing-masing ke nilai, dan jumlahkan.
Dalam pseudocode pythonic:
Suite uji
Python 3, 218 byte
Pada dasarnya identik dengan jawaban Pyth.
Diluar topic:
Saya baru saja menemukan versi yang bermakna dari jawaban untuk kehidupan, alam semesta dan segalanya: itu adalah ranting yang haus teh. Wow, ranting yang mendambakan teh! Saya tidak yakin berapa banyak jawaban lain melakukan ini, tetapi untuk jawaban saya jika inputnya adalah "ranting teh-haus" hasilnya adalah 42.
sumber
"ontwthfofisiseeiniteel"
dalam program ini.Python 3,
365361310303 karakterGolf
Tidak disatukan
sumber
n="one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".split(",")
Tapi seperti yang saya lihat, harus berfungsi tanpa menugaskannya ke variabel n, panggil saja.index()
secara langsung."one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir;four;fif;six;seven;eigh;nine;twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".replace(";","teen,").split(",")
.Haskell,
252231 byteIni membuat daftar semua nama nomor bahasa Inggris dari "satu" ke "sembilan puluh sembilan" dan kemudian melihat indeks input naik. Jika tidak ada, kita ada di tepi kasus "seratus", jadi itu kembali
100
, kalau tidak itu akan mengembalikan indeks.Tidak disatukan
sumber
Python 2, 275 karakter
Sederhana membangun daftar setiap angka dan menemukan indeks.
sumber
Japt, 82 byte
Masing-masing
¿
mewakili karakter yang tidak dapat dicetak. Uji secara online!Berdasarkan jawaban JS saya. Kurangi satu byte jika output tidak perlu berupa bilangan bulat, karena akan muncul persis sama dengan string.
Bagaimana itu bekerja
sumber
JavaScript,
214199 byteSeperti biasa: ternyata ini terlalu lama untuk bersaing, tetapi sekarang setelah saya selesai, akan sia-sia untuk tidak memposting ini.
Mungkin ada cara yang jelas untuk bermain golf sejauh ini yang saya abaikan?
JSFiddle untuk kasus uji
sumber
f
kef=s=>([t,u]=s.split('-'),~s.indexOf('le')?11:~s.indexOf('lv')?12:e(t)+(t.slice(-3)=='een')*10+''+(u?e(u):t.slice(-1)=='y'?0:''))
? Juga, argumen string tunggal dapat dikirimkan ke fungsi seperti:s.indexOf`lv`
Perl, 158 byte
Berjalan dari baris perintah.
one hundred
harus dimasukkan"one hundred"
untuk menghentikannya ditafsirkan sebagai dua input.sumber