Lassen Sie uns einen BIBABOBU-Decoder spielen

53

Während ich in der Zukunft unterwegs war, bemerkte ich ein lustiges Spiel unter Kindern um 2275. Wenn sie nicht wollen, dass ihre Ur-Ur-Ur-Ur-Großeltern verstehen, was sie sagen, verwenden sie die BIBABOBU-Sprache . Offensichtlich konnte ich mit meinem Gehirn aus der Zeit vor der Cyborg-Zeit auch nichts verstehen und fühlte mich (oder technisch: ich werde mich wirklich dumm fühlen ). Für meinen nächsten Besuch brauche ich also einen Decoder.

BIBABOBU?

Obwohl ASCII schon lange veraltet ist, wird es in der Popkultur von 2275 immer noch häufig verwendet, und diese Sprache basiert darauf.

Ein String ist auf diese Weise BIBABOBU-codiert:

  • Konvertieren Sie alle Zeichen in ihre ASCII-Codes.
  • Nehmen Sie die zweistellige hexadezimale Darstellung jedes Codes und konvertieren Sie sie anhand der folgenden Tabelle:

    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
    

Beispiel

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

Die entsprechenden Eingaben würden jedoch ohne Platz gegeben, um die monotone Intonation nachzuahmen, die Kinder verwenden, um dies ohne Implantate noch schwieriger zu verstehen:

"BIDIBADIBIDOBIDABIDOBODIBIDOBODIBIDOBODUBOBA"

Erläuterungen und Regeln

  • Denken Sie daran, dass ich einen Decoder brauche , keinen Encoder.
  • Dekodierte Zeichen liegen garantiert im Bereich [32 ... 126] .
  • Die Eingabe enthält garantiert eine gerade Anzahl von BIBABOBU-codierten hexadezimalen Ziffern.
  • Sie können Eingaben entweder in Klein- oder Großbuchstaben vornehmen. Mischfälle sind nicht zulässig.
  • Da Bit-Flips während einer Zeitreise häufig vorkommen, handelt es sich um um die Risiken zu minimieren.

Testfälle

Hinweis: Zeilenumbrüche werden im Folgenden nur zu Formatierungszwecken verwendet. Du sollst nicht damit umgehen.

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
quelle
4
@StewieGriffin Diese verdammten Kinder sind schelmisch ...: - /
Arnauld
12
Übrigens finde ich die Geschichte wirklich sehr, sehr unwahrscheinlich! Es würde mich nicht wundern, wenn es nur ein Traum wäre, den du hattest ... könntest du ein CO-Leck in deinem Haus haben?
Stewie Griffin
12
Ah ... Das würde auch die Ponys erklären, die Regenbogen in meinem Wohnzimmer reiten!
Arnauld
9
Man könnte argumentieren, dass Golf-Code den Schweregrad eines Bit-Flips erhöht (weniger Redundanz innerhalb des Codes), auch wenn er die Häufigkeit eines Bit-Flips verringert ... aber was auch immer :) - Nette Herausforderung!
JayCe
4
@ JayCe True. Ich habe mehr nachgedacht: Je kleiner der Code, desto mehr Redundanz kann durch das Speichern mehrerer Kopien erzielt werden.
Arnauld

Antworten:

15

05AB1E , 36 35 33 Bytes

1 Byte dank Mr.Xcoder
gespeichert 2 Byte dank KevinCruijssen gespeichert

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

Probieren Sie es online! oder als Testsuite

Erläuterung

ć©¡                                 # 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
quelle
Ich glaube 'B©¡¦®ì®D…IAO©â'D«‚˜®'U«âJskh2ôJHçJfunktioniert für 35 Bytes.
Mr. Xcoder
@ Mr.Xcoder: Ah, natürlich. Schöne Wiederverwendung von ©. Danke :)
Emigna
-2 Bytes, die das Anführen 'Bnach ćund Entfernen nach ändern ¦, da die Eingabe immer mit einem 'B' beginnt.
Kevin Cruijssen
@ KevinCruijssen: Oh, gute Idee. Ich hatte nicht darüber nachgedacht ć. Vielen Dank!
Emigna
9
Kommen wir jetzt zu diesen Kindern zurück und sehen, ob sie das verstehen!
Aaron
14

