Там есть река, а с одной стороны реки есть волки и куры. У них есть плот, и все они должны перейти на другую сторону. Однако плот не может путешествовать сам по себе. Плот затонет, если на нем более двух животных. Никто из животных не хочет промокнуть, потому что река холодная и грязная. Ни одно из животных не может прыгать или летать через реку. Кроме того, если на одной стороне есть цыплята, на этой стороне не может быть больше волков, чем на той стороне - волки решат съесть цыплят. Это означает, что вы не можете взять двух волков на плоту в сторону с одной курицей.
Ваша задача состоит в том, чтобы создать программу / функцию, которая принимает в качестве входных данных количество волков и кур (больше или равно количеству волков) и находит наименьшее число раз, когда плоту приходится перемещаться по реке. Если задача невозможна, программа / функция должна вывести / вернуть пустую строку. Затем он напечатает / вернет один метод, описывающий, как это делается следующим образом:
W if a wolf crosses the river on its own
C if a chicken crosses the river on its own
CW if a chicken and a wolf cross the river -- WC is also fine
CC if two chickens cross the river
WW if two wolves cross the river
Как вы можете сделать вывод, плот автоматически будет двигаться в чередующихся направлениях (влево и вправо, начиная слева направо, когда первые одно или два животных пересекают реку). Это не нужно выводить / возвращать. «W», «C», «CW», «CC» или «WW» в выходных данных могут быть разделены хотя бы одним из следующих элементов:
spaces (' ')
commas (',')
newlines
Кроме того, вы можете сохранить направления как элементы в списке (пустой список означает отсутствие решения).
Тестовые случаи (выходные данные разделены запятыми - ввод принимает форму wolves,chickens
):
1,1 -> CW
2,2 -> CW,C,CC,C,CW
1,2 -> CW,W,CW
0,10 -> CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC
3,2 -> no solution
Попробуйте сделать свой код максимально коротким в байтах.
источник
Ответы:
Perl,
179165164163157156 байтВключает +4 для
-p
Отдайте волков с последующими цыплятами на STDIN
Выводит содержимое лодки на строку. Для этого примера это дает:
river.pl
:Работает, как показано, но заменить
\xhh
и\n
их буквальными версиями, чтобы получить заявленную оценку.Это, вероятно, будет побеждено программой, которая решает общий случай (C> W> 0)
Добавьте к этому тривиальные решения только для волков и только цыплят, а также в специальном жестком кейсе для
2 2
и3 3
(4 4
и выше не имеют решения). Но это была бы скучная программа.объяснение
Текущее состояние поля хранится в виде одной строки, состоящей из:
w
для волка на берегу с лодкойc
за курицу на берегу с лодкой\x88
(немного перевернутыйw
) для волка на другом берегу\x9c
(немного перевернутыйc
) для курицы на другом берегуP
для правого берега\xaf
(бит перевернутP
) для левого берега (начальная сторона)\n
WC\nW\nWC\nC\n
(обратите внимание наW
s иC
здесь в верхнем регистре)Массив
@F
будет содержать все достижимые состояния. Инициализируется начальной строкойwolves times "w", chickens times "c", \xaf \n
Затем программа зацикливается,
@F
что расширяется во время зацикливания, так что обрабатываются и новые состояния. Для каждого элемента он делает:\n
которая представляет текущее положение животных и лодки. Если это было замечено до пропуска$a{$`x/\n/}++
grep(y/c//<y/w//&/c/,$_,~$_)
$\
и сохраните, так как первое найденное решение является самым коротким$\||=$' x/^\w*\n/
c
иw
символы. (Животные на другой стороне не будут совпадать\w
)/(\w?)(.*)(c|w)(.+)\n(?{code})^/
. Затем немного переверните всю строку перед\n
исключением животных, которые были выбраны для лодкиpush@F,$1.$3.~"$`$2$4\xf5"
. Добавьте выбранных животных в ходы, поместив их в верхний регистр:uc"$'$1$3\n"
Процесс отбора животных эффективно перетасовывает представляющую их часть строки разными способами. Так, например,
wcwc
иwwcc
могут представлять 2 волка и 2 куры. Проверка состояния$a{$`x/\n/}++
будет необоснованно различать эти два, поэтому будет создано и проверено гораздо больше состояний, чем необходимо. Поэтому программе не хватит памяти и времени, как только количество разных животных увеличится. Это немного смягчается тем фактом, что текущая версия перестанет добавлять новые состояния, когда будет найдено решениеисточник
WC,C,WC
того, как на правом берегу есть 2 волка и 1 курица. Игра оконченаJavaScript (ES6),
251264...244240 байтПринимает количество волков и кур
(w, c)
и возвращает одно из оптимальных решений, или,undefined
если решения не существует.Отформатировано и прокомментировано
Функция обертки:
Основная рекурсивная функция:
Контрольные примеры
Показать фрагмент кода
источник
and finds the smallest number of times the raft has to move across the river.
. так что я не думаю, что это правильное решениеCJam, 133
Попробуйте онлайн
Объяснение:
По сути, программа выполняет BFS и запоминает каждое состояние, которого достигла, чтобы избежать бесконечных циклов. Рабочие состояния представлены как [[Wl Cl] [Wr Cr] M1 M2… Mn], где W = волки, C = цыплята, l = левая сторона, r = правая сторона, M = ходы, сделанные до сих пор (изначально ни одного), и ходы похожи на "C", "WC" или "WW" и т. д. (практически больше похоже на ["" "C"], ["W" "C"], ["WW" ""]), но это то же самое при печати). Запомненные состояния представлены как [[Wl Cl] [Wr Cr] S], где S - сторона с лодкой (0 = слева, 1 = справа).
источник
Perl 6 , 268 байт
Создает все более длинные цепочки
(wolf count, chicken count)
состояний для левого берега и возвращает первое, соответствующее всем правилам.Оказывается, этот подход не является ни эффективным, ни очень кратким, но по крайней мере было весело писать.
Я не думаю, что я никогда раньше не складывал
Z
(zip) иX
(cross) мета-операторы, какZZ-
иZX*
здесь - немного удивлен, что это действительно сработало.(Символы новой строки просто добавляются для отображения и не являются частью количества байтов.)
источник
JavaScript (ES6), 227
237По сути, он выполняет BFS и запоминает каждое состояние, которого достиг, чтобы избежать бесконечных циклов.
В отличие от @ aditsu, я не думаю, что есть место для игры в гольфМеньше гольфа
Тестовое задание
источник