Vamos jogar um decodificador BIBABOBU

53

Enquanto eu estava viajando no futuro, notei um jogo engraçado entre crianças por volta de 2275. Quando eles não querem que seus tataravós entendam o que estão dizendo, eles usam a fala do BIBABOBU . Obviamente, eu também não conseguia entender nada com o meu cérebro da era pré-ciborgue e me senti (ou tecnicamente: me sentirei ) muito bobo. Então, eu precisaria de um decodificador para minha próxima visita.

BIBABOBU?

Embora tenha sido descontinuado por um longo tempo, o ASCII ainda é comumente usado na cultura pop de 2275 e esse idioma é baseado nele.

Uma sequência é codificada em BIBABOBU dessa maneira:

  • Converta todos os caracteres em seus códigos ASCII.
  • Pegue a representação hexadecimal de 2 dígitos de cada código e converta-os usando a seguinte tabela:

    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
    

Exemplo

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

No entanto, a entrada correspondente seria fornecida sem espaço para imitar a entonação monótona que as crianças estão usando para tornar isso ainda mais difícil de entender sem implantes:

"BIDIBADIBIDOBIDABIDOBODIBIDOBODIBIDOBODUBOBA"

Esclarecimentos e regras

  • Lembre-se de que preciso de um decodificador , não de um codificador.
  • É garantido que os caracteres decodificados estejam no intervalo [32 ... 126] .
  • A entrada é garantida para conter um número par de dígitos hexadecimais codificados em BIBABOBU.
  • Você pode receber entradas em minúsculas ou maiúsculas. Casos mistos não são permitidos.
  • Como os flips de bits são bastante comuns durante uma viagem no tempo, esse é um para minimizar os riscos.

Casos de teste

Nota: os feeds de linha são usados ​​abaixo apenas para fins de formatação. Você não deveria lidar com eles.

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!
Arnauld
fonte
4
@StewieGriffin Essas crianças malditas são travessas ...: - /
Arnauld
12
A propósito, acho a história realmente muito improvável! Eu não ficaria surpreso se fosse apenas um sonho que você teve ... você pode ter um vazamento de CO em sua casa?
Stewie Griffin
12
Ah ... Isso também explicaria os pôneis montando arco-íris na minha sala de estar!
Arnauld
9
Pode-se argumentar que o código golfado aumenta a gravidade de um bit-flip (menos redundância dentro do código), mesmo que diminua a frequência de um bit-flip ... mas seja o que for :) - Belo desafio!
Jayce
4
@JayCe True. Eu estava pensando mais sobre isso: quanto menor o código, mais redundância você pode obter armazenando várias cópias.
Arnauld

Respostas:

15

05AB1E , 36 35 33 bytes

Guardado 1 byte graças a Mr.Xcoder
Guardado 2 bytes graças a KevinCruijssen

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

Experimente online! ou como um conjunto de testes

Explicação

ć©¡                                 # 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
Emigna
fonte
Eu acredito que 'B©¡¦®ì®D…IAO©â'D«‚˜®'U«âJskh2ôJHçJfunciona para 35 bytes.
Sr. Xcoder 29/08/19
@ Mr.Xcoder: Ah, claro. Boa reutilização de ©. Obrigado :)
Emigna
-2 bytes mudando o que conduz 'Bpara će a remoção do ¦, uma vez que a entrada será sempre começam com um 'B'.
Kevin Cruijssen
@KevinCruijssen: Ooh, boa ideia. Eu não tinha considerado ć. Obrigado!
Emigna
9
Agora vamos voltar para essas crianças e ver se elas entendem isso!
Aaron
14

Geléia , 26 24 23 22 20 17 15 bytes

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

Experimente online!

Como funciona

ṣḢ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.
Dennis
fonte
13

Perl 6 , 58 bytes

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

Experimente online!

Fortemente inspirado na solução de Dennis 'Jelly. Usa uma função mágica diferente x³ % 87 % 4que também mapeia os códigos ASCII de IAOUBDpara 012302.

Versão alternativa 75 74 bytes

-1 byte graças a Jo King

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

Experimente online!

Versão alternativa de 85 bytes

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

Experimente online!

Nwellnhof
fonte
Como sobre (^16)>>.base(16)-1 byte
Jo King
8

Python 2 , 100 97 96 95 bytes

-1 byte graças ao ovs
-1 byte graças ao GB

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

Experimente online!

Cajado
fonte
6

05AB1E (legado), 68 65 60 59 bytes

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

A entrada está em minúscula.

-3 bytes implicitamente, graças à mudança de @Emigna'b¡εg>}s£ para 'b©¡®ì.

Experimente online ou verifique todos os casos de teste .

Além disso, definitivamente pode ser jogado com algo mais inteligente do que as enormes cordas compactadas. Mais uma olhada mais tarde. Resposta mais curta já fornecida por @Emigna , por isso, vote nele!

Explicação:

.•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!"
Kevin Cruijssen
fonte
6

Perl 6 , 88 86 84 bytes

{S:g{B(.*?)B(.D.|.)}=chr :16[$/.map:{first :k,~$_,("",|<ID AD OD UD>X~ <I A O U>)}]}