Jelly , 26 24 23 22 20 17 15 Bytes

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

Probieren Sie es online!

Wie es funktioniert

ṣḢ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
quelle
13

Perl 6 , 58 Bytes

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

Probieren Sie es online!

Stark von Dennis 'Jelly-Lösung inspiriert. Verwendet eine andere Magic-Funktion, x³ % 87 % 4die auch die ASCII-Codes von IAOUBDzuordnet 012302.

Alternative 75 74 Bytes Version

-1 Byte danke an Jo King

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

Probieren Sie es online!

Alternative 85-Byte-Version

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

Probieren Sie es online!

nwellnhof
quelle
Wie wäre es mit (^16)>>.base(16)-1 Byte
Jo King
8

Python 2 , 100 97 96 95 Bytes

-1 Byte dank ovs
-1 Byte dank GB

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

Probieren Sie es online!

Stange
quelle
6

05AB1E (Legacy), 68 65 60 59 Bytes

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

Die Eingabe erfolgt in Kleinbuchstaben.

-3 Bytes implizit dank der Änderung von @Emigna'b¡εg>}s£ zu 'b©¡®ì.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Auch kann definitiv mit etwas schlauerem als den riesigen komprimierten Saiten gespielt werden. Werde später noch einen Blick darauf werfen. Kürzere Antwort bereits von @Emigna zur Verfügung gestellt , stellen Sie also sicher, ihn zu stimmen!

Erläuterung:

.•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
quelle
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

Probieren Sie es online!

Vielen Dank an JayCe für das Speichern von 6 Bytes!

Die Verwendung von Modular Magic ist wahrscheinlich kürzer, aber ich bin ziemlich zufrieden mit diesem naiven ersten Durchgang.

Giuseppe
quelle
1
Nett ! Mein Lieblingstrick spart 6 Bytes - inspiriert von Ihrem Kommentar zu einer Antwort von mir neulich.
JayCe
@ Jayce sehr schön und ordentlich! Selbst wenn %*%ich es mit Vorrang benutze, sehe ich. :-) Sie können auch `:`als Funktionsargument angeben, falls Sie dies zusammen mit etwas anderem verwenden möchten!
Giuseppe
Das stimmt - ich neige immer dazu, die Backquotes zu vergessen.
JayCe
5

Japt, 43 29 28 Bytes

Es überrascht nicht, dass ein Port von Dennis 'Jelly-Lösung viel kürzer ausfällt.

Gibt ein Array von Zeichen aus.

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

Versuch es


Original, 42 Bytes

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

Versuch es

Erläuterung

Å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
Zottelig
quelle
5

C (gcc) , 181 138 136 Bytes

Hoffentlich gibt es in Zukunft einen C-Compiler, der dies kompiliert! :-)

Vielen Dank an Max Yekhlakov und ceilingcat für die Vorschläge.

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

Probieren Sie es online!


Falls der C-Compiler der Zukunft nur noch BIBABOBU-konformes ASCII versteht :-)

BIDUBIDOBOBODIBIDUBIDIBOBODIBIDOBUBUBADUBIDOBIDOBOBADIBIDOBUBIDOBADIBIDOBABIDUBOBOBADOBIDUBUBOBADABIDUBADUBIDOBIDOBIDOBODUBIDUBOBOBADIBIDUBIDOBUBODABIDUBIDIBUBODABIDOBUBUBODABUBIBUBADUBOBADOBIDUBUBUBADUBIDUBUBOBADUBOBADUBOBADABIDUBIDIBOBADUBUBODABOBADOBIDUBUBUBODABUBODABUBIDOBUBIDOBUBODUBIDUBIDOBUBODABIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBODIBOBADUBOBADUBIDOBUBUBODOBUBOBUBODUBIDUBIDOBUBODABOBABIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADABOBODIBIDOBUBUBODABUBABUBADOBUBIBOBODIBOBODABIDUBIDIBUBADOBOBADOBIDUBUBOBODABUBIDOBUBIDABUBODUBOBADOBIDUBUBOBODABUBIDUBUBADABUBODUBOBADOBIDUBUBOBODABUBIDOBUBADIBUBODUBOBADOBIDUBUBOBODABUBADIBUBIDABUBODUBUBIBUBADOBUBUBUBADOBUBIDIBOBADUBIDUBIDIBOBADOBUBUBUBADOBUBOBUBADOBUBABUBADUBIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBADABUBADUBIDUBODA

