जब फिबोनाची क्वींस से मिलता है


18

( चैट में "शतरंज" और "फिबोनाची" टैग की मेरी यादृच्छिक जोड़ी के लिए हेल्का की प्रतिक्रिया से प्रेरित )


फाइबोनैचि

फिबोनैकी संख्या गणित के क्षेत्र में और अधिक अच्छी तरह से ज्ञात दृश्यों, जहां प्रत्येक संख्या पिछले दो संख्याओं को एक साथ जोड़कर बना है में से एक हैं। नीचे शून्य अनुक्रमित अनुक्रम की एक परिभाषा है:

f(0) = 0
f(1) = 1
f(n) = f(n-1) + f(n-2)

इस अनुक्रम में परिणाम 0, 1, 1, 2, 3, 5, 8, 13, 21, ...( OEIS लिंक )। इस चुनौती में, हम केवल कड़ाई से सकारात्मक मूल्यों (ताकि 1, 1, 2, 3, ...) पर ध्यान केंद्रित कर रहे हैं, और आप शून्य-अनुक्रमण या एक-अनुक्रमण को चुन सकते हैं, लेकिन कृपया प्रस्तुत करें।

फाइबोनैचि संख्याओं का उपयोग विमान के एक टाइलिंग के लिए किया जा सकता है, f(n)आकार में क्रमिक और एक साथ किनारों को संरेखित करने वाले वर्गों का उपयोग करके । वर्तमान वर्ग से पैटर्न "राइट-अप-लेफ्ट-डाउन" में स्क्वायर रखकर काउंटर-क्लॉकवाइज फैशन में किया जाता है। f(8)=21नीले रंग में हाइलाइट किए गए शुरुआती वर्ग के साथ इस आंशिक टाइलिंग का एक उदाहरण इस प्रकार है:
फाइबोनैचि वर्ग

आप देख सकते हैं f(1)=1शुरू करने वर्ग (नीले रंग में हाइलाइट), के रूप में f(2)=1वर्ग के लिए रखा सही इसके बारे में, f(3)=2वर्ग रखा ऊपर वहाँ से, f(4)=3वर्ग रखा छोड़ दिया पर और इतने। अगला वर्ग होगा f(9)=21+13=34और नीचे की ओर रखा जाएगा। यह आंशिक टाइलिंग विधि है जिसका उपयोग हम इस चुनौती में करेंगे।


रानियाँ

शतरंज के खेल में , सबसे शक्तिशाली टुकड़ा रानी है क्योंकि यह क्षैतिज, लंबवत या तिरछे किसी भी स्थान को स्थानांतरित कर सकता है। नीचे के बोर्ड आरेख में, काले वृत्त के साथ वर्ग दिखाते हैं कि रानी कहाँ जा सकती है:
रानी शतरंज में आगे बढ़ती है

हम शब्द कवरेज को इस प्रकार परिभाषित करेंगे

वर्गों का प्रतिशत, जो रानी की कुल संख्या को देखते हुए, रानी की कुल संख्या को देखते हुए, और रानी की अपनी शुरुआती स्थिति को देखते हुए, वर्गों की कुल संख्या तक जा सकते हैं।

उदाहरण के लिए ऊपर जाता है, रानी की कवरेज है 28/64 = 43.75%। यदि रानी ऊपरी-दाएँ h8वर्ग में होती, तो कवरेज होता 22/64 = 34.375%। अगर रानी में था e7, तो कवरेज होगा 24/64 = 37.5%


चुनौती

हम इस चुनौती के लिए हमारे शतरंज बोर्ड के रूप में ऊपर दिखाए गए फिबोनाची टाइलिंग का उपयोग करने जा रहे हैं। आपको इनपुट के रूप में दो सकारात्मक पूर्णांक दिए जाएंगे, nऔर x:

  • यह nदर्शाता है कि टाइलिंग कितनी बड़ी है। ऊपर दिया गया उदाहरण, 21बाईं ओर वर्ग के साथ , जब n = 8से f(8) = 21(शून्य-अनुक्रमित) आकार का एक बोर्ड है ।
  • xका प्रतिनिधित्व करता है जो फाइबोनैचि वर्गों की रानी (रों) प्लेसमेंट के लिए प्रयोग किया जाता है, कवरेज की गणना के लिए। रानियों को उस विशेष फाइबोनैचि वर्ग टाइल में प्रत्येक वर्ग पर एक-एक-बार रखा जाता है, और कुल कवरेज व्यक्तिगत (अद्वितीय) कवरेज का योग है।

