Mengucapkan Hex

26

Mengucapkan Hex

Bagi Anda yang belum tahu tentang pertunjukan Silicon Valley, tantangan ini terinspirasi oleh pertukaran yang berlangsung seperti ini ( YouTube ):

Kid -
  Here it is: Bit… soup. It’s like alphabet soup, BUT… it’s ones and zeros 
  instead of letters.
Erlich Bachman -
  {silence}
Kid -
  ‘Cause it’s binary? You know, binary’s just ones and zeroes.
Erlich Bachman -
  Yeah, I know what binary is. Jesus Christ, I memorized the hexadecimal 
  times tables when I was fourteen writing machine code. Okay? Ask me 
  what nine times F is. It’s fleventy-five. I don’t need you to tell me what binary is.

Perlu dicatat bahwa secara teknis, 0x9 * 0xF = 0x87bukan 'empat puluh lima', tetapi ini memunculkan pertanyaan penting - bagaimana Anda benar-benar mengucapkan hex dalam percakapan? Ini tidak seperti oh ex eff effmengalir dari lidah dengan mudah, jadi apa yang harus kita lakukan? Berikut bagan pengucapan yang berguna yang akan kami ikuti.

A = ay       A0 = atta-       
B = bee      B0 = bibbity-    
C = cee      C0 = city-       
D = dee      D0 = dickety-    
E = ee       E0 = ebbity-     
F = eff      F0 = fleventy-   

Kita dapat membagi nomor hex 4-panjang menjadi dua kelompok dua, dan menentukan pengucapan dari tabel di atas, serta pengucapan bahasa Inggris umum untuk angka. Jadi, sebagai contoh 0xFFAB, kita akan dapatkan Fleventy-eff bitey atta-bee.

Jika nomor disertakan, seperti 0xF5AB, Anda akan mencetak Fleventy-five bitey atta-bee. Juga, jika angka memulai salah satu grup, Anda harus menggunakan pelafalan "puluhan". Sebagai contoh, 0x5FAAakan menjadi Fifty-eff bitey atta-ay. Dalam kasus di mana Anda memiliki sesuatu seperti 0x1FAC, ini akan menjadi Effteen bitey atta-cee. Tapi, jika aturan ini digunakan untuk 0x1AF4, a-teenbisa dikacaukan eighteen, jadi Anda harus menambahkan Y. Jadi, output yang benar adalahYayteen bitey fleventy-four

Dalam hal 0xD0F4, alih-alih melakukan Dickety-zero bitey fleventy-four, kita akan mengabaikan nol dan mencetak Dickety-bitey fleventy-four.

Tanda hubung hanya boleh muncul dalam kelompok dua, yaitu gigitan tidak boleh dihubungkan ke salah satu kelompok dengan tanda hubung kecuali kelompok pertama hanya satu kata! Memang 0x04F4akan four-bitey fleventy-four, tetapi 0x44F4akan forty-four bitey fleventy-four. Seperti yang dikatakan trichoplax , gigitan seharusnya dihipnotis saat mengikuti angka bulat.

Untuk tampilan komprehensif tentang cara kerjanya, lihat contoh I / O di bawah ini.

Objektif

Buat program atau fungsi yang akan mengambil string heksadesimal sebagai input atau argumen fungsi dan menghasilkan pengucapan itu. Output harus memiliki kapitalisasi yang tepat. Anda dapat mengasumsikan bahwa panjang angka ini akan selalu 4.

Contoh I / O

"0xFFFF" -> "Fleventy-eff bitey fleventy-eff"
"0x0000" -> "Zero"
"0x0010" -> "Ten"
"0x0100" -> "One-bitey zero"
"0x1110" -> "Eleven-bitey ten"
"0xBEEF" -> "Bibbity-ee bitey ebbity-eff"
"0x9999" -> "Ninety-nine bitey ninety-nine"
"0xA1B2" -> "Atta-one bitey bibbity-two"
"0x3C4F" -> "Thirty-cee bitey forty-eff"
"0x17AB" -> "Seventeen-bitey atta-bee"
"0x1AFB" -> "Yayteen-bitey fleventy-bee"
"0xAAAA" -> "Atta-ay bitey atta-ay"

Ini adalah , jadi paling tidak jumlah byte yang menang.

Kade
sumber
6
Berikut adalah trik praktis untuk siapa saja yang mempelajari tabel hex times: Tabel F times dapat dihitung pada 16 jari tangan dan kaki Anda (tidak termasuk ibu jari dan jari kaki besar). Cukup berbaris secara berurutan dan lipat angka ke bawah untuk menghitung F x n. Jumlah digit di sebelah kiri digit terlipat adalah digit pertama, dan jumlah digit di sebelah kanan digit terlipat adalah digit kedua, memungkinkan Anda menghitung kelipatan 2 digit. Misalnya, lipat angka Cth ke bawah untuk memberikan F x C = Bibbity four.
trichoplax
2
@trichoplax Anak saya kagum ketika saya pertama kali menunjukkan kepadanya bagaimana melakukan itu untuk sembilan di jari-jarinya: D
Geobits
@ Geobits dari situlah saya mengekstrapolasinya - Saya suka trik itu untuk anak-anak berusia 9 tahun.
trichoplax
@trichoplax Saya pikir menggigit lebih masuk akal untuk tujuan pengucapan. Saya sudah mencoba membuatnya lebih jelas di mana tanda hubung akan muncul, dan huruf pertama dari output harus dikapitalisasi, dan sisanya dalam huruf kecil.
Kade
4
Anda tidak menyebutkan "menggigit" di mana pun selain contoh
Sparr

Jawaban:

9

Pyth - 312 293 286 251 byte

