Desafío
Escriba un programa o función que, dada una cadena, devuelva un programa Brainfuck válido que, cuando se compila y ejecuta como Brainfuck, devuelve esa cadena.
Suponga que todas las entradas están codificadas como ASCII.
Suponga que el programa BF generado se ejecutará en un entorno con una cinta infinita.
Suponga que el puntero comienza en la celda 0 con cada celda inicializada a un valor de cero.
Cada ejemplo a continuación representa una posible salida correcta para la entrada dada. En particular, los ejemplos incluyen nuevas líneas y espacios adicionales para ayudar a la legibilidad humana. Las soluciones son libres de formatear el código BF generado de cualquier manera.
La cinta es doblemente infinita.
Todas las celdas proporcionadas por el intérprete son exactamente celdas de 8 bits. El desbordamiento y el subflujo se envuelven en una materia predecible y sana.
Ejemplos
Cadena espacial
Dada la entrada , su programa / función podría devolver:
+++++ +++++
+++++ +++++
+++++ +++++
++ .
Punto de exclamación
Dada la entrada !
, su programa / función podría devolver:
+++++ +++++
+++++ +++++
+++++ +++++
+++
.
Dos cartas
Dada la entrada hi
, su programa / función podría devolver:
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
++++
.
+
.
Este es el código de golf , por lo que gana el código con el menor número de bytes. Buena suerte.
Respuestas:
Jalea , 8 bytes
Pruébalo en línea!
Ejecución de la muestra
Para entrada
hi
, este programa imprime(sin los avances de línea) que, a su vez, imprime
hi
.Cómo funciona
fuente
.>
aparece en la salida?p
) es más corto que agregar a cada (;€
). Estos programas de salida duplican la celda después de imprimir y antes de cambiar. Como nunca volvemos a visitar la celda, no afecta la salida.Brainfuck,
5551 bytesPruébalo en línea!
Ejemplo de salida para
hi
(sin los avances de línea):Explicación
Esto se mueve a través de la cinta mientras escribe el programa. El entorno
,[...,]
es un bucle de entrada estándar. Para cada personaje, usamos cuatro celdas:¿Dónde
x
está la celda donde escribimos la entrada?Esta parte usa la celda
a
para escribir21
en una celda ab
través de una multiplicación estándar de3
y7
.Ahora usamos eso
21
para escribir42
dentroa
y63
dentroc
multiplicando por2
y3
respectivamente. Luego<+<
regresa a la celdax
mientras se convierte42
en a43
(el punto de código de+
). Resumen:Ahora el bucle de salida principal:
Es decir, mientras decrementamos
x
imprimimos uno+
cada vez.Una vez que terminamos, reutilizamos la
+
celda, agregando3
para dar.
.Finalmente, nos movemos a
63
, lo decrementamos a62
(>
) y lo mostramos también. La próxima iteración usará esta celda comox
.fuente
Brainfuck,
39333231 bytesEl algoritmo que coloca 45 en la cinta se toma de las constantes Brainfuck de Esolang .
Esta respuesta supone que el intérprete del programa de salida tiene celdas ajustadas y ajustadas; y eso
,
pone a cero la celda actual (lo que implica que el programa de salida se ejecuta sin entrada). Pruébalo en línea!Para una solución (más larga) que funcione incondicionalmente, vea mi otra respuesta .
Prueba de funcionamiento
Para la entrada
Code Golf
, se genera la siguiente salida.Pruébalo en línea!
Cómo funciona
Comenzamos colocando el número entero 45 (código de caracteres de
-
) en una celda de la cinta. El siguiente código logra esto.Antes de entrar en el bucle, la cinta se ve así.
Estas tres celdas, -2 , -1 y 0 , son las únicas que usaremos en este programa.
En la primera cada iteración del bucle, la celda más a la derecha es, luego esa celda y la celda central se disminuyen dos veces, dejando el siguiente estado.
En las siguientes 126 iteraciones, la inicial
-
disminuye la celda del medio,[>]<
salta a la celda más a la derecha y--<--
disminuye la celda del medio y la derecha. Como resultado, 3 se resta de la celda central (módulo 256 ) y 2 se resta de la celda más a la derecha.Desde 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 y 252 ÷ 3 = 84 , la celda más a la derecha se pone a cero antes que la del medio, dejando el siguiente estado.
De manera similar a la primera iteración del bucle, la siguiente iteración ahora resta 3 de la celda central y 2 de la celda más a la izquierda, colocando la cabeza en la celda más a la izquierda.
Las iteraciones posteriores, como en la iteración 126 anterior, restan 3 de la celda más a la izquierda y 2 de la celda más a la derecha.
Como 254 ÷ 3 (mod 256) = 170 y 129 ÷ 2 (mod 256) no está definido, esto se hace 170 veces, dejando el siguiente estado.
La celda debajo de la cabeza es cero; El bucle termina.
Ahora estamos listos para generar resultados.
fuente
\0
.Brainfuck,
35 1343 bytesEsta respuesta no hace suposiciones sobre el intérprete del programa de salida. Pruébalo en línea!
Para una solución más corta (que funciona solo con algunos intérpretes), vea mi otra respuesta .
Prueba de funcionamiento
Para la entrada
Code Golf
, se genera la siguiente salida.Pruébalo en línea!
Cómo funciona
Comenzamos colocando el número entero 43 (código de caracteres de
+
) en la segunda celda de la cinta. El siguiente código logra esto.Esto esencialmente realiza la división modular 2 ÷ 6 (mod 256) . Como (2 + 256) ÷ 6 = 258 ÷ 6 = 43 , el resultado es 43 , según lo previsto.
Ahora estamos listos para generar resultados.
fuente
Pyth - 11 bytes
Pruébelo en línea aquí .
fuente
05AB1E,
1211 bytesExplicado
Pruébalo en línea
Guardado 1 byte gracias a @Adnan
fuente
'+×
en lugar deF'+}
guardar un byte.Java, 98 bytes
String
Los s no son más que inmutableschar[]
con un montón de métodos de utilidad, así que ¡usemos la matriz!Sin golf:
Programa independiente equivalente que tiene 138 bytes de longitud:
Prima:
Esta aplicación de 207 bytes en realidad codifica un archivo como un programa BF, tal como se dice en el título.
fuente
Vitsy,
1917 bytesTenga en cuenta que esta respuesta es una de las pocas veces que he usado
I
yu
. :REPruébalo en línea!
fuente
O , 13 bytes
Explicación:
fuente
K6, 16 bytes
Uso
Explicación
fuente
Python 3, 43 bytes
Python pone una serie de más ventajas equivalentes al código ASCII de cada carácter, seguido de
.>
imprimir y pasar a la siguiente celda. El brainfuck se incrementa hasta el valor correcto, imprime y pasa a la siguiente celda.Salida para
hi
(con nuevas líneas para mayor claridad):La salida de ese programa:
fuente
Perl, 25 bytes
Uso
Explicación
Utiliza una operación de reemplazo de expresión regular para reemplazar cada carácter en cada línea dada en la entrada estándar con un número de
+
calculado a partir del valor ordinal de ese carácter, y luego genera.>
para imprimir y avanzar al siguiente carácter.Utiliza el
-p
indicador perl para leer automáticamente la entrada e imprimir el resultado, agregando 1 extra al recuento de bytes.fuente
Java, 91 bytes
Apoyos a dorukayhan por vencerme :)
fuente
C,
726460 bytesVersión sin golf:
Compila y prueba con:
gcc -o bfcat bfcatgolf.c && cat 1.txt | ./bfcat > o.txt && beef o.txt
Resultados
hi
- http://paste.ubuntu.com/17995958/quick brown fox jumps over the lazy dog
- http://paste.ubuntu.com/17996059/fuente
c
el inverso a nivel de bitsgetchar
, especialmente si simplemente invierte la inversión nuevamente?c = ~getchar( )
evalúa a 0 en adelanteEOF
.c = ~getchar( )
y~c++
son simplemente más cortos que~( c = getchar( ) )
yc--
CJam, 12 bytes
Convierte cada carácter en su valor ASCII e incrementa la celda actual en ese número de veces antes de imprimirlo. Como tenemos una cinta infinita, podemos movernos hacia la derecha después de procesar cada carácter.
Pruébalo en línea!
fuente
Lua,
676661 BytesSimplemente itere sobre cada carácter en el argumento e imprima una línea para cada uno con
n
+
s seguido de.>
dónden
está el valor de este carácter en la tabla ASCII.Utiliza gmatch como @LeakyNun aconsejó en el comentario para guardar 1 Bytes sobre la solución gsub
Solución anterior usando gsub
Viejo 67
Para ejecutarlo, simplemente guárdelo como un archivo (
golf.lua
por ejemplo) y ejecútelo conlua golf.lua "hi"
. Parahi
, debe salirfuente
attempt to index a nil value
, yf = ...
da lo mismo, yfunction f ... end
daunexpected symbol near ':'
lua file.lua "argument"
, actualizaré la publicación para dar instrucciones....
un identificador con argv?...
contiene los valores de la tabla sinarg
empaquetar. Lo que significa que siempre corresponderá aarg[1]
menos que lo use en una llamada de función como último parámetro, entonces se gastará.n=...for n:gmatch"."do print(("+"):rep(c:byte())..".>")end
por 48 bytesJ, 28 bytes
Suficientemente simple.
3&u:
Convierte caracteres en códigos char. El resto es solo repetir'+'
esa cantidad de veces, luego concatenando con.>
al final de cada línea, y;
aplana el resultado.Algunos resultados
fuente
Pyke, 11 bytes
Pruébalo aquí!
fuente
En realidad, 13 bytes
Pruébalo en línea!
La estrategia utilizada aquí es la misma que en muchas de las otras soluciones: para cada carácter, genera suficientes
+
s para incrementar una celda inicializada en cero al ordinal ASCII adecuado, generarla con.
, y pasar a la siguiente celda con>
.Explicación:
fuente
Mouse-2002, 27 bytes
Esto funciona en teoría y de acuerdo con la documentación del lenguaje, pero la implementación de referencia del intérprete de Mouse parece tener un error donde la entrada de cadena agrega a
'
, por lo que paraa
estas salidasQue a su vez sale
a'
. Eso puede o no estar bien, así que aquí hay uno de 39 bytes de largo que'
nunca sale y por lo tanto es más inválido.Lo que da salida correcta en la referencia impl. siempre y cuando no haya
'
s :)Explicado:
fuente
Factor, 58 bytes
Funciona como:
Dado que Factor viene con un intérprete Brainfuck, es fácil de probar.
bfcat.factor
bfcat-tests.factor
salida
¡Hurra! Todos pasan.
fuente
Rubí,
4038 bytesfuente
puts
en lugar deprint
, como el formato de la salida no es importante, siempre que es válido y brainfuck brainfuck no se preocupa por otros personajesSidef , 38 bytes
¡Hola, la misma longitud que Ruby! solo que Sidef no es Ruby: D
Lea algunos caracteres, luego por cada byte haga esa cosa.
fuente
GNU Bash,
10085 bytes¡Gracias @cat por salvarme 15 bytes!
Preámbulo
bash bfcat.sh <path to file containing string>
bash bfcat.sh <(echo -n '<string>')
Sin golf
Referencias en versión Ungolfed
Leer archivo byte por byte
ord
de un char en bashemitir caracteres $ n veces
fuente
read -rn1
elimine los espacios después;
, elimine el espaciodone <"$1"
para ahorrar un total de 9 bytesES6,
119115 bytesf=s=>{a='';for(i in[...s]){b=s[c='charCodeAt'](i)-(s[c](i-1)|0);a+=(b>0?'+'.repeat(b):'-'.repeat(-b))+'.'}return a}
Guardado 4 bytes, gracias a @Leibrug
fuente
charCodeAt
algunas var (digamosc
) y usar así:s[c](i)
para acortar en 1 byte, y también eliminar algunos caracteres (encontré 3: espacio antes[...s]
, reemplazar OR lógico con uno bit a bit y punto y coma antesreturn
).Sesos (no competidor)
Hexdump:
Pruébalo en línea!
Ensamblador
fuente
Rubí, 26 bytes
+ 1 byte para la
p
opción de línea de comando. Por ejemplo, para obtener el código de brainfuck paraABC xyz
usted, puede ejecutary obten
fuente
Haskell 50 Bytes
fuente