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]
fonte
[ '1011', '0000', '1000', '1111' ]
?i
com todos os zeros, exceto na colunai
?0
links para1,2,3,5
, mas a última saída foi0
para4
Respostas:
Mathematica, 72 bytes
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
que aplica repetidamente a regra a seguir à lista
{1}
até que ela pare de mudar. A regra corresponde ao padrãoo que significa "uma lista com zero ou mais elementos chamados
r
seguidos por um elemento chamadox
". Isso fornecex
como o último elemento da lista atual e substituímos a lista porqual é a lista original com
<stuff>
anexado. O material em questão éque pega
#[[x]]
(ox
th elemento da matriz de entrada) como uma lista de pesos e os mapeian++&/@#
, o que é abreviação deRange@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 umque retornará
##&[]
se uma mensagem de erro for gerada. Essa é apenas uma maneira elegante de escreverSequence[]
, 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.fonte
R ,
726966 bytesExperimente online!
Recebe a entrada como uma
logical
matriz e imprime os índices baseados em 1 no console.fonte
Perl 5
-a0
,5351 bytesDê matriz de entrada como strings estreitas separadas em STDIN
Experimente online!
Danos
@F
durante o corpo do loop, mas são reparados porredo
fonte
MATL , 15 bytes
A saída é baseada em 1.
Experimente online! Primeira entrada . Segunda entrada . Terceira entrada .
Explicação
fonte
Perl 6 , 38 bytes
Experimente online!
fonte
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
fonte
Ruby ,
70 6765 bytesObrigado a benj2240 por salvar 2 bytes!
Experimente online!
fonte
m[i].sum<1?:[]
.sum
foi introduzido no 2.4. Eu costumava fazer.reduce(0, :+)
...JavaScript (ES6), 87 bytes
Experimente online!
Versão alternativa, 81 bytes
Recebe entrada como uma matriz de cadeias binárias. O tamanho máximo suportado é 16x16.
Experimente online!
fonte
Java 10, 135 bytes
Indexado a 0
Explicação:
Experimente online.
fonte
Haskell ,
123118 bytesExperimente online!
fonte
APL (Dyalog Unicode) , 32
34bytesExperimente online!
Toma uma matriz binária aninhada como entrada. Produz cada iteração em linhas separadas.
fonte
Python ,
9794 bytesExperimente online!
Veja esta resposta para obter mais explicações sobre o gerador de números aleatórios:
fonte