Мета-фон
Это было задано как вопрос о загадке , и мгновенная реакция была «ну, кто-то просто решит это с помощью компьютера». Был спор о том, насколько сложной должна быть программа для ее решения. Что ж, «насколько сложной должна быть эта программа» - это в значительной степени определение кода-гольфа , так что, возможно, PPCG может решить эту проблему?
Фон
Уравнение спички в основном нормальное математическое уравнение, но где цифра и операторы строятся физически, помещая спички на стол. (Главная существенная особенность спичек здесь заключается в том, что они довольно жесткие и имеют постоянную длину; иногда вместо этого люди используют другие предметы, такие как ватные палочки.)
Для этой задачи нам не нужно определять конкретные правила расположения спичек (как это делает связанная задача); Скорее, мы просто заботимся о том, сколько спичек нам нужно, чтобы представить выражение, которое оценивает данное число.
Задание
Вот алфавит цифр и математических операторов, которые вы можете использовать, каждый из которых имеет стоимость в спичках:
0
, стоимостью 6 спичек1
, стоимостью 2 спичек2
, стоимостью 5 спичек3
, стоимостью 5 спичек4
, стоимостью 4 спичек5
, стоимостью 5 спичек6
, стоимостью 6 спичек7
, стоимостью 3 спичек8
, стоимостью 7 спичек9
, стоимостью 6 спичек+
, стоимостью 2 спичек-
, стоимостью 1 спичка×
, стоимостью 2 спичек
(Вы можете представить ×
как *
в выходных данных вашей программы, если хотите, чтобы избежать необходимости использовать не-ASCII символы. В большинстве кодировок ×
занимает больше байтов, чем *
, и поэтому я полагаю, что большинство программ захотят воспользоваться этой свободой .)
Вам нужно написать программу, которая принимает неотрицательное целое число в качестве входных данных (с помощью любых разумных средств ) и создает выражение, которое оценивается как это целое число в качестве выходных данных (опять же с помощью любых разумных средств). Кроме того, выражение должно быть нетривиальным: она должна содержать по крайней мере один оператор +
, -
или ×
. Наконец, выводимое вами выражение должно быть самым дешевым (или привязанным к самым дешевым) с точки зрения общей стоимости соответствия, среди всех выходов, которые в остальном соответствуют спецификации.
Разъяснения
- Вы можете сформировать многозначные числа путем вывода нескольких цифр подряд (например
11-1
, это допустимый вывод для производства10
). Просто чтобы быть полностью точным, полученное число интерпретируется в десятичном виде. Такая конкатенация не является операцией, которая работает с промежуточными результатами; только на буквальных цифрах, которые появляются в исходном выражении. - Для цели этого вызова.
+
,-
и×
являются инфиксными операторами; им нужен аргумент слева и справа. Вы не можете использовать их в позиции префикса, как+5
или-8
. - У вас нет скобок (или любого другого способа управления приоритетом). Выражение оценивается в соответствии с типичными правилами приоритета по умолчанию (сначала умножения, а затем сложения и вычитания оцениваются слева направо).
- У вас нет доступа ни к каким математическим операторам или константам, кроме перечисленных выше; Решения «латерального мышления» часто принимаются в Puzzling, но не имеет смысла требовать, чтобы компьютер сам придумывал их, и здесь, в PPCG, нам нравится, когда мы объективны, является ли решение правильным.
- Применяются обычные правила целочисленного переполнения: ваше решение должно быть в состоянии работать с произвольно большими целыми числами в гипотетической (или, возможно, реальной) версии вашего языка, в которой все целые числа не ограничены по умолчанию, но если ваша программа дает сбой на практике из-за реализации не поддерживает такие большие целые числа, что не делает решение недействительным.
- Если вы используете одну и ту же цифру или оператора более одного раза, вам придется оплачивать ее стоимость спички каждый раз, когда вы ее используете (поскольку, очевидно, вы не можете повторно использовать одни и те же физические спички в двух разных местах на столе).
- Там нет ограничения по времени; грубой силы решения приемлемы. (Хотя если у вас есть решение, которое быстрее, чем грубая сила, не стесняйтесь публиковать его, даже если оно длиннее; посмотреть, как альтернативные подходы сравниваются, всегда интересно.)
- Хотя написание объяснения вашего кода никогда не требуется , это, вероятно, будет хорошей идеей; Решения code-golf часто очень трудно читать (особенно людям, не знакомым с языком, на котором они написаны), и может быть сложно оценить (и, следовательно, проголосовать) решение, если вы не понимаете, как оно работает.
Состояние победы
В качестве проблемы кода-гольфа ответы с меньшим количеством байтов считаются лучшими. Однако, как обычно, не стесняйтесь публиковать ответы с разными подходами или на определенных языках, даже если они более многословны, чем некоторые другие языки; цель игры в гольф на самом деле - увидеть, насколько далеко вы можете оптимизировать конкретную программу, и выполнение таких действий дает нам множество потенциальных программ для оптимизации. Так что не расстраивайтесь, если кто-то представит решение с использованием совершенно другого подхода или совершенно другого языка и получит гораздо более короткий ответ; вполне возможно, что ваш ответ лучше оптимизирован и показывает больше навыков, и избиратели в PPCG часто это ценят.
источник
Ответы:
Python2, 1̶9̶8̶ ̶b̶y̶t̶e̶s̶ 182 байта благодаря math_junkie
Этот алгоритм не делает ничего, чтобы исключить префиксные версии
+
и-
, но они будут либо хуже, либо равны последующим в поиске аналогичным инфиксным аналогам. Поскольку он использует ключевое слово аргументe
изменчиво, он даст недопустимые результаты, если вызывается несколько раз за сеанс. Чтобы исправить это, используйтеf(n, e=[(0,'')])
вместо простоf(n)
. Обратите внимание, что отступы в четыре интервала представляют вкладки, поэтому это будет работать только с Python 2.У меня также есть неопрятная и оптимизированная версия, которая работает быстро даже для довольно большого числа:
источник
PHP, 241 байт
Онлайн версия
Сломать
Путь с немного лучшей производительностью
Поддержка отрицательных целых чисел
Версия с отрицательными целыми числами
источник
$e+="6255456376"[$i[$s++]];
.