Це фактори аж донизу!


23

Це завдання надихає ця фантастична анімована діаграма (дякую недоліку за публікацію її у чаті).

Давши вклад n, намалюйте всі його основні фактори як вкладені багатокутники крапок, як зазначено.

Наприклад, з урахуванням числа 357 = 17x7x3 ви розташовуєте 3 крапки в трикутнику, 7 версій цих трикутників у шестикутнику та 17 варіантів цих шестикутників у 17-кут. Коротше кажучи, вкладені багатокутники переходять від найбільшого основного фактора зовні та до найменшого зсередини. Бо 357ваша відповідь повинна виглядати приблизно так (з кольором або без нього):

введіть тут опис зображення

Кожен многокутник кожного простого >= 3не повинен обертатися навколо діаграми.

Єдиним винятком є ​​прем'єр 2, спеціально для непарних повноважень Росії 2. Як ви бачите в прикладі 376 = 47x2x2x2нижче, 8s обертаються і не є одиночними лініями 2s, а є вертикальними стеками для 4s в квадрат. Навіть повноваження 2, розташовані в квадратах, не потрібно обертати таким чином.

введіть тут опис зображення

Насправді 448 = 7x2x2x2x2x2x2має діаграму, яка схожа на шестикутник 64s, і 64розташована на квадрат квадратів, але без обертання.

! [введіть тут опис зображення

Ще два приклади є 440 = 11x5x2x2x2і 432 = 3x3x3x2x2x2x2. Ми бачимо, що 440з непарною силою 2 обертається 8s, але 432з парною силою 2не обертає свою 16s.

введіть тут опис зображення введіть тут опис зображення

І нарешті, ось мінімальний приклад, 10 = 5x2без кольору, який я знущався з Python та його turtleмодулем.

введіть тут опис зображення

Змагання

  • Даний ввід nде 1 <= n <= 10000, виведіть зображення його вкладених багатокутників фактора.
  • Правила:
    • Зображення складається з вкладених багатокутників крапок, від багатокутника з (найбільшим основним фактором) сторонами на зовнішній стороні до найменшого основного фактора зсередини.
    • Для коефіцієнта 2 сили 2 повинні складатись як лінія, то квадрати, то лінія квадратів тощо. Навіть сили 2 не повинні повертатися. Непарні сили 2 повинні обертатися навколо відповідних багатокутників, і вони повинні розташовуватися вертикально перед обертанням.
  • Ви можете орієнтувати зображення, як вам подобається (хоча я віддаю перевагу), але кожен вкладений багатокутник повинен бути в тому ж напрямку, що і будь-який інший багатокутник за винятком непарних потужностей 2.
  • У вас є два варіанти розміру зображення та розміру крапки:
    • Розмір зображення статичний, а розмір крапки зменшується зі nзбільшенням (як в анімації).
    • Розмір крапки є статичним, а розмір зображення зростає зі nзбільшенням.
  • Перші три шари багатокутників повинні відрізнятись від сусідніх багатокутників (тобто не торкатися), але враховуючи розмір зображень біля та навколо n=10000, добре, якщо шари після початку торкатися. Я вважаю за краще, якщо цього не зробили, але це може бути неминуче розміщення на зображенні, яке можна завантажити в Stack Exchange.
  • Колір необов’язковий.
  • Форма крапок залежить від вас. Якщо квадрати краще вашої мови, використовуйте їх.
  • Ніяких бонусів, але я хотів би, щоб хтось анімував і розмальовував діаграми, як у оригінальній публікації.

Дякуємо Конору О'Браєну, EasterlyIrk, Мартіну Ендеру, Критіксі Літосу, Мего, DJ McMayhem та El'endia Starman за допомогу в написанні цього питання.

Це код гольфу, тому виграє найкоротший код. Успіхів і хорошого гольфу!

Відповіді:


8

Python 3.5, 331 309 308 306 304 байт

Потрібно було дуже багато возитися з інтервалом між полігонами (і специфікацією теж, чесно кажучи), щоб ця відповідь спрацювала, але я нарешті це зробив, і, сподіваюся, інші відповіді можуть почати надходити.

Редагувати: -2 байти завдяки FlipTack. -8 байт, щоб видалити розділ коду, який я раніше забув видалити. -12 байт від гольфу останньої функції. -1 байт від зміни окружності малюнків на size=2500до size=2e3, що також дозволяє малюнкам краще розміщуватися на екранах ( diameter ~= 795.77вниз diameter ~= 636.62). -2 байти від виправлення помилки. -2 байти від реструктуризації, як я будуюa .

Пропозиції з гольфу вітаються. Брелока для тестування та зображень, які незабаром слідкувати.

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)

Ось ось g(448) , що зараз вміщується на моєму екрані 1366x768.

введіть тут опис зображення

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

це n = n //= iповинно бути n//= i?
Bobas_Pett

@Bobas_Pett Nah, ти дивишся на неробочість / пояснення, і це має сказати n = n // i. Я піду зафіксувати і додати пояснення, поки я буду на це.
Шерлок9
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.