Chuyển đổi sang Bibi-binary


25

Bibi-binary là một hệ thống số được phát minh bởi Boby Lapointe để thể hiện các số trong các chữ cái mà cách phát âm có vẻ buồn cười.

Nhiệm vụ của bạn là chuyển đổi số thập phân thành Bibi-binary!

Chuyển đổi

Một số được chuyển đổi thành cơ sở 16 (thập lục phân) và mỗi ký tự được thay thế bằng tên nhị phân Bibi của nó:

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

Đặt Nsố nguyên dương (trong khoảng 1 -> 2 ^ 31-1). Đối với mỗi ký tự trong biểu diễn thập lục phân của N, thay thế ký tự bằng cặp nhị phân Bibi (bảng trên có chứa tất cả các cặp).

Thí dụ

  • N = 156
  • H= (đại diện thập lục phân của N) -> 9C
  • 9 -> KA, C -> LÀM

Do đó, đầu ra là KADO.

Đầu ra đầu vào

Bạn sẽ nhận được một số nguyên 32 bit dương N, mà bạn sẽ phải chuyển thành nhị phân Bibi.

Bạn có thể (trả lại, in, v.v.) ở bất kỳ định dạng thuận tiện nào, nhưng các cặp phải được kết nối ! Vì vậy, KA DOsẽ không ổn, nhưng KADOsẽ.

Cả hai, chữ thường và chữ hoa đều được phép.

Quy tắc

  • Không sơ hở.
  • Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng.

Tủ thử

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

Thông số kỹ thuật dường như nói rằng đầu vào sẽ không âm trong một phần và tích cực trong phần khác - bạn có thể vui lòng làm rõ phần nào được dự định không?
Sp3000

@ Sp3000 tích cực được dự định. Tôi sẽ chỉnh sửa nó trong, cảm ơn!
Yytsi

Thông số kỹ thuật của bạn vẫn cho biết trong khoảng 0 -> 2 ^ 31-1 , nhưng 0 không tích cực (bằng tiếng Anh).
Dennis

@Dennis Tôi coi 0 là dương tính. Tôi sẽ chỉnh sửa nó ra. Cảm ơn đã đề cập!
Yytsi

@TuukkaX 0 chính xác là sự phân biệt giữa tích cực và không tiêu cực.
Phục hồi lại

Câu trả lời:


10

05AB1E , 20 18 16 byte

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

Giải trình

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

Hãy thử trực tuyến!

Đã lưu 2 byte nhờ Adnan


…Âkdlà phiên bản nén của "hbkd":).
Ad Nam

Ngoài ra, tôi không chắc là có thể hay không nhưng Hcũng chuyển đổi số thập lục phân thành số 10.
Adnan

11

Python 2, 58 byte

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

Một giải pháp đệ quy. Hãy thử nó trên Ideone .


2
f=lambda n:n*'_'and f(n/16)+"HBKD"[n/4%4]+"OAEI"[n%4]tiết kiệm 5 byte.
Dennis

Tôi đã xóa bỏ nhận xét của tôi. OP làm rõ và đầu vào 0 không hợp lệ.
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:])

Chọn chữ số bibi để biểu thị mỗi chữ số hex dựa trên các mẫu trong chữ số bibi.


4

Javascript (ES6), 58 53 43 byte

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

Đã lưu 10 byte (không hỗ trợ cho n = 0 nữa)

Bản giới thiệu

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


Bạn có thể rút ngắn điều này bây giờ rằng số 0 không còn là một yêu cầu?
Neil

3

Bình thường, 28 byte

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

Xác định một hàm y. Về cơ bản thuật toán tương tự như câu trả lời Python của tôi .

Giải trình:

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.

Hãy thử nó ở đây! (Hai ký tự thêm ở cuối chỉ là để gọi hàm)



3

Ruby, 55 51 byte

Một hàm ẩn danh đệ quy:

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

Gọi nó là ví dụ với f[156]và nó trả về"KADO"


3

J, 35 33 byte

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

