Sua tarefa é pegar uma lista de argumentos inteiros ou operadores e analisá-los da seguinte maneira:
Existe um operador atual, que inicia como +.
Cada vez que um operador é encontrado, o operador atual muda para ele.
Os possíveis operadores são: "+", "-", "*", "/" e "%", que correspondem aos significados em C e na maioria dos idiomas.
Há uma solução em execução mantida, que começa em 0.
Cada vez que um número inteiro é encontrado, a solução é modificada pelo número, dependendo do operador; por exemplo, se o operador for "/", a solução será dividida pelo número.
Se uma operação resultar em um número misto (isto é, com um decimal), ela deve ser convertida em um número inteiro (isto é, o decimal deve ser cortado).
Saída da solução final.
Por exemplo:
Os argumentos 5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14
resultariam em:
5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14
0 5 13 38 342 2052 4104 4000 1000 142 148 8 -> 8
As entradas serão como argumentos de linha de comando ou função, ou um equivalente para o seu idioma.
O menor código vence!
%
arredondar para -inf em vez de 0?Respostas:
Pyth -
24232220 bytes2 bytes salvos graças ao @issacg e 1 graças ao @orlp!
O uso reduz com o caso base
0
e verifica se'
está em repr para detectar string vs. int.Não funciona on-line porque eu uso o eval completo, que está desativado on-line por motivos de segurança. Toma a entrada de stdin em uma lista como tal:
5, 8, 25, "*", 9, 6, 2, "-", 104, "/", 4, 7, "+", 6
.fonte
?
para.x
, porque apenas o bloco else pode lançar uma exceção, e isso sempre será feito. Você não pode mais usarK
, no entanto.u.xsv++GbH&=bHG+\+QZ
especificamente.JavaScript (ES6) 53
Uma função que recebe uma matriz como entrada.
Execute o trecho no Firefox para testar.
fonte
Julia,
8583 bytesIsso cria uma função sem nome que aceita uma string como entrada e retorna um número inteiro.
Ungolfed:
Foi corrigido o problema e salvou 2 bytes graças a Glen O.
fonte
o is not defined
quando você tenta executar a função recentemente. Ele tenta executar a função "o = ifloor ..." no Main, em vez de dentro da função (veja aqui github.com/JuliaLang/julia/issues/2386 ). Posso sugerirs->(o=0;p="+";for i=split(s) isdigit(i)?o=eval(parse("ifloor($o$p$i)")):p=i;end;o)
?elisp, 101 bytes
Com os argumentos passados como uma lista citada: por exemplo
(c '(5 5 * 10))
Versão com novas linhas:
fonte
CJam, 24 bytes
Este é um programa completo que lê a entrada como argumentos da linha de comando.
Para experimentar o código online no interpretador CJam (que não suporta argumentos de linha de comando), substitua
ea
porlS/
para ler a partir de STDIN simulado.Como funciona
fonte
JavaScript, 85 bytes
fonte
o+ +t
? você está criando uma string de qualquer maneira, não há necessidade de converter para número. Além disso,.forEach
não tem lugar no Code Golf: use.map
prompt(o="+",r=0).split(" ").forEach(t=>+t+1?r=+eval(r+o+ +t):o=t);alert(r)
-> 75 bytes.Lua, 142 bytes
Ungolfed:
fonte
PowerShell, 57 bytes
não-destruído;
Se a variável implícita no for-each for um operador, e não um número, a Invoke-Expression (POSH's
eval()
) falhará e o status de execução$?
será falso.Andar em POSH é pesado -
$foo=[math]::floor($foo)
e$foo-=$foo%1
foi a alternativa mais golfista que eu conseguia pensar.fonte
if
digitando dígitos, mas essencialmente o mesmo. 89 Bytes$o="+";$r=0;$args-split'\s+'|%{if($_-match'^\d+$'){$r=iex $r$o$_;$r-=$r%1}Else{$o=$_}};$r
GNU Sed (com a extensão eval, + dc), 102
(A pontuação inclui +1 na opção -r para sed.)
Transforma a expressão de entrada em notação de polimento reverso e, em seguida, usa-a
dc
para avaliá-la.Saída de teste:
fonte
CJam, 34 bytes
Experimente online
Eu pensei que isso seria bastante razoável. Mas não fui rápido o suficiente para publicá-la para ser a resposta mais curta do CJam, pelo menos por um momento. :(
fonte
Python 3 -
131 bytes129 bytes121 bytes116 bytesAgradecimentos a Maltysen por cortar dois bytes, Beta Decay por cortar 8 e Steven Rumbalski por cortar 5.
Estou tentando descobrir uma maneira de reduzir o tamanho da instrução if, mas por enquanto isso parece o máximo possível. Leva a entrada como uma lista.
fonte
int
por//1
in
e a citação..split()
.Bash, 69
Isso funciona apenas com números inteiros não negativos - não está claro na pergunta se está ok ou não.
fonte
Groovy, 79 bytes
Demo:
Ungolfed:
fonte
gcc (com avisos) 165 (se o final da linha contar como 1)
Mas se você estiver compilando com o mingw32, precisará desativar o globbing (consulte https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html ) compilando assim:
fonte
Perl 5.10+, 52 bytes
Demo:
(Observe que
*
deve ser escapado no meu shell para que não seja interpretado como um padrão glob.)Ungolfed:
fonte
C #, 132
165 168bytesEsta função assume que a entrada é válida. Isso é difícil para o C #, pois não há
eval
equivalente.Obrigado edc65 por salvar 33 bytes!
Recuado para maior clareza.
fonte
?:
->int C(string[]a){int o=1,r=0,n;foreach(var b in a)n=int.TryParse(b,out n)?r=o<0?r%n:o<1?r*n:o<3?r+n:o<5?r-n:r/n:o=b[0]-42;return r;}
Ruby, 59 bytes
Execução de teste:
fonte