body{font-family:'Helvetica Neue',Arial,sans-serif;color:#444;font-size:13px;width:500px;line-height:1.3}h3{font-size:16px!important;line-height:1.2em!important;margin-bottom:1.2em}code{white-space:pre-wrap;padding:1px 5px;font-family:'Droid Sans Mono',Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;color:#222;background:#eee}p code{padding:1px 5px}pre{overflow:auto;width:auto;width:480px !ie7;max-height:600px;font-family:'Droid Sans Mono',Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;margin-bottom:10px;padding:5px;background:#eee;border-left:2px dotted #ccc;font-size:12px}pre code{white-space:inherit;padding:0;background:0 0}
<h3>Problem 1 - Finding Chessboards</h3><p>Match any rectangular subregion, at least 3 columns wide and 3 rows tall, which consists of alternating <code>#</code> and <code>_</code>. The top left corner may be either of those two characters.</p><p><strong>Match</strong></p><pre><code>~______~ ~##_#_#~ ~#_#_##~ ~##_#_#~ ~______~ </code></pre><p>(There's an alternating 4x3 region in the centre. The match could be either that or either of its two 3x3 subregions.)</p><p><strong>No match</strong></p><pre><code>#_## _#_# __#_ #_#_ #_#_ </code></pre><p>(Contains two 3x2 regions, but no alternating 3x3 region.)</p><h3>Problem 2 - Verifying Chessboards</h3><p>Match the entire input, provided all of it consists of alternating <code>#</code> and <code>_</code>. It may start with either of those two characters.</p><p><strong>Match</strong></p><pre><code>_#_#_#_# #_#_#_#_ _#_#_#_# </code></pre><p><strong>No match</strong></p><pre><code>_#_#_#__ __#_#_#_ _#_#_#__ </code></pre><h3>Problem 3 - Detect a Rectangle of Digits</h3><p>Match a rectangle (at least 2x2) consisting only of digits and no other characters.</p><p><strong>Match</strong></p><pre><code>hbrewvgr 18774gwe 84502vgv 19844f22 crfegc77 </code></pre><p>You should match either the 5 wide by 3 tall rectangle (or any subset thereof) or the 2 by 2 rectangle.</p><p><strong>No Match</strong></p><pre><code>uv88wn000 vgr88vg0w v888wrvg7 vvg88wv77 </code></pre><p>There are no rectangles of digits.</p><h3>Problem 4 - Finding a Word in a Word Search</h3><p>Match the smallest rectangular region containing containing the word "GOLF" in any orientation (horizontal, vertical, diagonal, forwards or backwards). If your language supports non-rectangular matches, you may also match diagonal words without the surrounding rectangle.</p><p><strong>Match</strong></p><pre><code>INOWCEF IFWNOPH VULUHGY GUYOIGI YTFUGYG FTGYIOO </code></pre><p>"GOLF" is found backwards along an upper-left to bottom-right diagonal. This is the region containing it:</p><pre><code>FWNO ULUH UYOI TFUG </code></pre><p><strong>No Match</strong></p><pre><code>BHTGIVUHSR BWEVYWHBWB BHTWBYTWYB </code></pre><p>("GOLF" cannot be found anywhere.)</p><h3>Problem 5 - Detect Square Inputs</h3><p>Match the entire input if it is a square block of characters.</p><p><strong>Match</strong></p><pre><code>qwerty asdfgh zx vbn uiop[] `1234 67890- </code></pre><p>There are six lines, each of which contains six characters, even though two characters are spaces.</p><p><strong>No Match</strong></p><pre><code> hello world </code></pre><p>The two lines don't each contain two characters.</p><h3>Problem 6 - Find Gliders in a Game of Life</h3><p>In Conway's <a href=http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life rel=nofollow>Game of Life</a> one of the most popular and simple patterns is the <a href=http://www.conwaylife.com/wiki/Glider rel=nofollow>glider</a>. There are two different stages in a glider's life cycle:</p><pre><code>## ## # # and ## # # </code></pre><p>Of course, the Game of Life is invariant under rotation and reflection, so in total there are 16 different shapes which resemble a glider at some stage.</p><p>Given input consisting only of <code>#</code> and spaces, match a 3x3 block containing a glider in any orientation. Spaces are significant! (Due to the conditions in the surrounding 5x5 layer, these matches might not be actual gliders, but don't worry about that.)</p><p><strong>Match</strong></p><pre><code>## # # ## # # # # # ## ### # # # # </code></pre><p>This contains three gliders - top right corner, bottom right corner and left centre.</p><p><strong>No match</strong></p><pre><code>## # # ### ## # # # # ## ### </code></pre><h3>Problem 7 - Match Nether Portals</h3><p>Based on <a href=http://codegolf.stackexchange.com/questions/45488/nether-portal-detection>this challenge</a> by Calvin's Hobbies.</p><p>In the game of Minecraft, players can construct inter-dimensional portals using blocks of obsidian arranged into a rectangular frame. Given a 2D slice of the world, match a Nether portal. A valid Nether portal is a rectangle of empty space (<code>.</code>) surrounded on all sides by obsidian (<code>X</code>). The rectangle of space can be from 2 wide by 3 tall to 22 wide by 22 tall. Corners don't matter.</p><p><strong>Match</strong></p><pre><code>....X...... .XXXXXX.XX. ...X...X... .X.X...XXX. ...X...X.X. .XXX...X.X. X..XXXXX.X. </code></pre><p>This is a 3 wide by 4 tall portal.</p><p><strong>No Match</strong></p><pre><code>XX..XXXX XX..X..X XX..X..X ..X.X..X .X..X.XX </code></pre><p>This is almost a 2 wide by 3 tall portal, but one obsidian block is missing from the bottom.</p><h3>Problem 8 - Minecraft Chest Placement</h3><p>Based on <a href=http://codegolf.stackexchange.com/q/45720/8478>this challenge</a> by Calvin's Hobbies.</p><p>For this problem, returning the position of the match might be more useful than returning the actual match. "Adjacent" refers only to neighbours in four orthogonal directions. You're given a grid of <code>.</code> (empty cell) and <code>C</code> (chest). Two adjacent chests are considered a "double chest". You should match valid positions for placing additional chests. An empty cell is valid as long as it not adjacent to a double chest or two normal chests. Taking the example from the linked challenge, if the input is</p><pre><code>.......C.. ...C..C... .........C .CC...CC.. .......... </code></pre><p>the pattern should match the cell marked by <code>*</code> in the following grid:</p><pre><code>******.C** ***C**C.** *..***..*C .CC.*.CC.* *..***..** </code></pre><h3>Problem 9 - Horizontal and Vertical Alignment</h3><p>Match a part of a column or row if it contains two or more <code>#</code> characters. As an extension, you could return the index of the column or row. If your language supports non-contiguous matches, match <em>only</em> the two <code>#</code>, not the row/column in between.</p><p><strong>Match</strong></p><pre><code>.,.,.,.#., ,.,#,.,.,. .,.,.,.,., ,.,.,.,.,. .,.#.,##., ,.,.,.,.,. </code></pre><p>There are 5 possible matches, three horizontal or two vertical. The horizontal matches are <code>#.,#</code>, <code>##</code>, and <code>#.,##</code>. The vertical matches are <code>#,.#</code> and <code>#.,.#</code>. The language can match any one or more of those.</p><p><strong>No Match</strong></p><pre><code>.,.#.,., ,.,.,.#. .,#,.,., ,.,.,.,# .#.,.,., ,.,.#.,. #,.,.,., ,.,.,#,. </code></pre><p>This is also a solution to the Eight Queens problem.</p><h3>Problem 10 - Collinear Points</h3><p>Match a set of three <code>#</code>s that are in a straight line, which can have any orientation, not necessarily horizontal or vertical (i.e. it could be diagonal are long knight's move steps). If your language supports non-contiguous matches, match <em>only</em> the three <code>#</code>, not the characters in between.</p><p><strong>Match</strong></p><pre><code>........ #..#..#. ...#.... #....... ...#.... </code></pre><p>There are three possible matches. They are: the second row, the fourth column, and a diagonal line across 7 columns and 3 rows.</p><p><strong>No Match</strong></p><pre><code>.#..# #..#. #.... ..#.# </code></pre><p>There are no collinear <code>#</code>s in this input.</p><h3>Problem 11 - Verify Prelude Syntax</h3><p><a href=http://esolangs.org/wiki/Prelude rel=nofollow>Prelude</a> is an esoteric language, which has very few, but unusual, restrictions on what constitutes a valid program. Any block of printable ASCII text is valid provided that:</p><ul><li>Every column of text contains at most one of <code>(</code> and <code>)</code>.</li><li>Ignoring their vertical position, the <code>(</code> and <code>)</code> are balanced. Each <code>(</code> and be paired with exactly one <code>)</code> to the right of it, and vice-versa.</li></ul><p>The pattern should match any valid Prelude program and fail to match invalid programs.</p><p><strong>Match</strong></p><pre><code>?1-(v #1)- 1 0v ^(# 0)(1+0)#)! (#) ^#1-(0 # </code></pre><p><strong>No match</strong></p><pre><code>#(#(##)##)##( )##(##(##)#)# </code></pre><p>For more examples, see <a href=http://codegolf.stackexchange.com/q/47239/8478>this challenge</a>.</p><h3>Problem 12 - Avoid the Letter Q</h3><p>Match any 4x4 square of characters that does not contain the letter <code>Q</code> or <code>q</code>.</p><p><strong>Match</strong></p><pre><code>bhtklkwt qlwQklqw vtvlwktv kQtwkvkl vtwlkvQk vnvevwvx </code></pre><p>There is one 4x4 square that does not contain any Qs. This is</p><pre><code>vlwk twkv wlkv vevw </code></pre><p><strong>No Match</strong></p><pre><code>zxvcmn xcvncn mnQxcv xcvmnx azvmne </code></pre><p>The single <code>Q</code> in the center prevents any matches from being formed.</p><h3>Problem 13 - Diamond Mining</h3><p>Locate a diamond in a field of characters. Diamonds are rotated squares formed by the characters <code>/\X</code>. Each corner of the diamond is formed by an <code>X</code>, and the corners are connected in lines formed by <code>\</code> or <code>/</code>, where each side is the same length. A diamond of size 0 has no <code>/\</code> sides. As an extension, you can return all of the diamonds in the field, return only the diamond's characters, and/or return the size of the diamond found.</p><p><strong>Match</strong></p><pre><code>...X......X.... ../.\..../.\... ./.X.\..X...X.. X.X.X.XX.\./.\. .\.X.//.\.X...X ..\./X...X.\./. .X.X..\./...X.. X.X....X....... .X............. </code></pre><p>There are 6 different diamonds in this field. Two are size 0, three are size 1, and one is size 2. Notice how diamonds can overlap parts or nest. You should be able to match diamonds of any size up to a reasonably high limit.</p><p><strong>No Match</strong></p><pre><code>.X......./.... .\....X....... ...X.\.\...X.. ..X.\...\.X.\. ...X.X...X.\.X ../X\...\...X. .X...\.\..X... ..\./.X....X.. ...X..../..... </code></pre><p>No diamonds are found here.</p><h3>Problem 14 - Matching Crosses</h3><p>We'll define a cross as a rectangular region, which has been sliced into a (not necessarily regular) grid of 3x3 subregions. The four corner regions are filled with <code>.</code> whereas the other five regions are filled with <code>#</code>.</p><p><strong>Match</strong></p><pre><code>....... .###... ######. ######. .###... .###... .###.#. ....### .....#. </code></pre><p>There is the small cross in the lower right corner, and the large cross yields 5 potential matches: the top and left arms will always have length 1, but the right and bottom arms can each either have length 1 or 2 - in addition the bottom arm can have length 3 if the right arm has length 1. Note that the full large cross cannot be matched because the top of the small cross would protrude into the lower right region.</p><p><strong>No Match</strong></p><pre><code>.######. ...##... ...##... ........ </code></pre><p>Each arm must have length of at least 1.</p><h3>Problem 15 - Match a Word in a Boggle Board</h3><p><a href=http://en.wikipedia.org/wiki/Boggle rel=nofollow>Boggle</a> is a bit like a word search, except that you change direction after each letter. Given a block of text, if it contains the word <code>panama</code> (<em>case-insensitive!</em>) according to the Boggle rules, match the smallest rectangle containing it. You may decide whether single letters can be reused or not. If your language can handle both, show it off! If you allow letters to be reused you can also choose if a letter can be used twice in a row (i.e. whether staying on the same cell is a valid move). If your language supports non-rectangular matches, match <em>only</em> the word.</p><p><strong>Match without reusing letters</strong></p><pre><code>EmYPhNuy AaaKVsjL onlGviCw DdOgFrRn ISeHZmqc zMUkBGJQ </code></pre><p>(There's a snaking <code>panamA</code> or <code>panAma</code> towards the upper left corner, depending on the order it's matched in.)</p><p><strong>Match with reusing letters</strong></p><pre><code>ExYPhNuy AfEKVsjL oblGviCw DdOgArRn ISepnmqc zMUkBGJQ </code></pre><p>(There's a <code>pAnAmA</code> towards the lower right corner, where all three <code>A</code> are the same.)</p><p><strong>No Match</strong></p><pre><code>BpbrzTHY mAJVRLuF jyXSPknK hoeGcsEl QCZagNMI dvUOqixt </code></pre><h3>Problem 16 - Wrap around the Edges</h3><p>Match a rectangle of <code>#</code>, at 3x3 in size, which may wrap around the edges of the input.</p><p><strong>Match</strong></p><pre><code>#..## #..## ..... #..## </code></pre><p>(The 9 <code>#</code> form exactly one 3x3 region if you consider the edges to be adjacent.)</p><p><strong>No Match</strong></p><pre><code>...## #..## #..## #..#. </code></pre>
Réponses:
SnakeEx
Résout 15/16 problèmes jusqu'à présent!
Interprète en ligne ! - Spéc. De langage complet - Source Javascript
L'idée derrière ce langage est de définir des "serpents" qui se déplacent dans le texte en vérifiant les caractères en utilisant une syntaxe de type regex.
Un programme dans SnakeEx consiste en une liste de définitions pour les serpents utilisant différentes séquences de commandes. Les serpents peuvent engendrer d'autres serpents à l'aide de ces définitions. C’est là que SnakeEx tire le meilleur parti de sa puissance: nous pouvons faire correspondre les structures de branchement et même faire de la récursion (voir l’exemple de Paren Matching).
Chaque programme ressemblera essentiellement à un ensemble de regex, mais avec l’ajout de commandes de direction de la forme
<dir>
qui changent la direction du serpent et d’ appeler des commandes de la forme{label<dir>params}
qui engendrent plus de serpents.Pour un point d'entrée, l'interprète génère un serpent en utilisant la première définition, en se déplaçant vers la droite.
Ce n'est pas très concis, mais c'est très puissant et (je pense) assez lisible.
Mises à jour
<!>
pour résoudre colinéaire%{min,max}
Solutions
15 résolus, 1 en cours
Vous pouvez facilement essayer ces programmes en utilisant l’interprète en ligne (lien ci-dessus)!
Problème 1 - Trouver des échiquiers
Pour une introduction détaillée, commencez par le problème 3.
Problème 2 - Vérification des échiquiers
Mettre fin aux livres avec les symboles hors limites
$
est un moyen de faire en sorte qu'un programme ne corresponde qu'à la totalité de l'entrée.Problème 3 - Détecter un rectangle de chiffres
Le
m
serpent se déplace vers la droite, apparaissant à au moins 2 serpents (%{2,}
une fermeture signifie "2 à l'infini") en utilisant la définition c (c
) et en se déplaçant vers la droite (<R>
), ou plutôt vers le bas dans ce cas, car toutes les directions sont relatives au serpent actuel. LeA
paramètre est un sucre qui spécifie simplement que le serpent en train de se reproduire doit se déplacer après l'appel. Le1
paramètre indique comment nous limitons les correspondances aux rectangles - les paramètres numériques placent les serpents dans des "groupes". Une correspondance ne compte pas à moins que tous les serpents du même groupe parcourent exactement la même distance.Problème 4 - Trouver un mot dans une recherche par mot
La commande direction
<*>
spécifie que le serpent doit tourner dans n'importe quelle direction diagonale ou orthogonale. Ensuite, il cherche la regex simple.Problème 5 - Détecter les entrées carrées
La clé ici est le caractère spécial
$
, qui ne correspond que si le serpent est hors limites. Nous engendrons un serpent horizontal et un vertical; chacun de ceux-ci engendre plus de serpents lorsqu'il court le long du bord, et tous ceux-ci appartiennent au même groupe et doivent avoir la même longueur.Problème 6 - Trouver des planeurs dans un jeu de la vie
m
commence dans l’une des quatre directions orthogonales (<+>
), en effectuant la rotation. Ensuite, les trois rangées apparaissent dans l’ordre, ce qui permet de réfléchir.(Notez que j'ai remplacé les espaces par des points uniquement parce que les zones de texte HTML utilisées dans mon interprète semblent faire des choses stupides si elles ont plusieurs espaces consécutifs)
Problème 7 - Faire correspondre les portails du Nether
Le
m
serpent se déplace à droite, engendrant un serpent pour vérifier le bord gauche, 2 à 22 serpents pour vérifier les colonnes du milieu et enfin un serpent pour vérifier le bord droit. L'~
opérateur indique que ce qui suit doit être vérifié mais ne doit pas être marqué comme faisant partie de la solution.Les fermetures délimitées nous permettent maintenant de résoudre pleinement et correctement ce problème!
Problème 8 - Placement de la poitrine dans Minecraft
Ici, nous utilisons une logique not (
!
), qui correspond si et seulement si le jeton suivant ne correspond à rien. La déclarationd
détecte un double coffre dans une direction particulière.!{d<+>}
Assurez-vous qu'il n'y a pas de double coffre dans une direction orthogonale.s
déplace un petit diamant autour du carré actuel, en vérifiant qu'au moins 3 de ces espaces sont vides ou non. La fin\.
correspond finalement au carré, en supposant que toutes les conditions précédentes soient remplies.Problème 9 - Alignement horizontal et vertical
Le serpent
m
tourne éventuellement à droite (<R>?
) avant de faire correspondre la séquence..
est un caractère générique, comme dans regex.Problème 10 - Points colinéaires
Avec l'ajout de la
<!>
direction, nous pouvons résoudre ce problème maintenant!<!>
est comme<+>
mais au lieu de se ramifier dans quatre directions, il se ramifie dans toutes les directions possibles.Problème 12 - Évitez la lettre Q
Il crée juste 4 serpents qui recherchent chacun quatre personnages qui ne sont pas la lettre Q.
Problème 13 - Extraction de diamants
Celui-ci est plutôt chouette.
m
engendre deux serpents, l'un à l'arrière droit et l'autre à l'avant droit. Chacune de celles-ci suit les barres obliques jusqu'à un X, puis engendre un autre serpent perpendiculaire à sa direction actuelle, qui suit les barres obliques jusqu'au X inférieur.Problème 14 - Croix correspondante
Voici la première fois que
P
j'utilise le paramètre iggyback. Normalement, les serpents sont indépendants, mais si vous appelez avec ce paramètre, le serpent appelant sera déplacé avec l'appelé. Donc,e2
on peut vérifier une séquence de '.', Puis une séquence de '#', puis une autre séquence de '.', Et les faire tous être des appels séparés afin que nous puissions les regrouper avec '1,' 2 'et' 3 ' , forçant leurs longueurs à correspondre.Problème 15 - Correspondre à un mot dans un tableau de Boggle
Simple, si verbeux.
I
paramètre spécifie la non-sensibilité à la casse (nous pouvons spécifier des paramètres sur les définitions ainsi que dans les appels). Le serpent tourne dans n'importe quelle direction, correspond au personnage, se tourne à nouveau, etc.Ceci est la version sans caractères de réutilisation. Le
E
paramètre xclusive interdit au serpent de faire correspondre tout caractère déjà marqué, un peu comme les traces de slime de feersum.Problème 16 - Enrouler les bords
Ce
W
paramètre permet au serpent de s’enrouler quand il est hors limites. Nous avons égalementH
etV
pour permettre uniquement l'emballage horizontal ou vertical.Extra - Solutionneur de labyrinthe
Résout un labyrinthe ASCII dont le sol est piétonnier. La
<P>
direction signifie en avant, à gauche ou à droite (sucre pour[<F><L><R>]
).Extra - Paren Matching
Vous ne savez pas encore comment utiliser Prelude, mais voici un premier pas! Ici, j'utilise le
r
serpent de manière récursive pour faire correspondre les parenthèses correspondantes en vérifiant qu'il n'y a pas de parenthèses sans correspondance entre elles.Topologie Extra - ASCII: Comptage de boucles
la source
m:{a<>}
a:[({n<R>A})({n<R>A}*{l<R>A}{a<>P}{r<R>A})]*{n<R>A}*
l:$[^\(\)]*\([^\(\)]*$
r:$[^\(\)]*\)[^\(\)]*$
n:$[^\(\)]+$
Slip, Python 3.4 ( wiki Github , interpréteur en ligne )
Comme la soumission de Feersum, ceci est également basé sur la traversée de la grille, mais comme la soumission de CarpetPython, cela est basé sur la regex. On dirait que j’ai réussi à prendre une position intermédiaire.
Je souhaite ajouter un grand nombre de fonctionnalités non implémentées. C'est pourquoi, le cas échéant, j'ai noté ce que j'avais l'intention de faire lorsque le temps me le permettrait.
Mises à jour
(Voir la page Github pour les nouvelles détaillées)
5 avril 2015 : Slip a maintenant un interprète en ligne ! Il en est encore à ses débuts, il pourrait donc y avoir quelques bugs.
5 avril 2015 : Mise à jour de l'efficacité! Maintenant, les portails inférieurs ont une grande entrée beaucoup plus rapide (2s). De plus, il y a eu un certain nombre de changements de syntaxe, alors assurez-vous de vérifier le wiki. La numérotation des groupes a également été corrigée.
Le glissement a un pointeur de correspondance qui commence à une case particulière et est initialement tourné vers la droite. Lorsqu'un caractère est mis en correspondance, le pointeur avance dans la direction actuelle (bien que l'implémentation ne fasse pas les choses exactement dans cet ordre).
La direction du pointeur de la correspondance peut être réglé à une direction particulière avec
^<digit>
, où^0
,^1
,^2
, ...,^7
régler le pointeur vers N, NE, E, ..., NW respectivement (en sens horaire).Les raccourcis suivants sont également disponibles:
^*
vérifie les 8 directions orthogonales ou diagonales,^+
vérifie les 4 directions orthogonales.(Plan futur: autoriser la définition de directions arbitraires, par exemple
(1, 2)
pour le déplacement d'un chevalier)Par exemple ( Problème 4 - Trouver un mot dans une recherche par mot ),
essaie les 8 directions orthogonales ou diagonales, en recherchant le mot "GOLF". Par défaut, Slip essaie tous les carrés de départ possibles et renvoie un résultat pour chaque filtre, en filtrant les doublons.
ne renvoie que les lignes du haut et du bas comme correspondances (puisque la ligne du haut et la colonne de gauche "GOLF" partent du même carré). Pour obtenir toutes les correspondances, le
o
mode de correspondance qui se chevauche peut être utilisé.De même ( Problème 15 - Faire correspondre un mot dans un tableau Boggle ),
correspond
panama
en essayant une direction différente à chaque fois. Utilisez lei
drapeau pour l'insensibilité à la casse. Slip réutilise les caractères par défaut, mais cela peut être basculé avec ler
drapeau no-repeat.(Plan futur: un modificateur de mode de recherche qui vérifie automatiquement des ensembles d’orientations après chaque déplacement, évitant ainsi toute répétition
^*
inutile)La direction du pointeur de correspondance peut également être tournée de 90 degrés vers la gauche ou vers la droite avec
<
ou>
respectivement. Par exemple,cherche le motif
en regardant dans l'ordre suivant:
Cela nous permet de résoudre le problème 6 - Trouver des planeurs avec
où les parties 1 et 2 codent les formes du planeur et les parties 3 et 4 leurs codes réfléchis.
Notez que Slip utilise backtick
`
pour s'échapper. En effet, le glissement a une autre forme de mouvement qui donne son nom à la langue - la commande de glissement./
glisse le pointeur de correspondance orthogonalement à gauche, alors que\
le pointeur de correspondance orthogonale à droite.Par exemple,
peut être jumelé par
abc\def/ghi
.Bien que n'étant pas particulièrement utile en soi, le glissement devient plus important lorsqu'il est combiné avec le
(?| <regex> )
groupe stationnaire, qui agit comme un effet d'apparence identique. Les expressions rationnelles à l'intérieur sont mises en correspondance, puis à la fin, la position et la direction du pointeur de correspondance sont réinitialisées à l'état situé avant le groupe stationnaire.Par exemple,
peut être jumelé avec
(?|abc)\(?|def)\(?|ghi)
.De même, Problème 12 - Éviter la lettre Q peut être résolu avec
où
%
est une commande antidérapante pour empêcher le premier\
de s’activer.Slip a aussi une assertion de longueur
(?_(<group num>) <regex> )
, qui ne correspond à la regex à l'intérieur que si sa longueur de correspondance est la même longueur que celle du groupe donné.Par exemple, le problème 13 - L’exploitation de diamants peut être facilement résolu avec
qui tente de faire correspondre le premier côté gauche du diamant en premier, puis affirme que les trois autres côtés ont la même longueur.
(Run avec
v
flag pour une sortie prolixe)Une alternative golfier est
qui correspond deux fois au premier côté.
De nombreux autres problèmes peuvent être résolus en utilisant des groupes de glissement, stationnaires et des affirmations de longueur:
Problème 14 - Croix correspondante:
Une fois que vous avez capturé les largeurs
.
s et#
s de la première rangée, vous ne faites que glisser vers le bas.Sortie:
Celui-ci peut probablement être joué au golf avec un peu de récursion, une fois que j'ai corrigé quelques bugs.
Problème 3 - Détecter un rectangle de chiffres:
Faites correspondre une rangée supérieure de deux chiffres ou plus, puis assurez-vous que chaque ligne ci-dessous a la même longueur.
`d
est une classe de caractères prédéfinie équivalente à[0-9]
.Notez que cela trouve toutes les correspondances .
Problème 7 - Faites correspondre les portails inférieurs:
qui affiche, pour le premier exemple dans le thread d'origine :
Enfin, certaines autres fonctionnalités de Slip incluent:
$0, $1, $2, ..., $7
ancrez le bord nord, le coin nord-est, le bord est, etc.$+
ancrez n'importe quel bord et$*
ancrez n'importe quel coin.$
suivi d'un caractère minuscule définit une ancre à la position actuelle, qui peut être comparée ultérieurement à$
suivie du caractère majuscule correspondant, par exemple,$a
et$A
.#
bascule l'indicateur de non-déplacement, qui empêche le pointeur de correspondance d'avancer après le prochain match.,
correspond à un caractère comme.
, mais ne l'ajoute pas à la sortie, ce qui permet des correspondances non contiguës tout en pouvant être reconnu par(?_())
.... et plus. Il y en a vraiment trop à énumérer sur cette page.
D'autres problèmes
Problème 1 - Trouver des échiquiers:
Les deux problèmes d’échiquier ne sont certainement pas le point fort de Slip. Nous faisons correspondre la ligne du haut, puis nous assurons qu’elle fait au moins la longueur 3 et alterne entre
#
et_
, puis nous glissons et faisons correspondre les lignes suivantes. À la fin, l'$a
ancre devrait être en bas à droite de l'échiquier.Nous tournons ensuite à gauche et répétons pour les colonnes, en nous assurant que la correspondance est établie
$A
à la fin.Problème 2 - Vérification des échiquiers:
Comme pour le problème précédent, nous vérifions que chaque ligne est correcte, puis pivotons à gauche et faisons de même pour les colonnes. Les ancres sont utilisées pour s’assurer que seul le tableau entier est assorti.
Problème 9 - Alignement horizontal et vertical:
Nous appliquons les facultatifs? quantifier à la
>
commande de rotation afin que nous puissions faire correspondre soit vers le bas ou vers la droite. Nous trouvons tous les 5 dans l'exemple avec leo
mode de chevauchement, mais seulement 4 sans#.,##
et depuis et#.,#
partons de la même position.Problème 10 - Points colinéaires
Faites correspondre
#
ensuite quelques caractères horizontaux et certains caractères verticaux, puis répétez jusqu'au deuxième#
et répétez jusqu'au troisième#
.Problème 5 - Détection des entrées carrées:
Ancrez le coin supérieur gauche et vérifiez que le bord supérieur a la même longueur que le bord droit avant d’ancrer le coin inférieur droit. Si l'entrée réussit ceci, alors nous allons en arrière pour faire correspondre l'entrée entière.
Problème 8 - Placement de la poitrine de Minecraft:
Courez avec le
p
drapeau pour obtenir les positions de chaque match.$^
est une ancre qui correspond si le prochain mouvement mettrait le pointeur de correspondance en dehors des limites.Nous avons d' abord correspondre à un
.
, puis vérifier que nous sommes encerclés par trois.
s / limites, puis fait en sorte que la quatrième place environnante est également une.
/ limite ou est un coffre (en vérifiant ses places environnantes).Problème 11 - Vérifier la syntaxe Prelude :
J'ai pris quelques essais, mais je pense que c'est correct. Ici, nous utilisons la récursion, qui a la même syntaxe que PCRE.
Cette approche nécessite que l'entrée soit rectangulaire, mais une fois que j'ai obtenu une correspondance non rectangulaire, cette hypothèse ne sera plus nécessaire.
Voici la même approche, golfée avec plus de récursivité:
Problème 16 - Enrouler sur les bords:
(Remarque: le wrapping n'a pas encore été poussé vers l'interprète en ligne)
Cela nécessite le drapeau d'emballage
w
. Techniquement, l'initiale%
pour le non-glissement n'est pas nécessaire, mais le match compterait alors comme commençant à partir d'une case plus haute.Problème EX 1 - Solutionneur de labyrinthe:
Problème du commentaire de BMac dans le chat . Utilisez le
r
drapeau pour le mode sans répétition afin que le pointeur de correspondance ne reste pas bloqué dans les deux sens.Problème EX 2 - Reconnaissance faciale :
Notez que je ne fais que faire correspondre les visages sans faire de compensation. Notez que la question contient des symboles de l’euro, qui devront être remplacés par des ASCII imprimables pour fonctionner.
la source
PMA / Escargots (C ++)
J'envisage le langage comme des escargots se déplaçant autour d'une grille et exécutant des commandes. Les escargots laissent une traînée de boue sur chaque case sur laquelle ils se déplacent, ce qui rend par défaut la case inégalable. Une correspondance est réussie si la fin de la liste de commandes est atteinte.
Il y a suffisamment d'opérateurs maintenant que nous aurons besoin d'une liste de priorité pour les suivre. Les opérations sont résolues dans l'ordre suivant:
( ) [ ]
|
`
un groupe[m],[n]
etn
= !
L'interprète est écrit en C ++. Le code source abyssal peut être trouvé ici .
Problème 4: Recherche par mot
Le programme
est suffisant pour obtenir une valeur de vérité ou de falsey quant à savoir si le mot est trouvé.
z
(une des 15 commandes directionnelles absolues ou relatives) correspond dans n'importe quelle direction octilinéaire. Plusieurs ordres de direction consécutifs sont combinés ensemble. Par exemple, ceruldy
serait presque équivalent àz
, car ce sont les commandes pour droite, haut, gauche, bas et toute diagonale. Cependant, les instructions seraient testées dans un ordre différent. Le premier caractère correspondant est toujours celui sur lequel l'escargot commence, quelle que soit sa direction.\
<caractère> correspond à un seul caractère littéral.La stratégie par défaut consiste à essayer le motif à chaque carré dans la boîte englobante de l'entrée justifiée à gauche et à générer le nombre de correspondances. Si une valeur booléenne
1
ou0
est requise, le programme suivant peut être utilisé:S'il y a au moins une nouvelle ligne dans le fichier source, la première ligne est traitée comme une option pour la conversion initiale de l'entrée sous une forme rectangulaire. L'
?
option imprime 0 ou 1 selon qu'il existe une correspondance n'importe où.Problème 15: Boggle
Après la mise en œuvre de l'alternance, il est maintenant possible de résoudre Boggle. Il serait préférable d’utiliser la correspondance sans distinction de casse pour celle-ci, mais sa mise en œuvre n’est pas ma plus haute priorité.
|
fonctionne exactement comme une regex à 1 dimension. Il existe deux paires de délimiteurs correspondants pour le regroupement, à savoir()
et{}
. Un crochet de fermeture ferme tous les groupes ouverts du type opposé qui le séparent du plus proche du même type. Par exemple,{({{)
seul le groupe le plus à gauche reste ouvert. Comme vous pouvez le constater, des symboles de regroupement sans correspondance sur les bords sont implicitement fermés. Il y a une autre commande de regroupement dans`
laquelle je n'entrerai pas maintenant.Problème 8: Coffres Minecraft
Le programme imprime le nombre de placements valides de la poitrine. C'était la première fois que je devais jouer au golf et j'ai réduit mon nombre d'octets (17) à quelques reprises.
\.
correspond à un point littéralement, au point de départ du match.!(o\C)2
équivaut à!((o\C)2)
la quantification est une priorité plus élevée que l'assertion.<atom> <number>
signifie répéter<atom>
exactement les<number>
temps.o
tourne l'escargot dans n'importe quelle direction orthogonale.!
est une affirmation négative. Ainsi, cette partie vérifie l'absence d'un double coffre adjacent.o
tourne dans une direction orthogonale.(!\Cw)3
affirme qu'il n'y a pasC
devant l'escargot, puis 3 fois dans le sens antihoraire.Problème 2: Vérification des échiquiers
L'
&
option définit la sortie du programme comme1
si la correspondance réussissait à toutes les positions et0
sinon.^c
correspond à un caractère qui n'est pasc
équivalent à[^c]
regex. Dans l’ensemble, le programme signifie: Print 1 Si à chaque position dans le rectangle de délimitation de l’entrée, il existe soit un#
qui n’est pas orthogonalement adjacent à un caractère qui ne l’est pas_
, soit un_
qui n’est pas orthogonalement adjacent à un caractère qui est non#
; sinon 0.la source
La classe Re2d, Python 2
Mise à jour: ajout du problème "9. Alignement".
Mon approche consiste à utiliser le module Python re pour effectuer la recherche et la correspondance. La classe Re2d prépare le texte pour le traitement, exécute les fonctions et formate les résultats pour la sortie.
Notez qu'il ne s'agit pas d'un tout nouveau langage: il s'agit du langage d'expression régulière standard projeté en 2 dimensions avec des indicateurs supplémentaires pour les modes 2D supplémentaires.
La classe a les usages suivants:
Les deux modèles sont des modèles RE de texte linéaire standard. Si aucun motif vertical n'est fourni, la classe utilisera également le motif horizontal pour la correspondance verticale. Les drapeaux sont les drapeaux RE standard avec certaines extensions 2D.
Essai
La méthode de recherche a trouvé un motif d’échiquier et renvoie une position de 4 tuple. Le tuple a la
x,y
position du premier caractère de la correspondance etwidth, height
la zone correspondante. Un seul motif est donné, il sera donc utilisé pour la correspondance horizontale et verticale.L'échiquier a été vérifié avec la méthode de correspondance qui renvoie un booléen. Notez que les caractères
^
et les caractères de$
début et de fin doivent obligatoirement correspondre au texte entier .Nous utilisons maintenant le
MULTIFIND
drapeau pour renvoyer toutes les correspondances possibles pour le bloc de 2 chiffres ou plus. La méthode trouve 9 correspondances possibles. Notez qu'ils peuvent se chevaucher.Ce test montre l'utilisation du retournement vertical et horizontal. Cela permet de faire correspondre les mots inversés. Les mots en diagonale ne sont pas supportés. Le
MULTIFIND
drapeau permet plusieurs correspondances qui se chevauchent dans les 4 directions. La méthode findall utilise la recherche pour trouver les cases correspondantes, puis extrait les blocs de texte correspondants. Notez que la recherche utilise la largeur et / ou la hauteur négatives pour les correspondances dans le sens inverse. Les mots dans la direction verticale ont des caractères de nouvelle ligne - ceci est cohérent avec le concept de blocs de caractères 2D.Cette recherche nécessitait des modèles distincts pour chaque dimension, la taille minimale étant différente pour chacune.
Cet ensemble de 2 recherches trouve 2 correspondances verticales et 2 correspondances horizontales, mais ne peut pas trouver la
#.,#
chaîne incorporée .Ici, nous utilisons 2 recherches pour trouver des correspondances dans les deux sens. Il est capable de trouver plusieurs correspondances orthogonales mais cette approche ne prend pas en charge les correspondances en diagonale.
Cette recherche trouve la première correspondance.
Le problème des diamants est plus difficile. Trois objets de recherche sont nécessaires pour les trois tailles. Il peut trouver les six diamants dans le jeu d’essais, mais il n’est pas adapté aux diamants de taille variable. Ce n'est qu'une solution partielle au problème des diamants.
Code Python 2
la source
Grime , Haskell
introduction
Grime est basé sur les grammaires booléennes . L'idée de base est de construire des motifs rectangulaires à partir de composants plus petits et de vérifier s'ils se trouvent dans la matrice d'entrée. Jusqu'à présent, Grime ne prend en charge que les allumettes rectangulaires et résout au moins 11 problèmes avec plus ou moins d'élégance.
EDIT: Correction des croix (merci à DLosc d’avoir repéré le bogue), et ajout de l’exploitation de diamants.
EDIT2: Ajout des classes de caractères, inspirées de celles de Slip. Également modifié la syntaxe des indicateurs d'option, amélioré l'analyseur d'expression et ajouté le problème no-Q.
EDIT3: Implémentation des contraintes de taille et ajout du problème des portails Nether.
Usage
Un programme Grime est appelé une grammaire et l'extension de fichier correcte pour une grammaire est
.gr
, bien que cela ne soit pas appliqué. La grammaire est évaluée commeoù
matrixfile
est un fichier contenant la matrice de caractères. Par exemple, la grammaire des chiffres serait évaluée comme suit:Pour plus de rapidité, je vous recommande de compiler le fichier avec les optimisations suivantes:
Par défaut, l'interprète imprime la première correspondance trouvée, mais cela peut être contrôlé à l'aide de l'option flags:
-e
: correspond uniquement à la matrice entière, impression1
pour correspondance et0
pour aucune correspondance.-n
: affiche le nombre de correspondances, ou la matrice entière si-e
est également donné.-a
: imprimer toutes les correspondances.-p
: affiche également les positions des matchs, au format(x,y,w,h)
.-s
: ne pas imprimer les allumettes elles-mêmes.-d
: affiche les informations de débogage.Des options peuvent également être spécifiées dans la grammaire, en les insérant avant toute ligne et en ajoutant une virgule
,
(voir ci-dessous pour des exemples).Syntaxe et sémantique
Une grammaire Grime consiste en une ou plusieurs définitions , chacune sur une ligne distincte. Chacun d'entre eux définit la valeur d'un terminal , et l'un d'entre eux doit définir le terminal anonyme de niveau supérieur . La syntaxe d'une définition est
N=E
ouE
, oùN
est une lettre majuscule etE
une expression .Les expressions sont construites comme suit.
\
correspond à tout1x1
rectangle contenant ce caractère..
correspond à n'importe quel caractère unique.$
correspond à un1x1
rectangle en dehors de la matrice de caractères._
correspond à tout rectangle de largeur ou hauteur nulle.d
igit,u
ppercase,l
owercase,a
lphabetic, alphan
umeric ets
ymbol.[a-prt-w,d-gu]
. Les lettres de gauche sont incluses et celles de droite sont exclues. Cela correspond donc exactement aux lettresabchijklmnoprtvw
. Si le côté gauche est vide, il est supposé contenir tous les caractères. La virgule peut être omise si le côté droit est vide. Les personnages[],-\
doivent être échappés avec\
.P
etQ
sont des expressions, alorsPQ
n’est que leur concaténation horizontale etP/Q
leur concaténation verticale, avecP
en haut.P+
est un ou plusieursP
s alignés horizontalement, etP/+
est le même aligné verticalement.P|Q
,P&Q
etP!
.P?
est un raccourci pourP|_
,P*
pourP+|_
etP/*
pourP/+|_
.P#
correspond à tout rectangle contenant une correspondanceP
.P{a-b,c-d}
, Oùabcd
sont des entiers non négatifs, est une contrainte de taille surP
. SiP
est une classe de caractères, l'expression correspond à toutmxn
rectangle contenant uniquement ces caractères, à condition qu'ilm
soit compris entrea
etb
inclusif etn
entrec
etd
inclusif. Dans d'autres cas, l'expression correspond à tout rectangle ayant la taille correcte et quiP
correspond également. Sia
ouc
sont omis, ils sont pris pour être0
, et sib
oud
sont omis, ils sont infinis. Si le trait d'union entrea
etb
est omis, nous utilisons le même nombre pour les deux extrémités de l'intervalle. Si l'ensemblec-d
une partie est omise, les deux axes sont contraints. Pour clarifier,{-b}
équivaut à{0-b,0-b}
et{a-,c}
équivaut à{a-infinity,c-c}
.Remarques
Grime permet des définitions paradoxales comme
A=A!
avec un comportement indéfini. Cependant, ils ne provoqueront pas de crash ni de boucle infinie.Grime prend en charge les entrées non rectangulaires; les lignes sont simplement alignées à gauche et les espaces peuvent être appariés à l'aide de
$
.Dans le futur, j'aimerais implémenter ce qui suit:
.
ne peut correspondre qu'à des1x1
rectangles. Jusqu'à ce qu'il trouve une correspondance, il essaie tous les rectangles de toutes les tailles dans l'ordre, en échouant instantanément pour chacun d'eux.Les correspondances non rectangulaires utilisant des contextes , ce qui serait utile dans le cas du défi Boggle. Par exemple,
Pv(Q>R)
signifieP
avec contexte inférieur (Q
avec contexte droitR
). Il correspondrait aux motifs en forme de LLes tâches
Étant donné en gros par ordre de complexité.
Rectangle de chiffres
C'est simple: un rectangle de chiffres de taille au moins
2x2
.Non q ou Q
C'est presque aussi simple que le premier. nous avons maintenant une taille plus restreinte et une classe de caractères personnalisée.
Alignement horizontal et vertical
Maintenant, nous avons quelques caractères échappés. En gros, cela correspond à un
#
, puis à un nombre quelconque de caractères,#
horizontalement ou verticalement.Détecter les entrées carrées
Cette grammaire est très simple, elle définit en gros qu’un carré est soit un
1x1
rectangle, soit un carré plus petit avec une colonne fixée sur son bord droit et une rangée située au bas de celle-ci. Notez également l'e
option située avant le nonterminal toplevel, qui bascule la vérification de l'entrée entière.Trouver un mot dans une recherche par mot
Celui-ci est horrible, car Grime n'a pas d'opération de rotation ou de réflexion. Il est également extrêmement lent, car Grime ne sait pas que les allumettes ne peuvent être que de taille
4x1
,1x4
ou4x4
.Le problème de planeur pourrait être résolu de la même manière, mais je suis trop paresseux pour le noter.
Portails du Néant
Avec l'opérateur de restriction de taille, celui-ci n'est pas si difficile. La partie centrale
\.{2-22,3-22}
correspond à n’importe quel rectangle de.
la bonne taille, puis nous ajoutons simplement des colonnes deX
s des deux côtés et nous ajoutons des rangées deX
s avec des extrémités ignorées en haut et en bas de celle-ci.Croix correspondantes
Ce que nous avons ici est une conjonction (ET logique) de deux expressions. Le non-terminal
E
correspond à un rectangle non vide de.
s et àF
un rectangle non vide de#
s. Le côté gauche de la conjonction correspond aux rectangles du typeoù nous avons
EFE
sur le dessus, puisF
, puisEFE
encore. Le côté droit correspond à la transposition de ceux-ci, nous obtenons donc exactement les croix.Extraction de diamants
Le non terminal
C
est un raccourci pour n'importe quelle1xn
colonne. La moitié supérieure d'un diamant est assortieT
: c'est un seulX
ou un autreT
entouré d'une colonne des deux côtés et d'une rangée en/[something]\
dessous.B
correspond au bas d'un diamant de la même manière, et le niveau supérieur non terminal est juste rangé de la formeX[something]X
entre une moitié supérieure et une moitié inférieure.Trouver des échiquiers
Le côté droit
[#_]{3-}
correspond à tout3x3
rectangle ou plus de#
s et_
s, tandis que les garanties de gauche qu'il ne contient pas de deux adjacents#
s ou_
s.Vérification des échiquiers
Ceci est fondamentalement le même que ci-dessus, sauf que nous pouvons faire correspondre tout rectangle non vide, mais nous devons utiliser l'
e
indicateur pour la vérification complète de l'entrée.Vérifier la syntaxe de prélude
C'est probablement la grammaire la plus intéressante à ce jour. Le non-terminal
A
correspond à toute colonne ne contenant pas(
ou)
, etP
correspond soit à un certain nombre deA
s, soit à deux parenthèses correspondantes, entre et en dehors desquelles il y a plus deP
s.la source
\#(.*|./*)\#
travailler?#
à gauche, puis une ligne ou une colonne de n'importe quoi, puis un#
à droite". Je dois spécifier que les#
s sont concaténés verticalement à la colonne à l'aide des barres obliques/
.TMARL
Langage de reconnaissance et de correspondance des modèles
La description
Mon interprète utilise des caractères 24K (les extraits de code prennent des caractères? ). Vous trouverez la description complète ici .
La meilleure partie: l'interprète est en Javascript, ce qui signifie que vous pouvez l'essayer ici!
Afficher l'extrait de code
Et pour les problèmes:
# 1 - Trouver des échiquiers
&
ajoute des recherches. Le G2 à la fin obtient le 3ème élément d'un élément de correspondance, la correspondance réelle. Les 2 premiers éléments sont des coordonnées x et y (1 basé, pas 0).# 3 - Détecter un rectangle de chiffres
Je pense que celui-ci est assez simple.
# 4 - Trouver un mot dans une recherche par mot
L'
S
argument est même qu'il recherche toutes les rotations. Il est supérieur à 4 car il peut ensuite être ajouté à la recherche suivante (les correspondances individuelles ne peuvent pas être ajoutées).# 5 - Détecter les entrées carrées
Je ne sais pas si cela est complètement légal, car cela détermine uniquement la perpendicularité si l’entrée est un rectangle. Il compare la longueur de l'entrée
IL
à la longueur de la première ligneIG0L
et l'inverse.# 6 - Trouver des planeurs dans un jeu de la vie
Enfin, une utilisation pour miroir!
# 12 - Évitez la lettre Q
S1 car 1 seule correspondance est nécessaire.
Je ferai certaines des plus difficiles plus tard.
la source