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>
Respuestas:
SnakeEx
¡Resuelve 15/16 problemas hasta ahora!
Intérprete en línea ! - Especificación completa del idioma - Fuente Javascript
La idea detrás de este lenguaje es definir 'serpientes' que se mueven alrededor de los caracteres de verificación de texto usando una sintaxis tipo regex.
Un programa en SnakeEx consiste en una lista de definiciones para serpientes que utilizan diferentes secuencias de comandos. Las serpientes pueden engendrar otras serpientes usando estas definiciones, que es donde SnakeEx obtiene la mayor parte de su poder: podemos hacer coincidir las estructuras de ramificación e incluso hacer recursividad (ver ejemplo de coincidencia de Paren).
Esencialmente, cada programa se verá como un conjunto de expresiones regulares, pero con la adición de comandos de dirección de la forma
<dir>
que cambian la dirección de la serpiente, y los comandos de llamada de la forma{label<dir>params}
que generan más serpientes.Para un punto de entrada, el intérprete genera una serpiente usando la primera definición, moviéndose hacia la derecha.
No es terriblemente conciso, pero es muy poderoso y (creo) bastante legible.
Actualizaciones
<!>
para resolver colinear%{min,max}
Soluciones
15 resueltos, 1 en progreso
¡Puede probar estos programas fácilmente con el Intérprete en línea vinculado anteriormente!
Problema 1 - Encontrar tableros de ajedrez
Para una introducción detallada, comience en el problema 3.
Problema 2: verificación de tableros de ajedrez
Terminar el libro de las serpientes apropiadas con el símbolo de fuera de los límites
$
es una forma de hacer que un programa coincida solo con la entrada completa.Problema 3: detectar un rectángulo de dígitos
La
m
serpiente se mueve hacia la derecha, generando al menos 2 serpientes (%{2,}
es un cierre que significa "2 al infinito") usando la definición c (c
) y moviéndose hacia la derecha (<R>
), o más bien hacia abajo en este caso, porque todas las direcciones son relativas a la serpiente actual. ElA
parámetro es el azúcar que solo especifica que la serpiente de desove debe moverse después de la llamada. El1
parámetro es cómo restringimos las coincidencias a los rectángulos: los parámetros numéricos colocan a las serpientes en "grupos". Una partida no cuenta a menos que todas las serpientes del mismo grupo viajen exactamente a la misma distancia.Problema 4 - Encontrar una palabra en una búsqueda de palabras
El comando de dirección
<*>
especifica que la serpiente debe girar en cualquier dirección diagonal u ortogonal. Luego, busca la expresión regular simple.Problema 5 - Detectar entradas cuadradas
La clave aquí es el carácter especial
$
, que solo coincide si la serpiente está fuera de los límites. Engendramos una serpiente horizontal y una vertical; cada uno de ellos genera más serpientes a medida que corre a lo largo del borde, y todos están en el mismo grupo y deben tener la misma longitud.Problema 6 - Encuentra planeadores en un juego de la vida
m
comienza en cualquiera de las cuatro direcciones ortogonales (<+>
), logrando la rotación. Luego, se ve a la izquierda o derecha para las tres filas en orden, logrando la reflexión.(Tenga en cuenta que he reemplazado los espacios con puntos solo porque las áreas de texto HTML utilizadas en mi intérprete parecen hacer cosas estúpidas si tienen múltiples espacios seguidos)
Problema 7 - Match Portales abisales
La
m
serpiente se mueve hacia la derecha, generando una serpiente para verificar el borde izquierdo, 2-22 serpientes para verificar las columnas del medio, y finalmente una serpiente para verificar el borde derecho. El~
operador indica que lo que sigue se debe verificar pero no se debe marcar como parte de la solución.¡Los cierres limitados ahora nos permiten resolver este problema de forma completa y adecuada!
Problema 8 - Colocación del cofre de Minecraft
Aquí usamos un no lógico (
!
), que coincide si y solo si el siguiente token no coincide con nada. La declaraciónd
detecta un cofre doble en una dirección particular, por!{d<+>}
lo que se asegura de que no haya cofres dobles en ninguna dirección ortogonal.s
se mueve en un pequeño diamante alrededor del cuadrado actual, verificando que al menos 3 de esos espacios estén vacíos o fuera del tablero. El final\.
finalmente coincide con el cuadrado, suponiendo que todas las condiciones anteriores tuvieron éxito.Problema 9 - Alineación horizontal y vertical
La serpiente
m
opcionalmente gira a la derecha (<R>?
) antes de hacer coincidir la secuencia..
es un comodín, como en regex.Problema 10 - Puntos colineales
¡Con la adición de la
<!>
dirección, podemos resolver esto ahora!<!>
es como,<+>
pero en lugar de ramificarse en cuatro direcciones, se ramifica en todas las direcciones posibles.Problema 12 - Evita la letra Q
Solo genera 4 serpientes que buscan cuatro caracteres que no son la letra Q.
Problema 13 - Minería de diamantes
Este es muy bueno.
m
genera dos serpientes, una yendo hacia atrás a la derecha y otra hacia adelante a la derecha. Cada uno de ellos sigue las barras a una X, luego genera otra serpiente en ángulo recto a su dirección actual, que sigue las barras a la X inferior.Problema 14 - Cruces coincidentes
Esta es la primera vez que uso el
P
parámetro iggyback. Normalmente las serpientes son independientes, pero si realiza una llamada con este parámetro, la serpiente que llama se moverá con la persona que llama. Entoncese2
puede verificar una secuencia de '.', Luego una secuencia de '#', luego otra secuencia de '.', Y hacer que todas sean llamadas separadas para que podamos agruparlas con '1,' 2 'y' 3 ' , obligando a sus longitudes a coincidir.Problema 15: unir una palabra en un tablero de Boggle
Simple, si es prolijo.
I
El parámetro especifica mayúsculas y minúsculas (podemos especificar parámetros en las definiciones y en las llamadas). La serpiente gira en cualquier dirección, coincide con el personaje, gira de nuevo, y así sucesivamente.Esta es la versión sin caracteres de reutilización. El
E
parámetro xclusive prohíbe que la serpiente coincida con cualquier personaje que ya haya sido marcado, al igual que los rastros de baba de feersum.Problema 16 - Envuelva los bordes
El
W
parámetro permite que la serpiente se ajuste cuando se ejecuta fuera de los límites. También tenemosH
yV
permitir solo envoltura horizontal o vertical.Extra - Solucionador de laberintos
Resuelve un laberinto ASCII donde el piso transitable es períodos. La
<P>
dirección significa hacia adelante, izquierda o derecha (azúcar para[<F><L><R>]
).Extra - Emparejamiento Paren
Todavía no he descubierto cómo hacer Prelude, ¡pero aquí hay un primer paso! Aquí uso la
r
serpiente de forma recursiva para hacer coincidir los paréntesis correspondientes comprobando que no haya paréntesis sin igual entre ellos.Extra - Topología ASCII: Bucles de conteo
fuente
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 de Github , intérprete en línea )
Al igual que el envío de feersum, esto también se basa en atravesar la cuadrícula, pero al igual que el envío de CarpetPython, esto se basa en expresiones regulares. De alguna manera parece que logré tomar el término medio.
Hay muchas características no implementadas que quiero agregar, así que, cuando sea relevante, he notado lo que pretendo hacer cuando tenga tiempo.
Actualizaciones
(Ver la página de Github para noticias detalladas)
5 de abril de 2015 : ¡Slip ahora tiene un intérprete en línea ! Todavía está en sus primeras etapas, por lo que puede haber algunos errores.
5 de abril de 2015 : ¡Actualización de eficiencia! Ahora, los portales inferiores hacen una gran entrada mucho más rápido (2s). También ha habido una serie de cambios de sintaxis, así que asegúrese de consultar el wiki. Numeración grupal también fija.
El deslizamiento tiene un puntero de coincidencia que comienza en un cuadrado particular y que inicialmente está orientado hacia la derecha. Cuando se hace coincidir un carácter, el puntero se mueve hacia adelante en la dirección actual (aunque la implementación no hace las cosas exactamente en ese orden).
La dirección del puntero del partido se puede establecer en una dirección particular con
^<digit>
, en donde^0
,^1
,^2
, ...,^7
establecer el puntero a N, NE, E, ..., NW, respectivamente (las agujas del reloj en marcha).Los siguientes accesos directos también están disponibles:
^*
comprueba las 8 direcciones ortogonales o diagonales,^+
comprueba las 4 direcciones ortogonales.(Plan futuro: Permitir la configuración de direcciones arbitrarias, por ejemplo,
(1, 2)
para el movimiento del caballero)Por ejemplo ( Problema 4 - Encontrar una palabra en una búsqueda de palabras ),
intenta las 8 direcciones ortogonales o diagonales, buscando la palabra "GOLF". Por defecto, Slip intenta todos los cuadrados iniciales posibles y devuelve un resultado de cada uno, filtrando duplicados, por lo que una cuadrícula como
devuelve solo la fila superior y la fila inferior como coincidencias (ya que la fila superior y la columna izquierda "GOLF" comienzan desde el mismo cuadrado). Para obtener todas las coincidencias,
o
se puede utilizar el modo de coincidencia superpuesta.Del mismo modo ( Problema 15 - Une una palabra en un tablero de Boggle ),
coincide
panama
intentando una dirección diferente cada vez. Use lai
bandera para la insensibilidad a mayúsculas y minúsculas. Slip reutiliza los caracteres de forma predeterminada, pero esto se puede alternar con elr
indicador de no repetición.(Plan futuro: un modificador de modo de búsqueda que verifica automáticamente conjuntos de direcciones después de cada movimiento para que no
^*
sea necesario repetir )La dirección del puntero del partido también se puede girar 90 grados hacia la izquierda o hacia la derecha con
<
o>
respectivamente. Por ejemplo,busca el patrón
mirando en el siguiente orden:
Esto nos permite resolver el problema 6: encontrar planeadores con
donde las partes 1 y 2 codifican las formas del planeador, y las partes 3 y 4 codifican sus contrapartes reflejadas.
Tenga en cuenta que Slip usa la tecla
`
de retroceso para escapar. Esto se debe a que Slip tiene otra forma de movimiento que le da nombre al idioma: el comando slip./
desliza el puntero de coincidencia ortogonalmente hacia la izquierda, mientras\
desliza el puntero de coincidencia ortogonalmente hacia la derecha.Por ejemplo,
puede ser igualada por
abc\def/ghi
.Si bien no es particularmente útil por sí solo, el deslizamiento se vuelve más importante cuando se combina con el
(?| <regex> )
grupo estacionario, que actúa como una búsqueda anticipada coincidente. La expresión regular en el interior coincide, luego, al final, la posición y la dirección del puntero de coincidencia se restablecen al estado anterior al grupo estacionario.Por ejemplo,
se pueden combinar con
(?|abc)\(?|def)\(?|ghi)
.Del mismo modo, el problema 12: evitar la letra Q se puede resolver con
donde
%
hay un comando antideslizante para detener la\
activación del primero .El deslizamiento también tiene una aserción de longitud
(?_(<group num>) <regex> )
, que solo coincide con la expresión regular dentro si su longitud de coincidencia es la misma que la del número de grupo dado.Por ejemplo, Problema 13: la minería de diamantes se puede resolver fácilmente con
que intenta hacer coincidir el lado superior izquierdo del diamante primero, luego afirma que los otros tres lados tienen la misma longitud.
(Ejecutar con
v
bandera para salida detallada)Una alternativa más golfista es
que coincide con el primer lado dos veces.
Muchos de los otros problemas se pueden resolver mediante deslizamiento, grupos estacionarios y afirmaciones de longitud:
Problema 14 - Cruces coincidentes:
Una vez que capture las anchuras de las
.
s y#
s en la primera fila, es simplemente deslizarse hasta el fondo.Salida:
Este probablemente se pueda jugar con un poco de recurrencia, una vez que solucione algunos errores.
Problema 3 - Detecta un rectángulo de dígitos:
Haga coincidir una fila superior de dos o más dígitos, luego asegúrese de que cada línea de abajo tenga la misma longitud.
`d
es una clase de caracteres predefinida equivalente a[0-9]
.Tenga en cuenta que esto encuentra todas las coincidencias .
Problema 7: coincide con los portales inferiores:
que sale, para el ejemplo superior en el hilo original :
Finalmente, algunas otras características de Slip incluyen:
$0, $1, $2, ..., $7
ancla el borde norte, la esquina noreste, el borde este, etc.$+
ancla cualquier borde y$*
ancla cualquier esquina.$
seguido de un carácter en minúscula establece un ancla en la posición actual, que luego puede coincidir$
con el carácter en mayúscula correspondiente, por ejemplo,$a
y$A
.#
alterna la bandera de no mover, lo que impide que el puntero de la partida avance después de la próxima partida.,
coincide con un carácter similar.
, pero no lo agrega a la salida, lo que permite coincidencias no contiguas mientras puede ser reconocido por(?_())
.... y más. Realmente hay demasiados para enumerar en esta página.
Otros problemas
Problema 1 - Encontrar tableros de ajedrez:
Los dos problemas del tablero de ajedrez ciertamente no son el fuerte de Slip. Hacemos coincidir la fila superior y luego nos aseguramos de que tenga al menos la longitud 3 y alterna entre
#
y_
, luego deslice y combine las filas posteriores. Al final, el$a
ancla debe estar en la parte inferior derecha del tablero de ajedrez.Luego giramos a la izquierda y repetimos para las columnas, asegurándonos de que coincidamos
$A
al final.Problema 2 - Verificación de tableros de ajedrez:
Al igual que el problema anterior, verificamos que cada fila sea correcta, luego giramos a la izquierda y hacemos lo mismo para las columnas. Los anclajes se utilizan para asegurarse de que solo coincida toda la tabla.
Problema 9 - Alineación horizontal y vertical:
Aplicamos el opcional? cuantificador al
>
comando rotar para que coincidamos hacia la derecha o hacia abajo. Encontramos los 5 en el ejemplo cono
modo superpuesto, pero solo 4 sin él desde entonces#.,##
y#.,#
comenzamos desde la misma posición.Problema 10 - Puntos colineales
Haga coincidir
#
unos caracteres horizontales y algunos caracteres verticales, luego repita hasta el segundo#
y repita hasta el tercero#
.Problema 5 - Detección de entradas cuadradas:
Ancle la esquina superior izquierda y verifique que el borde superior tenga la misma longitud que el borde derecho, antes de anclar la esquina inferior derecha. Si la entrada pasa esto, entonces vamos hacia atrás para que coincida con toda la entrada.
Problema 8 - Colocación del cofre de Minecraft:
Corre con la
p
bandera para obtener las posiciones de cada partido.$^
es un ancla que coincide si el próximo movimiento pondría el puntero fuera de límites.Primero hacemos coincidir a
.
, luego verificamos que estamos rodeados por tres.
s / límites, luego nos aseguramos de que el cuarto cuadrado circundante también sea un.
/ límite o sea un solo cofre (verificando sus cuadrados circundantes).Problema 11: verificar la sintaxis del preludio :
Hice algunos intentos, pero creo que este es correcto. Aquí usamos recursividad, que tiene la misma sintaxis que PCRE.
Este enfoque requiere que la entrada sea rectangular, pero una vez que haga una coincidencia no rectangular, esa suposición no será necesaria.
Aquí está el mismo enfoque, golf con más recursividad:
Problema 16 - Envuelva alrededor de los bordes:
(Nota: el ajuste aún no se ha enviado al intérprete en línea)
Esto requiere la bandera de ajuste
w
. Técnicamente, la inicial%
para no deslizarse no es necesaria, pero luego el partido se contará como comenzar desde un cuadrado más alto.Problema EX 1 - Solucionador de laberintos:
Problema del comentario de BMac en el chat . Use la
r
bandera para el modo de no repetición para que el puntero de coincidencia no se atasque yendo y viniendo.Problema EX 2 - Reconocimiento facial :
Tenga en cuenta que solo estoy haciendo coincidir caras, no haciendo ningún borrado. Tenga en cuenta que la pregunta contiene símbolos de euro, que deberán ser reemplazados por algunos ASCII imprimibles para funcionar.
fuente
PMA / Caracoles (C ++)
Imagino el lenguaje como caracoles moviéndose alrededor de una cuadrícula y ejecutando comandos. Los caracoles dejan un rastro de limo en cada cuadro al que se mueven, lo que por defecto hace que el cuadrado sea inigualable. Una coincidencia tiene éxito si se alcanza el final de la lista de comandos.
Hay suficientes operadores ahora que vamos a necesitar una lista de precedencia para realizar un seguimiento de ellos. Las operaciones se resuelven en el siguiente orden:
( ) [ ]
|
`
como grupo[m],[n]
yn
= !
El intérprete está escrito en C ++. El código fuente abismal se puede encontrar aquí .
Problema 4: Búsqueda de palabras
El programa
es suficiente para obtener un valor verdadero o falso para determinar si se encuentra la palabra.
z
(uno de los 15 comandos direccionales absolutos o relativos) coincide en cualquier dirección octilineal. Múltiples comandos de dirección consecutivos son OR juntos. Por ejemploruldy
, sería casi equivalente az
, ya que esos son los comandos para derecha, arriba, izquierda, abajo y cualquier dirección diagonal. Sin embargo, las instrucciones se probarían en un orden diferente. El primer personaje que coincide siempre es el que comienza el caracol, independientemente de la dirección.\
<carácter> coincide con un único carácter literal.La estrategia predeterminada es probar el patrón en cada cuadrado en el cuadro delimitador de la entrada justificada a la izquierda y generar el número de coincidencias. Si se requiere un valor booleano
1
o0
, se puede utilizar el siguiente programa:Si hay al menos una nueva línea en el archivo fuente, la primera línea se trata como opciones para la conversión inicial de la entrada en una forma rectangular. La
?
opción imprime 0 o 1 dependiendo de si hay una coincidencia en alguna parte.Problema 15: Boggle
Después de implementar la alternancia, ahora es posible resolver Boggle. Sería mejor utilizar coincidencias que no distingan entre mayúsculas y minúsculas para este, pero implementar esa no es mi máxima prioridad.
|
funciona exactamente igual que una expresión regular unidimensional. Hay dos pares de delimitadores para agrupar, a saber,()
y{}
. Un corchete de cierre cerrará cualquier grupo abierto del tipo opuesto que se interponga entre él y el más cercano del mismo tipo. Por ejemplo, a continuación{({{)
, solo el grupo de la izquierda permanece abierto. Como puede ver, los símbolos de agrupación no coincidentes en los bordes están implícitamente cerrados. Hay otro comando de agrupación en el`
que no entraré ahora.Problema 8: Cofres de Minecraft
El programa imprime el número de ubicaciones de cofres válidas. Este fue el primero que tuve que jugar al golf, y reduje mi número de bytes (17) varias veces.
\.
coincide con un punto literalmente, en el punto de partida del partido.!(o\C)2
es equivalente a!((o\C)2)
que la cuantificación tiene mayor precedencia que la afirmación.<atom> <number>
significa repetir tiempos<atom>
exactos<number>
.o
gira el caracol en cualquier dirección ortogonal.!
Es una afirmación negativa. Por lo tanto, esta parte verifica la ausencia de un cofre doble adyacente.o
gira en alguna dirección ortogonal.(!\Cw)3
afirma que no hayC
frente al caracol y luego gira 3 veces en sentido antihorario.Problema 2: Verificación de tableros de ajedrez
La
&
opción establece la salida del programa como1
si la coincidencia tuviera éxito en todas las posiciones, y de lo0
contrario.^c
coincide con un carácter que no esc
, equivalente a[^c]
en regex. En conjunto, el programa significa: Imprimir 1 si en cada posición en el rectángulo delimitador de la entrada, hay una#
que no es ortogonalmente adyacente a un carácter que no lo es_
o una_
que no es ortogonalmente adyacente a un carácter que es no#
; de lo contrario 0.fuente
La clase Re2d, Python 2
Actualización: se agregó el problema "9. Alineación".
Mi enfoque es usar el módulo Python re para hacer la búsqueda y la coincidencia. La clase Re2d prepara el texto para el procesamiento, ejecuta las funciones re y formatea los resultados para la salida.
Tenga en cuenta que este no es un lenguaje completamente nuevo: es el lenguaje de expresión regular estándar proyectado en 2 dimensiones con banderas agregadas para modos 2D adicionales.
La clase tiene el siguiente uso:
Ambos patrones son patrones RE estándar de texto lineal. Si no se proporciona un patrón vertical, la clase también usará el patrón horizontal para hacer coincidir verticalmente. Las banderas son las banderas RE estándar con algunas extensiones 2D.
Pruebas
El método de búsqueda encontró un patrón de tablero de ajedrez y devuelve una posición de 4 tuplas. La tupla tiene la
x,y
posición del primer personaje del partido y lawidth, height
del área coincidente. Solo se proporciona un patrón, por lo que se utilizará para la coincidencia horizontal y vertical.El tablero de ajedrez se verificó con el método de coincidencia que devuelve un valor booleano. Tenga en cuenta que el
^
e$
inician y se requieren caracteres finales para que coincida con el conjunto del texto.Ahora usamos la
MULTIFIND
bandera para devolver todas las coincidencias posibles para el bloque de más de 2 dígitos. El método encuentra 9 posibles coincidencias. Tenga en cuenta que pueden superponerse.Esta prueba muestra el uso de volteo vertical y horizontal. Esto permite palabras coincidentes que se invierten. Las palabras diagonales no son compatibles. La
MULTIFIND
bandera permite múltiples coincidencias superpuestas en las 4 direcciones. El método findall utiliza la búsqueda para encontrar los cuadros coincidentes y luego extrae los bloques de texto coincidentes. Observe cómo la búsqueda usa ancho y / o alto negativo para coincidencias en la dirección inversa. Las palabras en la dirección vertical tienen nuevos caracteres de línea, esto es consistente con el concepto de bloques de caracteres 2D.Esta búsqueda necesitaba patrones separados para cada dimensión, ya que el tamaño mínimo es diferente para cada una.
Este conjunto de 2 búsquedas encuentra 2 coincidencias verticales y 2 horizontales, pero no puede encontrar la
#.,#
cadena incrustada .Aquí usamos 2 búsquedas para encontrar coincidencias en ambas direcciones. Es capaz de encontrar múltiples coincidencias ortogonales, pero este enfoque no admite coincidencias diagonales.
Esta búsqueda encuentra la primera coincidencia.
El problema del diamante es más difícil. Se necesitan tres objetos de búsqueda para los tres tamaños. Puede encontrar los seis diamantes en el conjunto de prueba, pero no escala a diamantes de tamaño variable. Esta es solo una solución parcial al problema del diamante.
Código de Python 2
fuente
Mugre , Haskell
Introducción
Grime se basa en gramáticas booleanas . La idea básica es construir patrones rectangulares a partir de componentes más pequeños y verificar si se encuentran en la matriz de entrada. Hasta ahora, Grime solo admite coincidencias rectangulares y resuelve al menos 11 problemas de manera más o menos elegante.
EDITAR: se corrigieron las cruces (gracias a DLosc por detectar el error) y se agregó minería de diamantes.
EDIT2: Se agregaron clases de personajes, inspiradas en las de Slip. También cambió la sintaxis de los indicadores de opción, mejoró el analizador de expresiones y agregó el problema de no Q.
EDITAR3: Se implementaron restricciones de tamaño y se agregó el problema de los portales de Nether.
Uso
Un programa Grime se llama gramática , y la extensión de archivo correcta para una gramática es
.gr
, aunque esto no se aplica. La gramática se evalúa comodonde
matrixfile
es un archivo que contiene la matriz de caracteres. Por ejemplo, la gramática de los dígitos se evaluaría comoPara mayor velocidad, recomiendo compilar el archivo con optimizaciones:
De forma predeterminada, el intérprete imprime la primera coincidencia que encuentra, pero esto se puede controlar mediante los indicadores de opción:
-e
: coincide solo con toda la matriz, imprime1
por coincidencia y0
sin coincidencia.-n
: imprime el número de coincidencias, o la matriz completa si-e
también se da.-a
: imprime todos los partidos.-p
: imprime también las posiciones de los partidos, en el formato(x,y,w,h)
.-s
: no imprima las coincidencias ellos mismos.-d
: imprime información de depuración.Las opciones también se pueden especificar dentro de la gramática, insertándolas antes de cualquier línea y agregando una coma
,
(ver ejemplos a continuación).Sintaxis y Semántica
Una gramática de Grime consta de una o más definiciones , cada una en una línea separada. Cada uno de ellos define el valor de un no terminal , y uno de ellos debe definir el nivel anónimo no terminal . La sintaxis de una definición es
N=E
oE
, dondeN
es una letra mayúscula yE
es una expresión .Las expresiones se construyen de la siguiente manera.
\
coincide con cualquier1x1
rectángulo que contenga ese carácter..
coincide con cualquier personaje individual.$
coincide con un1x1
rectángulo fuera de la matriz de caracteres._
coincide con cualquier rectángulo de ancho o alto cero.d
igit,u
ppercase,l
owercase,a
lphabetic, alphan
umeric ys
ymbol.[a-prt-w,d-gu]
. Se incluyen las letras de la izquierda y se excluyen las de la derecha, por lo que coincide exactamente con las letrasabchijklmnoprtvw
. Si el lado izquierdo está vacío, se considera que contiene todos los caracteres. La coma se puede omitir si el lado derecho está vacío. Los personajes[],-\
deben escapar con\
.P
yQ
son expresiones, entoncesPQ
es solo su concatenación horizontal, yP/Q
es su concatenación vertical, conP
arriba.P+
es uno o másP
s alineados horizontalmente, yP/+
es el mismo alineado verticalmente.P|Q
,P&Q
yP!
.P?
es la abreviatura deP|_
,P*
paraP+|_
yP/*
paraP/+|_
.P#
coincide con cualquier rectángulo que contenga una coincidencia deP
.P{a-b,c-d}
, dondeabcd
hay enteros no negativos, es una restricción de tamaño enP
. SiP
es una clase de caracteres, entonces la expresión coincide con cualquiermxn
rectángulo que contenga solo esos caracteres, siempre quem
esté entrea
eb
inclusive, yn
esté entrec
ed
inclusive. En otros casos, la expresión coincide con cualquier rectángulo que tenga el tamaño correcto y queP
también coincida. Sia
oc
se omiten, que se considera que son0
, y sib
od
se omiten, que son infinitos. Si se omite el guión entrea
yb
, entonces usamos el mismo número para ambos extremos del intervalo. Si todoc-d
se omite parte, ambos ejes están restringidos. Para aclarar,{-b}
es equivalente a{0-b,0-b}
, y{a-,c}
es equivalente a{a-infinity,c-c}
.Notas
Grime permite definiciones paradójicas como
A=A!
con el comportamiento indefinido. Sin embargo, no causarán bloqueos o bucles infinitos.Grime admite entradas no rectangulares; las filas se alinean simplemente a la izquierda y los espacios se pueden combinar usando
$
.En el futuro, me gustaría implementar lo siguiente:
.
solo puede coincidir con1x1
rectángulos. Hasta que encuentre una coincidencia, intenta todos los rectángulos de todos los tamaños en orden, fallando instantáneamente para cada uno de ellos.Partidos no rectangulares que utilizan contextos , lo que sería útil en el desafío del tablero Boggle. Por ejemplo,
Pv(Q>R)
significaP
con contexto inferior (Q
con contexto correctoR
). Coincidiría con los patrones en forma de LLas tareas
Dado aproximadamente en orden de complejidad.
Rectángulo de dígitos
Esto es simple: un rectángulo de dígitos de tamaño al menos
2x2
.No q o Q
Esto es casi tan simple como el primero; ahora tenemos un tamaño más restringido y una clase de caracteres personalizada.
Alineación horizontal y vertical
Ahora tenemos algunos personajes escapados. Básicamente, esto coincide con uno
#
, luego cualquier número de caracteres, luego#
, ya sea horizontal o verticalmente.Detectar entradas cuadradas
Esta gramática es muy simple, básicamente define que un cuadrado es un
1x1
rectángulo o un cuadrado más pequeño con una columna pegada en su borde derecho y una fila pegada en la parte inferior. Tenga en cuenta también lae
opción antes del nivel superior no terminal, que alterna la verificación de entrada completa.Encontrar una palabra en una búsqueda de palabras
Este es horrible, ya que Grime no tiene operaciones de rotación o reflexión. También es extremadamente lento, ya que Grime no sabe que los partidos solo pueden ser de tamaño
4x1
,1x4
o4x4
.El problema del planeador podría resolverse de manera similar, pero soy demasiado vago para escribirlo.
Portales abisales
Con el operador de restricción de tamaño, este no es tan difícil. La parte central
\.{2-22,3-22}
coincide con cualquier rectángulo de.
los tamaños correctos, y luego solo agregamos columnas deX
s en ambos lados, y agregamos filas deX
s con extremos ignorados en la parte superior e inferior de eso.Cruces a juego
Lo que tenemos aquí es una conjunción (lógica Y) de dos expresiones. El no terminal
E
coincide con un rectángulo no vacío de.
s yF
un rectángulo no vacío de#
s. El lado izquierdo de la conjunción coincide con rectángulos del tipodonde tenemos
EFE
en la parte superior, luegoF
, y luegoEFE
otra vez. El lado derecho coincide con las transposiciones de estos, por lo que obtenemos exactamente las cruces.Minería de diamantes
El no terminal
C
es una abreviatura de cualquier1xn
columna. La mitad superior de un diamante se corresponde conT
: es un simpleX
u otroT
rodeado por una columna en ambos lados, y una fila/[something]\
debajo de eso.B
coincide con la parte inferior de un diamante de la misma manera, y el nivel superior no terminal es solo una fila de la formaX[something]X
entre la mitad superior y la mitad inferior.Encontrar tableros de ajedrez
El lado derecho
[#_]{3-}
coincide con uno3x3
o más rectángulos de#
sys_
, mientras que el lado izquierdo garantiza que no contiene dos#
s o_
s adyacentes .Verificando tableros de ajedrez
Esto es básicamente lo mismo que el anterior, excepto que podemos hacer coincidir cualquier rectángulo no vacío, pero necesitamos usar el
e
indicador para la verificación de entrada completa.Verifique la sintaxis del preludio
Esta es probablemente la gramática más interesante hasta ahora. El no terminal
A
coincide con cualquier columna que no contenga(
o)
, yP
coincide con algún número deA
s, o dos paréntesis coincidentes, entre y fuera de los cuales hay másP
s.fuente
\#(.*|./*)\#
?#
a la izquierda, luego una fila o columna de cualquier cosa, luego uno#
a la derecha". Necesito especificar que los#
s se concatenan verticalmente a la columna usando las barras inclinadas/
.TMARL
Lenguaje de reconocimiento y coincidencia de plantillas
Descripción
Mi intérprete ocupa 24K caracteres (¿los fragmentos de código toman caracteres? ), Por lo que la descripción completa se puede encontrar aquí .
La mejor parte: el intérprete está en Javascript, lo que significa que puedes probarlo aquí mismo.
Mostrar fragmento de código
Y para los problemas:
# 1 - Encontrar tableros de ajedrez
&
añade búsquedas El G2 al final obtiene el tercer elemento en un elemento de coincidencia, la coincidencia real. Los primeros 2 elementos son coordenadas xey (1 basado, no 0).# 3 - Detecta un rectángulo de dígitos
Creo que este es bastante sencillo.
# 4 - Encontrar una palabra en una búsqueda de palabras
El
S
argumento es uniforme para que busque todas las rotaciones. Es mayor que 4 porque se puede agregar a la siguiente búsqueda (no se pueden agregar coincidencias individuales).# 5 - Detectar entradas cuadradas
No estoy seguro de si esto es completamente legal, ya que solo determina la cuadratura correctamente si la entrada es un rectángulo. Compara la longitud de la entrada
IL
con la longitud de la primera filaIG0L
y la invierte.# 6 - Encuentra planeadores en un juego de la vida
Finalmente, un uso para espejo!
# 12 - Evita la letra Q
S1 porque solo se necesita 1 coincidencia.
Haré algunos de los más difíciles más tarde.
fuente