Prononcer Hex

26

Prononcer Hex

Pour ceux d'entre vous non initiés à l'émission Silicon Valley, ce défi s'inspire d'un échange qui se passe comme ça ( 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.

Il convient de noter que sur le plan technique, 0x9 * 0xF = 0x87pas «furtif-cinq», mais cela soulève une question importante - comment prononcez-vous réellement hex dans la conversation? Ce n'est pas comme si oh ex eff effla langue s'écoule facilement, alors que devons-nous faire? Voici un tableau de prononciation pratique que nous suivrons.

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

Nous pouvons diviser un nombre hexadécimal de 4 longueurs en deux groupes de deux et déterminer la prononciation à partir du tableau ci-dessus, ainsi que la prononciation anglaise courante des nombres. Donc, pour l'exemple 0xFFAB, nous obtiendrions Fleventy-eff bitey atta-bee.

Si un nombre est inclus, par exemple 0xF5AB, vous imprimeriez Fleventy-five bitey atta-bee. De plus, si un nombre commence l'un des groupes, vous devez utiliser sa prononciation "dizaines". Par exemple, 0x5FAAdeviendrait Fifty-eff bitey atta-ay. Dans le cas où vous avez quelque chose comme 0x1FACça, ce serait Effteen bitey atta-cee. Mais, si cette règle devait être utilisée pour 0x1AF4, a-teenpourrait être confondue eighteen, vous devez donc ajouter un Y. Ainsi, la sortie correcte seraitYayteen bitey fleventy-four

Dans le cas de 0xD0F4, au lieu de le faire Dickety-zero bitey fleventy-four, nous ignorerions le zéro et imprimerions Dickety-bitey fleventy-four.

Les traits d'union ne doivent apparaître que dans les groupes de deux, c'est-à-dire que bitey ne doit pas être connecté à l'un ou l'autre groupe avec un trait d'union, sauf si le premier groupe n'est qu'un seul mot! Ce 0x04F4serait le cas four-bitey fleventy-four, mais le 0x44F4serait forty-four bitey fleventy-four. Comme l'a dit Trichoplax , le bitey ne doit être coupé que lorsque vous suivez un nombre rond.

Pour un aperçu complet de la façon dont cela fonctionnera, consultez l'exemple d'E / S ci-dessous.

Objectif

Créez un programme ou une fonction qui prendra une chaîne hexadécimale en entrée ou un argument de fonction et produira sa prononciation. La sortie doit avoir une bonne capitalisation. Vous pouvez supposer que la longueur de ce nombre sera toujours 4.

Exemple d'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"

Il s'agit de , donc le moins d'octets gagne.

Kade
la source
6
Voici une astuce pratique pour quiconque apprend les tables de multiplication hexadécimales: La table de multiplication F peut être calculée sur vos 16 doigts et orteils (à l'exclusion des pouces et des gros orteils). Il suffit de les aligner en rang et de replier le nième pour calculer F x n. Le nombre de chiffres à gauche du chiffre replié est le premier chiffre, et le nombre de chiffres à droite du chiffre replié est le deuxième chiffre, vous permettant de calculer n'importe quel multiple à 2 chiffres. Par exemple, repliez le chiffre Cth pour donner F x C = Bibbity quatre.
trichoplax
2
@trichoplax Mon enfant a été étonné quand je lui ai montré comment faire ça à neuf sur ses doigts: D
Geobits
@Geobits, c'est de cela que je l'ai extrapolé - j'ai adoré ce truc pour les 9 ans quand j'étais enfant.
trichoplax
@trichoplax Je pense que bitey a plus de sens pour la prononciation. J'ai essayé de préciser où les traits d'union doivent apparaître, et la première lettre de la sortie doit être en majuscule, et le reste en minuscules.
Kade
4
vous ne mentionnez "bitey" nulle part ailleurs que des exemples
Sparr

Réponses:

9

Pyth - 312 293 286 251 octets

Il est temps de commencer à réduire les données, plus à venir.

Le plus grand programme Pyth que j'ai jamais écrit! Il y a encore une énorme compression possible avec les données, à la fois algorti et conversion de base, mais je voulais juste mettre cela en place.

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

J'interprète l'entrée comme un littéral hexadécimal via Q qu'il détecte automatiquement avec le 0x. Ensuite, je le divmod 256 dans les octets, et supprime le premier octet si son zéro, puis le mappe à travers deux tableaux, un pour 0-1Fet puis 20-F0. Le second obtient également un divmod via le premier tableau. La première option obtient un hypen à la fin, et la seconde un tiret au milieu et un espace à la fin. Rejoignez-nous "bitey ", capitalisez avec la plage et supprimez les tirets avec .set nous sommes bons.

La partie compression de base est également intéressante car j'ai commencé avec une conversion de base 128 -> 256. Mais maintenant, ce que je fais, c'est utiliser "q"comme séparateur au lieu d'espace. Ainsi, je peux maintenant considérer la chaîne comme une chaîne de base 26 xLG, ce qui améliore considérablement la compression.

Essayez-le ici en ligne .

Suite de tests .

Maltysen
la source
Je sais que ce n'est pas dans la question, mais je pense que vous devriez essayer d'extrapoler à plus de nombres, comme 0x112233et0x93FBAC09
vrwim
2
@Je pense que ce modèle de prononciation perd sa viabilité à ce point, haha. Pouvez-vous imaginer réellement dire Ninety-three bitey fleventy-bee halfy atta-cee bitey nine?
Kade
Je pense que quelque chose s'est cassé, en ce moment votre code ne produit qu'une quantité massive de Truebiteys et Falsebiteys.
Kade
@ Vioz- Les ternaires sont cassés. Isaacg a annulé sa commande il y a quelques jours. Je pourrais aller les changer et en fait économiser quelques octets, mais ils sont comme 14.
Maltysen
Ah, je vois. Alors quelle version de Pyth préserve la fonctionnalité?
Kade
5

Java - 856 octets

Pas court mais au moins la deuxième réponse;)

C'est une méthode appelée String p(String n)qui fera le travail:

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
la source
4

Javascript - 577 719 octets

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

Je suis sûr qu'il y a des améliorations à apporter. Bonus supplémentaire, il analyse les chaînes hexadécimales de longueur arbitraire.

EDIT: Oups, cela ne fonctionne pas correctement lorsqu'il y a des zéros en tête. Hm.

EDIT 2: Fixe, je pense. JSFiddle

Balared
la source