Mari kita bermain decoder BIBABOBU


53

Ketika saya bepergian di masa depan, saya melihat permainan lucu di antara anak-anak sekitar 2275. Ketika mereka tidak ingin orang tua mereka yang hebat-hebat-hebat-besar memahami apa yang mereka katakan, mereka menggunakan bahasa BIBABOBU . Jelas, saya tidak dapat memahami apa pun dengan otak era pra-cyborg saya dan saya merasa (atau secara teknis: saya akan merasa ) benar-benar konyol. Jadi, saya perlu dekoder untuk kunjungan berikutnya.

BIBABOBU?

Meskipun sudah lama tidak digunakan, ASCII masih umum digunakan dalam budaya pop 2275 dan bahasa ini didasarkan padanya.

String dikodekan BIBABOBU seperti itu:

  • Ubah semua karakter menjadi kode ASCII mereka.
  • Ambil representasi heksadesimal 2 digit dari masing-masing kode dan konversikan menggunakan tabel berikut:

    0: BI  4: BIDI  8: BADI  C: BODI
    1: BA  5: BIDA  9: BADA  D: BODA
    2: BO  6: BIDO  A: BADO  E: BODO
    3: BU  7: BIDU  B: BADU  F: BODU
    

Contoh

"Hello!" → 48 65 6C 6C 6F 21 → "BIDIBADI BIDOBIDA BIDOBODI BIDOBODI BIDOBODU BOBA"

Namun, input yang sesuai akan diberikan tanpa ruang untuk meniru intonasi monoton yang digunakan anak-anak untuk membuat ini lebih sulit untuk dipahami tanpa implan:

"BIDIBADIBIDOBIDABIDOBODIBIDOBODIBIDOBODUBOBA"

Klarifikasi dan aturan

  • Ingat bahwa saya memerlukan dekoder , bukan encoder.
  • Karakter yang didekodekan dijamin berada dalam kisaran [32 ... 126] .
  • Input dijamin mengandung en digit jumlah heksadesimal enkode BIBABOBU.
  • Anda dapat mengambil input dalam huruf besar atau kecil. Kasing campuran tidak diizinkan.
  • Karena bit flips cukup umum selama perjalanan waktu, ini adalah untuk meminimalkan risiko.

Uji kasus

NB: Umpan baris digunakan di bawah ini hanya untuk keperluan pemformatan. Anda tidak seharusnya menangani mereka.

Input:
BIDABIDIBIDOBIDABIDUBUBIDUBIDI

Output:
Test

Input:
BIDABIDUBIDOBIDABIDOBODIBIDOBUBIDOBODUBIDOBODABIDOBIDABOBIBIDUBIDIBIDOBODUBOBIBUBOBUBOBUBI
DUBUBIDABOBA

Output:
Welcome to 2275!

Input:
BIDIBADIBIDOBIDABIDOBODIBIDOBODIBIDOBODUBOBODIBOBIBIDABIDIBIDOBADABIDOBODABIDOBIDABOBIBIDA
BIDIBIDUBOBIDOBABIDUBIDOBIDOBIDABIDOBODIBIDOBIDABIDUBOBOBABOBIBIDABADABIDOBODUBIDUBIDABOBI
BIDOBODIBIDOBODUBIDOBODUBIDOBADUBOBIBIDUBUBIDOBODUBOBIBIDOBIDOBIDUBIDABIDOBODOBIDOBODOBIDU
BADABOBA

Output:
Hello, Time Traveler! You look so funny!

Input:
BIDIBABIDOBODOBIDOBIDIBOBIBIDUBADABIDOBODUBIDUBIDABOBIBIDOBIDIBIDOBODUBIDOBODOBOBIDUBIDUBI
DIBOBIBIDUBIDABIDOBODOBIDOBIDIBIDOBIDABIDUBOBIDUBUBIDUBIDIBIDOBABIDOBODOBIDOBIDIBOBIBIDUBI
DUBIDOBADIBIDOBABIDUBIDIBOBIBIDIBADABOBIDUBIDOBODABOBIBIDUBUBIDOBABIDUBADABIDOBADABIDOBODO
BIDOBIDUBOBODIBOBIBIDOBIDIBIDOBODUBOBIBIDUBADABIDOBODUBIDUBIDABUBODUBOBIBIDIBADIBIDOBABOBI
BIDOBADIBIDOBABOBIBIDOBADIBIDOBABOBA

