विकर्ण ग्रिड में आयतों को गिनें


21

इस चुनौती के अनुवर्ती के रूप में , हम अब r पंक्तियों और c स्तंभों के साथ ग्रिड में आयतों की संख्या को गिनना चाहते हैं जहाँ ग्रिड में एक वर्ग के प्रत्येक विकर्ण के माध्यम से एक रेखा पार होती है। अब, हम अभी भी पहले की तरह ही आयतों की गिनती कर रहे हैं, लेकिन इस बार हमें उन आयतों को भी शामिल करना चाहिए जो 45 डिग्री तक झुके हुए हैं।

आपका लक्ष्य एक फ़ंक्शन या प्रोग्राम बनाना है जो कि पंक्तियों की संख्या को r और कॉलम c देता है जो आयताकारों की संख्या को आयाम ( r , c ) के साथ एक विकर्ण ग्रिड में उत्पन्न करता है ।

एक प्रदर्शन के रूप में, यह एक एनीमेशन है जो एक (2 x 3) विकर्ण ग्रिड द्वारा गठित सभी 37 आयतों के माध्यम से पुनरावृत्त करता है।

उदाहरण

परीक्षण के मामलों

Each case is [rows, columns] = # of rectangles
[0, 0] = 0
[0, 1] = 0
[1, 0] = 0
[1, 1] = 1
[3, 2] = 37
[2, 3] = 37
[6, 8] = 2183
[7, 11] = 5257
[18, 12] = 40932
[42, 42] = 2889558
[51, 72] = 11708274

नियम

  • यह इसलिए सबसे छोटा कोड जीतता है।
  • इसे हल करने वाले बिल्डरों को अनुमति नहीं है।

7
केवल Mathematica इस XD
Conor O'Brien

3
गोश, यह अन्य आयतों की तुलना में बहुत अधिक कठिन है .....
GamrCorps

5
संबंधित चुनौती देखें projecteuler.net/problem=147
मार्कस एंड्रयूज

1
मुझे लगता है कि बिल्ट-इन की अनुमति दी जानी चाहिए। मुझे वो जवाब देखना पसंद है।
mbomb007

जवाबों:


8

रूबी, 58 बाइट्स

यह हीलियम नाभिक के सी उत्तर को जारी करने में एल्गोरिथ्म का एक सीधा कार्यान्वयन है ।

g=->m,n{n>m ?g[n,m]:m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6}

मैं जांच कर रहा हूं कि यह सूत्र सीमित सफलता के साथ क्यों काम करता है। यह पुष्टि करना आसान है कि ईमानदार आयतों (m+1)*m/2 * (n+1)*n/2की संख्या समान है , विकर्ण आयतों की संख्या थोड़ी अधिक है।

नील ने इस बात की पुष्टि की है m==nकि एक n*nवर्ग में झुकी हुई आयतों की संख्या है (4*n**4-n*n-3*n)/6और जब m>n आपको एक अतिरिक्त (m-n)(n*(4*n*n-1)/3)( OEIS A000447 से संबंधित ) जोड़ने की आवश्यकता होती है , हालांकि यह स्पष्ट नहीं करता है कि वे दो सूत्र कहाँ से आए थे। मुझे उत्तर का हिस्सा मिल गया है।

के लिए m==n, ग्रिड के अंदर आकार एक एज़्टेक हीरा है

वोल्फ्रम अल्फा से एज़्टेक डायमंड छवि

एक अजटेक हीरे में आयतों की संख्या बड़ी आयतों की संख्या का योग यह (चौथा हीरा है, जो एक में पाया जाता है के लिए बनाने के लिए आरोपित है 5x5ग्रिड, 2x8, 4x6, 6x4, और 8x2शून्य से आयतों की संख्या) की दोबारा गणना (की संख्या पिछले एज़्टेक हीरे में आयतें )।

यहाँ सूत्र है (TeX को बाद में जोड़ा जाएगा):

