Contexte
Vous êtes l'apprenti d'un puissant sorcier et votre maître élabore actuellement un sortilège pour créer un labyrinthe interdimensionnel dans lequel piéger ses ennemis. Il souhaite que vous programmiez son ordinateur alimenté à la vapeur pour analyser les configurations possibles. La programmation de cette machine diabolique est très dangereuse, vous voulez donc garder le code aussi court que possible.
Contribution
Votre entrée est une grille bidimensionnelle de points .
et de hachages #
, représentant des espaces vides et des murs, présentée sous la forme d'une chaîne délimitée par des lignes. Il y en aura toujours au moins un .
et un #
et vous pourrez décider s'il y a ou non une nouvelle ligne.
Cette grille est le modèle d'un labyrinthe infini, qui consiste à aligner une infinité de copies de la grille les unes à côté des autres. Le labyrinthe est divisé en cavités , qui sont des composants connectés d'espaces vides (les espaces adjacents en diagonale ne sont pas connectés). Par exemple, la grille
##.####
...##..
#..#..#
####..#
##...##
résultats dans le labyrinthe suivant (continué indéfiniment dans toutes les directions):
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
Ce labyrinthe contient une cavité de surface infinie. D'autre part, ce plan aboutit à un labyrinthe composé uniquement de cavités finies:
##.####
##..###
####...
..####.
#..####
Sortie
Votre sortie doit être une valeur de vérité si le labyrinthe contient une cavité infinie, sinon une valeur de fausseté. Notez que le labyrinthe peut contenir des cavités finies et infinies; dans ce cas, le résultat doit être la vérité.
Règles
Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus faible gagne et les failles standard sont interdites.
Cas de test supplémentaires
Cavités infinies:
.#
#.#
...
#.#
#.###.#.###.#
#.#...#...#.#
#.#.#####.#.#
..#.#...#.#..
###.#.#.#.###
#...#.#.#...#
#.###.#.###.#
##.###
#..###
..##..
###..#
##..##
..#..#..#..#..#..#
.#..#..#..#..#..#.
#..#..#..#..#..#..
#.####.###.###.####
#...#..#...###..###
###.#..#.######..##
....####.#######...
###..###...########
##########.##....##
..###......##.##...
#.........##..#####
###########..###..#
#...........####..#
#.###########.##..#
#.##....##.....####
#.####.###.###.####
Cavités finies:
###
#.#
###
.#
#.
####
.#..
####
#.#.#
..#..
#####
..#..
#.#.#
#.#.#.#.#.#
..#...#.#..
###.###.###
..#.#......
#.#.#######
#.#.......#
#.#######.#
#.#.....#.#
#.#.#.#.#.#
##....#####
.#..#...##.
.##.#..#...
..###.###..
#..##.#####
#...##....#
#.#.#####.#
###..####.#
....####...
###...#####
###....##.#########
####...##....#...##
..####.#######.###.
....##..........##.
###..#####.#..##...
####..#..#....#..##
..###.####.#.#..##.
..###...#....#.#...
..####..##.###...##
#.####.##..#####.##
####...##.#####..##
###########
........#..
#########.#
..........#
.##########
.#.........
##.########
...#.......
.
et un#
dans l'entrée.Réponses:
JavaScript (ES6), 235
253Même méthode utilisée par @mac. Pour chaque cellule libre, j'essaie un remplissage récursif, en marquant les cellules utilisées avec la coordonnée que j'utilise (qui peut être en dehors du modèle original). Si, pendant le remplissage, j'arrive dans une cellule déjà marquée avec une coordonnée différente, je suis sur un chemin infini.
La façon bizarre de manipuler le modulo dans JS est assez énervante.
Testez dans la console Firefox / FireBug
Infini
Sortie
Fini
Sortie
la source
(j%4-1)%2
donne un motif répétitif agréable.L=
nombre d'octets.C # -
423375 octetsProgramme complet en C #, accepte les entrées via STDIN, les sorties "True" ou "False" sont envoyées à STDOUT selon le cas.
Je ne pouvais pas laisser de côté cette Linq ... heureusement, son déménagement a porté ses fruits! Il garde maintenant une trace des cellules vues et visitées dans un tableau (étant donné qu'il n'en regarde de toute façon qu'un nombre fini d'entre elles). J'ai également réécrit le code directionnel, supprimant ainsi le besoin d'un Lambda et rendant généralement le code plus difficile à comprendre (mais avec une économie substantielle d'octets).
C’est une recherche approfondie en profondeur (non pas que cela compte) qui continue jusqu’à ce qu’elle soit bloquée dans une cavité finie, ou bien elle décide que la caverne est assez grande pour être infiniment grande (quand elle a autant de cellules que le rectangle d’origine, cela signifie qu’il doit exister un chemin d’une cellule à une autre, que nous pouvons continuer à suivre pour toujours).
Code non limité:
la source
C#
réponse en tant que gagnant des votes ici.Python 2 -
258210244 octetsVérifiez récursivement les chemins, si le dépassement de pile retourne 1 (vérité) sinon rien ne retourne (falsey).
la source
;
pour les lignesp
, car vous les obtiendrez sur la même ligne avecif
.Python 2 -
297286275 octetsChoisit une cellule "ouverte" sur laquelle commencer un remplissage. Le labyrinthe est infini si, pendant le remplissage, nous revisitons une cellule que nous avons déjà visitée, mais ses coordonnées sont différentes de celles de la visite précédente. Si l'inondation remplit toute la région sans trouver une telle cellule, essayez une autre région. Si une telle région est introuvable, le labyrinthe est fini.
Prend le fichier à traiter en ligne de commande, retourne le code de sortie
1
pour infini et0
pour fini.Renvoie les résultats corrects pour tous les cas de test.
la source