트롤리 문제 해결


14

철학자들은 오랫동안 트롤리 문제를 고민해 왔습니다 . 불행히도 아직이 문제를 해결 한 사람은 없습니다. 다행히 프로그래머로서 우리는 컴퓨터를 사용하여 문제를 해결할 수 있습니다!

입력

프로그램은 (상기 최대 하나의 에지 입력으로서 지시 그래프 A (유한) 걸릴 것 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 (영원히 1 명 이상 계속해서 0에서 0으로 유지),
  • 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 (공리주의자가 취할 수있는 두 가지 옵션이 있습니다. 둘 다 한 사람 만 죽일 수 있습니다)

이것은 이므로 가장 짧은 답변이 이깁니다! 행운을 빕니다.

참고 : 루프 루프 루프가 끊어지지 않으며 멀티 트랙 표류 가 금지됩니다. 또한, Asimov의 세 가지 법칙 (/ s) 에서이 문제를 생각하는 것을 선호하지만 Peter Taylor는 샌드 박스 에서이 문제가 가장 낮은 무게의 rho (루프 자체 경로를 찾는 것)와 수학적으로 동일하다고 언급했습니다. .


4
어떤 있습니까 뚱뚱한 사람은 ?
Beta Decay

2
@BetaDecay는 그렇습니다. 그러나 트롤리로 업그레이드 되었기 때문에이 질문의 목적 상 일반 사람들과 동일하게 동작합니다.
PyRulez

답변:


6

젤리 , 27 23 바이트

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

온라인으로 사용해보십시오! (마지막 테스트 케이스)

잔인한 버전 (가장 많은 사람들을 절단)

숫자로 입력을받습니다. 마지막 예에서 1is aand 2is b입니다. 0시작 노드입니다. 첫 번째 인수는 엣지 목록 (예 :) [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, 무슨 뜻인지 잘 모르겠습니까? 젤리가 눈이나 무언가를 다치게합니까?
Outgolfer Erik

1
@EriktheOutgolfer 그는 대부분의 사람들 을 절단하려고 시도하는 프로그램 버전을 말합니다.
fireflame241

@Shaggy 흥미로운 도전이 될 것입니다.
PyRulez

9

파이썬 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'등입니다.


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