드렁 커드 저니 홈


23

드렁 커드 저니 홈

이 도전에서 당신은 술집에서 자신의 길을 걸림돌로 취한 취한 사람을 시뮬레이트하는 프로그램을 작성해야합니다.

입력:

입력은 취한 사람이 취할 수있는 경로를 나타내는 인접 행렬 (방향 그래프를 나타냄)이됩니다. 각 위치에서 취한 사람은 무작위로 하나의 경로를 선택합니다 (각 옵션은 대략 동등한 기회를 가지며 사전 선택과 무관합니다).

술고래는 항상 막대에서 시작한다고 가정합니다 (인접 행렬의 첫 번째 행).

술 취한 사람이 막 다른 길에 들어간 경우, 그가 집으로 돌아 왔거나 대중 중독으로 체포 된 것으로 가정 할 수 있으며 프로그램은 자신의 길을 되돌아 가야합니다.

그래프는 항상 하나 이상의 막 다른 골목을 포함한다고 가정 할 수 있습니다.

또한 술고래는 항상 막대를 빠져 나갈 수 있으며 (첫 번째 행은 모두 0이 아님), 술고래가 특정 위치에 갇 히면 행이 모두 0으로 표시된다고 가정 할 수 있습니다.

산출:

결과는 취한 사람이 집으로 돌아 가려고 시도한 경로 일 것입니다. 위치 값은 0 또는 1 일 수 있습니다.

예 :

Input
[1,0,1,1]
[0,0,0,0]
[1,0,0,0]
[1,1,1,1]

Possible Outputs
[0,2,0,3,2,0,0,3,1]
[0,3,0,3,1]


Input
[0,1,1,1,0,1]
[1,0,1,0,1,1]
[0,0,0,0,0,0]
[0,0,0,0,0,1]
[1,0,0,0,0,0]
[0,0,0,0,0,0]

Possible outputs
[0,1,5]
[0,5]
[0,1,4,0,2]
[0,3,5]
[0,3,0,1,4,0,5]

Deterministic path:

Input
[0,0,1,0]
[0,0,0,1]
[0,1,0,0]
[0,0,0,0]

Output
[0,2,1,3]

12
이것은 학생의 추억을 되찾아줍니다 ... 물론, 방향 그래프에 대해 이야기하고 있습니다! o :-)
Arnauld

[ '1011', '0000', '1000', '1111' ]? 와 같은 문자열 배열로 입력을 취할 수 있습니까 ?
Arnauld

바가 막 다른 골목 일 수 있습니까? 다시 말해, 첫 번째 행은 모두 0이 될 것입니까? 또한, 그 자체로만 이어지는 행이 있을까요? 그리고 우리는 그것을 최종 조건으로 감지해야합니까? 즉, i열을 제외한 모든 0 이있는 행 이 i있습니까?
kamoroso94

5
나는 누군가가 Taxi
Belgabad

두 번째 예에서 마지막 경로는 어떻게 얻습니까? 내 이해에서 0링크 1,2,3,5,하지만 마지막 출력은 그것에서 진행 한 04
phflack

답변:


7

Mathematica, 72 바이트

{1}//.{r___,x_}:>{r,x,n=1;Check[RandomChoice[#[[x]]->(n++&/@#)],##&[]]}&

이 함수는 행렬을 인수로 받아서 목록을 반환하는 함수이며 1- 인덱싱을 사용합니다.

기본 아이디어는

{1}//.

{1}변경이 멈출 때까지 다음 규칙을 목록에 반복적으로 적용합니다 . 규칙은 패턴과 일치

{r___,x_}:>

"0이라는 요소 r가 있고 그 다음에 요소가있는 목록"을 의미 x합니다. 이것은 x현재 목록의 마지막 요소로 제공 되며 목록을

{r,x,<stuff>}

<stuff>추가 된 원본 목록입니다 . 문제는

