Determina se le coordinate razionali si trovano nel triangolo Sierpinski destro


9

Il triangolo Sierpinski è un insieme di punti sul piano che viene costruito partendo da un singolo triangolo e dividendo ripetutamente tutti i triangoli in quattro triangoli congruenti e rimuovendo il triangolo centrale. Il triangolo di Sierpinski destra ha angoli a (0,0), (0,1)e (1,0), e si presenta così:

Triangolo di Sierpinski

Alcune definizioni equivalenti di questo set sono le seguenti:

  • Punti nella niterazione del processo sopra descritto, per tutti n.

  • Punti (x,y)con 0 <= x <= 1e 0 <= y <= 1tali che per tutti i numeri interi positivi n, il nbit th nell'espansione binaria di xey non sono entrambi 1.

  • Permettere T = {(0,0),(1,0),(0,1)}

    Sia funa funzione su insiemi di punti 2D definiti da quanto segue:

    f(X) = {(0,0)} ∪ {(x+t)/2 | x∈X, t∈T}

    Quindi il triangolo Sierpinski destro è la chiusura topologica del punto meno fisso (per set contenimento) di f.

  • Lascia che Ssia il quadrato{(x,y) | 0<=x<=1 and 0<=y<=1}

    Let g(X) = S ∩ {(x+t)/2 | x∈(X), t∈T}(dove Tè come sopra definito)

    Quindi il triangolo Sierpinski destro è il più grande punto fisso di g.

Sfida

Scrivi un programma o una funzione che accetta 4 numeri interi a,b,c,de fornisce un valore di verità se (a/b,c/d)appartiene al triangolo Sierpinski destro, e in caso contrario fornisce un valore di falsa.

punteggio

Questo è un codice golf. Vince il codice più breve in byte.

Casi test

I seguenti sono nel triangolo Sierpinski destro:

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

Quanto segue non è nel triangolo Sierpinski giusto:

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

È -1 -3 1 1un input valido?
xnor

Sì, questo è un input valido. Ho aggiunto casi di test per chiarire questo.
cardboard_box

Risposte:


5

Python 2, 68

lambda n,d,N,D:1>=n/d>=0<=N/D<=1and(n<<abs(D*d))/d&(N<<abs(D*d))/D<1

Un bel modo per verificare l'appartenenza alla guarnizione reso brutto. Se ci fosse garantito che gli input sono non negativi e nel riquadro unità, avremmo 38:

lambda n,d,N,D:(n<<D*d)/d&(N<<D*d)/D<1

L'idea è che controlliamo se un punto si trova all'interno della guarnizione controllando se la loro frazione binaria si espande bit a bit-AND a 0. Per ottenere il primo kcarattere dell'espansione, spostiamo i kbit numeratori rimasti prima di dividere il numero intero per il denominatore . Dobbiamo essere ksufficientemente grandi da poter ripetere. Notiamo che l'espansione binaria n/dha un periodo al massimo d, quindi le espansioni congiunte hanno un periodo al massimo d*D, quindi è k=d*Dsufficiente.

Il resto è verificare se la frazione è nella casella e isolare dagli input dati come -1/-3.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.