แปลงเป็น Bibi-binary


25

Bibi-binary เป็นระบบตัวเลขที่คิดค้นโดยBoby Lapointeเพื่อเป็นตัวแทนของตัวเลขในตัวอักษรซึ่งการออกเสียงดูเหมือนเป็นเรื่องตลก

งานของคุณคือการแปลงตัวเลขทศนิยมให้เป็น Bibi-binary!

การแปลง

ตัวเลขจะถูกแปลงเป็นฐาน 16 (เลขฐานสิบหก) และอักขระแต่ละตัวจะถูกแทนที่ด้วยชื่อ Bibi-binary:

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 -> DO

ดังนั้นผลลัพธ์คือ KADO

อินพุตและเอาต์พุต

คุณจะได้รับจำนวนเต็มบวก 32 บิตNซึ่งคุณจะต้องเปลี่ยนเป็น Bibi-binary

คุณสามารถ (กลับพิมพ์ ฯลฯ ... ) ในรูปแบบที่สะดวกแต่ต้องเชื่อมต่อ ! ดังนั้นKA DOจะไม่เป็นไร แต่KADOจะ

ทั้งตัวพิมพ์เล็กและพิมพ์ใหญ่จะได้รับอนุญาต

กฎระเบียบ

  • ไม่มีช่องโหว่
  • นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ

Testcases

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

ข้อมูลจำเพาะดูเหมือนจะบอกว่าอินพุตจะไม่เป็นลบในส่วนใดส่วนหนึ่งและเป็นบวกในอีกส่วนหนึ่ง - คุณช่วยอธิบายได้อย่างชัดเจนว่าควรใช้อันใด
Sp3000

@ Sp3000 มีจุดประสงค์ในเชิงบวก ฉันจะแก้ไขสิ่งนั้นในขอบคุณ!
Yytsi

สเป็คของคุณยังพูดว่าระหว่าง 0 -> 2 ^ 31-1แต่0ไม่ได้เป็นบวก (เป็นภาษาอังกฤษ)
เดนนิส

@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

ลองออนไลน์!

บันทึก 2 ไบต์ขอบคุณAdnan


…Âkdเป็นรุ่นบีบอัดของ"hbkd":)
Adnan

นอกจากนี้ฉันไม่แน่ใจว่ามันเป็นไปได้ แต่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 ไบต์
Dennis

ฉันยกเลิกการลบความคิดเห็นของฉัน 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-ดิจิตเพื่อแสดงแต่ละเลขฐานสิบหกโดยยึดตามรูปแบบใน bibi-ดิจิต


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


คุณสามารถย่อให้สั้นลงได้หรือไม่ในตอนนี้ที่ศูนย์ไม่มีข้อกำหนดอีกต่อไป
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

เยลลี่ขนาด 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]

สร้างตารางของค่า bibi-binary สำหรับจำนวนเต็ม [0, 16) จากนั้นแปลงอินพุตnเป็นรายการฐาน 16 หลักและเลือกชื่อ bibi-binary ที่สอดคล้องกันสำหรับแต่ละเลขฐานสิบหก

บันทึก 2 ไบต์ขอบคุณ @randomra

การใช้

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

ส่วนนี้สร้างอาร์เรย์ของอักขระ 16 x 2 สำหรับชื่อ bibi-binary ของแต่ละหลักฐานสิบหก

   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

PHP, 63 ไบต์

ผลงานโดย @Titus Thank You

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

72 Bytes ก็ใช้งานได้เช่นกัน

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 ไบต์หรือพอร์ตของ Arnauld's ตอบสำหรับ 61:function f($n){return$n?f($n>>4).HBKD[$n/4&3].OAEI[$n&3]:'';}
ติตัส

@Titus รุ่นแรกของคุณทำงานได้อย่างถูกต้องโดยการป้อนข้อมูลของ 1 หรือ 16 ดีฉันต้องมีไม่ทราบว่าศูนย์เป็น input จะไม่ได้รับอนุญาต
JörgHülsermann

ใช่เพิ่งสังเกตเห็น มันไม่ได้พิมพ์Hในสถานที่แรก เอาอันที่สอง
ติตัส

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

การใช้กลอุบายตารางค้นหาบางประเภทการใช้งานของชนิดยาวคือการโกนไม่กี่ไบต์เมื่อเทียบกับจำนวนเต็ม


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⊢⎕]

เกณฑ์ (ทำแบนอย่างสมบูรณ์)

(...

, raveled

'HBKD'∘.,'OAEI' ตารางการต่อข้อมูล (เช่นคอมโบทั้งหมด)

)[ จัดทำดัชนีโดย ...

16⊥⍣¯1 การผกผันของฐาน -16 ถึงฐาน 10 (เช่นฐาน -10 ถึงฐาน 16) แทน

ของ

อินพุตตัวเลข

]

ลองใช้ออนไลน์!


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 หลังจากนั้นเราบังคับให้มี 0 อยู่ข้างหลังถ้าเราต้องการใช้s=("0"):rep(#s%2)จากนั้นเราใช้ 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 รวม Bash wrapper ที่แปลงสตริงจำนวนเต็มเป็นค่าจำนวนเต็ม 32 บิตจริง

ครึ่งบนจะพิมพ์ตัวอักษรที่สอดคล้องกับข้อมูลไบนารี่เมื่อครึ่งล่างตรวจพบว่าเราได้ข้อมูลที่น่าสนใจ (กล่าวคือเราข้ามเลขศูนย์นำหน้า) หากต้องการพิมพ์เลขศูนย์นำหน้าทั้งหมดให้ลบบรรทัดที่สองที่ขึ้นต้นด้วยAและลง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.