Le triangle de Sierpinski est un ensemble de points sur le plan qui est construit en commençant par un seul triangle et en divisant à plusieurs reprises tous les triangles en quatre triangles congruents et en supprimant le triangle central. Le triangle de Sierpinski droit a des coins à (0,0)
, (0,1)
et (1,0)
, et ressemble à ceci:
Certaines définitions équivalentes de cet ensemble sont les suivantes:
Points dans l'
n
itération du processus décrit ci-dessus, pour tousn
.Points
(x,y)
avec0 <= x <= 1
et0 <= y <= 1
tels que pour tous les entiers positifsn
, len
bit e dans l'expansion binaire de x et y ne soit pas les deux1
.Laisser
T = {(0,0),(1,0),(0,1)}
Soit
f
une fonction sur des ensembles de points 2D définis par ce qui suit:f(X) = {(0,0)} ∪ {(x+t)/2 | x∈X, t∈T}
Ensuite, le triangle de Sierpinski droit est la fermeture topologique du point le moins fixe (par confinement défini) de
f
.Soit
S
le carré{(x,y) | 0<=x<=1 and 0<=y<=1}
Soit
g(X) = S ∩ {(x+t)/2 | x∈(X), t∈T}
(oùT
est tel que défini ci-dessus)Ensuite, le triangle de Sierpinski droit est le plus grand point fixe de
g
.
Défi
Écrivez un programme ou une fonction qui accepte 4 entiers, a,b,c,d
et donne une valeur vraie si elle (a/b,c/d)
appartient au triangle de Sierpinski droit, et sinon donne une valeur de falsey.
Notation
Ceci est un golf de code. Le code le plus court en octets gagne.
Cas de test
Les éléments suivants sont dans le triangle de Sierpinski droit:
0 1 0 1
0 1 12345 123456
27 100 73 100
1 7 2 7
8 9 2 21
8 15 20 63
-1 -7 2 7
Les éléments suivants ne sont pas dans le triangle de Sierpinski droit:
1 1 1 1
-1 100 1 3
1 3 1 3
1 23 1 7
4 63 3 66
58 217 4351 7577
-1 -7 3 7
la source
-1 -3 1 1
une entrée valide?Réponses:
Python 2, 68
Une belle façon de vérifier que l'adhésion au joint est moche. Si on nous garantissait que les entrées sont non négatives et dans le carré unitaire, nous aurions 38:
L'idée est que nous vérifions si un point se trouve dans le joint en vérifiant si leur expansion binaire bit à bit ET à 0. Pour obtenir le premier
k
caractère de l'expansion, nous décalons lesk
bits du numérateur à gauche avant la division entière par le dénominateur . Nous devons fairek
suffisamment grand pour attraper une répétition. Nous notons que l'expansion binairen/d
a une période au plusd
, donc les expansions conjointes ont une période au plusd*D
, donc celak=d*D
suffit.Le reste consiste à vérifier si la fraction est dans la boîte et à l'isoler des entrées données comme
-1/-3
.la source