Output:
And you don't understand what I'm saying, do you? Ha ha ha!

4
@StewieGriffin Anak-anak sialan ini nakal ...: - /
Arnauld

12
Ngomong-ngomong, saya menemukan cerita yang benar-benar sangat tidak mungkin! Saya tidak akan terkejut jika itu hanya mimpi yang Anda miliki ... mungkinkah Anda memiliki CO bocor di rumah Anda?
Stewie Griffin

12
Ah ... Itu juga akan menjelaskan kuda poni yang mengendarai pelangi di ruang tamu saya!
Arnauld

9
Orang bisa berpendapat bahwa kode golf meningkatkan keparahan bit-flip (kurang redundansi dalam kode) bahkan jika itu mengurangi frekuensi bit-flip ... tapi apa pun :) - Tantangan bagus!
JayCe

4
@JayCe Benar. Saya lebih berpikir sepanjang garis: semakin kecil kode, semakin banyak redundansi yang bisa Anda dapatkan dengan menyimpan banyak salinan.
Arnauld

Jawaban:


15

05AB1E , 36 35 33 byte

Disimpan 1 byte berkat Mr.Xcoder
Disimpan 2 byte berkat KevinCruijssen

ć©¡®ì®D…IAO©â'D«‚˜®'U«âJskh2ôJHçJ

Cobalah online! atau sebagai Test Suite

Penjelasan

ć©¡                                 # extract the head ("B") and split input on it
   ®ì                              # prepend "B" to each
     ®D                            # push 2 copies of "B"
       …IAO©â                      # cartesian product with "IAO"
             'D«                   # append "D" to each
                ‚˜                 # add the leftover "B" to the list
                  ®'U«â            # cartesian product with "IAOU"
                       J           # join each to string
                        sk         # get the index of each word of the input in this list
                          h        # convert each to hex
                           2ôJ     # format as pairs of chars
                              H    # convert to int
                               çJ  # convert from ascii-codes to string

Saya percaya 'B©¡¦®ì®D…IAO©â'D«‚˜®'U«âJskh2ôJHçJbekerja selama 35 byte.
Tn. Xcoder

@ Mr.Xcoder: Ah, tentu saja. Penggunaan kembali yang bagus ©. Terima kasih :)
Emigna

-2 byte mengubah arah 'Bke ćdan menghapus ¦, karena input akan selalu dimulai dengan 'B'.
Kevin Cruijssen

@KevinCruijssen: Ooh, ide bagus. Saya belum mempertimbangkan ć. Terima kasih!
Emigna

9
Sekarang mari kita kembali pada anak-anak itu dan melihat apakah mereka memahaminya!
Aaron

14

Jelly , 26 24 23 22 20 17 15 byte

ṣḢO^1%9%4Ḅḅ⁴b⁹Ọ

Cobalah online!

Bagaimana itu bekerja

ṣḢO^1%9%4Ḅḅ⁴b⁹Ọ  Main link. Argument: s (string)

 Ḣ               Head; remove and yield the first character of s.
ṣ                Split s at occurrences of the result ('B').
  O              Ordinal; map "IAOUD" to A1 := [73, 65, 79, 85, 68].
   ^1            Bitwise XOR 1; map A1 to A2 := [72, 64, 78, 84, 69].
     %9          Modulo 9; map A2 to A3 := [0, 1, 6, 3, 6].
       %4        Modulo 4; map A3 to A4 := [0, 1, 2, 3, 2].
                 So far, we've mapped "BX" to [x] and "BXDY" to [x, 2, y],
                 where x/y = 0, 1, 2, 3 when X/Y = I, A, O, U.
         Ḅ       Unbinary; map [x] to x and [x, 2, y] to 4x + 2×2 + y = 4(x + 1) + y.
          ḅ⁴     Convert the resulting array from base 16 to integer.
            b⁹   Convert the resulting integer to base 256.
              Ọ  Unordinal; replace code points with their characters.

