Lavori per un'azienda che desidera creare una calcolatrice intuitiva e quindi ti è stato assegnato il compito di aggiungere agli utenti la possibilità di utilizzare "scorciatoie numeriche", ovvero lettere che rappresentano valori numerici, come kper 1000. Poiché la tua azienda vuole risparmiare sull'archiviazione in detti calcolatori, devi ridurre il più possibile il codice per ridurre i costi di archiviazione.
Il tuo compito
Devi creare una funzione che legge un'espressione come input da STDIN o la prende come parametro e restituisce la sua valutazione o la stampa su STDOUT.
Alcuni chiarimenti
Vorrei fare alcune definizioni. Prima di tutto, abbiamo l'input, che chiamo espressione. Questo può essere simile al seguente:
x + y / z
Da questa espressione abbiamo tre numeri: x, ye z, separati da operatori ( +e /). Questi numeri non sono necessariamente numeri interi positivi (o addirittura numeri interi). Ciò che complica le cose è quando dobbiamo valutare le scorciatoie contenute nei numeri. Ad esempio, con
2k15
ai fini della valutazione, abbiamo diviso questo in tre numeri: 2, 1000(che è k), e 15. Quindi, secondo le regole, le combiniamo per ottenere
2*1000 + 15 = 2015
Speriamo che questo renda un po 'più facile capire le seguenti regole.
Regole
NB Se non diversamente specificato, è possibile interpretare la parola "numeri" o i suoi sinonimi per includere le scorciatoie.
Quanto segue costituisce le abbreviazioni numeriche tua funzione deve essere in grado di processo:
k, m, b, t, and e.k, m, b, and tcorrispondono1000, 1000000, 1000000000, and 1000000000000rispettivamente ai valori (mille, un milione, un miliardo e un trilione). Laestenografia sarà sempre seguita da un altro numerone rappresenta10^n. È necessario consentire la presenza e la presenza di shorthand numerici innprecedenzae. Ad esempio,kekvaluta1000*10^1000.Per semplicità, se un numero contiene la scorciatoia
e, verrà utilizzato solo una volta.Qualsiasi numero ( comprese le abbreviazioni ) prima di una scorciatoia viene moltiplicato per esso. ad es.
120kkverrebbe valutato come120 * 1000 * 1000. Se non c'è nessun numero prima di esso, devi supporre che il numero sia 1 (come in matematica potresti trattareximplicitamente una variabile come1x). ad esempioe10valuta10^10. Un altro esempio:2m2kvaluta2*1000000*2*1000(non viene aggiunto nulla).Qualsiasi numero (le scorciatoie non si applicano) che segue l' ultima scorciatoia in un numero contenente una scorciatoia viene aggiunto ad esso. ad es.
2k12verrebbe valutato come2*1000 + 12. L'eccezione a ciò è seeviene usata la scorciatoia , nel qual caso il numero ( shorthands incluso ) che segueeverrà trattato comene valutato come10^n(vedi la prima regola).La tua funzione deve essere in grado di elaborare gli operatori
+, -, *, and /che sono rispettivamente addizione, sottrazione, moltiplicazione e divisione. Potrebbe essere più elaborato, se lo desideri.Le operazioni vengono valutate in base all'ordine delle operazioni.
I numeri in shorthands non sono solo numeri interi.
3.5b1.2è valido e deve essere valutato come3.5*1000000000 + 1.2 = 3500000001.2Gli incorporati non sono ammessi, se esistono per questo tipo di cose. L'eccezione che aggiungerei sarebbe se la tua lingua converte automaticamente grandi numeri in notazione scientifica, nel qual caso è ammissibile per il tuo output.
Vince il codice più breve in byte, si applicano scappatoie standard.
Ingresso
L'input sarà un'espressione con ogni numero e operatore separati da spazi. I numeri possono contenere o meno una scorciatoia. Di seguito è mostrato un esempio:
10 + 1b - 2k
Produzione
La tua funzione deve generare la valutazione dell'espressione come un numero. È ammissibile utilizzare la notazione scientifica se l'output fosse troppo grande per essere visualizzato. È necessario disporre di almeno tre cifre decimali se il numero non è un numero intero. È ammissibile se si mantengono queste cifre decimali se il numero è un numero intero.
Casi test
Ingresso
t
Produzione
1000000000000
Ingresso
1 + 4b / 10k11
Produzione
399561.483
Ingresso
e2 + k2ke-1 - b12
Produzione
-999799912
o
-999799912.000
Ingresso
142ek12
Produzione
142e1012
o
142.000e1012
Ingresso:
1.2m5.25
Produzione:
1200005.25
Note finali
Questa è la mia prima sfida pubblicata (con l'aiuto degli utenti sulla sandbox). Se qualcosa non è chiaro, fammelo sapere e farò del mio meglio per chiarire.
1000 + 2000 * 10 ^ -1, ma che ha dato una risposta finale di -999998712. (Inoltre, la mia interpretazione non sembra coincidere con l '" ultima scorciatoia " della regola 4 , ma non sono sicuro di come altrimenti comprendere la sequenza k2k.) Puoi spiegare i passaggi per valutarla?
2m2kdovrebbe essere aggiunto alla discussione della regola 3. Inoltre, potrebbe essere meglio utilizzare un diverso termine - forse "integer" - per i numeri letterali come 123quella non sono shorthands. La parola "numero" ha circa 3 diverse definizioni qui, così com'è ora.