Recentemente, criei um novo idioma chamado ;#
(pronunciado "Ponto-e-vírgula Hash"), que possui apenas dois comandos:
;
adicione um ao acumulador
#
module o acumulador por 127, converta para caractere ASCII e produza sem uma nova linha. Depois disso, redefina o acumulador para 0. Sim, 127 está correto.
Qualquer outro caractere é ignorado. Não tem efeito no acumulador e não deve fazer nada.
Sua tarefa é criar um intérprete para essa linguagem poderosa!
Deve ser um programa completo ou uma função que terá um ;#
programa como entrada e produzirá a saída correta.
Exemplos
Output: Hello, World!
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Output: ;#
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Output: 2d{ (unprintable characters here; should have 4 `\000` bytes between the `d` and the `{` and 3 after the `{`)
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hafh;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;f;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###ffh#h#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ffea;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#au###h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;h;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;o
Output: Fizz Buzz output
Program: link below
Output: !
Program: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
code-golf
interpreter
caird coinheringaahing
fonte
fonte
Respostas:
Python 3 ,
6968 bytes-1 byte graças a @WheatWizard
Experimente online!
fonte
if
. Experimente online!JavaScript (ES6),
768280 bytesDemo
Mostrar snippet de código
Versão recursiva,
8277 bytesGuardado 5 bytes graças a Neil
É provável que este trava com grandes entradas, como o exemplo do Fizz Buzz.
fonte
f(s,a+(c==';'))
pode derrubar três bytes sua versão recursiva.Retina ,
336636765666259 bytesExperimente online!
Versão legível usando sintaxe de escape hipotética :
Não imprime NUL bytes, porque o TIO não os permite no código-fonte.
Também imprime uma nova linha extra no final, mas acho que não pode fazer o contrário.Nova linha final suprimida graças ao @Leo .-273 (!) Bytes graças a @ETHproductions .
-2 bytes graças a @ovs .
-3 bytes graças a @Neil . Confira sua maravilhosa solução de 34 bytes .
fonte
+T`\x01-~`_\x03-\x7f`[^\x01¯]\x01
? (incluindo os imprimíveis como caracteres únicos, é claro)#
na entrada. Você pode corrigi-lo alterando seu segundo estágio para(;{127}|;+$)
T`;#\x01-ÿ`\x80\x7F_
\x80+$
(linha vazia)\+T`\x7Fo`\x01-\x80_`\x80[^\x80]
(usando escapes hexadecimais para representar não imprimíveis). Saídas \ x7F em vez de nulos.Java 8, 100 bytes
Experimente online!
fonte
Consumer<char[]>
:s->{char i=0;for(int b:s){if(b==59)i++;if(b==35){System.out.print(i%=127);i=0;}}}
Japonês , 18 bytes
Existe um caractere \ x7f não imprimível depois
%#
. Teste online!Como funciona
fonte
q'# ®è'; u# dì¯J
também funciona para a mesma pontuação.Python , 65 bytes
Este é um golfe desta resposta anterior.
Experimente online! Python2
Experimente online! Python3
Explicação
Esta é uma resposta bastante direta: determinamos quantos
;
s existem entre cada um#
e imprimimos ochr
mod 127. A única coisa que pode ser um pouco estranha é a[:-1]
. Precisamos deixar o último grupo porque não haverá#
depois dele.Por exemplo
Será dividido em
Mas não queremos o último,
;;;
porque não há#
depois para imprimir o valor.fonte
t
ex
.> <> , 35 bytes
Experimente online! Substitua
␡
por 0x7F,,^?
ou "excluir".Laço principal
Isso pega um caractere de input (
i
), verifica se é menor que zero, isto é, EOF (:0(
) e finaliza o programa se for (?;
). Caso contrário, verifique se a entrada é igual a#
(:'#'=
). Se for, ramifique e reinicie o loop (?v
...^ ... <
).Lógica do contador
Verifique se a entrada é igual a
;
(';'=
). Se estiver, pressione a0
. Caso contrário, não faça nada. Isso reinicia o loop principal.Lógica de impressão
Quando o caractere de entrada é
#
, retire a entrada da pilha (~
), obtenha o número de membros na pilha (l
), pressione 127 ('␡'
) e faça o módulo (%
). Em seguida, imprima como um caractere (o
) e inicie uma nova pilha ([0
). Isso "zera" o contador. Então, o loop reinicia.fonte
:0(
:(Python 3, 69 bytes
Melhorado, graças ao @Wheat Wizard, @Uriel
fonte
:
s.';'==c
economiza espaço, mas a não utilização deif
instruções seria ainda mais curta.Röda ,
443938 bytes5 bytes salvos graças a @fergusq
Experimente online!
Função anônima que recebe a entrada do fluxo.
Se outros caracteres não precisarem ser ignorados, recebo o seguinte:
Röda , 20 bytes
fonte
Ruby,
413534 caracteres( Código de
403433 caracteres + opção de linha de comando de 1 caractere)Graças a:
putc
para não precisar de conversão explícita com.chr
(6 caracteres)Exemplo de execução:
Experimente online!
fonte
putc()
. Obrigado, @Jordan05AB1E ,
161514 bytesCódigo:
Explicação:
Usa a codificação 05AB1E. Experimente online!
fonte
Gelatina , 13 bytes
Experimente online!
Como funciona
fonte
semicola
não existe ésemicolons
.código de máquina x86 no MS-DOS - 29 bytes
Montagem comentada:
fonte
05AB1E ,
252119 bytes-2 bytes graças a Adnan
Explicação:
Experimente online!
fonte
i>}
por+
.Retina , 34 bytes
Experimente online! Inclui caso de teste. Editar: salvou 2 bytes com alguma ajuda de @MartinEnder. Nota: O código inclui não-imprimíveis e o uso de
&#x;
códigos gera resultados incorretos, pois o navegador usa Windows-1252 em vez de ISO-8859-1. Explicação: A primeira linha limpa a entrada:;
é alterada para\x80
,#
para\x7F
(devido a limitações do TIO) e todo o resto é excluído. Então, sempre que vemos um\x80
que não está antes de outro\x80
, o excluímos e incrementamos ciclicamente o código de qualquer próximo caractere. Isso é repetido até que não haja mais\x80
caracteres. O código original que suporta bytes nulos basicamente subtrai 1 dos bytes não imprimíveis, exceto na primeira linha em que\xFF
permanece inalterada e\x7F
se torna\x00
. Com escapes para facilitar a leitura:fonte
\x80([^\x80]|$)
o último.\s+T`\x7Fo`\x01-\x80_`\x80(?!\x80).?
também salva apenas um byte.[^\x80]|\x80$
economiza dois bytes, eu acho.s
é chato.R,
97908684 bytesUma função:
Quando R inicia,
F
é definido comoFALSE
(numérico0
).Ungolfed:
fonte
pryr
é um pacote R, ainda é um código R.import
enquanto no R você pode usar::
para acessar diretamente a função nos pacotes. Você pode ver frequentemente o uso de pacotes adicionais aqui (por exemplo, para Python e Java). No entanto, mudei meu post anterior porque não quero participar de discussões.Python, 82 bytes
fonte
TeX simples, 156 bytes
Legível
fonte
C (gcc) , 58 bytes
Experimente online! (Dica: clique em ▼ Rodapé para recolhê-lo.)
fonte
Perl, 25 bytes
Execute com
perl -043pe
(contado como 4 bytes, poisperl -e
é padrão).Explicação:
-043
define o terminador de linha como#
(ASCII 043).-p
itera sobre as "linhas" de entrada (atualmente, # # delimited strings).y%;%%
conta o número de;
em cada "linha".x/#/
garante que não imprimimos um caractere extra para programas que não terminam em um # (como o terceiro caso de teste).%127
deve ser bastante óbvio.$_=
é o padrão comum.fonte
;;#;;;
ela produz o número 5 em vez do número 2.echo -n ';;#;;;' | perl -043pe '$_=chr(y%;%%%127)x/#/' | xxd
produz corretamente00000000: 02
na minha máquina. Se você parou043
ou está usando uma página de código onde#
não é ASCII 043, isso explicaria seu resultado.CJam, 27 bytes
Explicação:
Solução alternativa, 18 bytes
Explicação:
fonte
;
excluir o acumulador?F #,
799193 bytesUngolfed
Experimente online!
Edit: Estava tratando qualquer outro caractere além de ';' Como '#'. Foi alterado para ignorar caracteres inválidos.
Alternativa
F #,
107104 bytesO uso da célula de referência economiza 3 bytes
Ungolfed
Experimente online
fonte
Processing.js (versão Khanacademy), 118 bytes
Experimente online!
Como a versão do processamento usada não possui nenhum método de entrada, a entrada é colocada em n.
fonte
keyTyped=function(){ ... }
: PLabirinto ,
6147 bytesExperimente online!
Explicação
A execução do código começa no canto superior esquerdo e o primeiro ponto e vírgula descarta um zero implícito da pilha e continua à direita.
laranja
_36
empurra 36 para a pilha. Isto é para comparar a entrada com#
}
move o topo da pilha para a pilha secundária,
empurra o valor inteiro do caractere na pilha)
incrementa a pilha (se for o final da entrada, isso tornará a pilha 0 e o fluxo do programa prosseguirá para a@
saída){
move o topo da pilha secundária para o topo da pilha primária-
pop y, pop x, pressione x - y. Isto é para comparar a entrada com#
(35 em ascii). Se a entrada foi#
o código continuará na seção roxa (porque a parte superior da pilha é 0, o IP continua na direção em que estava se movendo antes), caso contrário, continuará na seção verde.Roxa
127
empurre 127 para a pilha%
pop x, pop y, pressione x% y.
pop no topo da pilha (o acumulador) e saída como um caractereA partir daqui, o código cinza nos leva ao canto superior esquerdo do programa sem nada na pilha.
Verde
_24
empurre 24 para a pilha-
pop x, pop y, pressione xy. 24 é a diferença entre#
e,;
portanto, isso verifica se a entrada foi;
. Se fosse;
o código continua direto para o)
. Caso contrário, ele girará para o#
que empurra a altura da pilha (sempre um número positivo, forçando o programa a virar à direita no próximo cruzamento e perder o código que incrementa o acumulador);
descartar a parte superior da pilha)
incrementa a parte superior da pilha, que é um zero implícito ou é um zero incrementado anteriormente, atuando como acumulador de saídaA partir daqui, o código cinza nos leva ao canto superior esquerdo do programa com a pilha apenas com o acumulador.
cinzento
As cotações são não ops,
_
empurra um 0 para a pilha e;
descarta a parte superior da pilha. Tudo isso é apenas um código para forçar o fluxo de controle da maneira correta e descartar qualquer coisa extra do topo da pilha.fonte
MATL , 29 bytes
Entrada é uma cadeia de caracteres entre aspas simples.
Experimente online!
O programa FizzBuzz é muito longo para os intérpretes online; veja trabalhando offline neste gif:
Explicação
O valor do acumulador é implementado como o número de elementos na pilha. Isso torna o programa mais lento do que se o valor do acumulador fosse um único número na pilha, mas salvaria alguns bytes.
fonte
Alice , 22 bytes
Experimente online!
Explicação
Mantemos na pilha apenas um único contador de quantos
;
encontramos. Quando a pilha está vazia (por exemplo, no início do programa), isso é implicitamente um 0.Uma versão mais curta, mas não finalizadora, deste programa pode ser encontrada aqui .
fonte
~h
.JS (ES6),
9792 bytesTentou adotar uma abordagem diferente da resposta de Shaggy . Ah bem.
fonte
; # + , 59 bytes, não-concorrentes
A linguagem foi feita após esse desafio.
Experimente online! A entrada é finalizada com um byte nulo.
Explicação
A geração é a mesma da minha resposta de código Generate; # . A única diferença aqui é a iteração.
Iteração
fonte
Bash + coreutils,
4639 bytesExperimente online!
Explicação
(Obrigado Vacas Quack por -7 bytes!)
A
tr
parte remove todos os caracteres estranhos (eu poderia colocá-losed
exatamente para o mesmo bytecount, mas, em seguida, ele não manipula o caractere de avanço de linha corretamente, pois ossed
deixa inseridos edc
só chega ao primeiro avanço de linha?
)sed
pega o resto e cria umdc
programa:Strings de
;
tornar-se strings de1
(um longo literal)#
torna-.ZC7%P
se (se isso segue uma sequência de1
, o.
é um ponto decimal para um no-op. Mas se é no início do programa, ou após outro#
, é um literal0
. Em seguida, leva o comprimento do número, modifica-o, e imprime o ASCII correspondente.)fonte
;
dentro'...'
e pode simplesmente mudardc -ez?
paradc
. Além disso, em vez de;
adicionar 1 à pilha, você pode agrupá-los e obter seu comprimento usandoZ
para alcançar este tio.run/##S0oszvj/… .dc -ez?
foi uma conseqüência da necessidade de um zero extra para iniciar o programa) Mas o seu programa adiciona saída adicionalstderr
nos casos de#
entrada consecutiva ou que não termina#
(nos dois casos, quero dizer, após a remoção de caracteres estranhos) . Não sei se há consenso, mas sinto que a saída extra invalida a solução. Eu adaptei sua ideia e acabei com apenas um byte a mais do que a sua sugestão semdc
gerar erros!#
s consecutivos por causaZ
de0
is1
, então gera 0x01 em vez de 0x00 (caí nessa mesma armadilha também, mas meu navegador exibe não-imprimíveis como seus códigos hexadecimais, então peguei isso).C,
65 6460 bytes(-2 graças a ceilingcat)
fonte
c
para zero para tornar a função reutilizável .c=0
e não gostaria de trapacear copiando a resposta de Dennis.