निकोमाचुस के प्रमेय की कल्पना करें


35

निकोमाचस का प्रमेय एक राशि के वर्ग को क्यूब्स के योग से संबंधित करता है:

निकोमाचस का प्रमेय

और एक सुंदर ज्यामितीय दृश्य है:

दृश्य

चुनौती: इस दृश्य का 2d हिस्सा एससीआई में बनाएं।

आपको यह सुनिश्चित करने की आवश्यकता होगी कि सभी दृश्य सीमांकन आपके आरेख द्वारा सही हैं। यह चार "रंगों" के साथ करने के लिए सबसे सरल है, हालांकि यह केवल तीन के साथ प्राप्त करना संभव है (कैसे के लिए नीचे अंतिम उदाहरण देखें)। चार रंगों के साथ, आप एक "स्ट्रिप" (यानी, एक ही क्यूब बनाने वाले अलग-अलग हिस्सों) के बीच के क्षेत्रों में अंतर करने के लिए दो का उपयोग करते हैं, और दो आसन्न स्ट्रिप्स के बीच अंतर करने के लिए। आप चाहें तो चार से अधिक रंगों का उपयोग भी कर सकते हैं। यदि इस में से कोई भी भ्रामक है, तो नीचे दिए गए उदाहरण आउटपुट को स्पष्ट करना चाहिए।

इनपुट आउटपुट

इनपुट 0. से अधिक एकल पूर्णांक है। आउटपुट नीचे दिए गए उदाहरणों के समान एक एएससीआई ग्रिड है, जो ऊपर की छवि में उस इनपुट नंबर के लिए चपटा ग्रिड के समान है। अग्रणी और अनुगामी व्हाट्सएप ठीक है।

यह मानक नियमों के साथ कोड गोल्फ है।

नमूना आउटपुट

एन = 1

#

एन = 2

#oo   
o@@   
o@@   

एन = 3

#oo+++
o@@+++
o@@+++
+++###
+++###
+++###

एन = 4

#oo+++oooo
o@@+++oooo
o@@+++@@@@
+++###@@@@
+++###@@@@
+++###@@@@
oo@@@@oooo
oo@@@@oooo
oo@@@@oooo
oo@@@@oooo

एन = 5

#oo+++oooo+++++
o@@+++oooo+++++
o@@+++@@@@+++++
+++###@@@@+++++
+++###@@@@+++++
+++###@@@@#####
oo@@@@oooo#####
oo@@@@oooo#####
oo@@@@oooo#####
oo@@@@oooo#####
+++++#####+++++
+++++#####+++++
+++++#####+++++
+++++#####+++++
+++++#####+++++

N = 4 के लिए तीन रंग संस्करण, @BruceForte के लिए धन्यवाद:

#oo+++oooo
o##+++oooo
o##+++####
+++ooo####
+++ooo####
+++ooo####
oo####++++
oo####++++
oo####++++
oo####++++

6
चार-रंग प्रमेय: डी
लीक नून

1
क्या आप N = 5 के लिए आउटपुट जोड़ सकते हैं?
उरईल

1
@ एरियल डन। मेरा संपादन देखें।
योना

धन्यवाद! इसके अलावा, क्या मैं केवल N = 4 में बाहरी पट्टी में @ और os को स्विच कर सकता हूं? या क्या आउटपुट को किसी अन्य चार्ट के साथ इन ग्रंथों का एक सख्त प्रतिस्थापन होना चाहिए?
उरईल

@ एरियल स्विचिंग ठीक है। यह सब मायने रखता है कि आसन्न रंग संघर्ष नहीं करते हैं, ताकि पैटर्न दिखाई दे।
योना

जवाबों:


17

MATL , 30 28 27 बाइट्स

t:P"@:s:@/Xk&+@+8MPt&(]30+c

इसे ऑनलाइन आज़माएं!

बोनस सुविधाओं:

  • के लिए 26 बाइट्स , निम्नलिखित संशोधित संस्करण का उत्पादन चित्रमय परिणाम :

    t:P"@:s:@/Xk&+@+8MPt&(]1YG
    

    MATL ऑनलाइन पर यह कोशिश करो !

  • छवि कुछ रंग के लिए भीख माँग रही है , और इसकी कीमत केवल 7 बाइट्स है:

    t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
    

    MATL ऑनलाइन पर यह कोशिश करो !

  • या वर्ण मैट्रिक्स को धीरे-धीरे कैसे बनाया जाए, यह देखने के लिए एक लंबे संस्करण (37 बाइट्स) का उपयोग करें :

    t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
    

    MATL ऑनलाइन पर यह कोशिश करो !

