Hành trình của Drunkard


23

Hành trình của Drunkard

Trong thử thách này, bạn sẽ viết một chương trình mô phỏng một người say rượu vấp ngã trên đường từ quán bar.

Đầu vào:

Đầu vào sẽ là một ma trận kề (biểu thị một đồ thị có hướng) đại diện cho các đường dẫn mà người say rượu có thể đi. Tại mỗi địa điểm, người say rượu sẽ chọn một con đường ngẫu nhiên (Mỗi tùy chọn có cơ hội xấp xỉ bằng nhau và độc lập với các lựa chọn trước) để đi theo.

Giả sử rằng người say rượu luôn bắt đầu tại quán bar (hàng đầu tiên trong ma trận kề).

Nếu người say rượu đi vào ngõ cụt, có thể giả định rằng anh ta hoặc đã về nhà hoặc bị bắt vì say công khai và chương trình sẽ quay trở lại con đường của anh ta.

Có thể giả định rằng đồ thị sẽ luôn chứa ít nhất một ngõ cụt.

Cũng có thể giả định rằng người say rượu sẽ luôn có thể thoát khỏi quán bar (hàng đầu tiên sẽ không phải là tất cả các số 0) và nếu người say rượu sẽ bị mắc kẹt ở một vị trí, thì hàng đó sẽ được đại diện bởi tất cả các số không.

Đầu ra:

Đầu ra sẽ là con đường mà người say rượu cố gắng để trở về nhà. Các giá trị cho các vị trí có thể bằng 0 hoặc một chỉ mục.

Ví dụ:

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
Điều này mang lại một số ký ức của sinh viên ... Ý tôi là, lỗi, tôi đang nói về đồ thị có hướng, tất nhiên! o :-)
Arnauld

Chúng ta có thể lấy đầu vào là một chuỗi các chuỗi như [ '1011', '0000', '1000', '1111' ]không?
Arnauld

Có thể cho thanh là một ngõ cụt? Nói cách khác, hàng đầu tiên có bao giờ là số không? Ngoài ra, có bao giờ sẽ có một hàng chỉ dẫn đến chính nó, và chúng ta sẽ phải phát hiện đó là điều kiện kết thúc chứ? Nói cách khác, bao giờ sẽ có một hàng ivới tất cả các số không ngoại trừ tại cột i?
kamoroso94

5
Tôi chỉ chờ đợi ai đó viết câu trả lời trên Taxi
Belgabad 26/03/18

Làm thế nào để bạn có được đường dẫn cuối cùng trong ví dụ thứ 2? Từ sự hiểu biết của tôi, 0các liên kết đến 1,2,3,5, nhưng sản lượng cuối cùng đã cho nó đi từ 0đến4
phflack

Câu trả lời:


7

Toán học, 72 byte

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

Đây là một hàm lấy ma trận làm đối số và trả về một danh sách và nó sử dụng lập chỉ mục 1.

Ý tưởng cơ bản là bắt đầu với

{1}//.

liên tục áp dụng quy tắc theo sau cho danh sách {1}cho đến khi nó ngừng thay đổi. Quy tắc khớp với mẫu

{r___,x_}:>

có nghĩa là "một danh sách có 0 hoặc nhiều phần tử được gọi rtheo sau bởi một phần tử được gọi x." Đây xlà phần tử cuối cùng trong danh sách hiện tại và chúng tôi thay thế danh sách bằng

{r,x,<stuff>}

đó là danh sách ban đầu với <stuff>phụ lục. Các công cụ trong câu hỏi là

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

trong đó lấy #[[x]]( xphần tử thứ của ma trận đầu vào) làm danh sách các trọng số và ánh xạ chúng tới n++&/@#, viết tắt của Range@Length@#(nghĩa là {1,2,3,...}có độ dài phù hợp). Điều này sẽ gây ra lỗi nếu các trọng số đều bằng 0, đó là lý do tại sao nó được bọc trong một

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

sẽ trả về ##&[]nếu một thông báo lỗi được tạo ra. Đây chỉ là một cách viết lạ mắt Sequence[], hoạt động như một yếu tố "không có gì" ( {1,2,Sequence[],3}đánh giá {1,2,3}) và do đó khiến danh sách không thay đổi, khiến việc //.dừng thay thế.


4

R , 72 69 66 byte

function(m,o=1)while({print(o);any(x<-m[o,])})o=sample(which(x),1)

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng logicalma trận và in các chỉ mục dựa trên 1 lên bàn điều khiển.


3

Perl 5 -a0 , 53 51 byte

Đưa ra ma trận đầu vào dưới dạng các chuỗi chặt chẽ riêng biệt trên STDIN

$!/usr/bin/perl -a0
$n=!say$%;$F[$%]=~s:1:($%)=@-if 1>rand++$n:eg&&redo

Hãy thử trực tuyến!

Thiệt hại @Ftrong cơ thể vòng lặp nhưng nó được sửa chữa bởiredo


3

MATL , 15 byte

1`GyY)ft?th1ZrT

Đầu ra là 1 dựa trên.

Hãy thử trực tuyến! Đầu vào đầu tiên . Đầu vào thứ hai . Đầu vào thứ ba .

Giải trình

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 byte

Sử dụng lập chỉ mục bằng không, giả sử randrange đã được nhập. Lấy m đầu vào làm ma trận kề

113 không nhập khẩu

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 với hàng nhập khẩu

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
Tôi khuyên bạn nên sử dụng 136 làm số byte chính của bạn, theo báo cáo nhập khẩu đồng thuận được tính vào nó.
Jonathan Frech

2

Ruby , 70 67 65 byte

f=->m,i=0{m[i].sum<1?[]:m[i][x=rand(m.size)]<1?f[m,i]:[x]+f[m,x]}

Cảm ơn benj2240 vì đã tiết kiệm được 2 byte!

Hãy thử trực tuyến!


Bạn có thể lưu một vài byte vớim[i].sum<1?:[]
benj2240

@ benj2240 Wow, tôi không bao giờ biết điều đó là có thể. Bây giờ tôi nhận ra .sumđã được giới thiệu trong 2.4. Tôi đã từng làm .reduce(0, :+)...
Cristian Lupascu

2

JavaScript (ES6), 87 byte

f=(a,y=0)=>[y,.../1/.test(r=a[y])?f(a,(g=_=>r[k=Math.random()*r.length|0]?k:g())()):[]]

Hãy thử trực tuyến!


Phiên bản thay thế, 81 byte

Đưa đầu vào như một mảng của chuỗi nhị phân. Kích thước được hỗ trợ tối đa là 16x16.

f=(a,y=0)=>[y,...+(r=a[y])?f(a,(g=_=>+r[k=Math.random()*r.length|0]?k:g())()):[]]

Hãy thử trực tuyến!


1

Java 10, 135 byte

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;}}

Chỉ số 0

Giải trình:

Hãy thử trực tuyến.

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)



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.