Você deve escrever um programa para avaliar uma sequência que seria inserida em uma calculadora.
O programa deve aceitar entrada e saída da resposta correta. Para idiomas que não possuem funções padrão de entrada / saída, você pode assumir as funções readLine
e print
.
Exigências
- Não usa nenhum tipo de função "eval"
- Pode lidar com ponto flutuante e números negativos
- Suporta pelo menos os operadores +, -, * e /
- Pode manipular entrada contendo um ou mais espaços entre os operadores e números
- Avalia a expressão da esquerda para a direita
O programa que é o menor ganha. Em caso de empate, o programa enviado primeiro vence.
Você pode assumir que a entrada é válida e segue o formato correto
Casos de teste
Entrada
-4 + 5
Resultado
1
Entrada
-7.5 / 2.5
Resultado
-3
Entrada
-2 + 6 / 2 * 8 - 1 / 2.5 - 18
Resultado
-12
code-golf
math
arithmetic
Kevin Brown
fonte
fonte
Respostas:
Ruby -
74696765 caracteresfonte
b[0],b[1].to_f
você pode substituí-lo|b|
por|b,c|
e usarb,c.to_f
a.send(b,c.to_f)
, usea.send b,c.to_f
. Ele salva um char$<
vez deARGF
Befunge -
37 x 5 = 18538 x 3 = 114 caracteresIsso é limitado a números inteiros, pois o Befunge não possui suporte a ponto flutuante.
Explicação
A maior característica distintiva do Befunge é que, em vez de ser um conjunto linear de instruções, como a maioria dos idiomas; é uma grade 2D de instruções de caracteres únicos, onde o controle pode fluir em qualquer direção.
O primeiro
&
simplesmente digita o primeiro número. Ov
e>
seguida, redirecione o controle para o caminho principal na segunda linha.Isso insere um caractere (
~
), duplica-o (:
), empurra zero para a pilha (0
), exibe os dois elementos superiores e determina se o segundo é maior que o primeiro (`
estou surpreso que você não possa usar `` para obter backticks de código. ), inverte a veracidade do elemento superior (!
) e, então, vai para a direita se for zero; caso contrário, para baixo (#v_
).Basicamente, está verificando se a entrada
-1
não representa mais entrada.Se a entrada foi
-1
, o valor duplicado é descartado ($
), a parte superior da pilha é exibida como um número inteiro (.
) e o programa é interrompido (@
).Caso contrário, um processo semelhante é repetido para determinar se a entrada é menor ou igual a um espaço. Se for um espaço, o controle será desativado; caso contrário, o controle será direcionado para a direita.
Se for um espaço, será redirecionado para a esquerda (
<
); o programa halt (@
), output (.
) e redirecionamento direito (>
) são todos ignorados usando#
; mas o descarte é executado para remover o espaço da pilha. Finalmente, ele é redirecionado para iniciar a próxima execução (^
).Se não fosse um espaço, o mesmo processo é usado para dividir se estiver dentro
[+, *]
ou[-, \]
indo para a direita e para cima, respectivamente.Pois
[+, *]
é novamente dividido para determinar se é um+
ou a*
. Se+
for direcionado para baixo, o próximo número será inserido (&
) e eles serão adicionados (+
), o controle se moverá e será redirecionado para o caminho principal do próximo caractere. Se,*
então, ele entra (&
) e multiplica (*
), então envolve diretamente.Para
[-, \]
isso começa no cabeçalho direito à esquerda. Eles#
pulam o caractere depois deles, então o caminho inicial é o"-"`_
que simplesmente determina se é-
ou/
. Se for,/
então continua a esquerda para inserir (&
) e dividir (/
). Se estiver,-
então ele vai para a direita, pulando novamente os caracteres para que seja executado,&"-"$-
resultando no número que está sendo inserido (&
), o-
caractere sendo empurrado para a pilha e depois descartado ("-"$
) e, em seguida, a subtração sendo calculada (-
). O controle é então redirecionado de volta ao caminho principal.fonte
Python 3, 105 bytes
Gerencia as quatro operações básicas, mas custa apenas 5 caracteres cada para adicionar
^
ou%
.A precedência das operações é da esquerda para a direita.
fonte
Python (156)
fonte
C -
168126 caracteresfonte
Tcl 8.6,
5748 caracteres.Entrada de argumentos:
De Stdin (
6453 )Você precisa usar o shell interativo para ambas as soluções.
I tratar a entrada de lista como (Tcl usa espaços como delimitador) tomar o primeiro elemento e atribuí-lo
a
, então eu ando sobre o resto, tendo 2 elementos cada vez, o operador e um segundo número, aplicar o operador de$a
e$b
e atribuir o resultado paraa
. No final, o resultado está chegandoa
.fonte
lmap
issoforeach
é um bom substituto.Haskell:
124114 caracteresUma resposta bastante direta, usando correspondência de padrões e uma simples declaração de caso para o trabalho pesado. Uso:
fonte
((case m of{..})(read u)(read b))
escrever((case m of{..}$read u)$read b)
, 2 caracteres a menos.C:
111108 caracteresCumpre todos os requisitos, uso:
fonte
~scanf
pode substituir+1
. Além disso,c^45
->c%5
ec^42
->c%2
devem funcionar.C ++ 0x
205203198194 caracteresBem formatado:
fonte
Perl (97)
ler a partir de argumentos
ler da entrada
fonte
PostScript (145)
Outra entrada PostScript (graças a luser droog por cavar os campos interessantes para PostScript!):
Sem golfe:
fonte
Python - 308
Versão legível:
Recebe expressão como argumento da linha de comando, saída na saída padrão.
fonte
Postscript (340)
E um pouco mais legível:
fonte
JavaScript (208 caracteres compactados)
Para maior clareza, este é o código antes de compactá-lo ( JS-Fiddle ):
Aqui, ele é compactado em 208 caracteres ( JS-Fiddle ):
Como estou terminando linhas com ponto-e-vírgula, todo o espaço em branco removível foi ignorado para a contagem de caracteres, mas deixado para maior clareza.
fonte
Haskell - 124
O resultado será embrulhado em
Maybe
mônadaTambém requer a importação
<*>
deControl.Applicative
, mas as importações podem ser feitas fora do código, então espero que seja permitido.fonte
C #
(234)(231)(229)(223)(214)fonte
JavaScript (87 caracteres)
fonte
Java 11, 151 (como função lambda)
Função Lambda pegando uma entrada String e produzindo um float.
Experimente online.
Java 11, 241 bytes (como programa completo com E / S solicitada)
Programa completo pegando uma linha de String através de STDIN e enviando para STDOUT.
Experimente online.
Explicação:
fonte
05AB1E , 30 bytes
Experimente online ou verifique todos os casos de teste .
Explicação:
Se um
eval
builtin fosse permitido, isso poderia ser uma abordagem alternativa ( 16 bytes ):Experimente online ou verifique todos os casos de teste .
Explicação:
Isso mudaria
"-2 + 6 / 2 * 8 - 1 / 2.5 - 18"
para"((((((-2)+6)/2)*8)-1)/2.5)-18"
antes de usar oeval
builtin (usar.E
diretamente daria precedência ao operador*/
sobre+-
, daí a conversão com parênteses primeiro).fonte