Experimente online!

Brincadeira
fonte
5

R , 141 135 bytes

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

Experimente online!

Obrigado a JayCe por economizar 6 bytes!

É provável que usar alguma magia modular seja mais curta, mas estou muito feliz com isso como um primeiro passe ingênuo.

Giuseppe
fonte
11
Agradável ! Meu truque favorito economiza 6 bytes - inspirado no seu comentário em uma resposta minha outro dia.
Jayce
@JayCe muito agradável e arrumado! Mesmo usando-o com precedência sobre o %*%que vejo. :-) Você também pode colocar `:`como argumento de função, caso queira usá-lo em conjunto com outra coisa!
Giuseppe
É isso mesmo - eu sempre esqueço as citações.
Jayce
5

Japonês, 43 29 28 bytes

Sem surpresa, um porto da solução Dennis 'Jelly funciona muito mais curto.

Produz uma matriz de caracteres.

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

Tente


Original, 42 bytes

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

Tente

Explicação

Å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
Shaggy
fonte
5

C (gcc) , 181 138 136 bytes

Espero que haja um compilador C no futuro para compilar isso! :-)

Obrigado a Max Yekhlakov e tetocat pelas sugestões.

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

Experimente online!


Caso o compilador C do futuro entenda apenas ASCII :-) BIBABOBU:

BIDUBIDOBOBODIBIDUBIDIBOBODIBIDOBUBUBADUBIDOBIDOBOBADIBIDOBUBIDOBADIBIDOBABIDUBOBOBADOBIDUBUBOBADABIDUBADUBIDOBIDOBIDOBODUBIDUBOBOBADIBIDUBIDOBUBODABIDUBIDIBUBODABIDOBUBUBODABUBIBUBADUBOBADOBIDUBUBUBADUBIDUBUBOBADUBOBADUBOBADABIDUBIDIBOBADUBUBODABOBADOBIDUBUBUBODABUBODABUBIDOBUBIDOBUBODUBIDUBIDOBUBODABIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBODIBOBADUBOBADUBIDOBUBUBODOBUBOBUBODUBIDUBIDOBUBODABOBABIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADABOBODIBIDOBUBUBODABUBABUBADOBUBIBOBODIBOBODABIDUBIDIBUBADOBOBADOBIDUBUBOBODABUBIDOBUBIDABUBODUBOBADOBIDUBUBOBODABUBIDUBUBADABUBODUBOBADOBIDUBUBOBODABUBIDOBUBADIBUBODUBOBADOBIDUBUBOBODABUBADIBUBIDABUBODUBUBIBUBADOBUBUBUBADOBUBIDIBOBADUBIDUBIDIBOBADOBUBUBUBADOBUBOBUBADOBUBABUBADUBIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBADABUBADUBIDUBODA

(Codificador Experimente online! )

ErikF
fonte
179 bytes - Experimente online!
Max Yekhlakov 30/08/19
Sugerir em c=printf(&v),v=0vez dev=!putchar(v),c=1
ceilingcat 19/10/19
4

JavaScript (Node.js) , 131 128 bytes

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,'%$&'))

Experimente online! O link inclui casos de teste. Versão alternativa, também 131 bytes:

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,'%$&'))

Experimente online! O link inclui casos de teste. Editar: economiza 3 bytes graças ao @Shaggy.

Neil
fonte
11
Usar unescape()é uma boa ideia.
Arnauld
indexOf-> searchpara salvar um byte.
Shaggy
Além disso, não parece que você precise atribuir o RegEx r.
Shaggy
@ Shaggy Opa, isso é uma sobra de uma iteração anterior. Obrigado!
Neil
4

Bash + utilitários comuns do Linux, 75 bytes

sed $(printf `printf %s s/{B{O,A,I}D,B}{U,O,A,I}/%x/g\;` {15..0})|xxd -r -p

Experimente online!

Trauma Digital
fonte
4

Scala , 305 bytes

Bem, eu tenho certeza que isso pode ser jogado fora. Mas ainda existe. Leva a entrada em minúsculas. fimprime o resultado em stdout.

EDIT: -8 caracteres graças a eu não ser mais burra (espaços); -13 caracteres graças a 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}}

Experimente online!

V. Courtois
fonte
Você pode substituir dropRight(1)por init, Seq("").drop(1)por Seq[String]()e map(b=>a+b)commap(a+_)
crater2150 2/18/18
@ crater2150 obrigado! meu compilador não queria map(a+_)trabalhar, mas eu sabia que poderia fazer isso. obrigado por outras dicas!
V. Courtois
3

Python 2 , 142 139 127 118 bytes

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

Experimente online!

TFeld
fonte
3

Python 2 , 93 bytes

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

Experimente online!

ovs
fonte
Eu amo respostas que abusam o valor de hash de suficientemente pequenas listas
Lyndon Branca
3

Ruby , 86 75 bytes

->s{[s.gsub(/B[^B]+/){|x|"546798ABDCEF1023"[x.to_i(31)/7%38%20]}].pack'H*'}

Experimente online!

GB
fonte
3

