Converti in Bibi-binario


25

Bibi-binary è un sistema numerico inventato da Boby Lapointe per rappresentare numeri in lettere la cui pronuncia sembra divertente.

Il tuo compito è convertire i numeri decimali in Bibi-binario!

Conversione

Un numero viene convertito in base 16 (esadecimale) e ogni carattere viene sostituito dal suo nome Bibi-binario:

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

Sia Nun numero intero positivo (tra 1 -> 2 ^ 31-1). Per ogni carattere nella rappresentazione esadecimale di N, sostituisci il carattere con la sua coppia Bibi-binaria corrispondente (la tabella sopra contiene tutte le coppie).

Esempio

  • N = 156
  • H= (rappresentazione esadecimale di N) -> 9C
  • 9 -> KA, C -> DO

Pertanto l'output è KADO.

Input Output

Riceverai un numero intero a 32 bit positivo N, che dovrai trasformare in Bibi-binary.

Puoi (restituire, stampare, ecc ...) in qualsiasi formato conveniente, ma le coppie devono essere collegate ! Quindi KA DOnon andrebbe bene, ma lo KADOfarebbe.

Sono ammessi sia lettere minuscole che maiuscole .

Regole

  • Nessuna scappatoia.
  • Questo è code-golf, quindi vince il codice più corto.

Casi test

2048 -> KOHOHO
156 -> KADO
10000 -> HEBIHAHO
12 -> DO

La specifica sembra dire che l'input sarà non negativo in una sezione e positivo in un'altra - potresti chiarire quale è destinato?
Sp3000,

@ È previsto Sp3000 positivo. Lo modificherò in, grazie!
Yytsi,

La tua specifica dice ancora tra 0 -> 2 ^ 31-1 , ma 0 non è positivo (in inglese).
Dennis,

@Dennis ho trattato 0 come positivo. Lo modificherò. Grazie per la menzione!
Yytsi,

@TuukkaX 0 è precisamente la distinzione tra positivo e non negativo.
Ripristina Monica il

Risposte:


10

05AB1E , 20 18 16 byte

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

Spiegazione

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

Provalo online!

Salvato 2 byte grazie ad Adnan


…Âkdè una versione compressa di "hbkd":).
Adnan,

Inoltre, non sono sicuro che sia possibile, ma Hconverte anche un numero esadecimale in base 10.
Adnan,

11

Python 2, 58 byte

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

Una soluzione ricorsiva. Provalo su Ideone .


2
f=lambda n:n*'_'and f(n/16)+"HBKD"[n/4%4]+"OAEI"[n%4]salva 5 byte.
Dennis,

Ho cancellato il mio commento. L'OP è stato chiarito e l'ingresso 0 non è valido.
Dennis,

4

Python 2, 81 76 byte

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

Scegli la cifra bibica per rappresentare ciascuna cifra esadecimale in base ai motivi nelle cifre bibiche.


4

Javascript (ES6), 58 53 43 byte

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

10 byte salvati (nessun supporto per n = 0 più)

dimostrazione

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


Puoi accorciare questo ora che zero non è più un requisito?
Neil,

3

Pyth, 28 byte

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

Definisce una funzione y. Fondamentalmente lo stesso algoritmo della mia risposta Python .

Spiegazione:

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.

Provalo qui! (I due caratteri extra alla fine è solo per chiamare la funzione)


3

Gelatina , 17 byte

b⁴d4ị"€“BKDH“AEIO

Provalo online! o verifica tutti i casi di test .

Come funziona

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).

3

Rubino, 55 51 byte

Una funzione anonima ricorsiva:

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

Chiamalo ad esempio con f[156]e ritorna"KADO"


3

J, 35 33 byte

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

Genera la tabella dei valori bibi-binari per numeri interi [0, 16), quindi converte l'ingresso n in un elenco di 16 cifre di base e seleziona il nome bibi-binario corrispondente per ogni cifra esadecimale.

