A jornada de bêbado em casa

23

A jornada de bêbado em casa

Neste desafio, você deve escrever um programa que simule um bêbado tropeçando no caminho de volta para casa, vindo do bar.

Entrada:

A entrada será uma matriz de adjacência (representando um gráfico direcionado) que representa os caminhos que o bêbado pode seguir. Em cada local, o bêbado escolherá um caminho aleatoriamente (cada opção tem uma chance aproximadamente igual e é independente das escolhas anteriores) a seguir.

Suponha que o bêbado sempre comece na barra (primeira linha na matriz adjacente).

Se o bêbado entra em um beco sem saída, pode-se supor que ele voltou para casa ou foi preso por intoxicação pública e o programa deve retornar seu caminho.

Pode-se supor que o gráfico sempre contenha pelo menos um beco sem saída.

Também se pode presumir que o bêbado sempre poderá sair da barra (a primeira linha não será todos os zeros) e que, se o bêbado ficar preso em um local, a linha será representada por todos os zeros.

Saída:

O resultado será o caminho que o bêbado tomou na tentativa de voltar para casa. Os valores para os locais podem ser zero ou um indexado.

Exemplos:

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
fonte
12
Isso traz de volta algumas memórias dos alunos ... quero dizer, err, estou falando de gráficos direcionados, é claro! o :-)
Arnauld 26/03
Podemos considerar a entrada como uma matriz de seqüências de caracteres como [ '1011', '0000', '1000', '1111' ]?
Arnauld 26/03
É possível que o bar seja um beco sem saída? Em outras palavras, a primeira linha será todos os zeros? Além disso, haverá sempre uma linha que só leva a si mesma, e teremos que detectá-la como uma condição final? Em outras palavras, haverá sempre uma linha icom todos os zeros, exceto na coluna i?
kamoroso94
5
Estou apenas esperando que alguém escreva uma resposta em Taxi
Belgabad 26/18
Como você obtém o último caminho no segundo exemplo? Pelo que entendi, 0links para 1,2,3,5, mas a última saída foi 0para4
phflack

Respostas:

7

Mathematica, 72 bytes

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

Esta é uma função que utiliza a matriz como argumento e retorna uma lista e usa a indexação 1.

A idéia básica é começar com

{1}//.

que aplica repetidamente a regra a seguir à lista {1}até que ela pare de mudar. A regra corresponde ao padrão

{r___,x_}:>

o que significa "uma lista com zero ou mais elementos chamados rseguidos por um elemento chamado x". Isso fornece xcomo o último elemento da lista atual e substituímos a lista por

{r,x,<stuff>}

qual é a lista original com <stuff>anexado. O material em questão é

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

que pega #[[x]](o xth elemento da matriz de entrada) como uma lista de pesos e os mapeia n++&/@#, o que é abreviação de Range@Length@#(ou seja, {1,2,3,...}com o comprimento apropriado). Isso gerará um erro se os pesos forem zero, e é por isso que ele está envolvido em um

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

que retornará ##&[]se uma mensagem de erro for gerada. Essa é apenas uma maneira elegante de escrever Sequence[], que atua como um elemento "nada" ( {1,2,Sequence[],3}avalia como {1,2,3}) e, portanto, deixa a lista inalterada, fazendo com que a //.parada pare de ser substituída.

Maçaneta da porta
fonte
4

R , 72 69 66 bytes

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

Experimente online!

Recebe a entrada como uma logicalmatriz e imprime os índices baseados em 1 no console.

Giuseppe
fonte
3

Perl 5 -a0 , 53 51 bytes

Dê matriz de entrada como strings estreitas separadas em STDIN

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

Experimente online!

Danos @Fdurante o corpo do loop, mas são reparados porredo

Ton Hospel
fonte
3

MATL , 15 bytes

1`GyY)ft?th1ZrT

A saída é baseada em 1.

Experimente online! Primeira entrada . Segunda entrada . Terceira entrada .

Explicação

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
Luis Mendo
fonte
2

Python, 136 bytes

Usando a indexação zero, assumindo que o intervalo aleatório foi importado. Toma uma entrada m como matriz de adjacência

113 nenhuma importação

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 com importações

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

Budd
fonte
3
Eu recomendaria usar 136 como sua contagem de bytes principal, de acordo com as declarações de importação de consenso .
Jonathan Frech 26/03
2

Ruby , 70 67 65 bytes

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

Obrigado a benj2240 por salvar 2 bytes!

Experimente online!

Cristian Lupascu
fonte
Você pode salvar alguns bytes comm[i].sum<1?:[]
benj2240
@ benj2240 Uau, eu nunca soube que isso era possível. Agora eu percebi que .sumfoi introduzido no 2.4. Eu costumava fazer .reduce(0, :+)...
Cristian Lupascu 27/03
2

JavaScript (ES6), 87 bytes

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

Experimente online!


Versão alternativa, 81 bytes

Recebe entrada como uma matriz de cadeias binárias. O tamanho máximo suportado é 16x16.

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

Experimente online!

Arnauld
fonte
1

Java 10, 135 bytes

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

Indexado a 0

Explicação:

Experimente online.

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)
Kevin Cruijssen
fonte
1

Haskell , 123 118 bytes

import System.Random
i#m|sum(m!!i)<1=pure[]|1<2=do{x<-randomRIO(0,length m-1);[i#m,x#m>>=pure.(x:)]!!(m!!i!!x)}
f=(0#)

Experimente online!

Cristian Lupascu
fonte
1

APL (Dyalog Unicode) , 32 34 bytes

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

Experimente online!

Toma uma matriz binária aninhada como entrada. Produz cada iteração em linhas separadas.

Kritixi Lithos
fonte
1

Python ,97 94 bytes

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]

Experimente online!


Veja esta resposta para obter mais explicações sobre o gerador de números aleatórios:

id(a)**7%~-2**67
Vincent
fonte