Relacionado a: Criar um; # interpretador e Gerar; # código
;#
- Um guia de turbilhão
Esta é uma linguagem simples com dois comandos. Sua única estrutura de dados é um acumulador, que é inicializado como 0.
;
Incrementar o acumulador#
Calcule o valor do módulo acumulador 127 e imprima o caractere ASCII correspondente. Em seguida, redefina o acumulador para 0.
O código fonte pode conter caracteres adicionais (espaço em branco ASCII + imprimível), mas estes são tratados como comentários e não têm efeito na execução do programa.
Desafio
Como a maioria dos computadores não vem com o ;#
pré - instalado, seria muito útil ter uma ferramenta que possa converter ;#
código em um idioma diferente. Neste desafio, você deve escrever um programa para fazer isso.
Entrada
Algum ;#
código fonte, obtido via argumento ou STDIN. Este código fonte pode conter caracteres (comentários) diferentes de ;
ou #
.
Saída
Código, no mesmo idioma do envio, que, quando executado, imprime / retorna a mesma sequência que o ;#
código original . Esse código resultante pode gerar uma nova linha após a sequência de destino, se isso for mais conveniente para o seu idioma.
Notas
Uma coisa a se observar são as seqüências de escape, como código que imprime barras invertidas ou aspas. Procure também por ;#
códigos que possam conter itens semelhantes a palavras-chave ou comandos no seu idioma.
Restrições adicionais
Todos os programas devem ser encerrados (eu normalmente considero isso padrão, mas alguém perguntou sobre isso, por isso estou afirmando aqui).
Exemplos
input: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
output (python): print(";#")
input: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
output (element): \'`
;#
pré-instalado ...;
ou#
?Respostas:
Python 2 ,
7669 bytesCódigo
A entrada é cercada por aspas.
Experimente online!
Explicação
A primeira parte da saída é essencialmente feita pela entrada, usando
input('print')
. Dividimos a entrada em hashtags e descartamos o último elemento. Imprimimos a representação de ord (y% 127) , onde y é o número de ocorrências do ponto e vírgula. Anexamos,
no final da impressão para garantir que isso não imprima uma nova linha.Isso daria o seguinte código Python para o
Hello, World!
programa:O que pode ser experimentado online .
fonte
brainfuck , 126 bytes
Experimente online!
O programa de saída falhará na implementação do TIO se a
;#
saída exceder 65536 caracteres. Eu também fiz uma versão de 130 bytes que gera em[+]
vez de<
, evitando este problema:Explicação
fonte
Espaço em branco, 291 bytes
Substitua S pelo espaço, T pela guia e N por uma nova linha.
Gerar espaço em branco no espaço em branco não é a coisa mais eficiente do mundo. A geração de qualquer tipo de código dinâmico requer uma modificação significativa de bits que, em um idioma sem operações bit a bit, faria com que o tamanho do código explodisse. Portanto, este programa não tenta fazer algo inteligente, optando apenas por traduzir o programa de origem de um para um. Desmonta-se ao seguinte:
O código gerado pelo programa se parece com:
fonte
V ,
192028 bytesCorreção de bug, quebrou se não houvesse
#
no finalBugfix, implementado
mod 127
Experimente online!
Experimente o código gerado
Explicação:
Em V, no modo de inserção, qualquer caractere ASCII pode ser inserido por código usando
<C-v><Code>
. O código V substitui todos#
por<C-v>0
, onde o zero é um pseudo-acumulador por#
. Cada um#
redefine o acumulador para 0, portanto, ter um por funciona bem. Em seguida, o código faz um incremento para cada ponto e vírgula encontrado, que apenas incrementa o próximo número encontrado, que seria o próximo acumulador. O0
é anexado ao final para que a instrução não falhe por;
s sem seguir#
.Hexdump:
fonte
05AB1E ,
20 19 1816 bytes-1 graças a Adnan
-2 graças a carusocomputing
-2 graças a Kevin Cruijssen
Experimente online! (inclui saída do código 05AB1E executado)
fonte
';¢
pode serg
,žy
empurra 128, pode funcionar de alguma maneira e por que não soletrar a palavra completa e cercá-la entre aspas?';¢
caso haja outros caracteres que não;
.žy<
é o mesmo que127
. A impressão da palavra entre aspas será interrompida se um dos caracteres for uma citação.ƵQ
é uma versão compactada do 127 .Python 2 , 75 bytes
Experimente online! (inclui saída da execução do código Python transpilado)
Obrigado a ovs por muitos bytes!
Explicação
Este programa transpila o #; dividindo em #s (
s.split('#')[:-1]
), contando o número de ponto-e-vírgula em cada pedaço de mod 127 (x.count(';')%127for x in ...
) e convertendo-o no respectivo caractere ASCII (chr(...)
). Essa lista é concatenada (''.join(...)
), convertida em uma representação Python da string (backticks) e inserida em um programa esqueleto Python para imprimir strings ("print"+...
).fonte
Gelatina ,
25 2416 bytesUm programa completo que imprime o código Jelly equivalente (como um link monádico, ele retorna uma lista de listas de tipos mistos).
O primeiro exemplo está em Experimente online! que produz este programa .
Quão?
A contagem de
;
s em cada corrida entre#
s pega cada módulo 127 e anexa uma conversão à instrução ordinal, oỌ
átomo monádico , após cada uma.A geléia canaliza implicitamente cada valor para STDOUT enquanto ele executa um programa como esse, ou seja,
72Ọ101Ọ108Ọ108Ọ111Ọ44Ọ32Ọ119Ọ111Ọ114Ọ108Ọ100Ọ33Ọ
seria impressoHello, world!
.Uma observação sobre a entrada: Jelly recebe entrada de string no formato Python. O programa vazio poderia ser introduzido como
""
, e os programas só-hash como"#"
,"##"
etc. Outro manipulação pode ser necessário para que contêm barras invertidas de entrada e citações.fonte
Cubicamente ,
138137 bytesExperimente online!
Nota: Pode ser necessário substituir
&6
por?6&
para que ele funcione no TIO.&6
está na especificação de idioma, no entanto.Como funciona
Programa de saída:
fonte
@6
,%6
e-6
. Os comandos que anteriormente não faziam nada quando chamados implicitamente agora usam o bloco de notas. Então@
é o mesmo que@6
,%
é o mesmo que%6
etc.JavaScript (ES6), 101 bytes
Dada uma sequência de entrada, exclui todos os caracteres desnecessários e retorna a fonte da seguinte função:
Onde
...
representa a;#
fonte limpa .fonte
C,
9896999897 bytes+3 bytes porque esqueci que C não é interpretado :(
Executando com:
Irá imprimir:
fonte
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
produzf(){puts(""");}
inválido. O desafio especifica especificamente "Uma coisa a se observar são as seqüências de escape, como código que imprime barras invertidas ou aspas".Geléia , 26 bytes
Experimente online!
E tente esse código Jelly aqui!
A saída Jelly se transforma em código
Ọø‘‘‘‘‘‘‘‘‘‘‘‘‘Ọø‘‘‘‘‘‘‘‘‘‘Ọø
, que imprime chr (13) + chr (10)fonte
PHP, 72 bytes
fonte
> <>,
1068177 bytesEste é o meu primeiro golfe em> <> (peixe)! Uma linguagem bastante interessante, tenho que dizer. Muita diversão!
fonte
i:1+?!
loi:0(?
e também sinto que você poderia salvar alguns bytes se construísse o resultado na pilha e esperasse o final da entrada para produzi-lo. Quero dizer, isso é um monte deo
s;)C # 169 bytes
Golfe:
Versão legível por humanos:
fonte
Haskell ,
106102 bytesExperimente online!
Ungolfed
fonte
Braquilog , 33 bytes
Experimente online!
Sentindo-me um pouco cansado demais para explicar isso no momento, se alguém vê isso e se pergunta como isso funciona, envie um comentário para me lembrar.
fonte
MathGolf , 17 bytes
Experimente online!
Explicação
Como qualquer caractere pode ser colocado na pilha (e, portanto, na saída) usando
'<char>
, isso produzirá uma sequência desses blocos de código.fonte
Þ
.Þ
. ( Os documentos que eu uso ainda afirmam o valor antigo. )MATL ,
3228 bytesExperimente online!
Abordagem completamente diferente com base em
strsplit
um programa do tipo autômato.fonte
Na verdade , 25 bytes
Experimente online!(inclui saída da execução do código atualmente transpilado)
Explicação:
fonte
shortC , 48 bytes
fonte
Fourier, 32 bytes
Experimente no FourIDE!
Esse foi um desafio bastante fácil, pois Fourier é basicamente um superconjunto de; #:
fonte
CJam, 14 bytes
Explicação:
fonte
APL, 31 bytes
Saída:
Explicação:
⌽
: inverte a entrada{
...}
: passe para esta função:⍵⊂⍨'#'=⍵
: partição em cada uma#
na sequência (desde o início, e é por isso que ela teve que ser revertida primeiro)+/¨';'=
: conte os;
em cada partição127|
: módulo 127⌽
: inverta novamente'⎕UCS',
: precede a sequência⎕UCS
, que é a função Unicode.⍕
: representação de stringfonte
⍕
pois a saída real para STDOUT é a mesma.Ruby , 47 + 1 = 48 bytes
+1 byte para
-p
.Experimente online!
-30 bytes graças a @manatwork !
fonte
;
ou#
.” Parte do requisito./;+#/
→/.*?#/
e o bloco de códigos.length-1
→s.count(?;)
. BTW, sua matemática também está errada, pois%
tem maior prioridade do que-
deveria(s.length-1)%127
. E no.gsub
bloco de código 's você pode acessar os grupos capturados com$&
,$1
... de modo que o|s|
parâmetro bloco de código geralmente não é viável. E os stringifies seqüência de interpolação:{"$><<#{$&.count(?;)%127}.chr;"}
. Experimente online!gsub
modifica$_
diretamente, o que significa que você não precisa redesigná-lo. No entanto, você tem problemas se tiver caracteres de comentário após o seu último#
... veja aquiPitão,
252324 bytes+1 bytes graças a @FryAmTheEggman
Tente!
lida com caracteres que precisam ser escapados usando apenas 1-char-strings.
Saídas de amostra:
Usa meu; # intérprete .
fonte
#
na entrada, pois ela será impressa0
. Você pode corrigir isso com emjk
vez des
.C, 150 bytes
Expandido:
É um programa completo que (deve) terminar, ignorar comentários e produzir sempre o código de saída correto. Eu assumo EOF = -1
Testado no SystemResque-Cd 4.9.6, compilado com o gcc 4.9.4
fonte
braingasm , 40 bytes
Tenho que dizer, isso é surpreendentemente curto.
O código gerado para
;
é a+
, que incrementa a célula atual.O código gerado para
#
contém uma operação desagradável e manual do módulofonte
Braingolf , 55 bytes
Experimente online!
Substitui basicamente
;
por1+
,#
por#~1+%@
e antecipa a coisa toda por um operador0
monádico porque+
está quebrado no momento.1+
adiciona 1 ao último item da pilha.#~1+%@
empurra o valor de char de~
(126), adiciona 1 para fazer 127, módulo com outro item na pilha e, em seguida, pop e imprime como char.Explicação
fonte
q / kdb +, 42 bytes
Solução:
Exemplos:
Observe que the
,
é usado para significar uma lista (versus átomo) como"\""
é uma lista de um elemento, em vez de ser um átomo.Explicação:
Pegue a string de entrada, remova qualquer coisa que não seja a
#
ou a;
, divida em listas#
, conte o número de elementos em cada lista, execute o mod 127 no resultado e faça a conversão para uma string:Notas:
#
, caso contrário, o último pedaço será erroneamente descartado pelo-1_
.;#
.fonte
Perl 5 , 78 bytes
Experimente online!
fonte