# superimposed rectangles, 2x(2n-2), 4*(2n-4), ...
f = lambda n: sum( (2*k)*(2*k+1)/2 * (2*n-2*k)*(2*n-2*k+1)/2 for k in range(1, n) )
aztec_rect = f(n) - f(n-1)

वोल्फ्रम अल्फा के अनुसार , नील के लिए बंद रूप fहै 1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)और aztec_rectजैसा कि नील ने खोजा था, उसके लिए बंद रूप है 1/6*n*(n-1)*(4*n**2+4*n+3) == 1/6*(4*n**4-n**2-3*n)

मुझे अभी तक पता नहीं है कि क्यों (m-n)(n*(4*n*n-1)/3)काम करता है, हालांकि मुझे संदेह है कि ऐसा इसलिए है क्योंकि A000447 की एक परिभाषा है binomial(2*n+1, 3)। हम आपको खबर देते रहेंगे।

अद्यतन: मेरे पास यह विश्वास करने का कारण है कि एक विस्तारित एज़्टेक हीरे में आयतों की संख्या का कार्य हीरे के माइनस में m>nसुपरिम्पोज किए गए 2k*2(n-k)आयतों की संख्या से संबंधित है F(m-1,n-1)। अधिक परिणाम जब मेरे पास है।

अद्यतन: मैंने एक अलग मार्ग की कोशिश की और विस्तारित एज़्टेक हीरे के लिए एक और सूत्र के साथ समाप्त हुआ जो कि ज्यादातर व्याख्या करने योग्य है, लेकिन एक शब्द है जिसे मुझे अभी तक समझ नहीं आया है। हुज़्ज़ाह! : डी

def f(m,n):
 if n > m:
     return f(n,m)
 if n == 0:
     return 0
 else:
     return(m-n+1)*(4*n**4-n*n-3*n)/6-f(m-1,n-1)+(m-n)*2+(m-n)*(n-2)-(m-n-1)*f(n-1,n-1)

उस अंतिम सूत्र का त्वरित विराम:

  • (m-n+1)*(4*n**4-n*n-3*n)/6nसंरचना में आकार के सुपरिंपोजित एज़्टेक हीरे की संख्या है , जैसे f(n,n) = (4*n**4-n*n-3*n)/6f(7,3)5 सुपरिंपोजित एज़्टेक हीरे का आकार है 3, जबकि f(3,3)केवल 1 हीरा है।
  • -f(m-1,n-1) सुपरिम्पोज्ड हीरों के बीच से कुछ डुप्लिकेट आयतों को हटाता है।
  • +(m-n)*22 अतिरिक्त 2- खातों के लिए खाते - (2n-1)प्रत्येक अतिरिक्त हीरे के लिए आयताकार।
  • +(m-n)*(n-2)प्रत्येक अतिरिक्त हीरे के लिए एक अतिरिक्त n-by- nवर्ग के लिए खाते ।
  • -(m-n-1)*f(n-1,n-1)यह नया शब्द है। जाहिरा तौर पर मैंने अपनी गिनती में कुछ अतिरिक्त वर्गों के लिए जिम्मेदार नहीं है, लेकिन मुझे पता नहीं चला है कि वे विस्तारित हीरे में कहां हैं।

नोट: जब m==n, m-n-1 = -1जिसका अर्थ है कि यह अंतिम शब्द वर्ग को गिनती में जोड़ता है। मुझे अपने नियमित फॉर्मूले में कुछ याद आ रहा है। पूर्ण प्रकटीकरण, यह केवल इस सूत्र के पहले के मसौदे के लिए एक पैच होने का मतलब था जो सिर्फ काम करने के लिए हुआ था। स्पष्ट रूप से, मुझे अभी भी खुदाई करने की आवश्यकता है कि क्या हो रहा है, और यह हो सकता है कि मेरे सूत्र में कुछ कीड़े हों। मैं तुम्हें तैनात रखेंगे।

