Inspiré par We do tower hopping et lié au 2D Maze Minus 1D
introduction
Votre tâche consiste à trouver le chemin le plus court pour sortir d'un labyrinthe de tableaux en suivant les règles spécifiées.
Défi
Un tableau 1D a avec n éléments peut être considéré comme un labyrinthe composé de n points, où le point d'index k est connecté aux points avec k + a [ k ] et k - a [ k ] d'une manière unidirectionnelle. En d'autres termes, vous pouvez sauter en avant ou en arrière exactement à [ k ] pas du point d'index k . Les points avec un index en dehors des limites du tableau sont considérés en dehors du labyrinthe.
Pour illustrer cela, considérez le tableau suivant,
[0,8,5,9,4,1,1,1,2,1,2]
Si nous sommes au 5ème élément en ce moment, puisque l'élément est 4, nous pouvons sauter 4 pas en avant vers le 9ème élément, ou 4 pas en arrière vers le 1er élément. Si nous faisons ce dernier, nous nous retrouvons avec l'élément 0, ce qui indique qu'aucun autre mouvement n'est possible. Si nous faisons le premier, puisque le 9ème élément est 2, nous pouvons choisir de sauter au 11ème élément, qui est à nouveau un 2, puis nous pouvons à nouveau sauter au "13ème élément", qui est hors des limites du tableau et considéré comme une sortie vers le labyrinthe.
Donc, si nous partons de l'élément du milieu, une façon de sortir du labyrinthe est de sauter 1 pas en arrière, 4 pas en avant, 2 pas en avant et encore 2 pas en avant, qui peut être exprimé comme le tableau [-1,4,2,2]
. Sinon , vous pouvez l' exprimer avec le tableau [4,8,10,12]
qui enregistre l'indice de base zéro de tous les points intermédiaires et finaux (1 à base d'indice est aussi très bien), ou tout simplement les signes, [-1,1,1,1]
.
Échapper au labyrinthe de l'extrémité à faible indice est également OK.
Utiliser la première notation et partir du même élément, [1,1,1,2,2]
est également une solution mais elle n'est pas optimale car il y a 5 étapes au lieu de 4.
La tâche consiste à trouver le chemin le plus court pour sortir du labyrinthe de tableaux et sortir le chemin. S'il existe plusieurs chemins optimaux, vous pouvez en générer un ou tous. S'il n'y a pas de solution, vous devez sortir une valeur de falsification choisie par vous qui est discernable à partir d'un chemin valide (la production d'aucune sortie du tout est également OK).
Par souci de simplicité, le nombre d'éléments dans le tableau est toujours un nombre impair et nous partons toujours de l'élément du milieu.
Cas de test
Les cas de test illustrent différentes formes de sortie, mais vous n'êtes pas limité à celles-ci.
Input
Output
[0,8,5,9,4,1,1,1,2,1,2]
[-1,4,2,2]
[2,3,7,1,2,0,2,8,9]
[2,9] (or [2,-5] or [[2,9],[2,-5]])
[0,1,2,2,3,4,4,4,3,2,2,3,0]
[1,-1,1,1]
[0,1,2,2,4,4,6,6,6,6,6,4,2,1,2,2,0]
[]
Spécifications
Vous pouvez écrire une fonction ou un programme complet.
Le tableau contient uniquement des entiers non négatifs.
Vous pouvez prendre des entrées et des sorties via n'importe quel formulaire standard , mais veuillez spécifier dans votre réponse le formulaire que vous utilisez.
C'est le code-golf , le plus petit nombre d'octets gagne.
Comme d'habitude, les failles par défaut s'appliquent ici.
la source
[0,8,5,9,4,1,1,1,2,1,2]
, sortie[[-1,4,2,2]]
)[1,1,1,-1]
au lieu de[-1,1,1,1]
?Réponses:
JavaScript (ES6), 117 octets
Renvoie un tableau de points intermédiaires et finaux indexés 0, ou un tableau vide s'il n'existe aucune solution.
Essayez-le en ligne!
Commenté
la source
Husk , 22 octets
Renvoie une liste de signes ou une liste vide si aucune solution n'existe. Essayez-le en ligne!
Explication
Il s'agit d'une solution de force brute qui vérifie les listes
-1,0,1
de plus en plus longues et renvoie la première qui entraîne un saut hors du tableau. Puisqu'il est de longueur minimale, il ne contiendra pas de 0.la source
Python 3 ,
195188179 179 octetsEssayez-le en ligne!
Éditer:
all(..)and s => all(..)*s
,if u not in x => if{u}-x
le premier exploite
boolean * list == int * list
, le second utilise la différence de set (le set vide est également faux).Format de sortie: tableau imbriqué de toutes les réponses optimales, donné sous forme d'indices de base zéro de points intermédiaires et finaux.
Par exemple:
f([0,8,5,9,4,1,1,1,2,1,2]) == [[4, 8, 10, 12]]
.L'algorithme est un simple BFS.
s
enregistre tous lesi
chemins de longueur possibles suri
itération, à l'exclusion des indices déjà visités. Notez que la notation en étoile étendue est (ab) utilisée car l'accès répété au tableau est coûteux. J'ai trouvé qu'une telle notation peut également réduire certains espaces blancs si elle est utilisée correctement.J'ai également fait une version récursive (mais plus longue) de la solution ci-dessus. Les deux
s and
etor s
sont nécessaires, sinon cela ne fonctionne pas.Python 3 , 210 octets
Essayez-le en ligne!
la source
Haskell ,
207202 octets5 octets économisés grâce à BMO .
Essayez-le en ligne!
Il s'agit d'une fonction qui prend une liste de
Int
comme paramètre et renvoie une liste de chemins où chaque chemin est une liste de sauts relatifs effectués pour sortir du tableau.La version non golfée:
la source
C (gcc) , 269 octets
Essayez-le en ligne!
Initialement essayé une recherche de retour en arrière récursif, car utiliser
main
pour la récursivité est toujours amusant. En fin de compte, une simple recherche en largeur non récursive a pu être réduite, ce qui est le cas de cette version. Ce programme prend le tableau d'entrée comme arguments de ligne de commande, sans accolades, par exemple0 8 5 9 4 1 1 1 2 1 2
pour le premier exemple fourni. Le programme affiche sur stdout une liste d' indexées sur 1 , les indices de tableau délimité par des virgules dans l' ordre inverse, en commençant par le dernier, en dehors des limites du terrain / « échappé » index et le dos de travail à travers les indices intermédiaires atteints (il ne reproduit pas le centre, indice de départ). Le programme ne produit pas d'accolades autour du tableau et laisse une virgule de fin car séparéprintf
les instructions prennent beaucoup de caractères. La sortie correspondant au premier exemple de test ci-dessus est13,11,9,5,
par exemple.S'il n'y a pas de chemin d'échappement du labyrinthe de tableaux, le programme ne produit rien.
Dégolfé et expliqué qu'il est ci-dessous (fortement dégouliné avec quelques changements de lisibilité):
Comme d'habitude pour le code C golfé, la sortie de la compilation comprendra bien sûr un mur convivial d'avertissements et de notes.
la source
Perl 5 , -a: 73 octets
(comptage à l'ancienne: 75 octets,
+1
poura
et+1
pour remplacer-//
par-/$/
et utiliser$`
pour$'
)Donnez le tableau d'entrée en une seule ligne sur STDIN, par exemple
0 8 5 9 4 1 1 1 2 1 2
imprime les positions visitées dans l'ordre inverse, y compris le point de départ, puis se bloque
N'imprime rien s'il n'y a pas de solution
Essayez-le en ligne!
la source
Rubis , 102 octets
Essayez-le en ligne!
Prend le labyrinthe d'entrée sous forme de tableau, les sorties en imprimant le chemin d'échappement à l'envers, de la sortie au point de départ (inclus). N'imprime rien s'il n'y a pas d'échappatoire.
Cette approche abuse de la méthode de la carte pour itérer à travers un tableau temporaire stockant l'historique des chemins, qui est constamment étendu à la volée chaque fois qu'il y a une autre étape possible à prendre.
En principe, je pourrais enregistrer un autre octet en utilisant à la
return x
place debreak p x
, mais cela signifierait affirmer que ma valeur de falsification est égale à tous les déchets monstrueux stockés dansb
. Ce serait probablement trop, même compte tenu de la flexibilité permise de la sortie ...Procédure pas à pas
la source