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 = 0x87
pas «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 eff
la 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, 0x5FAA
deviendrait 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-teen
pourrait ê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 0x04F4
serait le cas four-bitey fleventy-four
, mais le 0x44F4
serait 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 code-golf , donc le moins d'octets gagne.
Réponses:
Pyth -
312293286251 octetsIl 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.
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 pour0-1F
et puis20-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.s
et 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 26xLG
, ce qui améliore considérablement la compression.Essayez-le ici en ligne .
Suite de tests .
la source
0x112233
et0x93FBAC09
Ninety-three bitey fleventy-bee halfy atta-cee bitey nine
?Truebitey
s etFalsebitey
s.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:la source
Javascript -
577719 octetsJe 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
la source