Eu pensei em linguagem esotérica Jumper. Mais tarde você verá o porquê.
- Opera com memória de acesso aleatório com bytes como células. A RAM é zero indexada e inicialmente preenchida com zeros.
- Ao tentar acessar células com índices negativos, o erro deve ser exibido e o programa finalizado.
- Ao tentar ler em um índice maior que o anterior, zero deve ser retornado.
- Ao tentar escrever em um índice maior que o anterior, a RAM deve ser aumentada para múltiplos de 1024 e as novas células preenchidas com zeros (tecnicamente você pode aumentar a RAM para não múltiplos de 1024, o motivo foi o aumento de desempenho, por isso, se lhe custar muitos caracteres, pode fazê-lo para não múltiplo de 1024).
- O programa também possui ponteiro para célula na RAM, que inicialmente é zero
- Quando o programa começar a executar, um prompt para a string de entrada deve ser exibido (ou receber entrada dos argumentos da linha de comando, é com você). A sequência de entrada não deve conter caracteres nulos (zero byte). Em seguida, a sequência de entrada é gravada na RAM, iniciando no índice zero.
- Quando o programa termina, é exibida uma caixa com saída do programa - excluindo o conteúdo da RAM do índice zero até o primeiro byte zero.
Agora, parte mais interessante, sintaxe.
Programa consiste em comandos (operadores-prefixos unários) e seus argumentos. Comandos e argumentos podem ser delimitados com espaços ou novas linhas, mas não são necessários. No entanto, os espaços dentro dos argumentos são inválidos, por exemplo, # 2 = 4
são válidos, mas # 2 = 4 4
não são.
Programa pode ter comentários entre ()
. Os comentários não podem ser aninhados - por exemplo, no (abc(def)ghi)
comentário é (abc(def)
. Os comentários podem ser colocados em qualquer lugar.
#123
define o ponteiro de RAM para 123 (qualquer número inteiro decimal positivo ou zero).>123
incrementa o ponteiro de RAM em 123 (qualquer número inteiro decimal positivo).<123
diminui o ponteiro de RAM em 123 (qualquer número inteiro decimal positivo).=123
grava 123 (qualquer número inteiro decimal de 8 bits não assinado) na célula atual.+123
adiciona 123 (qualquer número inteiro decimal de 8 bits não assinado) à célula atual (módulo 256).-123
subtrai 123 (qualquer número inteiro decimal de 8 bits não assinado) da célula atual (módulo 256).:123
- "goto" - vai para o número de comando 123 (o primeiro é 0). Você pode controlar o fluxo do seu programa apenas com o goto - ele precisa pular -, por isso decidi chamar esse idioma de Jumper.
Se o argumento estiver ausente - pense em 1 para ><+-
comandos ou 0 para #=:
comandos.
Além disso, existe o modificador de comando - ?
(prefixo ao comando), ele executa o próximo comando apenas se a célula atual não for zero, caso contrário, ignora esse comando. Pode ser aplicado a qualquer comando.
Por exemplo, ?:17
- vai para o comando 17 se a célula atual não for zero.
Se o programa for inválido ou ocorrer um erro durante o tempo de execução, pode ser exibida a mensagem "Erro". Por esse motivo, é CodeGolf, essa mensagem curta ficará boa.
Sua tarefa
Escreva o intérprete mais curto para esse idioma.
Alguns programas de teste
(prints "Hello world!" regardless of input)
=72>=101>=108>=108>=111>=32>=119>=111>=114>=108>=100>=33>=
(appends "!" to the end of input string)
?:2 :4 >1 :0 =33 >1 =0
fonte
Respostas:
Ruby, 447 bytes
Pega o programa e a entrada por meio de argumentos da linha de comando.
EDIT: corrigido alguns bugs e adicionado suporte para sintaxe inválida ao custo de 40 bytes (ao adicionar algumas outras otimizações).
fonte
Python (729)
Quanto à execução do programa:
Exemplo:
Provavelmente há algumas coisas que eu ignorei, então deixe um comentário se você tentar algo que deve funcionar, mas não funciona. Observe que isso está escrito no código Python 2.x.
fonte
Ruby 2 -
540447420 caracteresExecute como "ruby2.0 jumper.rb 'instruções' 'dados de inicialização'". 1.x Ruby não funcionará (nenhum método String.bytes).
Adicionado comandos e comentários de várias linhas e melhorado minha colocação.
Aqui está uma suíte de testes com alguns testes de dispersão. A maneira mais fácil de usá-lo é inserir o código em t / jumper.t e executar "perl t / jumper.t".
Versão não destruída.
Um proto-montador rápido.
fonte
Clojure -
585577 bytesNão foram usados truques especiais de golfe, porque não conheço nenhum de Clojure. O intérprete é puramente funcional. Vem com uma boa mensagem de erro em caso de endereço negativo da RAM (um erro é gerado, mas nenhuma exceção ou erro é gerada).
Exemplos:
Códigooriginalpouco destruído:fonte
-
no final da classe de caracteres do seu regex, não precisará escapar dele. -1 caractere.CoffeeScript (465)
A primeira caixa de prompt é para o programa e a segunda caixa de prompt é inserida. Teste-o em http://coffeescript.org .
Original :
Isso ainda é praticado, mas comentou:
Edit : Adicionar espaços levou mais bytes do que eu pensava. Este intérprete lançará um erro na sintaxe inválida, o outro possui um comportamento não especificado na sintaxe inválida.
fonte
?:2 :4 >1 :0 = 33 <10 =0
(o programa append- com um espaço extra!)<1
não<10
.Javascript, 519
Isso obtém o programa e a entrada via caixas de prompt. Colar isso no console Javascript do seu navegador funcionará, além de jogá-lo em um arquivo, colar antes do código
<!DOCTYPE html>
, nova linha<html><head><script>
e depois do código</script></head><body></body></html>
e salvar o arquivo resultante como "swagger.html".Esta é a minha primeira tentativa e já gosto da linguagem. Meio. No entanto, ele realmente precisa de rótulos de texto, em vez da identificação do índice de instruções no estilo BASIC.
Versão ungolfed (tipo):
fonte
clojure.string/replace
?:2 :4 >1 :0 = 33 <10 =0
(o anexo -! Com um espaço extra) Não testado embora.C 687 GCC 4.9.0 e Visual C ++ 2013 (se as terminações de linha contarem como 1)
Edit: Graças a Dennis, agora é muito mais curto (e funciona no GCC para inicializar)
A versão golfada
Uma versão um pouco menos golfe:
fonte
R[z]=x
emP(x)
com(R[z]=x)
. 2. O GCC não requer nenhuma das instruções de inclusão. 3.char C
->U C
.Groovy 582
versão não destruída:
Eu acho que há um erro nos comentários, que não são reconhecidos corretamente, que podem ser causados pelo regex estúpido que eu usei, mas os 2 programas são executados como deveriam:
fonte
Haskell: uma quantidade ímpia de caracteres
Tudo bem, agora isso é algo que pode ou não ser jogado em breve. É assustadoramente grande para o que é, com muitos códigos mal escritos (fazia algum tempo desde que eu toquei Haskell pela última vez). Mas foi divertido escrever.
fonte
Haskell, 584
O programa de entrada e jumper é fornecido como as duas primeiras linhas de entrada do stdin.
Postarei uma versão não-gasta mais tarde, mas, enquanto isso, quero deixar isso como um quebra-cabeça para o leitor:
Diverta-se!
fonte