Tạo bảng giá trị bibi-binary cho số nguyên [0, 16), sau đó chuyển đổi đầu vào n thành danh sách 16 chữ số cơ bản và chọn tên bibi-binary tương ứng cho mỗi chữ số hex.

Đã lưu 2 byte nhờ @randomra.

Sử dụng

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

Phần này tạo ra một mảng 16 x 2 ký tự cho tên nhị phân bibi của mỗi chữ số hex.

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

Giải trình

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

Bao gồm +1 cho -p

Chạy với số trên 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

đóng góp của @Titus Cảm ơn bạn

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

72 Byte cũng hoạt động với số không

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

Phiên bản thay thế 76 Byte

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

Hãy thử cái này:for($n=$argv[1];$n;$n>>=2)$r=HBKDOAEI[$n%4+4*$t=!$t].$r;echo$r;
Tít

1
Ngoài ra: Bạn đã quên chơi golf xoăn từ phiên bản đầu tiên của bạn.
Tít

for($n=$argv[1];$n;$n>>=4)$r=HBKD[$n/4&3].OAEI[$n&3].$r;echo$r;cũng cho 63 byte hoặc một cổng câu trả lời của Arnauld cho 61:function f($n){return$n?f($n>>4).HBKD[$n/4&3].OAEI[$n&3]:'';}
Tít

@Titus phiên bản đầu tiên của bạn hoạt động không chính xác bởi đầu vào 1 hoặc 16. Tôi không nhận ra rằng số 0 vì đầu vào không còn được cho phép
Jörg Hülsermann

yup, chỉ cần chú ý. Nó không in Hở vị trí đầu tiên. Lấy cái thứ hai
Tít

2

Ruby, 85 83 byte

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

Chỉ là một giải pháp nhanh chóng và đơn giản mà không cần mã hóa chuỗi.


2

Bình thường, 21 byte

sm@*"HBKD""OAEI"djQ16

Một chương trình lấy đầu vào của một số nguyên từ STDIN và in kết quả.

Dùng thử trực tuyến

Làm thế nào nó hoạt động

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

Điều này về cơ bản tận dụng các hàm thập lục phân tích hợp và một mẹo nhỏ trong câu lệnh while để lưu vào dấu ngoặc nhọn.


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

Sử dụng một số thủ thuật bảng tra cứu Cách sử dụng Loại dài là để loại bỏ một vài byte so với Integer


2

CJam , 20 byte

qiGb"HBKD""OAEI"m*f=

Hãy thử trực tuyến!(Là một bộ thử nghiệm được phân tách theo dòng.)

Giải trình

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

APL Dyalog , 19 byte

Yêu cầu ⎕IO←0mặc định trên nhiều hệ thống.

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

tranh thủ (làm cho hoàn toàn bằng phẳng)

(...

, cái rốn

'HBKD'∘.,'OAEI' bảng nối (tức là tất cả các combo)

)[ được lập chỉ mục bởi ...

16⊥⍣¯1 nghịch đảo của đại diện cơ sở 16 đến cơ sở 10 (tức là cơ sở 10 đến cơ sở 16)

của

đầu vào số

]

Dùng thử trực tuyến!


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 gây khó chịu cho loại nhiệm vụ này, vì nó không theo mặc định chứa phương thức chuyển đổi hex hoặc nhị phân. Hầu hết các xác thịt đang chuyển đổi nó thành cơ sở 4. Sau đó, chúng tôi buộc 0 sau nó nếu chúng tôi cần sử dụng s=("0"):rep(#s%2), sau đó chúng tôi sử dụng gsub thay thế tất cả các điều khoản bằng với đối tác BIBI của họ.


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

Hãy thử trực tuyến!TIO bao gồm một trình bao bọc Bash chuyển đổi một chuỗi số nguyên thành một giá trị nguyên 32 bit thực tế.

Nửa trên in ra các chữ cái tương ứng với dữ liệu nhị phân, khi nửa dưới phát hiện ra rằng chúng tôi đã đạt được dữ liệu thú vị (nói cách khác, chúng tôi bỏ qua các số 0 đứng đầu. Để in tất cả các số 0 đứng đầu, hãy xóa dòng thứ hai bắt đầu bằng Avà xuống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.