Il s'agit du deuxième d'une série de défis Island Golf. Défi précédent
Deux ermites sont arrivés sur une île déserte. Depuis qu'ils sont venus chercher la solitude, ils souhaitent vivre le plus loin possible les uns des autres. Où devraient-ils construire leurs huttes pour maximiser la distance de marche entre eux?
Contribution
Votre entrée sera une grille rectangulaire composée de deux caractères, représentant la terre et l'eau. Dans les exemples ci-dessous, la terre est #
et l'eau l'est .
, mais vous pouvez remplacer les deux caractères distincts que vous souhaitez.
...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........
Il y aura toujours au moins deux tuiles de terrain. Les tuiles de terre seront toutes contiguës (c'est-à-dire qu'il n'y a qu'une seule île). Les tuiles d'eau seront également contiguës (c'est-à-dire qu'il n'y a pas de lacs). La bordure extérieure de la grille sera toutes des tuiles d'eau. Les tuiles de terre ne seront pas connectées en diagonale: c'est-à-dire que vous ne verrez jamais quelque chose comme
....
.#..
..#.
....
Production
Votre code doit sortir la même grille, avec deux emplacements de cabane marqués dessus. Dans les exemples ci-dessous, les emplacements des cabanes sont marqués d'un X, mais vous pouvez remplacer n'importe quel caractère tant qu'il est distinct de vos personnages terrestres et aquatiques.
Les emplacements des cabanes doivent être constitués de deux tuiles terrestres, choisies de manière à maximiser la distance de marche entre elles. Nous définissons la distance de marche comme la longueur du chemin le plus court, entièrement terrestre, entre les deux points. Les tuiles de terre sont considérées adjacentes horizontalement ou verticalement, mais pas en diagonale.
Une solution possible pour l'île ci-dessus:
...........
...X#......
..#####....
..#######..
.#########.
...#######.
...#####.X.
....####...
...........
La distance de marche entre ces deux points est de 11, ce qui est la plus grande distance entre deux points sur cette île. Il existe une autre solution à distance 11:
...........
...##......
..X####....
..#######..
.#########.
...#######.
...#####.X.
....####...
...........
Détails
Votre solution peut être un programme complet ou une fonction . Toutes les méthodes d'entrée et de sortie par défaut sont acceptables.
Vos entrées et sorties peuvent être une chaîne multiligne, une liste de chaînes ou un tableau 2D / liste imbriquée de caractères / chaînes à un seul caractère. Votre sortie peut (facultativement) avoir une seule nouvelle ligne de fin. Comme mentionné ci-dessus, vous pouvez utiliser trois caractères distincts à la place de #.X
(veuillez spécifier dans votre soumission les caractères que vous utilisez).
Cas de test
A. Îles avec des emplacements de cabane uniques:
....
.##.
....
....
.XX.
....
......
......
..##..
...#..
......
......
......
......
..X#..
...X..
......
......
........
.#####..
.##..##.
.#..###.
.##..##.
........
........
.#####..
.##..##.
.#..###.
.#X..#X.
........
.........
.#####.#.
.#...#.#.
.#.###.#.
.#.....#.
.#######.
.........
.........
.#####.X.
.#...#.#.
.#.X##.#.
.#.....#.
.#######.
.........
B. Exemple d'une île avec plusieurs solutions possibles:
........
....##..
...####.
..###...
.#####..
.#####..
..##....
........
Sorties possibles:
........
....#X..
...####.
..###...
.#####..
.X####..
..##....
........
........
....#X..
...####.
..###...
.#####..
.#####..
..X#....
........
........
....##..
...###X.
..###...
.#####..
.X####..
..##....
........
........
....##..
...###X.
..###...
.#####..
.#####..
..X#....
........
C. Grand cas de test comme un Gist
C'est le code-golf : le code le plus court dans chaque langue gagne.
Réponses:
Python 3,
249246 octetsRasé de 3 octets, merci DLosc.
L'entrée et la sortie sont des chaînes simples, avec '.', '@' Et 'X' représentant respectivement l'eau, les huttes et la terre.
Version antérieure:
L'entrée est une chaîne unique, avec '.' et «#» représentant respectivement l'eau et la terre. «X» représente les cases dans la sortie.
Explication:
Il s'agit essentiellement d'une première recherche étendue à partir de tous les points de départ possibles en même temps. Conservez un dictionnaire, d, de longueurs de chemin codées par le début et la fin du chemin, par exemple, d [(k, i)] est la distance de k à i. Ensuite, parcourez les clés du dictionnaire, d, et créez un nouveau dictionnaire, u, avec des chemins de 1 unité de plus en déplaçant l'unité de point final 1 vers le N, S, E, W, par exemple, u [(k, i + 1)] = d [(k, i)] + 1. Ne pas inclure les chemins qui sont déjà dans d. Si u n'est pas vide, ajoutez les nouveaux chemins plus longs à d et répétez. Lorsque u est vide, cela signifie qu'aucun chemin ne peut plus être créé. Maintenant d contient tous les chemins possibles et leurs longueurs. Il s'agit donc simplement d'obtenir la clé avec le chemin le plus long.
Version moins golfée, commentée:
la source
C #, 387 octets
Lançons le bal ...
Essayez-le en ligne
Programme complet, lit depuis STDIN, écrit dans STDOUT. Il parcourt simplement chaque cellule et exécute un BFS pour calculer la cellule la plus éloignée, enregistrant les deux si elle est la plus éloignée enregistrée. Je n'y trouve vraiment rien et, frustrant, je ne trouve rien au golf.
Code formaté et commenté:
la source