การออกเสียง Hex


26

การออกเสียง Hex

สำหรับผู้ที่ไม่ได้ฝึกหัดในการแสดง Silicon Valley ความท้าทายนี้ได้รับแรงบันดาลใจจากการแลกเปลี่ยนที่เป็นเช่นนี้ ( 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.

ควรสังเกตว่าในทางเทคนิค0x9 * 0xF = 0x87ไม่ใช่ 'fleventy-5' แต่นี่เป็นคำถามที่สำคัญ - คุณจะออกเสียง hex ในบทสนทนาได้อย่างไร มันไม่เหมือนกับการoh ex eff effไหลออกจากลิ้นอย่างง่ายดายดังนั้นเราควรทำอย่างไร นี่คือแผนภูมิการออกเสียงที่มีประโยชน์ที่เราจะติดตาม

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

เราสามารถแบ่งเลขฐานสิบหกความยาว 4 กลุ่มออกเป็นสองกลุ่มและกำหนดการออกเสียงจากตารางด้านบนรวมถึงการออกเสียงภาษาอังกฤษทั่วไปสำหรับตัวเลข ดังนั้นสำหรับตัวอย่างที่เราจะได้รับ0xFFABFleventy-eff bitey atta-bee

หากรวมหมายเลขไว้เช่น0xF5ABคุณจะพิมพ์ออกFleventy-five bitey atta-beeมา นอกจากนี้หากตัวเลขเริ่มต้นหนึ่งในกลุ่มคุณควรใช้การออกเสียงเป็น "สิบ" ยกตัวอย่างเช่นจะกลายเป็น0x5FAA Fifty-eff bitey atta-ayในกรณีที่คุณมีบางสิ่งบางอย่างเช่นนี้จะเป็น0x1FAC Effteen bitey atta-ceeแต่ถ้ากฎนี้ถูกนำมาใช้สำหรับ0x1AF4, a-teenอาจจะสับสนสำหรับeighteenดังนั้นคุณต้องย่อหน้าวายดังนั้นการส่งออกที่ถูกต้องจะเป็นYayteen bitey fleventy-four

ในกรณีของ0xD0F4แทนการทำเราจะไม่สนใจพิมพ์ศูนย์และDickety-zero bitey fleventy-fourDickety-bitey fleventy-four

ยัติภังค์ควรปรากฏภายในกลุ่มของทั้งสองเช่นว่ากัดไม่ควรเชื่อมต่อกับกลุ่มที่มียัติภังค์เว้นแต่กลุ่มแรกเป็นเพียงหนึ่งคำ! ดังนั้น0x04F4จะมีfour-bitey fleventy-fourแต่จะ0x44F4 forty-four bitey fleventy-fourตามที่ไตรคลอโรแมกซ์กล่าวไว้ว่าการกัดควรจะใช้เครื่องหมายขีดคั่นเมื่อทำตามจำนวนรอบเท่านั้น

หากต้องการดูวิธีการทำงานอย่างละเอียดโปรดดูตัวอย่าง I / O ด้านล่าง

วัตถุประสงค์

สร้างโปรแกรมหรือฟังก์ชั่นที่จะใช้สตริงเลขฐานสิบหกเป็นอินพุตหรืออาร์กิวเมนต์ของฟังก์ชันและสร้างการออกเสียง ผลลัพธ์จะต้องมีตัวพิมพ์ใหญ่ที่เหมาะสม คุณอาจคิดว่าความยาวของจำนวนนี้จะเป็น 4 เสมอ

ตัวอย่าง 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"

นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงจะชนะ


6
นี่คือเคล็ดลับที่มีประโยชน์สำหรับทุกคนที่เรียนรู้ตารางเวลาฐานสิบหก: ตารางเวลา F สามารถคำนวณได้ด้วย 16 นิ้วและนิ้วเท้าของคุณ (ยกเว้นนิ้วหัวแม่มือและนิ้วเท้าใหญ่) เพียงเรียงแถวเหล่านั้นเข้าแถวแล้วพับอันที่หนึ่งลงเพื่อคำนวณ F x n จำนวนหลักทางด้านซ้ายของหลักที่พับลงคือตัวเลขตัวแรกและจำนวนของตัวเลขทางด้านขวาของหลักที่ถูกพับลงนั้นคือตัวเลขที่สองซึ่งทำให้คุณสามารถคำนวณได้ 2 หลักหลายตัว ตัวอย่างเช่นพับ Cth หลักลงเพื่อให้ F x C = Bibbity สี่
trichoplax

2
@trichoplax ลูกของฉันประหลาดใจเมื่อครั้งแรกที่ฉันแสดงให้เขาเห็นวิธีการทำเช่นนั้นสำหรับเก้าบนนิ้วมือของเขา: D
Geobits

@Geobits นั่นคือสิ่งที่ฉันคาดการณ์ไว้ - ฉันชอบกลอุบายสำหรับเด็กวัย 9 ปี
trichoplax

@trichoplax ฉันคิดว่าการกัดนั้นเหมาะสมกว่าสำหรับการออกเสียง ฉันพยายามทำให้ชัดเจนว่าจะใส่เครื่องหมายยัติภังค์และตัวอักษรตัวแรกของผลลัพธ์จะต้องเป็นตัวพิมพ์ใหญ่และส่วนที่เหลือเป็นตัวพิมพ์เล็ก
Kade

4
คุณไม่พูดถึง "กัด" ที่อื่นนอกเหนือจากตัวอย่าง
Sparr

คำตอบ:


9

Pyth - 312 293 286 251 ไบต์

ถึงเวลาเริ่มลดข้อมูลให้มากขึ้น

โปรแกรม Pyth ที่ยิ่งใหญ่ที่สุดศักดิ์สิทธิ์ที่ฉันเคยเขียน! ยังคงมีการบีบอัดข้อมูลจำนวนมากที่เป็นไปได้ทั้งการแปลงแบบอัลกอฮอร์ติมิกและการแปลงฐาน

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\-

ผมตีความการป้อนข้อมูลเป็นฐานสิบหกตัวอักษรผ่าน Q 0xซึ่งตรวจสอบโดยอัตโนมัติด้วย จากนั้นผมก็ divmod 256 เข้าไบต์และลบไบต์แรกศูนย์ถ้าแล้ว map มันผ่านสองอาร์เรย์หนึ่งแล้ว0-1F 20-F0อันที่สองได้รับ divmod ผ่านอาร์เรย์แรกเช่นกัน ตัวเลือกแรกได้รับการเชื่อมโยงในตอนท้ายส่วนที่สองรับเครื่องหมายยัติภังค์ที่อยู่ตรงกลางและเว้นวรรคตอนท้าย เข้าร่วมโดย"bitey "ใช้ประโยชน์จากช่วงและขีดกลางด้วย.sและเราก็ทำได้ดี

ส่วนการบีบอัดฐานก็น่าสนใจเช่นกันเพราะฉันเริ่มต้นด้วยการแปลง 128 -> 256 พื้นฐาน แต่ตอนนี้สิ่งที่ฉันทำคือใช้"q"เป็นตัวคั่นแทนช่องว่าง ดังนั้นตอนนี้ฉันสามารถพิจารณาสตริงเป็นเบส 26 ฐานด้วยxLGการปรับปรุงการบีบอัดอย่างมาก

ลองมันนี่เกมออนไลน์

ชุดทดสอบ


ฉันรู้ว่ามันไม่ได้อยู่ในคำถาม แต่ฉันคิดว่าคุณควรจะลองคะเนไปยังหมายเลขที่มากขึ้นเช่น0x112233และ0x93FBAC09
vrwim

2
@ ฉันคิดว่ารูปแบบการออกเสียงนี้จะเสียไปเอ่อความมีชีวิตในจุดนั้นฮ่าฮ่า คุณลองจินตนาการดูว่าพูดจริงNinety-three bitey fleventy-bee halfy atta-cee bitey nineหรือไม่
Kade

ฉันคิดว่ามีบางอย่างผิดพลาดตอนนี้รหัสของคุณสร้างจำนวนมากTruebiteyและFalsebiteys เท่านั้น
Kade

@ Vioz- Ternaries เสียแล้ว Isaacg กลับคำสั่งซื้อเมื่อสองสามวันก่อน ฉันจะไปและเปลี่ยนพวกเขาและในความเป็นจริงประหยัดคู่ไบต์ แต่พวกเขาเป็นเหมือน 14
Maltysen

อ่าฉันเข้าใจแล้ว ดังนั้นเวอร์ชันของ Pyth จึงรักษาฟังก์ชันการทำงานไว้
Kade

5

Java - 856 ไบต์

ไม่สั้น แต่อย่างน้อยคำตอบที่สอง;)

มันเป็นวิธีการที่เรียกว่าString p(String n)จะทำงาน:

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);}

4

Javascript - 577 719 ไบต์

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-"}

ฉันแน่ใจว่ามีการปรับปรุงที่จะทำ โบนัสที่เพิ่มเข้ามาจะแยกวิเคราะห์สตริง hex ความยาวโดยพลการ

แก้ไข: อ๊ะมันไม่ทำงานเมื่อมีเลขศูนย์นำหน้า ฮึ่ม

แก้ไข 2: คงที่ฉันคิดว่า JSFiddle

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.