Le voyage de l'ivrogne à la maison
Dans ce défi, vous devez écrire un programme qui simule un ivrogne trébuchant en rentrant du bar.
Contribution:
L'entrée sera une matrice d'adjacence (représentant un graphe orienté) qui représente les chemins que l'ivrogne peut emprunter. À chaque emplacement, l'ivrogne choisira un chemin au hasard (chaque option a une chance approximativement égale et est indépendante des choix antérieurs) à suivre.
Supposons que l'ivrogne commence toujours à la barre (première ligne de la matrice d'adjacence).
Si l'ivrogne entre dans une impasse, on peut supposer qu'il est soit rentré chez lui ou qu'il a été arrêté pour intoxication publique et que le programme devrait reprendre son chemin.
On peut supposer que le graphique contiendra toujours au moins une impasse.
On peut également supposer que l'ivrogne sera toujours en mesure de sortir de la barre (la première ligne ne sera pas tous des zéros) et que si l'ivrogne serait coincé dans un emplacement, que la ligne serait représentée par tous les zéros.
Sortie:
Le résultat sera le chemin emprunté par l'ivrogne pour tenter de rentrer chez lui. Les valeurs des emplacements peuvent être zéro ou un indexé.
Exemples:
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]
la source
[ '1011', '0000', '1000', '1111' ]
?i
avec tous les zéros sauf dans la colonnei
?0
liens vers1,2,3,5
, mais la dernière sortie va de0
à4
Réponses:
Mathematica, 72 octets
Il s'agit d'une fonction qui prend la matrice comme argument et renvoie une liste, et elle utilise l'indexation 1.
L'idée de base est de commencer par
qui applique à plusieurs reprises la règle qui suit à la liste
{1}
jusqu'à ce qu'elle cesse de changer. La règle correspond au modèlece qui signifie "une liste avec zéro ou plusieurs éléments appelés
r
suivis d'un élément appeléx
." Cela donnex
comme dernier élément de la liste actuelle, et nous remplaçons la liste parqui est la liste d'origine avec en
<stuff>
annexe. Le truc en question estqui prend
#[[x]]
(lex
e élément de la matrice d'entrée) comme une liste de poids et les mappen++&/@#
, ce qui est courtRange@Length@#
(c'est-{1,2,3,...}
à- dire avec la longueur appropriée). Cela générera une erreur si les poids sont tous nuls, c'est pourquoi il est enveloppé dans unqui retournera
##&[]
si un message d'erreur est généré. Il s'agit simplement d'une façon sophistiquée d'écrireSequence[]
, qui agit comme un élément "rien" ({1,2,Sequence[],3}
s'évalue{1,2,3}
) et laisse donc la liste inchangée, ce qui provoque l'//.
arrêt du remplacement.la source
R ,
726966 octetsEssayez-le en ligne!
Prend les entrées sous forme de
logical
matrice et imprime les index basés sur 1 sur la console.la source
Perl 5
-a0
,5351 octetsDonner la matrice d'entrée sous forme de chaînes serrées séparées sur STDIN
Essayez-le en ligne!
Dommages
@F
pendant le corps de la boucle, mais il est réparé parredo
la source
MATL , 15 octets
La sortie est basée sur 1.
Essayez-le en ligne! Première entrée . Deuxième entrée . Troisième entrée .
Explication
la source
Perl 6 , 38 octets
Essayez-le en ligne!
la source
Python, 136 octets
En utilisant l'indexation zéro, en supposant que randrange a été importé. Prend une entrée m comme matrice d'adjacence
113 aucune importation
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 avec importations
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
la source
Rubis ,
70 6765 octetsMerci à benj2240 pour avoir économisé 2 octets!
Essayez-le en ligne!
la source
m[i].sum<1?:[]
.sum
2.4 avait été introduite. J'avais l'habitude de faire.reduce(0, :+)
...JavaScript (ES6), 87 octets
Essayez-le en ligne!
Version alternative, 81 octets
Prend l'entrée comme un tableau de chaînes binaires. La taille maximale prise en charge est 16x16.
Essayez-le en ligne!
la source
Java 10, 135 octets
0 indexé
Explication:
Essayez-le en ligne.
la source
Haskell ,
123118 octetsEssayez-le en ligne!
la source
APL (Dyalog Unicode) , 32
34octetsEssayez-le en ligne!
Prend un tableau binaire imbriqué en entrée. Génère chaque itération sur des lignes distinctes.
la source
Python ,
9794 octetsEssayez-le en ligne!
Voir cette réponse pour plus d'explications sur le générateur de nombres aléatoires:
la source