มันเป็นปัจจัยตลอดทาง!


23

ความท้าทายนี้ได้รับแรงบันดาลใจจากไดอะแกรมภาพเคลื่อนไหวที่ยอดเยี่ยม (ขอบคุณข้อบกพร่องสำหรับการโพสต์ในการแชท)

กำหนดอินพุตnให้วาดปัจจัยหลักทั้งหมดเป็นรูปหลายเหลี่ยมซ้อนกันตามที่ระบุ

ตัวอย่างเช่นเมื่อกำหนดตัวเลข357 = 17x7x3คุณจะจัดเรียง 3 จุดในรูปสามเหลี่ยมรูปสามเหลี่ยม 7 รูปในรูป heptagon และรูป heptagons เหล่านั้น 17 รูปในรูปแบบ 17-gon ในระยะสั้นรูปหลายเหลี่ยมซ้อนกันไปจากปัจจัยสำคัญที่ใหญ่ที่สุดในด้านนอกเพื่อที่เล็กที่สุดในภายใน สำหรับ357คำตอบของคุณควรมีลักษณะเช่นนี้เล็กน้อย (มีหรือไม่มีสี):

ป้อนคำอธิบายรูปภาพที่นี่

รูปหลายเหลี่ยมของนายกทุกคน>= 3ไม่ควรหมุนไปรอบ ๆ แผนภาพ

ยกเว้นอย่างเดียวคือนายกเฉพาะสำหรับอำนาจคี่2 2ดังที่คุณเห็นในตัวอย่าง376 = 47x2x2x2ด้านล่างการ8หมุนและไม่ใช่เส้นเดี่ยว2แต่เป็นแนวตั้งแนวตั้งสำหรับ4สี่เหลี่ยม แม้แต่พลังของที่2เรียงกันเป็นสี่เหลี่ยมก็ไม่จำเป็นต้องหมุนด้วยวิธีนี้

ป้อนคำอธิบายรูปภาพที่นี่

ในความเป็นจริง448 = 7x2x2x2x2x2x2มีไดอะแกรมที่ดูเหมือน heptagon ของ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 ได้
  • สีเป็นตัวเลือก
  • รูปร่างของจุดขึ้นอยู่กับคุณ หากสี่เหลี่ยมนั้นดีกว่าสำหรับภาษาของคุณให้ใช้มัน
  • ไม่มีโบนัส แต่ฉันต้องการเห็นคนที่มีชีวิตและระบายสีแผนภาพเหมือนในโพสต์ดั้งเดิม

ขอบคุณ Conor O'Brien, EasterlyIrk, Martin Ender, Kritixi Lithos, Mego, 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 คุณกำลังมองหาที่ ungolfing / n = n // iคำอธิบายและที่ควรจะพูด ฉันจะไปแก้ไขและเพิ่มคำอธิบายในขณะที่ฉันอยู่ที่มัน
Sherlock9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.