Đó là tất cả các yếu tố xuống!


23

Thử thách này được lấy cảm hứng từ sơ đồ hoạt hình tuyệt vời này (cảm ơn flawr vì đã đăng nó trong trò chuyện).

Đưa ra một đầu vào n, vẽ tất cả các thừa số nguyên tố của nó dưới dạng các đa giác lồng nhau, như được chỉ định.

Ví dụ, cho số 357 = 17x7x3 , bạn sắp xếp 3 dấu chấm trong một hình tam giác, 7 phiên bản của các hình tam giác đó trong một hình khối và 17 phiên bản của các hình tam giác đó trong 17 gon. Nói tóm lại, đa giác lồng nhau đi từ yếu tố nguyên tố lớn nhất ở bên ngoài đến nhỏ nhất ở bên trong. Đối với 357, câu trả lời của bạn sẽ trông giống như thế này (có hoặc không có màu):

nhập mô tả hình ảnh ở đây

Mọi đa giác của mọi số nguyên tố >= 3không nên được xoay quanh sơ đồ.

Ngoại lệ duy nhất là nguyên tố 2, đặc biệt cho các quyền hạn lẻ 2. Như bạn có thể thấy trong ví dụ 376 = 47x2x2x2bên dưới, 8s xoay và không phải là các dòng đơn lẻ 2, mà là các ngăn dọc cho 4s trong một hình vuông. Ngay cả sức mạnh của 2, được sắp xếp trong các hình vuông, không cần phải được xoay theo cách này.

nhập mô tả hình ảnh ở đây

Trong thực tế, 448 = 7x2x2x2x2x2x2có một sơ đồ trông giống như một hình khối của 64s, và 64được sắp xếp thành một hình vuông vuông, nhưng không có xoay.

! [nhập mô tả hình ảnh ở đây

Hai ví dụ nữa là 440 = 11x5x2x2x2432 = 3x3x3x2x2x2x2. Chúng ta thấy rằng 440với công suất lẻ là 2, đã quay 8s, nhưng 432với công suất chẵn 2không quay 16s.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Và cuối cùng, đây là một ví dụ tối thiểu 10 = 5x2, không có màu mà tôi chế nhạo với Python và turtlemô-đun của nó .

nhập mô tả hình ảnh ở đây

Các thách thức

  • Đưa ra một đầu vào ntrong đó 1 <= n <= 10000, xuất ra một hình ảnh của đa giác nhân tố lồng nhau của nó.
  • Quy tắc là:
    • Hình ảnh được tạo thành từ các đa giác lồng nhau, từ một đa giác có (yếu tố nguyên tố lớn nhất) ở bên ngoài đến yếu tố nguyên tố nhỏ nhất ở bên trong.
    • Đối với nhân tố 2, các lũy thừa của 2 nên xếp thành một dòng, sau đó là một hình vuông, sau đó là một hình vuông, v.v. Ngay cả sức mạnh của 2 không nên được xoay. Sức mạnh lẻ của 2 nên được xoay quanh các đa giác tương ứng của chúng, và chúng nên được xếp chồng lên nhau theo chiều dọc trước khi quay.
  • Bạn có thể định hướng hình ảnh theo cách bạn thích (mặc dù tôi thích hơn), nhưng mọi đa giác lồng nhau sẽ phải đối mặt với cùng hướng với bất kỳ đa giác nào khác, ngoại trừ duy nhất là lũy thừa 2.
  • Bạn có hai tùy chọn cho kích thước hình ảnh và kích thước chấm:
    • Kích thước hình ảnh là tĩnh và kích thước chấm giảm khi ntăng (như trong hình ảnh động).
    • Kích thước chấm là tĩnh và kích thước hình ảnh tăng lên khi ntăng.
  • Ba lớp đa giác đầu tiên phải được phân biệt với các đa giác lân cận (nghĩa là không chạm vào), nhưng xem xét kích thước của hình ảnh tại và xung quanh n=10000, không sao nếu các lớp sau khi bắt đầu chạm vào. Tôi thích nó hơn nếu họ không, nhưng có thể không thể tránh khỏi việc phù hợp với hình ảnh có thể tải lên Stack Exchange.
  • Màu sắc là tùy chọn.
  • Hình dạng của các chấm là tùy thuộc vào bạn. Nếu hình vuông tốt hơn cho ngôn ngữ của bạn, hãy sử dụng chúng.
  • Không có tiền thưởng, nhưng tôi muốn thấy ai đó làm động và tô màu các sơ đồ như trong bài viết gốc.

Cảm ơn Conor O'Brien, EasterlyIrk, Martin Ender, Kritixi Lithos, Mego, DJ McMayhem và El'endia Starman vì sự giúp đỡ của họ trong việc viết câu hỏi này.

Mã golf này, vì vậy mã ngắn nhất sẽ thắng. Chúc may mắn và chơi golf tốt!

Câu trả lời:


8

Con trăn 3.5, 331 309 308 306 304 byte

Phải mất khá nhiều lộn xộn với khoảng cách của các đa giác (và đặc điểm kỹ thuật cũng vậy) để câu trả lời này hoạt động, nhưng cuối cùng tôi đã làm được và hy vọng các câu trả lời khác có thể bắt đầu.

Chỉnh sửa: -2 byte nhờ FlipTack. -8 byte từ việc xóa một phần mã mà tôi quên xóa trước đó. -12 byte từ việc chơi golf chức năng cuối cùng. -1 byte từ việc thay đổi chu vi của các bản vẽ từ size=2500sang size=2e3, điều này cũng cho phép các bản vẽ phù hợp hơn trên màn hình ( diameter ~= 795.77xuống đến diameter ~= 636.62). -2 byte từ sửa lỗi. -2 byte từ cấu trúc lại cách tôi xây dựnga .

Gợi ý chơi golf chào mừng. Trinket để thử nghiệm và hình ảnh để làm theo ngay.

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)

Đây là g(448)cái phù hợp với màn hình 1366x768 của tôi.

nhập mô tả hình ảnh ở đây

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

được n = n //= icho là n//= i?
Bobas_Pett

@Bobas_Pett Nah, bạn đang xem phần giải thích / giải thích, và điều đó đáng lẽ phải nói n = n // i. Tôi sẽ đi sửa nó và thêm vào lời giải thích trong khi tôi đang ở đó.
Sherlock9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.