Escriba una expresión regular que coincida con una cadena dada que consta de tres enteros no negativos separados por espacios si y solo si el último entero es la suma de los dos anteriores. Las respuestas pueden ser para enteros de cualquier sistema de numeración con radix entre 2 y 10.
Casos de prueba
Estos deberían fallar:
0 1 2
10 20 1000
Estos deben coincidir con:
10 20 30
28657 46368 75025
0 0 0
Reglas
Su respuesta debe consistir en una única expresión regular, sin ningún código adicional (excepto, opcionalmente, una lista de modificadores de expresión regular necesarios para que su solución funcione). No debe utilizar las características de la expresión regular de su idioma que le permiten invocar código en el idioma de alojamiento (por ejemplo, el modificador e de Perl).
Por favor, especifique su sabor regex en su respuesta.
Esto es regex golf, por lo que gana la expresión regular más corta en bytes. Si su idioma requiere delimitadores (generalmente /.../) para denotar expresiones regulares, no cuente los delimitadores. Si su solución requiere modificadores, agregue un byte por modificador.
Créditos a Martin Ender y Jaytea por las reglas de regex-golf.
Tengo razones para creer que es posible en base a la solución de Martin Ender para encontrar e incrementar enteros con expresiones regulares .
fuente
/e
modificador de Perl 5 solo se aplica a las sustituciones, y no es la única forma de ejecutar código externo. Además, esto descalifica a Perl 6 por completo, ya que una expresión regular es solo un método con sintaxis adicional. (La razón es que hace que las expresiones regulares sean más fáciles de leer y escribir) Como resultado, todas las características necesarias en expresiones regulares arcaicas no son necesarias (ni están incluidas), ya que acaba de ingresar el código Perl 6. (lo que significa que probablemente no es posible hacer este reto si sólo limitar a código específico de expresiones regulares)/^(\d+)**3%' '$ <?{$0[2]==[+] $0[0,1]}>/
o/^(\d+)' '(\d+)' '(\d+)$ <?{$2==$0+$1}>/
o/^(\d+)' '(\d+){}" {$0+$1}"$/
Respuestas:
Perl / PCRE: 2,685 bytes
Pruébalo en línea!
He estado al acecho de desafíos difíciles después de un paréntesis de expresiones regulares, y me topé con este torpe. Verificar la adición (con Perl / PCRE) es algo en lo que he pensado antes, pero lo descarté rápidamente como imposible o más allá de mi capacidad. Sin embargo, ahora tomé otra oportunidad y estoy muy emocionado de decir que realmente lo hice.
Realmente no jugué esto aparte de considerar algoritmos cortos y la técnica general de correspondencia cuando lo escribí. Estoy muy feliz de haberlo hecho: D
Si la gente está interesada, podría agregar comentarios y explicar cómo funciona.
Editar: Hice una publicación detallada en mi blog sobre esto, con explicaciones y comentarios :) disfrute: http://www.drregex.com/2018/09/a-regex-i-submitted-to-reddit-climbed.html
fuente
Sabor .NET,
139111106 + 1 = 107 bytesNecesita el
RightToLeft
modificadorr
. Entrada en binario.Pruébalo en línea! (Usando retina )
Yay para equilibrar grupos. Explicaré esto más tarde ...
Versión decimal,
340243 + 1 = 244 bytesPruébalo en línea!
fuente
.NET, 96 bytes
Bandera:
r
Pruébalo en línea!
Versión decimal, 238 bytes.
Bandera:
r
Pruébalo en línea!
Similar a la respuesta de Martin.
fuente