उदाहरण के लिए, यहां n = 8(ऊपर के समान टाइलिंग) और x = 4( f(4) = 3वर्ग के अनुसार, छायांकित नीला) की एक छवि है । उन नौ नीले वर्गों में से प्रत्येक में एक रानी को एक-एक करके रखने से, रानियाँ हर वर्ग को कवर कर सकती हैं जो नारंगी रंग का होता है। इस उदाहरण में कुल कवरेज इसलिए है 309/714 = 43.28%

n = 8, x = 4

जाहिर है, किसी भी समय n = x, कवरेज होने जा रहा है 100%(उदाहरण के लिए, के साथ n=8और x=8, आप देख सकते हैं कि पूरे बोर्ड पर हर वर्ग कम से कम एक बार कवर होने जा रहा है)। इसके विपरीत, एक उपयुक्त बड़े के साथ nऔर x=1या x=2, कवरेज दृष्टिकोण (लेकिन तक पहुँचने कभी नहीं) जा रहा है 0%(उदाहरण के लिए के साथ n=8और x=1, कवरेज एक मामूली है 88/714 = 12.32%)।

दो ऐसे इनपुट नंबरों को देखते हुए, आपको दो प्रतिशत स्थानों पर सटीक, कवरेज प्रतिशत का उत्पादन करना होगा। कृपया निर्दिष्ट करें कि आपका कोड गोलाई को कैसे संभालता है।


नियम

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

उदाहरण

n = 8, x = 4
43.28

n = 8, x = 8
100 or 100.00

n = 8, x = 1
12.32

n = 4, x = 1
66.67

n = 4, x = 2
60 or 60.00

n = 5, x = 3
75 or 75.00

n = 5, x = 1
47.5 or 47.50

मेरा प्रोफ़ाइल चित्र अर्द्ध-प्रासंगिक है
स्टीफन

"जब फिबोनाची क्वींस से मिले थे "? या "फिबोनाची क्वींस से मिलता है"?
जोनाथन एलन


@JonathanAllan शीर्षक सही है-जैसा है। यह '' ऐसा होता है जब एक्स होता है। तुलना करें "जब हेनरी सैली से दोपहर के भोजन के लिए मिलते हैं, तो वे हमेशा हैम्बर्गर खाते हैं।"
AdmBorkBork

आह, आपका मतलब है "जब फिबोनाची क्वींस से मिलता है ..."!
जोनाथन एलन

जवाबों:


2

VB.NET, (.NET 4.5), 1238 1229 बाइट्स

-9 बाइट्स @totallyhuman को धन्यवाद

Function A(n,x)
Dim g=New List(Of List(Of Long))
g.Add(New List(Of Long))
g(0).Add(1)
For i=2To n
Dim b=1
If i>2Then 
Dim w=0,y=1
b=w+y
For j=3To i
w=y
y=b
b=w+y
Next
End If
Select Case i Mod 4
Case 1
For j=1To b
Dim l=New List(Of Long)
For k=1To b
l.Add(i)
Next
g.Add(l)
Next
Case 2
For Each r In g
For j=1To b
r.Add(i)
Next
Next
Case 3
For j=1To b
g.Insert(0,New List(Of Long))
For k=1To b
g(0).Add(i)
Next
Next
Case 0
For Each r In g
For j=1To b
r.Insert(0,i)
Next
Next
End Select
Next
For i=0To g.Count-1
Dim c=g(i)
For j=0To c.Count-1
Dim e=c(j)
If e=x Then
For k=1To Math.Max(g.Count,g(0).Count)
If j-k>=0AndAlso c(j-k)<>x Then c(j-k)=0
If i-k>=0AndAlso g(i-k)(j)<>x Then g(i-k)(j)=0
If j+k<c.Count AndAlso c(j+k)<>x Then c(j+k)=0
If i+k<g.Count AndAlso g(i+k)(j)<>x Then g(i+k)(j)=0
If i-k>=0AndAlso j-k>=0AndAlso g(i-k)(j-k)<>x Then g(i-k)(j-k)=0
If i-k>=0AndAlso j+k<c.Count AndAlso g(i-k)(j+k)<>x Then g(i-k)(j+k)=0
If i+k<g.Count AndAlso j-k>=0AndAlso g(i+k)(j-k)<>x Then g(i+k)(j-k)=0
If i+k<g.Count AndAlso j+k<c.Count AndAlso g(i+k)(j+k)<>x Then g(i+k)(j+k)=0
Next
End If
Next
Next
Dim hits=0
For Each r In g
For Each c In r
If c=x Or c=0Then hits+=1
Next
Next
Return Math.Round(hits*100/(g.Count*g(0).Count),2)
End Function

