Konwertuj na Bibi-binary

25

Bibi-binary to system numeryczny opracowany przez Boby Lapointe w celu przedstawienia liczb w literach, których wymowa wydaje się śmieszna.

Twoim zadaniem jest konwersja liczb dziesiętnych na Bibi-binary!

Konwersja

Liczba jest konwertowana na podstawową 16 (szesnastkową), a każdy znak jest zastępowany przez bibi-binarną nazwę:

0 = HO
1 = HA
2 = HE
3 = HI
4 = BO
5 = BA
6 = BE
7 = BI
8 = KO
9 = KA
A = KE
B = KI
C = DO
D = DA
E = DE
F = DI

Niech Nbędzie liczbą całkowitą dodatnią (między 1 -> 2 ^ 31-1). Dla każdego znaku w reprezentacji szesnastkowej Nzamień znak na odpowiednią parę bibi-binarną (powyższa tabela zawiera wszystkie pary).

Przykład

  • N = 156
  • H= (reprezentacja szesnastkowa N) -> 9C
  • 9 -> KA, C -> DO

Zatem wyjściem jest KADO.

Wejście wyjście

Otrzymasz dodatnią 32-bitową liczbę całkowitą N, którą będziesz musiał przekształcić w Bibi-binary.

Możesz (zwrócić, wydrukować itp.) W dowolnym dogodnym formacie, ale pary muszą być połączone ! Więc KA DOnie byłoby dobrze, ale KADObyłoby.

Zarówno małe, jak i wielkie litery są dozwolone.

Zasady

  • Bez luk.
  • To jest golf golfowy, więc wygrywa najkrótszy kod.

Przypadki testowe

2048 -> KOHOHO
156 -> KADO
10000 -> HEBIHAHO
12 -> DO
Yytsi
źródło
Wydaje się, że specyfikacja mówi, że dane wejściowe będą nieujemne w jednej sekcji i pozytywne w innej - czy możesz wyjaśnić, która z nich jest przeznaczona?
Sp3000,
@ Sp3000 jest przeznaczony. Zmienię to, dzięki!
Yytsi
Twoja specyfikacja nadal podaje między 0 -> 2 ^ 31-1 , ale 0 nie jest dodatnia (po angielsku).
Dennis
@Dennis Traktowałem 0 jako pozytywny. Wyedytuję to. Dzięki za wzmiankę!
Yytsi
@TukukX 0 jest właśnie różnicą między pozytywną a nieujemną.
Przywróć Monikę

Odpowiedzi:

10

05AB1E , 20 18 16 bajtów

hv…ÂkdžM¨ÁâyHèJ

Wyjaśnienie

h                     # convert input to hex
 v                    # for each
  …Âkd               # string of the possible first Bibi-binary letters
       žM¨Á           # string of the possible second Bibi-binary letters
           â          # cartesian product to produce list of Bibi-binary pairs
            yH        # convert hex char to base 10
              è       # use this to index into the list
               J      # join

Wypróbuj online!

Zaoszczędzono 2 bajty dzięki Adnan

Emigna
źródło
…Âkdjest skompresowaną wersją "hbkd":).
Adnan
Ponadto nie jestem pewien, czy to możliwe, ale Hrównież konwertuje liczbę szesnastkową na bazę 10.
Adnan
11

Python 2, 58 bajtów

f=lambda n:(n>15and f(n/16)or"")+"HBKD"[n/4%4]+"OAEI"[n%4]

Rozwiązanie rekurencyjne. Wypróbuj na Ideone .

Loovjo
źródło
2
f=lambda n:n*'_'and f(n/16)+"HBKD"[n/4%4]+"OAEI"[n%4]oszczędza 5 bajtów.
Dennis
Cofnąłem swój komentarz. Wyjaśnienie PO i wejście 0 jest nieprawidłowe.
Dennis
4

Python 2, 81 76 bajtów

lambda n:''.join('HBKD'[int(x,16)/4]+'OAEI'[int(x,16)%4]for x in hex(n)[2:])

Wybiera cyfrę bibi, która będzie reprezentować każdą cyfrę szesnastkową na podstawie wzorów w cyfrach bibi.

Miedź
źródło
4

JavaScript (ES6), 58 53 43 bajty

f=n=>n?f(n>>4)+'HBKD'[n/4&3]+'OAEI'[n&3]:''

Zapisano 10 bajtów (brak wsparcia dla n = 0)

Próbny

var f=n=>n?f(n>>4)+'HBKD'[n/4&3]+'OAEI'[n&3]:''

console.log(f(2048));   // -> KOHOHO
console.log(f(156));    // -> KADO
console.log(f(10000));  // -> HEBIHAHO
console.log(f(12));     // -> DO

Arnauld
źródło
Czy możesz to skrócić, skoro zero nie jest już wymogiem?
Neil
3

Pyth, 28 bajtów

L+?>b15y/b16k@*"HBKD""OAEI"b

