Übersetzen Sie RoboCritters in Brainf ***

15

RoboCritters ( Etymologie ) ist eine brandneue esoterische Programmiersprache . Es ist eine Variante von Brainfuck (BF), die etwas komplexer ist als die üblichen Ersetzungsschemata für Bediener. Jedes Programm in RoboCritters ist ein rechteckiges Textraster, das nur die sieben Zeichen . []/\|plus Zeilenumbrüche enthält, um das Raster zu formen.

Beispiel RoboCritters-Programm:

|\/||./|[]||
[..][][]   |
|/\|[..][..]
[..]    \/\/

Um ein RoboCritters-Programm in BF zu übersetzen, betrachten Sie jedes Nicht-Zeilenumbruch-Zeichen im Raster in der normalen Lesereihenfolge (von links nach rechts, dann von oben nach unten), z |\/||./|[]||[..][][] ||/\|[..][..][..] \/\/.

Wenn der 4 × 2-Abschnitt des Gitters, der sich vom aktuellen Zeichen nach rechts und unten erstreckt, genau mit einem der acht unten aufgelisteten Robotertiere übereinstimmt, hängen Sie den entsprechenden BF-Befehl ( ><+-.,[]) an das (anfangs leere) BF-Programm an.

Wenn der 4 × 2 Gitterabschnitt entspricht nicht einer der Roboter Lebewesen oder geht die Grenzen aus , nichts zu dem BF - Programm hinzugefügt.

  1. Joybot, >Befehl:

    [..]
    \][/
    
  2. Calmbot, <Befehl:

    [..]
    /][\
    
  3. Squidbot, +Befehl:

    [..]
    //\\
    
  4. Spiderbot, -Befehl:

    [..]
    ||||
    
  5. Bunnybot, .Befehl:

    [][]
    [..]
    
  6. Toothbot, ,Befehl:

    [..]
    |/\|
    
  7. Foxbot, [Befehl:

    |\/|
    [..]
    
  8. Batbot, ]Befehl:

    [..]
    \/\/
    

Lesen Sie also das Beispielprogramm

|\/||./|[]||
[..][][]   |
|/\|[..][..]
[..]    \/\/

wir können sehen, dass wir zuerst einem Foxbot (in Spalte 1, Zeile 1) begegnen, dann einem Toothbot (c1, r2), dann einem Bunnybot (c5, r2) und schließlich einem Batbot (c9, r3). Dies entspricht dem BF-Programm [,.].

Beachten Sie, dass sich Foxbot und Toothbot überlappen. Dies ist beabsichtigt; Robotertiere werden nicht anders interpretiert, wenn sie sich überlappen .

Herausforderung

Schreiben Sie das kürzestmögliche Programm, das ein RoboCritters-Programm aufnimmt und dessen BF-Äquivalent ausgibt. Sie müssen den BF nicht ausführen oder überprüfen, ob er gültig ist. Übersetzen Sie nur den RoboCritters-Code in BF-Code.

Einzelheiten

  • Alle eingegebenen RoboCritters-Programme sind gültig, dh es handelt sich um einen genau rechteckigen Textblock, der nur die sieben Zeichen . []/\|und die Zeilenumbrüche enthält, um ihn zu formen. Die Zeilenumbrüche können in einer beliebigen üblichen Darstellung sein . Sie können optional davon ausgehen, dass die Programme eine einzige nachgestellte Zeile haben.

  • Sie müssen RoboCritters-Programme unterstützen, die kleiner als 4 × 2 sind, einschließlich des 0 × 0-Leerprogramms (oder Single Newline-Programms). Diese entsprechen alle dem leeren BF-Programm (der leeren Zeichenkette).

  • Das Ausgabe-BF-Programm sollte eine einzeilige Zeichenfolge sein, die nur die acht BF-Befehlszeichen enthält ><+-.,[]. Optional kann eine einzelne nachgestellte Zeile eingefügt werden.

  • Nehmen Sie die Eingabe wie gewohnt vor (stdin / Textdatei / Befehlszeile) und geben Sie sie an stdout oder die nächstgelegene Alternative Ihrer Sprache aus.

  • Anstelle eines Programms können Sie eine Funktion schreiben, die das RoboCritters-Programm als Zeichenfolge verwendet und die BF-Programmzeichenfolge ausgibt oder zurückgibt.

Beispiele

  1. Eingabe: (Variante des obigen Beispiels)

    |\/|[][]
    [..][][]
    |/\|[..]
        \/\/
    

    Ausgabe: [,.]

  2. Eingabe: (testet alle Robotertiere)

    [..][[[[[..]]. ]|\/|
    \][/[..]//\\[..][..]
    [..]/][\[][]|/\|[..]
    ||||/\| [..]|  |\/\/
    

    Ausgabe: >+[<,-.]

  3. Eingang:

    [..] [..] [..] [..] [..] [..] [..] [..] |\/| [..] [..] [..] [..] [..] |\/| [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] [..] |\/| [..] [..] [..] [..] [..] [..] [..] [][] [..] [..] [..] [..] [][] [..] [..] [..] [..] [..] [..] [..] [][] [][] [..] [..] [..] [][] [..] [..] [][] [..] [..] [][] [..] [][] [..] [..] [..] [][] [..] [..] [..] [..] [..] [..] [][] [..] [..] [..] [..] [..] [..] [..] [..] [][] [..] [..] [..] [][] [..] [..] [..] [][]
    //\\ //\\ //\\ //\\ //\\ //\\ //\\ //\\ [..] \][/ //\\ //\\ //\\ //\\ [..] \][/ //\\ //\\ \][/ //\\ //\\ //\\ \][/ //\\ //\\ //\\ \][/ //\\ /][\ /][\ /][\ /][\ |||| \/\/ \][/ //\\ \][/ //\\ \][/ |||| \][/ \][/ //\\ [..] /][\ \/\/ /][\ |||| \/\/ \][/ \][/ [..] \][/ |||| |||| |||| [..] //\\ //\\ //\\ //\\ //\\ //\\ //\\ [..] [..] //\\ //\\ //\\ [..] \][/ \][/ [..] /][\ |||| [..] /][\ [..] //\\ //\\ //\\ [..] |||| |||| |||| |||| |||| |||| [..] |||| |||| |||| |||| |||| |||| |||| |||| [..] \][/ \][/ //\\ [..] \][/ //\\ //\\ [..]
    

    Ausgabe: ( BF Hello World-Programm )

    ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
    
  4. Eingabe: (keine Roboterlebewesen vorhanden)

    /\\\[].
    ]..[..]
    \\//||\
    

    Ausgabe: (leere Zeichenfolge)

Wertung

Die kürzeste Übermittlung in Bytes gewinnt. ( Handy-Byte-Zähler. ) Tiebreaker ist der am höchsten gewählte Beitrag.

Calvins Hobbys
quelle

Antworten:

9

CJam, 86 85 Bytes

qN/S4*f+_W<\1>]z:z4few:~"¨Ý³5&ágûò{wÉ](Ý"296b6b"|[\.]/"f=2/4/"><+-.,[]":Ler{L&},

Teste es hier.

Erläuterung

qN/    e# Read input and split into lines.
S4*f+  e# Append four spaces to each line. This has two purposes. a) We can later join all
       e# the lines together without worrying about critters appearing across the line
       e# edges because no critter contains spaces. b) It works around a bug in CJam where
       e# the command `ew` crashes when the substring length is longer than the string.
_W<    e# Copy the lines and discard the last one.
\1>    e# Swap with the other copy and discard the first one.
]z     e# Wrap both in an array and zip them up. Now we've got an array which contains
       e# all consecutive pairs of lines.
