Hex aussprechen

26

Hex aussprechen

Für diejenigen unter Ihnen, die noch nicht mit der Show Silicon Valley begonnen haben, ist diese Herausforderung von einem Austausch inspiriert, der wie folgt abläuft ( 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.

Es sollte beachtet werden, dass technisch gesehen 0x9 * 0xF = 0x87nicht "fünfundvierzig", aber dies wirft eine wichtige Frage auf - wie würden Sie Hex im Gespräch tatsächlich aussprechen? Es ist nicht so oh ex eff eff, als würde die Zunge leicht abfließen. Was sollen wir also tun? Hier ist eine handliche Aussprache-Tabelle, der wir folgen werden.

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

Wir können eine Hex-Zahl mit 4 Längen in zwei Zweiergruppen aufteilen und die Aussprache aus der obigen Tabelle sowie die gebräuchliche englische Aussprache für Zahlen bestimmen. So 0xFFABwürden wir zum Beispiel bekommen Fleventy-eff bitey atta-bee.

Wenn eine Zahl enthalten ist, wie z. B. 0xF5AB, würden Sie drucken Fleventy-five bitey atta-bee. Beginnt eine Zahl mit einer der Gruppen, sollten Sie die Aussprache "Zehn" verwenden. Zum Beispiel 0x5FAAwürde werden Fifty-eff bitey atta-ay. In dem Fall, in dem Sie so etwas haben 0x1FAC, wäre dies Effteen bitey atta-cee. Wenn diese Regel jedoch verwendet wird 0x1AF4, kann a-teendies zu Verwechslungen führen eighteen, sodass Sie ein Y voranstellen müssen. Die richtige Ausgabe wäre alsoYayteen bitey fleventy-four

Im Fall von 0xD0F4, anstatt das zu tun Dickety-zero bitey fleventy-four, würden wir die Null und drucken ignorieren Dickety-bitey fleventy-four.

Bindestriche sollten nur in Zweiergruppen vorkommen, dh Bitey sollte nicht mit einem Bindestrich mit einer der beiden Gruppen verbunden werden, es sei denn, die erste Gruppe besteht nur aus einem Wort! So 0x04F4wäre es four-bitey fleventy-four, aber 0x44F4wäre es forty-four bitey fleventy-four. Wie Trichoplax sagte, sollte der Biss nur nach einer runden Zahl getrennt werden.

Um einen umfassenden Überblick über die Funktionsweise zu erhalten, sehen Sie sich das folgende Beispiel für E / A an.

Zielsetzung

Erstellen Sie ein Programm oder eine Funktion , die eine hexadezimale Zeichenfolge als Eingabe oder ein Funktionsargument verwendet, und erstellen Sie die Aussprache. Die Ausgabe muss eine ordnungsgemäße Groß- und Kleinschreibung aufweisen. Sie können davon ausgehen, dass die Länge dieser Nummer immer 4 ist.

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

Das ist , also gewinnt die geringste Anzahl von Bytes.

Kade
quelle
6
Hier ist ein praktischer Trick für alle, die die Hex-Times-Tabellen lernen: Die F-Times-Tabelle kann mit Ihren 16 Fingern und Zehen (außer Daumen und großen Zehen) berechnet werden. Richten Sie sie einfach in einer Reihe aus und falten Sie die n-te nach unten, um F x n zu berechnen. Die Anzahl der Stellen links von der heruntergeklappten Stelle ist die erste Stelle, und die Anzahl der Stellen rechts von der heruntergeklappten Stelle ist die zweite Stelle, sodass Sie jedes zweistellige Vielfache berechnen können. Falten Sie beispielsweise die C-te Ziffer nach unten, um F x C = Bibbity 4 zu erhalten.
Trichoplax
2
@trichoplax Mein Kind war erstaunt, als ich ihm das erste Mal zeigte, wie man das mit neun Fingern macht: D
Geobits
@Geobits ist das, woraus ich es extrapoliert habe - ich habe diesen Trick als Kind für 9s geliebt.
Trichoplax
@ Trichoplax Ich denke, Bitey macht mehr Sinn für den Zweck der Aussprache. Ich habe versucht, klarer zu machen, wo Bindestriche erscheinen sollen, und der erste Buchstabe der Ausgabe muss groß geschrieben werden, der Rest in Kleinbuchstaben.
Kade
4
Sie erwähnen nicht "Bitey" anders als Beispiele
Sparr

Antworten:

9

Pyth - 312 293 286 251 Bytes

Es ist an der Zeit, die Daten zu reduzieren.

Das größte Pyth-Programm, das ich je geschrieben habe! Es ist immer noch eine enorme Komprimierung mit den Daten möglich, sowohl algortihimisch als auch Basisumwandlung, aber ich wollte dies nur aufstellen.

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

Ich interpretiere die Eingabe als Hex-Literal durch Q, das es automatisch mit dem erkennt 0x. Dann divmod ich es 256 in die Bytes und entferne das erste Byte, wenn es null ist, dann ordne es durch zwei Arrays, eins für 0-1Fund dann 20-F0. Der zweite bekommt auch einen DivMod durch das erste Array. Die erste Option erhält einen Bindestrich am Ende und die zweite einen Bindestrich in der Mitte und ein Leerzeichen am Ende. Machen Sie mit "bitey ", nutzen Sie die Reichweite und entfernen Sie Bindestriche, .sund wir sind gut.

Der Basiskomprimierungsteil ist auch interessant, weil ich zuerst mit der grundlegenden Konvertierung von 128 -> 256 begonnen habe. Aber jetzt verwende ich "q"anstelle des Leerzeichens das Trennzeichen. Daher kann ich die Saite jetzt als Basis-26-Saite betrachten xLG, was die Komprimierung enorm verbessert.

Probieren Sie es hier online .

Testsuite .

Maltysen
quelle
Ich weiß, dass es nicht in Frage kommt, aber ich denke, Sie sollten versuchen, auf mehr Zahlen zu extrapolieren, wie 0x112233und0x93FBAC09
vrwim
2
@Ich denke, dieses Aussprachemodell verliert an diesem Punkt seine Lebensfähigkeit, haha. Könnten Sie sich vorstellen, tatsächlich zu sagen Ninety-three bitey fleventy-bee halfy atta-cee bitey nine?
Kade
Ich denke, etwas ist kaputt gegangen. Im Moment produziert Ihr Code nur eine riesige Menge von Truebiteys und Falsebiteys.
Kade
@ Vioz- Ternaries sind kaputt. Isaacg hat ihre Bestellung vor ein paar Tagen rückgängig gemacht. Ich könnte sie ändern und tatsächlich ein paar Bytes speichern, aber sie sind wie 14.
Maltysen
Ah ich sehe. Welche Version von Pyth bewahrt also die Funktionalität?
Kade
5

Java - 856 Bytes

Nicht kurz aber zumindest die zweite Antwort;)

Es ist eine Methode, String p(String n)die den Job erledigt:

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
quelle
4

Javascript - 577.719 Bytes

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

Ich bin mir sicher, dass Verbesserungen vorgenommen werden müssen. Der Bonus wurde hinzugefügt und analysiert Hex-Strings beliebiger Länge.

EDIT: Whoops, es funktioniert nicht richtig, wenn es führende Nullen gibt. Hm.

EDIT 2: Behoben, denke ich. JSFiddle

Balared
quelle