Às vezes, é útil executar um problema de matemática com várias entradas. O objetivo deste desafio é criar um programa que facilite essa tarefa.
Expressões geradoras de número
Você deve suportar 3 tipos de expressão:
- Gerador de número único: muito simples, apenas um número literal
- Gerador de vários números: Um pouco mais complicado. Eles estão cercados por colchetes (
[]
). Os números são,
separados por vírgula ( ) na expressão. Exemplo[-1,2,3.26]
. - Gerador de alcance: este é cercado por chaves (
{}
). Ele terá 3 números separados por vírgula. O formato desta expressão é{start,stop,step}
.start
estop
são inclusivos.
Regras para avaliação
- Você deve suportar a ordem das operações. ( https://en.wikipedia.org/wiki/Order_of_operations#Definition )
- Você não precisa apoiar parênteses.
- Qualquer número de espaços pode ocorrer na expressão.
- Você deve oferecer suporte a números de ponto flutuante (qualquer que seja a precisão padrão de seu idioma).
- Divisão por
0
resultados emNaN
(não um número).
Seu programa deve suportar multiplicação ( *
), divisão ( /
), adição ( +
) e subtração (-
).
Resultado
Cada linha de saída é uma das combinações dos geradores. O formato é a expressão (com os números reais substituídos nela) seguida por um sinal de igual (=
) e o resultado da avaliação. Todas as combinações dos geradores devem ser representadas na saída.
Exemplos
( >>>
indica entrada)
>>>3 * [3,2]
3 * 3 = 9
3 * 2 = 6
>>>{1,2,3}
1 = 1 <-- this is because 1 + 3 > the end
>>>{0,2,1} + {0,1,1}
0 + 0 = 0
1 + 0 = 1
2 + 0 = 2
0 + 1 = 1
1 + 1 = 2
2 + 1 = 3
>>>6/[2,3]
6/2 = 3
6/3 = 2
>>>{1.5,2.5,0.5}
1.5 = 1.5
2 = 2
2.5 = 2.5
>>>3-{6,5,-1}
3-6 = -3
3-5 = -2
>>>5/{-1,1,1}
5/-1 = -5
5/0 = NaN
5/1 = 5
>>>4.4 / [1,2.2] + {0,2,1}
4.4 / 1 + 0 = 4.4
4.4 / 1 + 1 = 5.4
4.4 / 1 + 2 = 6.4
4.4 / 2.2 + 0 = 2
4.4 / 2.2 + 1 = 3
4.4 / 2.2 + 2 = 4
>>> [1,2] / 0 + 5
1 / 0 + 5 = NaN
2 / 0 + 5 = NaN
O programa precisa ser curto para que eu possa memorizá-lo e usá-lo em qualquer lugar.
Agradeço a @PeterTaylor e @geokavel por me ajudarem com este post na sandbox
x/0
resulta em uma avaliação instantânea do NaN ou tenho que tratar o NaN como um valor?Respostas:
JavaScript (ES6),
213211 bytesExplicação
Uma função recursiva que executa a expressão se ela não contiver geradores de vários números ou intervalos, ou se contiver um desses geradores, chama a si mesma com o gerador substituído por cada número produzido por ela.
Dividir por
0
em JavaScript produzInfinity
, entãoInfinity
pode simplesmente ser substituído porNaN
.Usando esse método, os geradores múltiplos são analisados de frente para frente em vez de frente para trás, como nos casos de teste. Isso apenas significa que a ordem das expressões de saída às vezes é diferente.
Teste
O teste não usa atribuições de desestruturação para compatibilidade do navegador.
fonte
Haskell,
474362 bytesA função f pega uma string como entrada e imprime os resultados
testes:
resultado:
fonte
Python 3, 387 bytes
Você pode testá-lo com o seguinte código:
Aqui está o código não destruído:
Ele funciona localizando o primeiro conjunto de colchetes de qualquer tipo e, em seguida, percorrendo todos os valores dentro dele, substituindo os colchetes e seu conteúdo pelo valor e executando o método recursivamente. Ele usa
eval
uma vez que não há colchetes na linha. RetornaNaN
se houver uma exceção em execuçãoeval
.fonte
e[:]=s[:]
? Nãoe[:]=s
faria o mesmo?Java, 874 bytes
Teste Detalhado Aqui
fonte
Dyalog APL , 164 bytesEsta resposta não segue os requisitos atualizados e, portanto, não é concorrente:
Ele usa expressões regulares para alterar a expressão especificada no APL correspondente (e todos os operadores são modificados para implementar
NaN
) e extrair os operadores. Ele substitui todos os operadores com catenação e executa a expressão para obter os números finais de entrada. Em seguida, tece tudo junto para obter a saída final.Preserva a ordem de avaliação do APL (estrito da direita para a esquerda).
Manipula parênteses corretamente.
Casos de teste (com parênteses adicionados para forçar a ordem de execução semelhante à matemática):
fonte