Bütün yol boyunca faktörler var!


23

Bu zorluk, bu fantastik animasyon şemasından esinlenmiştir (sohbete göndermedeki kusur sayesinde).

Bir giriş verildiğinde n, tüm ana faktörlerini belirtildiği gibi iç içe çokgenler olarak çizin.

Örneğin, bu sayı göz önüne alındığında, 357 = 17x7x3bir üçgende 3 nokta, bir heptagondaki bu üçgenlerin 7 versiyonu ve bu hepgononların 17 versiyonunu 17 gonda düzenlersiniz. Kısacası, iç içe çokgenler dıştaki en büyük ana faktörden içteki en küçük düzeye doğru gider. Çünkü 357cevabınız biraz buna benzemeli (renkli ya da renkli):

görüntü tanımını buraya girin

Her asalın her çokgeni >= 3diyagramın etrafında döndürülmemelidir.

Tek istisna 2özellikle garip güçler için en önemli olanı 2. 376 = 47x2x2x2Aşağıdaki örnekte görebileceğiniz gibi, 8s döner ve 2s satırları tek değildir , ancak 4s kare için dikey yığınlardır . 2Kareler halinde düzenlenmiş güçlerinin bile bu şekilde döndürülmeleri gerekmez.

görüntü tanımını buraya girin

Aslında, 448 = 7x2x2x2x2x2x2bir 64s heptagonuna benzeyen bir şemaya sahiptir ve 64bir kare kareler karesi şeklinde düzenlenmiştir, fakat dönüşsüzdür.

