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>
Antworten:
SnakeEx
Löst 15/16 Probleme bis jetzt!
Online-Dolmetscher ! - Vollständige Sprachspezifikation - Javascript-Quelle
Die Idee hinter dieser Sprache ist es, "Schlangen" zu definieren, die sich unter Verwendung einer regulären Syntax um die Textprüfzeichen bewegen.
Ein Programm in SnakeEx besteht aus einer Liste von Definitionen für Schlangen, die unterschiedliche Befehlsfolgen verwenden. Mit diesen Definitionen können Schlangen andere Schlangen erzeugen. SnakeEx kann hier seine Stärken voll ausschöpfen. Wir können Verzweigungsstrukturen abgleichen und sogar Rekursionen durchführen (siehe Beispiel für Paren Matching).
Jedes Programm sieht im Wesentlichen aus wie eine Reihe von regulären Ausdrücken, enthält jedoch Richtungsbefehle des Formulars
<dir>
, die die Richtung der Schlange ändern, und ruft Befehle des Formulars auf{label<dir>params}
, das mehr Schlangen erzeugt.Für einen Einstiegspunkt erzeugt der Interpreter eine Schlange mit der ersten Definition und bewegt sich nach rechts.
Es ist nicht besonders präzise, aber sehr leistungsfähig und (glaube ich) ziemlich lesbar.
Aktualisierung
<!>
, um kolinear zu lösen%{min,max}
Lösungen
15 gelöst, 1 in Bearbeitung
Sie können diese Programme ganz einfach mit dem oben verlinkten Online-Interpreter ausprobieren!
Problem 1 - Finden von Schachbrettern
Beginnen Sie mit Problem 3, um eine detaillierte Einführung zu erhalten.
Problem 2 - Überprüfen von Schachbrettern
Wenn Sie die entsprechenden Schlangen mit dem Symbol "Out-of-Bound" versehen
$
, können Sie ein Programm so konfigurieren, dass es nur mit der gesamten Eingabe übereinstimmt.Problem 3 - Ermitteln Sie ein Rechteck von Ziffern
Die
m
Schlange bewegt sich nach rechts und laicht%{2,}
mit der Definition c (c
) mit mindestens 2 Schlangen ( ein Verschluss bedeutet "2 bis unendlich") und bewegt<R>
sich in diesem Fall nach rechts ( ) bzw. nach unten, da alle Richtungen relativ zur aktuellen Schlange sind. DerA
Parameter ist sugar, der nur angibt, dass sich die laichende Schlange nach dem Aufruf bewegen soll. Der1
Parameter ist, wie wir Übereinstimmungen auf Rechtecke beschränken - Zahlenparameter setzen Schlangen in "Gruppen". Ein Match zählt nur dann, wenn alle Schlangen in derselben Gruppe genau dieselbe Distanz zurücklegen.Problem 4 - Ein Wort in einer Wortsuche finden
Der Befehl direction
<*>
gibt an, dass sich die Schlange in eine beliebige diagonale oder orthogonale Richtung drehen soll. Dann sucht es nach dem einfachen Regex.Problem 5 - Quadratische Eingaben erkennen
Der Schlüssel hier ist das Sonderzeichen
$
, das nur passt, wenn die Schlange außerhalb der Grenzen ist. Wir laichen eine horizontale und eine vertikale Schlange. Jede dieser Arten bringt mehr Schlangen hervor, wenn sie am Rand entlang rennen, und alle gehören derselben Gruppe an und müssen gleich lang sein.Aufgabe 6 - Finden Sie Segelflugzeuge in einem Spiel des Lebens
m
Startet in einer der vier orthogonalen Richtungen (<+>
) und erzielt eine Drehung. Dann sieht es für die drei Zeilen nach links oder rechts aus, um eine Reflektion zu erzielen.(Beachten Sie, dass ich die Leerzeichen nur durch Punkte ersetzt habe, weil die in meinem Interpreter verwendeten HTML-Textbereiche dumme Dinge zu tun scheinen, wenn sie mehrere Leerzeichen in einer Reihe enthalten.)
Aufgabe 7 - Match Nether Portals
Die
m
Schlange bewegt sich nach rechts und erzeugt eine Schlange, um den linken Rand zu überprüfen, 2-22 Schlangen, um die mittleren Spalten zu überprüfen, und schließlich eine Schlange, um den rechten Rand zu überprüfen. Der~
Bediener weist darauf hin, dass Folgendes überprüft, jedoch nicht als Teil der Lösung gekennzeichnet werden sollte.Dank beschränkter Verschlüsse können wir dieses Problem jetzt vollständig und richtig lösen!
Aufgabe 8 - Platzierung der Minecraft-Truhe
Hier verwenden wir ein logisches nicht (
!
), das genau dann zutrifft, wenn das folgende Token nicht zutrifft. Die Deklarationd
erkennt eine doppelte Truhe in einer bestimmten Richtung, sodass!{d<+>}
sichergestellt ist, dass in keiner orthogonalen Richtung doppelte Truhen vorhanden sind.s
Bewegt sich mit einer kleinen Raute um das aktuelle Quadrat und überprüft, ob mindestens drei dieser Felder leer oder nicht auf dem Spielfeld sind. Der Schlusskurs\.
stimmt schließlich mit dem Quadrat überein, vorausgesetzt, alle vorhergehenden Bedingungen waren erfolgreich.Problem 9 - Horizontale und vertikale Ausrichtung
Die Schlange
m
dreht sich optional nach rechts (<R>?
), bevor sie der Sequenz entspricht..
ist ein Platzhalter, wie in Regex.Aufgabe 10 - Kolineare Punkte
Mit der Hinzufügung der
<!>
Richtung können wir das jetzt lösen!<!>
ist wie,<+>
aber anstatt sich in vier Richtungen zu verzweigen, verzweigt es sich in jede mögliche Richtung.Problem 12 - Vermeiden Sie den Buchstaben Q
Lässt nur 4 Schlangen entstehen, die jeweils nach vier Zeichen suchen, die nicht dem Buchstaben Q entsprechen.
Aufgabe 13 - Diamond Mining
Das ist ziemlich ordentlich.
m
bringt zwei Schlangen hervor, eine nach rechts hinten und eine nach rechts vorne. Jede davon folgt den Schrägstrichen zu einem X und erzeugt dann eine weitere Schlange im rechten Winkel zu ihrer aktuellen Richtung, die den Schrägstrichen zu dem unteren X folgt.Aufgabe 14 - Passende Kreuze
Hier ist das erste Mal, dass ich den
P
Parameter iggyback verwende. Normalerweise sind die Schlangen unabhängig, aber wenn Sie mit diesem Parameter einen Anruf tätigen, wird die aufrufende Schlange mit dem Angerufenen verschoben. Soe2
können Sie eine Folge von '.', Dann eine Folge von '#', dann eine andere Folge von '.' Überprüfen und sie alle getrennte Aufrufe haben, sodass wir sie mit '1', '2' und '3' gruppieren können. und zwingen ihre Längen zusammenzupassen.Aufgabe 15 - Finde ein Wort in einem Boggle Board
Einfach, wenn auch wortreich.
I
parameter gibt an, dass zwischen Groß- und Kleinschreibung unterschieden wird (Parameter können sowohl in Definitionen als auch in Aufrufen angegeben werden). Die Schlange dreht sich in eine beliebige Richtung, passt sich dem Charakter an, dreht sich wieder und so weiter.Dies ist die Version ohne Wiederverwendung von Zeichen. Der
E
xclusive-Parameter verhindert, dass die Schlange mit einem bereits markierten Zeichen übereinstimmt, ähnlich wie bei Feersums Schleimpfaden.Problem 16 - Wickeln Sie die Kanten um
Mit diesem
W
Parameter kann die Schlange einen Zeilenumbruch ausführen, wenn sie außerhalb der Grenzen läuft. Wir haben auchH
undV
nur horizontale oder vertikale Verpackung zu erlauben.Extra - Maze Solver
Löst ein ASCII-Labyrinth, in dem der begehbare Boden aus Punkten besteht. Die
<P>
Richtung bedeutet vorwärts, links oder rechts (Zucker für[<F><L><R>]
).Extra - Paren Matching
Noch nicht herausgefunden, wie man Prelude macht, aber hier ist ein erster Schritt! Hier benutze ich die
r
Schlange rekursiv, um die entsprechenden Klammern zuzuordnen, indem ich überprüfe, dass sich keine nicht übereinstimmenden Klammern zwischen ihnen befinden.Extra- ASCII-Topologie: Zählen von Schleifen
quelle
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 ( Github-Wiki , Online-Dolmetscher )
Wie bei Feersums Vorlage basiert auch dies auf dem Durchlaufen des Gitters, aber wie bei CarpetPythons Vorlage basiert dies auf Regex. Irgendwie sieht es so aus, als hätte ich es geschafft, den Mittelweg einzuschlagen.
Es gibt eine ganze Reihe von nicht implementierten Funktionen, die ich hinzufügen möchte. Daher habe ich, wo relevant, notiert, was ich vorhabe, wenn ich Zeit habe.
Aktualisierung
(Siehe Github Seite für detaillierte Nachrichten)
5. April 2015 : Slip hat jetzt einen Online-Dolmetscher ! Es befindet sich noch in einem frühen Stadium, daher kann es zu einigen Fehlern kommen.
5. April 2015 : Effizienz-Update! Jetzt können große Portale viel schneller eingegeben werden (2s). Außerdem wurden einige Syntaxänderungen vorgenommen. Überprüfen Sie daher unbedingt das Wiki. Gruppennummerierung ebenfalls behoben.
Slip hat einen Übereinstimmungszeiger, der an einem bestimmten Feld beginnt und anfangs nach rechts zeigt. Wenn ein Zeichen übereinstimmt, bewegt sich der Zeiger in der aktuellen Richtung vorwärts (obwohl die Implementierung die Dinge nicht genau in dieser Reihenfolge ausführt).
Die Richtung des Spiel - Zeiger kann mit auf eine bestimmte Richtung festgelegt werden
^<digit>
, in denen^0
,^1
,^2
, ...,^7
den Zeiger auf N, NE, E, ..., NW jeweils (im Uhrzeigersinn).Die folgenden Verknüpfungen sind ebenfalls verfügbar:
^*
prüft alle 8 orthogonalen oder diagonalen Richtungen,^+
prüft alle 4 orthogonalen Richtungen.(Zukunftsplan: Einstellung beliebiger Richtungen zulassen, zB
(1, 2)
für Ritterzug)Zum Beispiel ( Problem 4 - Finden eines Wortes in einer Wortsuche ),
probiert alle 8 orthogonalen oder diagonalen Richtungen aus und sucht nach dem Wort "GOLF". Standardmäßig probiert Slip alle möglichen Startquadrate aus und gibt jeweils ein Ergebnis zurück, wobei Duplikate herausgefiltert werden, sodass ein Raster entsteht
gibt nur die oberste und die unterste Zeile als Treffer zurück (da die oberste und die linke Spalte "GOLF" vom selben Quadrat ausgehen). Um alle Übereinstimmungen zu erhalten, kann der
o
überlappende Übereinstimmungsmodus verwendet werden.In ähnlicher Weise ( Problem 15 - Ein Wort in einem Boggle-Brett finden ),
Spiele,
panama
indem du jedes Mal eine andere Richtung ausprobierst. Verwenden Sie diei
Flagge für Groß- und Kleinschreibung. Slip verwendet Zeichen standardmäßig wieder, dies kann jedoch mit demr
No-Repeat-Flag umgeschaltet werden .(Zukunftsplan: Ein Modifikator für den Suchmodus, der nach jeder Bewegung automatisch die Richtungssätze überprüft, sodass keine Wiederholung erforderlich
^*
ist.)Die Richtung des Übereinstimmungszeigers kann auch mit
<
oder um 90 Grad nach links oder rechts gedreht werden>
. Zum Beispiel,sucht nach dem Muster
indem Sie in der folgenden Reihenfolge suchen:
Dies ermöglicht es uns, Problem 6 zu lösen - Segelflugzeuge finden mit
Dabei codieren die Teile 1 und 2 die Segelflugzeugformen und die Teile 3 und 4 ihre reflektierten Gegenstücke.
Beachten Sie, dass Slip Backtick
`
für die Flucht verwendet. Dies liegt daran, dass Slip eine andere Form der Bewegung hat, die der Sprache ihren Namen gibt - den Slip-Befehl./
Bewegt den Übereinstimmungszeiger orthogonal nach links und\
den Übereinstimmungszeiger orthogonal nach rechts.Zum Beispiel,
kann durch abgestimmt werden
abc\def/ghi
.In Kombination mit der
(?| <regex> )
stationären Gruppe, die wie ein passender Lookahead wirkt , wird das Verrutschen wichtiger, obwohl es für sich genommen nicht besonders nützlich ist . Der Regex im Inneren wird abgeglichen, und am Ende werden Position und Richtung des Abgleichzeigers auf den Zustand vor der stationären Gruppe zurückgesetzt.Zum Beispiel,
kann mit abgestimmt werden
(?|abc)\(?|def)\(?|ghi)
.Ebenso kann Problem 12 - Vermeiden Sie den Buchstaben Q mit gelöst werden
Wo
%
ist ein No-Slip-Befehl, um die\
Aktivierung des ersten zu stoppen .Slip hat auch eine Längenangabe
(?_(<group num>) <regex> )
, die nur dann mit der Regex übereinstimmt, wenn ihre Übereinstimmungslänge mit der Länge der angegebenen Gruppennummer übereinstimmt.Zum Beispiel kann Problem 13 - Diamond Mining leicht mit gelöst werden
die zuerst versucht, die obere linke Seite des Diamanten abzugleichen, und dann bestätigt, dass die anderen drei Seiten die gleiche Länge haben.
(Mit
v
Flag für ausführliche Ausgabe ausführen)Eine golferische Alternative ist
welches die erste Seite zweimal zusammenbringt.
Viele der anderen Probleme können mithilfe von rutschenden, stationären Gruppen und Längenangaben gelöst werden:
Aufgabe 14 - Übereinstimmende Kreuze:
Sobald Sie die Breite des
.
s und#
s in der ersten Reihe erfasst haben , rutscht es einfach ganz nach unten.Ausgabe:
Dieser kann wahrscheinlich mit ein bisschen Rekursion golfen werden, sobald ich ein paar Bugs aussortiert habe.
Problem 3 - Ermitteln Sie ein Rechteck aus Ziffern:
Ordnen Sie eine obere Reihe mit zwei oder mehr Ziffern zu und stellen Sie dann sicher, dass jede Zeile darunter dieselbe Länge hat.
`d
ist eine vordefinierte Zeichenklasse, die äquivalent zu ist[0-9]
.Beachten Sie, dass dies alle Übereinstimmungen findet .
Aufgabe 7 - Match-Nether-Portale:
welche Ausgaben, für das oberste Beispiel im Original-Thread :
Zu den weiteren Funktionen von Slip gehören:
$0, $1, $2, ..., $7
Verankern Sie die Nordkante, die Nordostecke, die Ostkante usw.$+
Verankern Sie jede Kante und$*
verankern Sie jede Ecke.$
gefolgt von einem Kleinbuchstaben setzt einen Anker an der aktuellen Position, dem später$
das entsprechende Großbuchstaben, z . B.$a
und, folgen kann$A
.#
Schaltet das No-Move-Flag um, wodurch verhindert wird, dass sich der Übereinstimmungszeiger nach der nächsten Übereinstimmung vorwärts bewegt.,
Stimmt mit einem Zeichen überein.
, fügt es jedoch nicht zur Ausgabe hinzu, sodass nicht zusammenhängende Übereinstimmungen möglich sind, während sie von erkannt werden(?_())
.... und mehr. Es gibt wirklich zu viele, um sie auf dieser Seite aufzulisten.
Andere Probleme
Problem 1 - Finden von Schachbrettern:
Die beiden Probleme mit dem Schachbrett sind sicherlich nicht Slips Stärke. Wir passen die oberste Reihe an und stellen dann sicher, dass sie mindestens die Länge 3 hat und zwischen
#
und_
wechselt. Am Ende$a
sollte sich der Anker unten rechts auf dem Schachbrett befinden.Wir biegen dann nach links ab und wiederholen den Vorgang für die Spalten, um sicherzustellen, dass wir
$A
am Ende übereinstimmen .Problem 2 - Überprüfen von Schachbrettern:
Wie beim vorherigen Problem prüfen wir, ob jede Zeile korrekt ist, drehen uns dann nach links und machen dasselbe für Spalten. Anker werden verwendet, um sicherzustellen, dass nur das gesamte Board übereinstimmt.
Problem 9 - Horizontale und vertikale Ausrichtung:
Wir wenden die optionalen? Quantifizierer für den
>
Befehl "Drehen", sodass wir entweder nach rechts oder nach unten passen. Wir finden alle 5 im Beispiel mito
Überlappungsmodus, aber nur 4 ohne#.,##
und#.,#
beginnen an derselben Position.Aufgabe 10 - Kollineare Punkte
Ordnen Sie
#
dann einige horizontale und einige vertikale Zeichen zu, wiederholen Sie diese bis zur zweiten#
und wiederholen Sie sie bis zur dritten#
.Problem 5 - Quadratische Eingaben erkennen:
Verankern Sie die obere linke Ecke und prüfen Sie, ob die obere Kante dieselbe Länge wie die rechte Kante hat, bevor Sie die untere rechte Ecke verankern. Wenn die Eingabe dies passiert, gehen wir rückwärts nach oben, um der gesamten Eingabe zu entsprechen.
Aufgabe 8 - Platzierung der Minecraft-Truhe:
Laufen Sie mit der
p
Flagge, um die Positionen jedes Matches zu ermitteln.$^
ist ein Anker, der passt, wenn der Match-Zeiger beim nächsten Zug außerhalb der Grenzen liegt.Zuerst passen wir a an
.
, dann überprüfen wir, ob wir von drei.
s / Grenzen umgeben sind, und stellen dann sicher, dass das vierte umgebende Quadrat auch eine.
/ Grenze oder eine einzelne Truhe ist (indem wir die umgebenden Quadrate überprüfen ).Problem 11 - Überprüfen Sie die Prelude-Syntax :
Ich habe ein paar Versuche unternommen, aber ich denke, das ist richtig. Hier verwenden wir die Rekursion, die die gleiche Syntax wie PCRE hat.
Dieser Ansatz setzt voraus, dass die Eingabe rechteckig ist, aber sobald ich einen nicht rechteckigen Abgleich durchgeführt habe, ist diese Annahme nicht mehr erforderlich.
Hier ist der gleiche Ansatz, mit mehr Rekursion golfen:
Problem 16 - Wickeln Sie die Kanten um:
(Hinweis: Wrapping wurde noch nicht an den Online-Interpreter übertragen.)
Dies erfordert das Wrapping-Flag
w
. Technisch gesehen ist die Initiale%
für No-Slip nicht erforderlich, aber dann wird das Match ab einem Feld höher gewertet.Problem EX 1 - Labyrinthlöser:
Problem von BMacs Kommentar im Chat . Verwenden Sie das
r
Flag für den Modus "Keine Wiederholung", damit der Übereinstimmungszeiger nicht hängen bleibt.Problem EX 2 - Gesichtserkennung :
Beachten Sie, dass ich nur Gesichter abgleiche und keine Reinigung durchführe. Beachten Sie, dass die Frage Euro-Symbole enthält, die von einigen druckbaren ASCII-Zeichen ersetzt werden müssen, um zu funktionieren.
quelle
PMA / Schnecken (C ++)
Ich stelle mir die Sprache als Schnecken vor, die sich in einem Raster bewegen und Befehle ausführen. Die Schnecken hinterlassen auf jedem Feld, auf das sie sich bewegen, eine Spur von Schleim, was standardmäßig dazu führt, dass das Feld anschließend nicht mehr angepasst werden kann. Eine Übereinstimmung ist erfolgreich, wenn das Ende der Befehlsliste erreicht ist.
Es gibt jetzt genug Operatoren, für die wir eine Prioritätsliste benötigen, um sie zu verfolgen. Die Vorgänge werden in der folgenden Reihenfolge ausgeführt:
( ) [ ]
|
`
als Gruppe aus[m],[n]
undn
= !
Der Interpreter ist in C ++ geschrieben. Den abgrundtiefen Quellcode finden Sie hier .
Problem 4: Wortsuche
Das Programm
ist ausreichend, um einen Wahrheitswert oder einen falschen Wert dafür zu erhalten, ob das Wort gefunden wurde.
z
(einer der 15 absoluten oder relativen Richtungsbefehle) passt in jede oktilineare Richtung. Mehrere aufeinanderfolgende Richtungsbefehle werden miteinander ODER-verknüpft. Zum Beispielruldy
wäre fast gleichbedeutend mitz
, da dies die Befehle für rechts, oben, links, unten und eine beliebige diagonale Richtung sind. Die Anweisungen werden jedoch in einer anderen Reihenfolge getestet. Das erste übereinstimmende Zeichen ist immer dasjenige, mit dem die Schnecke beginnt, unabhängig von der Richtung.\
<Zeichen> entspricht einem einzelnen Literalzeichen.Die Standardstrategie besteht darin, das Muster an jedem Quadrat im Begrenzungsrahmen der linksbündigen Eingabe auszuprobieren und die Anzahl der Übereinstimmungen auszugeben. Wenn ein boolescher Wert
1
oder0
erforderlich ist, kann das folgende Programm verwendet werden:Befindet sich mindestens eine neue Zeile in der Quelldatei, wird die erste Zeile als Option für die anfängliche Konvertierung der Eingabe in eine rechteckige Form behandelt. Die
?
Option gibt 0 oder 1 aus, je nachdem, ob irgendwo eine Übereinstimmung vorliegt.Aufgabe 15: Boggle
Nach der Implementierung von Alternation ist es nun möglich, Boggle zu lösen. Es wäre besser, bei diesem Matching zwischen Groß- und Kleinschreibung zu unterscheiden, aber die Implementierung hat nicht meine höchste Priorität.
|
Funktioniert genauso wie ein eindimensionaler Regex. Es gibt zwei übereinstimmende Trennzeichenpaare für die Gruppierung, nämlich()
und{}
. Eine schließende Klammer schließt alle offenen Gruppen des entgegengesetzten Typs, die zwischen ihr und der nächsten Gruppe desselben Typs stehen. Im Folgenden{({{)
bleibt beispielsweise nur die Gruppe ganz links geöffnet. Wie Sie sehen, werden nicht übereinstimmende Gruppierungssymbole an den Rändern implizit geschlossen. Es gibt einen weiteren Gruppierungsbefehl, auf`
den ich jetzt nicht eingehen werde.Aufgabe 8: Minecraft-Truhen
Das Programm gibt die Anzahl der gültigen Brustplatzierungen aus. Dies war das erste Mal, dass ich Golf spielen musste und reduzierte meine Byteanzahl (17) ein paar Mal.
\.
Stimmt buchstäblich mit einem Punkt am Startpunkt des Spiels überein.!(o\C)2
entspricht,!((o\C)2)
da die Quantifizierung Vorrang vor der Behauptung hat.<atom> <number>
bedeutet,<atom>
genau<number>
mal zu wiederholen .o
dreht die Schnecke in jede orthogonale Richtung.!
ist eine negative Behauptung. Somit prüft dieser Teil das Fehlen einer benachbarten Doppelkiste.o
dreht sich in eine orthogonale Richtung.(!\Cw)3
behauptet, dass sich keineC
Schnecke vor der Schnecke befindet, und dreht sich dann dreimal gegen den Uhrzeigersinn.Problem 2: Überprüfen von Schachbrettern
Die
&
Option legt die Ausgabe des Programms so fest, als1
ob die Übereinstimmung an allen Positionen erfolgreich wäre, und0
ansonsten. Entspricht^c
einem Zeichen, das nichtc
dem[^c]
regulären Ausdruck entspricht. Insgesamt bedeutet das Programm: 1 ausgeben, wenn an jeder Position im Begrenzungsrechteck der Eingabe entweder#
ein Zeichen vorhanden ist_
,_
das nicht orthogonal zu einem nicht vorhandenen Zeichen benachbart ist , oder ein Zeichen, das nicht orthogonal zu einem vorhandenen Zeichen benachbart ist nicht#
; sonst 0.quelle
Die Re2d-Klasse, Python 2
Update: Problem "9. Ausrichtung" hinzugefügt.
Mein Ansatz ist es, das Python Re-Modul zu verwenden, um die Suche und den Abgleich durchzuführen. Die Re2d-Klasse bereitet den Text für die Verarbeitung vor, führt die Re-Funktionen aus und formatiert die Ergebnisse für die Ausgabe.
Beachten Sie, dass dies keine völlig neue Sprache ist - es ist die Standardsprache für reguläre Ausdrücke, die in zwei Dimensionen projiziert wird und zusätzliche Flags für zusätzliche 2D-Modi enthält.
Die Klasse hat die folgende Verwendung:
Beide Muster sind Standard-RE-Muster mit linearem Text. Wird kein vertikales Muster angegeben, verwendet die Klasse das horizontale Muster auch für den vertikalen Abgleich. Die Flags sind die Standard-RE-Flags mit einigen 2D-Erweiterungen.
Testen
Die Suchmethode hat ein Schachbrettmuster gefunden und gibt eine 4-Tupel-Position zurück. Das Tupel hat die
x,y
Position des ersten Zeichens der Übereinstimmung und die Position deswidth, height
übereinstimmenden Bereichs. Es ist nur ein Muster angegeben, sodass es für die horizontale und vertikale Anpassung verwendet wird.Das Schachbrett wurde mit der Match-Methode überprüft, die einen Booleschen Wert zurückgibt. Beachten Sie, dass die
^
und$
Start- und Endezeichen sind erforderlich , um das Übereinstimmen ganzen Textes.Wir verwenden nun das
MULTIFIND
Flag, um alle möglichen Übereinstimmungen für den 2+ Ziffernblock zurückzugeben. Die Methode findet 9 mögliche Übereinstimmungen. Beachten Sie, dass sie sich überlappen können.Dieser Test zeigt die Verwendung von vertikalem und horizontalem Spiegeln. Dies ermöglicht die Zuordnung von Wörtern, die umgekehrt sind. Diagonale Wörter werden nicht unterstützt. Die
MULTIFIND
Flagge erlaubt mehrere überlappende Übereinstimmungen in alle 4 Richtungen. Die findall-Methode verwendet die Suche, um die übereinstimmenden Felder zu finden, und extrahiert dann die übereinstimmenden Textblöcke. Beachten Sie, wie die Suche negative Breite und / oder Höhe für Übereinstimmungen in umgekehrter Richtung verwendet. Die Wörter in vertikaler Richtung haben neue Zeilenzeichen - dies entspricht dem Konzept von 2D-Zeichenblöcken.Diese Suche erforderte separate Muster für jede Dimension, da die Mindestgröße für jede Dimension unterschiedlich ist.
Diese Gruppe von 2 Suchen findet 2 vertikale und 2 horizontale Übereinstimmungen, kann jedoch die eingebettete
#.,#
Zeichenfolge nicht finden .Hier verwenden wir 2 Suchen, um Übereinstimmungen in beide Richtungen zu finden. Es ist möglich, mehrere orthogonale Übereinstimmungen zu finden, aber dieser Ansatz unterstützt keine diagonalen Übereinstimmungen.
Diese Suche findet die erste Übereinstimmung.
Das Diamantproblem ist schwieriger. Für die drei Größen werden drei Suchobjekte benötigt. Es kann die sechs Diamanten im Testsatz finden, skaliert jedoch nicht auf Diamanten mit variabler Größe. Dies ist nur eine Teillösung des Diamantproblems.
Python 2-Code
quelle
Schmutz , Haskell
Einführung
Grime basiert auf booleschen Grammatiken . Die Grundidee besteht darin, rechteckige Muster aus kleineren Komponenten zu konstruieren und zu prüfen, ob sie in der Eingabematrix enthalten sind. Bisher unterstützt Grime nur rechteckige Übereinstimmungen und löst mindestens 11 Probleme mehr oder weniger elegant.
BEARBEITEN: Die Kreuze wurden korrigiert (dank DLosc für das Erkennen des Fehlers) und Diamantenabbau hinzugefügt.
EDIT2: Charakter-Klassen hinzugefügt, inspiriert von denen von Slip. Außerdem wurde die Syntax von Optionsflags geändert, der Ausdrucksparser verbessert und das No-Q-Problem hinzugefügt.
EDIT3: Größenbeschränkungen wurden implementiert und das Problem mit den Nether-Portalen wurde hinzugefügt.
Verwendungszweck
Ein Grime-Programm wird als Grammatik bezeichnet , und die richtige Dateierweiterung für eine Grammatik lautet
.gr
, obwohl dies nicht erzwungen wird. Die Grammatik wird als ausgewertetwo
matrixfile
ist eine Datei mit der Zeichenmatrix. Beispielsweise würde die Zifferngrammatik als ausgewertetFür zusätzliche Geschwindigkeit empfehle ich, die Datei mit Optimierungen zu kompilieren:
Standardmäßig gibt der Interpreter die erste Übereinstimmung aus, die er findet. Dies kann jedoch mithilfe der Optionsflags gesteuert werden:
-e
: Übereinstimmung nur mit der gesamten Matrix, Ausdruck1
für Übereinstimmung und0
für keine Übereinstimmung.-n
: Gibt die Anzahl der Übereinstimmungen oder die gesamte Matrix aus, falls diese-e
ebenfalls angegeben ist.-a
: Alle Übereinstimmungen drucken.-p
: Gibt auch die Positionen der Übereinstimmungen im Format aus(x,y,w,h)
.-s
: drucke die Übereinstimmungen nicht selbst aus.-d
: Debug-Informationen drucken.Optionen können auch in der Grammatik angegeben werden, indem sie vor einer Zeile eingefügt und mit einem Komma versehen werden
,
(Beispiele siehe unten).Syntax und Semantik
Eine Grime-Grammatik besteht aus einer oder mehreren Definitionen in einer separaten Zeile. Jeder von ihnen definiert den Wert eines Nicht - Terminal , und eine von ihnen muss die anonym definiert Toplevel nicht terminale . Die Syntax einer Definition lautet entweder
N=E
oderE
, wobeiN
es sich um einen Großbuchstaben undE
einen Ausdruck handelt .Ausdrücke werden wie folgt konstruiert.
\
einem1x1
Escapezeichen versehen ist, entspricht einem Rechteck, das dieses Zeichen enthält..
Stimmt mit jedem einzelnen Zeichen überein.$
Stimmt mit einem1x1
Rechteck außerhalb der Zeichenmatrix überein ._
Entspricht einem beliebigen Rechteck mit der Breite oder Höhe Null.d
igit,u
ppercase,l
owercase,a
lphabetic, alphan
umeric unds
ymbol.[a-prt-w,d-gu]
. Die Buchstaben links sind eingeschlossen, und die rechts sind ausgeschlossen, so dass dies genau mit den Buchstaben übereinstimmtabchijklmnoprtvw
. Wenn die linke Seite leer ist, enthält sie alle Zeichen. Das Komma kann weggelassen werden, wenn die rechte Seite leer ist. Die Zeichen[],-\
müssen mit maskiert werden\
.P
undQ
sind Ausdrücke, dannPQ
ist nur ihre horizontale Verkettung undP/Q
ist ihre vertikale Verkettung mitP
oben.P+
ist eine oder mehrereP
s horizontal ausgerichtet undP/+
ist die gleiche vertikal ausgerichtet.P|Q
,P&Q
undP!
.P?
ist die Abkürzung fürP|_
,P*
fürP+|_
undP/*
fürP/+|_
.P#
Stimmt mit jedem Rechteck überein, das eine Übereinstimmung von enthältP
.P{a-b,c-d}
, woabcd
sind nichtnegative ganze Zahlen, ist eine Größenbeschränkung aufP
. WennP
es sich um eine Zeichenklasse handelt, stimmt der Ausdruck mit jedemmxn
Rechteck überein, das nur diese Zeichen enthält, vorausgesetzt, esm
liegt zwischena
undb
einschließlich sowien
zwischenc
undd
einschließlich. In anderen Fällen stimmt der Ausdruck mit jedem Rechteck überein, das die richtige Größe hat undP
auch übereinstimmt. Wenna
oderc
weggelassen werden, werden sie genommen werden0
, und wennb
oderd
weggelassen werden, sind sie unendlich. Wenn der Bindestrich zwischena
undb
weggelassen wird, verwenden wir für beide Enden des Intervalls dieselbe Nummer. Wenn das ganzec-d
Teil weggelassen wird, sind beide Achsen beschränkt. Zur Verdeutlichung{-b}
ist gleichbedeutend mit{0-b,0-b}
und{a-,c}
ist gleichbedeutend mit{a-infinity,c-c}
.Anmerkungen
Schmutz erlaubt paradoxe Definitionen wie
A=A!
bei undefiniertem Verhalten. Sie verursachen jedoch keine Abstürze oder Endlosschleifen.Grime unterstützt nicht rechteckige Eingaben. Die Zeilen werden einfach nach links ausgerichtet und die Lücken können mit angepasst werden
$
.In Zukunft möchte ich Folgendes implementieren:
.
nur1x1
Rechtecke abgeglichen werden können. Bis eine Übereinstimmung gefunden wird, werden alle Rechtecke aller Größen in der angegebenen Reihenfolge geprüft, wobei jeder Fehler sofort auftritt.Nicht rechteckige Übereinstimmungen mit Kontexten , die bei der Boggle-Brett-Herausforderung hilfreich wären. Zum Beispiel
Pv(Q>R)
bedeutetP
mit unterem Kontext (Q
mit richtigem KontextR
). Es würde zu den L-förmigen Mustern passenDie Aufgaben
Gegeben ungefähr in der Reihenfolge der Komplexität.
Rechteck aus Ziffern
Das ist einfach: ein Rechteck mit mindestens einer Zifferngröße
2x2
.Kein q oder Q
Das ist fast so einfach wie das erste; Jetzt haben wir eine eingeschränktere Größe und eine benutzerdefinierte Zeichenklasse.
Horizontale und vertikale Ausrichtung
Jetzt haben wir einige entkommene Zeichen. Grundsätzlich entspricht dies einem
#
, dann einer beliebigen Anzahl von beliebigen Zeichen#
, entweder horizontal oder vertikal.Quadratische Eingaben erkennen
Diese Grammatik ist sehr einfach. Sie definiert im Grunde genommen, dass ein Quadrat entweder ein
1x1
Rechteck oder ein kleineres Quadrat mit einer Spalte am rechten Rand und einer Zeile am unteren Rand ist. Beachten Sie auch diee
Option vor dem obersten Nichtterminal, mit der die Überprüfung der gesamten Eingabe umgeschaltet wird.Ein Wort in einer Wortsuche finden
Dies ist schrecklich, da Grime keine Rotations- oder Reflektionsoperationen hat. Es ist auch extrem langsam, da Grime nicht weiß, dass die Streichhölzer nur von Größe sein können
4x1
,1x4
oder4x4
.Das Segelflugproblem könnte auf ähnliche Weise gelöst werden, aber ich bin zu faul, das aufzuschreiben.
Nether-Portale
Mit dem Größenbeschränkungsoperator ist dies nicht so schwer. Der mittlere Teil
\.{2-22,3-22}
passt zu jedem Rechteck.
der richtigen Größe. Dann fügen wir einfach Spalten mitX
s auf beiden Seiten hinzu und heften Reihen mitX
s mit ignorierten Enden oben und unten an.Passende Kreuze
Was wir hier haben, ist eine Verknüpfung (logisches UND) zweier Ausdrücke. Das Nichtterminal
E
entspricht einem nicht leeren Rechteck von.
s undF
einem nicht leeren Rechteck von#
s. Die linke Seite der Konjunktion entspricht Rechtecken des Typswo haben wir dann
EFE
obenF
und dannEFE
wieder. Die rechte Seite stimmt mit den Transponierten überein, sodass wir genau die Kreuze erhalten.Diamant-Bergbau
Das Nichtterminal
C
ist eine Abkürzung für jede1xn
Spalte. Die obere Hälfte eines Diamanten entsprichtT
: Es handelt sich entweder um einen einzelnen DiamantenX
oderT
um einen anderen Diamanten , der auf beiden Seiten von einer Säule und einer Reihe/[something]\
darunter umgeben ist.B
Stimmt auf die gleiche Weise mit der Unterseite eines Diamanten überein, und das oberste Nicht-Terminal ist nur eine Reihe der FormX[something]X
zwischen einer oberen Hälfte und einer unteren Hälfte.Schachbretter finden
Die rechte Seite
[#_]{3-}
entspricht einem3x3
oder mehreren Rechtecken von#
s und_
s, während die linke Seite garantiert, dass sie keine zwei benachbarten#
s oder_
s enthält.Überprüfen von Schachbrettern
Dies ist im Grunde das gleiche wie oben, außer dass wir jedes nicht leere Rechteck zuordnen können, aber das
e
Flag für die gesamte Eingabeüberprüfung verwenden müssen.Überprüfen Sie die Prelude-Syntax
Dies ist wahrscheinlich die bisher interessanteste Grammatik. Das Nichtterminal
A
stimmt mit jeder Spalte überein, die nicht(
oder enthält)
, undP
stimmt entweder mit einer bestimmten Anzahl vonA
s oder mit zwei übereinstimmenden Klammern überein, zwischen und außerhalb derer sich mehrP
s befinden.quelle
\#(.*|./*)\#
funktionieren#
links, dann eine Zeile oder Spalte von irgendetwas, dann eins#
rechts" analysiert . Ich muss angeben, dass die#
s vertikal an die Spalte mit den Schrägstrichen verkettet sind/
.TMARL
Template Matching und Erkennungssprache
Beschreibung
Mein Interpreter nimmt 24K-Zeichen auf ( Code-Schnipsel nehmen Zeichen auf? ), Daher finden Sie die vollständige Beschreibung hier .
Das Beste: Der Dolmetscher ist in Javascript, das heißt, Sie können es gleich hier ausprobieren!
Code-Snippet anzeigen
Und für die Probleme:
# 1 - Schachbretter finden
&
fügt Suchanfragen hinzu. Der G2 am Ende erhält das 3. Element in einem Match-Element, das eigentliche Match. Die ersten beiden Elemente sind x- und y-Koordinaten (1 basierend, nicht 0).# 3 - Ermitteln Sie ein Rechteck von Ziffern
Ich denke, das ist ziemlich einfach.
# 4 - Ein Wort in einer Wortsuche finden
Das
S
Argument ist gerade, damit es nach allen Umdrehungen sucht. Es ist größer als 4, da es dann an die nächste Suche angehängt werden kann (einzelne Übereinstimmungen können nicht angehängt werden).# 5 - Quadratische Eingaben erkennen
Ich bin mir nicht sicher, ob dies völlig legal ist, da es nur dann die Rechtwinkligkeit korrekt bestimmt, wenn die Eingabe ein Rechteck ist. Es vergleicht die Länge der Eingabe
IL
mit der Länge der ersten ZeileIG0L
und kehrt sie um.# 6 - Finde Segelflugzeuge in einem Spiel des Lebens
Endlich eine Verwendung für den Spiegel!
# 12 - Vermeiden Sie den Buchstaben Q
S1 weil nur 1 Treffer benötigt wird.
Ich werde später einige der schwierigeren machen.
quelle