Das Sierpinski-Dreieck ist eine Reihe von Punkten in der Ebene, die konstruiert werden, indem mit einem einzelnen Dreieck begonnen wird und alle Dreiecke wiederholt in vier kongruente Dreiecke aufgeteilt und das mittlere Dreieck entfernt werden. Das rechte Sierpinski Dreieck hat Ecken an (0,0)
, (0,1)
und (1,0)
, und sieht wie folgt aus :
Einige äquivalente Definitionen dieses Satzes lauten wie folgt:
Punkte in der
n
Iteration des oben beschriebenen Prozesses für allen
.Punkte
(x,y)
mit0 <= x <= 1
und0 <= y <= 1
so, dass für alle positiven ganzen Zahlenn
dasn
th-Bit in der binären Erweiterung von x und y nicht beide sind1
.Lassen
T = {(0,0),(1,0),(0,1)}
Sei
f
eine Funktion für Sätze von 2D-Punkten, die durch Folgendes definiert sind:f(X) = {(0,0)} ∪ {(x+t)/2 | x∈X, t∈T}
Dann ist das rechte Sierpinski-Dreieck der topologische Verschluss des am wenigsten festen Punktes (durch Mengeneinschluss) von
f
.Sei
S
das Quadrat{(x,y) | 0<=x<=1 and 0<=y<=1}
Lassen Sie
g(X) = S ∩ {(x+t)/2 | x∈(X), t∈T}
(woT
ist wie oben definiert)Dann ist das rechte Sierpinski-Dreieck der größte Fixpunkt von
g
.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die 4 Ganzzahlen akzeptiert a,b,c,d
und einen wahrheitsgemäßen Wert angibt, wenn (a/b,c/d)
er zum rechten Sierpinski-Dreieck gehört, und ansonsten einen falschen Wert.
Wertung
Dies ist ein Code Golf. Der kürzeste Code in Bytes gewinnt.
Testfälle
Folgendes befindet sich im rechten Sierpinski-Dreieck:
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
Folgendes befindet sich nicht im rechten Sierpinski-Dreieck:
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
quelle
-1 -3 1 1
eine gültige Eingabe?Antworten:
Python 2, 68
Ein guter Weg, um nach einer Mitgliedschaft in der Dichtung zu suchen, die hässlich gemacht wurde. Wenn wir garantiert wären, dass die Eingaben nicht negativ sind und sich im Einheitsquadrat befinden, hätten wir 38:
Die Idee ist, dass wir prüfen, ob ein Punkt innerhalb der Dichtung liegt, indem wir prüfen, ob sich ihr binärer Bruch bitweise UND auf 0 ausdehnt. Um das erste
k
Zeichen der Erweiterung zu erhalten, verschieben wir die Zählerbitsk
vor der Ganzzahldivision durch den Nenner . Wir müssenk
ausreichend groß machen, um eine Wiederholung zu fangen. Wir stellen fest, dass die binäre Erweiterungn/d
höchstens eine Periode hatd
, so dass die gemeinsamen Erweiterungen höchstens eine Periode habend*D
, wask=d*D
ausreicht.Der Rest besteht darin, zu prüfen, ob sich der Bruch in der Box befindet, und gegen Eingaben zu isolieren, die wie angegeben sind
-1/-3
.quelle