Salvato 2 byte grazie a @randomra.

uso

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

Questa parte genera una matrice 16 x 2 di caratteri per il nome bibi-binario di ogni cifra esadecimale.

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

Spiegazione

,/'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

'HBKDOAEI'{~[:(+0 4$~$)4#.inv]
FrownyFrog,

3

Perl, 52 51 byte

Include +1 per -p

Esegui con il numero su STDIN

bibi.pl <<< 156

bibi.pl:

#!/usr/bin/perl -p
1while$\=(<{H,B,K,D}{O,A,E,I}>)[$_%16].$\,$_>>=4}{

3

PHP, 63 byte

contributo di @Titus Grazie

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

72 byte funziona anche con zero

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

76 byte Versione alternativa

for($i=2*strlen(dechex($n=$argv[1]));$i;)echo HBKDOAEI[$i%2*4+$n/4**--$i%4];

Prova questo:for($n=$argv[1];$n;$n>>=2)$r=HBKDOAEI[$n%4+4*$t=!$t].$r;echo$r;
Tito,

1
Inoltre: hai dimenticato di giocare a golf dai curlys dalla tua prima versione.
Tito,

for($n=$argv[1];$n;$n>>=4)$r=HBKD[$n/4&3].OAEI[$n&3].$r;echo$r;anche per 63 byte o un porto di risposta di Arnauld per 61:function f($n){return$n?f($n>>4).HBKD[$n/4&3].OAEI[$n&3]:'';}
Tito

@Titus la tua prima versione non funziona correttamente con un input di 1 o 16. Bello non ho capito che zero come input non è più consentito
Jörg Hülsermann

sì, appena notato. non stampa il Hprimo. Prendi il secondo.
Tito,

2

Rubino, 85 83 byte

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

Solo una soluzione rapida e semplice senza codificare la stringa.


2

Pyth, 21 byte

sm@*"HBKD""OAEI"djQ16

Un programma che accetta l'input di un numero intero da STDIN e stampa il risultato.

Provalo online

Come funziona

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

2

PHP, 93 byte

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

Questo fondamentalmente sfrutta le funzioni esadecimali integrate e un piccolo trucco nell'istruzione while per risparmiare sulle parentesi graffe.


2

Java, 224 byte

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));}}}

Usando alcuni stratagemmi della tabella di ricerca L'utilizzo di tipo lungo è stato quello di radere qualche byte rispetto a Integer


2

CJam , 20 byte

qiGb"HBKD""OAEI"m*f=

Provalo online! (Come una suite di test separata da avanzamento riga.)

Spiegazione

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.

2

Dyalog APL , 19 byte

Richiede il ⎕IO←0valore predefinito su molti sistemi.

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

arruolarsi (rendere completamente piatto)

(...

, il rapito

'HBKD'∘.,'OAEI' tabella di concatenazione (ovvero tutte le combo)

)[ indicizzato da ...

16⊥⍣¯1 l'inverso della rappresentazione da base 16 a base 10 (cioè da base 10 a base 16)

di

l'input numerico

]

ProvaAPL online!


1

Lua, 196 byte

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 è fastidioso per questo tipo di attività, poiché per impostazione predefinita non contiene un metodo di conversione esadecimale o binario. La maggior parte della carne lo sta convertendo in base 4. Dopo di ciò forziamo uno 0 dietro di esso se dobbiamo usarlo s=("0"):rep(#s%2), quindi usando gsub sostituiamo tutti i progetti con la loro controparte BIBI.


0

Chip , 174 byte

 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]'

Provalo online! TIO include un wrapper Bash che converte una stringa intera in un valore intero reale a 32 bit.

La metà superiore stampa le lettere corrispondenti ai dati binari, una volta che la metà inferiore ha rilevato che abbiamo raggiunto i dati interessanti (in altre parole, saltiamo gli zeri iniziali. Per stampare tutti gli zeri iniziali, rimuovere la seconda riga che inizia con Ae giù.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.