Le jeu vidéo Minecraft consiste à placer et à supprimer différents types de blocs dans le réseau d’entiers 3D qui constitue le monde virtuel. Chaque point du réseau peut contenir exactement un bloc ou être vide (un bloc " air " officiellement). Dans ce défi, nous ne nous intéresserons qu’à un seul plan vertical 2D du monde 3D et à un type de bloc: l’ obsidienne .
Lorsque l'obsidienne forme le contour d'un rectangle vide dans un plan vertical, un portail vers le bas peut être créé. Le rectangle vide peut avoir toute taille allant de 2 unités de largeur sur 3 unités de hauteur à 22 unités de largeur sur 22 unités de hauteur. Les coins du rectangle n'ont pas besoin d'être délimités en obsidienne, mais uniquement les côtés.
Supposons, par exemple, qu’il s’agisse d’une X
obsidienne et d’un .
vide: (Les chiffres ne servent qu’à des fins d’identification et sont également vides.)
...................................
..XXXX....XXXX....XXXXXXXXX........
..X..X...X....X..X.........X..XXXX.
..X.1X...X.2..X..X...3...X.X..X....
..X..X...X....XXXX.........X..X.6X.
..XXXX....XXXX...XXXXXXXXXXX..X..X.
.............X.4.X....X.5.X...XXXX.
.............X...X....X...X........
..............XXX......XXX.........
...................................
Cette grille contient 3 portails valides:
- Le portail 1 est composé de 2 unités sur 3, totalement vide et entouré d'obsidienne. Donc c'est valide.
- Le portail 2 est 4 par 3, totalement vide et bordé d'obsidienne. Donc c'est valide.
- Portal 3 n'est pas totalement vide. Donc c'est invalide.
- Le portail 4 est 3 par 3, totalement vide et bordé d'obsidienne. Donc c'est valide.
- Le portail 5 correspond à 3 unités sur 2, ce qui est trop petit. Donc c'est invalide.
- Le portail 6 manque une partie de la frontière. Donc c'est invalide.
Défi
Ecrivez un programme ou une fonction qui prend en charge ces représentations sous forme de chaînes de grilles d'obsidienne et de vide, et affiche ou renvoie le nombre de portails nether valides présents.
- L'entrée peut être à partir de stdin ou d'un argument de fichier ou de fonction.
Vous pouvez supposer que la saisie est toujours bien formée - c'est-à-dire une grille de texte parfaitement rectangulaire, d'au moins 1 caractère de large et de hauteur, contenant uniquement les caractères
X
et.
. Vous pouvez éventuellement supposer qu'il y a une fin de ligne après la dernière ligne.Si vous le souhaitez, vous pouvez utiliser deux caractères ASCII imprimables distincts à la place de
X
et.
.L'obsidienne peut être sur les bords de la grille. Tout ce qui se trouve au-delà des frontières est considéré comme vide.
Exemple d'entrée - la sortie devrait être 4
:
................................................................
...................................XXXXXXXXXXXXXXXXXXXXXXXXX....
..XXXX....XXXX....XXXXXXXXX........X.......................X....
..X..X...X....X..X.........X..XXXX.X.......................X....
..X..X...X....X..X.......X.X..X....X.......................X....
..X..X...X....XXXX.........X..X..X..XXXXXXXXXXXXXXXXXXXXXXXX....
..XXXX....XXXX...XXXXXXXXXXX..X..X.X......................X..XXX
.............X...X....X...X...XXXX.X......................X..X..
.............X...X....X...X........X......................X..X..
..............XXX......XXX........XXXXXXXXXXXXXXXXXXXXXXXX...X..
..................................XX.........................XXX
Notation
La soumission avec le moins d'octets gagne.
Réponses:
Perl, 81
86Utilisation de plusieurs expressions rationnelles.
L'expression rationnelle pour une largeur spécifique d'un portail est beaucoup plus simple qu'un générique:
X{$m}..{$n}(X\.{$m}X.{$n}){3,22}.X{$m}
oùm
est la largeur du portail etn
esttotal width - 1 - m
. L'expression rationnelle doit être placée dans une assertion avant de largeur nulle,(?=...)
car les correspondances peuvent se chevaucher. Ensuite, j'itère 21 fois sur ce paramètre d'expression régulière$n
et$.
."@-"
évalue la position de départ de la dernière correspondance (/.\n/
) qui correspond à la largeur totale - 1.$.
est utilisée comme autre variable comme elle est initialisée1
avec-p0
.la source
.
pour les cellules vides (vous n'avez donc pas à y échapper).Regex (saveur NET),
182181145132126114104100989796 octetsReconnaissance de motifs artistiques en ASCII 2D? Cela ressemble à un travail pour regex! (Ce n'est pas le cas.)
Je sais que cela va lancer à nouveau des discussions sans fin sur le point de savoir si les soumissions de regex sont des programmes valides ou non, mais je doute que cela vaincra de toute façon APL ou CJam, donc je ne vois pas de mal à le faire. (Cela étant dit, ils font passer notre test die-hard pour « Qu'est - ce qu'un langage de programmation? » .)
Cela prend input comme chaîne à faire correspondre et le résultat est le nombre de correspondances trouvées. Il utilise
_
à la place de.
, car je devrais échapper à ce dernier. Cela nécessite également un retour à la ligne.Vous pouvez le tester en direct sur RegexHero ou RegexStorm ). Les matchs seront les premières rangées d'obsidienne des portails. Si vous pouvez trouver un cas de test où il échoue, s'il vous plaît faites le moi savoir!
Quelle est cette sorcellerie?
L'explication suivante suppose une compréhension de base des groupes d'équilibrage .NET . L'essentiel est que les captures sont des piles dans les expressions rationnelles .NET - chaque nouvelle capture portant le même nom est insérée dans la pile, mais il existe également une syntaxe pour extraire à nouveau les captures de ces piles, ainsi que la syntaxe pour extraire des captures d'une pile et des captures sur un autre en même temps. Pour une image plus complète, vous pouvez consulter ma réponse à Stack Overflow, qui devrait couvrir tous les détails.
L'idée de base est de faire correspondre un modèle tel que:
Où
n
est entre 2 et 22 (inclus). La difficulté est de faire en sorte que tous lesn
s et tous lesm
s soient les mêmes. Étant donné que les caractères réels ne seront pas les mêmes, nous ne pouvons pas utiliser simplement une référence arrière.Notez que la regex doit incorporer des nouvelles lignes, que j'écrirai comme ci
\n
-dessous.C #, 185 octets
Voici une fonction complète C #, juste pour en faire une entrée valide. Il est temps que j'écrive un "interprète" en ligne de commande pour les expressions régulières .NET ...
la source
^
(ou tout caractère non utilisé) pour(?!)
.Python, 219 octets
Mieux que Java, mais les quintuples boucles imbriquées font mal. Le
for/in
peut être légèrement compressible en utilisant la%s
substitution, mais cela ne fera pas économiser beaucoup.Étendu:
la source
Java, 304 octets
C'est beaucoup plus long qu'une expression régulière. Il itère simplement sur tous les carrés possibles de l'entrée. S'il s'agit d'un portail valide, un compteur est incrémenté de 1. Il renvoie ensuite le compteur. Cela peut probablement être joué beaucoup plus loin. Toutes les suggestions sont les bienvenues.
Dentelé:
Programme complet:
la source