Você trabalha para uma empresa que deseja criar uma calculadora fácil de usar e, portanto, recebeu a tarefa de adicionar a capacidade de os usuários usarem "atalhos numéricos", ou seja, letras que representam valores numéricos, como kpara 1000. Como sua empresa deseja economizar dinheiro com armazenamento nessas calculadoras, você deve minimizar seu código o máximo possível para reduzir o custo de armazenamento.
Sua tarefa
Você deve criar uma função que leia uma expressão como entrada de STDIN ou a aceite como parâmetro e retorne sua avaliação ou imprima em STDOUT.
Alguns esclarecimentos
Deixe-me fazer algumas definições. Primeiro, temos a entrada, que eu chamo de expressão. Isso pode ser algo como o seguinte:
x + y / z
Dentro desta expressão que têm três números: x, y, e z, separados por operadores ( +e /). Esses números não são necessariamente números inteiros positivos (ou mesmo números inteiros). O que complica as coisas é quando temos que avaliar taquigrafia contidas em números. Por exemplo, com
2k15
Para fins de avaliação, nós dividir este em três números: 2, 1000(que é k), e 15. Então, de acordo com as regras, nós as combinamos para obter
2*1000 + 15 = 2015
Esperamos que isso facilite um pouco a compreensão das seguintes regras.
Regras
Nota: Salvo especificação em contrário, você pode interpretar a palavra "números" ou seus sinônimos para incluir letras abreviadas.
O seguinte constitui os atalhos numéricos a sua função deve ser capaz de processar:
k, m, b, t, and e.k, m, b, and tcorrespondem aos valores1000, 1000000, 1000000000, and 1000000000000respectivamente (mil, um milhão, um bilhão e um trilhão). Aeabreviação será sempre seguida por outro númeron, e representa10^n. Você deve permitir que atalhos numéricos estejam presentesne apresentem antese. Por exemplo,kekavalia como1000*10^1000.Por uma questão de simplicidade, se um número tiver uma abreviação
e, ele será usado apenas uma vez.Qualquer número ( taquigrafia incluído ) antes de uma taquigrafia ser multiplicada por ele. por exemplo,
120kkseria avaliado como120 * 1000 * 1000. Se não houver um número antes dele, você deve assumir que o número é 1 (como, em matemática, você pode tratarximplicitamente uma variável como1x). por exemplo,e10avalia para10^10. Outro exemplo:2m2kavalia para2*1000000*2*1000(nada é adicionado a ele).Qualquer número (atalhos não se aplica) após o último atalho em um número que contenha um atalho é adicionado a ele. por exemplo,
2k12seria avaliado como2*1000 + 12. A exceção é se a abreviaçãoefor usada. Nesse caso, o número ( abreviação incluído ) a seguireserá tratadone avaliado como10^n(consulte a primeira regra).Sua função deve ser capaz de processar os operadores
+, -, *, and /que são adição, subtração, multiplicação e divisão, respectivamente. Pode processar mais, se você desejar.As operações são avaliadas de acordo com a ordem das operações.
Os números em taquigrafia não são apenas números inteiros.
3.5b1.2é válido e deve ser avaliado como3.5*1000000000 + 1.2 = 3500000001.2Built-ins não são permitidos, se existirem para esse tipo de coisa. A exceção que adicionarei seria se seu idioma converter automaticamente grandes números em notação científica; nesse caso, isso é admissível para sua saída.
O menor código em bytes vence, aplicando brechas padrão.
Entrada
A entrada será uma expressão com cada número e operador separados por espaços. Os números podem ou não conter uma abreviação. Uma amostra é mostrada abaixo:
10 + 1b - 2k
Resultado
Sua função deve gerar a avaliação da expressão como um número. É admissível usar notação científica se a saída for muito grande para ser exibida. Você deve ter pelo menos três casas decimais se o número não for um número inteiro. É admissível se você reter essas casas decimais se o número for um número inteiro.
Casos de teste
Entrada
t
Resultado
1000000000000
Entrada
1 + 4b / 10k11
Resultado
399561.483
Entrada
e2 + k2ke-1 - b12
Resultado
-999799912
ou
-999799912.000
Entrada
142ek12
Resultado
142e1012
ou
142.000e1012
Entrada:
1.2m5.25
Resultado:
1200005.25
Notas Finais
Este é o meu primeiro desafio publicado (com alguma ajuda dos usuários na caixa de areia). Se algo não estiver claro, informe-me e farei o possível para esclarecer.
1000 + 2000 * 10 ^ -1, mas isso deu uma resposta final de -999998712. (Além disso, minha interpretação não parece concordar com a " última abreviação " da regra 4. , mas não tenho certeza de como entender a sequência k2k.) Você pode explicar as etapas de avaliação?
2m2kdeve ser adicionado à discussão da regra 3. Além disso, talvez seja melhor usar um termo diferente - talvez "número inteiro" - para números literais como 123esse não são taquigrafia. A palavra "número" tem cerca de 3 definições diferentes aqui, como está agora.