(Encoder Online ausprobieren ! )

ErikF
quelle
179 Bytes - Probieren Sie es online!
Max Yekhlakov
Schlagen Sie c=printf(&v),v=0stattdessen vorv=!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,'%$&'))

Probieren Sie es online! Link enthält Testfälle. Alternative Version, auch 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,'%$&'))

Probieren Sie es online! Link enthält Testfälle. Bearbeiten: Spart 3 Bytes dank @Shaggy.

Neil
quelle
1
Verwenden unescape()ist eine schöne Idee.
Arnauld
indexOf-> searchum ein Byte zu speichern.
Shaggy
Es sieht auch nicht so aus, als müssten Sie RegEx zuweisen r.
Shaggy
@ Shaggy Whoops, das ist ein Überbleibsel einer früheren Iteration. Vielen Dank!
Neil
4

Bash + gängige Linux-Dienstprogramme, 75 Byte

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

Probieren Sie es online!

Digitales Trauma
quelle
4

Scala , 305 Bytes

Nun, ich bin mir ziemlich sicher, dass man damit Golf spielen kann. Aber es existiert immer noch. Übernimmt die Eingabe in Kleinbuchstaben. fdruckt das Ergebnis in stdout aus.

EDIT: -8 Zeichen, da ich nicht mehr stumm bin (Leerzeichen); -13 Zeichen dank 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}}

Probieren Sie es online!

V. Courtois
quelle
Sie können dropRight(1)mit init, Seq("").drop(1)mit Seq[String]()und map(b=>a+b)mit ersetzenmap(a+_)
crater2150
@ crater2150 danke! Mein Compiler wollte nicht map(a+_)arbeiten, aber ich wusste, dass ich das tun konnte. danke für andere tipps!
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

Probieren Sie es online!

TFeld
quelle
3

Python 2 , 93 Bytes

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

Probieren Sie es online!

ovs
quelle
Ich liebe Antworten, die den Hash-Wert von ausreichend kleinen Listen missbrauchen
Lyndon White
3

Ruby , 86 75 Bytes

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

Probieren Sie es online!

GB
quelle
3

Dyalog APL, 74 72 Bytes

Anfänger-Level-Lösung in Dyalog APL (habe vor ein paar Tagen angefangen, dies zu lernen!). Definiert eine dfn, die ein rechtes Argument (die Eingabe) akzeptiert. 72 Zeichen, 72 Bytes bei Verwendung der Dyalog-Codierung. Basierend auf Emignas Lösung in 05AB1E.

{⎕UCS 16⊥¨(1 0⍴⍨≢t)⊂1-⍨(,('B',('B'∘.,'IAO'),¨'D')∘.,'IAOU')⍳t←('B'⍷⍵)⊂⍵}
vancan1ty
quelle
Willkommen bei PPCG und in der Welt des APL-Golfsports. Dies ist erstaunlich, nachdem Sie nur ein paar Tage APL gelernt haben. Sie können die APL Golftipps genießen . Nehmen Sie auch an The APL Orchard teil !
Adám
2

Jelly , 39 Bytes

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

Probieren Sie es online!

Die verwendete Technik ist der von Emigna sehr ähnlich . Ich werde das hoffentlich bald weiter spielen.

Mr. Xcoder
quelle
2

Brain-Flak , 178 Bytes

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

Probieren Sie es online!

Erläuterung

# 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
quelle
2

05AB1E , 30 Bytes

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

Port of @Dennis 'verrückte Jelly-Antwort (nur mit weniger praktischen eingebauten). Stellen Sie also sicher, dass Sie ihn unterstützen!

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

