Перетворити на Бібі-бінарний


25

Бібі-бінарний - це числова система, придумана Боббі Лапоентом , щоб представити цифри в літерах, вимова яких здається смішною.

Ваше завдання - перетворити десяткові числа в бібі-двійкові!

Перетворення

Число перетворюється в базу 16 (шістнадцятковий), і кожен символ замінюється на його бібі-бінарне ім'я:

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замініть його символом відповідно до бібі-бінарної пари (таблиця вище містить усі пари).

Приклад

  • N = 156
  • H= (шістнадцяткове представлення N) -> 9С
  • 9 -> КА, С -> ДО

Таким чином, вихід KADO.

Введення-виведення

Ви отримаєте додатне 32-бітове ціле число N, яке вам доведеться перетворити на Бібі-бінарне.

Ви можете (повернути, надрукувати тощо) у будь-якому зручному форматі, але пари повинні бути підключені ! Так KA DOби не було гаразд, але KADOбуло б.

Допускаються обидва, малі та великі літери .

Правила

  • Без лазівки
  • Це код-гольф, тому виграє найкоротший код.

Тестові шафи

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

Спеціалізація, схоже, говорить про те, що вхід буде невід'ємним в одному розділі, а позитивним - в іншому.
Sp3000

@ Sp3000 позитивний призначений. Я відредагую це, спасибі!
Yytsi

Ваша специфікація все ще говорить між 0 -> 2 ^ 31-1 , але 0 не є позитивною (англійською).
Денніс

@Денніс я поставив 0 як позитивний. Я відредагую це. Дякую за згадку!
Yytsi

@TuukkaX 0 - це саме відмінність позитивного від негативного.
Відновіть Моніку

Відповіді:


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 байти завдяки Аднану


…Âkdце стисла версія "hbkd":).
Аднан

Також я не впевнений, чи це можливо, але Hтакож перетворює шістнадцятковий номер у базу 10.
Аднан


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

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), потім перетворює вхід n у список базових 16 цифр і вибирає відповідне бібі-бінарне ім'я для кожної шістнадцяткової цифри.

Збережено 2 байти завдяки @randomra.

Використання

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

Ця частина генерує масив символів 16 х 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;
Тит

1
Також: Ви забули прокатати кучері з першої версії.
Тіт

for($n=$argv[1];$n;$n>>=4)$r=HBKD[$n/4&3].OAEI[$n&3].$r;echo$r;також 63 байти чи відповідь порту Арнальда за 61:function f($n){return$n?f($n>>4).HBKD[$n/4&3].OAEI[$n&3]:'';}
Тіт

@Titus, ваша перша версія працює неправильно за допомогою введення 1 або 16. Приємно, я не усвідомлював, що нуль як введення більше не дозволено
Jörg Hülsermann

так, щойно помітили. це не друкує Hв першу чергу. Візьміть другу.
Тіт

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

Це в основному використовує інтегровані шістнадцяткові функції та трохи хитрощі в операторі 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

Діалог APL , 19 байт

Потрібно, ⎕IO←0що для багатьох систем за замовчуванням.

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

заручитися (зробити повністю плоским)

(...

, захоплений

'HBKD'∘.,'OAEI' таблиця конкатенації (тобто всі комбінації)

)[ індексується ...

16⊥⍣¯1 зворотне подання бази-16 до бази 10 (тобто бази-10 до бази 16)

з

числовий вхід

]

СпробуйтеAPL онлайн!


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 дратівливий для такого роду завдань, оскільки він за замовчуванням не містить шістнадцятковий або двійковий метод перетворення. Більша частина плоті перетворює її на базу 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, яка перетворює цілий рядок у фактичне 32-бітове ціле число.

У верхній половині друкуються літери, що відповідають двійковим даним, як тільки нижня половина виявить, що ми дійшли до цікавих даних (іншими словами, ми пропускаємо провідні нулі. Щоб надрукувати всі провідні нулі, видаліть другий рядок, що починається з Aі вниз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.