Rasyonel koordinatların doğru Sierpinski üçgeninde olup olmadığını belirleme


9

Sierpinski üçgeni tek bir üçgen ile başlayan ve art arda dört uyumlu üçgen halinde tüm üçgenler bölme ve merkez üçgen çıkarılmasıyla oluşturulur düzlem üzerindeki noktalardan bir kümesidir. Sağ Sierpinski üçgeni de köşeleri vardır (0,0), (0,1)ve (1,0), ve bakışlar bu gibi:

Sierpinski üçgeni

Bu setin eşdeğer bazı tanımları aşağıdaki gibidir:

  • Puanlar nişlemin inci iterasyon için yukarıda tarif edilen n.

  • Nokta (x,y)ile 0 <= x <= 1ve 0 <= y <= 1tüm pozitif tamsayılar için böyle n, ninci x ikili genişleme bit ve y her ikisi değildir 1.

  • İzin Vermek T = {(0,0),(1,0),(0,1)}

    Izin vermek faşağıdakiler tarafından tanımlanan 2D nokta kümeleri üzerinde bir işlev olabilir:

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

    Daha sonra sağ Sierpinski üçgen topolojik kapatma bölgesinin en azından sabit nokta arasında (resim içine konarak) f.

  • Izin vermek Skare{(x,y) | 0<=x<=1 and 0<=y<=1}

    Let g(X) = S ∩ {(x+t)/2 | x∈(X), t∈T}( Tyukarıda tanımlandığı gibidir)

    O zaman doğru Sierpinski üçgeni en büyük sabit noktadır g.

Meydan okuma

4 tamsayıyı kabul eden ve doğru Sierpinski üçgenine aitse a,b,c,ddoğruluk değeri (a/b,c/d)veren ve aksi halde falsey değeri veren bir program veya işlev yazın .

puanlama

Bu bir kod golf. Bayt cinsinden en kısa kod kazanır.

Test senaryoları

Aşağıdakiler sağ Sierpinski üçgeninde:

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

Aşağıdakiler sağ Sierpinski üçgeninde değil:

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 1geçerli bir girdi?
xnor

Evet, bu geçerli bir girdi. Bunu netleştirmek için test senaryoları ekledim.
cardboard_box

Yanıtlar:


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

Çirkin conta üyeliğini kontrol etmek için güzel bir yol. Girişlerin negatif olmadığı ve birim karede olduğu garanti edildiysek 38 olurdu:

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

Fikir biz onların ikili kesir açılımları ilk almak için bitsel-VE 0'a olmadığını kontrol ederek conta içindeki bir nokta yalanlar olmadığını kontrol olmasıdır kgenişleme karakteri, biz bit-shift pay kpayda tarafından tamsayı-bölünmesi önce sol bitleri . kTekrarı yakalamak için yeterince büyük yapmamız gerekiyor . İkili genişlemenin n/den fazla periyodu olduğunu d, bu nedenle ortak açılımların en fazla periyodu olduğunu d*D, bu nedenle k=d*Dyeterli olduğunu belirtiyoruz.

Gerisi, kesirin kutuda olup olmadığını kontrol etmek ve benzer girişlere karşı yalıtmaktır -1/-3.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.