Traducir RoboCritters a Brainf ***

15

RoboCritters ( etimología ) es un nuevo lenguaje de programación esotérico (no te molestes en buscarlo, lo acabo de inventar). Es una variante de Brainfuck (BF), un poco más compleja que los esquemas habituales de sustitución del operador. Cada programa en RoboCritters es una cuadrícula de texto rectangular que solo contiene los siete caracteres . []/\|, además de nuevas líneas para dar forma a la cuadrícula.

Ejemplo de programa RoboCritters:

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

Para traducir un programa RoboCritters a BF, observe cada carácter que no sea de nueva línea en la cuadrícula en el orden de lectura normal (de izquierda a derecha y luego de arriba a abajo), por ejemplo |\/||./|[]||[..][][] ||/\|[..][..][..] \/\/.

Si la sección 4 × 2 de la cuadrícula que se extiende hacia la derecha y hacia abajo desde el carácter actual coincide exactamente con uno de los ocho bichos robot enumerados a continuación, agregue el comando BF correspondiente ( ><+-.,[]) al programa BF (inicialmente vacío).

Si la sección de cuadrícula 4 × 2 no coincide con ninguno de los bichos del robot o se sale de los límites , no se agrega nada al programa BF.

  1. Joybot, >comando:

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

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

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

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

    [][]
    [..]
    
  6. Toothbot, ,comando:

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

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

    [..]
    \/\/
    

Entonces, leyendo el programa de ejemplo

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

podemos ver que primero encontramos un Foxbot (en la columna 1, fila 1), luego un Toothbot (c1, r2), luego un Bunnybot (c5, r2) y finalmente un Batbot (c9, r3). Esto corresponde al programa BF [,.].

Tenga en cuenta que Foxbot y Toothbot se superponen. Esto es intencional; los bichos robot no se interpretan de manera diferente cuando se superponen .

Desafío

Escriba el programa más corto posible que tome un programa RoboCritters y genere su equivalente BF. No necesita ejecutar el BF o verificar que sea válido, solo traduzca el código RoboCritters al código BF.

Detalles

  • Todos los programas de entrada de RoboCritters serán válidos, es decir, serán un bloque de texto exactamente rectangular que solo contenga los siete caracteres . []/\|, más nuevas líneas para darle forma. Las nuevas líneas pueden estar en cualquier representación común conveniente . Opcionalmente, puede suponer que los programas tienen una nueva línea final.

  • Debe admitir los programas RoboCritters que sean más pequeños que 4 × 2, incluido el programa 0 × 0 vacío (o una nueva línea). Todos estos corresponden al programa BF vacío (la cadena vacía).

  • El programa BF de salida debe ser una cadena de una línea que solo contenga los ocho caracteres de comando BF ><+-.,[]. Opcionalmente, puede haber una nueva línea final.

  • Tome la entrada de la forma habitual (stdin / archivo de texto / línea de comando) y envíela a stdout o la alternativa más cercana a su idioma.

  • En lugar de un programa, puede escribir una función que tome el programa RoboCritters como una cadena e imprima o devuelva la cadena del programa BF.

Ejemplos

  1. Entrada: (variante del ejemplo anterior)

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

    Salida: [,.]

  2. Entrada: (prueba todas las criaturas robot)

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

    Salida: >+[<,-.]

  3. Entrada:

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

    Salida: (programa BF Hello World )

    ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
    
  4. Entrada: (no hay bichos robot presentes)

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

    Salida: (cadena vacía)

Puntuación

La presentación más corta en bytes gana. ( Práctico contador de bytes ) . Tiebreaker es la publicación más votada

Pasatiempos de Calvin
fuente

Respuestas:

9

CJam, 86 85 bytes

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

Pruébalo aquí.

Explicación

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.

Las criaturas fueron codificadas con este guión . Encontré la base 296 para la codificación con el siguiente script de Mathematica bastante ingenuo (que todavía se está ejecutando en busca de una mejor base):

b = 256;
While[True,
  If[
    FreeQ[
      d = IntegerDigits[15177740418102340299431215985689972594497307279709, b], 
      x_ /; x > 255
    ], 
    Print@{b, Length@d}
  ];
  b += 1;
]
Martin Ender
fuente
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}

El Fragmento de pila a continuación contiene código no protegido que puede ejecutar fácilmente en cualquier navegador.

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>

NinjaOsoMono
fuente