Автор
E.K.
Ну, вот нам наконец-то потребовалась четвёрка "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". То есть, следующий ход - четвёрка.
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"
Все эти комбинации новые, чуть позже займусь.
Рекомендуемые сообщения
Пожалуйста, войдите, чтобы комментировать
Вы сможете оставить комментарий после входа в
Войти