रसेल, गैरी और वीस्टीन, एरिक डब्ल्यू। "एज़्टेक डायमंड।" मैथवर्ल्ड से - एक वुल्फ्राम वेब संसाधन। http://mathworld.wolfram.com/AztecDiamond.html


मुझे पसंद है कि इस उत्तर में मूल उत्तर की तुलना में अधिक उत्थान और +100 का इनाम कैसे है ...: पी
हाइपरन्यूट्रिनो

5

सी, 71 64 बाइट्स

f(m,n){return n>m?f(n,m):m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6;}

Ideone पर इसे आज़माएं


2
मुझे यह जानकर अच्छा लगेगा कि यहां क्या हो रहा है और आप इस समाधान पर कैसे पहुंचे।
जॉर्डन

1
@ जोर्डन अब तक मैंने सूत्र के दूसरे भाग को सत्यापित किया है m==n: एक n*nवर्ग में झुके हुए आयतों की संख्या है (4*n*n*n*n-n*n-3*n)/6। यह क्रम 0, 9, 51, 166, 410, 855, 1589, 2716, 4356, 6645 है लेकिन यह OEIS में दिखाई नहीं देता है।
नील

1
मैंने अब सत्यापित कर लिया है कि जब m>nआपको अतिरिक्त (m-n)(n*(4*n*n-1)/3)(OEIS A000447 से लिया गया फार्मूला का बाद वाला हिस्सा) जोड़ना होगा। Rearranging और जोड़ना @ betseg का सूत्र देता है।
नील

@ नील आप उन फॉर्मूलों पर कैसे पहुंचे?
शर्लक 9

2
@ शर्लक 9 मैंने पहले 10 वर्गों में झुके हुए आयतों की संख्या को मैन्युअल रूप से परिकलित किया और अनुक्रम को OEIS सर्च इंजन में फीड किया, जो अनुक्रम को नहीं पहचानता था, लेकिन इसके लिए एक फॉर्मूला मिला जो कि ओपी के फॉर्मूले से मेल खाता था m==n। मैंने तब मैन्युअल रूप से छोटे आयतों में झुके हुए आयतों की संख्या की गणना की और लंबे आयाम को बढ़ाते हुए देखा कि हमेशा दिए गए छोटे आयाम के लिए आयतों की समान मात्रा को जोड़ा जाता है। मैंने वेतन वृद्धि को OEIS में खिलाया जिसमें A000447 पर एक मैच मिला।
नील

4

पायथन, 73 68 बाइट्स

x=lambda m,n:m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6if m>n else x(n,m)

और जब निम्नलिखित संस्करण में एक उच्च बायटेकाउंट (75) है, तो इसका उपयोग करने के स्थानों को खोजने में एक अच्छा व्यायाम था ~:

def f(r,c):
 if r<c:r,c=c,r
 x=(4*c**3-c)/3
 return r*c*~r*~c/4+x*r--~x*c/2

68 बाइट्स यदि आप एक लैम्ब्डा का उपयोग करते हैं:x=lambda m,n:m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6if m>n else x(n,m)
GamrCorps

आह, किसी कारण से मुझे लगा कि हमें उपयोग करना है def। धन्यवाद! अपडेट किया गया।
मार्कस एंड्रयूज

3

उत्तल, 37 36 बाइट्स

__:)+×½½\~æ<{\}&:N\¦\-N¦¦N*(*3-N*6/+

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

स्टैक-आधारित भाषा के लिए संशोधित और अनुकूलित betseg के एल्गोरिथ्म का उपयोग करता है। आने के लिए स्पष्टीकरण जब मेरे पास कुछ और खाली समय है। मुझे यकीन है कि इसे छोटा किया जा सकता है लेकिन मैं फिलहाल परेशान नहीं होने जा रहा हूं।


2

बैच, 82 बाइट्स

@if %2 gtr %1 %0 %2 %1
@cmd/cset/a%1*~%1*%2*~%2/4+((%1+%1-%2)*(%2*%2*4-1)-3)*%2/6
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.