Definiuje funkcję y. Zasadniczo ten sam algorytm jak moja odpowiedź w języku Python .

Wyjaśnienie:

L                            # Define a function, y, with an argument, b.
  ?>b15                      # If b > 15, then:
       y/b16                 # Call y with b / 16, else:
            k                # The empty string.
 +                           # Append with
              *"HBKD""OAEI"  # The Cartesian product of "HBKD" and "OAEI". Gives all the letter pairs in order
             @             b # Get the b'th number from that list. Because @ in Pyth is modular, we don't need to take b % 16.

Wypróbuj tutaj! (Dodatkowe dwa znaki na końcu to tylko wywołanie funkcji)

Loovjo
źródło
3

Galaretka , 17 bajtów

b⁴d4ị"€“BKDH“AEIO

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

b⁴d4ị"€“BKDH“AEIO  Main link. Argument: n

b⁴                 Convert n to base 16.
  d4               Divmod 4; map each base-16 digit k to [k / 4, k % 4].
       “BKDH“AEIO  Yield ["BKDH", "AEIO"].
      €            For each quotient-remainder pair [q, r]:
    ị"               Yield "BKDH"[q] and "AEIO"[r] (1-based indexing).
Dennis
źródło
3

Rubinowy, 55 51 bajtów

Rekurencyjna anonimowa funkcja:

f=->i{(i>15?f[i/16]:'')+'HBKD'[i%16/4]+'OAEI'[i%4]}

Nazwij to na przykład za pomocą f[156]i zwraca"KADO"

daniero
źródło
3

J, 35 33 bajtów

