十六进制的发音


26

十六进制的发音

对于那些不熟悉节目《硅谷》的人来说,这项挑战的灵感来自这样的交流(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.

应该注意的是,从技术上讲,0x9 * 0xF = 0x87不是'fifty-five',而是一个重要的问题-您实际上如何在对话中发音十六进制?并不是说oh ex eff eff舌头容易流掉,那我们该怎么办?这是我们将要遵循的方便的发音图表。

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

我们可以将4位数的十六进制数字分成两组,每组两个,然后从上表确定发音,以及数字的常见英语发音。因此,例如0xFFAB,我们将得到Fleventy-eff bitey atta-bee

如果包含数字,例如0xF5AB,您将打印Fleventy-five bitey atta-bee。另外,如果数字以一组开头,则应使用其“十”音。例如,0x5FAA将变为Fifty-eff bitey atta-ay。如果您有类似的东西0x1FAC,那就是Effteen bitey atta-cee。但是,如果将此规则用于0x1AF4a-teen可能会混淆eighteen,因此您必须在前面加上Y。因此,正确的输出将是Yayteen bitey fleventy-four

在的情况下,我们会忽略零并打印0xD0F4而不是Dickety-zero bitey fleventy-four这么做Dickety-bitey fleventy-four

连字符只能出现在两组中,即,除非第一组只有一个单词,否则bitey不应与连字符连接到任一组!所以0x04F4four-bitey fleventy-four,但0x44F4forty-four bitey fleventy-four。正如trichoplax所说,bitey仅在跟随一个整数后才被连字符。

要全面了解它如何工作,请查看下面的示例I / O。

目的

创建一个将十六进制字符串作为输入或函数参数程序或函数,并产生其发音。输出必须具有适当的大写字母。您可以假设此数字的长度始终为4。

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

这是,因此最少的字节数获胜。


6
对于学习十六进制时间表的任何人来说,这都是一个方便的窍门:F时间表可以用您的16个手指和脚趾(不包括拇指和大脚趾)来计算。只需将它们排成一行,然后向下折叠第n个,即可计算出F x n。向下折叠的数字左侧的位数是第一位,而向下折叠的数字右侧的位数是第二位,因此您可以计算任何2位数的倍数。例如,将Cth数字向下折叠以得到F x C = Bibbity 4。
trichoplax

2
@trichoplax 当我第一次向他展示如何在他的手指上做到九分时,我的孩子感到惊讶:D
Geobits 2015年

@Geobits是我从中推断出来的-小时候我很喜欢9秒钟的技巧。
trichoplax

@trichoplax我认为bitey在发音上更有意义。我试图弄清楚连字符的出现位置,并且输出的第一个字母必须大写,其余的都用小写。
卡德,2015年

4
您没有在示例中提到“ bitey”
Sparr

Answers:


9

Pyth - 312个 293 286 251字节

是时候开始减少数据了,更多的东西来了。

我写过的最大的Pyth程序!从算法上和基本转换上,数据仍有巨大的压缩可能性,但只是想提出来。

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

我将输入解释为通过Q的十六进制文字,并使用进行自动检测0x。然后,我将其256 divmod划分为字节,并删除第一个字节(如果其为零),然后将其映射到两个数组,一个为for 0-1F,然后为20-F0。第二个也通过第一个数组获得divmod。第一个选项在末尾加连字符,第二个选项在中间并加一个连字符。通过加入"bitey ",用范围大写,并用连字符消除,.s我们很好。

基本压缩部分也很有趣,因为我首先从基本的128-> 256转换开始。但是现在,我正在做的是"q"用作分隔符而不是空间。因此,我现在可以将该字符串视为的基础26字符串xLG,极大地提高了压缩率。

在这里在线尝试

测试套件


我知道这是不是在这个问题,但我想你应该尝试外推到更多的数字,喜欢0x1122330x93FBAC09
vrwim

2
@我认为这个发音模型失去了它,呃,那时候的生存能力,哈哈。您能想象实际上在说Ninety-three bitey fleventy-bee halfy atta-cee bitey nine什么吗?
卡德,2015年

我认为有些问题了,现在您的代码仅产生大量的Truebiteys和Falsebiteys。
卡德,2015年

@ Vioz-三元组已损坏。伊萨克几天前撤消了他们的订单。我可以去更改它们,实际上节省了几个字节,但是它们就像
14。– Maltysen

知道了 那么什么版本的Pyth保留了功能?
卡德,2015年

5

Java-856字节

不短,但至少是第二个答案;)

这是一个String p(String n)可以完成工作的方法:

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字节

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

我确定有待改进。增加的好处是,它可以解析任意长度的十六进制字符串。

编辑:糟糕,当有前导零时,它不正确。嗯

编辑2:我认为,已修复。JSFiddle

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.