ć¡             # 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
quelle
Ich frage mich, wie Sie 3 Emignas-Punkte gekürzt haben. Jeebus, das ist komplex +1 für den Aufwand am Port - nie zuvor verwendetes XOR oder diese Basiskonvertierung! Wird von nun an im Hinterkopf behalten!
Magic Octopus Urn
@MagicOctopusUrn Ja, Dennis 'Antwort ist etwas, das ich mir niemals ausgedacht hätte. Und bei Jelly ist dies effizienter, da seine Antwort 15 Bytes und meine 30 Bytes beträgt. obwohl es ein Hafen ist. Ich habe XOR selbst nur einmal verwendet und Base Conversion ziemlich oft.
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());}

Probieren Sie es online!

Credits

Olivier Grégoire
quelle
1
Könnten Sie -~danstelle von verwenden (d+1)?
Arnauld
Ja, danke! Ich hatte diese in meiner ersten Version, dann spielte ich mit der Idee, charstattdessen s zu verwenden, und als ich zu meiner ersten Version zurückkam, vergaß ich es total wieder. ;)
Olivier Grégoire
2

VBA (Excel) mit erstaunlichen 322 244 Bytes

Ja, und ich LIEBE hexadezimal. (Es gibt noch keine Sarkasmus-Schrift, daher verwende ich jetzt Kursivschrift.) Ich werde Kommentare hinzufügen, wenn jemand dies wünscht, aber ich denke, es ist selbsterklärend. Golfen ist passiert.

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

Mit Kommentaren:

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

Ich habe wirklich versucht, dies in das VB-Direktfenster zu bringen, aber es scheint dort nicht zu funktionieren ... das würde meiner Meinung nach 11 Zeichen schneiden. Ich wollte auch die Match-Anweisung in Klammern setzen, aber das verursacht jedes Mal einen stillen Fehler. Hilfe wird geschätzt: D

seadoggie01
quelle
Willkommen bei PPCG!
Arnauld
Vielen Dank! Ich bin schon eine Weile hier, konnte aber noch nie etwas posten :)
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")und 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("");}

Nicht die besten, Standard-Bibliotheksfunktionsnamen sind zu groß :(

Probieren Sie es online!

Aurel Bílý
quelle
1

Pyth, 35 Bytes

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

Ausgabe als Liste von Zeichen.
Probieren Sie es hier aus

Erläuterung

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.
Gedächtnisstütze
quelle
1

Kohle , 36 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

FS≡ι

Durchlaufen Sie jedes eingegebene Zeichen und wechseln Sie.

B⊞υ⁰

Wenn es ein ist, Bdann drücke 0auf die vordefinierte leere Liste.

D⊞υ×⁴⊕⊟υ

Wenn es sich um ein DPopup handelt, erhöhen Sie den letzten Wert, multiplizieren Sie ihn mit 4und drücken Sie ihn erneut.

⊞υ⁺⊟υ⊕⌕AOUι

Suchen Sie andernfalls den Index in der Zeichenfolge AOU, erhöhen Sie ihn und fügen Sie ihn zum letzten Wert hinzu.

⭆⪪υ²℅↨ι¹⁶

Teilen Sie die Liste in Wertepaare auf, dekodieren Sie sie als Basis 16, konvertieren Sie sie in ASCII und drucken Sie sie implizit.

Neil
quelle
1

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

Probieren Sie es online!

Erklärt:

Οurous
quelle
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;

setzt die Eingabe in Großbuchstaben voraus. Laufen Sie als Pipe mit -nRoder versuchen Sie es online .

erfordert PHP 7.1
für älteres PHP, benutze substr($m,-3,1)und substr($m,-1)anstelle von $m[-<x>](+16 Bytes);
für jüngere PHP, setzen B, XIAOund IAOUin Anführungszeichen Warnmeldungen (10 Bytes) zu vermeiden.

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

Rufen Sie f(string $s)mit der entsprechenden Zeichenfolge bibabobu-codierter Zeichen auf, und es wird die decodierte Zeichenfolge gedruckt.

Élektra
quelle
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:])))))

Nicht die kürzeste, aber ohne Schleifen.

user0815
quelle