Pronuncia esadecimale


26

Pronuncia esadecimale

Per quelli di voi non iniziati con lo spettacolo Silicon Valley, questa sfida è ispirata da uno scambio che va così ( 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.

Va notato che tecnicamente, 0x9 * 0xF = 0x87non "fleventy-five", ma ciò solleva una domanda importante: come pronunceresti realmente hex in conversazione? Non è che oh ex eff effscorra facilmente dalla lingua, quindi cosa dovremmo fare? Ecco una pratica tabella di pronuncia che seguiremo.

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

Possiamo dividere un numero esadecimale di 4 lunghezze in due gruppi di due e determinare la pronuncia dalla tabella sopra, così come la pronuncia inglese comune per i numeri. Quindi, per esempio 0xFFAB, otterremmo Fleventy-eff bitey atta-bee.

Se viene incluso un numero, ad esempio 0xF5AB, si stampa Fleventy-five bitey atta-bee. Inoltre, se un numero avvia uno dei gruppi, è necessario utilizzare la pronuncia "decine". Ad esempio, 0x5FAAsarebbe diventato Fifty-eff bitey atta-ay. Nel caso in cui hai qualcosa del genere 0x1FAC, questo sarebbe Effteen bitey atta-cee. Ma, se questa regola dovesse essere utilizzata per 0x1AF4, a-teenpotrebbe essere confusa per eighteen, quindi è necessario anteporre una Y. Quindi, l'output corretto sarebbeYayteen bitey fleventy-four

Nel caso 0xD0F4invece di fare Dickety-zero bitey fleventy-four, ignoreremmo lo zero e stamperemmo Dickety-bitey fleventy-four.

I trattini dovrebbero apparire solo all'interno dei gruppi di due, cioè il morso non dovrebbe essere collegato ad alcun gruppo con un trattino a meno che il primo gruppo sia solo una parola! Così 0x04F4sarebbe four-bitey fleventy-four, ma 0x44F4sarebbe forty-four bitey fleventy-four. Come diceva il trichoplax , il morso dovrebbe essere trattato solo dopo aver seguito un numero rotondo.

Per uno sguardo completo su come funzionerà, dai un'occhiata all'esempio I / O di seguito.

Obbiettivo

Crea un programma o una funzione che prenderà una stringa esadecimale come input o un argomento di funzione e produrrà la sua pronuncia. L'output deve avere una corretta capitalizzazione. Puoi presumere che la lunghezza di questo numero sarà sempre 4.

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

Questo è , quindi vince il numero minimo di byte.


6
Ecco un trucco utile per chiunque apprenda le tabelle dei tempi esadecimali: la tabella dei tempi F può essere calcolata su 16 dita dei piedi e dei piedi (esclusi i pollici e gli alluci). Allineali semplicemente in fila e piega l'ennesimo verso il basso per calcolare F x n. Il numero di cifre a sinistra della cifra ripiegata è la prima cifra e il numero di cifre a destra della cifra ripiegata è la seconda cifra, consentendo di calcolare qualsiasi multiplo di 2 cifre. Ad esempio, piega la cifra Cth verso il basso per dare F x C = Bibbity quattro.
trichoplax,

2
@trichoplax Mio figlio è stato stupito quando gli ho mostrato per la prima volta come farlo per nove con le dita: D
Geobits,

@Geobits è quello da cui l'ho estrapolato: ho amato quel trucco per 9 anni da bambino.
trichoplax,

@trichoplax Penso che bitey abbia più senso ai fini della pronuncia. Ho cercato di chiarire dove devono apparire i trattini, e la prima lettera dell'output deve essere maiuscola e il resto in minuscolo.
Kade,

4
non menzioni "pungente" in nessun luogo diverso dagli esempi
Sparr,

Risposte:


9

Pyth - 312 293 286 251 byte

È ora di iniziare a ridurre i dati, più in arrivo.

Il più grande programma di Pyth che abbia mai scritto! C'è ancora un'enorme compressione possibile con i dati, sia algorti-chimicamente che di conversione di base, ma volevo solo metterlo su.

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

Interpreto l'input come letterale esadecimale attraverso Q che rileva automaticamente con 0x. Quindi lo divodod 256 in byte e rimuovo il primo byte se è zero, quindi lo mappa attraverso due array, uno per 0-1Fe poi 20-F0. Il secondo ottiene anche un divmod attraverso il primo array. La prima opzione ottiene un hypen alla fine, e la seconda ottiene un trattino al centro e uno spazio alla fine. Unisciti a "bitey ", capitalizza con la gamma e togli i trattini con .se siamo a posto.

Anche la parte di compressione di base è interessante perché ho iniziato con la conversione di base 128 -> 256. Ma ora, quello che sto facendo è usare "q"come separatore anziché spazio. Quindi ora posso considerare la stringa come una stringa di base 26 xLG, migliorando enormemente la compressione.

Provalo qui online .

Suite di test .


So che non è nella domanda, ma penso che dovresti provare a estrapolare a più numeri, come 0x112233e0x93FBAC09
vrwim

2
@ Penso che questo modello di pronuncia perda perde la sua vitalità a quel punto, ahah. Potresti immaginare davvero dire Ninety-three bitey fleventy-bee halfy atta-cee bitey nine?
Kade,

Penso che qualcosa si sia rotto, in questo momento il tuo codice produce solo una quantità enorme di Truebiteys e Falsebiteys.
Kade,

@ Vioz- I ternari sono rotti. Isaacg ha invertito il suo ordine un paio di giorni fa. Potrei andare a cambiarli e in effetti salvare un paio di byte, ma i loro sono come 14.
Maltysen

Ah, capisco. Quindi quale versione di Pyth conserva la funzionalità?
Kade,

5

Java - 856 byte

Non breve ma almeno la seconda risposta;)

È un metodo chiamato String p(String n)che farà il lavoro:

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

Sono sicuro che ci sono miglioramenti da apportare. Aggiunto bonus, analizza stringhe esadecimali di lunghezza arbitraria.

EDIT: Whoops, non funziona bene quando ci sono zeri iniziali. Hm.

EDIT 2: risolto, penso. JSFiddle

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.