Dada una entrada de un programa escrito en oOo CODE , genera el código BF que representa.
Aquí hay una breve descripción de cómo funciona oOo CODE:
Primero, se eliminan todos los caracteres no alfabéticos (todo lo que no está en el rango
A-Za-z
).Por ejemplo, tome el programa
PROgRam reVERsES giVeN iNPut sEqUENcE
(un ejemplo dado en la página wiki de esolangs que hace exactamente lo que esperaría). Después de este primer paso, ahora tenemosPROgRamreVERsESgiVeNiNPutsEqUENcE
.Luego, divide todos los personajes restantes en grupos de 3. Ahora tenemos
PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcE
. Si hay un grupo final de 1 o 2 caracteres, deséchelo.Convierta cada grupo de 3 letras en un comando BF basado en la siguiente tabla:
ooo > ooO < oOo [ oOO ] Ooo - OoO + OOo . OOO ,
Es decir, si la primera letra de un grupo es minúscula, la segunda es mayúscula y la tercera es minúscula, se traduciría al comando
[
.Con nuestro ejemplo, esto finalmente se convierte en el programa BF
,[>,]<[.<]+
, que de hecho invierte su entrada.
Como se trata de code-golf , ganará el código más corto en bytes.
Casos de prueba:
<empty string> -> <empty string>
A -> <empty string>
Ab -> <empty string>
Abc -> -
AbcD -> -
AbcDe -> -
AbcDef -> --
1A_b%c*D[]e\\\f! -> --
PROgRamreVERsESgiVeNiNPutsEqUENcE -> ,[>,]<[.<]+
fuente
Respuestas:
oOo,
15691515 bytesTenia que estar hecho. Probar aquí .
Golfizado:
Traducido a Brainfuck (con saltos de línea para mayor claridad):
Sin golfing con explicación:
¡Gracias por el interesante desafío!
fuente
CJam,
3635 bytesPruébalo aquí.
Explicación
fuente
JavaScript (ES6),
949391858483 bytesGuardado 1 byte gracias a @ dev-null
He probado muchas variantes de esto, pero esta parece ser la más corta. ¡También funciona en entradas vacías!
Cómo funciona
Primero, con
x.replace(/[a-z]/gi,c=>
, encontramos tomar cada letrac
en la entrada. Hemos establecidoa
yb
que""
en el otro extremo de la llamada a la función, ya que la función pasa por alto los parámetros pasados al segundo.a
almacenará una cadena binaria para determinar qué carácter estamos creando actualmente yb
almacenará el resultado.Ahora para la parte confusa: primero, con
(a+=+(c<'a'))
, agregamos un0
aa
sic
es mayúscula;1
de otra manera. Esta expresión devuelve el nuevo valor dea
, por lo que podemos comprobar si se ha llegado a tres caracteres de longitud con comprobando si existe el carácter en el índice 2:[2]?
. Si no, simplemente terminamos la función con:0
.Si
a
ahora tiene tres caracteres de longitud, es un número binario entre000
y111
. Podemos convertir esto a un número decimal agregando"0b"
al principio, luego forzando al motor a analizarlo como un número con'0b'+a-0
.Sin embargo, aún necesitamos restablecer
a
la cadena vacía. No podemos hacerlo'0b'+(a="")-0
porque eso significaría que la cadena analizada es justa0b
. Afortunadamente, cuando se analiza como un número, la cadena vacía se convierte en 0, por lo que podemos reemplazarla0
por(a="")
.Ahora tenemos nuestro número, y sólo podemos añadir el carácter de ese índice en
"><[]-+.,"
ab
. Después de que se realiza el reemplazo, usamos&&b
para devolverlo de la función. (Bueno, a menos que el resultado de.replace
esté vacío, lo que solo sucede en la entrada vacía y de todos modos devuelve la cadena vacía).fuente
'0b'+a-0
vs+`0b${a}`
and+("0b"+a)
replace
gana después de todo!match
camino ...05AB1E ,
3532 bytesCódigo:
Usando un truco muy inteligente de Martin Büttner, de esta respuesta . Explicación:
Pruébalo en línea!
Utiliza la codificación CP-1252 .
fuente
Retina ,
79757170 bytesGracias a randomra por guardar 1 byte.
Pruébalo en línea!
Explicación
Comenzamos eliminando todo lo que no es una carta.
Esto divide la cadena en fragmentos de tres caracteres al devolver todas las coincidencias (no superpuestas) de 3 caracteres. Esto descarta automáticamente cualquier fragmento final incompleto.
Anteponer una
;
a cada línea. Usaremos esto como un marcador para la conversión de base-2. Hablando de eso, simplemente trataremos las letras mayúsculas como1
y las letras minúsculas como0
.Esto hace una divertida conversión de base-2 a unario. En cada paso simplemente duplicamos los caracteres a la izquierda del
;
y movemos el;
de la derecha. ¿Por qué funciona esto? Recuerde que interpretaremos minúsculas como0
y mayúsculas como1
. Cada vez que procesamos una letra, simplemente duplicamos el total acumulado (a la izquierda) hasta el momento: las letras minúsculas dobles son justas2*0=0
, por lo que pueden ignorarse por completo y las letras mayúsculas representan el número binario hasta el momento, por lo que duplicarlas es lo que nosotros queremos. Luego agregamos la letra actual a ese total acumulado que representa0
o1
correspondientemente.Elimine todas las letras minúsculas / ceros.
Haga coincidir cada línea y reemplácela con el número (decimal) de caracteres en esa línea. Debido a
;
esto, el número unario se convierte en su equivalente decimal + 1.Transliteración que sustituye 1-8 con el comando correspondiente.
Eliminar avances de línea.
fuente
;
. Lo editaré más tarde.MATL ,
3832 bytesPruébalo en línea!
fuente
Japt,
3736 bytes¡Pruébelo en línea!
Cómo funciona
fuente
JavaScript (ES6),
11195 bytesSimplemente elimina las no letras, convierte las letras mayúsculas en 1 y las minúsculas en 0, se divide en grupos de tres, ignora un grupo final de 1 o 2 y decodifica los grupos.
Editar: se guardaron 16 bytes gracias a @ dev-null, aunque el código ya no funciona cuando se pasa la cadena vacía.
fuente
match(/.../g).map().join
enfoque pero conté mal la cantidad de bytes y aunque no me ahorró nada. Gracias por el consejo sobre el primer partido.Python 3, 91 bytes
Hmm ... parece un poco largo, especialmente la segunda línea.
b=[b,2*b+(c<'a')][c.isalpha()]
aunque es un poco peor.fuente
Pyth, 40 bytes
Pruébalo aquí!
Podría ahorrar 2 bytes si puedo generar el resultado como una lista de caracteres en lugar de una cadena.
Explicación
Filtra todas las no letras, convierte las mayúsculas a 1 y las minúsculas a 0, las divide en fragmentos de 3, interpreta cada fragmento como número binario y lo utiliza como índice en una cadena que contiene todos los comandos BF.
fuente
Jolf,
3134 bytesPruébalo aquí! Reemplazar
►
con\x10
y♣
con\x05
. Debido a que implementé la función chop incorrectamente, gano 3 bytes. :(fuente
Hoon , 212 bytes
Sin golf:
Hoon no tiene expresiones regulares adecuadas, solo una biblioteca de combinador de analizador, por lo que es tristemente bastante detallado. ++ scan también se bloquea si no se analiza el flujo de entrada completo, por lo que tengo que usar ++ rose, forzarlo en una unidad y desenvolverlo para obtener el valor de "análisis más lejano". También hace un uso intensivo del currículum y el mapeo sobre listas (++ turn), por lo que alias los nombres de las funciones a las variables de una letra.
Hoon es el lenguaje de programación para Urbit, un proyecto de reimplementación de pizarra limpia. Es puramente funcional, estáticamente tipado, vagamente parecido a un lisp, y se compila a Nock. Nock es una máquina virtual basada en combinador que se ejecuta sobre un modelo de memoria bignum de árbol binario.
Cuando inicia Urbit, se lo deja caer en: dojo, el shell y Hoon repl. Para ejecutar el fragmento simplemente escriba:
y luego pegue la función independiente en la siguiente línea.
fuente
Jalea , 27 bytes
Pruébalo en línea! Tenga en cuenta que las barras invertidas necesitan escapar en la cadena de entrada para el segundo último caso de prueba.
fuente
Matlab, 98 bytes
fuente
Perl,
767372 + 1 = 73 bytesRequiere la
-n
bandera:Usando el truco con la conversión de base 2 .
Cómo funciona:
fuente
Julia, 107 bytes
Esta es una función anónima que acepta una cadena y devuelve una cadena. Para llamarlo, asígnelo a una variable.
Sin golf:
fuente
Lua, 120 bytes
Gran uso de
string.gsub()
aquí, una vez más podría haberme permitido crear un puntero de un carácter en esta función para ganar algunos bytes. Además, ¡es mi primer programa lua sin espacios! :REEste programa toma su entrada a través del argumento de la línea de comandos y genera un programa BrainFuck, un comando por línea.
Editar: Guardado 1 Byte gracias a @Oleg V. Volkov
Ungolf y explicaciones
fuente
b
y uno más en guardarstring.gsub
en var más corto y plegar manualmente los primeros argumentos:g=("").gsub g(g(g(g(arg[1],"[%A]",""),"%l",0),"%u",1),"...",function(c)x=1+tonumber(c,2)print(("><[]-+.,"):sub(x,x))end)
Python 2, 112 bytes
Intentaré jugar más al golf.
fuente
Mathematica, 192 bytes
Función anónima que toma la cadena deseada como argumento. Pasos en el algoritmo (bastante sencillo):
fuente
Rubí
1171141131118679 Bytestr(?^+m='a-zA-Z','')
establece m en'a-zA-Z'
y elimina no letras.tr(m,?0*26+?1)
convierte minúsculas a 0, mayúsculas a 1.scan(/.../)
fragmente la cadena en grupos de 3 y descarte el último grupo si tiene menos de 3{$><<"><[]-+.,"[$&.to_i 2]}
convierte cada número binario en un carácterfuente
tr("a-zA-Z","01")
? o inclusotr("A-Za-z",10)
"AAz".tr("a-zA-Z","01")
da111
gets.delete('^a-zA-Z').tr("a-z",?0).tr("^0",?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}
(86 bytes). Cambió la entrada de la opción de línea de comando a stdin; Se corrigieron las comillas circundantes en la salida (pero ahora no tiene una nueva línea final)tr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)
es más cortoPerl 6, 81 bytes
Esto probablemente se puede hacer mejor, pero esta es mi intención.
Uso
Sin golf
fuente
C ++,
173167 bytesPrograma completo, golfizado (lecturas de entrada estándar):
Algo no golfista:
Tenga en cuenta que
@A
...Z[
en ASCII, y lo mismo para`a
...z}
.fuente
Japt v2.0a0
-P
, 27 bytesGuardado 3 bytes gracias a @Shaggy
Intentalo
fuente
Pyke, 31 bytes, no competitivo
Pyke es más antiguo que el desafío, pero agregué algunas características para hacerlo más competitivo: la función de fragmento. Usé el mismo truco que @Martin Büttner .
Pruébalo aquí!
fuente
JavaScript, 148 bytes
fuente
TI-BASIC,
311288 bytes¿Qué, no hay respuestas de TI-BASIC? ¡Es hora de que arregle eso!
La entrada es el oOo código en
Ans
.La salida es el código BF traducido .
Ejemplos:
Sin golf:
(Nuevas líneas y comentarios añadidos)
Notas:
fuente