Su desafío es crear una expresión regular que coincida con cada permutación de cadena de sí misma, y nada más. El partido también debe ser sensible a mayúsculas y minúsculas.
Entonces, por ejemplo, si su expresión regular es:
ABC
Debe coincidir (y solo coincidir) con estas cadenas:
ABC
ACB
BAC
BCA
CAB
CBA
No debería coincidir con cosas como:
AABC (contains an extra A)
ABCD (contains an extra D)
AC (no B)
AAA (no B and C, extra 2 A's)
abc (case-sensitive)
Reglas:
- Puede usar cualquier sabor de expresión regular que desee.
- Se aplican lagunas estándar.
- Debe tener al menos dos caracteres diferentes en su código. Eso significa que las soluciones como
1
no son válidas. - La expresión regular debe contener solo ASCII imprimible, y nada más.
(ABC|ACB|BAC|BCA|CAB|CBA)
pero querías una respuesta generalizada.Respuestas:
JavaScript
6457 bytes4 bytes eliminados gracias a Martin Ender.
Pruébalo aquí.
Explicaciones (desactualizadas)
fuente
^(?!.*(\S)(.*\1){3}[^1]?)[]zzSS[-^?!!.'''-*1{33}0066-]{60}\z
regex101^(?'4'(?!(.*\4){3})[]$$[\\^^?!!..'-*{}33-5-]){54}$[5]*
Perge y PCRE regex, 280 bytes
(Ligeramente) más legible:
Esto se ejecuta en tiempo O (2 ^ n) como está escrito, por lo que es increíblemente ineficiente. La forma más fácil de probarlo es reemplazar cada aparición de
.*
con.*?
, lo que hace que se compruebe primero el caso en el que coincide (lo que significa que coincide en tiempo lineal, pero aún toma tiempo exponencial si no coincide).La idea básica es que obliguemos a que la longitud de la expresión regular sea igual a 280, y usemos aserciones anticipadas para obligar a cada personaje de la expresión regular a aparecer al menos un cierto número de veces, por ejemplo,
(?=(.*z){2})
obliga alz
personaje a aparecer al menos dos veces.2+43+43+22+23+2+6+16+7+4+1+3+2+2+1+22+22+11+2+23+23
es 280, por lo que no podemos tener ocurrencias "extra" de ningún personaje.Este es un ejemplo de programación de un autograma , una oración que se describe a sí misma enumerando el número de cada carácter que contiene (y, en este caso, también la longitud total). Tuve bastante suerte al construirlo (normalmente tienes que usar la fuerza bruta, pero me topé con esta solución mientras probaba mi programa de fuerza bruta antes de terminar de escribirlo por completo).
Perl y PCRE regex, 253 bytes, en colaboración con Martin Ender
Supuse que podría haber soluciones más cortas que omiten algunos dígitos (muy probablemente 9, 8 o 7). Martin Ender encontró uno, que se muestra a continuación:
Versión legible:
fuente
{}
de las dos últimas miradas. Tampoco necesita agregar cosas como,(?=(.*5){1})
ya que no habría un5
si no tuviera esa anticipación. Un problema es que$
permite un salto de línea final, por lo que deberá usarlo\z
allí en lugar de lo$
que hizo Jimmy, pero creo que eso no le costará un byte, ya que guarda\
el primer vistazo.$
permitir una nueva línea al final de la cadena, eso generalmente depende de cómo se llama la expresión regular por el entorno programa (normalmente se ejecutan en código que ya se ha analizado en líneas).(?=(.*5){1})
en este caso. Si lo eliminara, habría un 5 en el programa, porque la(?=(.*1){6})
línea ahora tendría que leerse(?=(.*1){5})
.$
a\z
no hace ningún daño (y no No rompa el autograma).\$
...$
az
...\z
. Eso funciona; Iré a cambiarlo.