ドランクールズジャーニーホーム


23

ドランクールズジャーニーホーム

この課題では、酔っぱらいが酒場から帰る途中でつまずくのをシミュレートするプログラムを作成します。

入力:

入力は、酔っぱらいが通ることができるパスを表す隣接行列(有向グラフを表す)になります。各場所で、酔っぱらいはランダムに1つのパスを選択します(各オプションはほぼ等しいチャンスを持ち、以前の選択とは無関係です)。

酔っぱらいは常にバー(隣接行列の最初の行)から始まると仮定します。

酔っぱらいが行き止まりになった場合、彼は帰宅したか、公的な酔いで逮捕されたと考えられ、プログラムは彼の道を返すはずです。

グラフには常に少なくとも1つの行き止まりが含まれると想定できます。

また、酔っぱらいは常にバーを出ることができ(最初の行はすべてゼロではありません)、酔っぱらいが特定の場所に留まる場合、その行はすべてゼロで表されると想定することもできます。

出力:

出力は、酔っぱらいが家に帰ろうとする試みでたどった経路になります。場所の値は、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 :-)
アーナルド

入力を次のような文字列の配列として取得できます[ '1011', '0000', '1000', '1111' ]か?
アーナルド

バーが行き止まりになる可能性はありますか?つまり、最初の行はすべてゼロになりますか?また、自分自身だけにつながる行がありますか?それを終了条件として検出する必要がありますか?言い換えると、icolumn以外のすべてがゼロの行はありますiか?
kamoroso94

5
私は誰かがタクシーで答えを書くのを待っています
-Belgabad

2番目の例で最後のパスを取得するにはどうすればよいですか?私の理解から、0へのリンクがあります1,2,3,5が、最後の出力はからに0なります4
-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重みのリストとして入力行列の番目の要素)を、それらをマッピングするn++&/@#ためのショートである、Range@Length@#(すなわち、{1,2,3,...}適当な長さを有します)。これは、重みがすべてゼロの場合にエラーをスローします。

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

##&[]エラーメッセージが生成された場合に返されます。これは単なるSequence[]「空の」要素として機能する(と{1,2,Sequence[],3}評価される{1,2,3})ための洗練された方法であるため、リストを変更せずに置き、//.置換を停止させます。




3

MATL、15バイト

1`GyY)ft?th1ZrT

出力は1ベースです。

オンラインでお試しください!最初の入力2番目の入力3番目の入力

説明

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

Python、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
コンセンサスインポートステートメントによってカウントされるため、メインバイトカウントとして136を使用することをお勧めします。
ジョナサンフレッチ



1

Java 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.