समस्या कथन का अनुकरण। मैं वर्ग आकार बढ़ाने के लिए प्रत्येक नए रिट्रेसमेंट नंबर के माध्यम से ग्रिड बनाकर शुरुआत करता हूं। मैं प्रत्येक सेल में सूचकांक को संग्रहीत करता हूं, ताकि यह पता लगाना आसान हो जाए कि रानी अगले चरण में कहां जाएंगी।

फिर, मुझे प्रत्येक कोशिका मिलती है जिसमें एक रानी होनी चाहिए, और प्रत्येक खतरे वाले वर्ग को शून्य के साथ चिह्नित करना चाहिए। मैं उन कोशिकाओं को छोड़ देता हूँ जहाँ रानियाँ होती हैं ताकि मुझे पीछे हटने की चिंता न हो।

अंत में, मैं उन कोशिकाओं को गिनता हूं जो साफ हो जाती हैं, और कतार के साथ कोशिकाएं, और फिर इसे कुल रिक्त स्थान से विभाजित करते हैं। प्रतिशत प्राप्त करने के लिए 100 से गुणा करें, और निकटतम दो दशमलव स्थानों पर गोल करें।


क्या आप hitsएक छोटे चर नाम में नहीं बदल सकते हैं ? मैं VB.NET नहीं जानता, लेकिन मैं मान रहा हूँ कि यह एक चर है।
जुआन

@totallyhuman हाँ, यह सही है। मैं हाथ से गया और उस एक को याद किया होगा। धन्यवाद!
ब्रायन जे जूल

2

पायथन 2 , 524 499 बाइट्स

def Q(n,x):
 global w,h,f;f,R,L=0,range,len
 for d in R(n):s=x-1==d;f=f or[[s]];w=L(f[0]);W,H=R(w),R(L(f));exec"for j in "+("W:f.append([s]*w)","f:\n\tfor k in H:j.append(s)","W:f.insert(0,[s]*w)","f:\n\tfor k in H:j.insert(0,s)","f:0")[d%4-(d==0)]
 w,h=L(f[0]),L(f);l=0,1,-1
 for Y in R(h):
	for X in R(w):exec("""def F(u,v,x,y):
 while(u==v==0)==0<=x<w!=0<=y<h:f[y][x]=1+(f[y][x]!=1);x+=u;y+=v
for s in l:
 for t in l:F(s,t,X,Y)""","")[f[Y][X]!=1]
 q=w*h;return(q-sum(j.count(0)for j in f))*100./q

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

एक फ़ंक्शन को परिभाषित करना जो टाइलिंग आकार nऔर रानी के रिट्रेसमेंट स्क्वायर नंबर दोनों को लेता है x। Ouput प्रतिशत छिद्रित रूप से दो दशमलव स्थानों (फुटर में, जहां सभी आउटपुट हो रहा है) के लिए गोल है।

f एक दो आयामी सरणी है जिसमें बोर्ड की जानकारी दी जा रही है 0 । फिर, रिट्रेन्स शतरंज बोर्ड की गणना की जाती है और उन क्वीन्स के साथ आबाद किया जाता है जहाँ रानियाँ होंगी। फिर उन रानियों को हर उस स्थान पर ले जाया जाता है, जहां उन्हें ले जाया जा सकता है; सभी पदों को पूरे बोर्ड के प्रतिशत के रूप में गिना और मुद्रित किया जाता है।


1

गणितज्ञ 11.1, 336 बाइट, 1-आधारित

R=Rectangle[#,+##]&;f=Fibonacci;o=Join@@Outer[##,1]&;r=RegionUnion;s=RegionMeasure;p[1]={0,0};p[i_]:=p[i-1]+{{-f@i,-f[i-2]},{0,-f@i},{f[i-1],0},{f[i-1]-f@i,f[i-1]}}[[i~Mod~4+1]];t[i_]:=r[R[p@#,f@#]&/@Range@i];k[n_,x_]:=Round[100s@RegionIntersection[r[R[#,f@x]&/@((#+p@x)&/@o[1##&,o[List,{-1,0,1},{-1,0,1}],Range[2f@n]])],t@i]/s@t@i,.01]

उपयोग: k[n, x]। ध्यान दें कि फ़ंक्शन 1-आधारित है। गोलाई द्वारा प्राप्त किया जाता हैRound[100x,0.01]

मूल रूप से, p[i]प्रत्येक वर्ग की स्थिति का निर्धारण करने का एक कार्य है। और क्षेत्र की गणना ऊपरी स्तर के कार्यों द्वारा की जाती है RegionIntersection, जैसे RegionUnion,RegionMeasure

परिणाम

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.