Pronunciando maleficio

26

Pronunciando maleficio

Para aquellos de ustedes no iniciados con el programa Silicon Valley, este desafío está inspirado en un intercambio que dice así ( 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.

Cabe señalar que técnicamente, 0x9 * 0xF = 0x87no 'fleventy-five', pero esto plantea una pregunta importante: ¿cómo se pronunciaría hexadecimal en la conversación? No es como oh ex eff efffluir fácilmente de la lengua, entonces, ¿qué debemos hacer? Aquí hay una práctica tabla de pronunciación que seguiremos.

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

Podemos dividir un número hexadecimal de 4 longitudes en dos grupos de dos y determinar la pronunciación de la tabla anterior, así como la pronunciación común en inglés para los números. Entonces, por ejemplo 0xFFAB, obtendríamos Fleventy-eff bitey atta-bee.

Si se incluye un número, como 0xF5AB, imprimiría Fleventy-five bitey atta-bee. Además, si un número comienza uno de los grupos, debe usar su pronunciación de "decenas". Por ejemplo, 0x5FAAse convertiría Fifty-eff bitey atta-ay. En el caso de que tenga algo así 0x1FAC, esto sería Effteen bitey atta-cee. Pero, si esta regla se usara 0x1AF4, a-teenpodría confundirse eighteen, por lo que debe anteponer una Y. Entonces, la salida correcta seríaYayteen bitey fleventy-four

En el caso de 0xD0F4, en lugar de hacerlo Dickety-zero bitey fleventy-four, ignoraríamos el cero e imprimiríamos Dickety-bitey fleventy-four.

Los guiones solo deben aparecer dentro de los grupos de dos, es decir, la mordida no debe conectarse a ningún grupo con un guión a menos que el primer grupo sea solo una palabra. Así 0x04F4sería four-bitey fleventy-four, pero 0x44F4sería forty-four bitey fleventy-four. Como dijo trichoplax , la mordida solo se debe guiar cuando se sigue un número redondo.

Para una visión completa de cómo funcionará esto, consulte el ejemplo de E / S a continuación.

Objetivo

Cree un programa o función que tome una cadena hexadecimal como entrada o un argumento de función y produzca su pronunciación. La salida debe tener una capitalización adecuada. Puede suponer que la longitud de este número siempre será 4.

Ejemplo de E / S

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

Este es el , por lo que gana el menor número de bytes.

Kade
fuente
66
Aquí hay un truco útil para cualquiera que esté aprendiendo las tablas de multiplicar hexadecimales: la tabla de multiplicar F se puede calcular en sus 16 dedos de manos y pies (excluyendo los pulgares y dedos gordos). Simplemente alinéelos en una fila y doble el enésimo hacia abajo para calcular F x n. El número de dígitos a la izquierda del dígito doblado hacia abajo es el primer dígito, y el número de dígitos a la derecha del dígito doblado hacia abajo es el segundo dígito, lo que le permite calcular cualquier múltiplo de 2 dígitos. Por ejemplo, doble el dígito Cth hacia abajo para dar F x C = Bibbity cuatro.
trichoplax
2
@trichoplax Mi hijo se sorprendió cuando le mostré por primera vez cómo hacerlo por nueve en sus dedos: D
Geobits
@Geobits de eso es lo que extrapolé: me encantó ese truco durante 9 años cuando era niño.
trichoplax
@trichoplax Creo que bitey tiene más sentido para la pronunciación. He tratado de aclarar dónde aparecerán los guiones, y la primera letra de la salida debe estar en mayúscula, y el resto en minúsculas.
Kade
44
no mencionas "mordisco" en ningún otro lugar que no sean ejemplos
Sparr

Respuestas:

9

Pyth - 312 293 286 251 bytes

Es hora de comenzar a reducir los datos, más por venir.

Santo programa Pyth más grande que he escrito! Todavía hay una gran compresión posible con los datos, tanto algortihimically como la conversión de base, pero solo quería poner esto.

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 la entrada como literal hexadecimal a través de Q que detecta automáticamente con el 0x. Luego lo divodé 256 en los bytes, y elimino el primer byte si es cero, luego lo mapeo a través de dos matrices, una para 0-1Fy luego 20-F0. El segundo también obtiene un divmod a través de la primera matriz. La primera opción obtiene un himno al final, y la segunda obtiene un guión en el medio y un espacio al final. Únase "bitey ", capitalice con rango y elimine guiones con .sy estamos bien.

La parte de compresión base también es interesante porque comencé con la conversión básica 128 -> 256. Pero ahora, lo que estoy haciendo es usar "q"como separador en lugar de espacio. Por lo tanto, ahora puedo considerar la cadena como una cadena base 26 xLG, mejorando enormemente la compresión.

Pruébalo aquí en línea .

Banco de pruebas .

Maltysen
fuente
Sé que no está en la pregunta, pero creo que deberías intentar extrapolar a más números, como 0x112233y0x93FBAC09
vrwim
2
@ Creo que este modelo de pronunciación pierde su viabilidad en ese punto, jaja. ¿Te imaginas decir en realidad Ninety-three bitey fleventy-bee halfy atta-cee bitey nine?
Kade
Creo que algo se ha roto, en este momento su código solo produce una cantidad masiva de Truebiteysy Falsebiteys.
Kade
@ Vioz- Los ternarios están rotos. Isaacg revirtió su orden hace un par de días. Podría ir a cambiarlos y de hecho ahorrar un par de bytes, pero son como 14.
Maltysen
Ah, ya veo. Entonces, ¿qué versión de Pyth conserva la funcionalidad?
Kade
5

Java - 856 bytes

No breve pero al menos la segunda respuesta;)

Es un método llamado String p(String n)que hará el trabajo:

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

Estoy seguro de que hay mejoras por hacer. Bonificación adicional, analiza cadenas hexadecimales de longitud arbitraria.

EDITAR: Vaya, no funciona bien cuando hay ceros a la izquierda. Hm.

EDIT 2: arreglado, creo. JSFiddle

Equilibrado
fuente