Sistem utama adalah perangkat mnemonik untuk mengubah angka menjadi kata-kata sehingga dapat dihafal lebih mudah.
Ini didasarkan pada bagaimana kata-kata terdengar secara fonetis, tetapi untuk membuat hal-hal sederhana untuk tantangan kita hanya akan peduli dengan bagaimana kata-kata dieja. Ini berarti akan ada beberapa konversi yang salah, tetapi tidak apa-apa.
Untuk mengonversi angka menjadi kata menggunakan sistem utama kami yang disederhanakan:
- Ganti masing
0
- masing dengans
atauz
. (Beberapa bisa jadis
dan ada yang bisaz
. Sama juga di bawah.)- Mengganti setiap
1
dengant
ataud
atauth
.- Ganti masing
2
- masing dengann
.- Ganti masing
3
- masing denganm
.- Ganti masing
4
- masing denganr
.- Ganti masing
5
- masing denganl
.- Mengganti setiap
6
denganj
ataush
atauch
.- Mengganti setiap
7
dengank
atauc
ataug
atauq
.- Ganti masing
8
- masing denganf
atauv
.- Ganti masing
9
- masing denganp
ataub
.- Tambahkan huruf
aehiouwxy
mana saja dalam jumlah berapa pun untuk membuat kata bahasa Inggris yang nyata, jika memungkinkan .
Satu-satunya pengecualian adalah yangh
mungkin tidak dimasukkan setelahs
atauc
.Jumlahnya mungkin sebenarnya adalah string angka 0-9 (tidak ada desimal atau koma atau tanda).
Kata hanya dapat berisi huruf kecil az.
Contohnya
Nomor tersebut 32
harus dikonversi sebagai ?m?n?
, di mana ?
merupakan string terbatas yang dibuat dari huruf-huruf aehiouwxy
(string dari monoid gratis jika Anda mau). Ada banyak cara ini bisa dibuat menjadi sebuah kata bahasa Inggris yang nyata: mane
, moon
, yeoman
, dll
Jumlahnya 05
dapat dikonversi sebagai ?s?l?
atau ?z?l?
. Beberapa kemungkinan adalah easily
, hassle
, dan hazel
. Kata shawl
itu tidak diizinkan karena h
tidak boleh ditempatkan setelah s
; itu akan salah dibaca sebagai 65
.
Tantangan
Tulis program atau fungsi yang mengambil string angka 0-9 dan temukan semua kata yang dapat dikonversi menjadi menggunakan mnemonic sistem utama yang disederhanakan.
Program Anda memiliki akses ke file teks daftar kata yang mendefinisikan apa semua kata bahasa Inggris "asli". Ada satu kata az huruf kecil pada setiap baris file ini, dan Anda dapat mengasumsikan memiliki baris tambahan. Berikut adalah daftar kata-kata nyata yang dapat Anda gunakan untuk pengujian. Anda dapat menganggap file daftar kata ini disebut f
(atau sesuatu yang lebih panjang) dan terletak di direktori yang sesuai.
Untuk penalti 35 byte (tambahkan 35 ke skor Anda), Anda dapat menganggap daftar kata sudah dimasukkan ke dalam variabel sebagai daftar string. Ini terutama untuk bahasa yang tidak dapat membaca file, tetapi pengiriman apa pun dapat memanfaatkannya.
Program Anda harus menampilkan semua kata dalam daftar kata yang dapat dikonversi menjadi nomor input. Mereka harus dicetak ke stdout (atau serupa), satu per baris (dengan baris tambahan opsional), atau mereka dapat dikembalikan sebagai daftar string jika Anda memilih untuk menulis suatu fungsi. Daftar kata tidak harus berdasarkan abjad dan hasilnya tidak perlu salah.
Jika tidak ada kata yang mungkin maka output (atau daftar) akan kosong. Outputnya juga kosong jika string kosong dimasukkan.
Ambil input melalui stdin, baris perintah, atau sebagai argumen string ke suatu fungsi. Daftar kata, atau nama file-nya, tidak boleh menjadi bagian dari input, hanya string digit.
Anda hanya mencocokkan satu kata dalam daftar kata, bukan urutan kata. Kata noon
itu mungkin akan menjadi salah satu hasil untuk 22
, tetapi urutan kata no one
tidak.
Uji Kasus
Misalkan ini adalah daftar kata:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
zdnmrlshchvb
sthnmrlchgvb
shthnmrlchgvb
bob
pop
bop
bopy
boppy
Masukan 0123456789
harus memberikan semua kata yang panjang kecuali zdnmrlshchvb
dan shthnmrlchgvb
:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb
Masukan 99
harus memberi:
bob
pop
bop
bopy
(Kata-kata keluaran mungkin dalam urutan apa pun.)
Mencetak gol
Pengajuan terpendek dalam byte menang. Tiebreaker pergi ke kiriman yang diposting terlebih dahulu.
Situs bagus terkait: numzi.com .
Jawaban:
Perl,
8784Mengambil input sebagai parameter baris perintah:
Dapat dibuat agak lebih pendek jika daftar kata akan diizinkan pada input standar:
sumber
A
artinya iniopen A,f
?<A>
).Python 2,
215208 byteSolusi Python ini membangun regex dari bagian-bagian yang diindeks oleh argumen baris perintah, kemudian menguji setiap kata dengan regex (yang agak besar) itu.
Sumber asli sebelum minifier:
Sebagai contoh, regex untuk tes
99
ini adalah:The
(?<![sc])h
bit adalah "tampilan belakang pernyataan negatif" komponen yang membuat yakinh
tidak mengikutis
atauc
di bagian filler umum.Terima kasih Calvin. Tantangan ini memotivasi saya untuk meningkatkan keterampilan regex saya yang berkarat.
sumber
b=c='((?<![sc])h|[aeiouwxy])*'
akan menghemat dua byte.t|th -> th?
menghemat bytePython 3, 170
Versi yang dapat dibaca:
Kode memanfaatkan fakta yang
th
berlebihan (karena memetakan ke nomor yang sama dengant
, danh
merupakan karakter padding).Fungsi statis
maketrans
membuat tabel yang memetakan karakter dari argumen pertama ke argumen kedua, dan karakter dari argumen ketigaNone
(yang akan mengakibatkan karakter tersebut dihapus).Kode akhir dapat dibuat beberapa byte lebih pendek dengan membuat tabel sebagai argumen langsung
translate
.sumber
input()
bisa digunakan, karena itu disebut di dalam loop. Juga, regex yang Anda sarankan memiliki panjang yang sama dengan yang sudah saya gunakan (5 byte).sed, paste, grep, cut - 109
Membawa file "w", mengonversi setiap kata menjadi nomornya, menempel kembali ke aslinya, menerima nomor dan mengembalikan kata yang cocok. Perhatikan bahwa spasi putih setelah kutipan setelah grep adalah tab, pembatas default pasta.
Saya tahu Perl jauh di depan, hanya ingin versi shell yang lebih baik sebagai contoh.
Oh yeah, bagian $ 1 berarti bahwa ini seharusnya dijalankan dari skrip shell, (sebagian besar shell seharusnya berfungsi), jadi dibutuhkan argumen baris perintah.
sumber
sed
untuk menghindari buka dan@ARGV
overhead Perl , tetapi kurangnya rentang dan menghapus fungsi dalamy///
istirahat itu. Anehnya meskipun meskipun tidak ada variabel yang dapat mengekspresikan logika itu sendiri langsung dised
. Inilah solusi 92 saya:sed -e'h;s/[sc]h/6/g;y/sztdnmrljkcqgfvpb/00112345677778899/;s/[^0-9]*//g;T;s/^$1$//;x;t;d' f
Bash + coreutils, 216
w
sed
menggantikan digit dengan kemungkinan penggantiannyaeval printf
penggunaan shell ekspansi penjepit untuk memperluas semua substitusi yang mungkinsed
pada baris pertama menghapusaeiouwxy
danh
(ketika tidak didahului oleh[sc]
) dari daftar kataaeiouwxy
danh
dari daftar kata, yang terakhirsed
mengubah hasil grep (nomor baris setiap pertandingan) kesed
ekspresi lain , yang diproses oleh bagian terluarsed
untuk mengungkapkan semua kata yang mungkin dari daftar kata.Keluaran:
File daftar kata ditentukan sebagai argumen baris perintah, diikuti oleh nomor yang akan di-mnemonisasi:
sumber
tr, sed, grep, xargs, sh, 77
Berharap nomor dalam stdin dan daftar kata harus disimpan dalam file
f
.Tidak menggunakan semua penggantian (1 akan selalu menjadi z, 7 akan selalu menjadi k), jadi ini mungkin disebut solusi malas, tetapi ia menemukan setidaknya satu mnemonik untuk 95 angka dalam [1-100].
sumber
1
selaluz
atau7
selaluk
. Ini tidak valid.