13

Perl 6 , 58 byte

{S:g{(B.[D.]?)**2}=chr :16[$0».&{:2[.ords»³X%87 X%4]}]}

Cobalah online!

Sangat terilhami oleh solusi Dennis 'Jelly. Menggunakan fungsi sihir berbeda x³ % 87 % 4yang juga memetakan kode ASCII IAOUBDuntuk 012302.

Alternatif 75 74 byte versi

-1 byte terima kasih kepada Jo King

{pack('H',.trans((<B BID BAD BOD>X~ <I A O U>)=>(^16)».base(16))).decode}

Cobalah online!

Alternatif versi 85 byte

{S:g[....]=chr :4(~$/)*2+|221+^:4(~$/)+^238}o{TR:d/UIAOBD/0123/}o{S:g[B.<![D]>]=0~$/}

Cobalah online!


Bagaimana dengan (^16)>>.base(16)-1 byte
Jo King

8

Python 2 , 100 97 96 95 byte

-1 byte terima kasih kepada ovs
-1 byte terima kasih kepada GB

lambda w:''.join(' 1023546798abdcef'[int(c,35)/7%77%18]for c in w.split('B')[1:]).decode("hex")

Cobalah online!



6

05AB1E (warisan), 68 65 60 59 byte

.•5Ç¿ÆΓ•2ô.•1ÒKá ¸ΓìŸÆt`ô_zTºγ„KRI‰ι놽òι•4ô«I¬©¡®ìkh2ôJHçJ

Input dalam huruf kecil.

-3 byte secara implisit berkat @Emigna berubah 'b¡εg>}s£menjadi 'b©¡®ì.

Cobalah secara online atau verifikasi semua kasus uji .

Juga, pasti bisa bermain golf dengan sesuatu yang lebih pintar daripada string terkompresi besar. Akan melihat lagi nanti. Jawaban yang lebih pendek sudah disediakan oleh @Emigna , jadi pastikan untuk membatalkannya!

Penjelasan:

.•5Ç¿ÆΓ•      # Compressed string "bibabobu"
        2ô    # Split in parts of 2
              #  → ["bi","ba","bo","bu"]
.•1ÒKá ¸ΓìŸÆt`ô_zTºγ„KRI‰ι놽òι•
              # Compressed string "bidibidabidobidubadibadabadobadubodibodabodobodu"
        4ô    # Split in parts of 4
              #  → ["bidi","bida","bido","bidu","badi","bada","bado","badu","bodi","boda","bodo","bodu"]
«             # Merge both lists together
              #  → ["bi","ba","bo","bu","bidi","bida","bido","bidu","badi","bada","bado","badu","bodi","boda","bodo","bodu"]
I¬©¡          # Take the input and split on the head (always 'b')
              #  i.e. "bidibadibidobidabidobodibidobodibidoboduboba"
              #   → ["idi","adi","ido","ida","ido","odi","ido","odi","ido","odu","o","a"]
    ®ì        # And prepend a 'b' to each item again
              #  i.e. ["idi","adi","ido","ida","ido","odi","ido","odi","ido","odu","o","a"] 
              #   → ["bidi","badi","bido","bida","bido","bodi","bido","bodi","bido","bodu","bo","ba"]
k             # Map each item to the index of the first list
              #   i.e. ["bidi","badi","bido","bida","bido","bodi","bido","bodi","bido","bodu","bo","ba"]
              #    → [4,8,6,5,6,12,6,12,6,15,2,1]
 h            # Convert everything to hexadecimal
              #  i.e. [4,8,6,5,6,12,6,12,6,15,2,1]
              #   → ["4","8","6","5","6","C","6","C","6","F","2","1"]
  2ôJ         # Split it in parts of 2 and join them together
              #  i.e. ["4","8","6","5","6","C","6","C","6","F","2","1"]
              #   → ["48","65","6C","6C","6F","21"]
     H        # Convert that from hexadecimal to an integer
              #  i.e. ["48","65","6C","6C","6F","21"] → [72,101,108,108,111,33]
      ç       # And take its ASCII value
              #  i.e. [72,101,108,108,111,33] → ["H","e","l","l","o","!"]
       J      # Then join everything together (and output implicitly)
              #  i.e. ["H","e","l","l","o","!"] → "Hello!"


