स्वैपिंग नंबर [बंद]


10

यह एक सामान्य पहेली है जिसे आप में से कई लोगों ने मैन्युअल रूप से हल किया है। अब यह एक ही हल करने के लिए एक एल्गोरिथ्म लिखने का समय है।

एक-दूसरे की दिशा का सामना करने वाले दो अलग-अलग पक्षों में समान संख्या वाले मैच स्टिक होते हैं। उनके बीच एक ही खाली जगह है। निम्नलिखित आकृति की तरह कुछ कहें (यदि मैच स्टिक की कुल संख्या 4 है)।

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

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

अब, आपको आवश्यक न्यूनतम चरणों को खोजने के लिए एक एल्गोरिथ्म लिखना होगा, जिसके उपयोग से सभी बाएं हाथ की तरफ की छड़ें दाएं हाथ की तरफ से और सभी दाएं हाथ के मैच की छड़ें बाएं हाथ की तरफ से उतरेंगी।

पूर्व के लिए: यदि कुल 2 मैच स्टिक हैं (प्रत्येक पक्ष में 1) तो चरण होंगे:

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

नोट: उपरोक्त आकृति में बाईं ओर की छड़ी को पहले स्थानांतरित किया गया था। एक और समाधान मौजूद है जब दाहिनी ओर की छड़ी पहले चलती है। लेकिन इस समस्या के लिए, आपको केवल एक समाधान देना होगा और यह भी मान लेना होगा कि बाईं ओर की छड़ी पहले चलती है।

निम्नलिखित आंकड़ा 4 मैच स्टिक (प्रत्येक पक्ष में 2) के साथ चाल का वर्णन करता है:

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

नोट: उपरोक्त आकृति में बाईं ओर की छड़ी को पहले स्थानांतरित किया गया था। एक और समाधान मौजूद है जब दाहिनी ओर की छड़ी पहले चलती है। लेकिन इस समस्या के लिए, आपको केवल एक समाधान देना होगा और यह भी मान लेना होगा कि बाईं ओर की छड़ी पहले चलती है।

[मान लें: इनपुट किसी भी संख्या में ०२ से १४ के बीच हो सकता है (अर्थात प्रत्येक पक्ष में १ से icks माचिस की तीली)। इस सीमा के बाहर इनपुट के लिए, आपको कोई सत्यापन करने की आवश्यकता नहीं है, न ही कोई त्रुटि संदेश देने की आवश्यकता है। नोट: आउटपुट में, प्रत्येक चरण एक 'से अलग हो जाता है।' (पाइप) चरित्र। COBOL प्रोग्रामर को हमेशा PIC 9 (2) को इनपुट साइज के रूप में ग्रहण करना चाहिए और आउटपुट को अधिकतम लंबाई 450 वर्णों पर तय करने की भी आवश्यकता हो सकती है।


नमूना इनपुट:

02  

नमूना आउटपुट:

01To02|03To01|02To03|


नमूना इनपुट:

04  

नमूना आउटपुट:

02To03|04To02|05To04|03To05|01To03|02To01|04To02|03To04|


नमूना इनपुट:

06  

नमूना आउटपुट:

03To04|05To03|06To05|04To06|02To04|01To02|03To01|05To03|07To05|06To07|04To06|02To04|03To02|05To03|04To05|

यदि आप छवियों को सीधे शामिल नहीं कर सकते हैं, तो क्या आप उन्हें संपादित करने के लिए किसी और के लिए लिंक की आपूर्ति कर सकते हैं?
पीटर टेलर

2
मैंने कुछ त्वरित चित्र बनाए। उम्मीद है कि वे मूल लेखक के इरादे के अनुरूप हों।
प्रिमो

3
जीत के लिए शर्त?
श्मिट

जवाबों:


3

एपीएल 129

नीचे दिए गए कोड स्क्रीन इनपुट लेता है और निर्दिष्ट प्रारूप में स्क्रीन पर आउटपुट देता है:

n←n,n++\1↓z←(⌽z),((¯1*~2|n)×n⍴2),z←⌽∊(¯1*2|⍳n)ר1,((⍳(n←.5×⍎⍞)-1)⍴¨2),¨1⋄(∊(((¯2↑¨'0',¨⍕¨n),¨⊂'To'),¨(¯2↑¨'0',¨⍕¨n-z)),¨⊂'|')~' '

आउटपुट को स्वरूपित करने के लिए कोड का एक अच्छा तीसरा भाग लिया जाता है। कोड में is प्रतीक की घटना से तर्क पूरा हो गया है।

नीचे एक जाँच के रूप में 08 इनपुट के लिए परिणाम है:

04To05|06To04|07To06|05To07|03To05|02To03|04To02|06To04|08To06|09To08|07To09|05To07|03To05|01To03|02To01|04To02|06To04|08To06|07To08|05To07|03To05|04To03|06To04|05To06|

1
मुझे हमेशा ऐसा लगता है कि APL> धोखा दे रहा है। <
Shmiddty

@Shiddty मुझे डर है कि कोई भी विशुद्ध रूप से प्रतीक आधारित भाषा जैसे कि एपीएल, जे, गोल्फस्क्रिप्ट आदि सबसे अधिक संभावित शब्द आधारित भाषाओं के खिलाफ कोड गोल्फ जीतेंगे;)
ग्राहम

