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>
Ответы:
SnakeEx
Решает 15/16 проблем до сих пор!
Онлайн переводчик ! - Полная спецификация языка - Javascript Source
Идея этого языка состоит в том, чтобы определить «змей», которые перемещаются по тексту, проверяя символы, используя синтаксис, подобный регулярному выражению.
Программа в SnakeEx состоит из списка определений для змей, использующих различные последовательности команд. Змеи могут порождать других змей, используя эти определения, и именно здесь SnakeEx получает большую часть своей мощности - мы можем сопоставлять ветвящиеся структуры и даже делать рекурсию (см. Пример Paren Matching).
Каждая программа по сути будет выглядеть как набор регулярных выражений, но с добавлением команд направления формы,
<dir>
которые изменяют направление змеи, и вызова команд формы,{label<dir>params}
которые порождают больше змей.Для точки входа интерпретатор порождает одну змею, используя первое определение, двигаясь вправо.
Это не очень кратко, но очень мощно и (я думаю) довольно читабельно.
Обновления
<!>
для решения коллинеарного%{min,max}
Решения
15 решено, 1 в процессе
Вы можете легко опробовать эти программы с помощью онлайн-переводчика, указанного выше!
Проблема 1 - Поиск шахматных досок
Для подробного ознакомления начните с Задачи 3.
Проблема 2 - Проверка шахматных досок
Завершение книги соответствующими змеями с символом «за пределами»
$
- один из способов заставить программу соответствовать только всему вводу.Проблема 3 - Определить прямоугольник цифр
В
m
змее двигается прямо, порождая на минимум 2 змея (%{2,}
это замыкание означает «2 в бесконечность») , используя определение с (c
) и перемещением вправо (<R>
), или , вернее , вниз в данном случае, поскольку все направления по отношению к текущей змеи. ПараметрA
- сахар, который просто указывает, что нерестовая змея должна двигаться после вызова.1
Параметр , как мы ограничиваем совпадение прямоугольников - число параметры ставит змей «группа». Матч не засчитывается, если все змеи в одной группе не проходят одно и то же расстояние.Задача 4 - Поиск слова в поиске слов
Команда направления
<*>
указывает, что змея должна поворачиваться в любом диагональном или ортогональном направлении. Затем он ищет простое регулярное выражение.Задача 5 - Определить квадратные входы
Ключ здесь - специальный символ
$
, который соответствует, только если змея выходит за пределы. Мы порождаем горизонтальную змею и вертикальную; каждый из них порождает больше змей, поскольку он проходит вдоль края, и все они находятся в одной группе и должны иметь одинаковую длину.Задача 6 - Найти планеры в игре жизни
m
начинается в любом из четырех ортогональных направлений (<+>
), достигая поворота. Затем он выглядит влево или вправо для трех рядов по порядку, достигая отражения.(Обратите внимание, что я заменил пробелы точками только потому, что текстовые области HTML, используемые в моем интерпретаторе, кажутся глупыми, если в них несколько пробелов подряд)
Задача 7 - Подходим порталы Пустоты
В
m
змее двигается прямо, порождая змею , чтобы проверить левый край, 2-22 змея , чтобы проверить средние колонны, и , наконец , змею , чтобы проверить правый край.~
Оператор указывает на то, что все , что следует должны быть проверены , но не должны быть помечены как часть решения.Ограниченные замыкания теперь позволяют нам полностью и правильно решить эту проблему!
Задача 8 - Размещение сундуков Minecraft
Здесь мы используем логический not (
!
), который соответствует тогда и только тогда, когда следующий токен ничего не соответствует. Объявлениеd
обнаруживает двойной сундук в определенном направлении, поэтому!{d<+>}
убедитесь, что в любом ортогональном направлении нет двойных сундуков.s
перемещается в маленький ромб вокруг текущего квадрата, проверяя, что по крайней мере 3 из этих мест либо пустые, либо находятся вне поля. Трейлинг,\.
наконец, соответствует квадрату, предполагая, что все предыдущие условия выполнены.Задача 9 - Горизонтальное и вертикальное выравнивание
Змея
m
может повернуть направо (<R>?
) перед соответствием последовательности..
подстановочный знак, как в регулярных выражениях.Задача 10 - Коллинеарные точки
С добавлением
<!>
направления, мы можем решить это сейчас!<!>
это как,<+>
но вместо того, чтобы разветвляться в четырех направлениях, оно разветвляется во всех возможных направлениях.Задача 12 - Избегайте буквы Q
Просто порождает 4 змей, каждый из которых ищет четыре символа, которые не являются буквой Q.
Задача 13 - Алмазодобыча
Это довольно опрятно.
m
порождает двух змей, одна идет спиной направо, а другая - вперед. Каждый из них следует за косой чертой к X, затем порождает другую змею под прямым углом к ее текущему направлению, которое следует за косой чертой к нижней X.Задача 14 - Соответствие крестов
Вот первый раз, когда я использовал
P
параметр iggyback. Обычно змеи независимы, но если вы делаете вызов с этим параметром, вызывающая змея будет перемещаться вместе с вызываемым абонентом. Поэтомуe2
можно проверить последовательность «.», Затем последовательность «#», затем другую последовательность «.», И сделать так, чтобы они были отдельными вызовами, чтобы мы могли сгруппировать их с «1», «2» и «3». , заставляя их длины совпадать.Задача 15 - Подберите слово на доске
Просто, если многословно.
I
Параметр указывает нечувствительность к регистру (мы можем указать параметры как в определениях, так и в вызовах). Змея поворачивается в любом направлении, соответствует персонажу, снова поворачивается и так далее.Это версия без повторного использования символов. Параметр
E
xclusive запрещает змее сопоставлять любые символы, которые уже были отмечены, так же, как следы слизи feersum.Задача 16 - Обернуть края
W
Параметр позволяет змею обертке , когда он работает вне границ. У нас также естьH
иV
разрешить только горизонтальную или вертикальную упаковку.Extra - Maze Solver
Решает лабиринт ASCII, где пройденный этаж - периоды. В
<P>
означает направление вперед, влево или вправо (сахар для[<F><L><R>]
).Extra - Paren Matching
Еще не выяснили, как делать прелюдию, но вот первый шаг! Здесь я использую
r
змею рекурсивно, чтобы сопоставить соответствующие скобки, проверяя, нет ли между ними непревзойденных скобок.Extra - ASCII Topology: подсчет циклов
источник
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 , онлайн-переводчик )
Как и в представлении feersum, оно также основано на обходе сетки, но, как и в представлении CarpetPython, оно основано на регулярных выражениях. Как-то похоже, что мне удалось занять золотую середину.
Есть довольно много нереализованных функций, которые я хочу добавить, поэтому, где это уместно, я отмечал, что я собираюсь делать, когда у меня будет время.
Обновления
(См. Страницу Github для подробных новостей)
5 апреля 2015 : теперь у Slip есть онлайн-переводчик ! Это все еще на ранних стадиях, поэтому может быть несколько ошибок.
5 апреля 2015 : обновление эффективности! Теперь порталы нижнего уровня намного быстрее (2 с). Также было несколько изменений синтаксиса, так что не забудьте проверить вики. Групповая нумерация также исправлена.
У скольжения есть указатель совпадения, который начинается с определенного квадрата и первоначально направлен вправо. Когда сопоставляется символ, указатель перемещается вперед в текущем направлении (хотя реализация не делает вещи точно в этом порядке).
Направление указателя матча может быть установлено в определенное направление с
^<digit>
, где^0
,^1
,^2
...,^7
установить указатель на N, NE, E, ..., NW соответственно (идет по часовой стрелке).Также доступны следующие ярлыки:
^*
проверяет все 8 ортогональных или диагональных направлений,^+
проверяет все 4 ортогональных направления.(План на будущее: разрешить установку произвольных направлений, например,
(1, 2)
для движения рыцаря)Например ( Задача 4 - Поиск слова в поиске слова ),
пробует все 8 ортогональных или диагональных направлений, ища слово «ГОЛЬФ». По умолчанию Slip пробует все возможные начальные квадраты и возвращает по одному результату от каждого, отфильтровывая дубликаты, поэтому сетка похожа на
возвращает только верхнюю и нижнюю строки как совпадающие (поскольку верхняя строка и левый столбец «ГОЛЬФ» начинаются с одного квадрата). Чтобы получить все совпадения,
o
можно использовать режим совпадения совпадений.Аналогично ( задача 15 - сопоставить слово на доске Boggle ),
спички
panama
, пытаясь в другом направлении каждый раз. Используйтеi
флаг для нечувствительности к регистру. Slip по умолчанию использует символы, но это можно переключить с помощьюr
флага no-repeat.(План на будущее: модификатор режима поиска, который автоматически проверяет наборы направлений после каждого перемещения, поэтому повторение
^*
не требуется)Направление указателя Спичечного также может быть повернуты на 90 градусов влево или вправо с
<
или>
соответственно. Например,ищет шаблон
глядя в следующем порядке:
Это позволяет нам решить проблему 6 - Найти планеры с
где части 1 и 2 кодируют формы планера, а части 3 и 4 кодируют их отраженные аналоги.
Обратите внимание, что Slip использует backtick
`
для экранирования. Это потому, что у Slip есть другая форма движения, которая дает языку его имя - команда slip./
скользит указатель совпадения ортогонально влево, а\
указатель совпадения ортогонально вправо.Например,
может быть сопоставлено
abc\def/ghi
.Хотя это не особенно полезно само по себе, проскальзывание становится более важным в сочетании со
(?| <regex> )
стационарной группой, которая действует как подходящая перспектива. Регулярное выражение внутри сопоставляется, затем в конце его положение и направление указателя совпадения сбрасываются в состояние перед стационарной группой.Например,
может быть сопоставлено с
(?|abc)\(?|def)\(?|ghi)
.Точно так же проблема 12 - Избегайте буквы Q можно решить с помощью
где
%
- команда отсутствия скольжения, чтобы остановить\
активацию первого .Slip также имеет утверждение длины
(?_(<group num>) <regex> )
, которое соответствует регулярному выражению внутри, только если его длина совпадения равна длине данной группы num.Например, проблема 13 - добыча алмазов может быть легко решена с помощью
который сначала пытается соответствовать верхней левой стороне алмаза, а затем утверждает, что остальные три стороны имеют одинаковую длину.
(Запуск с
v
флагом для подробного вывода)Гольф-альтернатива
который соответствует первой стороне дважды.
Многие другие проблемы могут быть решены с помощью проскальзывания, стационарных групп и утверждений длины:
Задача 14 - Соответствие крестов:
Как только вы фиксируете ширину
.
s и#
s в первом ряду, он просто сползает вниз.Выход:
Этот, вероятно, можно сыграть в гольф с небольшой рекурсией, как только я разберусь с несколькими ошибками.
Задача 3 - Определить прямоугольник из цифр:
Сопоставьте верхний ряд из двух или более цифр, затем убедитесь, что каждая строка ниже имеет одинаковую длину.
`d
предопределенный символьный класс, эквивалентный[0-9]
.Обратите внимание, что это находит все совпадения .
Задача 7 - Сопоставить нижние порталы:
что выводит, для верхнего примера в оригинальном потоке :
Наконец, некоторые другие функции Slip включают в себя:
$0, $1, $2, ..., $7
закрепите северный край, северо-восточный угол, восточный край и т. д.,$+
закрепите любой край и$*
закрепите любой угол.$
сопровождаемый символом нижнего регистра устанавливает привязку в текущей позиции, которая может позже соответствовать$
последующему соответствующему символу верхнего регистра, например,$a
и$A
.#
переключает флаг отсутствия движения, который останавливает движение указателя совпадения после следующего совпадения.,
соответствует символу, подобному символу.
, но не добавляет его к выводу, что позволяет выполнять несмежные совпадения, но при этом может быть распознано(?_())
.... и более. Там действительно слишком много, чтобы перечислить на этой странице.
Другие проблемы
Задача 1 - Нахождение шахматной доски:
Две проблемы шахматной доски, конечно, не являются сильной стороной Слип. Мы подбираем верхний ряд, затем проверяем, что он имеет длину не менее 3 и чередуется между
#
и_
, затем проскальзываем и сопоставляем последующие строки. К концу$a
якорь должен быть в правом нижнем углу шахматной доски.Затем мы поворачиваем налево и повторяем для столбцов, убедившись, что мы совпадаем
$A
в конце.Задача 2 - Проверка шахматных досок:
Как и в предыдущей задаче, мы проверяем правильность каждой строки, затем поворачиваем влево и делаем то же самое для столбцов. Якоря используются для проверки соответствия всей доски.
Задача 9 - Горизонтальное и вертикальное выравнивание:
Мы применяем необязательно? квантификатор команды
>
поворота, чтобы мы соответствовали либо вправо, либо вниз. Мы находим все 5 в примере сo
перекрывающимся режимом, но только 4 без него#.,##
и#.,#
начинаем с той же позиции.Задача 10 - Коллинеарные точки
Подберите
#
затем несколько горизонтальных и несколько вертикальных символов, затем повторите до второго#
и повторите до третьего#
.Задача 5 - Обнаружение прямоугольных входов:
Прикрепите верхний левый угол и убедитесь, что верхний край имеет ту же длину, что и правый край, перед закреплением нижнего правого угла. Если вход проходит это, мы поднимаемся назад, чтобы соответствовать всему входу.
Задача 8 - Размещение сундуков Minecraft:
Запустите с
p
флагом, чтобы получить позиции каждого матча.$^
является якорем, который соответствует, если следующий шаг выведет указатель соответствия за пределы.Сначала мы Совпадение
.
, а затем проверить , что мы окружены три.
с / границами, то убеждается , что четвёртое окружающий квадрат также.
/ граница или одна грудь (проверив его окружающие квадраты).Проблема 11 - Проверьте синтаксис Prelude :
Сделал несколько попыток, но я думаю, что это правильно. Здесь мы используем рекурсию, которая имеет тот же синтаксис, что и PCRE.
Этот подход требует, чтобы вход был прямоугольным, но как только я получу непрямоугольное соответствие, это предположение не понадобится.
Вот тот же подход, игра в гольф с большей рекурсией:
Задача 16 - Оберните края:
(Примечание: упаковка еще не была отправлена онлайн-переводчику)
Это требует флаг обтекания
w
. Технически, начальная буква%
для не проскальзывания не обязательна, но тогда совпадение будет считаться начиная с квадрата выше.Задача EX 1 - Решатель лабиринта:
Проблема из комментария BMac в чате . Используйте
r
флаг для режима без повтора, чтобы указатель совпадения не застревал при движении вперед и назад.Задача EX 2 - Распознавание лиц :
Обратите внимание, что я сопоставляю только лица, а не очищаю. Обратите внимание, что вопрос содержит символы евро, которые должны быть заменены некоторыми печатными ASCII для работы.
источник
PMA / Улитки (C ++)
Я представляю язык как улитки, перемещающиеся по сетке и выполняющие команды. Улитки оставляют след слизи на каждом квадрате, по которому они двигаются, что по умолчанию приводит к тому, что квадрат впоследствии становится несопоставимым. Совпадение считается успешным, если достигнут конец списка команд.
Сейчас достаточно операторов, поэтому нам понадобится список приоритетов, чтобы отслеживать их. Операции разрешаются в следующем порядке:
( ) [ ]
|
`
группы[m],[n]
иn
= !
Интерпретатор написан на C ++. Бедный исходный код можно найти здесь .
Проблема 4: поиск слова
Программа
достаточно, чтобы получить истинное или ложное значение того, найдено ли слово.
z
(одна из 15 абсолютных или относительных команд направления) совпадает в любом октилинеарном направлении. Несколько последовательных команд направления объединяются. Напримерruldy
, будет почти эквивалентноz
, поскольку это команды для вправо, вверх, влево, вниз и любого диагонального направления. Тем не менее, направления будут проверены в другом порядке. Первый соответствующий символ всегда тот, с которого начинается улитка, независимо от направления.\
<персонаж> соответствует одному буквенному символу.Стратегия по умолчанию состоит в том, чтобы попробовать шаблон в каждом квадрате в ограничительной рамке выровненного по левому краю ввода и вывести количество совпадений. Если булево значение
1
или0
требуется, можно использовать следующую программу:Если в исходном файле есть хотя бы одна новая строка, первая строка рассматривается как параметры для первоначального преобразования ввода в прямоугольную форму.
?
Опция печатает 0 или 1 в зависимости от того, есть ли матч в любом месте.Проблема 15: ошеломить
После реализации чередования теперь возможно решить Boggle. Было бы лучше использовать сопоставление без учета регистра для этого, но его реализация не является моим высшим приоритетом.
|
работает точно так же, как 1-мерное регулярное выражение. Для группировки есть две подходящие пары разделителей, а именно()
и{}
. Закрывающая скобка закроет все открытые группы противоположного типа, которые стоят между ним и ближайшими того же типа. Например, после{({{)
, только самая левая группа остается открытой. Как видите, непревзойденные символы группировки по краям неявно закрыты. Есть еще одна группирующая команда, в`
которую я сейчас не буду вдаваться.Задача 8: Сундуки Майнкрафта
Программа печатает количество действительных мест размещения сундуков. Это был первый раз, когда мне пришлось играть в гольф, и он несколько раз уменьшил количество моих байтов (17).
\.
буквально соответствует точке в начальной точке матча.!(o\C)2
эквивалентно тому,!((o\C)2)
что количественное определение имеет более высокий приоритет, чем утверждение.<atom> <number>
значит повторять<atom>
точно<number>
раз.o
поворачивает улитку в любом ортогональном направлении.!
это отрицательное утверждение. Таким образом, эта часть проверяет отсутствие смежного двойного сундука.o
поворачивается в каком-то ортогональном направлении.(!\Cw)3
утверждает, что нетC
перед улиткой, а затем поворачивается против часовой стрелки, 3 раза.Проблема 2: Проверка шахматных досок
&
Опция устанавливает выход программы в1
случае , если совпадение найдено на все позиции, и в0
противном случае.^c
соответствует символу, которого нетc
, эквивалентно[^c]
регулярному выражению. В целом, программа означает: «Печать 1», если в каждой позиции в ограничивающем прямоугольнике ввода есть или то,#
которое не является ортогонально смежным с символом, который не является_
, или то,_
которое не является ортогонально смежным с символом, который является нет#
; в противном случае 0.источник
Класс Re2d, Python 2
Обновление: добавлена проблема "9. Выравнивание".
Мой подход заключается в использовании модуля Python re для поиска и сопоставления. Класс Re2d подготавливает текст для обработки, выполняет функции re и форматирует результаты для вывода.
Обратите внимание, что это не совсем новый язык - это стандартный язык регулярных выражений, проецируемый в 2 измерения с добавленными флагами для дополнительных 2D-режимов.
Класс имеет следующее использование:
Оба шаблона являются стандартными линейными текстовыми шаблонами RE. Если вертикальный шаблон не указан, класс также будет использовать горизонтальный шаблон для сопоставления по вертикали. Флаги являются стандартными RE-флагами с некоторыми 2D-расширениями.
тестирование
Метод поиска нашел шахматную фигуру и возвращает позицию с четырьмя кортежами. Кортеж имеет
x,y
позицию первого символа матча и область совпаденияwidth, height
. Дан только один шаблон, поэтому он будет использоваться для горизонтального и вертикального соответствия.Шахматная доска была проверена методом соответствия, который возвращает логическое значение. Обратите внимание , что
^
и$
начальная и конечные символы должны соответствовать всему тексту.Теперь мы используем
MULTIFIND
флаг, чтобы вернуть все возможные совпадения для блока из 2+ цифр. Метод находит 9 возможных совпадений. Обратите внимание, что они могут перекрываться.Этот тест показывает использование вертикального и горизонтального переворачивания. Это позволяет сопоставлять слова, которые являются обратными. Диагональные слова не поддерживаются.
MULTIFIND
Флаг позволяет использовать несколько матчей перекрывающихся во всех 4 -х направлениях. Метод findall использует поиск, чтобы найти соответствующие поля, а затем извлекает соответствующие блоки текста. Обратите внимание, что при поиске используются отрицательные значения ширины и / или высоты для совпадений в обратном направлении. Слова в вертикальном направлении имеют символы новой строки - это согласуется с концепцией блоков 2D-символов.Этот поиск требовал отдельных шаблонов для каждого измерения, так как минимальный размер различен для каждого.
Этот набор из 2 поисков находит 2 вертикальных и 2 горизонтальных совпадения, но не может найти встроенную
#.,#
строку.Здесь мы используем 2 поиска, чтобы найти совпадения в обоих направлениях. Он может найти несколько ортогональных совпадений, но этот подход не поддерживает диагональные совпадения.
Этот поиск находит первое совпадение.
Проблема с бриллиантами сложнее. Для трех размеров нужны три объекта поиска. Он может найти шесть алмазов в тестовом наборе, но он не масштабируется до бриллиантов переменного размера. Это только частичное решение алмазной проблемы.
Код Python 2
источник
Грайм , Хаскелл
Введение
Grime основан на булевых грамматиках . Основная идея состоит в том, чтобы создать прямоугольные шаблоны из меньших компонентов и проверить, найдены ли они во входной матрице. Пока что Grime поддерживает только прямоугольные совпадения и более или менее элегантно решает как минимум 11 задач.
РЕДАКТИРОВАТЬ: Исправлены кресты (спасибо DLosc за обнаружение ошибки), и добавил добычу алмазов.
EDIT2: добавлены классы персонажей, вдохновленные классами Slip. Также изменился синтаксис флагов опций, улучшен синтаксический анализатор выражений и добавлена проблема без Q.
EDIT3: Реализованы ограничения размера и добавлена проблема порталов Nether.
использование
Программа Grime называется грамматикой , и правильное расширение файла для грамматики
.gr
, хотя это не применяется. Грамматика оценивается какгде
matrixfile
файл, содержащий матрицу символов. Например, грамматика цифр будет оцениваться какДля дополнительной скорости я рекомендую компилировать файл с оптимизацией:
По умолчанию интерпретатор печатает первое найденное совпадение, но это можно контролировать с помощью флажков опции:
-e
: сопоставлять только всю матрицу, печатать1
для совпадения и0
без совпадения.-n
: вывести количество совпадений или всю матрицу, если-e
она также указана.-a
: распечатать все совпадения.-p
: также распечатать позиции матчей в формате(x,y,w,h)
.-s
: не печатайте сами спички.-d
: вывести отладочную информацию.Параметры также можно указать в грамматике, вставив их перед любой строкой и добавив запятую
,
(примеры приведены ниже).Синтаксис и семантика
Грамматика Грайма состоит из одного или нескольких определений , каждое на отдельной строке. Каждый из них определяет значение нетерминала , и один из них должен определять анонимный уровень для нетерминала . Синтаксис определения либо
N=E
илиE
, гдеN
это заглавная буква иE
является выражением .Выражения построены следующим образом.
\
соответствует любому1x1
прямоугольнику, содержащему этот символ..
соответствует любому отдельному символу.$
соответствует1x1
прямоугольнику вне матрицы символов._
соответствует любому прямоугольнику нулевой ширины или высоты.d
ИГИТ,u
ppercase,l
owercase,a
lphabetic, альфаn
umeric иs
ymbol.[a-prt-w,d-gu]
. Буквы слева включены, а справа - исключены, поэтому они точно соответствуют буквамabchijklmnoprtvw
. Если левая сторона пуста, она должна содержать все символы. Запятая может быть опущена, если правая сторона пуста. Символы[],-\
должны быть экранированы\
.P
иQ
являются выражениями, тоPQ
это просто их горизонтальная конкатенация иP/Q
вертикальная конкатенацияP
сверху.P+
один или несколькоP
s выровнены по горизонтали иP/+
одинаково выровнены по вертикали.P|Q
,P&Q
иP!
.P?
является сокращением дляP|_
,P*
дляP+|_
иP/*
дляP/+|_
.P#
соответствует любому прямоугольнику, который содержит совпадениеP
.P{a-b,c-d}
, Гдеabcd
неотрицательные целые числа, является ограничение размера наP
. ЕслиP
это символьный класс, то выражение соответствует любомуmxn
прямоугольнику, содержащему только те символы, при условии, чтоm
междуa
иb
включительно, иn
междуc
иd
включительно. В других случаях выражение соответствует любому прямоугольнику, который имеет правильный размер иP
также соответствует. Еслиa
илиc
опущены, они принимаются0
, и еслиb
илиd
опущены, они бесконечны. Если дефис междуa
иb
опущен, то мы используем одно и то же число для обоих концов интервала. Если весьc-d
часть опущена, обе оси ограничены. Чтобы уточнить,{-b}
эквивалентно{0-b,0-b}
и{a-,c}
эквивалентно{a-infinity,c-c}
.Примечания
Грайм допускает парадоксальные определения, например,
A=A!
с неопределенным поведением. Однако они не вызовут сбоев или бесконечных циклов.Grime поддерживает непрямоугольные входы; строки просто выровнены по левому краю, а промежутки можно сопоставить с помощью
$
.В будущем я хотел бы реализовать следующее:
.
могут соответствовать только1x1
прямоугольники. Пока он не найдет совпадение, он пробует все прямоугольники всех размеров по порядку, мгновенно терпя неудачу для каждого из них.Непрямоугольные совпадения с использованием контекстов , которые были бы полезны в задаче Boggle. Например,
Pv(Q>R)
означаетP
с нижним контекстом (Q
с правым контекстомR
). Это будет соответствовать L-образным образцамЗадачи
Дано примерно в порядке сложности.
Прямоугольник цифр
Это просто: прямоугольник с цифрами размером как минимум
2x2
.Нет д или в
Это почти так же просто, как первый; теперь у нас есть более ограниченный размер и пользовательский класс символов.
Горизонтальное и вертикальное выравнивание
Теперь у нас есть несколько сбежавших персонажей. По сути, это соответствует одному
#
, затем любому количеству любых символов#
, либо по горизонтали, либо по вертикали.Определить квадратные входы
Эта грамматика очень проста, она в основном определяет, что квадрат является либо
1x1
прямоугольником, либо меньшим квадратом с одним столбцом, прикрепленным к его правому краю, и одним рядом, прикрепленным к нижней части этого. Обратите внимание также наe
опцию перед нетерминалом верхнего уровня, которая включает полную проверку ввода.Поиск слова в поиске слова
Это ужасно, поскольку у Грайма нет операций по вращению или отражению. Это также очень медленно, так как Grime не знает , что матчи могут быть только размер
4x1
,1x4
или4x4
.Проблему планера можно решить аналогичным образом, но мне лень это записывать.
Порталы Пустоты
С оператором ограничения размера это не так сложно. Средняя часть
\.{2-22,3-22}
соответствует любому прямоугольнику.
правильных размеров, а затем мы просто добавляем столбцыX
s с обеих сторон и прикрепляем рядыX
s с игнорируемыми концами вверху и внизу.Соответствующие кресты
Здесь мы имеем соединение (логическое И) двух выражений. Нетерминал
E
соответствует непустому прямоугольнику.
s иF
непустому прямоугольнику#
s. Левая сторона соединения соответствует прямоугольникам типагде мы
EFE
на вершине, тоF
, а потом ещеEFE
раз. Правая сторона соответствует транспонированию этих, поэтому мы получаем именно кресты.Добыча алмазов
Нетерминал
C
- это сокращение для любого1xn
столбца. Верхняя половина алмаза совпадает сT
: это либо одинX
, либо другой,T
окруженный столбцом с обеих сторон, и ряд/[something]\
ниже этого.B
совпадает с нижней частью алмаза таким же образом, и нетерминал верхнего уровня - это просто ряд формыX[something]X
между верхней половиной и нижней половиной.В поисках шахматных досок
Правая сторона
[#_]{3-}
соответствует любому3x3
или большему прямоугольнику#
s и_
s, в то время как левая сторона гарантирует, что он не содержит двух соседних#
s или_
s.Проверочные шахматные доски
Это в основном то же самое, что и выше, за исключением того, что мы можем сопоставить любой непустой прямоугольник, но нужно использовать
e
флаг для полной проверки ввода.Проверьте синтаксис Prelude
Это, наверное, самая интересная грамматика на сегодняшний день. Нетерминал
A
соответствует любому столбцу, не содержащему(
или)
, иP
соответствует либо некоторому числуA
s, либо двум соответствующим скобкам, между которыми и вне которых большеP
s.источник
\#(.*|./*)\#
работать?#
слева, затем строка или столбец чего-либо, затем один#
справа». Мне нужно указать, что#
s вертикально соединены со столбцом с помощью косой черты/
.TMARL
Язык соответствия шаблонов и распознавания
Описание
Мой переводчик занимает 24K символов ( фрагменты кода занимают символы? ), Поэтому полное описание можно найти здесь .
Самое приятное: переводчик написан на Javascript, то есть вы можете попробовать его прямо здесь!
Показать фрагмент кода
И для проблем:
№ 1 - Поиск шахматных досок
&
добавляет поиски. G2 в конце получает третий элемент в элементе соответствия, фактическое соответствие. Первые 2 элемента - это координаты x и y (на основе 1, а не 0).№ 3 - Обнаружение прямоугольника цифр
Я думаю, что это довольно просто.
№ 4 - Поиск слова в поиске слов
S
Аргумент даже так , что он будет искать для всех вращений. Это больше чем 4, потому что это может тогда быть добавлено к следующему поиску (отдельные совпадения не могут быть добавлены).# 5 - Определить квадратные входы
Не уверен, что это полностью законно, поскольку он правильно определяет прямоугольность, только если вход является прямоугольником. Он сравнивает длину ввода
IL
с длиной первого рядаIG0L
и инвертирует ее.№ 6 - Найти планеры в игре жизни
Наконец, использование для зеркала!
№ 12 - Избегайте буквы Q
S1, потому что требуется только 1 совпадение.
Я сделаю некоторые из более сложных позже.
источник