Konversikan ke Bibi-binary


25

Bibi-binary adalah sistem numerik yang diciptakan oleh Boby Lapointe untuk merepresentasikan angka dalam huruf yang pelafalannya terasa lucu.

Tugas Anda adalah mengubah angka desimal menjadi biner Bibi!

Konversi

Sejumlah dikonversi ke basis 16 (heksadesimal) dan setiap karakter diganti dengan nama biner Bibi:

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

Membiarkan Nmenjadi bilangan bulat positif (antara 1 -> 2 ^ 31-1). Untuk setiap karakter dalam representasi heksadesimal N, ganti karakter dengan pasangan biner Bibi yang sesuai (tabel di atas berisi semua pasangan).

Contoh

  • N = 156
  • H= (representasi heksadesimal dari N) -> 9C
  • 9 -> KA, C -> DO

Jadi outputnya adalah KADO.

Input output

Anda akan menerima bilangan bulat 32-bit positif N, yang harus diubah menjadi Bibi-binary.

Anda dapat (kembali, mencetak, dll ...) dalam format apa pun yang nyaman, tetapi pasangan harus terhubung ! Jadi KA DOtidak akan apa-apa, tetapi KADOakan.

Keduanya, huruf kecil dan besar diizinkan.

Aturan

  • Tidak ada celah.
  • Ini kode-golf, jadi kode terpendek menang.

Testcases

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

Spek tampaknya mengatakan bahwa input akan menjadi non-negatif di satu bagian dan positif di bagian lain - dapatkah Anda menjelaskan yang mana yang dimaksudkan?
Sp3000

@ Sp3000 positif dimaksudkan. Saya akan mengeditnya, terima kasih!
Yytsi

Spec Anda masih mengatakan antara 0 -> 2 ^ 31-1 , tetapi 0 tidak positif (dalam bahasa Inggris).
Dennis

@ Dennis saya memperlakukan 0 sebagai positif. Saya akan mengeditnya. Terima kasih untuk menyebutkan!
Yytsi

@ TuukkaX 0 adalah perbedaan antara positif dan non-negatif.
Pasang kembali Monica

Jawaban:


10

05AB1E , 20 18 16 byte

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

Penjelasan

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

Cobalah online!

Disimpan 2 byte berkat Adnan


…Âkdadalah versi terkompresi dari "hbkd":).
Adnan

Juga, saya tidak yakin apakah itu mungkin tetapi Hjuga mengubah angka heksadesimal ke basis 10.
Adnan

11

Python 2, 58 byte

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

Solusi rekursif. Cobalah di Ideone .


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

Saya membatalkan komentar saya. OP diklarifikasi dan input 0 tidak valid.
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:])

Memilih bibi-digit untuk mewakili setiap digit hex berdasarkan pola dalam bibi-digit.


4

Javascript (ES6), 58 53 43 byte

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

Disimpan 10 byte (tidak ada dukungan untuk n = 0 lagi)

Demo

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


Bisakah Anda mempersingkat ini sekarang karena nol tidak lagi menjadi persyaratan?
Neil

3

Pyth, 28 byte

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

Menentukan fungsi y. Algoritma pada dasarnya sama dengan jawaban Python saya .

Penjelasan:

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.

Coba di sini! (Dua karakter tambahan di akhir hanya untuk memanggil fungsi)


3

Jelly , 17 byte

b⁴d4ị"€“BKDH“AEIO

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

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

Ruby, 55 51 byte

Fungsi anonim rekursif:

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

Sebut misalnya dengan f[156]dan kembali"KADO"


3

J, 35 33 byte

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

Menghasilkan tabel nilai biner-biner untuk bilangan bulat [0, 16), kemudian mengonversi input n ke daftar basis 16 digit dan memilih nama biner-biner yang sesuai untuk setiap digit hex.

Disimpan 2 byte berkat @randomra.

Pemakaian

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

Bagian ini menghasilkan array karakter 16 x 2 untuk nama biner-bibi dari setiap digit hex.

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

Penjelasan

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

Termasuk +1 untuk -p

Jalankan dengan nomor di STDIN

bibi.pl <<< 156

bibi.pl:

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

3

PHP, 63 Bytes

kontribusi oleh @Titus Terima kasih

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

72 Bytes juga berfungsi dengan nol

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

76 Bytes Versi alternatif

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

Coba yang ini:for($n=$argv[1];$n;$n>>=2)$r=HBKDOAEI[$n%4+4*$t=!$t].$r;echo$r;
Titus

1
Juga: Anda lupa membuat golf keriting dari versi pertama Anda.
Titus

for($n=$argv[1];$n;$n>>=4)$r=HBKD[$n/4&3].OAEI[$n&3].$r;echo$r;untuk juga 63 byte atau port jawaban Arnauld untuk 61:function f($n){return$n?f($n>>4).HBKD[$n/4&3].OAEI[$n&3]:'';}
Titus

@Titus versi pertama Anda tidak berfungsi dengan benar dengan input 1 atau 16. Bagus, saya belum menyadari bahwa nol karena input tidak lagi diizinkan
Jörg Hülsermann

ya, baru saja perhatikan. itu tidak mencetak Hdi tempat pertama. Ambil yang kedua.
Titus

2

Ruby, 85 83 byte

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

Hanya solusi cepat dan sederhana tanpa menyandikan string.


2

Pyth, 21 byte

sm@*"HBKD""OAEI"djQ16

Program yang mengambil input bilangan bulat dari STDIN dan mencetak hasilnya.

Cobalah online

Bagaimana itu bekerja

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

Ini pada dasarnya memanfaatkan fungsi heksadesimal terintegrasi dan sedikit trik dalam pernyataan while untuk menghemat pada kurung kurawal.


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

Menggunakan beberapa tipu daya tabel pencarian Penggunaan tipe Long adalah untuk mengurangi beberapa byte dibandingkan dengan Integer


2

CJam , 20 byte

qiGb"HBKD""OAEI"m*f=

Cobalah online!(Sebagai rangkaian uji yang dipisahkan dengan linefeed.)

Penjelasan

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

Membutuhkan ⎕IO←0yang default pada banyak sistem.

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

minta (buat benar-benar rata)

(...

, yang diratakan

'HBKD'∘.,'OAEI' tabel concatenation (yaitu semua kombo)

)[ diindeks oleh ...

16⊥⍣¯1 kebalikan dari basis-16 ke basis 10 (yaitu basis-10 ke basis 16) representasi

dari

input numerik

]

TryAPL online!


1

Lua, 196 Bytes

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 menjengkelkan untuk tugas semacam ini, karena tidak per default berisi metode konversi hex atau biner. Sebagian besar daging mengonversinya menjadi basis 4. Setelah itu kami memaksa 0 di belakangnya jika kami perlu menggunakan s=("0"):rep(#s%2), lalu kami menggunakan gsub ganti semua didgets dengan rekan BIBI mereka.


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

Cobalah online!TIO mencakup pembungkus Bash yang mengubah string integer menjadi nilai integer 32-bit yang sebenarnya.

Bagian atas mencetak huruf yang sesuai dengan data biner, setelah bagian bawah mendeteksi bahwa kita telah mencapai data yang menarik (dengan kata lain, kita melewatkan angka nol di depan. Untuk mencetak semua angka nol di depan, hapus baris kedua yang dimulai dengan Adan turun.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.