3

जावास्क्रिप्ट 178 174 161

promptएस के लिए nतो alertजवाब है। ( 0नोडिंग)

नवीनतम:

t=1+(m=prompt(s=i='')/2);for(z=Math.abs;i++<m*2;)for(j=m-z(m-i),s+=(t+=a=(m%2^z(m+.5-i)%2-.5)*-2+1)+'To'+(t-a)+'|';j--;)s+=(t+=a=i%2*4-2)+'To'+(t-a)+'|';alert(s)

2:

z=Math.abs;t=m=prompt(o=[])/2;t++;for(s=i='';i++<m*2;)for(j=m-z(m-i),o.push((z(m+.5-i)%2-.5)?-1:1);j--;)o.push(i%2?2:-2);o.map(function(a){s+=(t+=a)+'To'+(t-a)+'|'});alert(s)

1:

t=m=prompt(o=[])/2+1;for(s=i='';++i<m;)for(j=i,o.push(i%2?-1:1);j--;)o.push(i%2?2:-2);o.concat(o.slice().reverse().slice(m-1)).map(function(a){s+=(t+=a)+'To'+(t-a)+'|'});alert(s)

यह इस अवधारणा का उपयोग करता है कि पैटर्न प्रतिबिंबित है:

Key
R='Jump Right'
r='Shift Right'
L='Jump Left'
l='Shift Left'
m='Move'
j='Jump'

तो, जहां n=2, आंदोलन का पैटर्न है:

rLr
mjm

जिसकी बराबरी करता है

+1 -2 +1

यह पैटर्न ऐसा दोहराता है ( n=8)

rLlRRrLLLlRRRRlLLLrRRlLr
mjmjjmjjjmjjjjmjjjmjjmjm
+1 -2 -1 +2 +2 +1 -2 -2 -2 -1 +2 +2 +2 +2 -1 -2 -2 -2 +1 +2 +2 -1 -2 +1

हम यहाँ कुछ पैटर्न देख सकते हैं:

  1. आंदोलन बाएं और दाएं के बीच वैकल्पिक होता है
  2. एक विशेष दिशा में आंदोलनों की संख्या 1 से बढ़ जाती है n/2, जो 3 बार दोहराती है, फिर 1 तक घट जाती है।
  3. आंदोलन का प्रकार शिफ्टिंग और जंपिंग के बीच वैकल्पिक होता है, एक पंक्ति में शिफ्ट की संख्या एक स्थिर होती है 1, और अनुक्रमिक कूद की संख्या 1 से बढ़ कर वापस 1 तक n/2घट जाती है।
  4. आंदोलनों का योग हमेशा 0. होता है (यकीन नहीं होता कि क्या यह वास्तव में प्रासंगिक है)

n=14:

rLlRRrLLLlRRRRrLLLLLlRRRRRRrLLLLLLLrRRRRRRlLLLLLrRRRRlLLLrRRlLr
mjmjjmjjjmjjjjmjjjjjmjjjjjjmjjjjjjjmjjjjjjmjjjjjmjjjjmjjjmjjmjm

नमूना उत्पादन:

f(2):

1To2|3To1|2To3| 

f(8):

4To5|6To4|7To6|5To7|3To5|2To3|4To2|6To4|8To6|9To8|7To9|5To7|3To5|1To3|2To1|4To2|6To4|8To6|7To8|5To7|3To5|4To3|6To4|5To6|

