Czynniki są na samym dole!

23

To wyzwanie jest inspirowane fantastycznym animowanym diagramem (dzięki flawr za opublikowanie go na czacie).

Biorąc pod uwagę dane wejściowe n, narysuj wszystkie jego czynniki pierwsze jako zagnieżdżone wielokąty kropek, jak określono.

Na przykład, biorąc pod uwagę liczbę 357 = 17x7x3, układasz 3 kropki w trójkącie, 7 wersji tych trójkątów w heptagonie i 17 wersji tych heptagonów w 17-gon. Krótko mówiąc, zagnieżdżone wielokąty przechodzą od największego czynnika pierwotnego na zewnątrz do najmniejszego w środku. Dla 357Twoja odpowiedź powinna wyglądać trochę tak (z lub bez koloru):

wprowadź opis zdjęcia tutaj

Każdy wielokąt każdej liczby pierwszej >= 3nie powinien być obracany wokół diagramu.

Jedynym wyjątkiem jest liczba pierwsza 2, szczególnie dla nieparzystych mocy 2. Jak widać na poniższym przykładzie 376 = 47x2x2x2, 8s obracają się i nie są pojedynczymi liniami 2s, ale pionowymi stosami dla 4s w kwadracie. Nawet moce 2ułożone w kwadraty nie muszą być obracane w ten sposób.

wprowadź opis zdjęcia tutaj

W rzeczywistości 448 = 7x2x2x2x2x2x2ma schemat, który wygląda jak heptagon 64s, i 64jest ułożony w kwadrat kwadratów kwadratów, ale bez obrotu.

! [wprowadź opis zdjęcia tutaj

Dwa kolejne przykłady to 440 = 11x5x2x2x2i 432 = 3x3x3x2x2x2x2. Widzimy, że 440przy nieparzystej sile 2 obrócił 8s, ale 432przy parzystej sile 2nie obraca 16s.

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

I na koniec, oto minimalny przykład, 10 = 5x2bez koloru, który wyśmiewałem za pomocą Pythona i jego turtlemodułu.

wprowadź opis zdjęcia tutaj

Wyzwanie

  • Biorąc pod uwagę wejście, w nktórym 1 <= n <= 10000wyprowadza obraz jego zagnieżdżonych wielokątów czynnikowych.
  • Zasady są następujące:
    • Obraz składa się z zagnieżdżonych wielokątów kropek, od wielokąta o bokach (największy czynnik pierwotny) na zewnątrz do najmniejszego czynnika pierwotnego wewnątrz.
    • Dla współczynnika 2 potęgi 2 powinny się kumulować jako linia, następnie kwadraty, następnie linia kwadratów i tak dalej. Nawet potęgi 2 nie należy obracać. Dziwne moce 2 powinny być obracane wokół ich odpowiednich wielokątów i powinny być ułożone pionowo przed obrotem.
  • Możesz ustawić obraz w dowolny sposób (chociaż wolę w górę), ale każdy zagnieżdżony wielokąt powinien być skierowany w tym samym kierunku, co każdy inny wielokąt, z wyjątkiem nieparzystych potęg 2.
  • Masz dwie opcje rozmiaru obrazu i rozmiaru kropki:
    • Rozmiar obrazu jest statyczny, a rozmiar kropki zmniejsza się wraz ze nwzrostem (jak w animacji).
    • Rozmiar kropki jest statyczny, a rozmiar obrazu rośnie wraz ze nwzrostem.
  • Pierwsze trzy warstwy wielokątów powinny być odróżnialne od sąsiednich wielokątów (tj. Nie dotykają się), ale biorąc pod uwagę rozmiar obrazów w okolicach n=10000, dobrze jest, jeśli warstwy po dotknięciu zaczną się dotykać. Wolałbym, gdyby tak nie było, ale dopasowanie obrazu, który można załadować do Stack Exchange, może być nieuniknione.
  • Kolor jest opcjonalny.
  • Kształt kropek zależy od ciebie. Jeśli kwadraty są lepsze dla twojego języka, użyj ich.
  • Brak bonusów, ale chciałbym zobaczyć, jak ktoś animuje i pokoloruje diagramy jak w oryginalnym poście.

Podziękowania dla Conora O'Briena, EasterlyIrk, Martina Endera, Kritixi Lithos, Mego, DJ McMayhem i El'endii Starman za pomoc w napisaniu tego pytania.

Ten kod golfowy, więc najkrótszy kod wygrywa. Powodzenia i dobrej gry w golfa!

Sherlock9
źródło

Odpowiedzi:

8

Python 3.5, 331 309 308 306 304 bajty

Zajęło to sporo bałaganu z odstępami między wielokątami (i specyfikacją, szczerze mówiąc), aby ta odpowiedź zadziałała, ale w końcu to zrobiłem i mam nadzieję, że inne odpowiedzi zaczną się pojawiać.

Edycja: -2 bajty dzięki FlipTack. -8 bajtów od usunięcia fragmentu kodu, który zapomniałem usunąć wcześniej. -12 bajtów od gry w golfa ostatniej funkcji. -1 bajt od zmiany obwodu rysunków z size=2500na size=2e3, co pozwala również lepiej dopasować rysunki na ekranach ( diameter ~= 795.77do diameter ~= 636.62). -2 bajty od naprawienia błędu. -2 bajty od restrukturyzacji jak buduję a.

Sugestie dotyczące gry w golfa mile widziane. Talizman do testowania i zdjęcia do obejrzenia wkrótce.

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)

Oto g(448) , co teraz pasuje do mojego ekranu 1366x768.

wprowadź opis zdjęcia tutaj

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
Sherlock9
źródło
to n = n //= imiało być n//= i?
Bobas_Pett
@Bas_Pett Nie, patrzysz na niepoznanie / wyjaśnienie, i to powinno powiedzieć n = n // i. Zajmę się tym i dodam wyjaśnienie, gdy będę przy nim.
Sherlock9