3var é uma variante de peixe morto que usa três variáveis chamadas A, B e R. A e B são acumuladores, enquanto R é usado como variável de resultado.
Nesse desafio do código-golfe , você precisa criar um intérprete para uma versão simplificada desse idioma.
Comandos necessários:
i Increments A
d Decrements A
s Squares A
p Prints A
P Prints the ASCII character of A
> Sets A to R
a Increments B
k Decrements B
m Squares B
o Prints B
O Prints the ASCII character of B
< Sets B to R
+ Adds A and B, stores in R
- Subtracts B from A, stores in R
* Multiplies A and B, stores in R
/ Divides A by B, stores in R
w Prints R
@ Resets A to 0
# Resets B to 0
e Resets R to 0
Todo o resto (incluindo espaços em branco) é ignorado.
Esclarecimentos
o
ep
deve sair sem nada depois dele.- Divisão é divisão inteira.
- Números acima de 255 e números abaixo de 0 são suportados.
- 'w' deve gerar um espaço ou uma nova linha após R
- A divisão por 0 pára sem erros. (Nenhuma saída para STDERR)
- A, B e R são inicialmente 0
Regras
- Isso é código-golfe, então a resposta mais curta vence.
- Em caso de empate, a resposta mais antiga vence.
- O arquivo será fornecido por meio de argumentos de linha de comando ou STDIN.
- Qualquer idioma é permitido.
- Eval é permitido.
Casos de teste
Hello world!
(retirado de Esolangs)
iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP
Saídas 20spooky22me
:
iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO
Saídas 9P-1420 100 3Q-1 162 0
:
iiispsdPkokmo/w<+w#aaaommO-w@ii*wew
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=63008,OVERRIDE_USER=45220;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
fonte
dddddp
resultados em -5 eiiiissp
resultados em 256 conforme o esperado, em vez de 0. #r
faz? não incluídos em sua lista de comandos válidos@#e
.Respostas:
CJam, 112
Experimente online
Explicação:
O programa cria uma matriz de partes de código a serem executadas e executa a parte correspondente para cada caractere. Lidar com a divisão por zero é mais difícil, porque o CJam ainda não possui um operador de "interrupção". Em vez disso, o programa envia π como um marcador (já que nenhum número de ponto flutuante pode aparecer de outra forma) e, no final, mantém apenas a saída antes do primeiro π.
Além disso, o programa usa as variáveis T, U e V em vez de A, B e R, porque são pré-inicializadas com 0 no CJam.
As implementações de comando reais (construídas pelo programa):
fonte
JavaScript (ES7) 208
213 223 237 241 311Edit3 Copiando um ao outro, eu e o Dendrobium estamos entrando em colapso.
Edit2 Usando o EcmaScript 7 para salvar apenas 2 bytes, o tratamento unido de A e B
Editar Após as alterações das regras.
Observe que adicionei or
comando que não é necessário na pergunta, apenas para executar o exemplo antigo Olá mundofonte
A=B=R=0,
e definindo essas variáveis usando as reais 3var funções antes de processar a string, como:[...'@#e'+p]
.GNU Sed (com opção de avaliação para avaliar a
dc
expressão), 254O Deadfish mapeia bastante bem para um subconjunto de
dc
. Então, usamos sed para fazer esse mapeamento:fonte
Javascript
ES6ES7,217215213208 bytesUngolfed
fonte
A=B=R=0,
e definindo essas variáveis usando as reais 3var funções antes de processar a string, como:for(c of '@#e'+s)
.w
APL, 191
Esta é uma função que aceita o programa como argumento, por exemplo:
Pode ser usado como uma função anônima, apenas dei um nome para maior clareza.
Explicação:
0::→
: se ocorrer um erro (por exemplo, divisão por zero), pare sem imprimir a mensagem de erroA B R←0
: inicializar variáveis{
...}¨⍵
: para cada comando:⍵∊G←'aikdms<>'
: Se o comando for do tipo var ← fn (var, x) , encontre os fn e x adequados , substitua-os e avalie-os:⍎
: Avalie'AB'[1+2|G⍳⍵
:A
se a posição de⍵
in'aikdms<>'
for par,B
caso contrário.'+-*∘'[M]
: adicionar, subtrair, energia ou nada, dependendo deM
(definido posteriormente)'←'
: atribuir'112R'[M←⌈2÷⍨G⍳⍵]
:1
(para adicionar e subtrair),2
(para poder) eR
(para nada, ou seja, apenas define a variável paraR
), dependendo deM
qual seja o comando pertencer ao primeiro, segundo, terceiro ou quarto par.⍵∊G←'PpOo'
: saída:⍞←
: saída⎕UCS⍣(2|G⍳⍵)
: ASCII (bem, Unicode) ou número, dependendo de o comando estar em uma posição ímpar ou parPpOo
,⊢A B[⌈2÷⍨G⍳⍵]
:A
ouB
, dependendo se o comando foi no primeiro ou no segundo semestre.⍵∊G←'+-*/
: math:R∘←⌊A(⍎'+-×÷'[G⍳⍵])B
: definaR
o resultado da aplicação do operador especificado emA
eB
.⍵∊G←'@#e':
restabelecer:⍎
: Avalie'ABR'[G⍳⍵]
: selecione a variável correta'∘←0
': definido como zero⍵='w':⍞←R
: se o comando forw
, outputR
.fonte
C,
253241 bytesEste código usa a string
id@s>ak#m<e+-*/wpoPO
como uma tabela de comandos. A sequência é organizada de acordo com o destino da expressão calculada. Acontece que existem 5 comandos que atualizam cada uma das variáveis:id@s>
- atualizaçãoa
ak#m<
- atualizaçãob
e+-*/
- atualizaçãor
wpoPO
- update ... a localização de memória depois dea
,b
er
. Espero que não seja muito importante :)Portanto, após localizar o caractere de entrada na sequência de comandos, seu índice diminui repetidamente e, dependendo de quando atingir 0, uma expressão é escolhida.
Se não atingir 0 após 15 subtrações, é uma
printf
argumento com alguns escolhidos corretamente.Além disso, ao dividir, evita a divisão por 0 chamando
exit()
.Esse código deve ser compilado sem otimizações, pois assume que
a
,b
er
estão localizados em endereços adjacentes na pilha (e não em registros de CPU).Além disso, ele deve ser compilado no modo de 32 bits, porque converte ponteiros em números inteiros e vice-versa.
fonte
VBA,
484, 453380 bytesAnseio por vencer, mas Uma maneira super simples de fazer as coisas, Nada Gosta apenas de bons velhos
Select Case
Adição de divisão de número inteiro e tratamento de erros da Div 0 Comeram muitos bytesremovidos, pois parece que o tratamento normal de erros resulta na mesma funcionalidade. Divisão Int fixa para funcionar como esperado. Também foi mais curto.
fonte
DefInt A-Z
, omitindo assim a necessidade de declarar explicitamenteA
,B
eR
comoInteger
:DefInt A-Z:Dim A, B, R
. Ele poderia muito bem trabalhar apenas para atribuir-lhes, sem declaração:A=0:B=0:R=0
. Os cálculos também devem funcionar com variantes.DefInt
Not Something que eu uso todos os dias, mas será um VBA de golfe super útil no futuro. InfelizmenteA=0
, isso fará com que funcione como um dobro dos meus testes. Lá para fazeriiiaa/w
produzir um resultado decimal e não um todo.PHP, 310 bytes
Primeira vez na minha vida usando
:eval
Toma a primeira entrada da linha de comando:
Saída dos exemplos:
fonte
C, 357
Macros FTW!
(Quem eu estou brincando - c nunca vai ganhar este)
fonte
JavaScript (ES6),
293262 bytesUso
Explicação
Existem alguns detalhes do idioma sobre o qual não tenho certeza (tamanhos inteiros, manipulação de caracteres não reconhecidos etc.), mas essa solução parece funcionar o suficiente e ignora caracteres de espaço em branco como as novas linhas no caso de teste.
fonte
:$=>
por$
e adicionando uma substituição para a string.Simplex v.0.8 , 211 bytes
(Codificado em UTF-8.)
Explicação
Como esse é o programa simplex mais longo que eu escrevi até agora, geralmente explicarei como isso funciona nos tópicos.
h@u]
- define a macro 0. Essa macro simplesmente grava no registrador e faz com que um lambda não retorne nada.u2
- vai para a faixa acima e define o byte atual como 2; isso define a aridade das lambdas a serem definidas.ƒ
- começa a expressão lambda; uma vez concluído]
, empurrará a função lambda para a pilha lambda. Ele age levando as células (de área) do ponteiro para sua faixa local e, após a conclusão, definirá sua faixa local para as células obtidas, a menos que o byte atual não seja gravado. O ponteiro não é afetado. A macro 0 permite que uma função retorne sem modificar nada na faixa.§
- move para a primeira célula escrita na faixa atual, ieA
.ð
- move para a última célula gravada na faixa atual, ieB
.{"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
{...Ï}
repita até a pilha de entrada estar vazia"idspP>akmoO<+-*/w@#e"
- os comandosRly
- coloque a tira em uma tuplaG^u
- o índice da entrada na tupla·
- carrega o byte th atual no avaliador lambdauRL
- vai para a faixa segurandoA
eB
(escreveA
eB
se não existir)†
- executa lambda (este é o avaliador lambda)vø
- redefine abaixo da faixaufa , estou impressionado. É longo para o Simplex, mas curto para todo o resto.
;)
fonte
Minkolang 0.11 , 222 bytes
Tenho certeza de que isso pode ser jogado ainda mais, mas foi divertido. Além disso, primeiro intérprete de Minkolang de outro idioma!
Experimente aqui.
Explicação
O restante das linhas é bem simples, talvez com exceção das que estão com
1$((dl%"0"+$rl:d)$Ok
, que é um idioma que imprime um número sem deixar espaço. (Ainda não implementei a funcionalidade converter esse número em uma string, que será1Z
.) Ah, sim, todos eles têm umv
no início, o que o leva de volta ao início.fonte
GNU Sed (com opção de avaliação para avaliar a expressão dc), 289
Inspirado pelo Digital Trauma que infelizmente não conseguiu perceber, que a) caracteres ilegais precisam ser ignorados, b) dc precisa de todo o programa convertido em um argumento ec) divisão por 0 deve encerrar o programa sem erros.
Se todas essas regras não se aplicassem, minha solução teria apenas 235 bytes;)
fonte
AWK,
311309Parênteses TIL não eram necessários em torno do printf. 2 bytes salvos!
Versão não destruída para facilitar a leitura:
fonte
Python 2, 272
fonte
print
declarações incluem uma nova linha à direita.Ruby, 199 bytes
É possível salvar 5 bytes removendo
.read
da segunda linha se você puder tolerar que um aviso seja impresso no stderr na versão mais recente do Ruby.fonte
Python, 244
Um pouco tarde, mas eu queria tentar.
fonte
Prolog, 759 bytes
Não é o programa mais curto, mas pelo menos é estruturado e legível.
Exemplo de entrada
Experimente online aqui
fonte