Wymowa Hex

26

Wymowa Hex

Dla tych z was, którzy nie są inicjowani programem Silicon Valley, to wyzwanie jest inspirowane wymianą, która przebiega w ten sposób ( 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.

Należy zauważyć, że technicznie rzecz biorąc, 0x9 * 0xF = 0x87nie „pechowa piątka”, ale rodzi to ważne pytanie - jak w rzeczywistości wypowiesz hex w rozmowie? To nie jest tak, oh ex eff effże łatwo spływa z języka, więc co powinniśmy zrobić? Oto przydatna tabela wymowy, którą będziemy śledzić.

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

Możemy podzielić 4-długościową liczbę szesnastkową na dwie grupy po dwie i określić wymowę z powyższej tabeli, a także wspólną angielską wymowę liczb. Tak więc na przykład 0xFFABotrzymalibyśmy Fleventy-eff bitey atta-bee.

Jeśli podany jest numer, np . 0xF5ABWydrukowałbyś Fleventy-five bitey atta-bee. Ponadto, jeśli liczba rozpoczyna jedną z grup, powinieneś użyć jej wymowy „dziesiątki”. Na przykład 0x5FAAstałby się Fifty-eff bitey atta-ay. W przypadku, gdy masz coś takiego 0x1FAC, byłoby to Effteen bitey atta-cee. Ale gdyby zastosować tę regułę 0x1AF4, a-teenmożna by ją pomylić eighteen, więc musisz wstawić Y. Tak więc poprawnym wyjściem byłobyYayteen bitey fleventy-four

W przypadku 0xD0F4zamiast Dickety-zero bitey fleventy-fourzignorować zero i wydrukować Dickety-bitey fleventy-four.

Łączniki powinny pojawiać się tylko w grupach dwóch, tzn. Zgryzu nie należy łączyć z żadną grupą łącznika, chyba że pierwsza grupa to tylko jedno słowo! Tak 0x04F4byłoby four-bitey fleventy-four, ale 0x44F4byłoby forty-four bitey fleventy-four. Jak powiedział trichoplax , ugryzienie powinno być łączone tylko po zaokrągleniu liczby.

Aby uzyskać kompleksowe spojrzenie na to, jak to będzie działać, sprawdź przykładowe We / Wy poniżej.

Cel

Utwórz program lub funkcję, która pobierze ciąg szesnastkowy jako argument wejściowy lub argument funkcji i wygeneruje jego wymowę. Dane wyjściowe muszą mieć poprawną wielkość liter. Możesz założyć, że długość tego numeru będzie zawsze wynosić 4.

Przykład 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"

To jest , więc wygrywa najmniejsza liczba bajtów.

Kade
źródło
6
Oto przydatna sztuczka dla każdego, kto uczy się tabel czasów szesnastkowych: Tabelę czasów F można obliczyć na podstawie 16 palców u rąk i stóp (z wyjątkiem kciuków i dużych palców stóp). Po prostu ustaw je w rzędzie i złóż n-ty w dół, aby obliczyć F x n. Liczba cyfr po lewej stronie złożonej cyfry to pierwsza cyfra, a liczba cyfr po prawej stronie złożonej cyfry to druga cyfra, co pozwala obliczyć dowolną 2-cyfrową wielokrotność. Na przykład złóż cyfrę Cth w dół, aby otrzymać F x C = Bibbity cztery.
trichoplax
2
@trichoplax Moje dziecko było zaskoczone, kiedy po raz pierwszy pokazałem mu, jak to zrobić dla dziewiątek na palcach: D
Geobits
@Geobits od tego to ekstrapolowałem - jako dziecko uwielbiałem tę sztuczkę od 9 lat.
trichoplax
@trichoplax Myślę, że bitey ma więcej sensu dla celów wymowy. Starałem się wyjaśnić, gdzie mają się pojawiać łączniki, a pierwszą literę wyjścia należy pisać dużymi literami, a resztę małymi literami.
Kade,
4
nie wspominasz o „zgryzieniu” nigdzie indziej niż o przykładach
Sparr

Odpowiedzi:

9

Pyth - 312 293 286 251 bajtów

Czas zacząć redukować dane, więcej nadchodzi.

Święty największy program Pyth, jaki kiedykolwiek napisałem! Nadal możliwa jest ogromna kompresja danych, zarówno algortihimicznie, jak i konwersja podstawowa, ale po prostu chciałem to postawić.

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

Interpretuję dane wejściowe jako literał szesnastkowy poprzez Q, który automatycznie wykrywa za pomocą 0x. Następnie dzielę go na 256 bajtów i usuwam pierwszy bajt, jeśli jest zerem, a następnie odwzorowuję go przez dwie tablice, jedną dla, 0-1Fa następnie 20-F0. Drugi również otrzymuje divmod przez pierwszą tablicę. Pierwsza opcja ma myślnik na końcu, a druga myślnik na środku i spację na końcu. Dołącz "bitey ", wykorzystaj zasięg i usuń łączniki, .sa my jesteśmy dobrzy.

Podstawowa część kompresji jest również interesująca, ponieważ zacząłem od podstawowej konwersji 128 -> 256. Ale teraz używam "q"jako separatora zamiast spacji. Tak więc mogę teraz uznać strunę za strunę podstawową 26 xLG, co znacznie poprawia kompresję.

Wypróbuj tutaj online .

Zestaw testowy .

Maltysen
źródło
Wiem, że nie ma tego w pytaniu, ale myślę, że powinieneś spróbować ekstrapolować na więcej liczb, takich jak 0x112233i0x93FBAC09
vrwim
2
@ Myślę, że ten model wymowy traci swoją żywotność w tym momencie, haha. Czy możesz sobie wyobrazić, że tak mówisz Ninety-three bitey fleventy-bee halfy atta-cee bitey nine?
Kade,
Myślę, że coś się zepsuło, a teraz twój kod produkuje tylko ogromną liczbę Truebiteys i Falsebiteys.
Kade,
@ Vioz- Trójce są zepsute. Kilka dni temu Isaacg cofnął zamówienie. Mógłbym je zmienić i faktycznie zaoszczędzić kilka bajtów, ale są jak 14.
Maltysen
O, rozumiem. Więc która wersja Pyth zachowuje tę funkcjonalność?
Kade,
5

Java - 856 bajtów

Nie krótka, ale przynajmniej druga odpowiedź;)

Jest to metoda o nazwie, String p(String n)która wykona zadanie:

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
źródło
4

JavaScript - 577 719 bajtów

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

Jestem pewien, że należy wprowadzić ulepszenia. Dodano bonus, analizuje ciągi szesnastkowe o dowolnej długości.

EDYCJA: Ups, to nie działa poprawnie, gdy są wiodące zera. Hm

EDYCJA 2: Myślę, że naprawione. JSFiddle

Zbalansowany
źródło