解决手推车问题


14

哲学家们一直在思考台车问题。不幸的是,还没有人解决过这个问题。幸运的是,作为程序员,我们可以使用计算机为我们解决问题!

输入值

您的程序将输入一个(有限的)有向图(最多有一个从x到的边y,对于任何x和而言y),并带有一个指定的节点,并且在每个边上附加一个非负整数(表示与该轨道相关的人数) 。另外,每个节点至少具有一个出口边缘。

手推车从指定的节点开始。每次转弯时,如果手推车在节点处x,那么功利主义者就会选择一条边(x,y)。那个边缘的人死了,手推车现在处于边缘y。这个过程将永远持续下去。

请注意,人只能死一次,因此,如果边缘(x,y)n人绑在其上,而手推车经过它们,例如,滑过100次,它仍然只会导致n死亡。

输出量

功利主义者以使死亡人数最小化的方式做出选择(这是有限的,因为只有有限的人)。您的程序将输出该号码。

输入格式

您可以按照自己喜欢的任何合理方式获取输入图。例如,您可以将其作为矩阵,并将指定的节点计为标记为0的节点。或者可以使用x1,y1,n1;x2,y2,n2;...。例如0,a,0;a,b,5;a,c,1;b,b,0;c,c,0,代表标准手推车问题(末尾带有循环)。

测试用例

  • 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0 -> 1(从0到a,从a到c(杀死一个人),然后继续将手推车从c循环到c)。
  • 0,0,1;0,a,5;a,a,0 -> 1(保持从0到0,永远超过1个人),
  • 0,a,5;0,b,1;a,a,1;b,b,6 -> 6(0-> a-> a-> a-> a-> ...(请注意,转到b的贪婪解是不正确的))
  • 0,a,1;0,b,5;a,b,1;b,a,1 -> 3(0-> a-> b-> a-> b-> ...)
  • 0,a,1;0,b,1;a,a,0;b,b,0 -> 1(请注意,功利主义者可能采取两种不同的选择,即两者都只会杀死一个人)

这是,所以最短的答案会成功!祝好运。

注意:不会出现恶性循环,并且禁止多轨漂移。同样,尽管我更喜欢从阿西莫夫的三个定律来考虑这个问题,彼得·泰勒在沙盒中指出,这个问题在数学上等同于找到权重最低的rho(使循环返回自身的路径) 。


4
胖子吗?
Beta Decay's

2
@BetaDecay是的,但是由于手推车的升级,出于这个问题的目的,它们的行为与普通人相同。
PyRulez

Answers:


6

果冻27 23字节

ṗL$µṭ0FIm2ASµÐḟµQ⁴ySµ€Ṃ

在线尝试!(最后一个测试用例)

残酷版本(残害最多的人)

将输入作为数字。对于最后一个示例,1is a2is b0是起始节点。第一个参数是边的列表(例如[0,1],[0,2],[1,1],[2,2]),第二个参数是边的列表和边缘上的人数(例如[[0,1],[0,2],[1,1],[2,2]],[1,1,0,0])。

怎么运行的

ṗL$µṭ0FIm2ASµÐḟµQ⁴ySµ€Ṃ
ṗL$                       - on the first argument, get the Cartesian power of it to its length.
                            this gives all paths of the length of the input. Cycles are implicit
   µ        µÐḟ           - get valid paths starting with 0 -- filter by:
    ṭ0                      - prepend 0
      F                     - flatten
       I                    - get the difference between elements
        m2                  - every second difference: 0 for each edge that starts at the node the previous edge ended at, nonzero otherwise.
          AS                - 0 iff all elements are 0
               µ    µ€    - on each path:
                Q           - remove repeat edges.
                 ⁴y         - translate according to the mapping in the second program argument
                   S        - Sum
                      Ṃ   - get the minimum of these.

@Shaggy Umm,不确定您的意思吗?果冻会伤害您的眼睛或其他东西吗?
暴民埃里克(Erik the Outgolfer)'17年

1
@EriktheOutgolfer他指的是试图残害大多数人的程序版本。
fireflame241

@Shaggy这将是一个有趣的挑战。
PyRulez

9

Python 3,80个字节

y=lambda d,s=0,p=[],f=0:f in p and s or min(y(d,s+d[f][t],p+[f],t)for t in d[f])

在线尝试!

将输入作为由节点ID键控的字典。这些条目是邻居的字典以及节点和邻居之间的轨道上的人数。例如,对于第一个测试用例:

{0: {1: 0}, 1: {2: 5, 3: 1}, 2: {2: 0}, 3: {3: 0}}

0是起始节点,1是节点“ a”,2是节点“ b”,依此类推。


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.