Какуро Комбинации
Поскольку я не умею делать умственную арифметику, я часто борюсь с головоломкой Какуро , которая требует, чтобы жертва многократно определяла, какие разные числа в диапазоне от 1 до 9 (включительно) суммируются с другим числом в диапазоне от 1 до 45, когда вы знаете, как Есть много номеров. Например, если вы хотите узнать, как получить 23 из 3 чисел, единственный ответ - 6 + 8 + 9. (Это та же идея, что и у Killer Sudoku, если вы знакомы с этим).
Иногда у вас будет другая информация, например, о том, что число 1 не может присутствовать, поэтому для достижения 8 всего за 2 числа вы можете использовать только 2 + 6 и 3 + 5 (вы не можете использовать 4 + 4, потому что они не отчетливо). В качестве альтернативы может оказаться, что вы уже нашли 3 в решении, и поэтому что-то вроде 19 из 3 должно быть 3 + 7 + 9.
Ваша задача - написать программу, в которой перечислены все возможные решения данной проблемы, в строгом порядке, в строгой разметке.
вход
Ваше решение может получить входные данные в виде одной строки ASCII через стандартный ввод данных, аргумент командной строки, аргумент функции, значение, оставленное в стеке, или любое другое безумие, которое использует ваш любимый эзотерический язык. Строка в форме
number_to_achieve number_of_numbers_required list_of_rejected_numbers list_of_required_numbers
Первые 2 аргумента являются типичными неотрицательными ненулевыми целыми числами из 10 в диапазоне от 1 до 45 и от 1 до 9 соответственно (использование десятичной точки будет недопустимым вводом), два списка представляют собой просто цифры, соединенные без разграничения в нет определенного порядка без повторений или «0», если они являются пустыми списками. Между списками не может быть общих цифр (кроме 0). Разделителями являются одиночные пробелы.
Выход
Ваш вывод должен начинаться со строки, содержащей количество возможных решений. Ваша программа должна распечатать решения с разделителями-переносами строк, отсортированные по каждой все более значимой цифре, где каждая цифра помещается в положение, в котором она была бы, если бы вы перечислили числа от 1 до 9. Надеемся, что приведенные ниже примеры прояснят ситуацию.
Если указан неверный ввод, мне все равно, что делает ваша программа, хотя я бы предпочел, чтобы он не обнулял мой загрузочный сектор.
Примеры
Для этого примера введите
19 3 0 0
Ожидаемый результат будет
5
2 89
3 7 9
4 6 9
4 78
56 8
Обратите внимание на пробелы вместо каждого «пропущенного» числа, они обязательны; Меня не беспокоят пробелы, в которых после них нет номера (например, пропущенные 9). Вы можете предположить, что все, что вы печатаете, будет использовать моноширинный шрифт. Также обратите внимание на порядок, в котором сначала указываются решения с наименьшей наименьшей цифрой, а затем решения с наименьшей наименьшей цифрой и т. Д.
Другой пример, основанный на этом выше
19 3 57 9
Ожидаемый результат будет
2
2 89
4 6 9
Обратите внимание, что каждый результат содержит 9, и ни один результат не содержит 5 или 7.
Если нет решений, например
20 2 0 0
Затем вы должны просто вывести одну строку с 0 на нем.
0
Я специально сделал разбор входной части забавой этого вопроса. Это код-гольф, пусть победит самое короткое решение.