f(40):

20To21|22To20|23To22|21To23|19To21|18To19|20To18|22To20|24To22|25To24|23To25|21To23|19To21|17To19|16To17|18To16|20To18|22To20|24To22|26To24|27To26|25To27|23To25|21To23|19To21|17To19|15To17|14To15|16To14|18To16|20To18|22To20|24To22|26To24|28To26|29To28|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|12To13|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|31To30|29To31|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|11To13|10To11|12To10|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|32To30|33To32|31To33|29To31|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|11To13|9To11|8To9|10To8|12To10|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|32To30|34To32|35To34|33To35|31To33|29To31|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|11To13|9To11|7To9|6To7|8To6|10To8|12To10|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|32To30|34To32|36To34|37To36|35To37|33To35|31To33|29To31|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|11To13|9To11|7To9|5To7|4To5|6To4|8To6|10To8|12To10|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|32To30|34To32|36To34|38To36|39To38|37To39|35To37|33To35|31To33|29To31|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|11To13|9To11|7To9|5To7|3To5|2To3|4To2|6To4|8To6|10To8|12To10|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|32To30|34To32|36To34|38To36|40To38|41To40|39To41|37To39|35To37|33To35|31To33|29To31|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|11To13|9To11|7To9|5To7|3To5|1To3|2To1|4To2|6To4|8To6|10To8|12To10|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|32To30|34To32|36To34|38To36|40To38|39To40|37To39|35To37|33To35|31To33|29To31|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|11To13|9To11|7To9|5To7|3To5|4To3|6To4|8To6|10To8|12To10|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|32To30|34To32|36To34|38To36|37To38|35To37|33To35|31To33|29To31|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|11To13|9To11|7To9|5To7|6To5|8To6|10To8|12To10|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|32To30|34To32|36To34|35To36|33To35|31To33|29To31|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|11To13|9To11|7To9|8To7|10To8|12To10|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|32To30|34To32|33To34|31To33|29To31|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|11To13|9To11|10To9|12To10|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|32To30|31To32|29To31|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|11To13|12To11|14To12|16To14|18To16|20To18|22To20|24To22|26To24|28To26|30To28|29To30|27To29|25To27|23To25|21To23|19To21|17To19|15To17|13To15|14To13|16To14|18To16|20To18|22To20|24To22|26To24|28To26|27To28|25To27|23To25|21To23|19To21|17To19|15To17|16To15|18To16|20To18|22To20|24To22|26To24|25To26|23To25|21To23|19To21|17To19|18To17|20To18|22To20|24To22|23To24|21To23|19To21|20To19|22To20|21To22|

यहाँ विधि प्रदर्शित करने के लिए कुछ छद्म कोड है:

var mid=cursor=N/2,delta
cursor++                 // the cursor is where the empty space is.
for(i=0; i++<N;){
  delta = (mid%2^abs(mid+.5-i)%2-.5)*-2+1;  // 1 or -1
  print((cursor+delta) + 'To' + cursor + '|')
  cursor+=delta
  for(j=mid-abs(mid-i);j--;)
  {
    delta = i%2*4-2  // 2 or -2
    print((cursor+delta) + 'To' + cursor + '|')
    cursor+=delta
  }
}

2
आप सही है कि पैटर्न के साथ और अधिक स्पष्ट है कर रहे हैं l/L/r/Rऔर m/j। मुझे दूरी को दिशा से अलग करने का विचार पसंद है
गॉर्डन बैली

2

C - 216 213

मेरा समाधान दो तथ्यों पर आधारित है:

  1. पिछली चाल के "से" फ़ील्ड "से" है (चूंकि आप हमेशा उस स्थान पर एक खाली स्लॉट बनाते हैं जहां से आप चलते हैं, और कहां हमेशा खाली स्लॉट में जाते हैं)

  2. दूरी और दिशाओं के लिए एक बहुत ही नियमित पैटर्न है जिसे स्थानांतरित किया जाता है। पहले 3 परीक्षण मामलों के लिए, वे हैं:

    1 -2 1

    1 -2 -1 2 2 -1 -2 1

    1 -2 -1 2 2 1 -2 -2 -2 1 2 2 -1 -2 1

