끝까지 내려가는 요소입니다!


23

이 도전은 이 환상적인 애니메이션 다이어그램에서 영감을 얻었습니다 (채팅에 게시 해 주셔서 감사합니다).

입력 값이 n지정되면 지정된대로 모든 주요 요소를 내포 된 다각형 다각형으로 그립니다.

예를 들어 숫자가 주어지면 357 = 17x7x3삼각형에 3 개의 점, 7 각형의 삼각형, 17 각형의 칠각형 17 개가 정렬됩니다. 즉, 중첩 다각형은 외부에서 가장 큰 주요 요소에서 내부에서 가장 작은 요소로 이동합니다. 의 경우 357답변은 다음과 같이 약간 색깔이 있어야합니다 (색상 유무).

여기에 이미지 설명을 입력하십시오

모든 프라임의 모든 다각형을 >= 3다이어그램 주위에서 회전해서는 안됩니다.

유일한 예외는 2특히 홀수의 거듭 제곱에 대한 소수 입니다 2. 376 = 47x2x2x2아래 예에서 볼 수 있듯이 8s는 회전하며 s의 한 줄은 2아니지만 s의 수직 스택입니다 4. 2정사각형으로 배열 된의 힘조차도 이런 식으로 회전 할 필요는 없습니다.

여기에 이미지 설명을 입력하십시오

실제로 448 = 7x2x2x2x2x2x2보이는 칠각형의 좋아하는 도면을 갖는다 64들 및 64하지만 회전하지 않고, 사각형의 사각형의 정사각형으로 배열된다.

! [여기에 이미지 설명 입력

두 가지 더 예는 440 = 11x5x2x2x2432 = 3x3x3x2x2x2x2. 우리 440는 2의 홀수 전력으로 8s 를 회전 했지만 432균등 한 힘으로 s를 2회전시키지 않습니다 16.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

그리고 마지막으로, 10 = 5x2파이썬과 그 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

파이썬 3.5 331 309 308 306 304 바이트

이 답변을 작동시키기 위해서는 다각형의 간격 (그리고 사양도 솔직히 말해서)에 약간의 혼란이 있었지만 마침내 해냈으며 다른 답변이 나올 수 있기를 바랍니다.

편집 : FlipTack 덕분에 -2 바이트. 이전에 제거하지 않은 코드 섹션을 제거하여 -8 바이트. 마지막 기능을 골프에서 -12 바이트. -1에서 도면의 주위에서 변화 바이트 size=2500size=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 배경 화면에 잘 맞는.

여기에 이미지 설명을 입력하십시오

언 골핑

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 / explanation을보고 n = n // i있습니다. 나는 그것을 고치고 내가 설명하는 동안 설명에 덧붙일 것이다.
Sherlock9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.