Faktor-faktornya terus menurun!

23

Tantangan ini terinspirasi oleh diagram animasi yang fantastis ini (terima kasih kepada flawr karena mempostingnya di obrolan).

Diberikan input n, gambar semua faktor utamanya sebagai poligon titik bersarang, sebagaimana ditentukan.

Misalnya, mengingat nomornya 357 = 17x7x3, Anda mengatur 3 titik dalam segitiga, 7 versi segitiga itu dalam heptagon, dan 17 versi heptagon tersebut dalam 17-gon. Singkatnya, poligon bersarang pergi dari faktor prima terbesar di luar ke terkecil di dalam. Sebab 357, jawaban Anda akan terlihat sedikit seperti ini (dengan atau tanpa warna):

masukkan deskripsi gambar di sini

Setiap poligon dari setiap prime >= 3tidak boleh diputar di sekitar diagram.

Satu-satunya pengecualian adalah yang utama 2, khusus untuk kekuatan aneh 2. Seperti yang Anda lihat pada contoh di 376 = 47x2x2x2bawah ini, 8s berputar dan bukan satu baris 2s, tetapi adalah tumpukan vertikal untuk 4s di dalam kotak. Bahkan kekuatan 2, diatur dalam kotak, tidak perlu diputar dengan cara ini.

masukkan deskripsi gambar di sini

Bahkan, 448 = 7x2x2x2x2x2x2memiliki diagram yang terlihat seperti heptagon 64s, dan 64disusun menjadi kuadrat kuadrat kuadrat, tetapi tanpa rotasi.

! [masukkan deskripsi gambar di sini

Dua contoh lagi adalah 440 = 11x5x2x2x2dan 432 = 3x3x3x2x2x2x2. Kita melihat bahwa 440dengan kekuatan aneh 2, telah diputar 8s, tetapi 432dengan kekuatan genap 2tidak memutar 16s.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Dan akhirnya, ini adalah contoh minimal 10 = 5x2, tanpa warna yang saya tiru dengan Python dan turtlemodulnya.

masukkan deskripsi gambar di sini

Tantangan

  • Diberikan input di nmana 1 <= n <= 10000, menampilkan gambar poligon faktor bersarangnya.
  • Peraturan adalah:
    • Gambar terdiri dari titik-titik yang tersarang dari poligon, dari poligon dengan sisi (faktor prima terbesar) di luar hingga faktor prima terkecil di bagian dalam.
    • Untuk faktor 2, kekuatan 2 harus ditumpuk sebagai garis, lalu kotak, lalu garis kotak, dan sebagainya. Bahkan kekuatan 2 tidak boleh diputar. Kekuatan ganjil 2 harus diputar di sekitar poligon masing-masing, dan mereka harus ditumpuk secara vertikal sebelum rotasi.
  • Anda dapat mengorientasikan gambar sesuka Anda (meskipun saya lebih suka ke atas), tetapi setiap poligon bersarang harus menghadap ke arah yang sama seperti poligon lain dengan satu-satunya pengecualian kekuatan ganjil 2.
  • Anda memiliki dua opsi untuk ukuran gambar dan ukuran titik:
    • Ukuran gambar statis dan ukuran titik berkurang seiring nmeningkatnya (seperti dalam animasi).
    • Ukuran titik statis dan ukuran gambar bertambah seiring nbertambahnya.
  • Pertama tiga lapisan poligon harus dibedakan dari tetangga poligon (yaitu tidak menyentuh), tapi mengingat ukuran gambar pada dan sekitar n=10000, tidak apa-apa jika lapisan setelah mulai sentuh. Saya lebih suka jika mereka tidak melakukannya, tetapi mungkin tidak dapat dihindari untuk memuat gambar yang dapat diunggah ke Stack Exchange.
  • Warna adalah opsional.
  • Bentuk titik-titik itu terserah Anda. Jika kotak lebih baik untuk bahasa Anda, gunakan itu.
  • Tidak ada bonus, tapi saya ingin melihat seseorang menghidupkan dan mewarnai diagram seperti di pos asli.

Terima kasih kepada Conor O'Brien, EasterlyIrk, Martin Ender, Kritixi Lithos, Mego, DJ McMayhem, dan El'endia Starman atas bantuan mereka dalam menulis pertanyaan ini.

Golf kode ini, jadi kode terpendek menang. Semoga berhasil dan bermain golf dengan baik!

Sherlock9
sumber

Jawaban:

8

Python 3.5, 331 309 308 306 304 byte

Butuh sedikit mengacaukan jarak dari poligon (dan spesifikasinya juga, jujur) untuk mendapatkan jawaban ini bekerja, tetapi saya akhirnya melakukannya dan mudah-mudahan jawaban lain dapat mulai masuk.

Edit: -2 bytes berkat FlipTack. -8 byte menghapus bagian kode yang saya lupa hapus sebelumnya. -12 byte dari bermain golf fungsi terakhir. -1 byte dari mengubah keliling gambar dari size=2500menjadi size=2e3, yang juga memungkinkan gambar lebih pas di layar ( diameter ~= 795.77turun ke diameter ~= 636.62). -2 byte dari memperbaiki bug. -2 byte dari merestrukturisasi cara saya membangun a.

Saran bermain golf diterima. Perhiasan untuk pengujian dan gambar untuk diikuti segera.

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)

Inilah g(448), yang sekarang pas di layar 1366x768 saya.

masukkan deskripsi gambar di sini

Tidak melakukanolf

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
Sherlock9
sumber
adalah n = n //= iseharusnya n//= i?
Bobas_Pett
@Bobas_Pett Nah, Anda sedang melihat ungolfing / penjelasan, dan itu seharusnya dikatakan n = n // i. Saya akan memperbaikinya dan menambahkan penjelasan sementara saya melakukannya.
Sherlock9