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 k
para 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 t
correspondem aos valores1000, 1000000, 1000000000, and 1000000000000
respectivamente (mil, um milhão, um bilhão e um trilhão). Ae
abreviação será sempre seguida por outro númeron
, e representa10^n
. Você deve permitir que atalhos numéricos estejam presentesn
e apresentem antese
. Por exemplo,kek
avalia 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,
120kk
seria 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 tratarx
implicitamente uma variável como1x
). por exemplo,e10
avalia para10^10
. Outro exemplo:2m2k
avalia 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,
2k12
seria avaliado como2*1000 + 12
. A exceção é se a abreviaçãoe
for usada. Nesse caso, o número ( abreviação incluído ) a seguire
será tratadon
e 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.2
Built-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ênciak2k
.) Você pode explicar as etapas de avaliação?2m2k
deve 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 como123
esse não são taquigrafia. A palavra "número" tem cerca de 3 definições diferentes aqui, como está agora.Respostas:
Python 2, 553 bytes
Essa pergunta parecia um pouco mal amada e divertida, então eu tentei. Eu nunca fiz golfe com código antes, então provavelmente há muito que pode ser melhorado, mas dei o melhor de mim com base no meu conhecimento do idioma. Uma solução equivalente é possível no Python 3 ao custo de um byte extra:
print repr(z[0])
->print(repr(z[0]))
.O uso é algo parecido com o
ie
saídas
A contribuição de como melhorar isso seria muito apreciada. Se houver interesse suficiente, posso desdobrar e comentar o programa, mas a maioria já é bastante legível (um fato preocupante no código de golfe).
Deve-se notar que o programa quebra com o exemplo
142ek12
porque esse valor é ridiculamente grande e o programa transborda.Para compensar, o seguinte é um pouco mais longo, mas teoricamente pode lidar com qualquer coisa lançada devido ao uso da biblioteca de precisão arbitrária incorporada. A sintaxe é idêntica.
Python 2,
589588 bytes (precisão arbitrária)fonte