Пьяное путешествие домой

23

Пьяное путешествие домой

В этом задании вы должны написать программу, которая имитирует пьяницу, спотыкающегося по дороге домой из бара.

Входные данные:

Входными данными будет матрица смежности (представляющая ориентированный граф), которая представляет пути, по которым пьяница может идти. В каждой локации пьяница выберет один путь случайным образом (каждый вариант имеет примерно равные шансы и не зависит от предыдущих вариантов выбора).

Предположим, что пьяница всегда начинается с бара (первая строка в матрице смежности).

Если пьяница заходит в тупик, можно предположить, что он либо добрался домой, либо был арестован за общественное опьянение, и программа должна вернуться на свой путь.

Можно предположить, что график всегда будет содержать хотя бы один тупик.

Можно также предположить, что пьяница всегда сможет выйти из бара (в первом ряду не все нули) и что если пьяница застрянет в каком-либо месте, то этот ряд будет представлен всеми нулями.

Выход:

Результатом будет путь, по которому пьяница пошел, пытаясь добраться домой. Значения для местоположений могут быть либо нулевыми, либо индексированными.

Примеры:

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]
fənɛtɪk
источник
12
Это возвращает некоторые студенческие воспоминания ... Я имею в виду, я имею в виду, конечно, я говорю о ориентированных графах! o :-)
Арно
Можем ли мы принять ввод как массив строк, таких как [ '1011', '0000', '1000', '1111' ]?
Арно
Возможно ли, что бар окажется тупиком? Другими словами, будет ли в первом ряду все нули? Кроме того, будет ли когда-нибудь строка, которая приведет только к самому себе, и мы должны будем определить это как конечное условие? Другими словами, будет ли когда-нибудь строка iсо всеми нулями, кроме столбца i?
kamoroso94
5
Я просто жду, когда кто-нибудь напишет ответ в «Такси»
Бельгабад,
Как вы получаете последний путь во 2-м примере? 01,2,3,504
Насколько

Ответы:

7

Mathematica, 72 байта

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

Эта функция принимает матрицу в качестве аргумента и возвращает список, и она использует 1-индексирование.

Основная идея состоит в том, чтобы начать с

{1}//.

который неоднократно применяет правило, следующее за списком, {1}пока не перестанет меняться. Правило соответствует шаблону

{r___,x_}:>

что означает «список с нулем или более вызываемыми элементами, rза которыми следует элемент с именем x». Это дает xв качестве последнего элемента в текущем списке, и мы заменяем список на

{r,x,<stuff>}

который является исходным списком с <stuff>добавлением. Материал, о котором идет речь

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

который принимает #[[x]]( xth-й элемент входной матрицы) в качестве списка весов и сопоставляет их с n++&/@#сокращением Range@Length@#(то есть {1,2,3,...}с соответствующей длиной). Это приведет к ошибке, если все веса равны нулю, поэтому он обернут в

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

который вернется, ##&[]если будет сгенерировано сообщение об ошибке. Это просто причудливый способ записи Sequence[], который действует как элемент «ничего» ( {1,2,Sequence[],3}оценивает {1,2,3}) и, следовательно, оставляет список неизменным, что приводит //.к прекращению замены.

Дверная ручка
источник
4

R , 72 69 66 байт

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

Попробуйте онлайн!

Принимает ввод в виде logicalматрицы и выводит индексы на основе 1 на консоль.

Giuseppe
источник
3

Perl 5 -a0 , 53 51 байт

Дайте входную матрицу в виде отдельных жестких строк на STDIN

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

Попробуйте онлайн!

Повреждения @Fво время цикла тела, но это отремонтированоredo

Тон Хоспел
источник
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

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 в качестве основного числа байтов, поскольку консенсусные операторы импорта учитывают его.
Джонатан Фрех
2

Рубин , 70 67 65 байт

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

Спасибо benj2240 за сохранение 2 байта!

Попробуйте онлайн!

Кристиан Лупаску
источник
Вы можете сохранить пару байтов с помощьюm[i].sum<1?:[]
benj2240
@ benj2240 Ого, я никогда не знал, что это возможно. Теперь я понял, .sumбыл введен в 2.4. Я имел обыкновение делать .reduce(0, :+)...
Кристиан Лупаску
2

JavaScript (ES6), 87 байт

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

Попробуйте онлайн!


Альтернативная версия, 81 байт

Принимает ввод как массив двоичных строк. Максимальный поддерживаемый размер 16x16.

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

Попробуйте онлайн!

Arnauld
источник
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)
Кевин Круйссен
источник
1

APL (Dyalog Unicode) , 32 34 байта

t←⎕
{}{s[?≢s←⍸⍵⊃t]}⍣{~0t⊃⍨⎕←⍵}1

Попробуйте онлайн!

Принимает вложенный двоичный массив в качестве входных данных. Выводит каждую итерацию в отдельных строках.

Kritixi Lithos
источник