Промовляння 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не «швидкості п’ять», але це викликає важливе питання - як би ви насправді вимовляли шістнадцять у розмові? Це не так, як 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-   

Ми можемо розділити шістнадцятковий шістнадцятковий номер на дві групи по дві та визначити вимову з наведеної вище таблиці, а також загальну англійську вимову для чисел. Отже, для прикладу 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. Як говорив трихоплакс , біти повинні бути переносяться лише після наступного кругового числа.

Щоб вичерпно ознайомитись з тим, як це буде працювати, ознайомтеся з прикладом вводу / виводу нижче.

Об'єктивна

Створіть програму або функцію, яка буде приймати шістнадцятковий рядок як вхідний або аргумент функції і виробляти її вимову. Вихід повинен мати правильну капіталізацію. Можна припустити, що довжина цього числа завжди буде 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. Кількість цифр зліва від складеної цифри - перша цифра, а кількість цифр праворуч від складеної цифри - друга цифра, що дозволяє обчислити будь-яке двозначне кратне число. Наприклад, складіть Cth цифру вниз, щоб дати F x C = Bibbity чотири.
трихоплакс

2
@trichoplax Моя дитина була вражена, коли я вперше показала йому, як це зробити для дев'яток на пальцях: D
Geobits

@Geobits це те, з чого я його екстраполював - я любив цей трюк для 9-х років, як дитина.
трихоплакс

@trichoplax Я думаю, що bitey має більше сенсу для вимови. Я намагався зробити зрозуміліше, де мають з’являтись дефіси, і перша літера виводу має бути написана з великої літери, а решта з малої літери.
Каде

4
ви не згадуєте ні про що, окрім прикладів, "Bitey"
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, надзвичайно покращуючи стиснення.

Спробуйте це онлайн .

Тестовий набір .


Я знаю, що це не в питанні, але я думаю, вам слід спробувати екстраполяцію на більшу кількість номерів, як-от 0x112233і0x93FBAC09
vrwim

2
@ Я думаю, що ця модель вимови втрачає її, е, життєздатність у той момент, ха-ха. Ви можете собі уявити, що насправді говорите Ninety-three bitey fleventy-bee halfy atta-cee bitey nine?
Каде

Я думаю, що щось зламалося, зараз ваш код виробляє лише величезну кількість Truebiteys і Falsebiteys.
Каде

@ Віоз- Тернари розбиті. Ісаакг відмінив їх замовлення пару днів тому. Я міг би змінити їх і фактично зберегти пару байтів, але їх як 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);}

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

Я впевнений, що слід вдосконалити. Доданий бонус, він аналізує довільну шістнадцяткові рядки.

EDIT: На жаль, це не працює правильно, коли є провідні нулі. Гм.

EDIT 2: Виправлено, я думаю. JSFiddle

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.