Este es el hilo del ladrón. El hilo del policía está aquí .
Una matriz de serpiente es una matriz cuadrada que sigue este patrón:
3 por 3:
1 2 3
6 5 4
7 8 9
y 4 por 4:
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
Su tarea es escribir un código que tome una entrada n
y cree dicha matriz, en el mismo idioma que una publicación policial, y con un código que coincida con la expresión regular del policía. El formato de salida de su código debe coincidir con el formato de salida del código del policía.
Deja un comentario debajo de la publicación del policía para indicar que lo has descifrado.
Criterio ganador:
El ganador será el usuario que haya obtenido la mayor cantidad de envíos. En caso de empate, habrá múltiples ganadores.
fuente
¦
funciona me mata cada vez, lo intenté ayer pero conṚ
más queU
y decidí queḤ
no estaba funcionando.F
fue una gran idea,J
lugar deF
.J
... Lo había intentadoLR
pero no podía obtenerlo en menos de 11 bytes05AB1E, Emigna
Esta fue mi primera vez usando 05AB1E. Lo tengo con un poco de ayuda. Eso fue divertido. :)
Pruébalo en línea
Explicación:
De hecho, encontré este programa similar por mi cuenta, pero el formato de salida es diferente:
Pruébalo en línea
Vea el historial de edición de mis dos intentos anteriores.
fuente
not bool(reversed(str(bin(N))).index('1'))
... Creo que esa es la forma más absurda que he visto a alguien hacer unaN%2
operación.Python 2, Dennis
Este es un divertido problema de golf simbólico.
Verificación de expresiones regulares
fuente
Oh, Nick Clifford.
Mi primera vez intentando Ohm.
Muy buen lenguaje que espero usar de nuevo :)
Explicación
Mi primer intento que no funcionó como agregar una matriz y un int no es posible:
Mi segundo intento que no coincidió con la expresión regular:
fuente
05AB1E, Emigna (segunda presentación)
Primera vez trabajando con 05AB1E.
Pruébalo en línea! El | Verificación de expresiones regulares
Explicación
fuente
)
pensando que sería la única forma de obtener el resultado correcto en la pila.)
cuando solo puedes usar 2 caracteres no alfanuméricos. La parte difícil aquí estaba destinada a estructurar el programa para usar solo 2 comodines y tenerlos secuenciales. Probablemente hubiera sido un poco más difícil sin las otras soluciones, pero debería haber sido un poco complicado :)^\w*..$
es posible.UV
debe venir después+ˆ
. No puedo pensar en otra forma de hacerlo con solo 2 comodines al final tampoco. Sin embargo, se puede hacer con 3 comodines.CJam , Lynn
Todos los avances de línea son para fines cosméticos y se pueden eliminar sin afectar el programa.
Pruébalo en línea!
Explicación
Después de que Lynn fuera eliminada
{|}
de la lista de personajes permitidos, tuve que probar algo nuevo. Resulta que todavía podemos construir cadenas arbitrarias y evaluarlas como código.Primero, necesitamos obtener algo de valor en la pila. Los únicos elementos integrados disponibles que empujan algo sin que aparezca otra cosa primero (y sin leer la entrada) son
es
,ea
yet
. Estoy seguro de que podría comenzar desde todos estos aspectos de una forma u otra, pero fui con loes
que empuja la marca de tiempo actual. Como no quería hacer suposiciones acerca de su valor real, pruebo su primalidad conmp
(que da0
y1
) y pruebo nuevamente la primalidad de ese valor para asegurarme de que tengo una0
pila. A1
será más útil, de modo que calculamosexp(0)
conme
y convertirlo en un número entero coni
. Entonces todos los números comienzan con:Ahora tenemos un montón de operadores matemáticos unarios para trabajar:
También podemos combinar algunos elementos integrados para funciones más elaboradas de
x
:Con estos, podemos obtener cualquier número en
0 <= x < 128
(y muchos otros) en menos de 10 pasos1
. Estoy seguro de que un subconjunto mucho más pequeño de estos comandos también sería suficiente. He escrito un pequeño programa de Mathematica para determinar todos estos fragmentos (no es muy legible, lo siento):Con eso, simplemente podemos empujar una lista arbitraria de códigos de caracteres, convirtiendo cada uno de ellos en un carácter con
c
posterioridad. Una vez que hemos empujado todo el código que queremos ejecutar, presionamos95
(]
). Evaluamos ese con~
para envolver todos los demás en una cadena, y luego evaluamos esa cadena con~
.El código real que se ejecuta al final del programa es nuevamente:
Vea mi solución anterior para una explicación.
fuente
Python 3, TuukkaX
Lo sentimos, la expresión regular que usaste fue demasiado fácil de trivializar. No hay
0
,#
o? ¡No hay problema!
Es posible que haya malinterpretado el resultado del ejemplo, pero todavía es bastante fácil de modificar, ya que me sobran 45 caracteres de repuesto.
fuente
R, MickyT
Casos de prueba:
Y confirmación de expresiones regulares: https://regex101.com/r/OB8ZIM/1
También tenía:
que da la misma salida y coincide con la misma expresión regular .
fuente
lets_make_a_snake
... Me sorprendería si esa fuera la solución prevista: Pfor
` y 'if
', pero mucho mejor golf que el mío.Röda , fergusq
Esta es una función anónima que coincida con esta expresión regular PCRE:
^{(\|[^\/#\s]*){8}$
.Pruébalo en línea!
fuente
Golpetazo, @Marcos M
Prettified:
La primera parte de la subcomando generará
1 2 3 4
,9 10 11 12
y la segunda parte generará8 7 6 5
,16 15 14 13
. El exteriorsort -n
los mezclará adecuadamente para formar el patrón de serpiente.Utilicé el truco en /superuser//a/101760 para imprimir las líneas pares e impares. Gracias Marcos, realmente divertido.
fuente
Javascript, Tom
fuente
Python 3, @TuukkaX
Al analizar ligeramente la expresión regular del policía, se muestra una plantilla fija:
donde
_
es cualquier caracter excepto[ '"#]
y^
es cualquiera de[int()2/]
.Al
"*n)
final muestra claramente uneval("..."*n)
oexec("..."*n)
está sucediendo, por lo que solo debemos asegurarnos de que"..."
imprima la fila j.El
for i in range(j,
está demasiado cerca del final de la cadena, insinuando la comprensión de la lista sin ningunaif
. Por lo que necesitamos para construir la i-ésima columna usando aquellosi%n
,2*n
esas cosas.fuente
dc , Mitchell Spector
Esta fue mi primera entrada a un desafío de policías y ladrones, y me divertí mucho. La expresión regular que necesitaba coincidir era simple, lo
^[^# !]{59}$
que básicamente convirtió mi trabajo en golf, sin usar esos 3 caracteres. Inicialmente tuve dificultades para llegar a menos de 60 bytes, pero al final lo resolví.Pruébalo en línea!
Explicación:
Mi código usa un bucle con N 2 iteraciones de , manteniendo un contador basado en cero (1D), y calcula qué número debe imprimirse en función de las coordenadas de fila y columna de matriz (r, c) correspondientes.
Ejemplo de lo que quiero decir, si N = 4:
Parece complicado, pero el paso intermedio es útil. Además, intenté usar 2 bucles desde el principio, pero terminé por encima del límite de caracteres regex. Generación de números en cada iteración (basada en cero):
r % 2 = 0
(fila normal),n = (r * N) + c = counter
r % 2 = 1
(fila invertida),n = ((r + 1) * N) - c - 1 = counter + N - (2 * c) - 1
O todo a la vez, como una numeración basada en uno:
n = counter + ((N - (2 * c) - 1) * (r % 2)); n++
fuente
~
para calcular los índices de fila y columna de una vez. Pero uno de mis intentos anteriores los calculó por separado como lo hizo. ¿Grandes mentes piensan igual? :)~
para acortar el código.?sN0[AP]sP[ddlN~_2*lN+1-r2%*+1+n32P1+dlN%0=PdvlN>L]dsLx
tio.run/nexus/…Potencia Shell, ConnorLSW
Grieta
Comencé con una solución más pequeña para el problema y rellené mis nombres de variables para que la expresión regular coincida. Tratar de encontrar un uso para el colon, supongo, fue la parte más difícil de entender.
Explicación
fuente
$script
variable y algunos bucles realmente desordenados para rellenarlo, sin embargo,[array]::Reverse()
fue correcto, felicidades, creo que es posible que desee igualar la longitud de$i
y$MySnakeIndex
sin embargo.CJam, Lynn
Algo como esto:
Todo el espacio en blanco es para ... "legibilidad" ... y puede omitirse para cumplir con la expresión regular de Lynn.
Pruébalo en línea!
Explicación
La expresión regular requiere que resolvamos el problema usando solo:
{}
, que se puede usar para crear bloques.|
, utilizado principalmente para OR bit a bit.~
, "eval" y NO a nivel de bits (también "dump array", pero no lo voy a usar).Como lo hemos hecho,
~
si podemos construir cadenas arbitrarias, podemos ejecutar código arbitrario. Sin embargo, al principio no es obvio cómo hacerlo.La primera pieza del rompecabezas es que los bloques son bits de código no evaluados, que pueden convertirse en cadenas con
s
. Eso{abc}s
nos da"{abc}"
. A continuación, podemos usareu
para convertir estas cadenas a mayúsculas.El beneficio de esto es que las letras mayúsculas son variables preinicializadas, por lo que podemos obtener muchos valores constantes al crear una cadena de este tipo y evaluarla dos veces (una para volver a convertir la cadena en un bloque y otra para ejecutar ese bloque). No podemos obtener todas las letras, porque algunas, como
x
no son comandos válidos (por lo que CJam se negará a analizar un bloque que las contenga). No podemos usarlof
tal cual, porque necesita ser seguido por otro comando, pero podemos usarfb
y luego O los dos valores juntos. Del mismo modo, podemos usar enee
lugar dee
. Con esto, podemos obtener los números0
,-1
,3
, y10
a19
. El-1
es conveniente, porque si lo convertimos en una cadena ("-1"
), entonces en un carácter ('-
) y luego evaluarlo, podemos obtener la resta o establecer la diferencia. Como dije, no podemos obtenerX
(for1
), pero podemos tomar el valor absoluto de-1
withz
.También podemos usar
s
para obtener una cadena que contenga un espacio, y usarc
para convertir eso en un carácter de espacio :Esto es conveniente, porque a partir de ahí podemos obtener muchos comandos útiles en el rango ASCII más bajo OR al espacio con varios números. Para obtener algunos de los caracteres sobre el punto de código
48
, usamos el carácter'0
como base en su lugar:Esto ya es suficiente para construir cadenas arbitrarias, porque podemos obtener
'+
(suma y concatenación de cadenas) del siguiente fragmento:Y tenemos un literal
1
para que podamos empujar los caracteres de espacio, incrementarlos al valor que necesitamos y luego concatenarlos todos juntos, pero eso es un poco aburrido y el código se volvería masivo.En cambio, los he generado
[
y]
evaluado, de modo que todos los caracteres que introduzco se envuelven en una cadena automáticamente. Estas son dos líneas:Y finalmente, necesitaremos
f
y~
en la cadena que estamos generando. Si bien estos ya son caracteres válidos, no tenemos literales de cadena o literales de caracteres, por lo que también tendríamos que generarlos y construir puntos de código más grandes desde el espacio es un poco molesto. En cambio, he hecho uso de la resta establecida aquí, pero restando dos bloques (para deshacerme de{}
):Eso es casi todo lo que hay que hacer. Nos Eval
[
. Empujamos todos los caracteres, obtenidos por varios cálculos de las pocas constantes incorporadas que tenemos|
,-
(a través de eval) y+
(a través de eval). Nos Eval]
. Aplanamos todo en una cadena, porque en algún momento agregué algunas cadenas o números a la lista. Evaluamos nuestra cadena arbitraria con~
.los
ri...p
forman parte del programa final real, pero yo los he extraído, ya que no necesitan codificación.Finalmente, este es el programa que realmente estamos ejecutando:
fuente
tinylisp , @DLosc
Pruébalo en línea!
Esto define una función
f
que devuelve la respuesta. También imprime los nombres de las funciones que definí para stdout, pero supongo que eso no importa, ya que [al menos se nos permite elegir nuestro flujo de salida] para el código de golf. Si es un gran problema, creo que puedo modificarlo para no imprimirlos. Como lo hice Empecé con algo bastante estándar:Luego, observé que uno puede transformar definiciones de funciones como esta:
se convierte
Y la función llama así:
se convierte
Usé esta macro recursiva de Vim, almacenada en el registro
q
, para hacer la segunda (me hejk
asignado<Esc>
):f s(v(h(q(jkea))))jk@q
.Estas dos transformaciones fueron suficientes para eliminar todos los espacios.
fuente
Swift, @James Webster
Verificación: https://regex101.com/r/7ukrM0/1
fuente
(…)(4)
, ya que no es necesario convertir el entero literal a CShort.PHP, @ JörgHülsermann
221 bytes es demasiado largo (por lo tanto, la serpiente), y la falta de espacios en blanco se puede solucionar fácilmente.
Prettified:
fuente
Jelly, longitud 12, @JonathanAllan
Pruébalo en línea!
Cómo funciona
fuente
Jelly , 12 bytes, descifra la segunda respuesta de @ JonathanAllan
Pruébalo en línea!
Explicación
Esto es casi lo mismo que mi otra respuesta . Acabo de hacer dos cambios:
Primero, cambié
U
("invertir cada elemento") aṚ€
("invertir" "cada elemento"). Eso no ayuda por sí solo, porqueṚ
también está prohibido.Luego, cambié el
Ṛ
("reverso") a;@/
(/
"doblar por";
"concatenando"@
"en el orden opuesto a la lista original"). Eso evita todos los personajes prohibidos, dando una solución válida.Supongo que el siguiente paso sería comenzar a prohibir las manipulaciones rápidas de la matriz , además de los átomos.
fuente
€
...€
en términos de/
también. Es bastante más detallado que esta solución.;@\ṫ0
, la expresión regular se está alargando.Jelly, longitud 13, @JonathanAllan
Pruébalo en línea!
Cómo funciona
fuente
m
?Jelly, longitud 14, @JonathanAllan
Pruébalo en línea!
fuente
Scala, @Soapy
Hace tiempo que no toco a Scala, fue divertido volver a visitarlo. Desafortunadamente, esta solución se pierde muchas de las características interesantes de Scala.
Pruébalo aquí
Confirmación de expresiones regulares
fuente
QBasic (QB64), @DLosc
Tenga en cuenta que dado que el
.
no coincide\n
(U + 000A, LF), la nueva línea aquí es un\r
(U + 000D, CR).Verificar:
La principal dificultad es cómo insertar una palabra después de
;
. Afortunadamente, QB64 trata la RC como una nueva línea, mientras que la expresión regular de Python no lo hace, por lo que podríamos deslizarnosREM\r
aquí. De los cinco sabores de expresiones regulares permitidos,"\r" =~ /./
!/./.test('\r')
(\n
,\r
,\u2028
,\u2029
son todos los separadores de línea )re.match('.', '\r')
( solo\n
se considera un salto de línea )regexp.Match(".", "\r")
/./ =~ "\r"
Así que esta grieta está bien siempre que no mencionemos JavaScript ... 🤐
fuente
REM
inmediatamente después de una declaración sin separador de declaraciones. Mi solución original no utilizó comentarios. Tengo otra variación que publicaré en breve. : DPython 3, kennytm
Verificación de expresiones regulares
fuente
> <>, torcado
fuente
C, @Yimin Rong
El programa no puede contener números, pero podemos obtener números a través de:
c
, comúnmente conocido como "argc", que siempre es 2.+
y-
están disponibles, por lo que podemos crear 0 conn-n
y crear 1 cono=c;--o
.fuente
Ruby, @Value Ink
[(-=Z-~]*
significa "Puedo escribir lo que quiera :)"fuente
tinylisp, @DLosc
Una solución muy sencilla y totalmente optimizada :)
Llamar como
(disp (f 4))
.(p m n)
calcula m + n usando la restas
(m + n == m - ((1 - 1) - n))(j f g)
genera(f f+1 f+2 ... g-1)
(r f g)
genera(g-1 g-2 g-3 ... f)
(k m o f g n)
genera una fila de la matriz de serpiente y luego se repite para la siguiente fila, hasta que se creen n filas. Los argumentosm
,o
son sustituidos porj
/r
para generar aumento o disminución de filas. Los argumentosf
,g
están ejecutando índices para saber en qué fila estamos.(f n)
llama(k j r 1 1 n)
a comenzar la generación.fuente
(f 4)
--eldisp
está implícito.)PHP, @Ionut Botizan
Por el momento no tengo una mejor idea para descifrar la solución original.
Soporta n <= 15
Es la primera vez que uso getopt. Tal vez no sea la mejor idea para usar las opciones como entrada.
comenzar desde la línea de comando como esta
Regex original
Nivel 1:
Muy buena combinación de letras. Siéntase libre de votar el hilo de la policía.
Me bloquea funciones como - strrev - array_reverse - get_defined_vars
https://regex101.com/r/5rGTnw/2
Nivel 2:
https://regex101.com/r/XtVl9G/1
Solución
Nivel 2:
fuente