Você deve avaliar uma string escrita em notação polonesa reversa e produzir o resultado.
O programa deve aceitar uma entrada e retornar a saída. Para linguagens de programação que não possuem funções para receber entrada / saída, você pode assumir funções como readLine / print.
Você não tem permissão para usar nenhum tipo de "avaliação" no programa.
Números e operadores são separados por um ou mais espaços.
Você deve suportar pelo menos os operadores +, -, * e /.
Você precisa adicionar suporte a números negativos (por exemplo, -4
não é a mesma coisa que 0 4 -
) e números de ponto flutuante.
Você pode assumir que a entrada é válida e segue as regras acima
Casos de teste
Entrada:
-4 5 +
Saída:
1
Entrada:
5 2 /
Saída:
2.5
Entrada:
5 2.5 /
Saída:
2
Entrada:
5 1 2 + 4 * 3 - +
Saída:
14
Entrada:
4 2 5 * + 1 3 2 * + /
Saída:
2
~
. :-Peval
para analisar números? Parece bastante quebrado. (GolfScript é uma tal linguagem, tanto quanto eu estou ciente que eu acho que está quebrado também..)eval(s)
é melhor quefloat(s)
Respostas:
Ruby -
9577 caracteresRecebe entrada em stdin.
Código de teste
dá
Diferente da versão C, ele retorna o último resultado válido se houver números extras anexados à entrada que parece.
fonte
Python - 124 caracteres
Python - 133 caracteres
fonte
0
como segundo operando ...[a/b]
deve ser substituído porb and[a/b]
para que você possa ter 0 como segundo operando.Esquema, 162 caracteres
(Quebras de linha adicionadas para maior clareza - todas são opcionais.)
Versão totalmente formatada (não destruída):
Comentário selecionado
`(,foo ,@bar)
é o mesmo que(cons foo bar)
(ou seja, (efetivamente † ) retorna uma nova lista comfoo
anexado abar
), exceto que é um caractere menor se você compactar todos os espaços.Assim, você pode ler as cláusulas de iteração como
(loop (cons token stack))
e(loop (cons ((cadr ass) (cadr stack) (car stack)) (cddr stack)))
se isso for mais fácil para seus olhos.`((+ ,+) (- ,-) (* ,*) (/ ,/))
cria uma lista de associação com o símbolo+
associado ao procedimento+
e da mesma forma com os outros operadores. Portanto, é uma tabela simples de pesquisa de símbolos (palavras simples estão(read)
como símbolos, e é por isso que nenhum processamento adicionaltoken
é necessário). As listas de associação têm pesquisa O (n) e, portanto, são adequadas apenas para listas curtas, como é o caso aqui. :-P† Isso não é tecnicamente preciso, mas, para programadores que não são do Lisp, ele tem uma idéia o suficiente.
fonte
lambda (ass)
1 para a escolha nome da variável: Pc - 424 caracteres necessários
Supõe que você tenha uma nova libc suficiente para incluir
getdelim
no stdio.h. A abordagem é direta, toda a entrada é lida em um buffer e, em seguida, usamos o tokenstrsep
e o comprimento e o caractere inicial para determinar a classe de cada um. Não há proteção contra entrada incorreta. Alimente "+ - * / + - ..." e, felizmente, sairá da memória "abaixo" da pilha até falhar. Todos os não operadores são interpretados como flutuadores, oatof
que significa valor zero se não parecerem números.Legível e comentado:
Validação:
Heh! Tem que citar qualquer coisa com
*
ele ...e meu próprio caso de teste
fonte
case
por um makro.Haskell (155)
fonte
s!(n:v)=case n of{"+"->(+)#s;"-"->(-)#s;"*"->(*)#s;"/"->(/)#s;_->(read n:s)}!v
economizaria 14 caracteres.MATLAB -
158, 147(a entrada é lida na entrada do usuário, a saída é impressa).
Abaixo está o código prettificado e comentado, ele implementa praticamente o algoritmo postfix descrito (com a suposição de que expressões são válidas):
Bônus:
No código acima, assumimos operadores são sempre binário (
+
,-
,*
,/
). Podemos generalizá-lo usandonargin(f)
para determinar o número de argumentos que o operando / função exige e exibir a quantidade certa de valores da pilha de acordo, como em:Dessa forma, podemos avaliar expressões como:
onde
mean_of_three
é uma função definida pelo usuário com três entradas:fonte
Perl (134)
Da próxima vez, vou usar a coisa regexp recursiva.
Ungolfed:
Embora o F # seja minha única linguagem de programação de sonhos ...
fonte
Windows PowerShell, 152
181192De forma legível, porque agora são apenas duas linhas sem chance de quebrá-las:
30-01-2010 11:07 (192) - Primeira tentativa.
30-01-2010 11:09 (170) - Transformar a função em um scriptblock resolve os problemas de escopo. Apenas torna cada invocação dois bytes mais longos.
30-01-2010 11:19 (188) - Não resolveu o problema de escopo, o caso de teste apenas o ocultou. Removeu o índice da saída final e removeu uma quebra de linha supérflua. E mudou duas vezes para
float
.30-01-2010 11:19 (181) - Nem me lembro dos meus próprios conselhos. A conversão para um tipo numérico pode ser feita em um único caractere.
30-01-2010 11:39 (152) - Muito reduzido usando a correspondência de regex no
switch
. Resolve completamente os problemas anteriores de escopo ao acessar a pilha para abri-la.fonte
Raquete 131:
Quebras de linha opcionais.
Baseado na solução de Chris Jester-Young para Scheme.
fonte
Python, 166 caracteres
fonte
raw_input()
código de uso não está dividido em várias linhas.from operator import*
e substituiro.div
pordiv
.Python 3, 119 bytes
Entrada:
5 1 1 - -7 0 * + - 2 /
Saída:
2.5
(Você pode encontrar uma versão Python 2 de 128 caracteres no histórico de edições.)
fonte
/
na string.ZeroDivisionError
quando o segundo operando é 0 (por exemplo5 0 +
).ord(x) - 42
métodoJavaScript (157)
Este código assume que existem duas funções: readLine e print
fonte
prompt()
vez dereadLine()
(e talvez emalert()
vez deprint()
combinarprompt()
).Perl, 128
Isso não é realmente competitivo ao lado da outra resposta Perl, mas explora um caminho diferente (subótimo).
Caracteres contados como diff para uma simples
perl -e ''
invocação.fonte
Python, 161 caracteres:
fonte
PHP,
439265263262244240 caracteresEste código deve funcionar com o stdin, embora não seja testado com o stdin.
Foi testado em todos os casos, a saída (e código) do último está aqui:
http://codepad.viper-7.com/fGbnv6
Ungolfed,
314330326 caracteresfonte
flex - 157
Se você não estiver familiarizado, compile com
flex rpn.l && gcc -lfl lex.yy.c
fonte
Python, 130 caracteres
Seriam 124 caracteres se deixássemos cair
b and
(que faltam algumas das respostas do Python). E incorpora 42!fonte
Python 3,
126132 caracteresJá existem soluções melhores, mas agora que eu as escrevi (sem ter lido as observações anteriores, é claro - mesmo que eu tenha que admitir que meu código parece ter copiado-as juntos), eu queria compartilhá-las, também.
fonte
b/a
deve ser substituído pora and b/a
, caso contrário, esta solução não funcionará se o segundo operando for 0 (por exemplo4 0 -
).c99 gcc 235
Isso funciona para mim (com avisos):
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:
Caso contrário, * será automaticamente expandido pelo mingw32 CRT.
Alguém sabe como se transformar
break;case'*':s[--d]*=s[d+1];
em uma macro que aceita o caractere + como parâmetro porque todos os quatro casos seriamO(+)O(-)O(*)O(/)
fonte
C,
232229 bytesDiversão com recursão.
Ungolfed:
Casos de teste:
fonte
JavaScript ES7, 119 bytes
Estou recebendo um bug com a compreensão de array, então usei
.map
Experimente online no ESFiddle
fonte
PHP - 259 caracteres
Assumindo entrada na variável POST i .
fonte
C # - 392 caracteres
No entanto, se argumentos podem ser usados em vez de entrada padrão, podemos reduzi-lo a
C # - 366 caracteres
fonte
Scala
412 376 349 335312:fonte
Python - 206
Versão não destruída:
Entrada do argumento da linha de comando; saída na saída padrão.
fonte
ECMAScript 6 (131)
Apenas digitados juntos em alguns segundos, para que provavelmente possa ser mais jogado ou talvez até melhor. Eu posso revisitá-lo amanhã:
fonte
C # -
323284241Editar: Substituir a pilha por uma matriz é bem mais curta
Edit2: Substituído os ifs por uma expressão ternária
fonte
string[] i
=>string[]i
.Python 2
Eu tentei algumas abordagens diferentes das publicadas até agora. Nenhuma delas é tão curta quanto as melhores soluções Python, mas elas ainda podem ser interessantes para alguns de vocês.
Usando recursão, 146
Usando manipulação de lista, 149
Usando
reduce()
, 145fonte
Matlab, 228
Ungolfed:
fonte
;
. Então eu acho que a contagem de bytes é o mesmocr+lf
para uma nova linha, com dois caracteres. Meu bloco de notas ++ contava 230 caracteres na sua versão de 3 linhas, mas apenas 128 se eu colocar tudo em uma linha (removi 2 * 2 = 4 caracteres das 2 novas linhas e adicionei dois;
). Tente você mesmo;)K5, 70 bytes
Não tenho certeza de quando o K5 foi lançado, então isso pode não contar. Ainda impressionante!
fonte