Traduire RoboCritters en Brainf ***

15

RoboCritters ( étymologie ) est un tout nouveau langage de programmation ésotérique (ne vous embêtez pas à le chercher, je l'ai juste inventé). C'est une variante de Brainfuck (BF), légèrement plus complexe que les schémas de substitution d'opérateurs habituels. Chaque programme dans RoboCritters est une grille rectangulaire de texte qui ne contient que les sept caractères . []/\|, plus des retours à la ligne pour façonner la grille.

Exemple de programme RoboCritters:

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

Pour traduire un programme RoboCritters en BF, regardez chaque caractère non nouvelle ligne dans la grille dans l'ordre de lecture normal (de gauche à droite puis de haut en bas), par exemple |\/||./|[]||[..][][] ||/\|[..][..][..] \/\/.

Si la section 4 × 2 de la grille s'étendant vers la droite et vers le bas à partir du caractère actuel correspond exactement à l'un des huit robots robots listés ci-dessous, ajoutez la commande BF correspondante ( ><+-.,[]) au programme BF (initialement vide).

Si la section de grille 4 × 2 ne correspond à aucune des créatures du robot ou sort des limites , rien n'est ajouté au programme BF.

  1. Joybot, >commande:

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

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

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

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

    [][]
    [..]
    
  6. Toothbot, ,commande:

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

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

    [..]
    \/\/
    

Donc, en lisant l'exemple de programme

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

nous pouvons voir que nous rencontrons d'abord un Foxbot (à la colonne 1, ligne 1), puis un Toothbot (c1, r2), puis un Bunnybot (c5, r2) et enfin un Batbot (c9, r3). Cela correspond au programme BF [,.].

Notez que le Foxbot et le Toothbot se chevauchent. C'est intentionnel; les créatures robotiques ne sont pas interprétées différemment lorsqu'elles se chevauchent .

Défi

Écrivez le programme le plus court possible qui accepte un programme RoboCritters et génère son équivalent BF. Vous n'avez pas besoin d'exécuter le BF ou de vérifier qu'il est valide, ne traduisez que le code RoboCritters en code BF.

Détails

  • Tous les programmes RoboCritters entrés seront valides, c'est-à-dire qu'ils seront un bloc de texte exactement rectangulaire ne contenant que les sept caractères . []/\|, plus des retours à la ligne pour le façonner. Les nouvelles lignes peuvent être dans n'importe quelle représentation commune pratique . Vous pouvez éventuellement supposer que les programmes ont une seule nouvelle ligne de fin.

  • Vous devez prendre en charge les programmes RoboCritters d'une taille inférieure à 4 × 2, y compris le programme 0 × 0 vide (ou un saut de ligne unique). Ils correspondent tous au programme BF vide (la chaîne vide).

  • Le programme BF en sortie doit être une chaîne d'une ligne contenant uniquement les huit caractères de commande BF ><+-.,[]. Il peut éventuellement y avoir une seule nouvelle ligne de fin.

  • Prenez l'entrée de n'importe quelle manière habituelle (stdin / fichier texte / ligne de commande) et sortez vers stdout ou l'alternative la plus proche de votre langue.

  • Au lieu d'un programme, vous pouvez écrire une fonction qui prend le programme RoboCritters comme une chaîne et imprime ou renvoie la chaîne du programme BF.

Exemples

  1. Entrée: (variante de l'exemple ci-dessus)

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

    Production: [,.]

  2. Entrée: (teste toutes les créatures du robot)

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

    Production: >+[<,-.]

  3. Contribution:

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

    Sortie: (programme BF Hello World )

    ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
    
  4. Entrée: (aucun robot bestiole présent)

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

    Sortie: (chaîne vide)

Notation

La soumission la plus courte en octets l'emporte. ( Compteur d'octets pratique. ) Tiebreaker est le poste le plus voté.

Loisirs de Calvin
la source

Réponses:

9

CJam, 86 85 octets

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

Testez-le ici.

Explication

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.

Les créatures ont été encodées avec ce script . J'ai trouvé la base 296 pour l'encodage avec le script Mathematica suivant, plutôt naïf (qui fonctionne toujours à la recherche d'une meilleure base):

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

JavaScript ES6, 209 198 192 octets

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}

L'extrait de pile ci-dessous contient du code non golfé que vous pouvez facilement exécuter dans n'importe quel navigateur.

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
la source