[:,(,/'HBKD',"0/'OAEI'){~16#.inv]

Generuje tabelę wartości bibi-binarnych dla liczb całkowitych [0, 16), a następnie konwertuje dane wejściowe n na listę 16 podstawowych cyfr i wybiera odpowiednią nazwę bibi-binarną dla każdej cyfry szesnastkowej.

Zaoszczędzono 2 bajty dzięki @randomra.

Stosowanie

   ,/'HBKD',"0/'OAEI'
HO
HA
HE
HI
BO
BA
BE
BI
KO
KA
KE
KI
DO
DA
DE
DI

Ta część generuje tablicę 16 x 2 znaków dla bibi-binarnej nazwy każdej cyfry szesnastkowej.

   f =: [:,(,/'HBKD',."0 1'OAEI'){~16#.inv]
   f 156
KADO
   f 2048
KOHOHO

Wyjaśnienie

,/'HBKD',"0/'OAEI'
  'HBKD'    'OAEI'  Constant char arrays
        ,"0/        Form the table of joining each char with the other
,/                  Join the rows of that table

[:,(,/'HBKD',."0 1'OAEI'){~16#.inv]  Input: n
                                  ]  Identity function, get n
                           16#.inv   Performs the inverse of converting an array of
                                     hex digits meaning it converts a value to a list of
                                     hex digits
   (,/'HBKD',."0 1'OAEI')            Create the bibi-binary names of each hex digit
                         {~          For each hex digit, select its bibi-binary name
[:,                                  Join the names to form a single string and return
mile
źródło
'HBKDOAEI'{~[:(+0 4$~$)4#.inv]
FrownyFrog,
3

Perl, 52 51 bajtów

Obejmuje +1 dla -p

Uruchom z numerem na STDIN

bibi.pl <<< 156

bibi.pl:

#!/usr/bin/perl -p
1while$\=(<{H,B,K,D}{O,A,E,I}>)[$_%16].$\,$_>>=4}{
Ton Hospel
źródło
3

PHP, 63 bajtów

wkład @Titus Dziękujemy

for($n=$argv[1];$n;$n>>=4)$r=HBKD[$n/4&3].OAEI[$n&3].$r;echo$r;

72 bajty działa również na zero

do$r=OAEIHBKD[$t*4+($n=&$argv[1])%4].$r;while(($t=!$t)|$n=$n>>2);echo$r;

76 bajtów alternatywna wersja

for($i=2*strlen(dechex($n=$argv[1]));$i;)echo HBKDOAEI[$i%2*4+$n/4**--$i%4];
Jörg Hülsermann
źródło
Spróbuj tego:for($n=$argv[1];$n;$n>>=2)$r=HBKDOAEI[$n%4+4*$t=!$t].$r;echo$r;
Tytus
1
Ponadto: zapomniałeś grać w golfa w curly od pierwszej wersji.
Tytus
for($n=$argv[1];$n;$n>>=4)$r=HBKD[$n/4&3].OAEI[$n&3].$r;echo$r;za 63 bajty lub port odpowiedzi Arnaulda na 61:function f($n){return$n?f($n>>4).HBKD[$n/4&3].OAEI[$n&3]:'';}
Tytus
@Titus Twoja pierwsza wersja nie działa poprawnie przez wejście 1 lub 16. Fajnie Nie zdawałem sobie sprawy z tego, że zero nie jest już dozwolone
Jörg Hülsermann
tak, właśnie zauważyłem. nie drukuje na Hpierwszym miejscu. Weź drugi.
Tytus
2

Rubinowy, 85 83 bajtów

->x{x.to_s(16).chars.map{|d|"HOHAHEHIBOBABEBIKOKAKEKIDODADEDI"[2*d.to_i(16),2]}*''}

Tylko szybkie i proste rozwiązanie bez kodowania łańcucha.

sudee
źródło
2

Pyth, 21 bajtów

sm@*"HBKD""OAEI"djQ16

Program, który pobiera liczbę całkowitą ze STDIN i wypisuje wynik.

Wypróbuj online

Jak to działa

sm@*"HBKD""OAEI"djQ16  Program. Input: Q
                 jQ16  Yield decimal digits of the base-16 representation of Q as a list
    "HBKD"              Possible first letters
          "OAEI"        Possible second letters
   *                    Cartesian product of those two strings
  @                     Index into the above
 m              d      Map that across the digits list
s                      Concatenate
                       Implicitly print
TheBikingViking
źródło
2

PHP, 93 bajty

$a=HBKDOAEI;$h=dechex($argv[1]);while($h{$i}!=''|$c=hexdec($h{$i++}))echo$a{$c/4}.$a{4+$c%4};

Wykorzystuje to w zasadzie zintegrowane funkcje szesnastkowe i małą sztuczkę w instrukcji while, aby zaoszczędzić na nawiasach klamrowych.

YetiCGN
źródło
2

Java, 224 bajty

class N{public static void main(String[]a){String x="0HO1HA2HE3HI4BO5BA6BE7BI8KO9KAaKEbKIcDOdDAeDEfDI";for(int c:Long.toHexString(Long.valueOf(a[0])).toCharArray()){c=x.indexOf(c)+1;System.out.print(x.substring(c++,++c));}}}

Używanie pewnych sztuczek w tablicy odnośników Zastosowanie typu Long polegało na zmniejszeniu liczby bajtów w porównaniu do liczby całkowitej

masterX244
źródło
2

CJam , 20 bajtów

qiGb"HBKD""OAEI"m*f=

Wypróbuj online! (Jako pakiet testowy oddzielony od linii).

Wyjaśnienie

qi      e# Read input and convert to integer.
Gb      e# Get hexadecimal digits.
"HBKD"  e# Push this string.
"OAEI"  e# Push this string.
m*      e# Cartesian product, yields ["HO" "HA" "HE" "HI" "BO" ... "DE" "DI"].
f=      e# For each digit, select the corresponding syllable.
Martin Ender
źródło
2

Dyalog APL , 19 bajtów

Wymaga ⎕IO←0ustawienia domyślnego w wielu systemach.

∊(,'HBKD'∘.,'OAEI')[16⊥⍣¯1⊢⎕]

zaciągnąć się (zrobić całkowicie płaskie)

(...

, zniszczony

'HBKD'∘.,'OAEI' tabela konkatenacji (tzn. wszystkie kombinacje)

)[ indeksowane przez ...

16⊥⍣¯1 odwrotność reprezentacji od podstawy-16 do podstawy 10 (tj. od podstawy-10 do podstawy 16)

z

wejście numeryczne

]

Wypróbuj APL online!

Adám
źródło
1

Lua, 196 bajtów

function(n)s=""t={"H","B","K","D"}p={"O","A","E","I"}while n>0 do s=n%4 ..s n=math.floor(n/4)end s=("0"):rep(#s%2)..s o=nil return s:gsub(".",function(s)o=not o return o and t[s+1]or p[s+1]end)end

Lua jest denerwująca dla tego rodzaju zadania, ponieważ domyślnie nie zawiera metody konwersji szesnastkowej lub binarnej. Większość ciała konwertuje go na bazę 4. Następnie, jeśli potrzebujemy, zmuszamy 0 za nim s=("0"):rep(#s%2), a następnie używamy gsub zamieniając wszystkie gadżety na ich odpowiedniki BIBI.

ATaco
źródło
0

Chip , 174 bajty

 z---.
!+ZZZ^~s
Axxx])~-vv/c
Ex]xx' ,x]/b
Bxxx])~^}~/d
Fx]xx'g*-}^a
Cxx])v]--/c
G]xx'>x~v/d
Dxx])x+-]/a
H]xx'`}--/b
 )x)-----'
Axx].zv~S
Bxx]+^'
Cxx]<
Dxx]<
E]v-'
F]<
G]<
H]'

Wypróbuj online! TIO zawiera opakowanie Bash, które konwertuje ciąg liczb całkowitych na rzeczywistą 32-bitową wartość całkowitą.

Górna połowa drukuje litery odpowiadające danym binarnym, gdy tylko dolna połowa wykryje, że osiągnęliśmy interesujące dane (innymi słowy, pomijamy zera na początku. Aby wydrukować wszystkie zera na początku, usuń drugą linię, która zaczyna się od Ai w dół.

Phlarx
źródło