RandomChoice[#[[x]]->(n++&/@#)]

이것은 #[[x]]( x입력 행렬 의 th 요소)를 가중치 목록으로 가져 와서 n++&/@#짧게 Range@Length@#(즉 {1,2,3,...}, 적절한 길이로) 매핑합니다 . 가중치가 모두 0 인 경우 오류가 발생하므로

Check[...,##&[]]

##&[]오류 메시지가 생성 되면 반환 됩니다. 이것은 단지 쓰기의 멋진 방법 Sequence[]은 "아무것도"요소로 (역할, {1,2,Sequence[],3}평가를 {1,2,3}) 따라서이 원인이 변경되지 않은 목록을 잎 //.대체 중지 할 수 있습니다.




3

MATL , 15 바이트

1`GyY)ft?th1ZrT

출력은 1 기반입니다.

온라인으로 사용해보십시오! 첫 번째 입력 . 두 번째 입력 . 세 번째 입력 .

설명

1          % Push 1: initial value of current row index
`          % Do...while
  G        %   Push input matrix
  y        %   Duplicate from below: pushes copy of current row index
  Y)       %   Get that row
  f        %   Find: push (possibly empty) array of indices of non-zero entries
  t        %   Duplicate
  ?        %   If non-empty
    th     %     Attach a copy of itself. This is needed in case the array
           %     contains a single number n, because then the randsample
           %     function would incorrectly treat that as the array [1 2 ... n]
    1Zr    %     Randsample: pick 1 entry at random with uniform probability
    T      %     Push true
           %   End (implicit)
           % End (implicit). Proceed with a new iteration if the top of the
           % stack is truthy. This happens if the current row had some
           % non-zero entry, in which case true was pushed (and is now
           % consumed). If the current row was all zeros, the top of the stack
           % is an empty array that was produced by the find function, which is
           % falsy (and is also consumed now). In that case the loop is exited,
           % and then the stack contains a collection of numbers which
           % collectively describe the path
           % Implicit display


2

파이썬, 136 바이트

randrange가 반입되었다고 가정하고 제로 인덱싱을 사용합니다. 인접 행렬로 입력 m을 취합니다.

113 수입품 없음

s=lambda m,c=0,p=[0],x=0:1 in m[c]and(m[c][x]and s(m,x,p+[x],randrange(len(m)))or s(m,c,p,randrange(len(m))))or p

수입품 136 개

import random as r;s=lambda m,c=0,p=[0],x=0:1 in m[c]and(m[c][x]and s(m,x,p+[x],r.randrange(len(m)))or s(m,c,p,r.randrange(len(m))))or p


3
합의 된 import 문에 따라 136을 기본 바이트 수로 사용하는 것이 좋습니다 .
Jonathan Frech



1

자바 10, 135 바이트

m->{var R="0 ";for(int r=0,c,t;;R+=(r=c)+" "){t=0;for(int x:m[r])t+=x;if(t<1)return R;for(t=c=m.length;m[r][c*=Math.random()]<1;)c=t;}}

0 인덱스

설명:

온라인으로 사용해보십시오.

m->{                   // Method with integer-matrix parameter and String return-type
  var R="0 ";          //  Result-String, starting at "0 "
  for(int r=0,         //  Row-integer, starting at 0
          c,           //  Column-integer
          t;           //  Temp-integer
      ;                //  Loop indefinitely
       R+=             //    After every iteration: Append the result with:
          (r=c)+" "){  //     The current column and a delimiter-space,
                       //     And set the current row to this column at the same time
    t=0;               //   (Re-)set `t` to 0
    for(int x:m[r])    //   Loop over the values of the current row
      t+=x;            //    And add them to `t`
    if(t<1)            //   If the entire row only contained zeroes:
      return R;        //    Return the result
    for(t=c=m.length;  //   Set `t` (and `c`) to the size of the matrix
        m[r][c*=Math.random()]<1;)
                       //   Loop until we've found a 1,
                       //   picking a random column in the range [0,`c`)
      c=t;}}           //    Reset the range of `c` to `t` (the size of the matrix)



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