C'est le premier d'une série de défis Island Golf. Prochain challenge
Avec un îlot en ASCII-art, affiche un chemin optimal pour le contourner.
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 est .
, mais vous pouvez substituer deux caractères distincts de votre choix.
...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........
Il y aura toujours au moins une tuile de terre. Les tuiles de terrain seront toutes contiguës (c'est-à-dire qu'il n'y a qu'une seule île). Les dalles d’eau seront également contiguës (c’est-à-dire qu’il n’ya pas de lacs). La bordure extérieure de la grille sera constituée de carreaux d’eau. Les tuiles de terrain ne seront pas reliées en diagonale: vous ne verrez jamais quelque chose comme
....
.#..
..#.
....
Sortie
Votre code doit sortir la même grille, avec une circumnavigation la plus courte dessinée. Dans les exemples ci-dessous, le chemin de circumnavigation est dessiné avec o
, mais vous pouvez remplacer n'importe quel caractère tant qu'il est distinct de vos personnages de terre et d'eau.
Une circumnavigation est une simple courbe fermée, entièrement dessinée sur des tuiles d'eau, qui entoure complètement toutes les tuiles de terrain de la grille. Les connexions diagonales sont autorisées. Par exemple, ceci est une circumnavigation de l'île ci-dessus (mais pas la plus courte):
.ooooo.....
o..##.oo...
o.#####.o..
o.#######o.
o#########o
ooo#######o
..o#####.#o
..oo####..o
....oooooo.
La longueur d'une circumnavigation est calculée comme suit: pour chaque paire de tuiles adjacentes sur le chemin, si elles sont connectées horizontalement ou verticalement, ajoutez 1; s'ils sont connectés en diagonale, ajoutez √2. La longueur du chemin ci-dessus est de 22 + 7√2 (31.9).
Une circumnavigation la plus courte est une circumnavigation dont la longueur est la plus courte possible. Votre programme doit générer tout chemin répondant à cette condition. Pour la plupart des îles, les solutions possibles seront multiples. Voici une solution pour l’île ci-dessus, de longueur 10 + 13√2 (28.4):
...oo......
..o##oo....
.o#####oo..
.o#######o.
o#########o
.o.#######o
..o#####.#o
...o####.o.
....ooooo..
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.
Votre entrée et votre sortie peuvent être une chaîne multiligne ou une liste de chaînes. Si votre langue a un type de caractère distinct des chaînes à caractère unique, vous pouvez remplacer "liste de caractères" par "chaîne" dans la phrase précédente. Si votre langue doit entrer la hauteur et / ou la largeur de la grille, vous pouvez le faire. Votre sortie peut (éventuellement) avoir une nouvelle ligne de fin. Comme mentionné ci-dessus, vous pouvez utiliser trois caractères distincts à la place de #.o
(veuillez spécifier dans votre soumission les caractères que vous utilisez).
Cas de test
A. Îles avec les plus courtes circumnavigations uniques:
...
.#.
...
.o.
o#o
.o.
......
.####.
......
.oooo.
o####o
.oooo.
......
......
..##..
...#..
......
......
......
..oo..
.o##o.
..o#o.
...o..
......
.......
.#####.
...#...
...#...
.#####.
.......
.ooooo.
o#####o
o..#..o
o..#..o
o#####o
.ooooo.
.......
...#...
...#...
.#####.
...#...
...#...
.......
...o...
..o#o..
.o.#.o.
o#####o
.o.#.o.
..o#o..
...o...
.......
.#####.
.##..#.
..#..#.
.......
.ooooo.
o#####o
o##..#o
.o#..#o
..oooo.
B. Exemple d'îlot avec plusieurs solutions possibles:
........
....##..
...####.
..###...
.#####..
.#####..
..##....
........
Sorties possibles:
....oo..
...o##o.
..o####o
.o###.o.
o#####o.
o#####o.
.o##oo..
..oo....
....oo..
...o##o.
..o####o
.o###.o.
o#####o.
o#####o.
.o##.o..
..ooo...
....oo..
...o##o.
..o####o
.o###..o
o#####.o
o#####o.
.o##oo..
..oo....
....oo..
...o##o.
..o####o
.o###..o
o#####.o
o#####o.
.o##.o..
..ooo...
C. Grand test en tant que Gist
C'est du code-golf : c'est le code le plus court dans chaque langue qui gagne.
Réponses:
Mathematica (version 9), 165 octets
La
ConvexHullMesh
fonction courte et agréable utilisée par Greg Martin n'a été introduite que dans la version 10 de Mathematica. J'ai donc pensé essayer de m'en passer, en utilisant mon ancienne version 9 de Mathematica. J'ai toutefois réussi à la raccourcir un peu! Il est une fonction qui prend et retourne une liste de chaînes (avec.
,#
eto
comme les symboles).Explication:
Characters@# /. {"."->0, "#"->1}
transforme l'entrée en une matrice de0
s et de1
s."o"MorphologicalTransform[MorphologicalComponents[#,Method->"ConvexHull"],Max[#(1-#[[2,2]])CrossMatrix@1]&]+"#"#
utilise ensuite les puissantes capacités de traitement d'images de Mathematica (mais extrêmement lourdes en octets…) pour remplir d'abord la coque convexe de l'île (qui est la forme que vous obtiendriez si vous étiriez une ficelle autour de celle-ci), puis définissez ses limites. Nous multiplions ensuite cette matrice par la chaîne"o"
pour obtenir une matrice de0
s et"o"
s (grâce à l'adaptabilité impressionnante de Mathematica à propos des types), et ajoutons cela à"#"
la matrice de l'île.""<>#& /@ (... /. {0->"."})
transforme cette matrice de"o"
s,"#"
s et0
s en une matrice de"o"
s,"#"
s et"."
s et joint chaque ligne à une chaîne.Lorsque nous testons cela sur l'exemple B , nous obtenons la sortie
[Edit, grâce à Greg Martin:] Si nous sommes autorisés à utiliser des tableaux de caractères au lieu de listes de chaînes, nous pouvons réduire ce nombre à 144 octets:
la source
MorphologicalComponents[#, Method->"ConvexHull"]
:) Vous pouvez économiser encore plus d'octets en supposant que l'entrée est déjà scindée en caractères et en renvoyant également un tableau 2D de caractères.MorphologicalComponents
jusqu'à aujourd'hui!f[{"...",".#.","..."}]
et j'ai eu des erreurs.f
. (Eh bien, à proprement parler, ce sont les éléments après le point-virgule.) Pour appeler la fonction, saisissez l'intégralité de l'élément dans une fenêtre Mathematica, suivie de[
votre entrée et]
, ainsi, elle devrait ressembler à quelque chose commef@m_:=m(1-m[[2,2]]) . . . #/.{"."->0,"#"->1}]&[{"...", ".#.", "..."}]
(abrégé pour l'espace).(Mais votez pour la solution de Notatree , c'est mieux!)
Mathematica, 168 octets
Fonction pure prenant un tableau 2D de caractères en entrée et renvoyant un tableau 2D de caractères. Une version plus facile à lire:
La ligne 1 définit une fonction
n
qui produit la distance (la plus petite) entre un pointx
du plan et un ensembley
d’autres points. La ligne 2 initialise la variablei
à l'entrée, à la fois pour résoudre une ambiguïté de curry et pour pouvoir la modifier afin de produire la sortie éventuelle; La ligne 2 définit également une fonctionp
qui renvoie les coordonnées de toutes les occurrences de son entrée dansi
.Sur la ligne 3,
p["#" | "."]
représente chaque coordonnée de la carte en entrée (puisque tous ses caractères sont un"#"
ou"."
), ainsit
est une fonction qui sélectionne uniquement les coordonnées qui satisfont une propriété encore non spécifiée. Sur la ligne 4,i~Part~## = "o"
va changer un tas d'entrées dui
personnage"o"
; ces caractères seront sélectionnés dans l'ensemble des coordonnées possibles en fonction des éléments des lignes 5 à 8. Et la ligne 9 ne fait que renvoyer la réponse une fois qu'elle est calculée.Ok, l'infrastructure est faite, maintenant au calcul réel.
ConvexHullMesh
est intégré à Mathematica pour calculer la coque convexe d’un ensemble de points (le plus petit polygone convexe contenant ces points). Moralement, cela devrait "remplir" les criques et les fjords de l'île (ce qui ests = p@"#"
), pour les écarter de notre cicrumnavigation. Il y a un petit problème avec leConvexHullMesh
moment où tout cet ensemble de points est dans une ligne (merci, cas de test n ° 2), que nous résolvons en ajoutant une version légèrement décalée des
lui-même à la ligne 7. Cette sortie est un polygone, donc les lignes 7 -9 (t[...~RegionMember~# &]
) produit une liste des points avec des coordonnées entières dans ce polygone. Enfin, la ligne 5 et la fin de la ligne 9 calculent tous les points qui se trouvent à une distance exactement égale à 1 (et non pas 0) à partir de cet ensemble de points entiers; cet ensemble devient le chemin circumnavigating.Vous trouverez ci-dessous la sortie du grand cas de test sur le lien de l'OP. Remarquez en haut à gauche, les choix inhabituels de quand aller par rapport à l'ouest par rapport au sud-ouest suggèrent le fait que cela trace une ligne invisible de pente -2/3 entre deux péninsules (ledit segment de ligne faisant partie de la limite de la coque convexe).
la source
char
type distinct ; dans ce cas, unchar
tableau pourrait être utilisé à la place d'une chaîne.Python 3, 779 octets (mise en retrait avec des onglets)
Ceci est l'ensemble du programme. Il lit les entrées de stdin et les affiche sur stdout. Stdin doit se terminer par EOF. Exemple exécuté avec la grande entrée: https://ideone.com/XIfYY0
L'idée est simple: elle calcule les plus petites limites octogonales et dessine les cellules situées à l'intérieur de toutes les limites calculées et coupant au moins l'une des arêtes.
la source
sys.stdin
comme entrée.input()
, obtenir plusieurs lignes ferait l'affaire et coûterait moins d'octetsR(0,x)
avecR(x)
P
etf
;L(generator expression)
=>[generator expression]
;F
,r
EtB
semblent être utilisés qu'une seule fois chacun , et peut donc être inline.JavaScript (ES6),
369343 octetsExplication: La chaîne est divisée en un tableau de caractères (je ne sais pas si l'entrée en tableau de caractères est acceptable). Le tableau est ensuite itéré et les positions de tous les carrés sont localisées. Les lignes de délimitation données par les équations
x - y = o
,x = p
,x + y = q
,y = r
,y - x = t
,-x = u
,-x - y = v
,-y = w
sont déterminées de telle sorte que le paramètre maximal possible est choisi où toutes les terre se trouve au - delà de la ligne. Cela a pour effet de renfermer l'île dans un octogone. Les coordonnées des coins de l'octogone sont facilement calculées à partir des paramètres et les cellules de son bord sont remplies. La matrice est ensuite reliée dans une chaîne. La raison pour laquelle un octogone suffit est la suivante:Considérons un coin de l'octogone. À un moment donné le long des deux bords, le chemin sera limité par la terre car nous avons construit l’octogone pour toucher la terre aussi près que possible. S'il n'y a pas de terrain au coin lui-même, le chemin pourrait emprunter les itinéraires alternatifs, comme indiqué à droite, mais le nombre de marches orthogonales et diagonales est identique, de sorte que la distance est inchangée.
la source
rest of arguments
paramètre....p
à des endroits différents.) La destruction est autre chose (bien que l'opérateur d'étalement puisse être utilisé pour la déstructuration).Python 3.5,
224, 263, 234218 octetsMettez 16 autres octets au golf en supprimant la fonction imbriquée et en en faisant un one-liner.
Golfé 29 octets:
L'entrée est une chaîne unique utilisant "~" pour l'océan, "X" pour la terre et "o" pour la limite. (Utiliser 'X' enregistre un octet pour '>' au lieu de '==')
Version moins golfée avec commentaires:
la source
C # 7 -
414369327 octetsEdit : passage en boucle 1D, informatique
i
etj
à la voléeÉdition : modification de la méthode de saisie, de la table de consultation réduite et passage aux limites initiales bien définies ... et suppression de l'espace inutile dans la dernière boucle for externe
Essayez-le en ligne
Programme complet, prend entrée dans la norme, il imprime à des normes, usages
#
,.
eto
. Pour chaque cellule, il calcule un "profil" (qui correspond à la distance sur 8 directions (il semble en calculer un neuvième par souci de commodité, mais c'est toujours le cas0
), et enregistre un maximum de chacune d'entre elles. Il écrit ensuite la totalité de la carte. Encore une fois, et remplace toute cellule qui est à la fois sur une limite et pas en dehors de toute avec un "0". Le code commenté ci-dessous explique comment tout cela fonctionne.Selon ma réponse à Sauver les oies de l'extinction , cela produit le plus petit octogone (circumnavigation valide avec la plus grande surface) qui délimite l'île.
Remarque : pour une fois dans ma vie, j'utilise quelque chose de la décennie actuelle et ce code nécessite la compilation de C # 7. Si vous n'avez pas C # 7, il y a une ligne à remplacer, qui est clairement indiquée dans le code.
Exemple d'utilisation et de sortie:
Code formaté et commenté:
la source