Tujuan
Tulis program atau fungsi yang menerjemahkan nomor telepon numerik ke dalam teks yang membuatnya mudah untuk diucapkan. Ketika digit diulang, mereka harus dibaca "double n" atau "triple n".
Persyaratan
Memasukkan
Sederetan angka.
- Asumsikan semua karakter adalah digit dari 0 hingga 9.
- Asumsikan string berisi setidaknya satu karakter.
Keluaran
Kata-kata, dipisahkan oleh spasi, tentang bagaimana angka-angka ini dapat dibaca dengan keras.
Terjemahkan digit ke kata:
0 "oh"
1 "satu"
2 "dua"
3 "tiga"
4 "empat"
5 "lima"
6 "enam"
7 "tujuh"
8 "delapan"
9 "sembilan"Ketika angka yang sama diulang dua kali berturut-turut, tulis " angka ganda ".
- Ketika angka yang sama diulang tiga kali berturut-turut, tulis " angka tiga ".
- Ketika digit yang sama diulang empat atau lebih kali, tulis " angka ganda " untuk dua digit pertama dan evaluasi sisa string.
- Hanya ada satu karakter spasi di antara setiap kata. Satu ruang terkemuka atau tambahan dapat diterima.
- Output tidak peka huruf besar-kecil.
Mencetak gol
Kode sumber dengan byte paling sedikit.
Uji Kasus
input output
-------------------
0123 oh one two three
4554554 four double five four double five four
000 triple oh
00000 double oh triple oh
66667888 double six double six seven triple eight
19999999179 one double nine double nine triple nine one seven nine
code-golf
kolmogorov-complexity
Makanan Tangan
sumber
sumber
Jawaban:
05AB1E ,
5352515049 byteCobalah online!
Penjelasan:
sumber
M
juga melihat ke dalam daftar ketika menentukan integer maksimum pada stack? Tidak tahu itu. Kedengarannya seperti sesuatu yang perlu diingat. :)8088 Majelis, IBM PC DOS,
164159156155 byteBiner:
Bangun dan uji yang dapat dieksekusi dengan menggunakan
xxd -r
dari atas, atau unduh PHONE.COM .Daftar belum dirakit:
TL; DR:
String input dibaca dari kanan ke kiri untuk memudahkan menemukan triple. Output didorong ke stack x86 untuk mempermudah membalik urutan tampilan dan juga memfasilitasi menata ulang kata-kata "ganda" dan "tiga" untuk mendahului nama digit.
Jika digit berikutnya berbeda dari yang terakhir, nama tersebut terlihat dalam daftar kata dan didorong ke tumpukan. Karena tidak ada konsep formal dari "array yang diindeks dari string panjang variabel" dalam kode mesin, daftar kata dipindai
i
(indeks kata) beberapa kali untuk pembatas string ($
) untuk menemukan kata yang sesuai. Membantu, x86 memang memiliki sepasang petunjuk singkat (REPNZ SCASB
yang mirip denganmemchr()
di C), yang menyederhanakan ini (terima kasih CISC !).Jika digit sama dengan yang sebelumnya, penghitung untuk panjang "run" bertambah dan terus looping ke kiri pada input. Setelah proses selesai, nama digit diambil dari tumpukan karena harus ditempatkan setelah "dobel" atau "rangkap tiga" untuk setiap pengelompokan. Jika panjang run adalah ganjil (dan run run adalah
> 1
), nama digit yang diikuti oleh string "triple" didorong ke stack dan panjang run dikurangi oleh 3. Karena panjang run sekarang akan genap, langkah diulang untuk "double" hingga panjang run adalah 0.Ketika string input telah mencapai akhir, tumpukan dibuang dengan setiap string yang disimpan ditulis ke layar dalam urutan terbalik.
I / O:
PC DOS mandiri yang dapat dieksekusi, input dari output baris perintah ke konsol.
Unduh dan uji PHONE.COM .
sumber
repne scasb
adalahmemchr
(ataustrchr
jika Anda tahu akan ada hit), tidakstrstr
.mov cl, byte[si]
setara denganmovzx cx, byte [si]
. Saya ingin tahu apakah menggunakan reg yang berbeda, sepertiAH
, untuk hitungan dengandec ah / jnz
bukannyaloop
akan menghemat apa pun dari tidak harus mendorong / pop CX. Mungkin tidak, dan Anda tidak memiliki regs 16-bit yang tersisa yang memungkinkan 1-bytedec
.CH=0
saya pergi oleh fysnet.net/yourhelp.htm , yang untuk setiap rilis wajar dari DOS selalu nol, sama denganBX
. Pemikiran yang baik tentang zero- extendedmov
, meskipun secara teknis saya tidak berpikirmovzx
tersedia pada 808x (menjaga platform target IBM PC 5150 dan semua). Saya mengutak-atik semua register sebaik mungkin untuk menyelamatkan byte, tetapi jika Anda melihat sesuatu yang mungkin terlewat, tolong beri tahu saya!memchr
IMO. Penamaan "instruksi string" menyesatkan orang untuk berpikir bahwa mereka bekerja pada string C panjang-implisit, tetapi benar-benar mereka bekerja pada string seperti panjang eksplisitstd::string
atau buffer. Sepertimemcpy
,memset
(movs / stos),memchr
/memrchr
(repne scas dengan DF = 0 atau 1), danmemcmp
(repe cmps). Satu-satunya yang setara dengan Crepe scas
adalahstrspn
karena saya tidak berpikir adamem
fungsi untuk itu. Anda bahkan dapat menggambarkanstosw
ataustosd
sebagaiwmemset
contoh.movzx
biaya byte opcode tambahan, dan ya itu hanya diperkenalkan dengan 386. Itu hanya lebih mudah untuk mengetikkan fakta bahwa Anda sedang melakukan penggabungan byte-rendah dan menganggap itu benar diperpanjang nol. Jika Anda tahu CX atau setidaknya CH = 0, maka ya untuk bermain golf selalu gunakanmov
CL. Tetapi di luar bermain golf, instruksi x86's go-to-load-load adalahmovzx
danmovsx
: mereka menghindari dependensi salah atau shenanigans register parsial lainnya. Pada CPU modern dengan tujuan kata, mereka secepatmov
memuat kata.05AB1E ,
6156535251 byte-9 byte terima kasih kepada @Grimy .
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Lihat ini 05AB1E ujung tambang (bagian Cara menggunakan kamus? ) Untuk memahami mengapa
… ‹¶½¿
adalah" double triple"
dan“Šç€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“
itu"oh two three four five six seven eight nine"
.sumber
if(length>=4)
sebelum menambahkan sisanya, tapi tentu saja itu tidak perlu untuk bilangan bulat ukuran1,2,3
, karena;Å2¨3ª£
akan meninggalkan string utuh (hanya dibungkus dalam daftar kami meratakan setelah peta pula). Terima kasih telah memperhatikan! Dan melihat ke depan melihat jawaban Anda bersamaÅγ
. Aku memang merasa bagian pertama bisa dilakukan jauh lebih pendek.Dg;LàäR
masih satu byte lebih pendek dariāɨšJõK
, dan jauh lebih mirip dengan yang Anda miliki sebelumnya.á
daripadaõK
di akhir. :)á
! Inilah 51 dan satu lagi . 50 terasa mungkin.QuadR , 137 byte SBCS
Kasing judul dengan spasi terdepan.
Cobalah online!
∊
ϵ daftar (ratakan)¯2↑¨
ambil dua karakter terakhir (padding ke kiri dengan spasi) dari setiap karakter@
pada posisi di mana(∊∘⎕A)
karakter adalah anggota huruf besar A lfabet⍵
dalam hasil dari operasi Ganti PCRE di bawah ini ...(.)
setiap karakter\1
diikuti dengan sendirinya*
nol atau lebih banyak kali, digantikan oleh hasil dari yang berikut ...{…}⍵M
"dfn";⍵
adalah M atch dari pola di atas('OhOneTwoThreeFourFiveSixSevenEightNine'(
...)⎕A)
terapkan fungsi diam-diam anonim berikut dengan string panjang dan huruf besar A sebagai argumen kiri:∊
keanggotaan (huruf dalam string panjang dalam alfabet huruf besar)⊂
partisi (dengan awal partisi baru setiap kali is-a-member⊣
argumen kiri (yaitu string panjang)(
…)⎕R
PCRE R ganti pola-pola berikut dengan kata-kata itu:⎕D
digit 0 hingga 9,¨
perlakukan masing-masing sebagai pola yang terpisah⍺←
menetapkan fungsi pengganti ini untuk⍺
(untuk sebuah lphabetise)⋄
kemudian,⊃⍵
karakter pertama pertandingan,
sebagai string⍺
terapkan⍺
untuk ituw←
tetapkan ini kew
(untuk kata )' '∊
...:
jika ruang adalah anggota daripadanya (yaitu jika pertandingan kosong):⍬
mengembalikan apa-apa (menjadi string kosong)⋄
lain,1=≢⍵:
jika satu sama dengan penghitungan karakter dalam pertandingan (yaitu panjangnya):⍺⍵
abjad digit itu⋄
lain,3=≢⍵:
jika tiga sama dengan penghitungan karakter dalam pertandingan (yaitu panjangnya):'Triple',w
tambahkan "Triple" ke w ord⋄
lain,2↓⍵
turun ke angka dari pertandingan∇
ulangi ituw,
tambahkan kata'Double',
tambahkan "Double"sumber
JavaScript (ES6),
161 160 152144 byteOutputnya termasuk ruang terkemuka tunggal.
Cobalah online!
atau Lihat kode sumber yang diformat
Bagaimana?
Konversi diproses dalam tiga langkah:
"X X"
dengan"double X"
"double X X"
dengan"triple X"
Untuk menyimpan byte, kami menggunakan persamaan reguler yang sama untuk semua langkah:
yang berfungsi sebagai berikut:
Pada langkah 1, kami menggunakan fungsi panggilan balik yang mengambil kata yang benar dari tabel pencarian:
"799999"
→" seven nine nine nine nine nine"
Pada langkah 2, kami ganti dengan
"$1 double$2"
:" (seven)( nine)( nine)"
→" seven double nine"
"( nine)( nine) nine"
→" double nine nine"
Pada langkah 3, kami ganti dengan
"triple$2"
:" (double)( nine)( nine)"
→" triple nine"
sumber
Bahasa Wolfram (Mathematica) , 115 byte
Cobalah online!
Mengambil daftar digit sebagai input. Output mencakup ruang terdepan.
sumber
Stax , 56 byte
Jalankan dan debug itu
sumber
Python 2 ,
171169168 byteCobalah online!
-1 byte, terima kasih kepada Jitse
sumber
1312
;)['','double ','triple '][n]
to' eellpbiurotd'[-n:0:-2]
for 168 bytes: Coba online!Perl 5
-p
, 111 byteCobalah online!
Penjelasan:
sumber
Scala , 213 byte
Oke. Entah bagaimana versi rekursif yang saya coba bangun sangat verbose-y lebih dari yang ini (masih rekursif, tetapi hanya dalam satu kasus). Fungsinya
f
sebagai string input nomor telepon dan mengeluarkan fonetiknya dengan spasi spasi tambahan.Cobalah online!
Sunting : -8b terima kasih kepada DrY Wit!
Scala , 215 byte
Dan inilah versi whitespace terkemuka, dua byte lebih lama untuk beberapa alasan (bahkan dengan refactoring besar-besaran).
Cobalah online!
sumber
(o(0)+"").toInt
dengano(0)-48
.PHP,
174169166159 bytesTry it online!
For each digit at index of
$i
starting from 0:$i
sama dengan 3, cetak'triple '
dan tambahkan 2 hingga$i
iterasi berikutnya akan memiliki 2 digit melompati.$i
sama dengan atau lebih dari 2 tetapi bukan 3, cetak'double '
dan tambahkan 1$i
sehingga iterasi berikutnya akan memiliki 1 digit melompati.$i++
.sumber
Retina 0.8.2 , 105 byte
Cobalah online! Menghasilkan ruang terdepan. Penjelasan: Saya awalnya mencoba regex yang secara otomatis cocok dengan 2 atau 3 digit tetapi pendekatan @ Arnauld berubah menjadi pemain golf. Penjelasan:
Cocokkan pasangan angka identik dan gantikan yang pertama dengan a
=
. Kemudian ulangi, sehingga untuk nomor ganjil digit terakhir kedua juga diganti dengan a=
.Spasi digit (dan
=
s) keluar.Tangani case dari tiga digit yang identik.
Ganti semua karakter yang tersisa dengan kata-kata.
sumber
Jelly , 59 byte
Cobalah online!
Tautan monadik yang menggunakan string karakter digit sebagai argumennya dan mengembalikan string Jelly kata-kata yang dipisahkan oleh spasi. Ketika dipanggil sebagai program penuh, output secara implisit.
sumber
T-SQL 2017, 238 byte
Menambahkan beberapa linebreak agar dapat dibaca
Cobalah online
sumber
C ++, 382 byte
Ini bukan superclever, tetapi seseorang perlu menulis versi C ++. Fungsi rekursif R melewati string input dan menghitung nilai berulang. Jika ada lebih dari 3 pengulangan, itu berpura-pura ada 2 pengulangan, lalu mundur dan coba lagi.
Beberapa karakter sumber mungkin bisa diperas dengan
#define
mayor, tapi saya yakin algo yang lebih baik bisa memeras lebih banyak.dan verifikasi kasus uji:
sumber
#include <sstream>
? Atau bisakah Anda memindahkannya ke bawah setelah bagian golf untuk fungsi tes? Saya pikir mengetikstd::ostream&s
akan memakan waktu lebih sedikit daripadausing namespace std;
, kecuali ada tempat lain di mana Anda membutuhkanstd::
.Perl 6 ,
9693 byteCobalah online!
Ini adalah blok kode anonim yang mengambil angka dan mengembalikan string dengan angka dalam huruf besar, misalnya
0123 => oh ONE TWO THREE
dengan satu spasi tambahan.Ini dihapus untuk sementara waktu sampai saya tahu cara menggunakan tangkapan di lookahead, tetapi harus diperbaiki sekarang.
sumber
Merah , 242 byte
Cobalah online!
sumber
Scala , 253 byte
Cobalah online!
sumber
Oracle SQL, 578 byte (dalam bentuk yang diformat)
Solusi tidak ringkas dengan cara apa pun sehingga mempostingnya dengan cara yang diformat.
Tes dalam SQL * Plus
Trik utamanya adalah digit yang dikonversi menjadi kata-kata menggunakan model format Oracle alih-alih literal kode-keras "satu" ... "sembilan".
sumber
union all
denganselect regexp_replace(s,case when length(regexp_substr(s, '(.)(\1)+')) = 3 then '^...' else '^(.)\1|^.' end) from r
.JavaScript, 142 byte
Cobalah online!
sumber
(Roblox) Lua 5.1 , 166 byte
Pastikan
s
nilai string yang ditentukan sebelumnya hanya diisi dengan angka; itu akan menjadi variabel yang akan dimodifikasi. Hasilnya akan mencakup karakter ruang terkemuka[\u20]
.sumber
s
sudah memiliki input. Selain itu, Anda punya posting pertama yang bagus! Saya akan merekomendasikan Anda memasukkan tautan ke situs pengujian online misalnya tio.run/#lua sehingga orang lain dapat menguji solusi Anda