fundo
Você foi contratado recentemente por uma pequena empresa de contabilidade. O mundo da contabilidade é um pouco estranho para você, então você não tem certeza se está seguindo todas as diretrizes profissionais. Em particular, você não sabe quando deve arredondar todos esses números e em que direção; portanto, na maioria das vezes, você apenas voa e espera o melhor.
Entrada
Sua entrada é uma única sequência que representa um cálculo simples. Ele contém um número de números inteiros não negativos delimitados pelos caracteres +-*/
. A sequência lê da esquerda para a direita e as regras de precedência normais são ignoradas, portanto "23+1*3/4"
significa "começar com 23, adicionar 1, multiplicar por 3 e dividir por 4", o resultado sendo 18. A entrada não conterá números que começam com 0
(exceto 0
ele próprio), nem uma divisão por zero.
Resultado
Em cada estágio do cálculo, você pode arredondar o resultado para cima ou para baixo até o número inteiro mais próximo ou mantê-lo como está. Por fim, você arredonda para cima ou para baixo para obter um resultado inteiro. Sua saída é a lista de números inteiros que podem resultar desse cálculo, classificados e sem duplicatas.
Regras
Você pode escrever um programa completo ou uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.
Casos de teste
"42" -> [42]
"2+0+4-0" -> [6]
"23+1*3/4" -> [18]
"5/2" -> [2,3]
"5/2+7/3*6-1" -> [17,18,19,23]
"23/2/2*30-170/3" -> [-7,-6,-2,-1,0,1,3,4]
"1/3*2*2*2*2*2*2" -> [0,16,20,21,22,24,32,64]
"1/3*9" -> [0,3,9]
1/3*9
, que pode falhar se você usar números de ponto flutuante.Respostas:
J, 84 bytes
A partir de uma lista de 1 elemento, a função mantém todos os números intermediários possíveis na lista, avaliando a próxima expressão e adicionando cópias arredondadas para cima e para baixo.
Golf ainda mais e adicionar explicação amanhã.Não é possível encontrar maneiras óbvias de jogar mais.Passa em todos os testes.
Uso:
Experimente aqui.
fonte
x
no final da lista.Python 2, 220 caracteres
Ele mantém uma lista de todos os números possíveis e, a cada etapa, gera três números para cada número na lista, mesmo que haja duplicatas. Portanto, a complexidade do tempo de execução é exponencial. No entanto, ele funciona instantaneamente para esses pequenos exemplos. Dupes são removidos no final.
Ele costuma
fractions.Fraction
fazer a divisão exata, evitando inexatitudes de ponto flutuante.Adicione 5 caracteres (
r=map(X,g)
->r=set(map(X,g))
) para aumentar drasticamente o desempenho.fonte
\D
é uma classe de caracteres predefinidos para combinar os não-dígitosr"(\D)"
ou"(\\D)"
. Além disso, se você usa o Python 3, pode substituir a indexaçãoF
por uma atribuição com estrela, por exemplo::A,B,*F=F
useA
e emB
vez deF[0]
eF[1]
, e se livre deF=F[2:]
."\D"
acaba funcionando de qualquer maneira e é mais curto. Não é uma sequência de escape válida, portanto, o Python inclui apenas o\
eD
literalmente. Boa dica do Python3, na verdade, vou dar uma olhada, apesar de precisar substituir os backticksrepr()
e transformar omap
resultado em uma lista. Atribuição Com estrela é algo que eu desejo Python 2 teve ..Python,
421370354 bytesDesculpe, por favor, tenha paciência comigo. Eu sou realmente novo em python (eu estava apenas procurando por uma linguagem que suporte o fractiosn) e usei todos os poucos truques que conhecia para encurtar o código, mas ainda é um monstro, considerando que existe uma solução em python de quase metade do tamanho. Aprendi muito e pensei em enviá-lo de qualquer maneira =)
Nova versão graças a @ kirbyfan64sos e @Zgarb
Versão antiga
fonte
if
s (d={'+': operator.add, '-': operator.sub, ...}; d[op](a, b)
). Além disso,[floor(k) for k in n]
pode ser reduzido paramap(floor, n)
e asn.add
chamadas podem se tornarn.extend([floor(f), ceil(f), f])
.F
apenas uma vez, para poder fazerfrom fractions import*
e salvar alguns bytes. O mesmo commath
. Remova os espaços ao redor=
, eles são desnecessários. Além disso, você deve atribuir a entrada aos
invés de codificação.s=input()
em vez des = "1/3*9"
, retire seus comentários, etcMathematica, 134
fonte
MATLAB, 283 caracteres
Ungolfed:
Enquanto escrevia isso, percebi que havia uma maneira ainda mais curta de fazer isso, que acrescentarei assim que terminar de escrevê-lo.
fonte
VBA, 347 bytes
fonte