Drunkard'ın Yolculuğu Ana Sayfası


23

Drunkard'ın Yolculuğu Ana Sayfası

Bu zorlukla mücadelede bardan eve dönen bir sarhoş taklit eden bir program yazacaksınız.

Giriş:

Girdi, sarhoşluğun alabileceği yolları temsil eden bir bitişiklik matrisi (yönlendirilmiş bir grafiği temsil eder) olacaktır. Her yerde, sarhoş rastgele bir yol seçecektir (Her seçeneğin yaklaşık eşit şansı vardır ve izlenmesi gereken seçimlerden bağımsızdır).

Sarhoşluğun daima barda başladığını varsayalım (bitişik matristeki ilk satır).

Eğer sarhoş bir çıkmazza girerse ya eve dönüş yaptığını ya da halkın sarhoş olması nedeniyle tutuklandığı varsayılabilir ve programın yoluna geri dönmesi gerekir.

Grafiğin her zaman en az bir çıkmaz içereceği varsayılabilir.

Ayrıca, sarhoşluğun her zaman çubuktan çıkabileceği (ilk sıranın tümü sıfır olmayacak) ve sarhoş bir yere sıkışacaksa, sıranın tüm sıfırlar tarafından temsil edileceği varsayılabilir.

Çıktı:

Çıktı, sarhoşluğun eve dönme girişiminde aldığı yol olacak. Konumların değerleri sıfır veya bir dizinlenmiş olabilir.

Örnekler:

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
Bu, bazı öğrenci hatıralarını geri getiriyor ... Yani, elbette, yönlendirilmiş grafiklerden bahsediyorum! o :-)
Arnauld

Bir dizi dizge olarak girdi alabilir miyiz [ '1011', '0000', '1000', '1111' ]?
Arnauld

Çubuğun çıkmaz olması mümkün mü? Başka bir deyişle, ilk satırın hepsi sıfır olur mu? Ayrıca, yalnızca kendi kendine giden bir satır olacak mı ve bunu bir son şart olarak algılamamız gerekecek mi? Başka bir deyişle, isütun dışında tüm sıfırların bulunduğu bir satır olacak imı?
kamoroso94

5
Sadece birisinin
Taksi'de

2. örnekte son yolu nasıl buluyorsunuz? Benim anlayış, Dan 0bağlantılar 1,2,3,5, ancak geçen çıkış o gidiş oldu 0için4
phflack

Yanıtlar:


7

Mathematica, 72 bayt

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

Bu bir fonksiyon matrisi argüman olarak alır ve bir liste döndürür ve 1 indeksleme kullanır.

Temel fikir başlamaktır.

{1}//.

bu sürekli {1}değişmeyi bırakana kadar listeye izleyen kuralı tekrarlar . Kural, kalıpla eşleşiyor

{r___,x_}:>

bu, "sıfır veya daha fazla elemanın bulunduğu bir liste ve rardından x" adı verilen bir eleman "anlamına gelir . Bu x, geçerli listedeki son öğe olarak verir ve listeyi değiştiririz.

{r,x,<stuff>}

<stuff>Eklenen orijinal liste . Söz konusu şeyler

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

alır #[[x]]( xağırlıkları bir listesi olarak giriş matrisin elemanından) ve eşler için n++&/@#kısa olan Range@Length@#(diğer bir deyişle {1,2,3,...}uygun bir uzunluğu ile). Ağırlıklar sıfır ise, bu bir hata verecektir, bu yüzden bir

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

##&[]Bir hata mesajı üretilirse bu geri dönecektir . Bu, sadece Sequence[]"hiçbir şey" unsuru olarak işlev gören ( {1,2,Sequence[],3}değerlendiren {1,2,3}) ve bu nedenle listeyi değiştirmeden //.bırakarak değiştirmeyi bırakmaya yarayan süslü bir yazı biçimidir .


4

R , 72 69 66 bayt

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

Çevrimiçi deneyin!

Girdiyi logicalmatris olarak alır ve 1 tabanlı dizinleri konsola yazdırır.


3

Perl 5 -a0 , 53 51 bayt

STDIN'de giriş dizesini ayrı ayrı dizeler olarak verin

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

Çevrimiçi deneyin!

@FDöngü gövdesi sırasında oluşan hasarlar ancak tamir edildiğinderedo


3

MATL , 15 bayt

1`GyY)ft?th1ZrT

Çıktı 1 tabanlıdır.

Çevrimiçi deneyin! İlk giriş . İkinci giriş . Üçüncü giriş .

açıklama

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 bayt

Sıfır indeksleme kullanarak, randrange'in alındığını varsayarsak. Bitişik matris olarak bir m girişi alır

113 ithalat yok

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 ithalat ile

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 ana bayt sayınız olarak kullanmanızı öneriyorum, oysa kabul edilen ithalat ifadelerine göre.
Jonathan Frech


2

JavaScript (ES6), 87 bayt

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

Çevrimiçi deneyin!


Alternatif sürüm, 81 bayt

Girdiyi bir ikili dizge dizisi olarak alır. Desteklenen maksimum boyut 16x16.

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

Çevrimiçi deneyin!


1

Java 10, 135 bayt

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 endeksli

Açıklama:

Çevrimiçi deneyin.

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)



1

Python ,97 94 bayt

f=lambda a,i=0,j=0:sum(a[i])and[i]*a[i][j]+f(a[:],(i,j)[a[i][j]],id(a)**7%~-2**67%len(a))or[i]

Çevrimiçi deneyin!


Rastgele sayı üreteci hakkında daha fazla açıklama için bu cevaba bakınız :

id(a)**7%~-2**67
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.