5

R , 141 135 byte

function(x,y="I":"A":"O")intToUtf8(matrix(match(el(strsplit(gsub("D","",x),"B"))[-1],paste0(rep("":y,e=4),y:"U"))-1,,2,T)%*%16:1)
":"=c

Cobalah online!

Terima kasih kepada JayCe karena telah menghemat 6 byte!

Menggunakan beberapa sihir modular mungkin lebih pendek, tapi saya cukup senang dengan ini sebagai pass pertama yang naif.


1
Bagus! Trik favorit saya menghemat 6 byte - terinspirasi oleh komentar Anda untuk jawaban saya beberapa hari yang lalu.
JayCe

@JayCe sangat baik dan rapi! Bahkan menggunakannya dengan diutamakan daripada yang %*%saya lihat. :-) Anda juga dapat menempatkan `:`sebagai argumen fungsi jika Anda ingin menggunakan ini bersama-sama dengan sesuatu yang lain!
Giuseppe

Itu benar - saya selalu cenderung melupakan backquote.
JayCe

5

Japt, 43 29 28 byte

Tidak mengherankan, solusi port Dennis 'Jelly jauh lebih pendek.

Menghasilkan array karakter.

Åqbu)®¬®c ^1 %9%4Ãì2Ãò ®ìG d

Cobalah


Asli, 42 byte

Åqb £`bbidbad¾d`ò3n)ï`ia`q)m¬bXibÃò ®ìG d

Cobalah

Penjelasan

Åqb £`bbidbad¾d`ò3n)ï`ia`q)m¬bXibÃò ®ìG d
Å                                              :Slice off the first character
 qb                                            :Split on "b"
    £                                          :Map
     `bbidbad¾d`                               :  Compressed string "bbidbadbod"
                ò3n)                           :  Partition at every 3rd character from the end (["b","bid","bad","bod"])
                    ï                          :  Cartesian product
                     `ia`                      :   Compressed string "iaou"
                          q                    :   Split
                           )                   :  End Cartesian product
                            m                  :  Map
                             ¬                 :   Join
                              b                :  Index of
                               X               :   Current element
                                ib             :   Prepend "b"
                                  Ã            :End map
                                   ò           :Partition at every second element
                                     ®         :Map
                                      ìG       :  Convert from base-16 digit array to base-10 integer
                                         d     :  Get the character at that codepoint

5

C (gcc) , 181 138 136 byte

Semoga akan ada kompiler C di masa depan untuk mengkompilasi ini! :-)

Terima kasih kepada Max Yekhlakov dan ceilingcat untuk sarannya.

v,t,c,d;f(char*s){for(v=t=c=0;d=*s++;)t+=d==66?v=v*16+t,++c>2?v=!putchar(v),c=1:0,-t:d-65?d-79?d-68?d-85?0:3:4+t*3:2:1;putchar(v*16+t);}

Cobalah online!


Seandainya kompiler C di masa depan hanya memahami ASCII BIBABOBU-ified :-)

BIDUBIDOBOBODIBIDUBIDIBOBODIBIDOBUBUBADUBIDOBIDOBOBADIBIDOBUBIDOBADIBIDOBABIDUBOBOBADOBIDUBUBOBADABIDUBADUBIDOBIDOBIDOBODUBIDUBOBOBADIBIDUBIDOBUBODABIDUBIDIBUBODABIDOBUBUBODABUBIBUBADUBOBADOBIDUBUBUBADUBIDUBUBOBADUBOBADUBOBADABIDUBIDIBOBADUBUBODABOBADOBIDUBUBUBODABUBODABUBIDOBUBIDOBUBODUBIDUBIDOBUBODABIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBODIBOBADUBOBADUBIDOBUBUBODOBUBOBUBODUBIDUBIDOBUBODABOBABIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADABOBODIBIDOBUBUBODABUBABUBADOBUBIBOBODIBOBODABIDUBIDIBUBADOBOBADOBIDUBUBOBODABUBIDOBUBIDABUBODUBOBADOBIDUBUBOBODABUBIDUBUBADABUBODUBOBADOBIDUBUBOBODABUBIDOBUBADIBUBODUBOBADOBIDUBUBOBODABUBADIBUBIDABUBODUBUBIBUBADOBUBUBUBADOBUBIDIBOBADUBIDUBIDIBOBADOBUBUBUBADOBUBOBUBADOBUBABUBADUBIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBADABUBADUBIDUBODA

