비비 이진으로 변환


25

Bibi-binary는 발음이 웃겨 보이는 문자로 숫자를 나타 내기 위해 Boby Lapointe 가 발명 한 숫자 시스템 입니다.

당신의 임무는 십진수를 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

하자 N양의 정수 (1 사이 -> 2 ^ 31-1). 의 16 진수 표현에서 모든 문자에 대해 문자를 NBibi 이진 쌍 (위의 표에 모든 쌍이 포함됨)으로 바꿉니다.

  • N = 156
  • H= (16 진수 표현 N)-> 9C
  • 9-> KA, C-> DO

따라서 출력은 KADO입니다.

입출력

양의 32 비트 정수를 받으면 NBibi-binary로 바꿔야합니다.

편리한 형식으로 (반환, 인쇄 등) 할 수 있지만 쌍을 연결해야합니다 ! 따라서 KA DO괜찮지는 않지만 KADO그렇게 할 것입니다.

소문자와 대문자 모두 허용됩니다.

규칙

  • 허점이 없습니다.
  • 이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.

테스트 케이스

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

스펙은 입력이 한 섹션에서 음이 아니고 다른 섹션에서 긍정적이라고 말할 것 같습니다.
Sp3000

@ Sp3000 긍정적입니다. 고마워요!
Yytsi

귀하의 사양은 여전히 0-> 2 ^ 31-1 사이 이지만 0 은 양수 (영어)입니다.
Dennis

@Dennis 나는 0을 긍정적으로 취급했습니다. 편집하겠습니다. 언급 해 주셔서 감사합니다!
Yytsi

@TuukkaX 0 은 정확히 양수와 음수를 구별합니다.
Reinstate Monica

답변:


10

05AB1E , 20 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":) 의 압축 버전입니다 .
Adnan

또한 가능한지 확실하지 않지만 H16 진수를 10 진수로 변환합니다.
Adnan

11

파이썬 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 바이트를 절약합니다.
Dennis

내 의견을 삭제하지 않았습니다. OP가 명확하고 입력 0 이 유효하지 않습니다.
Dennis

4

파이썬 2, 81 76 바이트

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

이진수를 선택하여 이진수의 패턴을 기반으로 각 16 진수를 나타냅니다.


4

자바 스크립트 (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


더 이상 제로가 더 이상 필요하지 않다는 것을 줄일 수 있습니까?
Neil

3

Pyth, 28 바이트

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

함수를 정의합니다 y. 기본적으로 내 파이썬 답변 과 동일한 알고리즘 입니다.

설명:

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

루비, 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)에 대한 이진 이진 값 표를 생성 한 다음 입력을 변환합니다. n 을 기본 16 자리 목록으로 각 16 진수의 해당 이진 이진 이름을 선택합니다.

@randomra 덕분에 2 바이트를 절약했습니다.

용법

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

이 부분은 각 16 진수의 이진 이름에 대해 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

펄, 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 바이트는 0으로도 작동

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 바이트 또는 61에 대한 Arnauld의 답변 포트 :function f($n){return$n?f($n>>4).HBKD[$n/4&3].OAEI[$n&3]:'';}
Titus

입력이 허용되지 않는 이상으로 @Titus 첫 번째 버전은 제로 실현하지 않은 1 또는 16 니스 I의 입력에 의해 제대로하지 작동
요 르그 Hülsermann에게

p, 방금 알아 차렸다. H처음 에는 인쇄하지 않습니다 . 두 번째를 가져 가라.
Titus

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

자바, 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

루아는 기본적으로 16 진수 또는 이진 변환 방법을 포함하지 않기 때문에 이런 종류의 작업에 짜증이납니다. 대부분의 육체는 이것을 기본 4로 변환하고 있습니다. s=("0"):rep(#s%2)그런 다음을 사용해야하는 경우 0을 강제로 지정합니다 . 그런 다음 gsub를 사용하여 모든 가젯을 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에는 정수 문자열을 실제 32 비트 정수 값으로 변환하는 Bash 래퍼가 포함되어 있습니다.

상단 절반은 이진 데이터에 해당하는 문자를 인쇄합니다. 하단 절반이 흥미로운 데이터에 도달했음을 감지하면 (즉, 우리는 선행 0을 건너 뜁니다. 모든 선행 0을 인쇄하려면로 시작하는 두 번째 줄을 제거하십시오. A아래로.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.