ビビバイナリに変換


25

Bibi-binaryは、発音がおかしいと思われる文字で数字を表すために、Boby Lapointeによって発明された数値システムです。

あなたの仕事は、10進数をBibiバイナリに変換することです!

変換

数値は16進数(16進数)に変換され、各文字はその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

Let Nは正の整数(1-> 2 ^ 31-1)です。の16進表現のすべての文字についてN、対応するBibiバイナリペアで文字を置き換えます(上の表にはすべてのペアが含まれています)。

  • N = 156
  • H=(の16進数表現N)-> 9C
  • 9-> KA、C-> DO

したがって、出力はKADOです。

入出力

正の32ビット整数を受け取りNます。これは、Bibi-binaryに変換する必要があります。

任意の便利な形式で(返品、印刷など)できますが、ペアを接続する必要があります だからKA DO大丈夫ではないKADOだろうが。

小文字と大文字の両方が許可されます。

ルール

  • 抜け穴はありません。
  • これはコードゴルフなので、最短のコードが優先されます。

テストケース

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

仕様では、入力はあるセクションでは負ではなく、別のセクションでは正になると言われているようです。どのセクションが意図されているか明確にしてください。
Sp3000

@ Sp3000ポジティブが意図されています。編集します、ありがとう!
Yytsi

あなたのスペックはまだ0-> 2 ^ 31-1の間を言っていますが、0は正ではありません(英語)。
デニス

@Dennis私は0を正として扱いました。編集します。言及してくれてありがとう!
Yytsi

@TuukkaX 0は、正と非負の区別です。
モニカの復活

回答:


10

05AB1E20 18 16バイト

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

説明

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

オンラインでお試しください!

Adnanのおかげで2バイト節約


…Âkd"hbkd":)の圧縮バージョンです。
アドナン

また、それが可能かどうかはわかりませんHが、16進数を10進数に変換します
。– Adnan

11

Python 2、58バイト

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

再帰的なソリューション。Ideoneで試してみてください


2
f=lambda n:n*'_'and f(n/16)+"HBKD"[n/4%4]+"OAEI"[n%4]5バイト節約します。
デニス

コメントの削除を取り消しました。OPが明確になり、入力0は無効です。
デニス

4

Python 2、81 76バイト

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

bibi-digitsのパターンに基づいて各16進数を表すbibi-digitを選択します。


4

Javascript(ES6)、58 53 43バイト

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

10バイトを保存(n = 0のサポートはもうありません)

デモ

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


ゼロはもはや要件ではないので、これを短くできますか?
ニール

3

Pyth、28バイト

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

関数を定義しますy。基本的に私のPythonの答えと同じアルゴリズム。

説明:

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.

ここで試してみてください!(最後の余分な2文字は、関数を呼び出すためだけです)



3

Ruby、55 51バイト

再帰的な匿名関数:

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

たとえば、それを呼び出してf[156]、それが返されます"KADO"


3

J、35 33バイト

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

整数[0、16)のbibi-binary値のテーブルを生成し、入力nを基数16桁のリストに変換し、各16進数字に対応するbibi-binary名を選択します。

@randomraのおかげで2バイト節約されました。

使用法

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

この部分は、各16進数字のbibi-binary名に対して16 x 2の文字配列を生成します。

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

説明

,/'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バイト

+1を含む -p

STDINの番号で実行

bibi.pl <<< 156

bibi.pl

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

3

PHP、63バイト

@Titus Thank Youによる貢献

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

72バイトはゼロでも動作します

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

76バイトの代替バージョン

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

これを試してくださいfor($n=$argv[1];$n;$n>>=2)$r=HBKDOAEI[$n%4+4*$t=!$t].$r;echo$r;
タイタス

1
また、最初のバージョンからカーリーをゴルフするのを忘れました。
タイタス

for($n=$argv[1];$n;$n>>=4)$r=HBKD[$n/4&3].OAEI[$n&3].$r;echo$r;63バイトまたは61のArnauldの回答のポート:function f($n){return$n?f($n>>4).HBKD[$n/4&3].OAEI[$n&3]:'';}
タイタス

あなたの最初のバージョンは1または16ニースIの入力によって正しくない作品@Titus入力はもはや許されないようにゼロということを実現していない
イェルクHülsermann

うん、ちょうど気づいた。Hそもそも印刷しません。2番目のものを取ります。
タイタス

2

ルビー、85 83バイト

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

文字列をエンコードせずに迅速かつ簡単なソリューション。


2

Pyth、21バイト

sm@*"HBKD""OAEI"djQ16

STDINから整数の入力を取得し、結果を出力するプログラム。

オンラインで試す

使い方

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バイト

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

これは基本的に、統合された16進関数とwhileステートメントの小さなトリックを活用して、中括弧を節約します。


2

Java、224バイト

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

いくつかのルックアップテーブルトリックを使用するLong型の使用法は、Integerと比較して数バイト削る


2

CJam、20バイト

qiGb"HBKD""OAEI"m*f=

オンラインでお試しください!(改行区切りのテストスイートとして。)

説明

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 バイト

⎕IO←0多くのシステムでデフォルトである必要があります。

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

参加(完全にフラットにする)

(...

, ほつれた

'HBKD'∘.,'OAEI' 連結テーブル(つまり、すべてのコンボ)

)[ インデックス作成...

16⊥⍣¯1 基数16から基数10(つまり基数10から基数16)の逆表現

数値入力

]

TryAPLオンライン!


1

ルア、196バイト

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にはこの種のタスクが煩わしく、デフォルトでは16進数またはバイナリ変換メソッドが含まれていません。ほとんどの肉はそれを基数4に変換しています。その後、を使用する必要がある場合は、その後ろに0を強制しますs=("0"):rep(#s%2)


0

チップ、174バイト

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

オンラインでお試しください!TIOには、整数文字列を実際の32ビット整数値に変換するBashラッパーが含まれています。

下半分が興味のあるデータに到達したことを検出すると、上半分はバイナリデータに対応する文字を出力します(つまり、先頭のゼロをスキップします。先頭のゼロをすべて印刷するには、次で始まる2行目を削除します。Aダウン。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.