Les espèces d'oies connues sous le nom d' Alex A sont connues pour résider dans des grilles triangulaires composées de 64 cellules:
(Photo prise à partir de ce problème non lié au projet Euler .)
Nous allons étiqueter chaque cellule avec les numéros 0
à 63
partir de la ligne du haut, puis de gauche à droite sur chaque ligne en dessous. La cellule du haut est donc la cellule 0
du bas à droite 63
.
Chaque cellule a trois bordures. Nous pouvons étiqueter chaque bordure sous la forme a,b
où a
etb
sont les numéros des cellules qui partagent cette bordure. Par exemple, la frontière entre la cellule 0
et 2
serait appelée 0,2
ou 2,0
(peu importe l'ordre dans lequel vous les mettez).
Le système d'étiquetage des bordures sur le bord même de la grille est différent, car les cellules sur le bord de la grille ont une bordure qu'elles ne partagent pas avec d'autres cellules. Si une bordure n'est qu'une partie d'une cellule, nous utiliserons la lettre X
. Par exemple, les trois frontières de la cellule0
sont 0,2
, 0,X
et 0,X
.
Certaines cellules contiennent oies . Cependant, ces oies seront tuées par des renards maléfiques (qui viennent de l'extérieur des frontières de la grille) si vous ne les protégez pas. Et si toutes les oies meurent, BrainSteel sera triste. Par conséquent, nous allons écrire un programme qui construit des clôtures autour des oies pour les protéger des renards. Les oies doivent exister dans un seul polygone entièrement clos de clôtures. Notre budget de clôture est assez faible, utilisez donc le moins de clôtures possible.
Description de l'entrée
Une liste de nombres, séparés par des virgules, de 0
à 63
, représentant les cellules qui contiennent des oies. Exemple:
6,12
Description de sortie
Une liste des frontières sur lesquelles des clôtures doivent être construites pour protéger les oies avec succès. Ce devrait être le plus petit nombre de clôtures possible. Exemple:
5,6 6,7 11,12 12,13
la source
Réponses:
C #, 530 octets
Programme C # complet, prend l'entrée en une seule ligne de STDIN et sort une seule ligne vers STDOUT, avec un "" de fin.
C'est assez long ... et a beaucoup trop de répétitions x / y / z, mais je n'ai pas été en mesure de le réduire à quelque chose de sensé jusqu'à présent, et passer un examen dans 2 heures, pourrait y revenir demain.
Ce diagramme explique la plupart de ce qui se passe.
Reconnaissez que parce que nous ne pouvons pas avoir de sections de largeur 0, un "hexagone" sera toujours la forme la moins chère (et a l'avantage de donner aux oies le maximum d'espace pour se déplacer).
Le programme fonctionne en traduisant d'abord tous les indices de cellule d'entrée en coordonnées x / y / z et en trouvant le min / max de chacun des x / y / z.
Ensuite, il passe par chaque index de cellule, et vérifie s'il s'inscrit dans la limite «hexagonale» que nous avons décrite. Si c'est le cas, il vérifie s'il se trouve sur l'un des bords extrêmes des limites (c'est-à-dire x = xmin ou y = ymax) et ajoute les bords correspondants si c'est le cas. Il doit déterminer l'indice du bord à côté duquel il se trouve. Pour x et z, nous les incrémentons / décrémentons comme nous le voulons, puis utilisons la formule suivante:
Notez que la "parité" change toujours et que y n'est pas impliqué. Pour y, nous n'avons rien à changer, mais le code est un peu désordonné car il doit effectuer des vérifications de limites "triangulaires" pour détecter si la cellule voisine doit être un "X" ou non.
Exemple de solution (cellules avec des oies venant des trois coins):
Code plus ordonné avec commentaires:
la source
using System;
.using Q=System.Console;Q.Write();Q.ReadLine()
(45 octets) par rapport à votre suggestionusing System;Console.Write();Console.ReadLine()
(47 octets).i
,x
,y
,z
etp
à 0.