Ну, вот нам наконец-то потребовалась четвёрка "004". Вернее, там требуется пара "не-004 и не-010", и все такие варианты можно получить из "не-010". Однако, что-то мне подсказывает, что просто "не-004" нам ещё пригодится.
Итак, требуется найти все "трёхзнаки", из которых не получается "004". Ну, например, из "000" как-то вообще не видится никаких арифметических преобразований, которые в результате дают четвёрку. Сколько всего таких - и хочется весь список. Но опять перебирать 1000 возможных вариантов как-то лениво.. Хочется оптимизации. И она есть! - предложена в ветке "Обсуждение" уважаемыми Xandr_5890 и santax - методы "двузнаков" и оптимизации цифр. А именно. Если присмотреться к этому "не-004" ->
1. Оптимизация цифр.
Если мы без конкатенации ("склеивания") цифр (типа "V(16)=4" или подобного) решили вариант "1bc", то очевидно подходит и "0bc", который через факториал "0! bc" сводится к уже решённому "1bc". Ещё раз обращаю внимание, только в случаях "отдельно стоящей единицы", без конкатенации цифр.
Аналогично "2bc", решённое без конкатенаций, даёт и решение для "4bc" через "V(4) bc".
Аналогично, если без конкатенации решено "6bc" => решается и "3! bc" => решается "V(9)! bc".
То есть, сначала решаем "1bc не равно 4" - а потом из оставшегося решаем "0bc не равно 4". Затем решаем "2bc", из оставшегося ищем что там в "4bc". Дальше смотрим "6bc" => "3bc" => "9bc".
Но перебирать всю сотню вариантов на каждый первый "а" из "abc" тоже не хочется. А для оптимизации этого процесса есть ->
2. Метод двузнаков.
У нас есть "abc". Давайте посмотрим по каждому "a" что нам наколдуется с "bc", чтобы получить искомую четвёрку? То есть, давайте сразу отфильтруем то, что заведомо решается. Вот таким образом. У нас есть а=0,1,2,...,9. Переберём их по порядку, но с учётом "оптимизации цифр" =>
1+"03" = 1*"04" = -1+"05" = 4 not "03,04,05"
То есть, при решении "1bc" все двузнаки, которые складываются в 03,04,05 - их надо сразу выкинуть, поскольку заведомо решаемая комбинация. Затем решаем "0" ->
0 = из того, что осталось от единицы.
Далее двойка =>
2+"02" = -2+"06" = 4 not "02,06"
Тройку пропускаем, поскольку ждём результатов решения "6". То есть, следующий ход - четвёрка.
V(4)+"02" = -V(4)+"06" = 4 not "02,06" - аналогично "двойке".
4 = из того, что осталось от двойки (без конкатенаций), но альтернативно:
4*"01" = -4+"08" = 4 not "01,08"
Далее пятая позиция:
5-"01" = -5+"09" = 4 not "01,09"
Шестёрка:
6-"02" = -6+"10" = 4 not "02,10"
Тут же сразу "3" и "9":
3 = из того, что осталось от шестёрки.
9 = из того, что осталось от тройки.
Далее "7" и "8":
7-"03" = V(7+"09") = 4 not "03,09" // "09" не потребуется, она перекрывается тройкой.
8-"04" = V(8+"08") = 4 not "04,08"
Вот такая логика получается у данного процесса. Интересно, насколько эффективно фильтруется изначальный материал? Сколько из 1000 изначальных вариантов останется для "ручной обработки"?
Ну, поехали. Последовательность действий такая:
1 => 0, 2 =>4, 5, 6 => 3 => 9, 7, 8 == готово.
А также нам потребуются заранее заготовленные двузнаки:
not "03,04,05" - новый, надо подсчитать... да они тут все новые.
not "02,06"
not "01,09"
not "02,10"
not "03"
not "04,08"
Все эти комбинации новые, чуть позже займусь.