Dyalog APL, 74 72 bytes

Solução de nível iniciante no Dyalog APL (comecei a aprender isso há alguns dias!). Define um dfn que recebe um argumento correto (a entrada). 72 caracteres, 72 bytes ao usar a codificação dyalog. Baseado na solução da Emigna em 05AB1E.

{⎕UCS 16⊥¨(1 0⍴⍨≢t)⊂1-⍨(,('B',('B'∘.,'IAO'),¨'D')∘.,'IAOU')⍳t←('B'⍷⍵)⊂⍵}
vancan1ty
fonte
Bem-vindo ao PPCG e ao mundo do golfe APL. Isso é incrível depois de apenas alguns dias aprendendo APL. Você pode aproveitar as dicas de golfe da APL . Sinta-se à vontade para participar do The APL Orchard também!
Adám
2

Geléia , 39 bytes

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

Experimente online!

A técnica utilizada é muito semelhante à de Emigna . Vou jogar isso ainda mais em breve, espero.

Mr. Xcoder
fonte
2

Flacidez Cerebral , 178 bytes

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

Experimente online!

Explicação

# 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.
<>
Nitrodon
fonte
2

05AB1E , 30 bytes

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

Porto da resposta insana Jelly do @Dennis (apenas com componentes menos convenientes). Portanto, certifique-se de votá-lo!

Experimente online ou verifique todos os casos de teste .

Explicação:

ć¡             # 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"
Kevin Cruijssen
fonte
Gostaria de saber como você cortou 3 pontos emignas. Jeebus, este é um +1 complexo para o esforço na porta - nunca usei o XOR ou essa conversão básica antes! Terá em mente a partir de agora!
Magic Octopus Urn
@MagicOctopusUrn Sim, a resposta de Dennis é algo que eu nunca teria imaginado .. E em Jelly isso é feito de maneira muito mais eficiente, já que a resposta dele é de 15 bytes e a minha é de 30. Só achei que valeria a pena postar, no entanto, mesmo que seja um porto. Eu só usei o XOR uma vez e a conversão Base com bastante frequência.
Kevin Cruijssen
2

Java (JDK 10) , 199 bytes

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

Experimente online!

Créditos

Olivier Grégoire
fonte
11
Você poderia usar em -~dvez de (d+1)?
Arnauld
Sim obrigado! Eu os tinha na minha primeira versão, depois brinquei com a idéia de usar chars e, quando voltei para a minha primeira versão, esqueci completamente. ;)
Olivier Grégoire
2

VBA (Excel), com incríveis 322 244 bytes

Sim, e eu amo hexadecimal. (Ainda não há fonte de sarcasmo, por isso estou usando itálico) . Vou adicionar comentários se alguém quiser, mas acho que é auto-explicativo. O golfe aconteceu.

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

Com comentários:

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

Eu realmente tentei colocar isso na janela do VB Immediate, mas parece que não funciona lá ... isso cortaria 11 caracteres, eu acho. Eu também queria colocar a instrução Match entre colchetes, mas isso sempre causa um erro silencioso. A ajuda é apreciada: D

seadoggie01
fonte
Bem-vindo ao PPCG!
Arnauld
Obrigado! Eu estive aqui por um tempo, nunca foi capaz de qualquer coisa pós :)
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")e Not IsError(c)->IsError(c)=0
Taylor Scott
1

Haxe , 228 bytes

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

Não são os melhores nomes de função de biblioteca padrão são muito grandes :(

Experimente online!

Aurel Bílý
fonte
1

Pitão, 35 bytes

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

Saída como uma lista de caracteres.
Experimente aqui

Explicação

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.
Mnemônico
fonte
1

Carvão , 36 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

FS≡ι

Faça um loop sobre cada caractere de entrada e alterne.

B⊞υ⁰

Se for um B, pressione 0a lista vazia predefinida.

D⊞υ×⁴⊕⊟υ

Se for um Dpop, clique no último valor, aumente, multiplique 4e pressione novamente.

⊞υ⁺⊟υ⊕⌕AOUι

Caso contrário, encontre o índice na cadeia AOU, aumente-o e adicione o último valor.

⭆⪪υ²℅↨ι¹⁶

Divida a lista em pares de valores, decodifique como base 16, converta em ASCII e imprima implicitamente.

Neil
fonte
1

Limpo , 145 134 bytes

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

Experimente online!

Explicado:

Furioso
fonte
1

PHP, 119 bytes

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;

assume entrada em maiúsculas. Execute como pipe -nRou experimente online .

requer PHP 7.1
para PHP antigo, use substr($m,-3,1)e em substr($m,-1)vez de $m[-<x>](+16 bytes);
para os mais jovens PHP, put B, XIAOe IAOUentre aspas para evitar mensagens de aviso (+10 bytes).

Titus
fonte
0

PHP, 163 bytes

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

Ligue f(string $s)com a sequência apropriada de caracteres codificados em bibabobu e ela imprimirá a sequência decodificada.

Élektra
fonte
0

Python 3, 199 bytes

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:])))))

Não é o mais curto, mas sem loops.

user0815
fonte