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>
Respostas:
SnakeEx
Resolve 15/16 problemas até agora!
Intérprete Online ! - Especificações completas do idioma - Fonte Javascript
A idéia por trás dessa linguagem é definir 'serpentes' que se movem pelos caracteres de verificação de texto usando uma sintaxe do tipo regex.
Um programa no SnakeEx consiste em uma lista de definições para cobras usando diferentes seqüências de comandos. As cobras podem gerar outras cobras usando essas definições, e é aí que o SnakeEx obtém a maior parte de seu poder - podemos combinar estruturas de ramificação e até fazer recursão (veja o exemplo de Paren Matching).
Todo programa parecerá essencialmente um conjunto de expressões regulares, mas com a adição de comandos de direção da forma
<dir>
que mudam a direção da cobra e chamam comandos da forma{label<dir>params}
que gera mais cobras.Para um ponto de entrada, o intérprete cria uma cobra usando a primeira definição, movendo-se para a direita.
Não é muito conciso, mas é muito poderoso e (acho) bastante legível.
Atualizações
<!>
para resolver colinear%{min,max}
Soluções
15 resolvidos, 1 em andamento
Você pode experimentar esses programas facilmente usando o Intérprete on-line vinculado acima!
Problema 1 - Encontrando Tabuleiros de Xadrez
Para uma introdução detalhada, inicie no Problema 3.
Problema 2 - Verificando tabuleiros de xadrez
Reservar as cobras apropriadas com o símbolo fora dos limites
$
é uma maneira de fazer um programa corresponder apenas a toda a entrada.Problema 3 - Detectar um retângulo de dígitos
A
m
cobra se move para a direita, gerando no mínimo 2 cobras (%{2,}
é um fechamento que significa "2 ao infinito") usando a definição c (c
) e movendo para a direita (<R>
), ou melhor, neste caso, porque todas as direções são relativas à cobra atual. OA
parâmetro é o açúcar que apenas especifica que a cobra desova deve se mover após a chamada. O1
parâmetro é como restringimos as correspondências aos retângulos - os parâmetros numéricos colocam cobras em "grupos". Uma partida não conta, a menos que todas as cobras do mesmo grupo viajem exatamente à mesma distância.Problema 4 - Localizando uma palavra em uma pesquisa por palavra
O comando direction
<*>
especifica que a cobra deve girar em qualquer direção diagonal ou ortogonal. Em seguida, procura o regex simples.Problema 5 - Detectar entradas quadradas
A chave aqui é o caractere especial
$
, que só corresponde se a cobra estiver fora dos limites. Criamos uma cobra horizontal e uma vertical; cada uma dessas cria mais cobras enquanto corre ao longo da borda, e todas estão no mesmo grupo e devem ter o mesmo comprimento.Problema 6 - Encontre planadores em um jogo da vida
m
inicia em qualquer uma das quatro direções ortogonais (<+>
), obtendo rotação. Em seguida, ele parece esquerdo ou direito para as três linhas em ordem, alcançando reflexão.(Observe que substituí os espaços por pontos apenas porque as áreas de texto HTML usadas no meu intérprete parecem fazer coisas estúpidas se tiverem vários espaços seguidos)
Problema 7 - Coincidir com portais inferiores
A
m
cobra se move para a direita, gerando uma cobra para verificar a borda esquerda, 2-22 cobras para verificar as colunas do meio e, finalmente, uma cobra para verificar a borda direita. O~
operador indica que tudo o que se segue deve ser verificado, mas não deve ser marcado como parte da solução.Agora, os fechamentos limitados nos permitem resolver total e adequadamente esse problema!
Problema 8 - Colocação do baú do Minecraft
Aqui usamos um not (
!
) lógico , que corresponde se e somente se o token a seguir não corresponder a nada. A declaraçãod
detecta um baú duplo em uma direção específica, para!{d<+>}
garantir que não haja baús duplos em nenhuma direção ortogonal.s
se move em um pequeno diamante ao redor do quadrado atual, verificando se pelo menos três desses espaços estão vazios ou fora do tabuleiro. A trilha\.
finalmente coincide com a praça, assumindo que todas as condições anteriores foram bem-sucedidas.Problema 9 - Alinhamento Horizontal e Vertical
A cobra
m
opcionalmente vira à direita (<R>?
) antes de corresponder à sequência..
é um curinga, como no regex.Problema 10 - Pontos Colineares
Com a adição da
<!>
direção, podemos resolver isso agora!<!>
é como,<+>
mas em vez de se ramificar em quatro direções, se ramifica em todas as direções possíveis.Problema 12 - Evite a letra Q
Apenas gera 4 cobras, cada uma procurando por quatro caracteres que não são a letra Q.
Problema 13 - Mineração de diamantes
Essa é bem legal.
m
cria duas cobras, uma voltada para a direita e outra para a direita. Cada uma delas segue as barras até um X e depois cria outra cobra em ângulo reto com a direção atual, que segue as barras até o X inferior.Problema 14 - Correspondências cruzadas
Aqui está a primeira vez que usei o
P
parâmetro iggyback. Normalmente, as cobras são independentes, mas se você fizer uma chamada com esse parâmetro, a cobra chamadora será movida com o chamado. Assim,e2
podemos verificar uma sequência de '.', Depois uma sequência de '#', depois outra sequência de '.', E fazer com que todas sejam chamadas separadas para que possamos agrupá-las com '1,' 2 'e' 3 ' , forçando seus comprimentos a corresponderem.Problema 15 - Combine uma palavra em uma placa Boggle
Simples, se prolixo.
I
O parâmetro especifica distinção entre maiúsculas e minúsculas (podemos especificar parâmetros nas definições e nas chamadas). A cobra vira em qualquer direção, combina com o personagem, vira novamente e assim por diante.Esta é a versão sem caracteres reutilizáveis. O
E
parâmetro xclusive proíbe a cobra de combinar qualquer caractere que já tenha sido marcado, como as trilhas de lodo de feersum.Problema 16 - Enrole as bordas
O
W
parâmetro permite que a cobra envolva quando estiver fora dos limites. Também temosH
eV
permitimos apenas o empacotamento horizontal ou vertical.Extra - Maze Solver
Resolve um labirinto ASCII em que o piso percorrível é períodos. A
<P>
direção significa avançar, esquerda ou direita (açúcar para[<F><L><R>]
).Correspondência Extra - Paren
Ainda não descobrimos como fazer o Prelude, mas aqui está o primeiro passo! Aqui eu uso a
r
cobra recursivamente para combinar os parênteses correspondentes, verificando se não há parênteses incomparáveis entre eles.Topologia ASCII extra : contando loops
fonte
m:{a<>}
a:[({n<R>A})({n<R>A}*{l<R>A}{a<>P}{r<R>A})]*{n<R>A}*
l:$[^\(\)]*\([^\(\)]*$
r:$[^\(\)]*\)[^\(\)]*$
n:$[^\(\)]+$
Slip, Python 3.4 ( wiki do Github , intérprete on-line )
Assim como a submissão do feersum, isso também se baseia em percorrer a grade, mas, como a submissão do CarpetPython, isso se baseia no regex. De alguma forma, parece que eu consegui tomar o meio termo.
Há muitos recursos não implementados que quero adicionar; portanto, quando relevante, observei o que pretendo fazer quando tiver tempo.
Atualizações
(Veja a página do Github para notícias detalhadas)
5 de abril de 2015 : o Slip agora tem um intérprete online ! Ainda está em seus estágios iniciais, então pode haver alguns bugs.
5 de abril de 2015 : atualização de eficiência! Agora os portais inferiores introduzem muito mais rapidamente (2s). Também houve várias alterações de sintaxe, portanto, verifique o wiki. A numeração do grupo também foi corrigida.
O deslizamento tem um ponteiro de partida que começa em um quadrado específico e está inicialmente voltado para a direita. Quando um caractere é correspondido, o ponteiro se move para frente na direção atual (embora a implementação não faça as coisas exatamente nessa ordem).
A direção do ponteiro jogo pode ser ajustado para uma determinada direção com
^<digit>
, onde^0
,^1
,^2
, ...,^7
definir o ponteiro para N, NE, E, ..., NW, respectivamente (no sentido horário indo).Os seguintes atalhos também estão disponíveis:
^*
verifica todas as 8 direções ortogonais ou diagonais,^+
verifica todas as quatro direções ortogonais.(Plano futuro: permita o estabelecimento de direções arbitrárias, por exemplo,
(1, 2)
para a movimentação do cavaleiro)Por exemplo ( Problema 4 - Localizando uma palavra em uma pesquisa por palavra ),
tenta todas as 8 direções ortogonais ou diagonais, procurando a palavra "GOLFE". Por padrão, o Slip tenta todos os quadrados iniciais possíveis e retorna um resultado de cada um, filtrando duplicatas, de modo que uma grade como
retorna apenas a linha superior e a linha inferior como correspondências (uma vez que a linha superior e a coluna esquerda "GOLF" começam no mesmo quadrado). Para obter todas as correspondências, o
o
modo de correspondência sobreposta pode ser usado.Da mesma forma ( Problema 15 - Combine uma palavra em um quadro do Boggle ),
combina
panama
tentando uma direção diferente a cada vez. Use oi
sinalizador para diferenciar maiúsculas de minúsculas. Slip reutiliza caracteres por padrão, mas isso pode ser alternado com or
sinalizador de não repetição.(Plano futuro: um modificador de modo de pesquisa que verifica automaticamente conjuntos de direções após cada movimento para que a repetição
^*
seja desnecessária)A direção do ponteiro da partida também pode ser girada 90 graus para a esquerda ou direita com
<
ou>
respectivamente. Por exemplo,procura o padrão
olhando na seguinte ordem:
Isso nos permite resolver o Problema 6 - Encontrar planadores com
em que as partes 1 e 2 codificam as formas do planador e as partes 3 e 4 codificam suas contrapartes refletidas.
Observe que o Slip usa backtick
`
para escapar. Isso ocorre porque o Slip tem outra forma de movimento que dá nome ao idioma - o comando slip./
desliza o ponteiro da partida ortogonalmente para a esquerda, enquanto\
desliza o ponteiro da partida ortogonalmente para a direita.Por exemplo,
pode ser correspondido por
abc\def/ghi
.Embora não seja particularmente útil por si só, o escorregamento se torna mais importante quando combinado com o
(?| <regex> )
grupo estacionário, que age como um lookahead correspondente. A regex interna é correspondida e, no final, a posição e a direção do ponteiro da correspondência são redefinidas para o estado antes do grupo estacionário.Por exemplo,
pode ser combinado com
(?|abc)\(?|def)\(?|ghi)
.Da mesma forma, Problema 12 - Evite que a letra Q possa ser resolvida com
onde
%
é um comando antiderrapante para impedir a\
ativação do primeiro .O deslizamento também possui uma declaração de comprimento
(?_(<group num>) <regex> )
, que só corresponde à regex interna se o comprimento da correspondência for o mesmo que o do número de grupo especificado.Por exemplo, o Problema 13 - Mineração de diamantes pode ser facilmente resolvido com
que tenta corresponder primeiro ao lado esquerdo superior do diamante e depois afirma que os outros três lados têm o mesmo comprimento.
(Execute com
v
sinalizador para saída detalhada)Uma alternativa golfista é
que corresponde ao primeiro lado duas vezes.
Muitos dos outros problemas podem ser resolvidos usando escorregões, grupos estacionários e declarações de comprimento:
Problema 14 - Cruzamentos correspondentes:
Uma vez que você capturar as larguras das
.
s e#
s na primeira linha, é só escorregar todo o caminho.Resultado:
Provavelmente, este pode ser jogado com um pouco de recursão, uma vez que eu resolvo alguns bugs.
Problema 3 - Detecte um retângulo de dígitos:
Combine uma linha superior de dois ou mais dígitos e verifique se todas as linhas abaixo têm o mesmo comprimento.
`d
é uma classe de caracteres predefinida equivalente a[0-9]
.Observe que isso encontra todas as correspondências .
Problema 7 - Coincidir com portais inferiores:
quais saídas, para o exemplo principal no encadeamento original :
Finalmente, alguns outros recursos do Slip incluem:
$0, $1, $2, ..., $7
ancore a borda norte, o canto nordeste, a borda leste, etc.$+
ancore qualquer borda e$*
ancore qualquer canto.$
seguido por um caractere minúsculo define uma âncora na posição atual, que pode ser correspondida posteriormente$
seguida pelo caractere maiúsculo correspondente, por exemplo,$a
e$A
.#
alterna o sinalizador sem movimento, o que impede o ponteiro da partida de avançar após a próxima partida.,
corresponde a um caractere como.
, mas não o adiciona à saída, permitindo correspondências não contíguas enquanto pode ser reconhecido por(?_())
.... e mais. Há realmente muitos para listar nesta página.
Outros problemas
Problema 1 - Encontrar tabuleiros de xadrez:
Os dois problemas do tabuleiro de xadrez certamente não são o forte de Slip. Combinamos a linha superior
#
e_
, em seguida, garantimos que ela tenha pelo menos o comprimento 3 e alterne entre e , em seguida, deslize e combine as linhas subseqüentes. No final, a$a
âncora deve estar no canto inferior direito do tabuleiro de xadrez.Em seguida, vire à esquerda e repita para as colunas, certificando-se de que correspondemos
$A
no final.Problema 2 - Verificando tabuleiros de xadrez:
Como no problema anterior, verificamos se cada linha está correta, depois giramos para a esquerda e fazemos o mesmo para as colunas. As âncoras são usadas para garantir que apenas toda a placa seja correspondida.
Problema 9 - Alinhamento horizontal e vertical:
Nós aplicamos o opcional? quantificador para o
>
comando rotate, para que correspondamos à direita ou para baixo. Encontramos todos os 5 no exemplo com oo
modo de sobreposição, mas apenas 4 sem ele desde então#.,##
e#.,#
partimos da mesma posição.Problema 10 - Pontos colineares
Faça a correspondência de
#
alguns caracteres horizontais e verticais, depois repita até o segundo#
e repita até o terceiro#
.Problema 5 - Detectando entradas quadradas:
Ancore o canto superior esquerdo e verifique se a borda superior tem o mesmo comprimento que a borda direita, antes de ancorar o canto inferior direito. Se a entrada passar por isso, subimos para trás para corresponder a toda a entrada.
Problema 8 - Colocação do baú do Minecraft:
Corra com a
p
bandeira para obter as posições de cada partida.$^
é uma âncora que corresponde se o próximo movimento colocar o ponteiro da correspondência fora dos limites.Primeiro, combinamos com a
.
, depois verificamos que estamos cercados por três.
s / limites e, em seguida, certificamo-nos de que o quarto quadrado circundante também seja um.
/ limite ou seja um único baú (verificando seus quadrados circundantes).Problema 11 - Verifique a sintaxe do Prelude :
Tomou algumas tentativas, mas acho que esta é correta. Aqui usamos recursão, que tem a mesma sintaxe que PCRE.
Essa abordagem exige que a entrada seja retangular, mas assim que eu fizer uma correspondência não retangular, essa suposição não será necessária.
Aqui está a mesma abordagem, com mais recursão:
Problema 16 - Enrole as bordas:
(Nota: o agrupamento ainda não foi enviado ao intérprete on-line)
Isso requer o sinalizador de quebra automática
w
. Tecnicamente, a inicial%
para o derrapagem não é necessária, mas a partida será contada como começando a partir de um quadrado mais alto.Problema EX 1 - Solucionador de labirinto:
Problema do comentário do BMac no chat . Use a
r
bandeira para o modo sem repetição, para que o ponteiro da partida não fique preso indo e voltando.Problema EX 2 - Reconhecimento facial :
Observe que estou apenas combinando rostos, não fazendo nenhuma limpeza. Observe que a pergunta contém símbolos de euro, que precisarão ser substituídos por alguns ASCII imprimíveis para funcionar.
fonte
PMA / Caracóis (C ++)
Eu imagino a linguagem como caracóis se movendo em uma grade e executando comandos. Os caracóis deixam um rastro de lodo em cada quadrado em que se movem, o que, por padrão, faz com que o quadrado seja subsequentemente incomparável. Uma correspondência será bem-sucedida se o final da lista de comandos for alcançado.
Agora, existem operadores suficientes que precisaremos de uma lista de precedências para acompanhá-los. As operações são resolvidas na seguinte ordem:
( ) [ ]
|
`
um grupo[m],[n]
en
= !
O intérprete é escrito em C ++. O código-fonte abismal pode ser encontrado aqui .
Problema 4: Pesquisa de Palavras
O programa
é suficiente para obter um valor de verdade ou falsey para saber se a palavra é encontrada.
z
(um dos 15 comandos direcionais absolutos ou relativos) corresponde em qualquer direção octilinear. Vários comandos de direção consecutivos são ORed juntos. Por exemplo,ruldy
seria quase equivalente az
, pois esses são os comandos para a direita, para cima, para a esquerda, para baixo e para qualquer direção diagonal. No entanto, as instruções seriam testadas em uma ordem diferente. O primeiro caractere correspondente é sempre aquele em que o caracol começa, independentemente da direção.\
<caractere> corresponde a um único caractere literal.A estratégia padrão é tentar o padrão em todos os quadrados na caixa delimitadora da entrada justificada à esquerda e gerar o número de correspondências. Se um valor booleano
1
ou0
for necessário, o seguinte programa pode ser usado:Se houver pelo menos uma nova linha no arquivo de origem, a primeira linha será tratada como opções para a conversão inicial da entrada em um formato retangular. A
?
opção imprime 0 ou 1, dependendo se há uma correspondência em qualquer lugar.Problema 15: Boggle
Após implementar a alternância, agora é possível resolver o Boggle. Seria melhor usar a correspondência sem distinção entre maiúsculas e minúsculas para esse, mas implementar essa não é minha maior prioridade.
|
funciona exatamente da mesma forma que uma regex unidimensional. Existem dois pares correspondentes de delimitadores para agrupamento, a saber,()
e{}
. Um colchete de fechamento fechará quaisquer grupos abertos do tipo oposto que ficarem entre ele e o mais próximo do mesmo tipo. Por exemplo, a seguir{({{)
, apenas o grupo mais à esquerda permanece aberto. Como você pode ver, símbolos de agrupamento incomparáveis nas bordas estão implicitamente fechados. Há outro comando de agrupamento no`
qual não entrarei agora.Problema 8: Baús do Minecraft
O programa imprime o número de canais válidos no peito. Este foi o primeiro que eu realmente tive que jogar golfe e reduzi minha contagem de bytes (17) algumas vezes.
\.
corresponde a um ponto literalmente, no ponto de partida da partida.!(o\C)2
é equivalente a!((o\C)2)
quantificação ter maior precedência que asserção.<atom> <number>
significa repetir<atom>
exatamente os<number>
tempos.o
gira o caracol em qualquer direção ortogonal.!
é uma afirmação negativa. Assim, esta parte verifica a ausência de um baú duplo adjacente.o
gira em alguma direção ortogonal.(!\Cw)3
afirma que não háC
na frente do caracol e depois gira no sentido anti-horário, três vezes.Problema 2: Verificando Tabuleiros de Xadrez
A
&
opção define a saída do programa como1
se a correspondência tivesse êxito em todas as posições e0
caso contrário.^c
corresponde a um caractere que não éc
, equivalente a[^c]
em regex. Como um todo, o programa significa: Imprima 1 se, em todas as posições do retângulo delimitador da entrada, houver um#
que não seja ortogonalmente adjacente a um caractere que não seja_
ou_
que não seja ortogonalmente adjacente a um caractere que seja não#
; caso contrário, 0.fonte
A classe Re2d, Python 2
Atualização: adicionado o problema "9. Alinhamento".
Minha abordagem é usar o módulo re Python para fazer a pesquisa e correspondência. A classe Re2d prepara o texto para processamento, executa as funções re e formata os resultados para saída.
Observe que este não é um idioma totalmente novo - é o idioma de expressão regular padrão projetado em 2 dimensões com sinalizadores adicionais para modos 2D adicionais.
A classe tem o seguinte uso:
Ambos os padrões são padrões RE de texto linear padrão. Se um padrão vertical não for fornecido, a classe usará o padrão horizontal para fazer a correspondência vertical também. Os sinalizadores são os sinalizadores RE padrão com algumas extensões 2D.
Testando
O método de busca encontrou um padrão de tabuleiro de xadrez e retorna uma posição de quatro tuplas. A tupla tem a
x,y
posição do primeiro caractere da partida ewidth, height
a área correspondente. Somente um padrão é fornecido e, portanto, será usado para correspondência horizontal e vertical.O tabuleiro de xadrez foi verificado com o método match, que retorna um valor booleano. Note que o
^
e$
iniciar e caracteres finais são obrigados a corresponder ao todo texto.Agora usamos o
MULTIFIND
sinalizador para retornar todas as correspondências possíveis para o bloco de 2 ou mais dígitos. O método encontra 9 correspondências possíveis. Observe que eles podem se sobrepor.Este teste mostra o uso de inversão vertical e horizontal. Isso permite que as palavras correspondentes sejam revertidas. Palavras diagonais não são suportadas. O
MULTIFIND
sinalizador permite várias correspondências sobrepostas nas 4 direções. O método findall usa a pesquisa para encontrar as caixas correspondentes e extrai os blocos de texto correspondentes. Observe como a pesquisa usa largura e / ou altura negativas para correspondências na direção reversa. As palavras na direção vertical têm novos caracteres de linha - isso é consistente com o conceito de blocos de caracteres 2D.Essa pesquisa precisava de padrões separados para cada dimensão, pois o tamanho mínimo é diferente para cada uma.
Este conjunto de 2 pesquisas localiza 2 correspondências verticais e 2 horizontais, mas não consegue encontrar a
#.,#
sequência incorporada .Aqui usamos 2 pesquisas para encontrar correspondências nas duas direções. É capaz de encontrar várias correspondências ortogonais, mas essa abordagem não suporta correspondências diagonais.
Esta pesquisa encontra a primeira correspondência.
O problema do diamante é mais difícil. Três objetos de pesquisa são necessários para os três tamanhos. Ele pode encontrar os seis diamantes no conjunto de teste, mas não é dimensionado para diamantes de tamanho variável. Esta é apenas uma solução parcial para o problema do diamante.
Código Python 2
fonte
Grime , Haskell
Introdução
O Grime é baseado em gramáticas booleanas . A idéia básica é construir padrões retangulares a partir de componentes menores e verificar se eles são encontrados na matriz de entrada. Até agora, o Grime suporta apenas correspondências retangulares e resolve pelo menos 11 problemas com mais ou menos elegância.
EDIT: Corrigido os cruzamentos (graças ao DLosc por detectar o bug) e adicionado mineração de diamantes.
EDIT2: Adicionadas classes de personagens, inspiradas nas de Slip. Também alterou a sintaxe dos sinalizadores de opção, melhorou o analisador de expressão e adicionou o problema não-Q.
EDIT3: Implementou restrições de tamanho e adicionou o problema dos portais Nether.
Uso
Um programa Grime é chamado de gramática , e a extensão de arquivo correta para uma gramática é
.gr
, embora isso não seja imposto. A gramática é avaliada comoonde
matrixfile
é um arquivo que contém a matriz de caracteres. Por exemplo, a gramática de dígitos seria avaliada comoPara uma velocidade extra, recomendo compilar o arquivo com otimizações:
Por padrão, o intérprete imprime a primeira correspondência encontrada, mas isso pode ser controlado usando os sinalizadores de opção:
-e
: corresponde apenas a matriz inteira, imprime1
para correspondência e0
para não correspondência.-n
: imprime o número de correspondências ou a matriz inteira, se-e
também for fornecida.-a
: imprime todas as correspondências.-p
: imprime também as posições das correspondências, no formato(x,y,w,h)
.-s
: não imprime as correspondências.-d
: imprime informações de depuração.As opções também podem ser especificadas na gramática, inserindo-as antes de qualquer linha e adicionando uma vírgula
,
(veja exemplos abaixo).Sintaxe e Semântica
Uma gramática do Grime consiste em uma ou mais definições , cada uma em uma linha separada. Cada um deles define o valor de um não - terminal e um deles deve definir o não-terminal anônimo de nível superior . A sintaxe de uma definição é
N=E
ouE
, ondeN
é uma letra maiúscula eE
é uma expressão .Expressões são construídas da seguinte maneira.
\
corresponde a qualquer1x1
retângulo que contenha esse caractere..
corresponde a qualquer caractere único.$
corresponde a um1x1
retângulo fora da matriz de caracteres._
corresponde a qualquer retângulo com largura ou altura zero.d
igit,u
ppercase,l
owercase,a
lphabetic, alfan
umérico es
símbolo.[a-prt-w,d-gu]
. As letras à esquerda estão incluídas e as da direita são excluídas, portanto, isso corresponde exatamente às letrasabchijklmnoprtvw
. Se o lado esquerdo estiver vazio, é usado para conter todos os caracteres. A vírgula pode ser omitida se o lado direito estiver vazio. Os caracteres[],-\
devem ser escapados com\
.P
eQ
são expressões, entãoPQ
é apenas a concatenação horizontal eP/Q
a concatenação vertical, comP
no topo.P+
é um ou maisP
s alinhados horizontalmente eP/+
é o mesmo alinhado verticalmente.P|Q
,P&Q
eP!
.P?
é uma abreviação de paraP|_
,P*
paraP+|_
eP/*
paraP/+|_
.P#
corresponde a qualquer retângulo que contenha uma correspondência deP
.P{a-b,c-d}
, Ondeabcd
são inteiros não negativos, é uma restrição tamanho naP
. SeP
for uma classe de caracteres, a expressão corresponderá a qualquermxn
retângulo que contenha apenas esses caracteres, desde quem
entrea
eb
inclusive, en
entrec
ed
inclusive. Em outros casos, a expressão corresponde a qualquer retângulo que tenha o tamanho correto e queP
também corresponda. Sea
ouc
são omitidos, eles são considerados0
e seb
oud
são omitidos, são infinitos. Se o hífen entrea
eb
for omitido, usamos o mesmo número para as duas extremidades do intervalo. Se todo oc-d
parte é omitida, ambos os eixos são restritos. Para esclarecer,{-b}
é equivalente a{0-b,0-b}
e{a-,c}
é equivalente a{a-infinity,c-c}
.Notas
O Grime permite definições paradoxais, como
A=A!
no comportamento indefinido. No entanto, eles não causarão falhas ou loops infinitos.O Grime suporta entradas não retangulares; as linhas são simplesmente alinhadas à esquerda e as lacunas podem ser correspondidas usando
$
.No futuro, gostaria de implementar o seguinte:
.
só pode corresponder a1x1
retângulos. Até encontrar uma correspondência, ele tenta todos os retângulos de todos os tamanhos em ordem, falhando instantaneamente para cada um deles.Correspondências não retangulares usando contextos , o que seria útil no desafio do quadro Boggle. Por exemplo,
Pv(Q>R)
significaP
com contexto inferior (Q
com contexto corretoR
). Combinaria com os padrões em forma de LAs tarefas
Dado aproximadamente em ordem de complexidade.
Retângulo de dígitos
Isso é simples: pelo menos um retângulo de dígitos de tamanho
2x2
.Não q ou Q
Isso é quase tão simples quanto o primeiro; agora temos um tamanho mais restrito e uma classe de caracteres personalizada.
Alinhamento horizontal e vertical
Agora temos alguns caracteres escapados. Basicamente, isso corresponde a um
#
, a qualquer número de caracteres e#
, na horizontal ou na vertical.Detectar entradas quadradas
Essa gramática é muito simples, ela basicamente define que um quadrado é um
1x1
retângulo ou um quadrado menor com uma coluna alinhada na borda direita e uma linha alinhada na parte inferior. Observe também ae
opção antes do nível não-terminal de nível superior, que alterna a verificação de entrada inteira.Localizando uma palavra em uma pesquisa por palavra
Essa é horrível, já que Grime não tem operações de rotação ou reflexão. Também é extremamente lento, uma vez que Grime não sabe que os jogos só pode ser de tamanho
4x1
,1x4
ou4x4
.O problema do planador poderia ser resolvido da mesma forma, mas tenho preguiça de anotá-lo.
Portais inferiores
Com o operador de restrição de tamanho, este não é tão difícil. A parte do meio
\.{2-22,3-22}
corresponde a qualquer retângulo dos.
tamanhos corretos e, em seguida, apenas adicionamos colunas deX
s em ambos os lados e alinhavamos linhas deX
s com extremidades ignoradas na parte superior e inferior do mesmo.Cruzamentos correspondentes
O que temos aqui é uma conjunção (AND lógico) de duas expressões. O não terminal
E
corresponde a um retângulo não vazio de.
s eF
um retângulo não vazio de#
s. O lado esquerdo da conjunção corresponde a retângulos do tipoonde nós temos
EFE
no topo, entãoF
eEFE
novamente. O lado direito corresponde às transposições dessas, então obtemos exatamente as cruzes.Mineração de diamantes
O não
C
- terminal é uma abreviação para qualquer1xn
coluna. A metade superior de um diamante corresponde aT
: é um únicoX
ou outroT
cercado por uma coluna de ambos os lados e uma linha/[something]\
abaixo .B
coincide com o fundo de um diamante da mesma maneira, e o não-terminal de nível superior é apenas uma linha do formulárioX[something]X
entre a metade superior e a metade inferior.Encontrar tabuleiros de xadrez
O lado direito
[#_]{3-}
corresponde a um3x3
ou mais retângulos de#
s e_
s, enquanto o lado esquerdo garante que ele não contém dois#
s ou s_
.Verificando tabuleiros de xadrez
É basicamente o mesmo que acima, exceto que podemos corresponder a qualquer retângulo não vazio, mas precisamos usar o
e
sinalizador para verificação de entrada inteira.Verificar sintaxe do prelúdio
Esta é provavelmente a gramática mais interessante até agora. O não terminal
A
corresponde a qualquer coluna que não contenha(
ou)
eP
corresponde a algum número deA
s ou dois parênteses correspondentes, entre e fora dos quais existem maisP
s.fonte
\#(.*|./*)\#
?#
à esquerda, depois uma linha ou coluna de qualquer coisa, depois um#
à direita". Eu preciso especificar que os#
s são verticalmente concatenados para a coluna usando as barras/
.TMARL
Idioma de correspondência e reconhecimento de modelos
Descrição
Meu intérprete ocupa caracteres de 24K ( trechos de código ocupam caracteres? ), Portanto, a descrição completa pode ser encontrada aqui .
A melhor parte: o intérprete está em Javascript, o que significa que você pode experimentá-lo aqui!
Mostrar snippet de código
E para os problemas:
# 1 - Encontrar tabuleiros de xadrez
&
anexa pesquisas. O G2 no final obtém o terceiro elemento em um elemento de correspondência, a correspondência real. Os 2 primeiros elementos são coordenadas xey (com base em 1, e não em 0).# 3 - Detectar um retângulo de dígitos
Eu acho que esse é bem direto.
# 4 - Encontrando uma palavra em uma pesquisa por palavra
o
S
argumento é uniforme para que ele procure todas as rotações. É maior que 4 porque pode ser anexado à próxima pesquisa (correspondências individuais não podem ser anexadas).# 5 - Detectar entradas quadradas
Não tenho certeza se isso é completamente legal, pois ele determina apenas a quadratura corretamente se a entrada for um retângulo. Ele compara o comprimento da entrada
IL
com o comprimento da primeira linhaIG0L
e a inverte.# 6 - Encontre planadores em um jogo da vida
Finalmente, um uso para espelho!
# 12 - Evite a letra Q
S1 porque apenas 1 correspondência é necessária.
Farei alguns dos mais difíceis mais tarde.
fonte