(Encoder Cobalah online! )



Sarankan c=printf(&v),v=0daripadav=!putchar(v),c=1
ceilingcat

4

JavaScript (Node.js) , 131 128 byte

s=>unescape(s.replace(/B.(D.)?/g,(f,s)=>(-~g(f[1])*4*!!s+g((s||f)[1])).toString(16),g=c=>'IAOU'.search(c)).replace(/../g,'%$&'))

Cobalah online! Tautan termasuk kasus uji. Versi alternatif, juga 131 byte:

s=>unescape(s.replace(/B.(D.)?/g,s=>(-~g(s[1])*4*!!s[3]+g(s[3]||s[1])).toString(16),g=c=>'IAOU'.search(c)).replace(/../g,'%$&'))

Cobalah online! Tautan termasuk kasus uji. Sunting: Menghemat 3 byte berkat @Shaggy.


1
Menggunakan unescape()adalah ide yang bagus.
Arnauld

indexOf-> searchuntuk menyimpan byte.
Shaggy

Selain itu, sepertinya Anda tidak perlu menetapkan RegEx r.
Shaggy

@Shaggy Whoops, itu adalah sisa dari iterasi sebelumnya. Terima kasih!
Neil


4

Scala , 305 byte

Yah, saya cukup yakin ini bisa bermain golf. Tapi tetap saja, itu ada. Mengambil huruf kecil input. fmencetak hasilnya di stdout.

Suntingan: -8 karakter berkat saya tidak lagi bodoh (spasi); -13 karakter berkat crater2150

var k=Seq("bi","ba","bo","bu")
k++=k.init.flatMap(a=>Seq("di","da","do","du").map(a+_))//Putting "bu" here instead of at line 1, and in place of using init, would be interesting... if it did not cause a typing problem
var m=Seq[String]()
def g(a:Seq[String],b:Int)=k.indexOf(a(b)).toHexString
def f(a:String){a.split('b').drop(1).foreach(x=>m:+="b"+x)
var i=0
while(i<m.length){print(Integer.parseInt(g(m,i)+g(m,i+1),16).toChar)
i+=2}}

Cobalah online!


Anda dapat mengganti dropRight(1)dengan init, Seq("").drop(1)dengan Seq[String](), dan map(b=>a+b)denganmap(a+_)
crater2150

@ crater2150 terima kasih! kompiler saya tidak mau map(a+_)bekerja tetapi saya tahu saya bisa melakukannya. terima kasih untuk tips lainnya!
V. Courtois

3

Python 2 , 142 139 127 118 byte

lambda s:''.join(chr(16*a+b)for a,b in zip(*[iter(4*F(l[:-2])+F(l[-1])-1for l in s.split('B')[1:])]*2));F=' IAOU'.find

Cobalah online!


3

Python 2 , 93 byte

lambda w:''.join('c60238e4d1_b7f95a'[hash(x)%3046%17]for x in w.split('B')[1:]).decode('hex')

Cobalah online!


Saya suka jawaban yang menyalahgunakan nilai hash dari daftar yang cukup kecil
Lyndon White


3

Dyalog APL, 74 72 byte

Solusi tingkat pemula di Dyalog APL (baru mulai belajar ini beberapa hari yang lalu!). Mendefinisikan dfn yang membutuhkan satu argumen benar (input). 72 karakter, 72 byte saat menggunakan enkode dyalog. Berdasarkan solusi Emigna di 05AB1E.

{⎕UCS 16⊥¨(1 0⍴⍨≢t)⊂1-⍨(,('B',('B'∘.,'IAO'),¨'D')∘.,'IAOU')⍳t←('B'⍷⍵)⊂⍵}

