Desafío
Este desafío tendrá que escribir un programa que toma en dos enteros n
y m
y da salida a los números de bucles que no se cruzan en el n
de m
toro hechas comenzando en (0,0)
y sólo dando pasos hacia arriba y hacia la derecha. Puedes pensar en el toro como la cuadrícula con envoltura tanto en la parte superior como en la inferior y en los lados.
Este es el código de golf, por lo que gana menos bytes.
Ejemplo
Por ejemplo, si la entrada es n=m=5
, una caminata válida es
(0,0) -> (0,1) -> (0,2) -> (1,2) -> (2,2) -> (2,3) -> (2,4) ->
(2,0) -> (3,0) -> (4,0) -> (4,1) -> (4,2) -> (4,3) ->
(0,3) -> (1,3) -> (1,4) ->
(1,0) -> (1,1) -> (2,1) -> (3,1) -> (3,2) -> (3,3) -> (3,4) -> (4,4) ->
(0,4) -> (0,0)
como se muestra en el gráfico.
Algunos ejemplos de entradas / salidas
f(1,1) = 2 (up or right)
f(1,2) = 2 (up or right-right)
f(2,2) = 4 (up-up, up-right-up-right, right-right, right-up-right-up)
f(2,3) = 7
f(3,3) = 22
f(2,4) = 13
f(3,4) = 66
f(4,4) = 258
code-golf
combinatorics
grid
topology
Peter Kagey
fuente
fuente
Respuestas:
Jalea , 28 bytes
Un enlace monádico que acepta una lista
[m,n]
, que produce el recuento.TIO-jt1qe1v9 ... aunque tiene poco sentido, es demasiado ineficiente.
(¡Ni siquiera puedo ejecutar
[2,3]
localmente con 16 GB de RAM)!¿Cómo?
Fuerza bruta: crea coordenadas de una versión en mosaico lo suficientemente grande, luego filtra el conjunto de potencia de estos puntos a esos caminos con vecinos que solo aumentan en uno en una sola dirección, luego filtra a aquellos que comienzan en una coordenada mínima (es decir, el origen) y, al mismo tiempo, elimina esta coordenada de inicio de cada uno. Luego usa la aritmética de módulo para regresar a un toro y filtra cualquier coordenada que contenga duplicados (es decir, aquellos que contienen intersecciones) y, finalmente, filtra a aquellos con coordenadas finales mínimas (es decir, que termina en el origen) y produce la longitud del resultado.
fuente
Python 2 , 87 bytes
Pruébalo en línea!
Lo interesante aquí es usar un número complejo
z
para almacenar la coordenada de la posición actual. Podemos subir agregando1
y mover a la derecha agregando1j
. Para mi sorpresa, el módulo funciona en números complejos de una manera que nos permite manejar el ajuste para cada dimensión por separado: haciendo%m
actos en la parte real y%(n*1j)
actos en la parte imaginaria.fuente
k:=x+y*m
. Me hace preguntarme si sería más corto usarlok
directamente(x,y)
, usarlo enx+y*m
lugar de hacerlox+y*1j
. Lástima que Python 3 no permita módulos complejos.JavaScript (ES6), 67 bytes
Toma entrada como
(m)(n)
.Pruébalo en línea!
Para que funcione para cualquier entrada, podríamos usar BigInts para 73 bytes :
Pruébalo en línea!
JavaScript (ES6),
76 7372 bytesToma entrada como
(m)(n)
.Pruébalo en línea!
Comentado
fuente
Haskell,
8880 bytesPruébalo en línea!
Fuerza bruta simple: intente todas las combinaciones arriba / derecha, descartando las que se cruzan (mantenemos todas las posiciones que hemos visitado en la lista
a
) y contando las que finalmente llegan a la posición positiva(0,0)
nuevamente.El caso base de la recursión es cuando visitamos una posición por segunda vez (
elem(x,y)a
). El resultado es0^0
=1
cuando la posición es(0,0)
y cuenta hacia el número de bucles o0
(0^x
, conx
no-cero) de otra manera y no aumenta el número de bucles.Editar: -8 bytes gracias a @xnor.
fuente
|elem(x,y)a=0^(x+y)
y(0!0)[]
pueden ser0!0$[]
.Jalea , 44 bytes
Pruébalo en línea!
fuente
Java 8, 120 bytes
Pruébalo en línea.
fuente
CJam (50 caracteres)
Demo en línea . Este es un programa que toma dos entradas de stdin.
Finalmente tenemos una respuesta a la pregunta.
Disección
fuente
Gelatina ,
5439 bytesPruébalo en línea!
He publicado esto como una respuesta separada a mi otra Jelly porque es un método completamente diferente. Esto está más cerca en principio de la respuesta de @ Arnauld. Utiliza una función recursiva que funciona a través de todas las rutas posibles hasta que llega a un punto al que ya llegó, y luego devuelve el resultado de una comprobación de si ha vuelto al inicio. Sospecho que podrían eliminarse unos pocos bytes más. Ahora cambió a usar el operador de corte. Funciona bien para hasta 5x5. La profundidad de recursión debe ser como máximo mx n.
fuente