Relacionado a: Faça um; # intérprete
No desafio vinculado acima, a tarefa era criar um intérprete para a linguagem esotérica ;#
.
O ;#
idioma
O idioma possui exatamente dois comandos: ;
e #
(todos os outros caracteres são ignorados pelo intérprete):
;
: Incrementar o acumulador
#
: Module o acumulador por 127, imprima o caractere ASCII correspondente e redefina o acumulador para 0.
Desafio
Como sou preguiçoso, mas ainda quero testar mais casos de teste, preciso de um programa ou função que converta texto sem formatação em ;#
código.
Entrada
A entrada é uma sequência, tomada como argumento ou através de stdin. Ele conterá apenas caracteres ASCII imprimíveis e novas linhas.
Saída
A saída é o ;#
programa gerado retornando ou imprimindo em stdout. Desde que o programa seja válido, ele pode conter caracteres em excesso que não sejam #
e ;
como todos os outros caracteres são ignorados.
Exemplos
Input: Hello, World!
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Input: ABC
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Input: ;#
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Entre os melhores
fonte
;#
ignora todos os outros caracteres, para que o programa gerado ainda funcione.;
. Em segundo lugar, 127 está correto, conforme declarado na pergunta vinculada que contém a especificação da linguagem; #.Respostas:
; # + , 61 bytes
Superado por Conor O'Brien
Experimente online!
Observe que a entrada possui um byte nulo à direita.
fonte
; # + , 40 bytes
Experimente online! A entrada é finalizada com um byte nulo.
Explicação
O código é dividido em duas partes: geração e iteração.
Geração
Isso coloca as constantes
;
e#
na memória como tal:Iteração
fonte
#
@tuskiomi. Experimente online!brainfuck ,
5954 bytesExperimente online!
fonte
Geléia ,
1087 bytesExperimente online!
-2 bytes graças a @Emigna
-1 byte graças a @Dennis
fonte
O”;ẋ;€”#
?;€
pode se tornarp
.GS2 , 6 bytes
Experimente online!
Hexdump reversível (xxd)
Como funciona
fonte
■
= o que diabos?2
é o comando de multiplicação? GS2 é estranho: P■
é apenas map e GS2 implementa strings como listas de números inteiros.2
é XOR ...Táxi, 779 bytes
Experimente online!
Ungolfed:
Explicação:
fonte
05AB1E , 8 bytes
Experimente online!
Explicação
fonte
Brainfuck, 43 bytes
Byte nulo finaliza o programa.
Explicação
fonte
Python 3 , 39 bytes
Experimente online!
fonte
for s in input():print(";"*ord(s)+"#")
é um byte mais curto.> <> , 22 bytes
Experimente on-line ou no playground de peixes
A entrada é STDIN, a saída é STDOUT. Em> <>, caracteres e códigos ASCII são a mesma coisa, então tudo o que precisamos fazer é ler um caractere, imprimir
";"
e diminuir o caractere até chegar a 0, depois imprimir"#"
e fazer um loop até que não haja mais entrada.fonte
F #, 79 bytes
Experimente online!
Expandido
convert pega a string de entrada e gera um programa;;
Uso
fonte
Python 2 - 36 bytes
Experimente online!
fonte
PowerShell,
292725 bytesBem direto. Recebe entrada como argumento da linha de comando. A saída é um programa; # válido que imprime o texto solicitado.
fonte
#
e;
todos os outros caracteres são ignorados.«$args
basta.brainfuck , 47 bytes
Experimente online!
Veja também: resposta de ovs , que adota uma abordagem semelhante, mas com um método diferente de gerar constantes e um layout de célula diferente.
Explicação:
Esse desafio se alinha muito bem às especificações do cérebro, o que significa que a solução é essencialmente trivial. Brainfuck recebe a entrada como valores ASCII, que é exatamente o que; # precisa produzir como.
O esquema para transpilar é simples: gere o valor ASCII para
;
e#
, imprima;
igual ao valor ASCII do caractere de entrada, imprima#
, repita para cada entrada.fonte
Mathematica, 49 bytes
Explicação
Converte a sequência de entrada em uma lista de códigos de caracteres, depois
Map
a funçãoStringRepeat[";",#]<>"#"&
sobre a lista eStringJoin
o resultado com a sequência vazia.fonte
<>""
?StringJoin
ing (<>
) a string vazia concatena cada string.Aceto , 19 bytes
Como há um intérprete em Aceto , pensei que também haveria uma resposta para esse desafio. Ele se encaixa perfeitamente em uma curva de Hilbert de segunda ordem:
Antes de tudo, lemos um único caractere (
,
) e o duplicamos e negamos para testar se é uma nova linha (d!
ao ler uma nova linha, um caractere vazio normalmente é pressionado na pilha). Depois, uso o que considero um truque bastante inteligente para lidar com o caso da nova linha de maneira compacta:`'\n
Se o valor na pilha for
True
(lemos uma nova linha), esse código significa: do (`
) coloca um caractere literal na pilha ('
), que é uma nova linha:\n
.Se o valor na pilha for
False
(não lemos uma nova linha), esse código significa: não (`
) leia um caractere literal ('
). Isso significa que o próximo caractere é executado como um comando. Felizmente, uma barra invertida escapa ao próximo comando (o faz para que não seja executado), entãon
não imprime uma nova linha (que é o quen
geralmente faz).O restante do código é direto; convertemos o caractere na pilha no número inteiro de seu ponto de código unicode (
o
), pressionamos um ponto e vírgula literal (';
), multiplicamos o número pela string (*
como em Python),p
criamos o resultado, pressionamos um literal ('
)#
,p
executamos também e volte aoO
rigin.Corra com
-F
se você quiser ver resultados imediatos (porque o buffer), mas ele funciona sem também.fonte
Perl, 24 bytes
Corra com
perl -pe
.Solução alternativa:
Corra com
perl -nE
.fonte
Consolo , 11 bytes
Yay, novos idiomas.
Explicação
fonte
Fourier , 19 bytes
Experimente no FourIDE!
Para executar, você deve colocar a sequência de entrada entre aspas.
Pseudocódigo de explicação
fonte
Befunge-98 (FBBI) ,
231710 bytes-5 bytes graças a Jo King .
Experimente online!
fonte
JavaScript,
5554515048 bytesExperimente online
Alternativas
Se pudermos considerar a entrada como uma matriz de caracteres individuais, podemos salvar 5 bytes.
Se também podemos produzir como uma matriz, mais 2 bytes podem ser salvos.
fonte
\n
deve se torna;;;;;;;;;;#
..
para[^]
, o que ainda deixaria um byte menor quemap/join
?join()
resposta anterior era desnecessária, dada a especificação de;#
, e você também pode declarar que a entrada para sua função é uma matriz de caracteres, embora a segunda sugestão seja um pouco exagerada. De qualquer maneira, isso reduz a no máximo 48 bytes.Na verdade , 11 bytes
Experimente online!
Explicação:
fonte
APL (Dyalog) , 18 bytes
Experimente online!
⎕UCS
Converter em pontos de código Unicode';'⍴¨⍨
use cada ponto de código para remodelar ( ⍴ = Rho ≈ R ; R eshape) um ponto e vírgula#',¨⍨
acrescentar um hash a cada stringfonte
Ruby,
2825 bytes24 bytes, mais a
-n
opção de linha de comando para operar repetidamentestdin
.3 bytes salvos (e saída corrigida em novas linhas!) Graças ao trabalho manual.
fonte
.ord
trabalhando diretamente com códigos de caracteres:$_.bytes{|b|$><<?;*b+?#}
. Há diferença: este também codifica a nova linha na entrada. Não sei o que o proprietário da pergunta pretende dizer com "Ele conterá apenas caracteres ASCII e novas linhas imprimíveis". Mas para mim parece que as novas linhas também devem ser codificadas.bytes
. Perguntei à OP sobre as novas linhas no topo e editarei isso depois.PHP, 54 bytes
Experimente online!
fonte
Alice , 12 bytes
Experimente online!
Explicação
fonte
PHP, 48 bytes
fonte
jq, 30 caracteres
(Código de 26 caracteres + opções de linha de comando de 4 caracteres)
Exemplo de execução:
Teste on-line
fonte
Pitão, 10 bytes
Tente!
fonte
Röda , 24 bytes
Experimente online!
fonte