इसे ध्यान में रखते हुए मैंने मूल रूप से उस पैटर्न को बनाने और जारी रखने का एक कार्यक्रम लिखा था। मुझे पूरा यकीन है कि इसे लिखने के लिए वास्तव में सुंदर और बहुत अधिक सुंदर पुनरावर्ती तरीका होना चाहिए, लेकिन मुझे अभी तक इसका पता नहीं चला है:

#include <stdio.h>

int main(int argc, const char *argv[])
{
   int upper_bound = atoi(argv[1]) / 2;
   int len;
   int from;
   int to = upper_bound + 1;
   int direction = 1;
   int i;

   for(len = 1; len <= upper_bound; ++len){
      for(i = len-1; i >=0; --i){
         from = to - direction*(1 + (i!=0));
         printf("%02dTo%02d|",from,to);
         to = from;
      }
      direction*=-1;
   }
   for(i=1; i < len; ++i){
      from = to - direction*2;
      printf("%02dTo%02d|",from,to);
      to = from;
   }
   direction*=-1;
   for(--len; len >= 0; --len){
      for(i = 0; i < len; ++i){
         from = to - direction*(1 + (i!=0));
         printf("%02dTo%02d|",from,to);
         to = from;
      }
      direction*=-1;
   }
   return 0;
}

और गोल्फ (भले ही यह एक कोड-चुनौती थी, गोल्फ नहीं):

#define B {F=T-D*(1+(i!=0));printf("%02dTo%02d|",F,T);T=F;}D*=-1;
L,F,T,D,i;main(int U,char**A){U=atoi(A[1])/2;T=U+1;D=1;for(L=1;L<=U;++L){for(i=L-1;i>=0;--i)B}for(i=1;i<L;++i)B for(--L;L>=0;--L){for(i=0;i<L;++i)B}}

#define B {F=T-D*(1+(i!=0));printf("%02dTo%02d|",F,T);T=F;}D*=-1;
L,F,T,D,i;main(int U){scanf("%d",&U);U/=2;T=U+1;D=1;for(L=1;L<=U;++L){for(i=L-1;i>=0;--i)B}for(i=1;i<L;++i)B for(--L;L>=0;--L){for(i=0;i<L;++i)B}}

जब मैं आपका गोल्फ संस्करण चलाता हूं, तो मुझे एक सेगफॉल्ट मिलता है।
आर्टिस्टेक्स

क्षमा करें, मैं यह उल्लेख करना भूल गया कि इनपुट को कमांड लाइन तर्क के रूप में दिया गया है - यदि आप इसे बिना किसी तर्क के चलाते हैं तो यह सीफ़ॉल्ट होगा। लेकिन वास्तव में अब जब आप इसका उल्लेख करते हैं, तो मुझे नहीं पता कि मैंने क्यों सोचा था कि कमांड लाइन के तर्क इससे कम होंगे scanf। मैं अपने उत्तर को बेहतर संस्करण के साथ अपडेट कर रहा हूं।
गॉर्डन बैली

पैटर्न अधिक ध्यान देने योग्य है जब आप एल / आर / एल / आर (बड़ा किया जा रहा है "कूद") का उपयोग करें: N(2)=rLr, N(4)=rLlRRlLr, N(6)=rLlRRrLLLrRRlLr, आदि
Shmiddty

2

मेथेमेटिका

यह दृष्टिकोण Nestचालों के आकार और दिशा के एक क्रम का निर्माण करता है, जैसा कि {fromPosition,toPosition}स्थिति के साथ शुरू होता है n, जहां nमैच जोड़े की संख्या को संदर्भित करता है। यह फिर Foldएक फंक्शन में अनुक्रम को ले जाता है जो चाल से शुरू होता है {n, n+1}

