On vous donne une grille hexagonale des personnages .
et #
, comme ceci:
. . . . . . . .
. . . . # . . .
. # . . . # . .
. . . # . . . .
. . . . . # . .
. . . . . . . .
Votre tâche consiste à remplir tout le cadre de délimitation aligné sur l'axe du #
avec #
:
. . . . . . . .
. . # # # # . .
. # # # # # . .
. . # # # # # .
. . # # # # . .
. . . . . . . .
La boîte englobante alignée sur l'axe est la plus petite forme hexagonale convexe qui contient tous les #
. Notez que dans le cas de la grille hexagonale, il y a trois axes à considérer (W / E, SW / NE, NW / SE):
Voici un autre exemple pour montrer que dans certains cas, un ou plusieurs côtés n'en contiendront qu'un #
:
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . . . . . . . . . . . . .
Vous pouvez soit les voir comme des hexagones à côtés dégénérés, soit dessiner le cadre de délimitation autour d'eux, comme je l'ai fait ci-dessus, auquel cas ce sont toujours des hexagones:
Trop dur? Essayez la partie I!
Règles
Vous pouvez utiliser deux caractères ASCII imprimables non spatiaux distincts (0x21 à 0x7E, inclus), à la place de #
et .
. Je continuerai à me référer à eux au fur #
et .
à mesure du reste de la spécification.
L'entrée et la sortie peuvent être soit une chaîne séparée par un saut de ligne, soit une liste de chaînes (une pour chaque ligne), mais le format doit être cohérent.
Vous pouvez supposer que l'entrée contient au moins une #
et que toutes les lignes ont la même longueur. Notez qu'il existe deux "types" de lignes (commençant par un espace ou un non-espace) - vous ne pouvez pas supposer que l'entrée commence toujours par le même type. Vous pouvez supposer que le cadre de sélection tient toujours à l'intérieur de la grille qui vous est donnée.
Vous pouvez écrire un programme ou une fonction et utiliser l'une de nos méthodes standard de réception d'entrée et de sortie.
Vous pouvez utiliser n'importe quel langage de programmation , mais notez que ces failles sont interdites par défaut.
Il s'agit de code-golf , donc la réponse valide la plus courte - mesurée en octets - l'emporte.
Cas de test
Chaque scénario de test a une entrée et une sortie côte à côte.
# #
. . . .
# . # # # #
. . . .
. # . #
. . . . # .
# . # .
# . # .
. . . . # .
. # . #
# . # .
# . . # # .
. # # #
. # # #
# . . # # #
. # # #
. . # . # #
. . # #
# . . # # .
# . . # # .
. . # #
. . # . # #
. . . . . . . . . . . . . . . .
. . # . # . . . . . # # # . . .
. . . . . . . . . . . # # . . .
. . . # . . . . . . . # . . . .
. . . . . . . . . . . . . . . .
. . # . . . # . . . # # # # # .
. . . . . . . . . . . # # # # .
. . . # . . . . . . . # # # . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. # . . . . . . . # # # # . . .
. . . . . # . . . . # # # # . .
. . # . . . . . . . # # # . . .
. . . . # . . . . . # # # # . .
. # . . . # . . . # # # # # . .
. . . # . . . . . . # # # # # .
. . . . . # . . . . # # # # . .
la source
Réponses:
Pyth ,
8271 octetsEssayez-le en ligne!
Explication
Soit A le point avec la coordonnée y la plus basse et B le point avec la coordonnée y la plus élevée.
Soit C le point le plus bas (valeur x moins la valeur y) et D le point le plus haut.
Soit E le point le plus bas (valeur x plus valeur y) et F le point le plus élevé.
Ensuite, cela revient à trouver les coordonnées dont la coordonnée y est entre A et B, la valeur x moins la valeur y est entre C et D, et la valeur x plus la valeur y est entre E et F.
la source
Haskell,
256 254243 octetsMerci @Damien pour le golf
f
!L'entrée est considérée comme une liste de liste de caractères, la sortie est fournie de la même manière.
Donc c'était une bête à écrire. Il est basé sur l'idée de LeakyNun en utilisant un filtrage basé sur maximum et minimum sur les coordonnées des éléments.
Je suis vraiment surpris par le fait que cela
m=map
économise des octets car cela semble si coûteux.Explication:
Voici une version légèrement moins boucherie (accent sur légèrement ):
f
est une fonction qui attribue à chaque caractère un index(y-index, x-index)
tout en préservant la structure d'origine de la liste.b
: Étant donné un élément de la liste indexée,b
calcule[y-index, y - x, y + x]
.p
: Étant donné le champ indexé, retournez 3 fonctionsInt -> Bool
, dont la première est la vérification de l'indice y, la seconde de la différence et la troisième de la somme.min(snd e)
prend soin des espaces (un espace est plus petit que les deux). Cette fonction est intégrée dans le code du golf.q
étant donné le champ indexé, changer tout le nécessaire.
pour#
en vérifiant si ce retour sur le terrain spécifiqueTrue
à chaque fonction de test.La solution finale est alors la composition de
q
etf
.la source
f=z(\y->z((,).(,)y)[0..])[0..]
h x=z x[0..]
f=h$h.curry(,)
Python 3,
380378348346 octetsNotez que le retrait est avec des tabulations, pas des espaces.
Version golfée:
Testez-le sur Ideone
Explication (pour la version non golfée ci-dessous):
Tout le traitement est effectué sans aucune conversion, les caractères d'espace sont simplement ignorés.
La fonction
axes_pos
calcule 3-tuple de coordonnées "3D" imaginaires, elles sont accumulées en (élément par élément) minimum et maximum 3-tuples (bmin
,bmax
) pour tous les#
caractères.Les coordonnées sont calculées en
def axes_pos(x, y): return y, x + y, lc - y + x
;où X compte de 0 à droite et Y compte de 0 à bas (de la première ligne à la dernière).
La première coordonnée imaginaire est essentiellement Y, car il est évident pourquoi. Sa hache est orthogonale aux limites vertes (dans les images de l'OP). La
seconde est orthogonale aux limites rouges et la troisième est orthogonale aux limites bleues.
Dans la deuxième passe, le remplacement est effectué pour tous les
.
caractères dans lesquels les coordonnées "3D" entrent dans la plagebmin
..bmax
élément par élément - ceci est vérifié dans cette expressionall(bmin[j] <= p[j] <= bmax[j] for j in range(0, 3))
.Version non golfée avec tests, également sur Ideone :
Mise à jour 1:Supprimé inutile
Mise à jour 2,3:-1
pour la troisième coordonnée imaginaire, car cela ne change rienAméliorations partiellement mises en œuvre suggérées par le
Leaky Nun
mienla source
def A(x,y):return y,x+y,len(L)-1-y+x
->A=lambda x,y:(y,x+y,len(L)-1-y+x)
len(L)-y+x
devenirx-y
Gelée ,
4535 134241 octetsCeci est une liste de liens; le dernier doit être appelé sur l'entrée pour produire la sortie.
Les E / S se présentent sous la forme de tableaux de chaînes, où
.
indique vide et@
indique rempli.Essayez-le en ligne! ou vérifiez tous les cas de test .
Contexte
Prenons l'exemple suivant.
En dessinant une paire ou des lignes parallèles - la paire la plus proche qui englobe toutes les positions remplies - dans chacune des trois directions, nous pouvons déterminer le cadre de délimitation hexagonal.
Dans l'implémentation, nous remplaçons tous les caractères entre ces deux lignes par
@
, et tout en dehors de ces lignes par.
, à l'exception possible des diagonales qui ne contiennent que des espaces).Pour l'axe horizontal, cela donne
pour l'axe diagonal descendant, il donne
et pour l'axe diagonal en élévation, il donne
En prenant le minimum en caractères des trois, puisque
.
<@
, nous obtenonsIl ne reste plus qu'à restaurer les espaces.
Comment ça marche
la source
Python,
237230 octets7 octets grâce à Dennis.
Port de ma réponse en Pyth .
Prend un tableau de lignes en entrée, génère un tableau 2D de caractères.
la source
Perl,
128126 octetsComprend +6 pour
-0F\n
Exécuter avec entrée sur STDIN. Utilisez
1
pour rempli,0
pour vide. Il n'est pas nécessaire de remplir les lignes avec des espaces à la fin:hexafill.pl
Utilise les coordonnées du cube. Déterminez le maximum et le minimum pendant la
$= == 1
boucle et remplissez les coordonnées entre ces limites pendant la$= == 0
boucle. Les 58 premières boucles sont inutiles et ne sont là que pour remplir$-
le nombre de lignesla source
TSQL, 768 octets
J'ai écrit une requête pour résoudre ce problème - ce que j'ai trouvé assez difficile. Il n'est pas en mesure de rivaliser avec toutes les excellentes réponses plus courtes. Mais je voulais quand même le poster pour les personnes intéressées. Désolé pour la longueur de la réponse - en espérant que codegolf concerne également différentes approches.
Golfé:
Non golfé:
Violon non golfé
la source
GNU Octave,
212, 196 octetsPeut-être pas vraiment la langue préférée des golfeurs, mais c'est ce qui fait le défi, n'est-ce pas? En supposant que m est considéré comme une matrice de caractères: 178 octets autonomes et 196 s'ils sont insérés dans une fonction .
golfé:
non golfé:
Explication : nous construisons un système de coordonnées, 3 axes - orthogonal aux côtés des hexagones, trouvons max et min de chaque coordonnée, puis construisons un masque logique commençant par 1 partout et logiquement et: ing chaque coordonnée max et min contrainte, enfin réinitialisant chaque position "vraie" restante au caractère "#".
Si vous voulez le tester, vous pouvez simplement créer une matrice m comme ceci:
puis appelez f (m) et comparez avec m en construisant une matrice avec les deux dans:
la source
m
et la sortie stockéek
. Les réponses doivent toujours être des programmes complets ou des fonctions appelables.