Saatnya mulai mengurangi data, lebih banyak datang.

Program Pyth suci terbesar yang pernah saya tulis! Masih ada kompresi yang sangat besar dengan data, baik secara algortihimik dan konversi basis, tetapi hanya ingin memasangnya

Kcs@LGjC"qNjÆÉý(7läQ«I?sfçÂØ^Ðûü»   u$ÐÃoó}QÛã´Hf®?Nâ²-YÜZÔ7ÂþæX#\"åØ"26\q=+K>K11J.e?+?bnb\|@K+16k"ty"-kTbc"  twen | for | | | | | atta bibbi ci dicke ebbi fleven"d.srj"bitey "m?++@Kd?k<d18"teen"\-<d32+j\-@V,JKfT.Dd16\ ?Gh=G.DQ256tG4\-

Saya menafsirkan input sebagai hex literal melalui Q yang secara otomatis mendeteksi dengan 0x. Kemudian saya divmod 256 ke dalam byte, dan menghapus byte pertama jika nol, kemudian memetakannya melalui dua array, satu untuk 0-1Fdan kemudian 20-F0. Yang kedua mendapat divmod melalui array pertama juga. Opsi pertama mendapat tanda hubung di akhir, dan yang kedua mendapatkan tanda hubung di tengah dan spasi di akhir. Bergabunglah "bitey ", gunakan dengan rentang, dan lepaskan tanda hubung dengan .sdan kami baik-baik saja.

Bagian kompresi dasar juga menarik karena saya pertama kali memulai dengan 128 dasar -> 256 konversi. Tapi sekarang, apa yang saya lakukan adalah menggunakan "q"pemisah dan bukan ruang. Jadi saya sekarang dapat mempertimbangkan string sebagai basis 26 string dengan xLG, meningkatkan kompresi luar biasa.

Coba di sini online .

Suite uji .

Maltysen
sumber
Saya tahu itu tidak ada dalam pertanyaan, tetapi saya pikir Anda harus mencoba memperkirakan lebih banyak angka, seperti 0x112233dan0x93FBAC09
vrwim
2
@Aku pikir model pelafalan ini kehilangan itu, eh, kelayakan pada saat itu, haha. Bisakah Anda bayangkan benar-benar mengatakan Ninety-three bitey fleventy-bee halfy atta-cee bitey nine?
Kade
Saya pikir ada sesuatu yang rusak, saat ini kode Anda hanya menghasilkan sejumlah besar Truebiteys dan Falsebiteys.
Kade
@ Vioz- Ternaries rusak. Isaacg membalikkan pesanan mereka beberapa hari yang lalu. Saya bisa pergi dan mengubahnya dan sebenarnya menyimpan beberapa byte, tetapi mereka seperti 14.
Maltysen
Ah, begitu. Jadi versi Pyth apa yang mempertahankan fungsi itu?
Kade
5

Java - 856 byte

Tidak pendek tapi setidaknya jawaban kedua;)

Ini adalah metode yang disebut String p(String n)yang akan melakukan pekerjaan:

String p(String n){String[]b={"","ten","twen","thir","for","fif","six","seven","eigh","nine",
"atta","bibbi","ci","dicke","ebbi","fleven"};String[]s={"zero","one","two","three","four",
"five","six","seven","eight","nine","ay","bee","cee","dee","ee","eff"};String[]t={"ten",
"eleven","twelve","thir","four","fif","six","seven","eigh","nine","yay","bee","cee","dee",
"ee","eff"};int w=Byte.valueOf(n.substring(2,3),16);int x=Byte.valueOf(n.substring(3,4),16);
int y=Byte.valueOf(n.substring(4,5),16);int z=Byte.valueOf(n.substring(5,6),16);String r=(w==
1?t[x]+(x>2?"teen":""):((w==0?"":b[w]+(w>1&&w!=10?"ty":"")+"-")+(w==0&&x==0?"":s[x])))+((w==0
&&x>0||w==1&&x<3||w>0&&x==0)?"-":w==0&&x==0?"":" ")+(w>0||x>0?"bitey ":"")+(y==1?t[z]+(z>2?
"teen":""):((y==0?"":b[y]+(y>1&&y!=10?"ty":"")+"-")+(y>1&&z!=0||y==0?s[z]:"")));return (char)
(r.charAt(0)-32)+r.substring(1);}
bobbel
sumber
4

Javascript - 577 719 byte

function h(e){for(e=e.match(/.{1,2}/g),r="",i=1;i<e.length;i++)j=parseInt("0x"+e[i]),0!=j?r+=c(parseInt("0x"+e[i]))+"bitey ":i>1?r+="zero-bitey":0;return r=""==r?"Zero":r[0].toUpperCase()+r.substr(1,r.length-7),null!==r[r.length-1].match(/[-\s]$/g)?r=r.substr(0,r.length-1):0,r}function c(e){return d=["zero","one","two","three","four","five","six","seven","eight","nine","ay","bee","cee","dee","ee","eff","ten","eleven","twelve","thir","four","fif","six","seven","eigh","nine","yay","bee","cee","dee","ee","eff"],p=["twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety","atta","bibbity","city","dickety","ebbity","fleventy"],1>e?"":e>31?p[Math.floor(e/16)-2]+"-"+d[e%16]+" ":17>e?d[e]+"-":d[e]+"teen-"}

Saya yakin ada perbaikan yang harus dilakukan. Bonus tambahan, itu mem-parsing string hex panjang sewenang-wenang.

EDIT: Aduh, itu tidak berfungsi dengan benar ketika ada nol di depan. Hm

EDIT 2: Tetap, saya pikir. JSFiddle

Balared
sumber