Произносить Hex

26

Произносить Hex

Для тех из вас, кто не имеет отношения к шоу «Силиконовая долина», этот вызов вызван обменом, который проходит следующим образом ( 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не «пятнадцать», но это поднимает важный вопрос - как бы вы на самом деле произносили hex в разговоре? Это не так 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. Но, если бы это правило использовалось 0x1AF4, его a-teenможно было бы перепутать eighteen, поэтому вы должны добавить Y. Таким образом, правильный вывод будетYayteen bitey fleventy-four

В случае 0xD0F4, вместо того , чтобы делать Dickety-zero bitey fleventy-four, мы игнорировали бы ноль и печатали Dickety-bitey fleventy-four.

Дефисы должны появляться только в группах по два человека, то есть кусочки не должны быть связаны ни с одной группой с дефисом, если только первая группа не состоит из одного слова! Так 0x04F4было бы four-bitey fleventy-four, но 0x44F4было бы forty-four bitey fleventy-four. Как Trichoplax сказал, bitey следует hyphened только тогда , когда после круглого числа.

Для всестороннего взгляда на то, как это будет работать, посмотрите пример ввода / вывода ниже.

Задача

Создайте программу или функцию , которая примет шестнадцатеричную строку в качестве входных данных или аргумента функции и выдаст ее произношение. Вывод должен иметь правильную капитализацию. Вы можете предположить, что длина этого числа всегда будет 4.

Пример ввода / вывода

"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 четыре.
трихоплакс
2
@trichoplax Мой ребенок был поражен, когда я впервые показал ему, как сделать это для девяток на пальцах: D
Geobits
@Geobits это то, что я экстраполировал это - я любил этот трюк для девятки в детстве.
трихоплакс
@trichoplax Я думаю, что bitey имеет больше смысла с целью произношения. Я попытался прояснить, где должны появиться дефисы, и первая буква вывода должна быть написана заглавными буквами, а остальные - строчными.
Каде
4
Вы не упоминаете "кусаться" нигде, кроме примеров
Sparr

Ответы:

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 на байты и удаляю первый байт, если он равен нулю, затем отображаю его через два массива, один для 0-1Fи затем 20-F0. Второй получает divmod через первый массив также. Первый вариант получает перенос в конце, а второй - дефис в середине и пробел в конце. Присоединяйтесь "bitey ", извлекайте выгоду из диапазона и удаляйте дефисы, .sи мы в порядке.

Базовое сжатие также интересно, потому что я впервые начал с базового преобразования 128 -> 256. Но сейчас я использую "q"в качестве разделителя вместо пробела. Таким образом, теперь я могу рассматривать строку как строку с базой 26 xLG, что значительно улучшает сжатие.

Попробуйте здесь онлайн .

Тестовый пакет .

Maltysen
источник
Я знаю, что это не в вопросе, но я думаю, что вы должны попробовать экстраполировать на большее число, например, 0x112233и0x93FBAC09
vrwim
2
@ Я думаю, что эта модель произношения теряет свою жизнеспособность, хаха. Можете себе представить, что на самом деле говорите Ninety-three bitey fleventy-bee halfy atta-cee bitey nine?
Каде
Я думаю, что-то сломалось, сейчас ваш код производит только огромное количество Truebiteys и Falsebiteys.
Каде
@ Vioz- Тройки разбиты. Исаак отменил их заказ пару дней назад. Я мог бы пойти и изменить их и на самом деле сохранить пару байтов, но они похожи на 14.
Maltysen
Ах я вижу. Так какая версия Pyth сохраняет функциональность?
Каде
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);}
bobbel
источник
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

Balared
источник