Bibi-binary'ye dönüştür


25

Bibi-binary, sayıları komik gibi gösteren harflerle sayıları temsil etmek için Boby Lapointe tarafından icat edilmiş sayısal bir sistemdir .

Senin görevin ondalık sayıları Bibi-binary'e çevirmek!

dönüştürme

Sayı 16 tabanına (onaltılık) dönüştürülür ve her karakter Bibi ikili adıyla değiştirilir:

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

Izin Npozitif bir tam sayı olmak (1 arasında -> 2 ^ 31-1). Onaltılı gösterimindeki her karakter için N, karakteri Bibi ikili çiftine göre değiştirin (yukarıdaki tablo tüm çiftleri içerir).

Örnek

  • N = 156
  • H= (onaltılı gösterimi N) -> 9C
  • 9 -> KA, C -> DO

Böylece çıkış KADO'dur.

Giriş çıkış

NBibi-binary'e dönüştürmeniz gereken pozitif bir 32-bit tam sayı alacaksınız .

Herhangi bir uygun formatta (iade, baskı vb.) Olabilir, ancak çiftlerin bağlanması gerekir ! Yani iyi KA DOolmaz, ama KADOolur.

Hem küçük hem de büyük harflere izin verilir.

kurallar

  • Boşluk yok.
  • Bu kod golf, yani en kısa kod kazanır.

testcases

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

Teknik özellik, girişin bir bölümde negatif olmayacağını ve diğerinde pozitif olacağını söylüyor gibi görünüyor - hangisinin amaçlandığını netleştirir misiniz?
Sp3000

@ Sp3000 pozitif amaçlanmıştır. Bunu düzenleyeceğim, teşekkürler!
Yytsi

Spesifikasyonunuz hala 0 -> 2 ^ 31-1 arasında diyor ancak 0 pozitif değil (İngilizce).
Dennis,

@Dennis Ben 0 pozitif olarak tedavi. Bunu düzenleyeceğim. Bahsettiğin için teşekkürler!
Yytsi 3'16

@TuukkaX 0 kesinlikle pozitif ile negatif olmayan arasındaki ayrımdır.
Monica'yı

Yanıtlar:


10

05AB1E , 20 18 16 bayt

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

açıklama

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

Çevrimiçi deneyin!

Adnan sayesinde 2 bayt kaydedildi


…Âkdsıkıştırılmış bir versiyonu "hbkd":).
Adnan

Ayrıca, mümkün olup olmadığından emin değilim ama Honaltılık bir sayıyı da 10 tabanına dönüştürür.
Adnan

11

Python 2, 58 bayt

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

Özyinelemeli bir çözüm. Ideone'da dene .


2
f=lambda n:n*'_'and f(n/16)+"HBKD"[n/4%4]+"OAEI"[n%4]5 bayt kaydeder.
Dennis,

Yorumumu geri aldım. OP netleştirildi ve 0 girişi geçersiz.
Dennis,

4

Python 2, 81 76 bayt

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

Bibi basamaktaki kalıplara göre her onaltılık basamağı temsil etmek için bibi basamağını seçer.


4

Javascript (ES6), 58 53 43 bayt

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

10 bayt kaydedildi (artık n = 0 için destek yok)

gösteri

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


Bunu şimdi kısaltabilir misiniz? Sıfır artık bir gereklilik değil mi?
Neil

3

Pyth, 28 bayt

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

Bir fonksiyon tanımlar y. Temelde Python cevabımla aynı algoritma .

Açıklama:

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.

Burada dene! (Sonunda kalan iki karakter sadece fonksiyonu çağırmak içindir)


3

Jöle , 17 bayt

b⁴d4ị"€“BKDH“AEIO

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

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 bayt

Özyinelemeli anonim bir işlev:

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

Örneğin ile ara f[156]ve döner"KADO"


3

J, 35 33 bayt

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

Tamsayılar [0, 16) için bibi-ikili değer tablosunu oluşturur, daha sonra n girdisini taban 16 hane listesine dönüştürür ve her onaltılık hane için karşılık gelen bibi-ikili adını seçer.

@Randomra sayesinde 2 bayt kaydedildi.

