강림절 도전 2 : 현재 금고 습격!


9

<< 이전 다음 >>

도전

산타는 마침내 자신의 현재 금고에 들어가는 방법을 알아 냈으므로, 엘프들은 어떻게 든 그 앞에 들어가서 선물을 훔쳤다는 것을 알게되었습니다! 그들은 아직 금고를 떠나는 방법을 찾지 못했기 때문에 산타는 그들 모두를 잡아야합니다. 산타와 엘프는 둘 다 돌아 다니는 무한한 에너지를 가지고 있지만 불행히도 엘프는 더 높은 에너지 무한대를가집니다. 그래서 그들이 어디에서나 루프를 돌면 엘프는 자유를 얻습니다.

두 노드 사이에 보행이있는 n노드와 e모서리 그래프 와 엘프와 산타의 위치를 ​​고려하면 산타가 피곤하기 전에 얼마나 많은 엘프를 잡을 수 있는지 결정하십시오.

체이스는 턴제입니다. 각주기마다, 엘프들은 먼저 모두 동시에 움직입니다 (그들은 서로를 통해 같은 노드로 이동할 수 있습니다). 그러면 산타는 움직입니다. 산타가 엘프와 같은 노드로 이동하면 엘프를 잡았습니다. 각 엘프는 한 단계에서 한 노드에서 이웃 노드로만 이동할 수 있습니다. 처음에는 산타도 마찬가지이지만, 그가 잡은 모든 엘프에게는 산타가 한 걸음 더 나아갈 수 있습니다. 따라서 산타가 엘프를 ​​잡으면 노드에서 이웃의 이웃으로 옮길 수 있습니다. 이것은 그가 노드로 이동했다가 다시 돌아올 수 있음을 의미합니다. 그러나이 기간 동안 산타가 너무 빨리 달리기 때문에 중간 단계를 통과하는 엘프를 잡을 수 없습니다 (따라서 A에 있으면 A는 B에 연결되고 B는 C에 연결되며 엘프는 B와 산타는 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
나는 산타의 요정이되었다 알고 싶어 ... 전에 악인
씨 Xcoder에게

이 문제를 해결하기위한 접근법은 다음과 같습니다 1. 수학적 진술을 증명하십시오. 2젤리 (/ ...) 답변을 10 바이트 미만으로 게시하십시오.
user202729

글쎄, 산타가 모든 엘프를 잡을 수는 없지만 일부 엘프는 산타의 위치에서 시작할 수 있으며, 엘프는 자발적으로 산타가 그들을 잡을 수 있습니까?
user202729

편집 : 첫 번째 질문은 아니요, 두 번째 질문은 아닙니다.
user202729

3
@ user202729 산타는 3 칸을 이동할 필요가 없습니다. 그는 1 ~ 3 칸 어디든지 이동할 수 있습니다. 그것은 혼란의 근원이 될 수 있습니다.
HyperNeutrino

답변:


1

Wolfram Language (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]기능 제출 재사용해야하기 때문에 필요하다.

아래 코드는 부분 설명이 포함 된 ungolfed 코드입니다. 나중에 더 설명하십시오.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.