El viaje del borracho a casa
En este desafío, debes escribir un programa que simule a un borracho tropezando camino a casa desde el bar.
Entrada:
La entrada será una matriz de adyacencia (que representa un gráfico dirigido) que representa los caminos que puede tomar el borracho. En cada ubicación, el borracho elegirá un camino al azar (cada opción tiene aproximadamente la misma probabilidad y es independiente de las elecciones anteriores) a seguir.
Suponga que el borracho siempre comienza en la barra (primera fila en la matriz de adyacencia).
Si el borracho entra en un callejón sin salida, se puede suponer que se dirigió a su casa o que fue arrestado por intoxicación pública y que el programa debería retomar su camino.
Se puede suponer que el gráfico siempre contendrá al menos un callejón sin salida.
También se puede suponer que el borracho siempre podrá salir de la barra (la primera fila no será todos ceros) y que si el borracho se atascara en una ubicación, la fila estaría representada por todos los ceros.
Salida:
La salida será el camino que tomó el borracho en su intento de regresar a casa. Los valores para las ubicaciones pueden ser cero o uno indexado.
Ejemplos:
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]
fuente
[ '1011', '0000', '1000', '1111' ]
?i
con todos los ceros excepto en la columnai
?0
enlaces a1,2,3,5
, pero la última salida haya que pasar de0
a4
Respuestas:
Mathematica, 72 bytes
Esta es una función que toma la matriz como argumento y devuelve una lista, y utiliza la indexación 1.
La idea básica es comenzar con
que aplica repetidamente la regla que sigue a la lista
{1}
hasta que deja de cambiar. La regla coincide con el patrón.lo que significa "una lista con cero o más elementos llamados
r
seguidos de un elemento llamadox
". Esto dax
como último elemento en la lista actual, y reemplazamos la lista conque es la lista original con
<stuff>
adjunta. Lo que está en cuestión esque toma
#[[x]]
(elx
elemento th de la matriz de entrada) como una lista de pesos y los asignan++&/@#
, que es la abreviatura deRange@Length@#
(es decir,{1,2,3,...}
con la longitud adecuada). Esto arrojará un error si los pesos son todos cero, razón por la cual está envuelto en unque volverá
##&[]
si se genera un mensaje de error. Esta es solo una forma elegante de escribirSequence[]
, que actúa como un elemento "nada" ({1,2,Sequence[],3}
evalúa{1,2,3}
) y, por lo tanto, deja la lista sin cambios, lo que hace//.
que se detenga la sustitución.fuente
R ,
726966 bytesPruébalo en línea!
Toma la entrada como una
logical
matriz e imprime los índices basados en 1 en la consola.fuente
Perl 5
-a0
,5351 bytesDar matriz de entrada como cadenas apretadas separadas en STDIN
Pruébalo en línea!
Daños
@F
durante el cuerpo del bucle pero son reparados porredo
fuente
MATL , 15 bytes
La salida está basada en 1.
Pruébalo en línea! Primera entrada . Segunda entrada . Tercera entrada .
Explicación
fuente
Perl 6 , 38 bytes
Pruébalo en línea!
fuente
Python, 136 bytes
Utilizando la indexación cero, suponiendo que se haya importado randrange. Toma una entrada m como matriz de adyacencia
113 sin importaciones
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 con importaciones
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
fuente
Ruby ,
70 6765 bytes¡Gracias a benj2240 por guardar 2 bytes!
Pruébalo en línea!
fuente
m[i].sum<1?:[]
.sum
se introdujo en 2.4. Solía hacerlo.reduce(0, :+)
...JavaScript (ES6), 87 bytes
Pruébalo en línea!
Versión alternativa, 81 bytes.
Toma la entrada como una matriz de cadenas binarias. El tamaño máximo admitido es 16x16.
Pruébalo en línea!
fuente
Java 10, 135 bytes
0 indexado
Explicación:
Pruébalo en línea.
fuente
Haskell ,
123118 bytesPruébalo en línea!
fuente
APL (Dyalog Unicode) , 32
34bytesPruébalo en línea!
Toma una matriz binaria anidada como entrada. Emite cada iteración en líneas separadas.
fuente
Pitón ,
9794 bytesPruébalo en línea!
Consulte esta respuesta para obtener más explicaciones sobre el generador de números aleatorios:
fuente