Polygones dans un cube

Oct 22 2020

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

7 cardboard_box Oct 26 2020 at 04:15

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