Для чисел примерно до 6 цифр или около того, я бы сказал, что перебор его в соответствии со следующей схемой:
1) Разделите начальное значение в список (массив, что угодно, в зависимости от языка) чисел. Первоначально это цифры.
2) Для каждой пары чисел объедините их вместе с использованием одного из операторов. Если результатом является целевой номер, то верните успех (и распечатайте все операции, выполняемые при выходе). В противном случае, если это целое число, запишите новый, меньший список, состоящий из числа, которое вы только что подсчитали, и числа, которые вы не использовали. Или вы можете разрешить нецелые промежуточные результаты, что сделает пространство поиска несколько больше. Бинарные операции:
- Добавить
- вычитать
- размножаются
- делят
- мощность
- конкатенации (который может быть использован только на номера, которые являются либо оригинальные цифры, или были произведены путем конкатенации).
3) Разрешение квадратного корня раздувает пространство поиска до бесконечности, так как это унарный оператор. Таким образом, вам понадобится способ ограничить количество применений, и я не уверен, что это будет (потеря точности, поскольку ответ приближается к 1, может быть?). Это еще одна причина, позволяющая только целочисленные промежуточные значения.
4) Экспоненциация будет быстро вызывать переполнение. 2^(9^(4^8)) слишком велика, чтобы хранить все цифры непосредственно [хотя в базе 2 это довольно очевидно, что они ;-)]. Поэтому вам придется либо принять, что вы можете пропустить решения с большими промежуточными значениями, либо вам придется написать кучу кода, чтобы выполнить арифметику с точки зрения факторов. Очевидно, что они не очень хорошо взаимодействуют с добавлением, поэтому вам, возможно, придется сделать некоторую оценку. Например, просто взглянув на величину числа факторов, мы видим, что 2^(9^(4^8)) нигде не близка (2^35), поэтому нет необходимости вычислять (2^(9^(4^8)) + 5)/(2^35). Это не может быть 29485235, даже если бы это было целое число (что, конечно же, нет, это другой способ исключить этот конкретный пример). Я думаю, что обработка этих чисел сложнее, чем остальная часть проблемы, вместе взятых, поэтому, возможно, вам следует ограничить себя однокнопочными полномочиями для начала и, возможно, результатами, которые соответствуют 64-битовому целому, в зависимости от того, какой язык вы используете.
5) Я забыл исключить тривиальное решение для любого ввода, просто конкатенируя все цифры. Это довольно легко обрабатывать, однако, просто поддерживайте параметр через рекурсию, которая сообщает вам, выполнили ли вы какие-либо операции, не связанные с конкатенацией маршрута, в вашу текущую подзадачу. Если вы этого не сделали, то проигнорируйте ложное совпадение.
Моя оценка из 6 цифр основана на том, что довольно легко написать решатель Countdown, который выполняется за долю секунды, даже если нет решения. Эта проблема отличается тем, что цифры должны использоваться по порядку, но есть больше операций (обратный отсчет не разрешает возведение в степень, квадратный корень или конкатенацию или нецелые промежуточные результаты). В целом я думаю, что эта проблема сопоставима, если вы решаете проблемы с квадратным корнем и переполнением. Если вы можете решить один случай за долю секунды, то вы можете перенаправить свой путь через миллион кандидатов в разумные сроки (при условии, что вы не против оставить свой компьютер).
На 10 цифр грубая сила представляется невозможной, поскольку вам необходимо рассмотреть 10 миллиардов случаев, каждый из которых требует значительного количества рекурсии.Поэтому, я думаю, вы столкнетесь с пределом грубой силы где-то между ними. Обратите внимание также, что мой простой алгоритм наверху все еще имеет много избыточности - он не останавливает вас (4,7,9,1) -> (47,9,1) -> (47, 0, 91), а затем и далее (4,7,9,1) -> (4,7,91) -> (47,91). Поэтому, если вы не выясните, где будут дублироваться эти дубликаты, и избегайте их, вы попытаетесь (47,91) дважды. Очевидно, что это не так много, когда в списке всего 2 числа, но когда в списке 7 номеров, вы, вероятно, не хотите, например, добавьте 4 из них вместе 6 различными способами, а затем разрешите полученную 4-балльную проблему 6 раз. Умность здесь не требуется для игры с обратным отсчетом, но для всех, что я знаю в этой проблеме, это может сделать разницу между грубым форсированием 8 цифр и грубым форсированием 9 цифр, что довольно важно.
Интересно, как вопрос может иметь 2 ответа и 0 просмотров. Ошибка? – Alex
Что касается вашего редактирования, я рекомендую вам начать с игры «Countdown numbers» http://en.wikipedia.org/wiki/Countdown_%28game_show%29#Numbers_round. Он предназначен для решения людьми через 30 секунд, поэтому он устраняет большую сложность в вашей проблеме (случайно, я полагаю). –