それはすべての要因です!


23

このチャレンジは、この素晴らしいアニメーション図に触発されています(チャットで投稿してくれたflawrに感謝します)。

input nを指定すると、指定されたように、すべての素因数をドットのネストされた多角形として描画します。

たとえば、番号を指定する357 = 17x7x3と、三角形に3つのドット、七角形にそれらの三角形の7つのバージョン、17角形にそれらの七角形の17のバージョンを配置します。要するに、外側の最大の素因数から内側の最小の素因数に向かうネストされたポリゴン。の場合357、あなたの答えは次のようになります(色の有無にかかわらず):

ここに画像の説明を入力してください

すべての素数のすべてのポリゴンを>= 3ダイアグラムの周りで回転させないでください。

唯一の例外は2、特に奇数のべき乗の素数です2376 = 47x2x2x2以下の例でわかるように、8sは回転し、sの単一行ではなく、正方形内のsの2垂直スタックです42正方形に配置されたの累乗でさえ、この方法で回転させる必要はありません。

ここに画像の説明を入力してください

実際に448 = 7x2x2x2x2x2x2は、64sの七角形のように見えるダイアグラムがあり64、正方形の正方形の正方形に配置されていますが、回転はありません。

![ここに画像の説明を入力してください

さらに二つの例がある440 = 11x5x2x2x2432 = 3x3x3x2x2x2x2。私たちは、ことがわかり4402の奇数力で、回転した8ものの、秒432の偶数乗と2その回転しない16のを。

ここに画像の説明を入力してください ここに画像の説明を入力してください

そして最後に、10 = 5x2Pythonとそのturtleモジュールでモックアップした色のない最小限の例を示します。

ここに画像の説明を入力してください

チャレンジ

  • 入力を指定nすると1 <= n <= 10000、ネストされた因子ポリゴンの画像を出力します。
  • ルールは次のとおりです。
    • 画像は、外側に(最大の素因数)辺を持つ多角形から、内側にある最小素数要素まで、ネストされたドットの多角形で構成されています。
    • 係数2の場合、2の累乗は線、次に正方形、次に正方形の線などとして積み重ねられます。2のべき乗でも回転させないでください。2の奇数乗は、それぞれのポリゴンを中心に回転し、回転する前に垂直に積み重ねる必要があります。
  • 好きなように画像の向きを変えることができます(私は好みですが)が、入れ子になったすべてのポリゴンは、2の奇数乗を除いて他のポリゴンと同じ方向を向いている必要があります。
  • 画像サイズとドットサイズには2つのオプションがあります。
    • 画像サイズは静的で、ドットサイズnはアニメーションのように増加するにつれて減少します。
    • ドットサイズは静的で、画像サイズはn増加するにつれて大きくなります。
  • ポリゴンの最初の3つのレイヤーは、隣接するポリゴンと区別可能(つまり、接触していない)である必要がありますが、の周囲の画像のサイズを考慮すると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=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 16

@Bobas_Pett Nah、あなたはゴルフをしない/説明を見て、それは言うことになっていますn = n // i。私はそれを修正し、その間に説明に追加します。
Sherlock9
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.