Relacionado con: Make a; # interpreter
En el desafío vinculado anterior, la tarea consistía en crear un intérprete para el lenguaje esotérico ;#
.
El ;#
idioma
El lenguaje tiene exactamente dos comandos: ;
y #
(el intérprete ignora todos los demás caracteres):
;
: Incrementar el acumulador
#
: Module el acumulador por 127, imprima el carácter ASCII correspondiente y restablezca el acumulador a 0.
Reto
Debido a que soy flojo pero todavía quiero probar más casos de prueba, necesito un programa o función que convierta texto plano a ;#
código.
Entrada
La entrada es una cadena, tomada como argumento o mediante stdin. Solo contendrá caracteres ASCII imprimibles y líneas nuevas.
Salida
La salida es el ;#
programa generado al regresar o imprimir en stdout. Siempre y cuando el programa sea válido, puede contener caracteres en exceso que no sean #
y ;
todos los demás caracteres se ignoren.
Ejemplos
Input: Hello, World!
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Input: ABC
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Input: ;#
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Tabla de clasificación
fuente
;#
ignora todos los demás caracteres, por lo que el programa generado seguirá funcionando.;
. En segundo lugar, 127 es correcto, como se indica en la pregunta vinculada que contiene la especificación del lenguaje; #.Respuestas:
; # + , 61 bytes
Superado por Conor O'Brien
Pruébalo en línea!
Tenga en cuenta que la entrada tiene un byte nulo final.
fuente
; # + , 40 bytes
Pruébalo en línea! La entrada termina con un byte nulo.
Explicación
El código se divide en dos partes: generación e iteración.
Generacion
Esto pone las constantes
;
y#
en la memoria como tal:Iteración
fuente
#
@tuskiomi. Pruébalo en línea!brainfuck ,
5954 bytesPruébalo en línea!
fuente
Gelatina ,
1087 bytesPruébalo en línea!
-2 bytes gracias a @Emigna
-1 byte gracias a @Dennis
fuente
O”;ẋ;€”#
lugar?;€
puede llegar a serp
.GS2 , 6 bytes
Pruébalo en línea!
Hexdump reversible (xxd)
Cómo funciona
fuente
■
= ¿qué diablos?2
es el comando de multiplicación? GS2 es raro: P■
es solo map , y GS2 implementa cadenas como listas de enteros.2
es XOR ...Taxi, 779 bytes
Pruébalo en línea!
Sin golf:
Explicación:
fuente
05AB1E , 8 bytes
Pruébalo en línea!
Explicación
fuente
Brainfuck, 43 bytes
El byte nulo termina el programa.
Explicación
fuente
Python 3 , 39 bytes
Pruébalo en línea!
fuente
for s in input():print(";"*ord(s)+"#")
es un byte más corto.> <> , 22 bytes
Pruébelo en línea o en el área de juegos para peces
La entrada es STDIN, la salida es STDOUT. En> <>, los caracteres y los códigos ASCII son lo mismo, por lo que todo lo que tenemos que hacer es leer un carácter, imprimir
";"
y disminuir el carácter hasta que sea 0, luego imprimir"#"
y repetir hasta que no quede más entrada.fuente
F #, 79 bytes
Pruébalo en línea!
Expandido
convertir toma la cadena de entrada y genera un programa;
Uso
fuente
Python 2 - 36 bytes
Pruébalo en línea!
fuente
PowerShell,
292725 bytesMuy claro. Toma entrada como argumento de línea de comando. La salida es un programa válido; # que imprime el texto solicitado.
fuente
#
y;
todos los demás caracteres se ignoran.«$args
es suficiente.brainfuck , 47 bytes
Pruébalo en línea!
Ver también: la respuesta de ovs , que tiene un enfoque similar, pero con un método diferente de generar constantes y un diseño de celda diferente.
Explicación:
Este desafío se alinea bastante bien con la especificación brainfuck, lo que significa que la solución es esencialmente trivial. Brainfuck toma la entrada como valores ASCII, que es exactamente qué; # necesita salir como.
El esquema para transpilar es simple: generar el valor ASCII para
;
e#
, imprimir;
igual al valor ASCII del carácter de entrada, imprimir#
, repetir para cada entrada.fuente
Mathematica, 49 bytes
Explicación
Convierte la cadena de entrada en una lista de códigos de caracteres, luego
Map
s la funciónStringRepeat[";",#]<>"#"&
sobre la lista, luegoStringJoin
s el resultado con la cadena vacía.fuente
<>""
?StringJoin
ing (<>
) the empty string concatenates each string.Aceto, 19 bytes
Since there's an interpreter in Aceto, I thought there outta be an Aceto answer to this challenge as well. It fits neatly in a 2rd order Hilbert curve:
En primer lugar, leemos un solo carácter (
,
) y lo duplicamos y lo negamos para probar si es una nueva línea (d!
cuando se lee una nueva línea, normalmente se inserta un carácter vacío en la pila). Luego uso lo que creo que es un truco bastante inteligente para manejar el caso de nueva línea de forma compacta:`'\n
Si el valor en la pila es
True
(leemos una nueva línea), que los medios de código: no (`
) ponen un literal de caracteres en la pila ('
), que es un salto de línea:\n
.Si el valor en la pila es
False
(no leímos una nueva línea), ese código significa: no (`
) lee un carácter literal ('
). Eso significa que el siguiente personaje se ejecuta como un comando. Afortunadamente, una barra invertida escapa al siguiente comando (lo hace para que no se ejecute), por lon
que no imprime una nueva línea (que es lo quen
generalmente hace).El resto del código es sencillo; convertimos el carácter en la pila al entero de su punto de código unicode (
o
), empujamos un punto y coma literal (';
), multiplicamos el número con la cadena (*
como en Python),p
borramos el resultado, empujamos un literal ('
)#
, lop
borramos también, y volver alO
rigin.Run with
-F
if you want to see immediate results (because buffering), but it works without, too.fuente
Perl, 24 bytes
Run with
perl -pe
.Alternative solution:
Run with
perl -nE
.fuente
Solace, 11 bytes
Yay, new languages.
Explanation
fuente
Fourier, 19 bytes
Try it on FourIDE!
To run, you must enclose the input string in quotation marks.
Explanation pseudocode
fuente
Befunge-98 (FBBI),
231710 bytes-5 bytes thanks to Jo King.
Try it online!
fuente
JavaScript,
5554515048 bytesTry it online
Alternatives
If we can take input as an array of individual characters then 5 bytes can be saved.
If we can also output as an array then 2 more bytes can be saved.
fuente
\n
should becomes;;;;;;;;;;#
..
to[^]
, which would still leave it a byte shorter thanmap/join
?join()
in your previous answer was unnecessary given the specification for;#
, and you can also declare that the input for your function is an array of characters, though the second suggestion is a bit of a stretch. Either way, that brings you down to at most 48 bytes.Actually, 11 bytes
Try it online!
Explanation:
fuente
APL (Dyalog), 18 bytes
Try it online!
⎕UCS
Convert to Unicode code points';'⍴¨⍨
use each code point to reshape (⍴ = Rho ≈ R; Reshape) a semicolon#',¨⍨
append a hash to each stringfuente
Ruby,
2825 bytes24 bytes, plus the
-n
command line switch to repeatedly operate onstdin
.3 bytes saved (and output corrected on newlines!) thanks to manatwork.
fuente
.ord
by working directly with character codes:$_.bytes{|b|$><<?;*b+?#}
. There is difference: this one also encodes the newline in the input. Not sure what the question owner intends to say by “It will only contain printable ASCII characters and newlines.”, but to me sounds like newlines should be encoded too.bytes
. I've asked OP about newlines up top and will edit this afterwards.PHP, 54 Bytes
Try it online!
fuente
Alice, 12 bytes
Try it online!
Explanation
fuente
PHP, 48 bytes
fuente
jq, 30 characters
(26 characters code + 4 characters command line options)
Sample run:
On-line test
fuente
Pyth, 10 bytes
Try it!
fuente
Röda, 24 bytes
Try it online!
fuente