! [buraya görüntü açıklamasını girin

İki örnek daha 440 = 11x5x2x2x2ve 432 = 3x3x3x2x2x2x2. 440Tuhaf bir güçle 2'nin döndüğünü 8, ancak 432eşit güçle 2s'ini döndürmediğini görüyoruz 16.

görüntü tanımını buraya girin görüntü tanımını buraya girin

Sonunda, 10 = 5x2Python ve turtlemodülü ile alay ettiğim renk olmadan , minimal bir örnek .

görüntü tanımını buraya girin

Meydan okuma

  • Bir giriş nverildiğinde 1 <= n <= 10000, iç içe geçmiş faktör çokgenlerinin görüntüsünü çıkar.
  • Kurallar:
    • Görüntü, dışta (en büyük asal çarpan) yanları olan bir çokgenden, içte en küçük asal çarpana kadar iç içe çokgen noktalardan oluşur.
    • Faktör 2 için, 2'nin güçlerinin bir çizgi, sonra bir kare, sonra bir kare çizgi gibi istiflenmesi gerekir. 2 güçleri bile döndürülmemelidir. 2'lik tek güçler, kendi poligonlarının etrafında döndürülmeli ve dönmeden önce dikey olarak istiflenmelidir.
  • İstediğiniz gibi görüntüyü yönlendirebilirsiniz (tercih etsem de), ancak iç içe geçmiş her çokgen, 2'nin tek güçleri hariç, diğer çokgenlerle aynı yöne bakmalıdır.
  • Görüntü boyutu ve nokta boyutu için iki seçeneğiniz vardır:
    • Görüntü boyutu statiktir ve nokta boyutu narttıkça (animasyondaki gibi) azalır .
    • Nokta boyutu statiktir ve resim boyutu arttıkça büyür n.
  • İlk üç poligon katmanı, komşu poligonlardan (yani n=10000dokunmaz ) ayırt edilebilir olmalıdır, ancak görüntülerin ve etrafındaki görüntülerin büyüklüğü göz önüne alındığında , katlar dokunmaya başladıysa sorun olmaz. Yapmasalardı tercih ederdim, ancak Stack Exchange'e yüklenebilecek bir görüntüye uyması kaçınılmaz olabilir.
  • Renk isteğe bağlıdır.
  • Noktaların şekli size kalmış. Kareler diliniz için daha iyiyse, bunları kullanın.
  • Bonus yok, ama birisinin orijinal yazıdaki gibi diyagramları canlandırıp renklendirdiğini görmek istiyorum.

Conor O'Brien, EasterlyIrk, Martin Ender, Kritixi Lithos, Mego, DJ McMayhem ve El'endia Starman'a bu soruyu yazmadaki yardımları için teşekkürler.

Bu kod golf, yani en kısa kod kazanır. İyi şanslar ve iyi golf!

Yanıtlar:


8

Python 3.5, 331 309 308 306 304 bayt

Bu cevabın işe yaraması çokgenlerin (ve şartname de dürüst olmak gerekirse) aralarındaki karışıklıkla biraz uğraştı, ama sonunda yaptım ve umarım diğer cevaplar gelmeye başlayabilir.

Düzenleme: FlipTack sayesinde -2 bayt. -8 bayt daha önce kaldırmayı unuttum bir kod bölümünü kaldırma. Son işlevin golf oynamaktan -12 bayt. -1 çizimler çevresi değiştirmesini bayt size=2500için size=2e3(ekranlarında daha iyi oturması için ayrıca çizimler sağlar, diameter ~= 795.77aşağı diameter ~= 636.62). Bir hatayı düzeltmekten -2 bayt. Yaptığım şekilde yeniden yapılanmadan -2 bayt a.

Golf önerileri kabul edilir. Test etmek için biblo ve kısa bir süre sonra takip edilecek görüntüler.

from math import*
from turtle import*
ht();pu()
def g(n):
 i=1;a=[]
 while n%4<1:a+=4,;n//=4
 while n>1:
  i+=1
  while n%i<1:a+=i,;n//=i
 return f(a,2e3)
def f(a,s,x=0,y=0,t=0):
 if a:
  *c,b=a;s/=b
  for i in range(b):u=2*pi*i/b+t*(b<3)+pi/4*(b==4);f(c,s,x+s*sin(u),y+s*cos(u),u)
 else:goto(x,y);dot(4)

İşte g(448)şimdi, 1366x768 ekranıma uyuyor.

görüntü tanımını buraya girin

Ungolfing

import math
import turtle

turtle.hideturtle()     # don't display the turtle itself)
turtle.penup()          # don't draw lines, just dots later on

def g(n):
    i = 1
    a = []
    while n % 4 == 0:   # get 4's into the list first,
        a = a + [4]     # so that the fractal will be easier to structure
        n = n // 4
    while n > 1:        # now get all of the other factors (including any stray 2's)
        i += 1
        while n % i == 0:
            a = a + [i]
            n = n // i
    return f(a, 2000)   # 2000 is the circumference of the circle
                        # on which we draw the polygons
def f(a, s, x=0, y=0, t=0):
    if a:
        c = a[-1]       # the size of the current outermost polygon
        b = a[:-1]      # the rest of the factors for recursion
        s = s/b         # the current circumference / the number of polygons at this layer
        for i in range(b):
            u = 2*math.pi*i/b   # angle around the circle
            if b == 2:          # if b == 2, add the previous angle to rotate the structure
                u += t
            if b == 4:          # if b == 4, add 45 degrees to keep the squares upright
                u += math.pi/4
            dx = s * math.sin(u)    # our coordinate changes for this polygon
            dy = s * math.cos(u)
            f(c, s, x+dx, y+dy, u)  # call the function again
                                    # on a new circle with new starting coordinates
    else:                   # when we run out of factors,
        turtle.goto(x,y)    # go to each coordinate
        turtle.dot(4)       # and draw a dot

olması n = n //= igerekiyordu n//= i?
Bobas_Pett

@Bobas_Pett Nah, ungolfing / açıklamaya bakıyorsunuz ve bunun söylenmesi gerekiyor n = n // i. Ben gidip onu düzeltip açıklamaya ekleyeceğim.
Sherlock9
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.