Desafio:
Seu trabalho é criar um intérprete simples para uma linguagem simples de golfe.
Entrada:
A entrada será na forma de sequência separada por espaços.
Você pode substituir a separação de espaço pelo que deseja
Resultado:
Produza o resultado (um número ou uma sequência) obtido após a execução de todas as operações. Se houver mais de uma saída, junte-se para fornecer um único resultado (sem separadores). O valor inicial da variável é sempre zero. ou seja: começa às0
Sintaxe do idioma:
O idioma possui os seguintes operadores:
inc ---> add one to variable
dec ---> remove one from variable
mult ---> multiply variable by 2
half ---> divide the variable by 2
Pri ---> print the variable to console (or whatever your language has)
exit ---> end the program (anything after this is ignored)
Exemplos:
inc inc inc dec Pri exit ---> 2
dec inc mult inc inc Pri ---> 2
inc inc inc mult half Pri exit inc ---> 3
inc Pri inc Pri inc Pri exit half mult ---> 123
Pri exit ---> 0
inc half Pri exit ---> 0.5
Restrição:
Este é o código-golfe, pelo que o código mais curto em bytes para cada idioma vencerá.
Nota:
- A entrada sempre será válida. (sequência de operadores separados por espaço)
- Você pode arredondar para o número inteiro mais próximo se não desejar casas decimais.
code-golf
math
interpreter
Muhammad Salman
fonte
fonte
Respostas:
Bash , 61 bytes
Experimente online!
Converte o programa em um programa dc e o avalia como código dc. Isso separa a entrada por novas linhas. Observe que dc é baseado em pilha e usa a notação de polimento reverso.
A entrada é canalizada primeiro para sed
1i0
na primeira linha de entrada, insira (prepend) um 0, este será o acumuladors/.//2g
remova tudo, exceto o primeiro caractere de cada linhay"idmhe"+-*/q"
transliteraridmhe
para+-*/q
respectivamente, + - * / são os comandos aritméticos eq sai do programa/+\|-/
em todas as linhas que contêm + ou -,i1
insira 1/*\|\//
em cada linha contendo * ou /,i2
insira um 2/P/
em cada linha que contém P,cdn
mude paradn
equivalente à duplicação e saída sem nova linha em dcAgora isso é avaliado como uma expressão dc.
fonte
sed
sintaxe se torne ainda mais estranha do que se pensava ser possível quando o golfe entra em jogo.Gelatina , 21 bytes
Experimente online!
Observe que os valores ASCII dos primeiros caracteres (
idmhPe
) módulo 11 são o módulo exclusivo 6.Usando o módulo 16:
Gelatina , 21 bytes
Experimente online!
A sequência usada para indexar é
ḤH‘’IȮ
neste caso. Não‘’
estão mais nos limites.fonte
“”
leva 2 bytes,¤
leva 1 byte, os dados em si levam 6 bytes, restam 2 bytes para fazer alguma coisa. Atualmente é⁾
ej
, masịØJ
ouṃØJ
é muito pior, eỌ
não funciona (porque Unicode).R ,
128bytes 125Experimente online!
Deve ser chamado com
source(echo=FALSE)
para impedir que o valor de retorno seja impresso automaticamente. A alternativa seria envolver tudo,invisible
mas isso é muito menos golfe (e arruina minha [ainda] boa contagem de bytes).fonte
05AB1E , 25 bytes
Experimente online!
Mapeia cada uma das funções de idioma com a função 05AB1E correspondente (usando o primeiro caractere de cada função) e, em seguida, executa a sequência resultante como código 05AB1E.
fonte
Vermelho , 121 bytes
Experimente online!
Legível:
fonte
Python 2 ,
131125122121118117115 bytesExperimente online!
-6 e -3 com agradecimentos a @Rod
-3 e -2 com agradecimentos a @etene
-1 substituindo
"Pri"==x
por"P"in x
fonte
split
em"exit"
e obter o 1º bloco, em vezbreak
ing salvar 4 bytes'idmh'
e usáfind
index
ex
para salvar outro 2v=(v+1,v-1,v*2,v/2.)
comv+=(1,-1,v,-v/2.)
ele deve funcionar, não testada emborahalf
. Tão simples! Obrigado.Python 3 ,
1109182 bytesexit
fará com que o programa saia com um erro.Experimente online!
fonte
i='x+=1';d='x-=1';...
e depois na suaexec
ligação, mude paraexec(eval(c[0]))
print
declaração!JavaScript (ES6),
8379 bytesGuardado 4 bytes graças a @ l4m2
Substitui iterativamente as instruções pela saída ou pelas seqüências de caracteres vazias.
Experimente online!
Comentado
fonte
s=>s.replace(/\S+./g,w=>k<s?'':w<{}?k:(k+={d:-1,e:w,i:1,m:k}[w[0]]||-k/2,''),k=0)
w<{}
é pura maldade: ps=>s.replace(/\S+./g,e=>m<s?'':e<{}?m:(m+={d:-1,e,i:1,m}[e[0]]||-m/2,''),m=0)
também funcionaCarvão ,
3735 bytesExperimente online! Link é a versão detalhada do código. Inspirado pela resposta de @ RickHitchcock. Explicação:
Limpe a variável.
Trunque a entrada no
x
se houver um, faça um loop e ligue cada caractere (o restante) da entrada.n
i n incrementa a variável.d
d cria a variável.m
m ultiplies a variável por dois (isto é, duplos).h
h alves a variável.r
p r insere a variável convertida em string.fonte
JavaScript (ES6),
7775 bytes(Emprestado ( roubado ) @ O truque de Arnauld de usar
m
como o nome da variável, economizando 2 bytes.)Percorre recursivamente a string, procurando letras distintas por instrução e ignorando o resto:
Tira proveito do fato de que
undefined
não é nem maior que nem menos do que'x'
, fazendo com que a recursão para parar no final da string ou quando encontra o'x'
na saída .Mostrar snippet de código
fonte
JavaScript (Node.js) , 107 bytes
Experimente online!
fonte
f=
JavaScript (Node.js) , 91 bytes
Experimente online!
JavaScript (Node.js) , 96 bytes
Experimente online!
JavaScript (Node.js) , 99 bytes
Experimente online!
fonte
JavaScript, 107 bytes
fonte
Haskell , 93 bytes
Experimente online!
Essencialmente, uma tradução da resposta Python do mbomb007 .
fonte
Lua, 207 bytes
fonte
Python 3 ,
114110109116 bytesNa verdade, seria necessário dois bytes a menos no Python 2 porque
exec
é uma declaração e não precisa de parênteses ...Guardou 4 bytes adicionais graças a @ElPedro
Economizou um byte extra aproveitando o fato de
find
retornar -1 com erro, que pode ser usado como índice+7 bytes porque eu não havia notado a regra de não novas linhas :(
Experimente online!
Mapeia o primeiro caractere de cada palavra de entrada para um pedaço do código Python. Estes são então concatenados e
exec
editados.Abordagem bastante direta, que provavelmente poderia ser um pouco mais golfe. A dificuldade reside principalmente em encontrar a forma mais curta dentre as possíveis ...
fonte
print(i,end='')
. Veja o quarto caso de teste.Ruby +
-na
,817365 bytesExperimente online!
Bem direto. Para a primeira letra de cada palavra, encontre a sequência de comandos correspondente e
eval
ela. Usa divisão inteira eexits
jogando aZeroDivisionError
.-5 bytes: use em
.ord%11%6
vez de uma pesquisa de sequência. O crédito vai para user202729-3 bytes:
.ord
considera apenas o primeiro caractere da string, para que eu possa pular a[0]
.-8 bytes: use o
-a
sinalizador para dividir automaticamente a entrada, graças a Kirill L.fonte
-a
a opção de fazer o autosplit para você, como estaEmojicode , 270 bytes
Experimente online!
fonte
SNOBOL4 (CSNOBOL4) , 165 bytes
Experimente online!
Bruto.
fonte
C # (.NET Core), 186 bytes
fonte
i
comv
, consultando uma tabela ASCII que você pode usar números pequenos, reorganizando oif
s, e em seguida, usando um ternário:class Z{static void Main(string[]a){int v=0,i;foreach(var s in a){i=s[0]%'d';if(i==1)break;if(i>9)System.Console.Write(v);else v=i<1?v-1:i<5?v/2:i<6?v+1:v*2;}}}
(PS uma explicação de como ele funciona e como usar -lo (por exemplo, espera args de linha de comando) é sempre apreciado)!%50
em vez de%'d'
)Perl 5
-a
, 61 bytesExperimente online!
Roubou @ user202729
ord%11%6
truque deQuão?
fonte
Pyth, 44 Bytes
Suíte de teste
explicação
fonte
TI-BASIC, 112 bytes
Isso tira proveito de algumas suposições que são perfeitamente aceitáveis pelo AFAIK. O número um é que todas as variáveis são inicializadas em zero antes da execução; número dois sendo que a entrada é obtida via
Ans
.fonte
Java (OpenJDK 8) , 164 bytes
Experimente online!
Acima está minha solução que arredonda para números inteiros, mas abaixo está minha solução que lida com decimais. A maneira desagradável que o java imprime dobra adiciona mais 55 bytes à pontuação. Deixei as novas linhas para tornar o código mais legível no segundo envio apenas porque é essencialmente a mesma solução com um comando extra e uma declaração de importação.
Java (OpenJDK 8) , 219 bytes
Experimente online!
fonte
C (gcc) ,
120114111 bytes-6 bytes graças ao ceilingcat.
Experimente online!
124 bytes
Versão de ponto flutuante:
Experimente online!
Eu não me incomodei com uma versão que arredonda para baixo, mas abre uma exceção para 0, o que seria permitido se eu entendesse a cadeia de comentários corretamente.
fonte
33 , 62 bytes
Experimente online!
Este programa segue as instruções delimitadas por novas linhas
Explicação:
O código antes desse segmento define todas as funções.
fonte