Tugas
Diberikan serangkaian nama angka dalam Bahasa Inggris yang "diciutkan" bersama, seperti ini:
zeronineoneoneeighttwoseventhreesixfourtwofive
Pisahkan string kembali menjadi digit:
zero nine one one eight two seven three six four two five
Aturan
Masukan selalu berupa string. Itu selalu terdiri dari satu atau lebih nama digit bahasa Inggris huruf kecil, diciutkan bersama, dan tidak ada yang lain.
- Nama digit bahasa Inggris adalah
zero one two three four five six seven eight nine
.
- Nama digit bahasa Inggris adalah
Outputnya mungkin berupa daftar string, atau string baru di mana digit dibatasi oleh string non-alfabet, non-kosong. (Output Anda mungkin juga opsional memiliki string seperti di awal atau akhir, dan pembatas tidak perlu konsisten. Jadi, bahkan sesuatu seperti
{{ zero0one$$two );
ini (jika masuk akal) jawaban yang valid untukzeroonetwo
.)Jawaban terpendek dalam byte menang.
Uji kasus
three -> three
eightsix -> eight six
fivefourseven -> five four seven
ninethreesixthree -> nine three six three
foursixeighttwofive -> four six eight two five
fivethreefivesixthreenineonesevenoneeight -> five three five six three nine one seven one eight
threesevensevensixninenineninefiveeighttwofiveeightsixthreeeight -> three seven seven six nine nine nine five eight two five eight six three eight
zeroonetwothreefourfivesixseveneightnine -> zero one two three four five six seven eight nine
Jawaban:
Retina , 20 byte
Cobalah online!
sumber
C (gcc) ,
89 80 76 75 72 71 7069 byteCobalah online!
(89) Kredit untuk gastropner untuk hash XOR.
(76) Kredit untuk Toby Speight untuk gagasan menggunakan 1 dan 3.
(75) Kredit untuk Michael Dorgan untuk
'0'
→48
.(72) Penghargaan untuk Michael Dorgan dan Lynn untuk literal dengan karakter kontrol.
(69) Penghargaan untuk Lynn untuk
x?y:0
→x&&y
sumber
Python 2 , 50 byte
Cobalah online!
Terima kasih untuk Lynn .
Berkat -4 untuk Uriel 's jawaban regex' s.
sumber
import re;re.compile('…').findall
harus menyimpan beberapa byte. Saya memang berharap ini berubah menjadi golf regex :)Befunge,
87858176 byteCobalah online!
Befunge tidak memiliki instruksi manipulasi string, jadi yang kami lakukan adalah membuat semacam hash dari tiga karakter terakhir yang ditemui, saat kami memprosesnya.
Hash ini pada dasarnya adalah tiga digit, nomor basis-104. Setiap kali karakter baru dibaca, kita mod hash dengan 104 2 untuk menyingkirkan karakter tertua, kalikan dengan 104 untuk membuat ruang untuk karakter baru, kemudian tambahkan nilai ASCII dari karakter baru mod 27 (untuk memastikan tidak meluap).
Untuk tujuan perbandingan, kami mengambil nilai ini mod 3817, menuliskannya ke dalam memori (sehingga memotongnya menjadi 8 bit), yang menghasilkan angka yang lebih kecil yang lebih mudah ditangani Befunge. Hash yang kemudian harus dibandingkan adalah 0, 38, 59, 64, 88, 92, 114, 117, dan 123. Jika cocok dengan semua itu, kita tahu bahwa kita telah menemukan urutan karakter yang menandai akhir dari angka, jadi kami mengeluarkan ruang tambahan dan mengatur ulang hash ke nol.
Jika Anda bertanya-tanya mengapa basis 104, atau mengapa mod 3817, nilai-nilai itu dipilih dengan hati-hati sehingga daftar hash yang kami butuhkan untuk dibandingkan dapat diwakili dalam sesedikit mungkin byte.
sumber
Java (OpenJDK 8) ,
554643 byteMenyimpan 9 byte berkat Forty3 / FrownyFrog
Menyimpan 3 byte berkat Titus
Cobalah online!
sunting: Terima kasih atas sambutan dan penjelasan lambda!
sumber
g
bukan regex suffixAll
).f=(s)=>
bukans->
, yang 4 byte lebih pendek.C (gcc) ,
179159146139137116107103102 byteSunting 1: (Menambahkan saran dari Tn. Xcoder - terima kasih! - Versi makro saya memiliki ukuran yang sama dengan Anda, tetapi saya lebih menyukai milik Anda.)
Sunting 2: Perubahan char individual dibandingkan dengan panggilan ke
strchr()
Sunting 3: K&R adalah deklarasi var (Eww!)
Sunting 4: Ketika 1 makro tidak cukup ...
Sunting 5: Diulang dengan algoritma baru yang disarankan di atas. Terima kasih kepada James Holderness untuk ide bagus ini!
Sunting 6: Dihapus 0 ditetapkan karena sepertinya pergi ke sana secara otomatis - Teknik golf kode master level digunakan (koma, trik printf, dll.) - terima kasih gastropner !
Sunting 7: Gunakan memchr dan perbaiki bug yang ditunjukkan oleh James Holderness .
Sunting 7: Gunakan
&&
pada pemeriksaan akhir untuk mengganti?
- terima kasih jxh .Cobalah online!
Non-golf (Yang masih sangat golf jujur ...)
Solusi grep-esqe lurus ke depan:
Versi lama dan bersih.
Cobalah online!
sumber
#define
ingputchar
dan menghapus sepasang kurung yang tidak perlu.#define p putchar(
sebagai gantinya (perhatikan tanda kurung terbuka).c,h=0;f(char*s){while(c=*s++)putchar(c),h=h%10816*104+c%27,c=h%3817,printf(" "+!(c&&strchr("&;@X\\ru{",c)));}
JavaScript,
6657524441 bytes=>s.replace(/one|t[wh]|.i|[fsz]/g," $&")
Cukup naif, tetapi berhasil.
Tangkapan yang bagus oleh FrownyFrog untuk menggunakan 2 karakter .. kecuali untuk "satu" yang pemeriksaan murni 2 arang bisa mengacaukan zeronine. Sunting: single
f
dans
tangkapan bagus oleh FrownyFrog yang saya abaikan dua golf pertama saya.Terima kasih, Neil, atas saran lambda yang tidak disebutkan namanya dan dapat menggunakan satu char untuk
z
mencapai 52.Titus datang dengan RegEx yang lebih kecil. Saya merasa kita menuju regex Uriel akhirnya.
sumber
z|tw|th|f|s|ei|ni|on
on|t[wh]|.i|[fsz]
(-4 byte)on|
akan cocokzeronine
zer onine
Retina ,
2423 byteCobalah online! Sunting: Disimpan 1 byte berkat @FrownyFrog.
sumber
.....
->.{5}
bekerja?C,
10399 byteIni berfungsi untuk pengkodean karakter apa pun (termasuk yang canggung seperti EBCDIC), karena tidak menggunakan nilai numerik karakter input. Sebaliknya, ini menempatkan huruf pertama dan ketiga dalam string ajaib. Jarak antara ini menunjukkan berapa banyak huruf untuk maju dengan setiap cetak.
Program uji
sumber
J ,
3735 byteCobalah online!
sumber
f=:[:>'..[eox]|[tse]?....'&rxall
dan itu bekerja di interpeter, tetapi tidak berhasil di TIO.C (gcc) ,
106 byte104 byte-2 byte terima kasih kepada @jxh
Cobalah online!
XOR benar-benar sekutu terbesar kami.
sumber
s[1]
akan lebih pendek.Retina , 28 byte
Cobalah online!
sumber
Pyth ,
35 2723 byteMenyimpan banyak byte dengan porting pendekatan Uriel .
Coba di sini! Pendekatan awal.
sumber
Pip , 27 byte
Mengambil input sebagai argumen baris perintah. Cobalah online!
Penggantian regex sederhana, menyisipkan spasi sebelum setiap pertandingan
[zfs]|one|[ent][iwh]
.Melompati
pencurian mencuripinjaman Uriel memberikan 23 byte (dengan-s
bendera):sumber
Jelly ,
2321 byteOutput penuh dipisahkan dengan pencetakan baris-umpan yang diprogram. Catatan: setelah selesai berulang kali mencetak baris kosong "selamanya" (hingga batas rekursi besar atau seg-kesalahan)
Cobalah online! (Output TIO diakumulasikan, implementasi lokal akan mencetak baris demi baris)
Bagaimana?
Dimulai dengan daftar karakter, program berulang kali:
Panjang kata pertama ditentukan dengan memeriksa tiga karakter pertama dari daftar karakter saat ini (harus merupakan bagian dari kata pertama). Program mengonversikannya menjadi ordinals, mengalikannya bersama, modulos hasilnya dengan 953, modulos yang dengan tujuh, modulos yang oleh tiga dan menambahkan tiga:
sumber
C
168,145,144, 141 byteEDIT: Mencoba init 'i' to 1 seperti itu
Untuk menghilangkan spasi putih terkemuka,
tetapi terputus pada input mulai dengan tiga, tujuh atau delapan
141
Cobalah online
144
Cobalah online
168
Cobalah online!
Tidak disatukan
konstanta int menjadi tidak perlu besar dengan menggeser << 8
tetapi jika Anda dapat membandingkan dengan string entah bagaimana itu harus menjadi yang paling alami
146 Menggunakan perbandingan string
Menggunakan perbandingan String
Kebingungan
sumber
Jelly , 44 byte
Cobalah online!
sumber
Cukup lama. Anda dipersilakan untuk bermain golf.
R , 109 byte
Cobalah online!
sumber
intToUtf8
! 90 byte akan dimungkinkan dengan menggunakan pendekatan yang berbeda menggunakan regexp:function(x,p=paste,z=p("(",p(c("zero",broman::numbers),collapse="|"),")"))gsub(z,"\\1 ",x)
Haskell , 81 byte
Cobalah online!
Penjelasan:
sumber
Python 3 (tanpa regex) , 85 byte
Cobalah online!
sumber
while s[i:]
dan kemudian Anda bisa turun ke 93 byte dengan mengirimkan rekursiflambda
(fungsi hanya perlu mengembalikan output daripada mencetaknya sendiri).Excel, 181 byte
Menempatkan spasi di depan:
z
,on
,tw
,th
,f
,s
,ei
,ni
sumber
Z80 Assembly,
4645 byte(Sangat menyenangkan untuk mengadaptasi regex keren Uriel ke lingkungan regex yang tidak ramah).
sumber
Jelly ,
4039 byteCobalah online!
Bagaimana itu bekerja
sumber
QuadS ,
2120 byteCobalah online!
Ini adalah port jawaban retina saya .
sumber
APL (Dyalog Unicode) , 25 byte
Cobalah online!
sumber
Python 3 , tanpa regex,
83 68 6563 byte-15 terima kasih kepada Lynn (refactor menjadi fungsi tunggal)
-3 lebih banyak terima kasih kepada Lynn (hindari pengindeksan ke daftar dengan aritmatika lebih banyak)
... yang mengarah pada penghematan 2 byte (menghindari tanda kurung dengan modulos negatif) :)
Fungsi yang mencetak kata-kata yang dipisahkan oleh baris baru dan kemudian memunculkan
IndexError
.Cobalah online! (Menekan pengecualian untuk memungkinkan beberapa putaran dalam test-suite)
sumber
def f(s):h=[4,5,3][ord(s[0])*ord(s[1])%83%7%3];print(s[:h]);f(s[h:])
h(s)
danh(s)
bagaimana saya tidak memperhatikan ?! Lynn terima kasih!h=(ord(s[0])*ord(s[1])%83%7+1)%3+3
65 byte! :)Jelly , 36 byte
Cobalah online!
Algoritma:
Saya yakin kita bisa melakukan yang lebih baik lagi.
sumber
Mathematica, 125 byte
Cobalah online!
TIO menampilkan pesan kesalahan tentang "CountryData" (???)
Saya tidak tahu mengapa ini terjadi, tetapi semuanya berjalan dengan baik di Mathematica
sumber
Perl 6 ,
4230 byteMenguji
Uji itu
(Diterjemahkan dari jawaban lain)
sumber
q / kdb +,
5951 byteLarutan:
Contoh:
Penjelasan:
Solusi cepat, mungkin pendekatan yang lebih baik dan lebih golf.
Catatan:
46 byte dengan beberapa golf sederhana, menggantikan panggilan q dengan k, tetapi masih merupakan solusi yang lumayan.
asc[(,/)x ss/:($)`z`one`tw`th`f`s`ei`ni]cut x:
sumber