z@n_:=(p=1;h@t_:=Append[{Table[2 (-1)^t,{t}]},{(-1)^(t+1)}];
k=Join[Reverse@Drop[#,n],#]&[Flatten@Nest[Prepend[#,h[p++]]&,{},n]];
Fold[Append[#,{#[[-1,1]]-#2,#[[-1,1]]}]&,{{n,n+k[[1]]}},Rest@k])

z[1]

{{1, 2}, {3, 1}, {2, 3}}


z[4]

{{4, 5}, {6, 4}, {7, 6}, {5, 7}, {3, 5}, {2, 3}, {4, 2}, {6, 4}, { 8, 6}, {9, 8}, {7, 9}, {5, 7}, {3, 5}, {1, 3}, {2, 1}, {4, 2}, {6। 4}, {8, 6}, {7, 8}, {5, 7}, {3, 5}, {4, 3}, {6, 4}, {5, 6}}


z[7]

{{7, 8}, {9, 7}, {10, 9}, {8, 10}, {6, 8}, {5, 6}, {7, 5}, {9, 7}, { 11, 9}, {12, 11}, {10,12}, {8, 10}, {6, 8}, {4, 6}, {3, 4}, {5, 3}, {7 5}, {9, 7}, {11, 9}, {13, 11}, {14, 13}, {12, 14}, {10, 12}, {8, 10}, {6, 8} , {4, 6}, {2, 4}, {1, 2}, {3, 1}, {5, 3}, {7, 5}, {9, 7}, {11, 9}, { 13, 11}, {15, 13}, {14, 15}, {12, 14}, {10, 12}, {8, 10}, {6, 8}, {4, 6}, {2। 4}, {3, 2}, {5, 3}, {7, 5}, {9, 7}, {11, 9}, {13, 11}, {12, 13}, {10, 12} , {8, 10}, {6, 8}, {4, 6}, {5, 4}, {7, 5}, {9, 7}, {11, 9}, {10, 11}, { 8, 10}, {6, 8}, {7, 6}, {9, 7}, {8, 9}}


स्वैप की कल्पना करना

r, bऔर oचित्र या एक लाल मैच, एक नीला मैच, और कोई मैच नहीं है, क्रमशः।

माचिस

निम्नलिखित प्रारूप zमैचों के साथ स्वैप प्रदर्शित करने के लिए आउटपुट से है।

swaps[n_]:=FoldList[Grid[{Permute[#[[1,1]],Cycles[{#2}]],Range[2n+1]}]&,
Grid[{Join[Table[r,{n}],{o},Table[b,{n}]],Range[2n+1]}],z[n]]

swapMatches[n_]:=Grid[Partition[swaps[n],2,2,1,""],Dividers->All]

swapszप्रारंभिक सूची और बाद की सूचियों को अनुमति देने के लिए आदेशों के जोड़े के रूप में आदेशों का उपयोग करके राज्यों की एक सूची तैयार करता है।

swaps[1]

swaps1

swapMatches एक ग्रिड में राज्यों को प्रदर्शित करता है।

swapMatches[2]

swaps2

swapMatches[3]

swaps3


0

जावास्क्रिप्ट 191

function f(N) {
    n=N>>=i=c=a='1';n++
    s=z='0'
    for(k=b='34';i<N;k=i%2?a+=z+z:b+='44',i++)c=k+c
    t=''
    i=N*(N+1)/2
    l=2*i+N
    for(;l;n+=(i>=1?r=c[i-1]:i<=-N?c[-i-N]:k[1])-2,t+=(s=n>9?'':z)+n+a+'|',--l,--i)a='To'+s+n
    return t
}

वर्णों का उपयोग करके गिना जाता है grep =|tr -d \ |wc -c


1
हाय और कोडगुफ़ में आपका स्वागत है! मुझे लगता है कि आप पाएंगे कि आपका समाधान परीक्षण के किसी भी मामले ( jsfiddle.net/SJwaU ) के लिए सही उत्पादन नहीं करता है । इनपुट के लिए 02, मान सही हैं, लेकिन यह अनुगामी गायब है |। अन्य दो मामलों के लिए, मान बंद हैं, और प्रारूपण 10भी गलत है। अपने चरित्र की गिनती विधि के बारे में भी निश्चित नहीं है। आप केवल फ़ंक्शन बॉडी माइनस को रिटर्न क्यों गिना रहे हैं?
गॉर्डन बैली

@gordon ओह, लगता है कि मैंने अपने सबसे हालिया अनुकूलन में एक गलती की है। इशारा करने के लिए धन्यवाद। मैं केवल एक REPL पर शरीर की गिनती करता हूं, बस आपको इसकी आवश्यकता है। मैंने फंक्शन डेकोरेशन केवल सुविधा के लिए रखा है।
आर्टिस्टोक्स

आपको अपने कुल के प्रति प्रासंगिक व्हाट्सएप (जैसे newlines) को गिनने की आवश्यकता है।
श्मिट

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