Advent Challenge 2: Present Vault Raid!


9

<< Попередня Наступна >>

Виклик

Тепер, коли Санта нарешті придумав, як потрапити у свій теперішній оберіг, він розуміє, що якимось ельфам зайшов до нього перед собою і вкрав деякі його подарунки! Вони ще не придумали, як покинути сховище, тому Санта повинен спробувати їх наздогнати. І Санта, і ельфи мають безмежну енергію для бігу, але, на жаль, ельфи мають більшу нескінченність енергії, тому, якщо вони в кінцевому підсумку бігають в петлі, ельфи звільняються.

Давши графік nвузлів і eкраїв з прогулянкою, що існує між будь-якими двома вузлами, та положення ельфів та Санта, визначте, скільки ельфів може Санта впіймати, перш ніж він втомиться.

Погоня покрокова. Кожен цикл ельфи спочатку рухаються одночасно (вони також можуть переміщатися між собою та на той самий вузол), а потім рухатиметься Санта. Якщо Санта рухається на той же вузол, що і ельф, він спіймав цього ельфа. Кожен ельф може рухатися лише з одного вузла до свого сусіда за один крок. Те саме стосується Санти на початку, але для кожного ельфа, якого він спіймав, Санта може зробити ще один додатковий крок. Отже, якщо Санта зловив ельфа, то він може перейти від вузла до сусіда свого сусіда. Це означає, що він міг перейти до вузла, а потім назад. Однак, оскільки Санта бігає занадто швидко за цей проміжок часу, він не буде ловити жодних ельфів, які проходять в проміжних кроках (тому якщо він знаходиться на A, A підключений до B, B підключений до C, ельф на В, а Санта рухається від A -> B -> C, ельф ще не спійманий). Однак Санта не повинен рухати стільки кроків одночасно; він рухається до 1 + (кількість спійманих ельфів) щоразу.

Зверніть увагу, що всі ельфи повинні рухатися кожного повороту, і якщо ельф рухається на вузол Санта, вони потрапляють.

Усі сутності (ельфи, Санта) на початку будуть на різних вузлах.

Технічні умови та правила

Ваша програма теоретично повинна працювати для введення будь-якого розміру. Вхід буде подано у вигляді графіка, положення ельфів та положення Санти. Ви можете взяти графік у будь-якому розумному форматі (список вузлів + список ребер, список ребер, матриця примикання, позначення циклу тощо), і ви можете зайняти позиції в будь-якому розумному форматі, який працює з вашим вхідним форматом графіка (індекс у списку вузлів тощо). Вихід повинен бути єдиним натуральним числом, що вказує на максимальну кількість ельфів, які Санта може спіймати.

Випробування

Вони задаються у вигляді списків ребер та номерів вузлів для позицій.

Input -> Output
[(0, 1), (1, 2)], [0, 2], 1 -> 2 # Easy win for Santa, the elves get themselves caught :P
[(0, 1), (1, 2), (2, 3), (3, 0)], [0, 1], 2 -> 2 # The elf opposite of Santa cannot escape but the other one can always just run away each turn, until Santa catches the first elf. Then he can easily just catch the rest.
[(0, 1), (1, 2), (2, 3), (3, 0)], [1], 0 -> 0 # Santa will never catch up
[(0, 1), (1, 2), (2, 3), (3, 0), (1, 4), (4, 5), ..., (10, 11), (11, 3)], [2, 6], 0 -> 2 # The first elf moves to either 1 or 3 and then gets caught. Then, Santa can use his 2-step move to catch up to the second elf no matter what.

Я думаю, що Санта не може наздогнати ні ельфів, ні всіх ельфів, тому ця проблема може бути просто натяком "чи може він зловити ельфа"

Правила

  • Застосовуються стандартні лазівки
  • Це виклик, тому найкоротша відповідь у байтах виграє
  • Відповіді не приймаються

Щасливого гольфу!

Примітка: Натхнення для цієї серії викликів я черпав з Advent Of Code . Я не маю приналежності до цього сайту

Ви можете переглянути список усіх викликів у серії, переглянувши розділ "Пов'язані" першого виклику тут .


1
Якщо б я знав Санта ельфи були , що нечестиві раніше ...
г -

Можливо, підхід до вирішення цього питання: 1Доведіть деякі математичні твердження. 2Опублікуйте відповідь на желе (/ ...) менш ніж за 10 байтів.
користувач202729

Ну, можливо, Санта може зловити деяких, але не всіх ельфів (чи можливо, що деякі ельфи починаються з місця Санти; і чи можливо, ельфи добровільно відпускають Санта їх?)
користувач202729

Редагувати: Ні для першого питання, але, ймовірно, для другого питання.
користувач202729

3
@ user202729 Зауважте, що Санта не повинен переміщати 3 пробіли; він може переміщатися кудись від 1 до 3 простору. Це може бути джерелом плутанини тут.
HyperNeutrino

Відповіді:


1

Мова Вольфрама (Mathematica) , 129 байт

Block[{a=#},Clear@f;s_~f~e_:=If[s==e,1,s~f~e=0;s~f~e=Min[(hMax[#~f~h&/@a@s,Boole[h==s]])/@a@e]];Tr[Max[(e#3~f~e)/@#2]^#2]]&

Спробуйте в Інтернеті!

Аналогічний підхід до моєї відповіді на це питання .

Функція приймає в якості введення 3 аргументи: список суміжності, представлений як асоціація ( інструмент для генерації списку суміжності зі списку ребер ), положення ельфів та положення Санта.

Зауважте, що Clear[f]це необхідно, оскільки подання функцій має бути багаторазовим.

Нижче наведений код - це неперевершений код з частковим поясненням. Більше пояснення пізніше.

reverseBoole = # != 0 &

(* Or@@{a, b} === reverseBoole[booleOr[Boole[{a, b}]]] *)
booleOr = Max

booleAnd = Min

(* Boole@f[s, e] = Santa can catch Elf ? *)

mainfunc = Block[{adjlist = #},
  Clear[f];
  f[s_, e_] := If[ s == e, f[s, e] = 1,
    f[s, e] = Boole[False];
    f[s, e] = booleAnd[
      (e1  booleOr[
        ( s1  f[s1, e1] ) /@ adjlist[s],
        Boole[e1 == s]
      ]) /@ adjlist[e]
    ]
  ];
  If [ 0 == booleOr[ ( e  f[#3, e] ) /@ #2 ] , 0, Length[#2] ]
]&

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.