Иногда полезно запустить математическую задачу с несколькими входами. Цель этой задачи - создать программу, которая облегчит эту задачу.
Числовые выражения
Вы должны поддерживать 3 типа выражения:
- Генератор одного числа: очень просто, просто буквальное число
- Генератор нескольких номеров: немного сложнее. Тебя окружают квадратные скобки (
[]
). Числа,
в выражении разделяются запятой ( ). пример[-1,2,3.26]
. - Генератор диапазонов: он окружен фигурными скобками (
{}
). Он будет иметь 3 числа, разделенные запятой. Формат этого выражения{start,stop,step}
.start
иstop
включительно.
Правила оценки
- Вы должны поддерживать порядок операций. ( https://en.wikipedia.org/wiki/Order_of_operations#Definition )
- Вам не нужно поддерживать скобки.
- В выражении может присутствовать любое количество пробелов.
- Вы должны поддерживать числа с плавающей запятой (с любой точностью по умолчанию ваш язык в порядке).
- Деление по
0
результатам вNaN
(не число).
Ваша программа должна поддерживать умножение ( *
), деление ( /
), сложение ( +
) и вычитание (-
).
Выход
Каждая строка вывода является одной из комбинаций генераторов. Формат - это выражение (с подставленными в него действительными числами), за которым следует знак равенства (=
) и результат вычисления. Все комбинации генераторов должны быть представлены в выходных данных.
Примеры
( >>>
обозначает ввод)
>>>3 * [3,2]
3 * 3 = 9
3 * 2 = 6
>>>{1,2,3}
1 = 1 <-- this is because 1 + 3 > the end
>>>{0,2,1} + {0,1,1}
0 + 0 = 0
1 + 0 = 1
2 + 0 = 2
0 + 1 = 1
1 + 1 = 2
2 + 1 = 3
>>>6/[2,3]
6/2 = 3
6/3 = 2
>>>{1.5,2.5,0.5}
1.5 = 1.5
2 = 2
2.5 = 2.5
>>>3-{6,5,-1}
3-6 = -3
3-5 = -2
>>>5/{-1,1,1}
5/-1 = -5
5/0 = NaN
5/1 = 5
>>>4.4 / [1,2.2] + {0,2,1}
4.4 / 1 + 0 = 4.4
4.4 / 1 + 1 = 5.4
4.4 / 1 + 2 = 6.4
4.4 / 2.2 + 0 = 2
4.4 / 2.2 + 1 = 3
4.4 / 2.2 + 2 = 4
>>> [1,2] / 0 + 5
1 / 0 + 5 = NaN
2 / 0 + 5 = NaN
Программа должна быть короткой, чтобы я мог ее запомнить и использовать где угодно.
Спасибо @PeterTaylor и @geokavel за помощь мне с этим постом в песочнице
x/0
приводит ли к мгновенной оценке к NaN, или я должен рассматривать NaN как значение?Ответы:
JavaScript (ES6),
213211 байтобъяснение
Рекурсивная функция, которая выполняет выражение, если она не содержит генераторов нескольких чисел или диапазонов, или если она содержит один из этих генераторов, вызывает себя, заменяя генератор на каждое произведенное им число.
Деление на
0
в JavaScript производитInfinity
, поэтомуInfinity
может быть просто заменено наNaN
.Используя этот метод, мульти-генераторы анализируются от начала к концу, а не от начала к концу, как в тестовых примерах. Это просто означает, что порядок вывода выражений иногда отличается.
Тестовое задание
Тест не использует деструктурирующие назначения для совместимости браузера.
источник
Хаскелл,
474362 байтаФункция f принимает строку в качестве входных данных и печатает результаты
тесты:
выход:
источник
Python 3, 387 байт
Вы можете проверить это с помощью следующего кода:
Вот код без ключа:
Он работает путем нахождения первого набора скобок любого типа, а затем перебирает все значения внутри него, заменяя скобки и его содержимое значением и рекурсивно запускает метод. Используется,
eval
если в строке нет скобок. Возвращается,NaN
если работает исключениеeval
.источник
e[:]=s[:]
? Неe[:]=s
сделал бы то же самое?Java, 874 байта
Подробно Попробуйте здесь
источник
Dyalog APL , 164 байтаЭтот ответ не соответствует обновленным требованиям и поэтому не является конкурирующим:
Он использует регулярные выражения для изменения данного выражения в соответствующий APL (и все операторы изменены для реализации
NaN
) и для извлечения операторов. Он заменяет все операторы на конкатенацию и выполняет выражение для получения окончательных входных чисел. Затем он сплетает все вместе, чтобы получить окончательный результат.Сохраняет порядок оценки APL (строго справа налево).
Обрабатывает скобки правильно.
Контрольные примеры (с добавленными скобками для принудительного выполнения математического порядка выполнения):
источник