Advent Challenge 2: Der gegenwärtige Tresorüberfall!

9

<< Zurück Weiter >>

Herausforderung

Jetzt, da der Weihnachtsmann endlich herausgefunden hat, wie er in sein jetziges Gewölbe gelangen kann, merkt er, dass die Elfen irgendwie vor ihm hineingekommen sind und einige seiner Geschenke gestohlen haben! Sie haben jedoch noch nicht herausgefunden, wie sie das Gewölbe verlassen sollen, also muss der Weihnachtsmann versuchen, sie alle zu fangen. Der Weihnachtsmann und die Elfen haben beide unendlich viel Energie, um herumzulaufen, aber leider haben die Elfen eine höhere Unendlichkeit an Energie. Wenn sie also überall in Schleifen laufen, sind die Elfen frei geworden.

Bestimmen Sie anhand eines Diagramms von nKnoten und eKanten mit einem zwischen zwei beliebigen Knoten vorhandenen Gang und den Positionen der Elfen und des Weihnachtsmanns, wie viele Elfen der Weihnachtsmann fangen kann, bevor er müde wird.

Die Jagd ist rundenbasiert. In jedem Zyklus bewegen sich die Elfen zuerst alle gleichzeitig (sie können sich auch untereinander und auf denselben Knoten bewegen), und dann bewegt sich der Weihnachtsmann. Wenn sich der Weihnachtsmann auf denselben Knoten wie ein Elf bewegt, hat er diesen Elfen gefangen. Jeder Elf darf sich nur in einem Schritt von einem Knoten zu seinem Nachbarn bewegen. Das gleiche gilt für den Weihnachtsmann am Anfang, aber für jeden Elfen, den er gefangen hat, kann der Weihnachtsmann einen zusätzlichen Schritt machen. Wenn der Weihnachtsmann einen Elfen gefangen hat, kann er von einem Knoten zum Nachbarn seines Nachbarn wechseln. Dies bedeutet, dass er zu einem Knoten und dann zurück gehen kann. Da der Weihnachtsmann in dieser Zeit jedoch zu schnell rennt, fängt er keine Elfen, die in den Zwischenschritten vorbeikommen (wenn er also auf A ist, ist A mit B verbunden, B ist mit C verbunden, ist ein Elf an B und der Weihnachtsmann bewegt sich von A -> B -> C, der Elf wurde noch nicht gefangen. Der Weihnachtsmann muss jedoch nicht so viele Schritte gleichzeitig bewegen. Er bewegt sich in jeder Runde bis zu 1 + (Anzahl der gefangenen Elfen).

Beachten Sie, dass sich alle Elfen in jeder Runde bewegen müssen. Wenn sich ein Elf auf den Knoten des Weihnachtsmanns bewegt, werden sie gefangen.

Alle Entitäten (Elfen, Weihnachtsmann) befinden sich am Anfang auf unterschiedlichen Knoten.

Spezifikationen und Regeln

Ihr Programm sollte theoretisch für Eingaben jeder Größe funktionieren. Die Eingabe wird als Grafik, die Positionen der Elfen und die Position des Weihnachtsmanns angegeben. Sie können das Diagramm in einem beliebigen vernünftigen Format (Liste der Knoten + Liste der Kanten, Liste der Kanten, Adjazenzmatrix, Zyklusnotation usw.) aufnehmen und die Positionen in einem angemessenen Format einnehmen, das mit Ihrem Grafikeingabeformat (Index) funktioniert in der Liste der Knoten usw.). Die Ausgabe sollte eine einzelne positive ganze Zahl sein, die die maximale Anzahl von Elfen angibt, die der Weihnachtsmann fangen kann.

Testfälle

Diese werden als Listen von Kanten und Knotennummern für Positionen angegeben.

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.

Ich denke, der Weihnachtsmann kann entweder keine Elfen oder alle Elfen fangen, daher könnte diese Herausforderung nur der Hinweis "Kann er einen Elfen fangen" sein

Regeln

  • Standardschlupflöcher gelten
  • Dies ist eine Herausforderung, daher gewinnt die kürzeste Antwort in Bytes
  • Es werden keine Antworten akzeptiert

Viel Spaß beim Golfen!

Hinweis: Ich habe mich für diese Herausforderungsserie von Advent Of Code inspirieren lassen . Ich habe keine Verbindung zu dieser Site

Eine Liste aller Herausforderungen in der Serie finden Sie im Abschnitt "Verknüpft" der ersten Herausforderung hier .

HyperNeutrino
quelle
1
Ich wünschte, ich wüsste, dass
Santas
Der Ansatz, um dies zu lösen, wäre wahrscheinlich: 1Beweisen Sie einige mathematische Aussagen. 2Poste eine Jelly (/ ...) Antwort in weniger als 10 Bytes.
user202729
Nun, es ist möglich, dass der Weihnachtsmann einige, aber nicht alle Elfen fangen kann (ist es möglich, dass einige Elfen an der Position des
Weihnachtsmanns beginnen
Edit: Nein für die erste Frage, aber wahrscheinlich für die zweite Frage.
user202729
3
@ user202729 Beachten Sie, dass der Weihnachtsmann keine 3 Felder verschieben muss. Er kann sich zwischen 1 und 3 Feldern bewegen. Das könnte hier Verwirrung stiften.
HyperNeutrino

Antworten:

1

Wolfram Language (Mathematica) , 129 Bytes

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]]&

Probieren Sie es online aus!

Ähnliches gilt für meine Antwort auf diese Frage .

Die Funktion verwendet 3 Argumente als Eingabe: Adjazenzliste, die als Assoziation dargestellt wird ( Werkzeug zum Generieren der Adjazenzliste aus der Kantenliste ), Elfenposition und Weihnachtsmannposition.

Beachten Sie, dass dies Clear[f]erforderlich ist, da Funktionsübermittlungen wiederverwendbar sein müssen.

Der folgende Code ist ungolfed Code mit teilweiser Erklärung. Mehr Erklärung später.

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] ]
]&

user202729
quelle