यह सभी तरह से नीचे कारक है!


23

यह चुनौती इस शानदार एनिमेटेड आरेख से प्रेरित है (चैट में इसे पोस्ट करने के लिए दोष के लिए धन्यवाद)।

एक इनपुट को देखते हुए n, इसके सभी प्रमुख कारकों को निर्दिष्ट के रूप में डॉट्स के नेस्टेड बहुभुज बनाएं।

उदाहरण के लिए, संख्या को देखते हुए 357 = 17x7x3, आप एक त्रिभुज में 3 डॉट्स, एक हेपटागन में उन त्रिकोणों के 7 संस्करणों और 17-गॉन में उन हेप्टैगन के 17 संस्करणों की व्यवस्था करते हैं। संक्षेप में, नेस्टेड बहुभुज बाहर की तरफ सबसे बड़े प्राइम फैक्टर से अंदर की तरफ सबसे छोटे होते हैं। इसके लिए 357, आपके उत्तर को इस तरह (रंग के साथ या बिना) थोड़ा सा देखना चाहिए:

यहाँ छवि विवरण दर्ज करें

प्रत्येक प्राइम के प्रत्येक बहुभुज >= 3को आरेख के चारों ओर घुमाया नहीं जाना चाहिए।

एकमात्र अपवाद प्रमुख है 2, विशेष रूप से विषम शक्तियों के लिए 2। जैसा कि आप 376 = 47x2x2x2नीचे दिए गए उदाहरण में देख सकते हैं , 8एस रोटेट और एस की एकल लाइनें नहीं हैं 2, लेकिन 4एक वर्ग में एस के लिए ऊर्ध्वाधर ढेर हैं । यहां तक ​​कि 2चौकों में व्यवस्थित होने वाली शक्तियों को भी इस तरह से घुमाने की आवश्यकता नहीं है।

यहाँ छवि विवरण दर्ज करें

वास्तव में, 448 = 7x2x2x2x2x2x2एक आरेख होता है जो 64एस के हेप्टागन की तरह दिखता है , और 64इसे वर्गों के वर्ग में व्यवस्थित किया जाता है, लेकिन रोटेशन के बिना।

[यहाँ छवि विवरण दर्ज करें

दो और उदाहरण हैं 440 = 11x5x2x2x2और 432 = 3x3x3x2x2x2x2। हम देखते हैं कि 4402 की विषम शक्ति के साथ 8, एस घुमाया गया है , लेकिन 432एक भी शक्ति के साथ 2इसका 16एस घूर्णन नहीं करता है ।

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

और अंत में, यहां एक न्यूनतम उदाहरण है, 10 = 5x2रंग के बिना जो मैंने पायथन और इसके turtleमॉड्यूल के साथ मजाक किया था ।

यहाँ छवि विवरण दर्ज करें

चुनौती

  • एक इनपुट को देखते हुए nजहां 1 <= n <= 10000, उत्पादन अपने नेस्टेड कारक बहुभुज की एक छवि।
  • नियम हैं:
    • छवि बाहर से अंदर की सबसे छोटी प्राइम फैक्टर पर एक बहुभुज (सबसे बड़ा प्रमुख कारक) पक्षों के साथ डॉट्स के नेस्टेड बहुभुज से बना है।
    • कारक 2 के लिए, 2 की शक्तियों को एक रेखा के रूप में, फिर एक वर्ग, फिर वर्गों की एक पंक्ति, और इसी तरह स्टैक करना चाहिए। यहां तक ​​कि 2 की शक्तियों को भी घुमाया नहीं जाना चाहिए। 2 की विषम शक्तियों को उनके संबंधित बहुभुजों के चारों ओर घुमाया जाना चाहिए, और उन्हें रोटेशन से पहले लंबवत रूप से स्टैक किया जाना चाहिए।
  • आप अपनी पसंद के अनुसार छवि को उन्मुख कर सकते हैं (हालांकि मैं पसंद करता हूं), लेकिन प्रत्येक नेस्टेड बहुभुज को 2 की विषम शक्तियों के एकमात्र अपवाद के साथ किसी भी अन्य बहुभुज के समान दिशा का सामना करना चाहिए।
  • आपके पास छवि आकार और डॉट आकार के लिए दो विकल्प हैं:
    • छवि का आकार स्थिर है और डॉट का आकार n(एनीमेशन में) बढ़ने के साथ घटता जाता है ।
    • डॉट का आकार स्थिर है और छवि का आकार बढ़ने पर nबढ़ता है।
  • पॉलीगन्स की पहली तीन परतों को पड़ोसी पॉलीगोन (यानी स्पर्श नहीं) से अलग किया जाना चाहिए, लेकिन छवियों के आकार पर और उसके आसपास विचार करना n=10000, यह ठीक है अगर परतें छूने के बाद शुरू होती हैं। अगर वे ऐसा नहीं करते तो मैं इसे पसंद करूंगा, लेकिन स्टाॅक एक्सचेंज के लिए अपलोड की जा सकने वाली छवि पर फिट होना अपरिहार्य हो सकता है।
  • रंग वैकल्पिक है।
  • डॉट्स का आकार आपके ऊपर है। यदि वर्ग आपकी भाषा के लिए बेहतर हैं, तो उन का उपयोग करें।
  • कोई बोनस नहीं है, लेकिन मैं किसी को चेतन देखना चाहता हूं और आरेखों को मूल पोस्ट में रंग देना चाहता हूं।

इस सवाल को लिखने में उनकी मदद के लिए कॉनर ओ'ब्रायन, ईस्टरलीर्क, मार्टिन एंडर, क्रिक्टी लिथोस, मेगो, डीजे मैकमेहेम और एल'एंडिया स्ट्रैटन का धन्यवाद।

यह कोड गोल्फ, इसलिए सबसे छोटा कोड जीतता है। गुड लक और गुड गोल्फिंग!

जवाबों:


8

पायथन 3.5, 331 309 308 306 304 बाइट्स

काम करने के लिए इस उत्तर को प्राप्त करने के लिए पॉलीगोन (और विनिर्देश, भी, ईमानदार होने के लिए) के रिक्ति के साथ काफी गड़बड़ हो गई, लेकिन मैंने आखिरकार यह किया और उम्मीद है कि अन्य उत्तर भी आने शुरू हो सकते हैं।

संपादित करें: -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 स्क्रीन पर फिट बैठता है।

यहाँ छवि विवरण दर्ज करें

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

है n = n //= iहोना चाहिए n//= i?
Bobas_Pett

@ गोदास_पेट नाह, आप असहमति / स्पष्टीकरण को देख रहे हैं, और यह कहना चाहिए n = n // i। मैं इसे ठीक कर दूँगा और स्पष्टीकरण पर जोड़ दूँगा, जबकि मैं इस पर हूँ।
शर्लक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.