Фон
Эта головоломка является вариацией головоломки « четыре четверки» (сама тема прошлого вопроса ). Как и в этой головоломке, цель состоит в том, чтобы найти математические выражения для различных целых чисел, используя только четыре цифры и определенные математические операторы. В этом случае, однако, допустимыми цифрами являются только 2, 0, 1 и 5 . Каждый должен появиться точно один раз в решении и в правильном порядке. Удивительно много целых чисел можно представить таким образом. Решающим рекомендуется сначала попробовать решить их вручную, так как это странно приятно.
правила
Константы могут состоять из одной или нескольких цифр:
- Целые числа: например, 2, 0, 15 и т. Д.
- Десятичные дроби: например .2, .01, 1.5 и т. Д.
- Повторяющиеся десятичные дроби : например .2 ~ (= 0,222 ...), 0,15 ~ (= 0,1555 ...), 20,15 ~~ (= 20,1515 ...)
Разрешены следующие унарные операции:
- Одинарное отрицание: -x
- Квадратный корень: sqrt (x)
- Целочисленный факториал: х!
Разрешены следующие двоичные операции:
- Стандартные арифметические операторы: x + y, xy, x * y и x / y
- Произвольное возведение в степень: x ^ y
- Произвольные корни: rt [x] (y) (= x'ый корень y)
задача
Ваша программа должна распечатать выражения для максимально возможного числа целых чисел от 0 до 100, а затем вывести количество произведенных выражений.
- Решения должны быть напечатаны по порядку в формате n = [expr].
- В выражениях должны использоваться все цифры 2, 0, 1, 5, по одному в каждом порядке.
- Выражения должны быть напечатаны с использованием обозначений, описанных выше. Ненужные скобки разрешены, но не обязательны, как и пробел. Порядок приоритета операторов: унарное отрицание, факториал, возведение в степень, умножение / деление и сложение / вычитание.
- Программа не должна возвращать решения для всех чисел. Программа, которая просто выводит 0, следовательно, действительна; Тем не менее, см. раздел оценки ниже.
- Программа должна работать менее чем за 15 минут на современном компьютере.
Вы можете написать программу или функцию. Выражения должны быть напечатаны в STDOUT (или ближайшую альтернативу). Количество выражений может быть напечатано в STDOUT или возвращено как целое число. Применяются стандартные ограничения гольфа.
Пример вывода
0=2*0*1*5
10=20*1*.5
42=((2+0!)!+1)!/5!
100=20*1*5
4
счет
Обновление : @orlp отметил недостаток в системе подсчета очков. См. Http://meta.codegolf.stackexchange.com/questions/5106/way-of-salvaging-two-zero-one-five-puzzle-challenge для обсуждения того, как или следует ли это исправить.
Решения оцениваются сначала по количеству производимых выражений, а затем по длине кода в байтах. Следовательно, 1000-байтовая программа, которая выдает 80 результатов, превзойдет 100-байтовую программу, которая выдает только 79 (хотя последняя может быть легко расширена для включения отсутствующих результатов).
Для тех, кому нужна мотивирующая цель, ниже приведена нижняя граница числа выражений, которые могут быть представлены. Я не планирую подавать заявку, поэтому вполне возможно выиграть с меньшими затратами!
Как минимум 85 (из 101), хотя вполне может быть и выше.
Табло
В качестве дополнительного стимула, вот краткая информация о прогрессе оценки. Всякий раз, когда вы набираете наивысший балл, не стесняйтесь, чтобы добавить себя в верхней части таблицы (или попросить кого-то еще).
- 0 выражений, 1 байт (Pyth): реализация, которая просто выводит 0
Ответы:
85 ~ 2400 байт
Мне немного грустно, что это проблема кода в гольф, так как я чувствую, что все мои предыдущие усилия были довольно бесполезны теперь, когда я опубликую это:
С этого момента это просто проблема сжатия. Может быть, я буду соревноваться позже, может быть, я не буду. Для меня большая часть удовольствия заключалась в том, чтобы найти больше формул.
Подсказка для тех, кто пытается написать решатель - время выполнения не должно быть проблемой. Если у вас слишком много формул для проверки, вам нужна лучшая эвристика, чтобы отбрасывать безнадежные решения и дубликаты. Код, который я написал для генерации вышеописанного, работает на Python за ~ 5 секунд.
источник