转换为Bibi-binary


25

Bibi-binary是由Boby Lapointe发明的一种数字系统,用于以字母表示数字,发音听起来很有趣。

您的任务是将十进制数转换为Bibi-binary!

转换次数

一个数字将转换为基数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

N是一个正整数(1之间- > 2 ^ 31-1)。对于的十六进制表示形式中的每个字符,将N其替换为其相应的Bibi-binary对(上表包含所有对)。

  • N = 156
  • H=(的十六进制表示N)-> 9C
  • 9-> KA,C->做

因此,输出为KADO。

输入输出

您将收到一个正的32位整数N,您必须将其转换为Bibi-binary。

您可以(方便退回,打印等)任何方便的格式进行操作,但是必须成对连接!所以KA DO不会,但是KADO会。

无论,小写和大写是允许的。

规则

  • 没有漏洞。
  • 这是代码高尔夫球,因此最短的代码获胜。

测试用例

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

规范似乎说输入在一个部分中将是非负的,而在另一部分中将是正的-您能否阐明意图是哪一个?
Sp3000 '16

@ Sp3000阳性是预期的。我将对其进行编辑,谢谢!
Yytsi'9

您的规范仍然说0-> 2 ^ 31-1之间,但0不是正数(英语)。
丹尼斯

@丹尼斯我将0视为肯定。我将其编辑掉。感谢您的提及!
Yytsi'9

@TuukkaX 0恰好是正负之间的区别。
恢复莫妮卡

Answers:


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将十六进制数转换为
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:])

根据二进制数字中的模式选择二进制数字来表示每个十六进制数字。


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.

在这里尝试!(最后两个多余的字符只是用来调用函数)


3

果冻,17 个字节

b⁴d4ị"€“BKDH“AEIO

在线尝试!验证所有测试用例

怎么运行的

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字节

递归匿名函数:

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为基数的列表,并为每个十六进制数字选择相应的bibi-binary名称。

感谢@randomra,节省了2个字节。

用法

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

此部分为每个十六进制数字的二进制二进制名称生成一个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的贡献谢谢

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

1
另外:您忘记了第一个版本的卷发。
泰特斯(Titus)

for($n=$argv[1];$n;$n>>=4)$r=HBKD[$n/4&3].OAEI[$n&3].$r;echo$r;对于63个字节还是Arnauld的端口61:function f($n){return$n?f($n>>4).HBKD[$n/4&3].OAEI[$n&3]:'';}
Titus

@Titus你的第一个版本的作品没有正确地1或16尼斯我的输入都没有意识到,零输入不再允许
约尔格Hülsermann

是的,只是注意到了。它不打印第H一位。拿第二个。
泰特斯(Titus)2016年

2

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

这基本上是利用集成的十六进制函数和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));}}}

使用一些查找表的技巧,与Integer相比,Long类型的用法可以节省几个字节


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为底)的表示形式

数字输入

]

在线尝试APL!


1

Lua,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讨厌这种任务,因为它默认情况下不包含十六进制或二进制转换方法。大多数果肉将其转换为基数4。s=("0"):rep(#s%2)然后,如果需要使用,则将其强制为0 ,然后使用gsub将所有的didget替换为其BIBI对应物。


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包括一个Bash包装器,可将整数字符串转换为实际的32位整数值。

一旦下半部分检测到我们已经到达感兴趣的数据(即,我们跳过前导零。则上半部分将打印出与二进制数据相对应的字母)。要打印所有前导零,请删除以A和向下。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.