उदाहरण आउटपुट

इनपुट के लिए 8, निम्नलिखित मूल संस्करण, ग्राफ़िकल आउटपुट और रंग ग्राफ़िकल आउटपुट दिखाता है।

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

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

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

व्याख्या

सामान्य प्रक्रिया

एक संख्यात्मक मैट्रिक्स बाहरी से आंतरिक परतों तक Nचरणों में बनाया गया है , जहां Nइनपुट है। प्रत्येक चरण पिछले मैट्रिक्स का एक आंतरिक (ऊपरी-बाएँ) भाग अधिलेखित कर देता है। अंत में, प्राप्त मैट्रिक्स में संख्याओं को वर्णों में बदल दिया जाता है।

उदाहरण

इनपुट के 4लिए पहला मैट्रिक्स है

10 10  9  9  9  9  8  8  8  8
10 10  9  9  9  9  8  8  8  8
 9  9  8  8  8  8  7  7  7  7
 9  9  8  8  8  8  7  7  7  7
 9  9  8  8  8  8  7  7  7  7
 9  9  8  8  8  8  7  7  7  7
 8  8  7  7  7  7  6  6  6  6
 8  8  7  7  7  7  6  6  6  6
 8  8  7  7  7  7  6  6  6  6
 8  8  7  7  7  7  6  6  6  6

दूसरे चरण के रूप में, मैट्रिक्स

7 7 7 6 6 6
7 7 7 6 6 6
7 7 7 6 6 6
6 6 6 5 5 5
6 6 6 5 5 5
6 6 6 5 5 5

उत्तरार्ध के ऊपरी आधे हिस्से में ओवरराइट किया गया है। फिर उसी के साथ किया जाता है

6 5 5
5 4 4
5 4 4

और अंत में

3

परिणामी मैट्रिक्स है

3 5 5 6 6 6 8 8 8 8
5 4 4 6 6 6 8 8 8 8
5 4 4 6 6 6 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6

अंत में, 30प्रत्येक प्रविष्टि में जोड़ा जाता है और परिणामी संख्याओं को कोडपॉइंट के रूप में व्याख्या किया जाता है और वर्णों में परिवर्तित किया जाता है (इस प्रकार शुरू होता है 33, इसी के अनुरूप !)।

मध्यवर्ती मैट्रिस का निर्माण

इनपुट के लिए N, kसे मूल्यों को कम करने पर विचार Nकरें 1। प्रत्येक के लिए k, से पूर्णांकों का एक वेक्टर 1के लिए k*(k+1)उत्पन्न होता है, और उसके बाद प्रत्येक प्रविष्टि से विभाजित है kऔर को गिरफ्तार। एक उदाहरण के रूप में, k=4यह देता है (सभी ब्लॉकों kमें अंतिम को छोड़कर आकार है ):

1 1 1 1 2 2 2 2 3 3

जबकि k=3परिणाम के लिए (सभी ब्लॉकों का आकार होगा k):

1 1 1 2 2 2

यह सदिश जोड़ा गया है, तत्व-वार प्रसारण के साथ, स्वयं की एक प्रतिरूपित प्रतिलिपि के लिए; और फिर kप्रत्येक प्रविष्टि में जोड़ा जाता है। इसके लिए k=4देता है

6  6  6  6  7  7  7  7  8  8
6  6  6  6  7  7  7  7  8  8
6  6  6  6  7  7  7  7  8  8
6  6  6  6  7  7  7  7  8  8
7  7  7  7  8  8  8  8  9  9
7  7  7  7  8  8  8  8  9  9
7  7  7  7  8  8  8  8  9  9
7  7  7  7  8  8  8  8  9  9
8  8  8  8  9  9  9  9 10 10
8  8  8  8  9  9  9  9 10 10

यह ऊपर दिखाए गए मध्यवर्ती मैट्रिक्स में से एक है, सिवाय इसके कि यह क्षैतिज और लंबवत रूप से फ़्लिप किया जाता है। तो वह सब कुछ इस मैट्रिक्स को फ्लिप करने के लिए है और इसे "संचित" मैट्रिक्स के ऊपरी-बाएँ कोने में लिखें, जो पहले ( k=N) चरण के लिए एक खाली मैट्रिक्स के लिए आरंभ किया गया है ।

कोड

t       % Implicitly input N. Duplicate. The first copy of N serves as the
        % initial state of the "accumulated" matrix (size 1×1). This will be 
        % extended to size N*(N+1)/2 × N*(N+1)/2 in the first iteration
 :P     % Range and flip: generates vector [N, N-1, ..., 1]
