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>
Odpowiedzi:
SnakeEx
Rozwiązuje problemy 15/16 do tej pory!
Tłumacz online ! - Pełna specyfikacja językowa - Źródło Javascript
Ideą tego języka jest zdefiniowanie „węży”, które poruszają się po znakach sprawdzających tekst przy użyciu składni przypominającej wyrażenia regularne.
Program w SnakeEx składa się z listy definicji węży wykorzystujących różne sekwencje poleceń. Węże mogą odradzać inne węże za pomocą tych definicji, i tam SnakeEx uzyskuje większość swojej mocy - możemy dopasowywać struktury rozgałęziające, a nawet rekurencję (patrz przykład Paren Matching).
Każdy program będzie zasadniczo wyglądał jak zbiór wyrażeń regularnych, ale z dodatkiem poleceń kierunkowych formy,
<dir>
które zmieniają kierunek węża, oraz wywoływania poleceń postaci,{label<dir>params}
które spawnują więcej węży.Jako punkt wejścia tłumacz interpretuje jednego węża, używając pierwszej definicji, przesuwając się w prawo.
Nie jest zbyt zwięzłe, ale jest bardzo potężne i (myślę) dość czytelne.
Aktualizacje
<!>
aby rozwiązać kolinear%{min,max}
Rozwiązania
15 rozwiązanych, 1 w toku
Możesz łatwo wypróbować te programy, korzystając z linku internetowego tłumaczonego powyżej!
Problem 1 - Znalezienie szachownicy
Aby uzyskać szczegółowe wprowadzenie, zacznij od problemu 3.
Problem 2 - Weryfikacja szachownic
Zakończenie węży odpowiednimi wężami za pomocą symbolu poza zakresem
$
jest jednym ze sposobów dopasowania programu do całego wejścia.Problem 3 - Wykryj prostokąt cyfr
Te
m
ruchy wąż porządku tarła o co najmniej 2 węży (%{2,}
to zamknięcie, czyli „2 do nieskończoności”) przy użyciu HD (cc
), i w ruchu w prawo (w<R>
), czy też w tym przypadku, ponieważ we wszystkich kierunkach są w stosunku do obecnego węża.A
Param jest cukier, który określa, że tylko wąż tarło powinien poruszać się po zakończeniu rozmowy.1
Parametrem jest jak ograniczyć wyniki do prostokątów - parametry numeryczne umieścić węży w „grupach”. Mecz się nie liczy, chyba że wszystkie węże w tej samej grupie przemierzą dokładnie tę samą odległość.Problem 4 - Znalezienie słowa w wyszukiwaniu słów
Polecenie kierunku
<*>
określa, że wąż powinien obracać się w dowolnym kierunku ukośnym lub ortogonalnym. Następnie szuka prostego wyrażenia regularnego.Problem 5 - Wykryj kwadratowe wejścia
Kluczem jest tutaj znak specjalny
$
, który pasuje tylko wtedy, gdy wąż jest poza boiskiem. Odradzamy węża poziomego i pionowego; każdy z nich spawnuje więcej węży, które biegną wzdłuż krawędzi, i wszystkie są w tej samej grupie i muszą być tej samej długości.Problem 6 - Znajdź szybowce w grze życia
m
rozpoczyna się w dowolnym z czterech ortogonalnych kierunków (<+>
), osiągając obrót. Następnie wygląda na lewo lub prawo na trzy rzędy w kolejności, osiągając odbicie.(Zauważ, że zastąpiłem spacje kropkami tylko dlatego, że pola tekstowe HTML użyte w moim tłumaczu wydają się robić głupie rzeczy, jeśli mają wiele spacji w rzędzie)
Problem 7 - Dopasuj portale Nether
Te
m
ruchy prawy wąż, tarła węża sprawdzić lewą krawędź, 2-22 węże sprawdzić środkowe kolumny, a na końcu węża, by sprawdzić prawą krawędź.~
Operator wskazuje, że cokolwiek następująco powinny być sprawdzane, ale nie powinny być oznakowane jako część rozwiązania.Ograniczone zamknięcia pozwalają nam teraz w pełni i poprawnie rozwiązać ten problem!
Problem 8 - Umieszczenie skrzyni Minecraft
Używamy tutaj logicznej not (
!
), która pasuje wtedy i tylko wtedy, gdy następujący token nie pasuje do niczego. Deklaracjad
wykrywa podwójną skrzynię w określonym kierunku, więc!{d<+>}
upewnij się, że nie ma podwójnych skrzyń w żadnym prostopadłym kierunku.s
przesuwa się małym diamentem wokół aktualnego kwadratu, sprawdzając, czy co najmniej 3 z tych pól są puste lub poza planszą. Trailing w\.
końcu pasuje do kwadratu, zakładając, że wszystkie poprzednie warunki się powiodły.Problem 9 - Wyrównanie w poziomie i pionie
Wąż
m
opcjonalnie skręca w prawo (<R>?
) przed dopasowaniem sekwencji..
jest symbolem wieloznacznym, podobnie jak w wyrażeniu regularnym.Problem 10 - Punkty kolinearne
Dzięki dodaniu
<!>
kierunku możemy rozwiązać to teraz!<!>
jest jak,<+>
ale zamiast rozgałęziać się w czterech kierunkach, rozgałęzia się we wszystkich możliwych kierunkach.Problem 12 - Unikaj litery Q
Po prostu spawnuje 4 węże, z których każdy szuka czterech znaków, które nie są literą Q.
Problem 13 - Wydobycie diamentów
Ten jest całkiem schludny.
m
spawnuje dwa węże, jeden w prawo, a drugi w prawo. Każdy z nich podąża za ciosami do X, a następnie spawnuje kolejnego węża pod kątem prostym do bieżącego kierunku, który podąża za ciosami do dolnego X.Problem 14 - Dopasowywanie krzyży
Oto pierwszy raz, kiedy
P
użyłem parametru iggyback. Zwykle węże są niezależne, ale jeśli wykonasz połączenie z tym parametrem, wąż wywołujący zostanie przeniesiony wraz z odbiorcą. Więce2
możemy sprawdzić sekwencję „.”, Następnie sekwencję „#”, a następnie kolejną sekwencję „.” I sprawić, by wszystkie były osobnymi wywołaniami, abyśmy mogli pogrupować je za pomocą „1,” 2 ”i„ 3 ” , zmuszając ich długości do dopasowania.Problem 15 - Dopasuj słowo na tablicy Boggle
Proste, jeśli trudne.
I
parametr określa rozróżnianie wielkości liter (możemy określić parametry zarówno w definicjach, jak i w wywołaniach). Wąż obraca się w dowolnym kierunku, pasuje do postaci, obraca się ponownie i tak dalej.To jest wersja znaków, których nie można ponownie użyć.
E
Parametr xclusive zabrania węża od dopasowania dowolnego znaku, który został już oznakowane, podobnie jak ślady śluzu feersum użytkownika.Problem 16 - Owinięcie krawędzi
Ten
W
parametr pozwala wężowi na zawijanie, gdy kończy się poza granicami. Mamy równieżH
iV
pozwalamy tylko na owijanie poziome lub pionowe.Extra - Solver Maze
Rozwiązuje labirynt ASCII, w którym podłoga jest pieszą.
<P>
Kierunku oznacza przodu, w lewo lub w prawo (na cukier[<F><L><R>]
).Extra - Paren Matching
Nie wiem jeszcze, jak zrobić Preludium, ale oto pierwszy krok! Tutaj używam
r
węża rekurencyjnie, aby dopasować odpowiedni nawias, sprawdzając, czy nie ma między nimi niepasującego nawiasu.Extra - Topologia ASCII: liczenie pętli
źródło
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 , tłumacz online )
Podobnie jak poddanie się feersum, opiera się ono również na przemierzaniu siatki, ale podobnie jak poddanie się CarpetPython, opiera się na wyrażeniu regularnym. Jakoś wygląda na to, że udało mi się zdobyć środek.
Istnieje wiele niezaimplementowanych funkcji, które chcę dodać, więc w stosownych przypadkach zanotowałem, co zamierzam zrobić, kiedy będę miał czas.
Aktualizacje
(Szczegółowe informacje na stronie Github)
5 kwietnia 2015 : Slip ma teraz tłumacza online ! Wciąż jest na wczesnym etapie, więc może być kilka błędów.
5 kwietnia 2015 : Aktualizacja wydajności! Teraz Nether znacznie szybciej portuje duże dane wejściowe (2 s). Wprowadzono także szereg zmian składniowych, więc sprawdź wiki. Naprawiono również numerację grup.
Poślizg ma wskaźnik dopasowania, który zaczyna się od określonego kwadratu i początkowo jest skierowany w prawo. Po dopasowaniu znaku wskaźnik przesuwa się do przodu w bieżącym kierunku (chociaż implementacja nie robi rzeczy dokładnie w tej kolejności).
Kierunek meczu wskazówka może być ustawiony na określonym kierunku z
^<digit>
, gdzie^0
,^1
,^2
, ...,^7
ustawiania wskaźnika N, NE, E, ..., NW odpowiednio (idąc do ruchu wskazówek zegara).Dostępne są również następujące skróty:
^*
sprawdza wszystkie 8 kierunków ortogonalnych lub ukośnych,^+
sprawdza wszystkie 4 kierunki ortogonalne.(Plan na przyszłość: Zezwól na ustalanie dowolnych kierunków, np.
(1, 2)
Na ruch rycerza)Na przykład ( Problem 4 - Znalezienie słowa podczas wyszukiwania słowa ),
wypróbowuje wszystkie 8 kierunków ortogonalnych lub ukośnych, szukając słowa „GOLF”. Domyślnie Slip wypróbowuje wszystkie możliwe kwadraty początkowe i zwraca jeden wynik z każdego z nich, odfiltrowując duplikaty, więc siatka taka jak
zwraca tylko górny i dolny wiersz jako pasujące (ponieważ górny i lewa kolumna „GOLF” zaczynają się od tego samego kwadratu). Aby uzyskać wszystkie dopasowania,
o
można użyć nakładającego się trybu dopasowania.Podobnie ( Problem 15 - Dopasuj słowo na tablicy Boggle ),
dopasowuje
panama
, próbując za każdym razem innego kierunku. Użyji
flagi, aby rozróżnić wielkość liter. Slip domyślnie używa znaków, ale można to przełączać za pomocąr
flagi no-repeat.(Plan na przyszłość: modyfikator trybu wyszukiwania, który automatycznie sprawdza zestawy wskazówek po każdym ruchu, dzięki czemu powtarzanie nie
^*
jest konieczne)Kierunek wskaźnika dopasowania można również obrócić o 90 stopni w lewo lub w prawo za pomocą
<
lub>
. Na przykład,szuka wzoru
patrząc w następującej kolejności:
To pozwala nam rozwiązać Problem 6 - Znalezienie szybowce z
gdzie części 1 i 2 kodują kształty szybowca, a części 3 i 4 kodują ich odbite odpowiedniki.
Zauważ, że Slip używa backsticka
`
do ucieczki. Wynika to z tego, że Slip ma inną formę ruchu, która nadaje nazwie język - polecenie slip./
przesuwa wskaźnik dopasowania prostopadle w lewo, natomiast\
przesuwa wskaźnik dopasowania prostopadle w prawo.Na przykład,
może być dopasowany przez
abc\def/ghi
.Chociaż nie jest szczególnie użyteczne samo w sobie, poślizg staje się ważniejszy w połączeniu z
(?| <regex> )
grupą stacjonarną, która działa jak pasujący wzrok. Wyrażenie regularne wewnątrz jest dopasowywane, a następnie na jego końcu pozycja i kierunek wskaźnika dopasowania są resetowane do stanu przed grupą stacjonarną.Na przykład,
można dopasować do
(?|abc)\(?|def)\(?|ghi)
.Podobnie problem 12 - Unikaj litery Q można rozwiązać
gdzie
%
jest polecenie antypoślizgowe, aby zatrzymać\
aktywację pierwszego .Slip ma również asercję długości
(?_(<group num>) <regex> )
, która pasuje do wyrażenia regularnego w środku tylko wtedy, gdy jego długość dopasowania jest taka sama jak długość danej grupy num.Na przykład problem 13 - Wydobycie diamentów można łatwo rozwiązać
który najpierw próbuje dopasować górną lewą stronę diamentu, a następnie zapewnia, że pozostałe trzy boki mają tę samą długość.
(Uruchom z
v
flagą dla pełnego wyjścia)Alternatywą dla golfistów jest
która dwukrotnie pasuje do pierwszej strony.
Wiele innych problemów można rozwiązać za pomocą poślizgu, grup stacjonarnych i stwierdzeń długości:
Problem 14 - Dopasowywanie krzyżyków:
Po uchwycić Szerokości
.
s i#
s w pierwszym rzędzie, to jest po prostu poślizgnięcia całą drogę w dół.Wynik:
Ten można prawdopodobnie zagrać w golfa z odrobiną rekurencji, gdy tylko rozwiążę kilka błędów.
Problem 3 - Wykryj prostokąt cyfr:
Dopasuj górny wiersz składający się z dwóch lub więcej cyfr, a następnie upewnij się, że każdy wiersz poniżej ma taką samą długość.
`d
jest predefiniowaną klasą znaków równoważną do[0-9]
.Zauważ, że znajdzie to wszystkie dopasowania .
Problem 7 - Dopasuj portale sieciowe:
które generuje, na przykład w oryginalnym wątku :
Wreszcie, niektóre inne funkcje Slip obejmują:
$0, $1, $2, ..., $7
zakotwicz krawędź północną, północno-wschodni narożnik, wschodnią krawędź itp.$+
zakotwicza dowolną krawędź i$*
zakotwicza dowolny narożnik.$
po którym następuje mała litera, ustawia kotwicę w bieżącej pozycji, którą później można dopasować,$
a następnie odpowiednią literą , np .$a
i$A
.#
przełącza flagę no-move, która zatrzymuje przesuwanie wskaźnika dopasowania do przodu po następnym meczu.,
dopasowuje znak podobny do znaku.
, ale nie dodaje go do wyniku, pozwalając na niesąsiadujące dopasowania, jednocześnie będąc rozpoznawalnym przez(?_())
.... i więcej. Na tej stronie jest naprawdę zbyt wiele do wypisania.
Inne problemy
Problem 1 - Znalezienie szachownicy:
Dwa problemy z szachownicą z pewnością nie są mocną stroną Slipa. Pasuje górny rząd następnie upewnić się, że przynajmniej długość 3 i zastępców między
#
i_
, następnie wsunąć i dopasować kolejne wiersze. Do końca$a
kotwica powinna znajdować się w prawym dolnym rogu szachownicy.Następnie skręcamy w lewo i powtarzamy dla kolumn, upewniając się, że pasujemy
$A
na końcu.Problem 2 - Weryfikacja szachownic:
Podobnie jak w poprzednim problemie, sprawdzamy, czy każdy wiersz jest poprawny, a następnie obracamy w lewo i robimy to samo dla kolumn. Kotwy służą do zapewnienia, że dopasowana jest tylko cała deska.
Problem 9 - Wyrównanie w poziomie i pionie:
Stosujemy opcjonalne? kwantyfikator do
>
polecenia obrotu, abyśmy mogli dopasować w prawo lub w dół. Znajdujemy wszystkie 5 w przykładzie zo
trybem nakładania się, ale tylko 4 bez niego odtąd#.,##
i#.,#
zaczynamy od tej samej pozycji.Problem 10 - Punkty współliniowe
Dopasuj
#
następnie niektóre znaki poziome i niektóre znaki pionowe, następnie powtarzaj do drugiego#
i powtarzaj do trzeciego#
.Problem 5 - Wykrywanie kwadratowych danych wejściowych:
Zakotwicz lewy górny róg i sprawdź, czy górna krawędź ma taką samą długość jak prawa krawędź, zanim zakotwicz prawy dolny róg. Jeśli dane wejściowe przejdą, przejdziemy w górę, aby dopasować całość danych wejściowych.
Problem 8 - Umieszczenie skrzyni Minecraft:
Biegnij z
p
flagą, aby uzyskać pozycje dla każdego meczu.$^
jest kotwicą, która pasuje, jeśli następny ruch wyrzuci wskaźnik dopasowania poza granice.Najpierw dopasowywania
.
, a następnie sprawdzić, że jesteśmy otoczeni przez trzy.
s / granice, to zapewnia, że czwarty otaczających plac jest także.
/ lub granica to pojedyncza klatka piersiowa (sprawdzając jego okoliczne kwadraty).Problem 11 - Sprawdź składnię Preludium :
Podjąłem kilka prób, ale myślę, że to prawda. Tutaj używamy rekurencji, która ma taką samą składnię jak PCRE.
To podejście wymaga, aby dane wejściowe były prostokątne, ale gdy już zrobię dopasowanie nieprostokątne, założenie to nie będzie konieczne.
Oto to samo podejście, gra w golfa z większą rekurencją:
Problem 16 - Owiń wokół krawędzi:
(Uwaga: opakowanie nie zostało jeszcze przekazane tłumaczowi online)
Wymaga to flagi zawijania
w
. Technicznie rzecz%
biorąc, początkowy brak poślizgu nie jest konieczny, ale wtedy mecz byłby liczony jako rozpoczynający się o jedno pole wyżej.Problem EX 1 - Rozwiązanie labiryntu:
Problem z komentarza BMac na czacie . Użyj
r
flagi dla trybu bez powtarzania, aby wskaźnik dopasowania nie zaciął się w przód iw tył.Problem EX 2 - Rozpoznawanie twarzy :
Pamiętaj, że dopasowuję tylko twarze, nie usuwając. Pamiętaj, że pytanie zawiera symbole euro, które będą musiały zostać zastąpione niektórymi drukowanymi kodami ASCII, aby działały.
źródło
PMA / Snails (C ++)
Widzę język jako ślimaki poruszające się po siatce i wykonujące polecenia. Ślimaki pozostawiają ślad śluzu na każdym kwadracie, na który się poruszają, co domyślnie powoduje, że kwadrat jest następnie niemożliwy do dopasowania. Dopasowanie zakończy się pomyślnie, jeśli osiągnięty zostanie koniec listy poleceń.
Teraz jest wystarczająco dużo operatorów, że będziemy potrzebować listy priorytetów, aby ich śledzić. Operacje są rozwiązywane w następującej kolejności:
( ) [ ]
|
`
jako jako grupa[m],[n]
in
= !
Tłumacz jest napisany w C ++. Abysmal kod źródłowy można znaleźć tutaj .
Problem 4: Wyszukiwanie słów
Program
wystarcza, aby uzyskać prawdziwą lub falsey wartość dla tego, czy słowo zostanie znalezione.
z
(jedno z 15 bezwzględnych lub względnych poleceń kierunkowych) odpowiada dowolnemu ośmioliniowemu kierunkowi. Wiele kolejnych poleceń kierunkowych jest ORedowanych razem. Na przykładruldy
byłoby prawie równoważnez
, ponieważ są to polecenia dla prawej, w górę, w lewo, w dół i w dowolnym kierunku po przekątnej. Jednak kierunki będą testowane w innej kolejności. Pierwszy dopasowany znak to zawsze ten, od którego zaczyna się ślimak, niezależnie od kierunku.\
<znak> pasuje do jednego literału.Domyślną strategią jest wypróbowanie wzorca na każdym kwadracie w obwiedni wyrównanego do lewej wejścia i wyprowadzenie liczby dopasowań. Jeśli wartość logiczna
1
lub0
jest wymagana, można użyć następującego programu:Jeśli w pliku źródłowym znajduje się co najmniej jedna nowa linia, pierwszy wiersz jest traktowany jako opcja wstępnej konwersji danych wejściowych na formę prostokątną. Te
?
odciski opcja 0 lub 1 w zależności od tego, czy istnieje dopasowanie wszędzie.Problem 15: Boggle
Po zaimplementowaniu przemiany można teraz rozwiązać Boggle. Lepiej byłoby użyć dopasowywania bez rozróżniania wielkości liter dla tego, ale implementacja nie jest moim najwyższym priorytetem.
|
działa dokładnie tak samo jak regex jednowymiarowy. Istnieją dwie pasujące pary ograniczników do grupowania, a mianowicie()
i{}
. Nawias zamykający zamyka wszystkie otwarte grupy przeciwnego typu, które stoją między nim a najbliższym tego samego typu. Na przykład następujące{({{)
: tylko grupa z lewej strony pozostaje otwarta. Jak widać, niedopasowane symbole grupujące na krawędziach są domyślnie zamknięte. Jest jeszcze jedno polecenie grupowania, do`
którego teraz nie wejdę.Problem 8: Skrzynie Minecraft
Program drukuje liczbę prawidłowych miejsc w klatce piersiowej. To była pierwsza gra w golfa i kilka razy zmniejszyłem liczbę bajtów (17).
\.
dopasowuje kropkę dosłownie w punkcie początkowym meczu.!(o\C)2
jest równoważne,!((o\C)2)
ponieważ kwantyfikacja ma wyższy priorytet niż twierdzenie.<atom> <number>
oznacza powtarzanie<atom>
dokładnie<number>
razy.o
obraca ślimaka w dowolnym prostopadłym kierunku.!
jest twierdzeniem negatywnym. Dlatego ta część sprawdza brak sąsiedniej podwójnej skrzyni.o
obraca się w jakimś ortogonalnym kierunku.(!\Cw)3
zapewnia, żeC
ślimaka nie ma, a następnie 3 razy obraca się w lewo.Problem 2: Weryfikacja szachownic
&
Opcja ustawia wyjście programu a1
jeśli uda mecz na wszystkich pozycjach, a0
inaczej.^c
dopasowuje znak, który nie jest, podobniec
jak[^c]
w wyrażeniu regularnym. Jako całość program oznacza: Wydrukuj 1, jeśli na każdej pozycji w ograniczającym prostokącie wejścia znajduje się albo taki,#
który nie jest ortogonalnie sąsiadujący ze znakiem, który nie jest_
, albo taki,_
który nie jest ortogonalnie sąsiadujący ze znakiem, który jest nie#
; w przeciwnym razie 0.źródło
Klasa Re2d, Python 2
Aktualizacja: dodano problem „9. Wyrównanie”.
Moje podejście polega na użyciu modułu ponownie Python do wyszukiwania i dopasowywania. Klasa Re2d przygotowuje tekst do przetworzenia, wykonuje funkcje re i formatuje wyniki do wydruku.
Pamiętaj, że nie jest to zupełnie nowy język - jest to standardowy język wyrażeń regularnych rzutowany na 2 wymiary z dodanymi flagami dla dodatkowych trybów 2D.
Klasa ma następujące zastosowanie:
Oba wzorce są standardowymi liniowymi wzorcami RE tekstu. Jeśli nie zostanie dostarczony wzór pionowy, klasa użyje wzoru poziomego do dopasowania również w pionie. Flagi są standardowymi flagami RE z niektórymi rozszerzeniami 2D.
Testowanie
Metoda wyszukiwania znalazła wzór szachownicy i zwraca pozycję 4-krotną. Krotka ma
x,y
pozycję pierwszego znaku dopasowania iwidth, height
dopasowanego obszaru. Podany jest tylko jeden wzór, więc będzie on używany do dopasowania poziomego i pionowego.Szachownica została zweryfikowana za pomocą metody dopasowania, która zwraca wartość logiczną. Należy pamiętać, że
^
i$
rozpocząć i znaki końcowe są wymagane, aby dopasować cały tekst.Teraz używamy
MULTIFIND
flagi, aby zwrócić wszystkie możliwe dopasowania dla bloku ponad 2-cyfrowego. Metoda znajduje 9 możliwych dopasowań. Pamiętaj, że mogą się one nakładać.Ten test pokazuje użycie przewracania w pionie i poziomie. Pozwala to na dopasowanie odwróconych słów. Przekątne słowa nie są obsługiwane.
MULTIFIND
Flaga pozwala wielu nakładających się mecze we wszystkich 4 kierunkach. Metoda findall używa funkcji wyszukiwania, aby znaleźć pasujące pola, a następnie wyodrębnia pasujące bloki tekstu. Zwróć uwagę, w jaki sposób wyszukiwanie używa ujemnej szerokości i / lub wysokości dla dopasowań w odwrotnym kierunku. Słowa w kierunku pionowym mają nowe znaki linii - jest to zgodne z koncepcją bloków znaków 2D.To wyszukiwanie wymagało osobnych wzorów dla każdego wymiaru, ponieważ minimalny rozmiar jest inny dla każdego wymiaru.
Ten zestaw 2 wyszukiwań znajduje 2 dopasowania pionowe i 2 poziome, ale nie może znaleźć osadzonego
#.,#
ciągu.Tutaj używamy 2 wyszukiwań, aby znaleźć dopasowania w obu kierunkach. Jest w stanie znaleźć wiele dopasowań ortogonalnych, ale to podejście nie obsługuje dopasowań po przekątnej.
To wyszukiwanie znajdzie pierwsze dopasowanie.
Problem z diamentami jest trudniejszy. Potrzebne są trzy obiekty wyszukiwania dla trzech rozmiarów. Może znaleźć sześć diamentów w zestawie testowym, ale nie skaluje się do diamentów o zmiennej wielkości. To tylko częściowe rozwiązanie problemu diamentów.
Kod Python 2
źródło
Grime , Haskell
Wprowadzenie
Grime opiera się na gramatyce boolowskiej . Podstawową ideą jest konstruowanie prostokątnych wzorów z mniejszych komponentów i sprawdzanie, czy znajdują się one w macierzy wejściowej. Do tej pory Grime obsługuje tylko dopasowania prostokątne i rozwiązuje co najmniej 11 problemów mniej lub bardziej elegancko.
EDYCJA: Naprawiono krzyże (dzięki DLosc za wykrycie błędu) i dodano wydobycie diamentów.
EDYCJA 2: Dodano klasy postaci, inspirowane klasami Slipa . Zmieniono również składnię flag opcji, poprawiono parser wyrażeń i dodano problem braku Q.
EDYCJA 3: Zaimplementowano ograniczenia rozmiaru i dodano problem z portalami Nether.
Stosowanie
Program Grime nazywa się gramatyką , a poprawnym rozszerzeniem pliku dla gramatyki jest
.gr
, chociaż nie jest to wymuszone. Gramatyka jest oceniana jakogdzie
matrixfile
jest plik zawierający matrycę znaków. Na przykład gramatyka cyfr byłaby oceniana jakoDla dodatkowej prędkości polecam kompilację pliku z optymalizacjami:
Domyślnie interpreter drukuje pierwsze znalezione dopasowanie, ale można to kontrolować za pomocą flag opcji:
-e
: dopasuj tylko całą matrycę, drukuj1
dla dopasowania i0
dla braku dopasowania.-n
: wydrukuj liczbę dopasowań lub całą macierz, jeśli-e
jest również podana.-a
: wydrukuj wszystkie dopasowania.-p
: wydrukuj także pozycje dopasowań, w formacie(x,y,w,h)
.-s
: nie drukuj samych dopasowań.-d
: wydrukuj informacje debugowania.Opcje można również określić w gramatyce, wstawiając je przed dowolnym wierszem i dodając przecinek
,
(przykłady poniżej).Składnia i semantyka
Gramatyka Grime składa się z jednej lub więcej definicji , każda w osobnej linii. Każdy z nich określa wartość nieterminala , a jeden z nich musi określać anonimowy nieterminal najwyższego poziomu . Składnia definicji to albo
N=E
alboE
, gdzieN
jest wielką literą iE
jest wyrażeniem .Wyrażenia są zbudowane w następujący sposób.
\
pasuje do dowolnego1x1
prostokąta zawierającego ten znak..
pasuje do dowolnego pojedynczego znaku.$
dopasowuje1x1
prostokąt poza matrycą znaków._
dopasowuje dowolny prostokąt o zerowej szerokości lub wysokości.d
igit,u
ppercase,l
owercase,a
lphabetic, alphan
umeric is
ymbol.[a-prt-w,d-gu]
. Litery po lewej są uwzględnione, a te po prawej są wykluczone, więc pasuje dokładnie do literabchijklmnoprtvw
. Jeśli lewa strona jest pusta, przyjmuje się, że zawiera wszystkie znaki. Przecinek można pominąć, jeśli prawa strona jest pusta. Postacie[],-\
muszą być oznaczone znakiem ucieczki\
.P
iQ
są wyrażeniami, toPQ
jest to po prostu ich konkatenacja pozioma iP/Q
ich konkatenacja pionowa zP
górą.P+
jest jedną lub więcejP
s wyrównane w poziomie, iP/+
jest takie samo wyrównane w pionie.P|Q
,P&Q
iP!
.P?
jest skrótem dlaP|_
,P*
dlaP+|_
iP/*
dlaP/+|_
.P#
pasuje do dowolnego prostokąta zawierającego dopasowanieP
.P{a-b,c-d}
, Gdzieabcd
są nieujemnymi liczbami całkowitymi, to ograniczenie wielkości naP
. JeśliP
jest klasą znaków, to wyrażenie pasuje do dowolnegomxn
prostokąta zawierającego tylko te znaki, pod warunkiem, żem
jest międzya
ib
włącznie, in
jest pomiędzyc
id
włącznie. W innych przypadkach wyrażenie pasuje do każdego prostokąta, który ma prawidłowy rozmiar i któryP
również pasuje. Jeślia
lubc
zostaną pominięte, uważa się je za0
, a jeślib
lubd
zostaną pominięte, są nieskończone. Jeśli łącznik międzya
ib
zostanie pominięty, wówczas użyjemy tej samej liczby dla obu końców przedziału. Jeśli całośćc-d
część jest pominięta, obie osie są ograniczone. Wyjaśnienie,{-b}
jest równoważne{0-b,0-b}
i{a-,c}
jest równoważne z{a-infinity,c-c}
.Notatki
Brud dopuszcza paradoksalne definicje, takie jak
A=A!
niezdefiniowane zachowanie. Nie powodują jednak awarii ani nieskończonych pętli.Brud obsługuje dane nieprostokątne; rzędy są po prostu wyrównane do lewej, a luki można dopasować za pomocą
$
.W przyszłości chciałbym wdrożyć następujące elementy:
.
można dopasować tylko1x1
prostokąty. Dopóki nie znajdzie dopasowania, wypróbowuje wszystkie prostokąty wszystkich rozmiarów w kolejności, natychmiast zawodząc dla każdego z nich.Nieprostokątne mecze z wykorzystaniem kontekstów , które byłyby pomocne w wyzwaniu na tablicy Boggle. Na przykład
Pv(Q>R)
oznaczaP
z dolnym kontekstem (Q
z prawym kontekstemR
). Pasowałoby do wzorów w kształcie litery L.Zadania
Podane z grubsza w kolejności złożoności.
Prostokąt cyfr
To proste: przynajmniej prostokąt cyfr co najmniej wielkości
2x2
.Brak q lub Q
Jest to prawie tak proste jak pierwsze; teraz mamy bardziej ograniczony rozmiar i niestandardową klasę postaci.
Poziome i pionowe wyrównanie
Teraz mamy kilka znaków ucieczki. Zasadniczo odpowiada to jednemu
#
, a następnie dowolnej liczbie dowolnych znaków, a następnie#
poziomo lub pionowo.Wykryj kwadratowe wejścia
Ta gramatyka jest bardzo prosta, w zasadzie definiuje, że kwadrat jest albo
1x1
prostokątem, albo mniejszym kwadratem z jedną kolumną przyczepioną do prawej krawędzi, a jeden wiersz przyczepioną do dolnej krawędzi. Zwróć także uwagę nae
opcję przed nieterminalem najwyższego poziomu, która przełącza weryfikację całego wejścia.Znajdowanie słowa w wyszukiwaniu słowa
To jest okropne, ponieważ Grime nie ma operacji rotacji ani refleksji. Jest również bardzo powolny, ponieważ Grime nie wie, że mecze mogą mieć tylko rozmiar
4x1
,1x4
lub4x4
.Problem szybowców można rozwiązać podobnie, ale jestem zbyt leniwy, żeby to zapisać.
Portale Nether
Z operatorem ograniczenia rozmiaru nie jest to takie trudne. Środkowa część
\.{2-22,3-22}
pasuje do dowolnego prostokąta o.
prawidłowych rozmiarach, a następnie dodajemy kolumnyX
s po obu stronach i sczepiamy rzędyX
s z ignorowanymi końcami na górze i na dole tego.Pasujące krzyże
To, co tu mamy, to połączenie (logiczne AND) dwóch wyrażeń. Nieterminalny
E
pasuje do niepustego prostokąta.
s iF
niepustego prostokąta#
s. Lewa strona koniunkcji odpowiada prostokątom tego typugdzie mamy
EFE
na górzeF
, a potemEFE
znowu. Prawa strona pasuje do ich transpozycji, więc otrzymujemy dokładnie krzyżyki.Wydobycie diamentów
Nieterminal
C
jest skrótem dla każdej1xn
kolumny. Górnej połowie diamentu odpowiadaT
: jest to albo pojedynczyX
, albo innyT
otoczony kolumną po obu stronach i rzędem/[something]\
poniżej.B
dopasowuje spód diamentu w ten sam sposób, a nieterminalX[something]X
najwyższego poziomu jest po prostu rzędem formy między górną połową a dolną połową.Znajdowanie szachownic
Bok prawy
[#_]{3-}
pasuje dowolny3x3
lub większy prostokąt#
S i_
S, natomiast gwarancje lewostronnej że nie zawiera dwóch sąsiednich#
s lub_
s.Weryfikacja szachownic
Jest to w zasadzie to samo co powyżej, z tym wyjątkiem, że możemy dopasować dowolny niepusty prostokąt, ale musimy użyć
e
flagi do całej weryfikacji danych wejściowych.Sprawdź składnię Preludium
To chyba najciekawsza jak dotąd gramatyka. Nieterminalny
A
pasuje do dowolnej kolumny niezawierającej(
lub)
, iP
pasuje do pewnej liczbyA
s lub dwóch dopasowanych nawiasów, pomiędzy i poza którymi jest więcejP
s.źródło
\#(.*|./*)\#
zadziała?#
po lewej, następnie wiersz lub kolumna czegokolwiek, a następnie jeden#
po prawej”. Muszę określić, że litery#
s są pionowo połączone z kolumną za pomocą ukośników/
.TMARL
Język dopasowywania i rozpoznawania szablonów
Opis
Mój tłumacz zajmuje 24 000 znaków ( fragmenty kodu zajmują znaki? ), Więc pełny opis można znaleźć tutaj .
Najlepsze jest to, że tłumacz jest w JavaScript, co oznacza, że możesz wypróbować go tutaj!
Pokaż fragment kodu
A dla problemów:
# 1 - Znajdowanie szachownic
&
dołącza wyszukiwania. G2 na końcu dostaje trzeci element w elemencie dopasowania, czyli rzeczywiste dopasowanie. Pierwsze 2 elementy to współrzędne xiy (oparte na 1, a nie 0).# 3 - Wykryj prostokąt cyfr
Myślę, że ten jest dość prosty.
# 4 - Znajdowanie słowa w wyszukiwaniu słów
S
Argument jest nawet tak, że będzie szukać wszystkich obrotów. Jest większy niż 4, ponieważ można go następnie dołączyć do następnego wyszukiwania (pojedynczych dopasowań nie można dołączyć).# 5 - Wykryj kwadratowe wejścia
Nie jestem pewien, czy jest to całkowicie legalne, ponieważ poprawnie określa prostokątność tylko wtedy, gdy wejście jest prostokątem. Porównuje długość danych wejściowych
IL
z długością pierwszego wierszaIG0L
i odwraca go.# 6 - Znajdź szybowce w grze życia
Wreszcie zastosowanie lustra!
# 12 - Unikaj litery Q
S1, ponieważ potrzebny jest tylko 1 mecz.
Zrobię kilka trudniejszych później.
źródło