Подорож додому п’яниці


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]

12
Це повертає деякі студентські спогади ... Я маю на увазі, помилково, я кажу про спрямовані графіки, звичайно! o :-)
Арнольд

Чи можемо ми взяти введення як масив рядків, таких як [ '1011', '0000', '1000', '1111' ]?
Арнольд

Чи можна, щоб бар був тупиком? Іншими словами, чи буде в першому рядку всі нулі? Крім того, чи коли-небудь буде ряд, який веде лише до себе, і чи доведеться нам виявляти це як кінцеву умову? Іншими словами, чи буде коли-небудь ряд iз усіма нулями, крім стовпця i?
kamoroso94

5
Я просто чекаю, коли хтось напише відповідь у таксі
Белгабад,

Як ви отримуєте останній шлях у другому прикладі? З мого розуміння, 0посилання на 1,2,3,5, але останній випуск продукції це походить від 0до4
phflack

Відповіді:


7

Математика, 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}) і тому залишає список незмінним, викликаючи //.припинення заміни.




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
Я б рекомендував використовувати 136 як основний підрахунок байтів, відповідно до конспекту про імпорт.
Джонатан Фрех

2

Ruby , 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 байт

Приймає введення як масив двійкових рядків. Максимально підтримуваний розмір - 16х16.

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

Спробуйте в Інтернеті!


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)



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.