kullanım

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

Bu bölüm, her onaltılık hanenin bibi-ikili adı için 16 x 2 karakter dizisi oluşturur.

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

açıklama

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

İçin +1 içerir -p

STDIN'deki sayı ile koş

bibi.pl <<< 156

bibi.pl:

#!/usr/bin/perl -p
1while$\=(<{H,B,K,D}{O,A,E,I}>)[$_%16].$\,$_>>=4}{

3

PHP, 63 Bayt

katkı @Titus Thank You

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

72 Bayt sıfırla da çalışıyor

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

76 Bayt alternatif sürüm

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

Bunu deneyin:for($n=$argv[1];$n;$n>>=2)$r=HBKDOAEI[$n%4+4*$t=!$t].$r;echo$r;
Titus

1
Ayrıca: Kıvırcıkları golfe atmayı ilk versiyonundan unuttun.
Titus,

for($n=$argv[1];$n;$n>>=4)$r=HBKD[$n/4&3].OAEI[$n&3].$r;echo$r;Ayrıca 63 byte veya Arnauld’un 61 cevabına ait bir bağlantı noktası için:function f($n){return$n?f($n>>4).HBKD[$n/4&3].OAEI[$n&3]:'';}
Titus

Girişe izin verilmiyor artık olarak @Titus ilk sürüm sıfır olduğunu fark değil 1 veya 16. Güzel I girdi tarafından doğru değil çalışır
Jörg Hülsermann

evet, farkettim. Hilk etapta yazdırmaz . İkincisini al.
Titus,

2

Ruby, 85 83 bayt

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

Dize kodlamadan sadece hızlı ve basit bir çözüm.


2

Pyth, 21 bayt

sm@*"HBKD""OAEI"djQ16

STDIN'den bir tamsayı girişi alan ve sonucu basan bir program.

Çevrimiçi deneyin

Nasıl çalışır

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 bayt

$a=HBKDOAEI;$h=dechex($argv[1]);while($h{$i}!=''|$c=hexdec($h{$i++}))echo$a{$c/4}.$a{4+$c%4};

Bu temelde, onaltılık işlevlerden ve kıvrımlı parantezlerden tasarruf etmek için while ifadesindeki küçük bir numaradan yararlanır.


2

Java, 224 bayt

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

Bazı arama tablo hileler kullanarak Uzun tip kullanımı Integer ile karşılaştırıldığında birkaç byte tıraş oldu


2

CJam , 20 bayt

qiGb"HBKD""OAEI"m*f=

Çevrimiçi deneyin! (Satır ayrılmış bir test takımı olarak.)

açıklama

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 bayt

⎕IO←0Birçok sistemde varsayılan olanı gerektirir .

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

listeleme (tamamen düz hale getirin)

(...

, dağınık

'HBKD'∘.,'OAEI' birleştirme tablosu (yani tüm kombinasyonlar)

)[ Dizine Göre ...

16⊥⍣¯1 taban-16'nın taban 10'un tersi (yani taban-10 ila taban 16) gösterimi

arasında

sayısal giriş

]

TryAPL çevrimiçi!


1

Lua, 196 Bayt

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, bu tür bir görev için can sıkıcıdır, çünkü varsayılan olarak altıgen veya ikili bir dönüştürme yöntemi içermez. Etin çoğu onu 4 seviyesine dönüştürüyor. Bundan sonra, kullanmamız gerekiyorsa arkasını 0 s=("0"):rep(#s%2)zorladığımızda, gsub'u kullanarak tüm nesneleri BIBI mevkidaşlarıyla değiştiriyoruz.


0

Çip , 174 bayt

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

Çevrimiçi deneyin! TIO, bir tamsayı dizesini gerçek bir 32 bit tamsayı değerine dönüştüren bir Bash sarmalayıcısı içerir.

Üst yarı, ikili verilere karşılık gelen harfleri yazdırır, alt yarı ise ilginç verilere ulaştığımızı tespit ettiğinde (diğer bir deyişle, baştaki sıfırları atlarız. Baştaki tüm sıfırları yazdırmak için, başındaki ikinci satırı kaldırın. Ave aşağı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.