Ви працюєте в компанії, яка хоче зробити зручним для користувача калькулятор, і таким чином перед вами поставлено завдання додавати можливість користувачам використовувати "числові скорочення", тобто букви, що представляють числові значення, наприклад, kдля 1000. Оскільки ваша компанія хоче заощадити гроші на зберіганні в зазначених калькуляторах, ви повинні максимально скоротити код, щоб зменшити витрати на зберігання.
Ваше завдання
Ви повинні створити функцію, яка або зчитує вираз як вхід з STDIN, або приймає його як параметр і повертає його оцінку або друкує його в STDOUT.
Деякі роз'яснення
Дозвольте мені зробити деякі визначення. По-перше, у нас є вхід, який я називаю виразом. Це може бути щось на кшталт наступного:
x + y / z
У цьому виразі ми маємо три числа: x, y, і z, розділені оператори ( +і /). Ці числа не обов'язково є натуральними цілими числами (або навіть цілими числами). Що ускладнює речі, це коли ми повинні оцінювати скорочення, що містяться в числах. Наприклад, с
2k15
для цілей оцінки, ми розділили це на три числа: 2, 1000(що k), і 15. Потім, згідно з правилами, їх поєднуємо для отримання
2*1000 + 15 = 2015
Сподіваємось, це полегшує розуміння наступних правил.
Правила
Примітка: Якщо не вказано інше, ви можете інтерпретувати слово "числа" або його синоніми, включаючи скорочення.
Нижче є числові Shorthands ваша функція повинна бути в змозі процесу:
k, m, b, t, and e.k, m, b, and tвідповідають значенням1000, 1000000, 1000000000, and 1000000000000відповідно (одна тисяча, мільйон, мільярд та один трильйон). Скороченняeзавжди буде супроводжуватися іншим номеромn, і представляє10^n. Ви повинні дозволити, щоб числові стенограми були присутнімиnта були представлені ранішеe. Наприклад,kekоцінює до1000*10^1000.Для простоти, якщо число має в ньому скорочення
e, воно буде використано лише один раз.Будь-яке число ( включене скорочення ) до скорочення на нього множиться. наприклад
120kk, буде оцінено як120 * 1000 * 1000. Якщо перед ним немає числа, ви повинні припустити, що число дорівнює 1 (як, наприклад, в математиці ви могли б посилатися на зміннуxнеявно як1x). наприкладe10оцінює до10^10. Інший приклад:2m2kоцінює до2*1000000*2*1000(до нього нічого не додано).До нього додається будь-яке число (скорочення не застосовується), що слідує за останньою стенограмою у номері, що містить стенограму. наприклад
2k12, буде оцінено як2*1000 + 12. Виняток із цього випадку є, якщо використовується скороченняe, і в такому випадку число ( включене скорочення )eбуде розглянуто якnі оцінено як10^n(див. Перше правило).Ваша функція повинна вміти обробляти операторів,
+, -, *, and /що складають відповідно, віднімання, множення та ділення відповідно. Це може обробити більше, якщо ви цього хочете.Операції оцінюються відповідно до порядку операцій.
Числа у стенограмах - це не лише цілі числа.
3.5b1.2є дійсним і оцінюється як3.5*1000000000 + 1.2 = 3500000001.2Вбудовані модулі не дозволяються, якщо вони існують для подібних речей. Виняток, який я додам, буде, якщо ваша мова автоматично перетворює велику кількість на наукові позначення, і в цьому випадку це допустимо для ваших результатів.
Найкоротший код у байтах виграє, застосовуючи стандартні лазівки.
Вхідні дані
Вхід буде виразом з кожним числом та оператором, розділеним пробілами. Цифри можуть містити або не містити скорочення. Зразок показаний нижче:
10 + 1b - 2k
Вихідні дані
Ваша функція повинна виводити оцінку виразу як числа. Допустимо використовувати наукові позначення, якщо вихід буде занадто великим для відображення. У вас повинно бути не менше трьох знаків після коми, якщо число не є цілим числом. Це допустимо, якщо ви зберігаєте ці десяткові знаки, якщо число є цілим числом.
Випробування
Вхідні дані
t
Вихідні дані
1000000000000
Вхідні дані
1 + 4b / 10k11
Вихідні дані
399561.483
Вхідні дані
e2 + k2ke-1 - b12
Вихідні дані
-999799912
або
-999799912.000
Вхідні дані
142ek12
Вихідні дані
142e1012
або
142.000e1012
Вхід:
1.2m5.25
Вихід:
1200005.25
Заключні ноти
Це мій перший виклик, розміщений (за деякою допомогою користувачів на пісочниці). Якщо щось незрозуміле, дайте мені це знати, і я зроблю все можливе, щоб уточнити.
1000 + 2000 * 10 ^ -1, але це дало остаточну відповідь -999998712. (Крім того, моя інтерпретація, схоже, не узгоджується з " останньою стенограмою " правила 4 , але я не впевнений, як інакше зрозуміти послідовність k2k.) Чи можете ви пояснити, будь ласка, кроки в її оцінці?
2m2kмає бути додані до обговорення правила 3. Крім того , було б краще використовувати інший термін - можливо , «ціле» - для буквальних чисел , як , 123що не є скороченими. Слово "число" має тут приблизно 3 різних визначення, як це є зараз.