Selamat datang di PPCG dan ke dunia golf APL. Ini luar biasa setelah hanya beberapa hari belajar APL. Anda dapat menikmati kiat golf APL . Jangan ragu untuk berpartisipasi dalam The APL Orchard juga!
Adám

2

Jelly , 39 byte

®+“IAO”+”D®;p“IAOU”Ẏ€
=”B©œṗµḊ¢iⱮ’s2ḅ⁴Ọ

Cobalah online!

Teknik yang digunakan sangat mirip dengan Emigna . Saya akan golf ini lebih jauh segera, mudah-mudahan.


2

Brain-Flak , 178 byte

{(([((((()()()()){}){}){}()){}]{}){{}<>(({}){}){}(<>)}{}<({}(<>))(<>)((()()()())({})()){{(({})){({}[()])<>}{}}<>({}<>)<>{}}{}><>{}{})<>}<>([]){{}({}(((({}){}){}){}){}<>)<>([])}<>

Cobalah online!

Penjelasan

# Step 1: convert to hex.
# For each pair of letters in the input:
{

  (

    # Compare first letter to B
    ([((((()()()()){}){}){}()){}]{})

    # If not B, pop previous output, multiply by 4, and put on third stack.
    # 4 is added automatically from pushing/popping the difference
    # between the letters B and D.
    {{}<>(({}){}){}(<>)}{}

    <

      # Push second letter in pair to other stack
      ({}(<>))

      # Push 4 and 9
      (<>)((()()()())({})())

      # Compute 3-((8-(n mod 9)) mod 4)
      # (same as (n-1) mod 9 mod 4)
      {{(({})){({}[()])<>}{}}<>({}<>)<>{}}{}

    >

    # Add result to third stack (either 0 or 4*previous+4)
    <>{}{}

  # Push onto second stack
  )

<>}

# Step 2: Pair up hex digits.
# While digits remain on right stack:
<>([]){{}

  # Push top of stack + 16*second on stack to left stack
  ({}(((({}){}){}){}){}<>)<>

([])}

# Switch to left stack for output.
<>

2

05AB1E , 30 byte

ć¡Ç1^9%4%εDg≠i421øP]€OžvβžzвçJ

Port jawaban Jelly @Dennis 'gila (hanya dengan builtin kurang nyaman). Jadi pastikan untuk mendukungnya!

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

ć¡             # Split the input-string on its first character ('B')
               #  i.e. "BIDABIDIBIDOBIDABIDUBUBIDUBIDI"
               #   → ["IDA","IDI","IDO","IDA","IDU","U","IDU","IDI"]
  Ç            # Convert each character to it's ordinal value
               #  → [[73,68,65],[73,68,73],[73,68,79],[73,68,65],[73,68,85],85,[73,68,85],[73,68,73]]
   1^          # XOR it by 1
               #  → [[72,69,64],[72,69,72],[72,69,78],[72,69,64],[72,69,84],84,[72,69,84],[72,69,72]]
     9%        # Take modulo-9
               #  → [[0,6,1],[0,6,0],[0,6,6],[0,6,1],[0,6,3],3,[0,6,3],[0,6,0]]
       4%      # Take Modulo-4
               #  → [[0,2,1],[0,2,0],[0,2,2],[0,2,1],[0,2,3],3,[0,2,3],[0,2,0]]
ε         ]    # Now map it to:
 Dgi          # If the length is not 1:
               #  i.e. [0,2,1] → 3 → 1 (truthy)
               #  i.e. 3 → 1 → 0 (falsey)
     421øP     # Multiply the first number by 4, second by 2, and third by 1
               #  i.e. [0,2,1] and [4,2,1] → [[0,4],[2,2],[1,1]] → [0,4,1]
           O  # Then sum every inner list
               #  [[0,4,1],[0,4,0],[0,4,2],[0,4,1],[0,4,3],3,[0,4,3],[0,4,0]]
               #   → [5,4,6,5,7,3,7,4]
