来临挑战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发布少于十个字节的果冻(/ ...)答案。
user202729

好吧,圣诞老人有可能抓到一些但不是全部的精灵(某些精灵有可能从圣诞老人的位置开始;精灵有可能自愿让圣诞老人抓捕他们吗?)
user202729

编辑:第一个问题不,但第二个问题可能。
user202729 '17

3
@ user202729注意,圣诞老人不必移动3个空格。他可以移动1到3个空格。这可能是造成混乱的原因。
HyperNeutrino

Answers:


1

Wolfram语言(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] ]
]&

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.