Создайте программу, которая решает математическое выражение, используя элементы с чередующихся сторон выражения. Таким образом, вместо чтения слева направо, вы читаете первый символ, затем последний, затем второй, затем второй до последнего и т. Д. Это даст вам новое выражение, которое вы должны оценить и вывести.
a*b/c+d-e
135798642 <-- Order you read the expression in
ae*-bd/+c <-- Order of operation.
Пример:
1*3/2+4-5
15*-34/+2 = -255
Если выражение не «работает», его 1
необходимо вставить в необходимые позиции, чтобы оно работало.
Несколько примеров, вероятно, проиллюстрируют это лучше:
Input: 1+1+1+1+1
Result: 23 // Because 1+1+1+1+1 -> 11++11++1 -> 23
Input: 1+2-3+12-5
Result: -19 // Because 1+2-3+12-5 -> 15+-22-13+ -> 15+-22-13+1 -> -19
// |
// Not valid expression
Input: 2*2*2*2*2
Result: 968 // Because 2*2*2*2*2 -> 22**22**2 -> 22*1*22*1*2 -> 968
// || ||
// Not valid, 1 must be inserted
Input: 17/2
Output: 127 // Because 17/2 = 127/ -> 127/1 -> 127
Операторы , которые должны поддерживаться в + - * /
. Там не будет скобок. Используются нормальные математические правила и «синтаксис», например **
, не означает возведения в степень. a++++1
эквивалентно a+1
(т.е. стиль MATLAB, а не C ++).
В случае каких-либо сомнений, некоторые допустимые операции:
-a
+a
a++b
a+-b
a*-b
a*+b
a*++b
a/b
a/-b
a/+b
-a/--b
Пока все перечисленное не действует. Показано, что они должны быть заменены:
a+ | a+1
a- | a-1
a++++ | a++++1 (This is equivalent to a+1)
a*+++ | a*+++1 (This is equivalent to a*1)
a**b | a*1*b
a*/b | a*1/b
a/*b | a/1*b
a* | a*1
*a | 1*a
***a | 1*1*1*a
Правила:
- Код может быть функцией или полной программой
- Ввод может быть STDIN или аргумент функции
- Входные данные должны быть допустимым математическим выражением без кавычек
''
или""
. - Выходные данные должны быть ответом на новое выражение в виде целого числа, десятичной или упрощенной дроби.
- Должно поддерживаться не менее трех цифр после десятичной точки. Так что
1/3 = 0.333
нет0.33
.0.333333333
принято ans = ...
принято- Начальные и конечные переводы строки и пробелы принимаются.
- На входе будут только целые числа
- Деление на ноль может привести к ошибке, NaN, Inf и т. Д. Вывод числа не допускается.
Как всегда, самый короткий код в байтах побеждает. Победитель будет выбран через неделю со дня объявления конкурса. Ответы, опубликованные позже, могут все же выиграть, если они короче, чем текущий лидер.
источник
2^64
, и должна ли она быть ошибкой или переносом, если вы перейдете?0/0
если выражение вырастет до целочисленного деления или по модулю на ноль?x/0
это действительный вывод. Пока он не выводит неправильный ответ, все в порядке. Ошибка и «не число» по определению верны, а бесконечность «достаточно правильна»,Ответы:
Perl,
108100 байтКод 96 байтов, плюс 4 для аргумента командной строки
-pF//
, где-p
вставкиwhile (<>) { .. } continue { print }
и-F//
разбивает ввод и вставляет его@F
.Обратите внимание, что у ввода не должно быть завершающей строки, поэтому используйте
/bin/echo -n 'formula' | perl ...
Менее гольф:
тестирование
Поместите вышесказанное в файл с именем
114.pl
, а нижеприведенный тестовый скрипт в файл рядом с ним:Запуск его выводит:
Обратите внимание, что
1/0
вызывает ошибку деления на ноль:eval
выходные данныеundef
, которые представлены пустой строкой.источник
JavaScript ES6, 105
106Редактировать Сохранено 1 байт thx @Kenney
Тестовый фрагмент
источник
p < '0' ? ( c=='/' | c<'+' || ' ' )+c : c ;
.