žvβ            # Convert this list from base-16 to base-10
               #  → 1415934836
   žzв         # Convert this integer from base-10 to base-256
               #  → [84,101,115,116]
      ç        # Convert this number to ASCII characters
               #  → ["T","e","s","t"]
       J       # Join the characters together (and output implicitly)
               #  → "Test"

Ingin tahu bagaimana Anda memotong 3 skor emignas. Jeebus ini +1 kompleks untuk upaya di port-- tidak pernah menggunakan XOR atau konversi basis sebelumnya! Akan diingat mulai sekarang!
Magic Octopus Mm

@ MagicOctopusUrn Ya, jawaban Dennis adalah sesuatu yang saya tidak akan pernah buat sendiri .. Dan di Jelly ini dilakukan jauh lebih efisien, karena jawabannya adalah 15 byte dan saya adalah 30. Hanya pikir itu layak posting juga namun, meskipun port. Saya hanya menggunakan XOR sekali sendiri, dan konversi Basis cukup sering.
Kevin Cruijssen

2

Java (JDK 10) , 199 byte

s->{var z="";for(var x:s.substring(1).split("B")){int d=-1;for(var y:x.split("D"))d=-~d*4+"IAOU".indexOf(y);z+=(char)(d>9?d+55:d+48);}return new String(new java.math.BigInteger(z,16).toByteArray());}

Cobalah online!

Kredit

  • -2 byte terima kasih kepada Arnauld

1
Bisakah Anda menggunakan -~dbukan (d+1)?
Arnauld

Ya terima kasih! Saya memiliki yang ada di versi pertama saya, kemudian saya bermain-main dengan gagasan menggunakan chars sebagai gantinya dan ketika saya kembali ke versi pertama saya, saya benar-benar lupa lagi. ;)
Olivier Grégoire

2

VBA (Excel), dengan 322 244 byte yang menakjubkan

Ya, dan aku MENCINTAI heksadesimal. (Belum ada font sarkasme, jadi saya menggunakan huruf miring untuk saat ini) Saya akan menambahkan komentar jika ada yang mau, tapi saya pikir itu sudah jelas. Golf terjadi.

Sub b(s)
For Each c In Split(Replace(s,"D",""),"B")
c=Application.Match(c,Array("I","A","O","U","II","IA","IO","IU","AI","AA","AO","AU","IO","OA","OO","OU"),0)
If Not IsError(c)Then d=d &c-1:If Len(d)=2Then e=e &Chr("&h"&d):d=""
Next
Debug.?e
End Sub

Dengan Komentar:

Sub b(s)
  'For each string between B's (Remove the D's first)
  For Each c In Split(Replace(s,"D",""),"B")
    'Get the index of the element in the array (Can cause error if empty)
    c = Application.Match (c,Array("I","A","O","U","II","IA","IO","IU","AI","AA","AO","AU","IO","OA","OO","OU"),0)
    'If c isn't an error
    If Not IsError(c) Then
      'Subtract 1 from c and add to d  --> Array index is 1 based
      d = d & (c-1)
      'If d is 2 characters
      If Len(d)=2 Then
        'Add the char from the hex value of d   --> &h forces Hex
        e = e & Chr("&h" & d)
        'Reset d
        d = ""
      End if
    End if
  Next
  'Print the output
  Debug.Print e
End Sub

Saya benar-benar mencoba memasukkan ini ke dalam VB Immediate Window, tetapi sepertinya tidak berfungsi di sana ... saya pikir akan memotong 11 karakter. Saya juga ingin memasukkan pernyataan Match ke dalam tanda kurung, tapi itu menyebabkan kesalahan diam setiap saat. Bantuan dihargai: D


Selamat datang di PPCG!
Arnauld

Terima kasih! Saya sudah di sini untuk sementara waktu, tidak pernah bisa memposting apa pun :)
seadoggie01

Array("I","A","O","U","II","IA","IO","IU","AI","AA","AO","AU","IO","OA","OO","OU")-> Split("I A O U II IA IO IU AI AA AO AU IO OA OO OU")dan Not IsError(c)->IsError(c)=0
Taylor Scott

1

Haxe , 228 byte

