Défi
Ce défi vous obligera à écrire un programme qui prend deux entiers n
et m
génère le nombre de boucles sans intersection sur le n
by m
torus faites en commençant par (0,0)
et en ne faisant que des pas vers le haut et vers la droite. Vous pouvez considérer le tore comme la grille avec un enroulement à la fois en haut et en bas et sur les côtés.
C'est le code-golf donc le moins d'octets gagne.
Exemple
Par exemple, si l'entrée est n=m=5
, une marche valide est
(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)
comme le montre le graphique.
Quelques exemples d'entrées / sorties
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
la source
la source
Réponses:
Gelée , 28 octets
Un lien monadique acceptant une liste
[m,n]
, ce qui donne le compte.TIO-jt1qe1v9 ... bien qu'il y ait peu d'intérêt, c'est beaucoup trop inefficace.
(Je ne peux même pas courir
[2,3]
localement avec 16 Go de RAM)!Comment?
Force brute - crée les coordonnées d'une version en mosaïque assez grande, puis filtre l'ensemble de puissance de ces points sur les chemins dont les voisins n'augmentent que d'un dans une seule direction, puis filtre ceux qui commencent à une coordonnée minimale (c'est-à-dire l'origine) et, en même temps, supprime cette coordonnée de départ de chacun. Utilise ensuite l'arithmétique modulo pour revenir à un tore et filtre toutes les coordonnées en double contenant (c'est-à-dire celles contenant des intersections) et, enfin, filtre celles qui ont des coordonnées de fin minimales (c'est-à-dire se terminant à l'origine) et donne la longueur du résultat.
la source
Python 2 , 87 octets
Essayez-le en ligne!
La chose intéressante ici est d'utiliser un nombre complexe
z
pour stocker les coordonnées de la position actuelle. Nous pouvons monter en ajoutant1
et aller à droite en ajoutant1j
. À ma grande surprise, modulo travaille sur des nombres complexes d'une manière qui nous permet de gérer le wrapping pour chaque dimension séparément: faire des%m
actes sur la partie réelle et%(n*1j)
agir sur la partie imaginaire.la source
k:=x+y*m
. Cela me fait me demander s'il serait plus court d'utiliserk
directement pour(x,y)
, en utilisantx+y*m
plutôt qu'enx+y*1j
. Dommage Python 3 ne permet pas de module complexe.JavaScript (ES6), 67 octets
Prend l'entrée comme
(m)(n)
.Essayez-le en ligne!
Pour le faire fonctionner pour n'importe quelle entrée, nous pourrions utiliser BigInts pour 73 octets :
Essayez-le en ligne!
JavaScript (ES6),
76 7372 octetsPrend l'entrée comme
(m)(n)
.Essayez-le en ligne!
Commenté
la source
Haskell,
8880 octetsEssayez-le en ligne!
Force brute simple: essayez toutes les combinaisons haut / droite, supprimez celles qui se croisent (nous gardons toutes les positions que nous avons visitées dans la liste
a
) et comptez celles qui finissent par atteindre la position(0,0)
.Le cas de base de la récursivité est lorsque nous visitons une position une deuxième fois (
elem(x,y)a
). Le résultat est0^0
=1
lorsque la position est(0,0)
et compte pour le nombre de boucles ou0
(0^x
, avecx
non nul) sinon et n'augmente pas le nombre de boucles.Edit: -8 octets grâce à @xnor.
la source
|elem(x,y)a=0^(x+y)
et(0!0)[]
peuvent l'être0!0$[]
.Gelée , 44 octets
Essayez-le en ligne!
la source
Java 8, 120 octets
Essayez-le en ligne.
la source
CJam (50 caractères)
Démo en ligne . Il s'agit d'un programme qui prend deux entrées de stdin.
Enfin, nous avons une réponse à la question
Dissection
la source
Gelée ,
5439 octetsEssayez-le en ligne!
J'ai posté cela comme une réponse distincte à mon autre Jelly car c'est une méthode complètement différente. Ceci est plus proche en principe de la réponse de @ Arnauld. Il utilise une fonction récursive qui fonctionne à travers tous les chemins possibles jusqu'à ce qu'il atteigne un point déjà atteint, puis retourne le résultat d'une vérification pour savoir s'il est de retour au début. Je soupçonne que quelques octets supplémentaires pourraient être rasés. Maintenant changé en utilisant l'opérateur de tranche. Cela fonctionne bien jusqu'à 5x5. La profondeur de récursivité doit être au plus mx n.
la source