"       % For each k in that vector
  @:    %   Push vector [1, 2, ..., k]
  s     %   Sum of this vector. This gives 1+2+···+k = k*(k+1)/2
  :     %   Range: gives vector [1, 2, ..., k*(k+1)/2]
  @/    %   Divide each entry by k
  Xk    %   Round up
  &+    %   Add vector to itself transposed, element-wise with broadcast. Gives
        %   a square matrix of size k*(k+1)/2 × k*(k+1)/2
  @+    %   Add k to each entry of the this matrix. This is the flipped
        %   intermediate matrix
  8M    %   Push vector [1, 2, ..., k*(k+1)/2] again
  Pt    %   Flip and duplicate. The two resulting, equal vectors are the row and
        %   column indices where the generated matrix will be written. Note that
        %   flipping the indices has the same effect as flipping the matrix
        %   horizontally and vertically (but it's shorter)
  &(    %   Write the (flipped) intermediate matrix into the upper-left
        %   corner of the accumulated matrix, as given by the two (flipped)
        %   index vectors 
]       % End
30+     % Add 30 to each entry of the final accumulated matrix
c       % Convert to char. Implicitly display

मैं MATL को बिल्कुल नहीं जानता, लेकिन क्या आप 30 को जोड़ने और चरित्र में परिवर्तित करने के बजाय mod10 लेकर किसी भी बाइट को बचा सकते हैं?
user2390246

या यहां तक ​​कि mod4 ...
user2390246

@ user2390246 क्या आप उन्हें एक अंक के साथ संख्या के रूप में रखने और चार में परिवर्तित होने से बचते हैं? यह काम नहीं करेगा, क्योंकि संख्यात्मक मैट्रिक्स संख्याओं के बीच रिक्त स्थान के साथ मुद्रित किया जाएगा। लेकिन वैसे भी इस विचार के लिए धन्यवाद :-)
लुइस मेंडू

काफी उचित। N> 226 के साथ क्या होता है? क्या यह मान्य वर्णों की सीमा के बाहर नहीं होगा? (अप्रत्याशित रूप से, TIO पर बार-बार, इसलिए मैं जाँच नहीं कर सका)
user2390246

@ user2390246 हां, उच्च इनपुट संख्याओं के लिए यह बाहर जाता है। और अगर हम ASCII चार्ट पर विचार करते हैं तो अधिकतम कोड पॉइंट 127 है, इसलिए यह जल्दी ही बाहर हो जाता है। लेकिन जैसा कि आपने देखा कि ऐसा होने से पहले यह स्मृति से बाहर चला जाता है (परिणामस्वरूप चार मैट्रिक्स बहुत बड़ा है)। वैसे भी, किसी दिए गए इनपुट साइज में केवल मेमोरी या डेटा टाइप की सीमाओं के कारण काम करने की अनुमति दी जाती है
लुइस मेंडू

7

पायथन 2 , 187 178 164 162 152 बाइट्स

-8 बाइट्स धन्यवाद करने के लिए धन्यवाद Mr.Xcoder
-1 बाइट के लिए धन्यवाद स्टीफन
-10 बाइट्स के लिए धन्यवाद जोनाथन फ्रेच को

g=lambda y:y>1and[l+y*f(y,i)for i,l in enumerate(g(y-1))]+y*[''.join(f(y,i)for i in range(y*-~y/2))]or['#']
f=lambda y,i:'0@+#'[(y*~-y/2%y+i)/y%2+y%2*2]

इसे ऑनलाइन आज़माएं!


जब आप घर जाते हैं, 179 बाइट्स के लिए
श्री एक्सकोडर


1
क्या यह आपके लैम्ब्डा फ़ंक्शन के नाम बाइट की गिनती को शामिल नहीं करने की अनुमति देता है जब आप इसे पुनरावर्ती उपयोग कर रहे हैं, अर्थात बाकी कोड में इसके नाम का उपयोग कर रहे हैं?
जोनाथन फ्रेच

sum(range(y))%y->y*~-y/2%y
जोनाथन फ्रीच

@JonathanFrech हाँ, जब यह पुनरावर्ती है तो यह होना ही चाहिए।
रॉड

7

लकड़ी का कोयला , 50 46 बाइट्स

F⮌…·¹N«≔⊘×ι⊕ιθF⊕⊘ι«F§#+@⁺ικ«UO⁻θ×ικθλUOθ⁻θ×ικλ

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। स्पष्टीकरण के साथ पिछला 50-बाइट संस्करण: इसे ऑनलाइन आज़माएं!