s->{var l=(u,i)->((i=u.charCodeAt(i))&8==8?0:1)|((i>>1)&2),p=s.split("B"),i=-1,q,o;[while((i+=2)<p.length)String.fromCharCode(l(q=p[i+1],o=q.length-1)+((o>1?l(q,0)+1:0)+((l(q=p[i],o=q.length-1)+o*(l(q,0)+1)*2)*4))*4)].join("");}

Bukan yang terbaik, nama fungsi perpustakaan standar terlalu besar :(

Cobalah online!


1

Pyth, 35 byte

mCid16cm+4imx"IAOU"k.[N2d4tc-Q\D\B2

Output sebagai daftar karakter.
Coba di sini

Penjelasan

mCid16cm+4imx"IAOU"k.[N2d4tc-Q\D\B2
                          tc-Q\D\B   Get the vowels associated with each digit.
       m            .[N2d            Pad with a quote.
           mx"IAOU"k                 Find each character's position.
        +4i              4           Convert to base 4 and add 4.
      c                           2  Split the result into pairs.
mCid16                               Get the associated ASCII characters.

1

Arang , 36 byte

FS≡ιB⊞υ⁰D⊞υ×⁴⊕⊟υ⊞υ⁺⊟υ⊕⌕AOUι⭆⪪υ²℅↨ι¹⁶

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

FS≡ι

Ulangi setiap karakter input dan alihkan.

B⊞υ⁰

Jika itu Bmaka dorong 0ke daftar kosong yang telah ditetapkan.

D⊞υ×⁴⊕⊟υ

Jika a Dmaka pop nilai terakhir, tambahkan, kalikan dengan 4, dan dorong lagi.

⊞υ⁺⊟υ⊕⌕AOUι

Jika tidak, cari indeks dalam string AOU, tambahkan, dan tambahkan ke nilai terakhir.

⭆⪪υ²℅↨ι¹⁶

Membagi daftar menjadi pasangan nilai, mendekode sebagai basis 16, dikonversi ke ASCII, dan cetak secara implisit.


1

Bersih , 145 134 byte

import StdEnv                   // import things like addition and comparison
?c=(743rem(toInt c))/16         // magical formula that maps ['IAOU'] to [0,1,2,3]
@[_,b,'D',d:t]=[?d+ ?b*4+4: @t] // convert B#D#
@[_,b:t]=[?b: @t]               // convert "B#"
@_=[]                           // handle base case
$[u,v:t]=[u<<4+v: $t]           // turn the digits into 2-digit numbers
$e=e                            // handle base case

toString o$o@                   // convert to string (make numbers (make digits))

Cobalah online!

Dijelaskan:


1

PHP, 119 byte

foreach(explode(B,$argn)as$i=>$m)($v=$v*16+4*strpos(XIAO,$m[-3]?:B)+strpos(IAOU,$m[-1]?:B))?$i&1||print chr($v&=255):0;

mengasumsikan input huruf besar. Jalankan sebagai pipa dengan -nRatau coba online .

membutuhkan PHP 7.1
untuk PHP yang lebih lama, gunakan substr($m,-3,1)dan substr($m,-1)bukannya $m[-<x>](+16 byte);
untuk PHP yang lebih muda, masukkan B, XIAOdan IAOUdalam tanda kutip untuk menghindari pesan peringatan (+10 byte).



0

PHP, 163 byte

function f($s){$t=[I=>0,A=>1,O=>2,U=>3];for($q=explode(B,$s);$a=&$q[++$i];){$a=($a[1]?($t[$a[0]]+1)*4:0)+$t[$a[2*($a[1]==D)]];$i%2?:print(chr(($q[$i-1]<<4)+$a));}}

Panggil f(string $s)dengan string karakter bibabobu-encoded yang sesuai, dan itu akan mencetak string yang diterjemahkan.


0

Python 3, 199 byte

import re
lambda s:''.join(eval(re.sub(r'(\d+), (\d+)',r'chr(16*\1+\2)',str(eval(s.replace('I','1').replace('A','2').replace('O','3').replace('U','4').replace('B',',-1+').replace('D','*4+')[1:])))))

Bukan yang terpendek tetapi tanpa loop.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.