Polygones dans un cube
Inspiré en partie par cette vidéo de Mathologer sur de superbes preuves visuelles "rétrécies" , et mon intérêt général pour le sujet , ce défi vous fera compter des polygones réguliers avec des coordonnées entières en 3D.
Vous recevrez une entrée n, qui est un entier non négatif. Votre programme devrait trouver le nombre de sous-ensembles de \$\{0, 1, \dots, n\}^3\$tel que les points sont les sommets d'un polygone régulier. Autrement dit, les sommets doivent être des coordonnées 3D avec des entiers non négatifs inférieurs ou égaux à \$n\$.
Exemples
Pour \$n = 4\$, il y a \$2190\$polygones réguliers: \$1264\$triangles équilatéraux, \$810\$carrés, et \$116\$hexagones réguliers. Un exemple de chacun:
- Triangle: \$(1,0,1), (0,4,0), (4,3,1)\$
- Carré: \$(1,0,0), (4,3,0), (3,4,4), (0,1,4)\$
- Hexagone: \$(1,1,0), (0,3,1), (1,4,3), (3,3,4), (4,1,3), (3,0,1)\$
La séquence (indexée à zéro) commence:
0, 14, 138, 640, 2190, 6042, 13824, 28400, 53484, 94126, 156462, 248568, 380802, 564242, 813528, 1146472, 1581936, 2143878, 2857194, 3749240, 4854942, 6210442
Règles
Pour éviter les types de forçage brutal les plus naïfs et les plus inintéressants, votre programme doit être capable de gérer jusqu'à \$a(5) = 6042\$sur TIO .
C'est un défi de code-golf , donc le code le plus court l'emporte.
Ceci est maintenant sur l'encyclopédie en ligne des séquences d'entiers sous le nom A338323 .
Réponses
Python 2 ,
330
313 octets
import numpy as N,itertools as I
L=list
D=N.dot
n=input()
def G((a,b,c)):
A=a
while 1:
u=b-a;v=c-b;d=D(v,v)
if D(u,u)-d:return 0
p=2*D(u,v)*v
a,b,c=b,c,c+a-b+p/d
if(p%d|(c<0)|(c>n)).any()or L(a)<L(A):return 0
if L(a)==L(A):return 1
print sum(map(G,I.permutations(N.indices((n+1,)*3).reshape(3,-1).T,3)))/2
Essayez-le en ligne!
TIO a passé à 36.893 scalculer a(5) = 6042, donc cette solution est juste assez rapide.
Étant donné 3 points consécutifs d'un polygone régulier a,b,c, le point suivant est d = c + a - b + 2*proj(b-a, c-b)(où projest la projection vectorielle). Ma solution parcourt tous les triplets de points et détermine s'ils forment un polygone à l'aide de cette formule.
Vérifié a(7) = 28400sur ma machine.
-17 octets d'ovs