:z     e# Zip up each of those pairs, such it becomes an array of two-character strings.
       e# We can now find the critters as 4-element subarrays in each of those arrays.
4few   e# Turn each of those arrays into a list of its (overlapping) 4-element subarrays.
:~     e# Flatten those lists, such that we get one huge array of all 4x2 blocks, in order.
"gibberish"296b6b
       e# This is an encoded form of the critters. The above produces a string of the
       e# critters in column-major order, all joined together, where the characters are
       e# represented by numbers 0 to 5.
"|[\.]/"f=
       e# Turn each number into the correct character.
2/4/   e# Split first into columns, then into critters. Now all we need to do is find these
       e# the elements of this array in the processed input.
"><+-.,[]":L
       e# A string of all BF characters in the same order as the critters. Store this in L.
er     e# Do an element-wise replacement. This will leave non-critter blocks untouched.
{L&},  e# Filter the result. The elements are now either characters, or still full 4x2
       e# blocks. We take the set intersection with the array (string) of BF characters.
       e# If the current element is itself a character, it will be coerced into an array
       e# containing that character, such that we get a non-empty intersection. If the
       e# current element is a block instead, if contains arrays itself, so the set
       e# intersection will always be empty.

       e# The resulting array of characters is the desired BF program and will be printed
       e# automatically at the end of the program.

Die Lebewesen wurden mit diesem Skript verschlüsselt . Ich habe die Basis 296 für die Codierung mit dem folgenden, eher naiven Mathematica-Skript gefunden (das immer noch auf der Suche nach einer besseren Basis ausgeführt wird):

b = 256;
While[True,
  If[
    FreeQ[
      d = IntegerDigits[15177740418102340299431215985689972594497307279709, b], 
      x_ /; x > 255
    ], 
    Print@{b, Length@d}
  ];
  b += 1;
]
Martin Ender
quelle
3

JavaScript ES6, 209 198 192 Bytes

f=c=>{s=''
b=o=>c.substr(o,4)||1
for(i in c)s+=!~(d='1\\][/1/][\\1//\\\\1||||[][]11|/\\||\\/|11\\/\\/'.replace(/1/g,'[..]').indexOf(b(i)+b(++i+c.search(`
`))))|d%8?'':'><+-.,[]'[d/8]
return s}

Das folgende Stack-Snippet enthält ungolften Code, den Sie problemlos in jedem Browser ausführen können.

var f = function(c) {
  var s = '';
  var b = function(o) {
    // If it is looking on the last line, this will return an empty string
    // the second time, which could cause an inaccurate match.
    // `||1` makes it return 1 instead of '', which won't match.
    return c.substr(o, 4) || 1;
  }
  for (var i in c) {
    r = b(i) + b(++i + c.search('\n'));
    d = '1\\][/1/][\\1//\\\\1||||[][]11|/\\||\\/|11\\/\\/'.replace(/1/g, '[..]').indexOf(r);
    s += !~d || d % 8 ? '' : '><+-.,[]' [d / 8];
  }
  return s;
}

// GUI code below
function run(){document.getElementById('s').innerHTML=f(document.getElementById('t').value);};document.getElementById('run').onclick=run;run()
<textarea id="t" cols="30" rows="10">
[..][[[[[..]]. ]|\/|
\][/[..]//\\[..][..]
[..]/][\[][]|/\|[..]
||||/\| [..]|  |\/\/</textarea><br /><button id="run">Run</button><br /><code id="s"></code>

NinjaBearMonkey
quelle