F⮌…·¹N«≔÷×ι⁺¹ι²θF⁺¹÷鲫F§#+@⁺ικ«UO⁻θ×ικθλUOθ⁻θ×ικλ

F     «     Loop over
  …·¹       Inclusive range from 1 to
     N      Input as a number
 ⮌          Reversed

   ι⁺¹        Add 1 to current index
  ×   ι       Multiply by current index
 ÷     ²      Divide by 2
≔       θ     Assign to q

F     «      Loop over
             Implicit range from 0 to
   ÷ι²       Half the current index
 ⁺¹          Plus 1

F       «    Loop over
  #+@        Literal string
 §           Circularly indexed by
     ⁺ικ     Sum of outer and inner index

    ×ικ     Multiply outer and inner index
  ⁻θ        Subtract from q
UO     θλ   Draw an oblong (q-ik, q) using that character

UOθ⁻θ×ικλ   Draw an oblong (q, q-ik) using that character

नोट: मैं चरित्र को सीधे असाइन करने की कोशिश करने के बजाय चरित्र पर लूप करता हूं l क्योंकि आप सीधे स्ट्रिंग को एक चर में अनुक्रमित करने का परिणाम नहीं दे सकते क्योंकि यह चारकोल में एक अस्पष्ट निर्माण है। सौभाग्य से बाइट की गिनती समान है।


तकनीकी रूप से आप ऐसा कर सकते हैं, क्योंकि ASCII वैरिएबल इसका तर्क क्रम उल्टा है (ध्यान दें कि इसे एक्सेस करने के लिए ऑपरेटर की आवश्यकता है इसलिए यह अभी भी कम गोल्फ है)
ASCII-only

5

सी (जीसीसी) , 135 128 120 बाइट्स

f(n,m,i,x,y,k){for(m=n*-~n/2,i=m*m;i--;printf("\n%d"+!!(~i%m),(x/k+y/k+k)%3))for(x=i%m,y=i/m,k=n;x>=k&y>=k;x-=k--)y-=k;}

इसे ऑनलाइन आज़माएं!

केवल तीन रंगों का उपयोग करता है।

वैचारिक रूप से, 180 डिग्री से घुमाए गए ग्रिड पर काम करता है:

000111
000111
000111
111220
111220
111001

और सूत्र के अनुसार रंगों की गणना करता है:

c(x,y,n) = c(x-n,y-n,n-1)                   if x >= n and y >= n
         = (x div n + y div n + n) mod 3    otherwise


@JonathanFrech यह मान्य C नहीं है और इससे टूट जाता है gcc -O2
1

काफी उचित; क्या यह संभव है कि मापांक तीन ( g(i%m,i/m,n)%3) के कारण दूसरा कोड केवल तीन रंगों के लिए काम करता है ?
जोनाथन फ्रैच

सुझाएँ x/k&&y/kबजायx>=k&y>=k
ceilingcat

2

आर , 131 126 123 बाइट्स

3 बाइट्स @Giuseppe की बदौलत बच गए

function(n){l=w=sum(1:n)
m=matrix(,l,l)
for(i in n:1){m[l:1,l:1]=outer(x<-(1:l-1)%/%i,x,`+`)+i
l=l-i}
write(m%%4,"",w,,"")}

इसे ऑनलाइन आज़माएं!

यह @LuisMendo के MATL उत्तर के समान एल्गोरिथ्म का उपयोग करता है । अंतर केवल इतना है कि वर्णों को परिवर्तित करने के बजाय, यह सुनिश्चित करने के लिए मैट्रिक्स सभी आउटपुट mod4 के साथ आउटपुट है कि यह सुनिश्चित करने के लिए कि प्रत्येक तत्व एक ascii वर्ण है।


1
123 बाइट्स! मैं forलूप को -1 बाइट के लिए वापस ले आया :)
Giuseppe

1

पायथन 2 , 176 175 बाइट्स

n=input()
R,J=range,''.join;r=[]
for i in R(n+1):
 S=sum(R(i));c='AxBo'[i%2::2]
 for j in R(S):r[~j]+=c[j/i%2]*i
 r+=[J(c[-j/i%2]for j in R(S+i,0,-1))]*i
for l in r:print J(l)

इसे ऑनलाइन आज़माएं!


यदि आप J="".join;(+10 बाइट्स) को परिभाषित करते हैं और दोनों "".join(-2 * 7 = -14 बाइट्स) को प्रतिस्थापित करते हैं J(+2 बाइट्स), तो आप एक बाइट बचा सकते हैं (जैसा कि print+1 बाइट के बाद एक अतिरिक्त स्थान होना चाहिए ); ।
जोनाथन फ्रेच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.