一路下跌的因素!


23

这项挑战的灵感来自于这张奇妙的动画图表(感谢在聊天中张贴的虚假人物)。

给定输入n,将其所有主要因子绘制为指定的点的嵌套多边形。

例如,给定数字357 = 17x7x3,您在一个三角形中排列3个点,在一个七边形中排列这些三角形的7个版本,并在一个17边角中排列这些庚烷的17个版本。简而言之,嵌套的多边形从外部的最大素数到内部的最小素数。对于357,您的答案应该看起来像这样(有色或无色):

在此处输入图片说明

每个素数的每个多边形>= 3都不应围绕图旋转。

唯一的例外是质数2,专门用于的奇数幂2。在376 = 47x2x2x2下面的示例中可以看到,8s旋转并且不是2s的单行,而是4正方形中s的垂直堆栈。甚至2以正方形排列的的幂也不需要以这种方式旋转。

在此处输入图片说明

实际上,它448 = 7x2x2x2x2x2x2具有一个看起来像64s 的七边形的图,并64排列成正方形的正方形,但没有旋转。

![在此处输入图片描述

还有两个示例是440 = 11x5x2x2x2432 = 3x3x3x2x2x2x2。我们看到440奇数幂为2时旋转了8s,而432偶数幂2为时旋转了16s。

在此处输入图片说明 在此处输入图片说明

最后,这是一个最小的示例,它10 = 5x2没有我用Python及其turtle模块模拟的颜色。

在此处输入图片说明

挑战

  • 给定输入nwhere 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在编写此问题时所提供的帮助。

此代码高尔夫球,所以最短的代码获胜。祝你好运,打高尔夫球!

Answers:


8

蟒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屏幕。

在此处输入图片说明

开球

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。我将对其进行修复,并在解释时补充说明。
Sherlock16年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.