कनेक्ट 4: फेक स्पॉट!


35

बैंक में तोड़ दिया गया है, और सभी स्थानीय माफिया ठगों में एक असामान्य एलबी है: वे कनेक्ट 4 खेलने के घर पर थे! जांच में सहायता करने के लिए, आपको सभी कनेक्ट 4 बोर्डों को मान्य करने के लिए एक कार्यक्रम लिखने के लिए कहा जाता है, जो यह जांचने के लिए जब्त किए गए हैं कि स्थिति वास्तव में वैध कनेक्ट 4 गेम से स्थिति हैं, और जल्दबाजी में एक साथ नहीं रखी गई हैं। जैसे ही पुलिस ने दरवाजा खटखटाया।

कनेक्ट 4 के लिए नियम: खिलाड़ी Rऔर Yइसे 7x6 ग्रिड के कॉलम में अपने रंग की टाइलें छोड़ने के लिए बदल देते हैं। जब कोई खिलाड़ी स्तंभ में एक टाइल गिराता है, तो यह उस स्तंभ में सबसे कम अपूर्ण स्थिति पर कब्जा करने के लिए नीचे गिरता है। यदि कोई खिलाड़ी बोर्ड पर अपने रंग की चार टाइलों की क्षैतिज, ऊर्ध्वाधर या विकर्ण रन प्राप्त करने का प्रबंधन करता है, तो वे जीत जाते हैं और खेल तुरंत समाप्त हो जाता है।

उदाहरण के लिए ( Rशुरुआत के साथ ), निम्नलिखित एक असंभव कनेक्ट 4 स्थिति है।

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R| | | | |
| | |Y| | | | |
|R| |Y| | | | |

आपका प्रोग्राम या फ़ंक्शन कनेक्ट 4 बोर्ड में होना चाहिए और या तो वापस लौटना चाहिए

  • एक मिथ्या मूल्य, यह दर्शाता है कि स्थिति असंभव है या
  • 1 से 7 से नंबर की एक स्ट्रिंग, उस स्थिति के लिए अग्रणी चाल में से एक संभव अनुक्रम (संकेत कॉलम गिने जा रहे हैं 1करने के लिए 7बाएं से दाएं, और इसलिए अनुक्रम 112, उदाहरण के लिए, स्तंभ में एक लाल चाल को इंगित करता है 1, एक पीले रंग की चाल के बाद स्तंभ में 1, स्तंभ में लाल चाल के साथ 2)। जब तक आप अपने समाधान में निर्दिष्ट करते हैं, तब तक आप 1234567 के अलावा एक कॉलम-नंबरिंग चुन सकते हैं। यदि आप सूची को किसी अन्य प्रारूप में वापस करना चाहते हैं; उदाहरण के लिए एक सरणी के रूप में [2, 4, 3, 1, 1, 3]तो वह भी ठीक है, जब तक यह देखना आसान है कि चालें क्या हैं।

आप किसी भी समझदार प्रारूप में बोर्ड को पढ़ने के लिए चुन सकते हैं जिसमें खिलाड़ियों के अलावा Rऔर अन्य अक्षरों का उपयोग Yकरना शामिल है, लेकिन आपको यह निर्दिष्ट करना होगा कि कौन सा खिलाड़ी पहले जाता है। आप मान सकते हैं कि बोर्ड हमेशा 6x7 होगा, जिसमें दो खिलाड़ी होंगे।

आप मान सकते हैं कि आपके द्वारा प्राप्त किए जाने वाले पद मानक कनेक्ट 4 बोर्ड पर बनाने के लिए कम से कम शारीरिक रूप से संभव हैं; यानी, 'फ्लोटिंग' टुकड़े नहीं होंगे। आप मान सकते हैं कि बोर्ड गैर-रिक्त होगा।

यह कोड गोल्फ है, इसलिए सबसे कम उत्तर जीतता है। मानक खामियां लागू होती हैं।

उदाहरण

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | --> 1234567 (one possible answer)
| | | | | | | |
|R|Y|R|Y|R|Y|R|

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R| | | | | --> false
| | |Y| | | | |
|R| |Y| | | | |

| | | | | | | |
| | |Y| | | | |
| | |R| | | | |
| | |Y| | | | | --> 323333 (only possible answer)
| | |R| | | | |
| |Y|R| | | | |

| | | | | | | |
| | | | | | | |
| | | | | | | |     
| | | | | | | | --> false (this is the position arising after
| |Y|Y|Y|Y| | |     the moves 11223344, but using those moves
| |R|R|R|R| | |     the game would have ended once R made a 4)

| | | | | | | |
| | | | | | | |
|Y| | | | | | |     
|R|Y| | | | | | --> 2134231211 (among other possibilities)
|R|R|Y| | | | |
|Y|R|R|Y| | | |

| | | | | | | |
| | | | | | | |
|Y| | | | | | |     
|R|Y| | | | | | --> false (for example, 21342312117 does not
|R|R|Y| | | | |     work, because Y has already made a diagonal 4)
|Y|R|R|Y| | |R|

| | | | | | | |
| | | | | | | |
| | | | | | | |     
| | | | | | | | --> 112244553 or similar
|Y|Y| |Y|Y| | |
|R|R|R|R|R| | |

जॉन, जिज्ञासा से बाहर, क्या आपको पता है कि एक गैर-जानवर बल एल्गोरिथ्म मौजूद है?
जोनाह

जवाबों:


9

जेली , 57 बाइट्स

ŒṪŒ!µ0ịŒṬ¬a³ZU,Ɗ;ŒD$€Ẏṡ€4Ḅo1%15;Ḋ€ṢṚ$Ƒƙ$Ȧȧœị³$2R¤ṁ$ƑµƇṪṪ€

एक मैट्रिक्स लेता 0है, जहाँ अनफिल्ड किया जाता है, 1पहले खेला जाता है, और 2दूसरा खेला जाता है। यदि नकली की पहचान की गई थी, तो 1-अनुक्रमित स्तंभों की सूची तैयार करता है।

इसे ऑनलाइन आज़माएं! (एक मिनट के भीतर चलने के लिए 7 से अधिक टुकड़ों के लिए भी अक्षम)

ध्यान दें:

  1. मान लें कि कोई "फ़्लोटिंग" टुकड़े मौजूद नहीं हैं (इसे ZṠṢ€Ƒȧ+6 बाइट्स के लिए तैयार करके ठीक करें )
  2. मान लेता है कि खाली बोर्ड नकली है

11

जावास्क्रिप्ट (ईएस 6),  202 194 187  183 बाइट्स

240

m=>(p=[...'5555555'],g=(c,s=o='')=>/2|4/.test(m)?['',0,2,4].some(n=>m.join``.match(`(1|3)(.{1${n}}\\1){3}`))?o:p.map((y,x)=>m[m[y][x]--^c||p[g(c^6,s+x,p[x]--),x]++,y][x]++)&&o:o=s)(2)

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

कैसे?

जी2413

ऐसा करते समय, यह सुनिश्चित करता है कि हमारे पास लगातार चार विषम मूल्यों का कोई रन नहीं है, जब तक कि सभी मूल्य गायब नहीं हो जाते (यानी यदि एक पक्ष जीतता है, तो यह अंतिम चाल होना चाहिए)।

yएक्सपी[एक्स]

टिप्पणी की गई

m => (                            // m[] = input matrix
  p = [...'5555555'],             // p[] = next row for each column
  g = (c,                         // g = recursive function taking c = color,
          s = o = '') =>          //     s = current solution, o = final output
    /2|4/.test(m) ?               // if the matrix still contains at least a 2 or a 4:
      ['', 0, 2, 4]               //   see if we have four consecutive 1's or 3's
      .some(n =>                  //   by testing the four possible directions
        m.join``                  //   on the joined matrix, using
        .match(                   //   a regular expression where the number of characters
          `(1|3)(.{1${n}}\\1){3}` //   between each occurrence is either 1, 10, 12 or 14
        )                         //   (horizontal, diagonal, vertical, anti-diagonal)
      ) ?                         //   if we have a match:
        o                         //     abort and just return the current value of o
      :                           //   else:
        p.map((y, x) =>           //     for each cell at (x, y = p[x]):
          m[                      // 
            m[y][x]--             //       decrement the value of the cell
            ^ c ||                //       compare the original value with c
            p[                    //       if they're equal:
              g(                  //         do a recursive call with:
                c ^ 6,            //           the other color
                s + x,            //           the updated solution
                p[x]--            //           the updated row for this column
              ),                  //         end of recursive call
              x                   //         then:
            ]++,                  //         restore p[x]
            y                     //         and restore m[y][x]
          ][x]++                  //         to their initial values
        ) && o                    //     end of map(); yield o
    :                             // else:
      o = s                       //   we've found a solution: copy s to o
)(2)                              // initial call to g() with c = 2

नोट मैंने पूछा है "क्या हम मान सकते हैं कि खाली बोर्ड को इनपुट के रूप में नहीं दिया जाएगा?" - अगर हमें इसे संभालना है तो आपके कोड को एक ट्वीक की आवश्यकता होगी।
जोनाथन एलन

मैं नहीं जानता कि क्यों, f([ [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,2,0,2,0,0], [0,2,2,0,2,2,0], [1,1,1,1,1,1,1] ])द्वारा समाप्त होता है 0 और f([ [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,2,0,2,0,0], [2,2,2,0,2,2,1], [1,1,1,1,1,1,1] ])यह सच होना चाहिए
नहुएल फौलीउल

@NahuelFouilleul इस रिपोर्ट के लिए धन्यवाद। मैंने कोड जोड़ा है इन परीक्षण मामलों को जोड़ा है।
अरनौलद

2

पायथन 2 , 295 285 बाइट्स

def f(a):
 if 1-any(a):return[]
 p=sum(map(len,a))%2
 for i in R(7):
	if a[i][-1:]==`p`:
	 b=a[:];b[i]=b[i][:-1];L=f(b)
	 if L>1>(`1-p`*4in','.join([J((u[j]+' '*14)[n-j]for j in R(7))for n in R(12)for u in[b,b[::-1]]]+b+map(J,zip(*[r+' '*7for r in b])))):return L+[i]
R=range;J=''.join

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

-10 किंग जो को किंग

इनपुट स्तंभों का प्रतिनिधित्व करने वाले तारों की एक सूची है; लाल के लिए '1' और पीले रंग के लिए '0' के साथ। तार '-पेडेड नहीं हैं। तो (झूठा) मामला:

| | | | | | | |
| | | | | | | |
|Y| | | | | | |
|R|Y| | | | | |
|R|R|Y| | | | |
|Y|R|R|Y| | |R|

इनपुट इस प्रकार है:

[
  '0110',
  '110',
  '10',
  '0',
  '',
  '',
  '1'
]

आउटपुट कॉलम इंडेक्स, 0-इंडेक्स की एक सूची है, जो बोर्ड बना सकता है; या Noneयदि यह मान्य नहीं है।

रिक्त बोर्ड को मान्य के रूप में स्वीकार करता है ( []इसके बजाय खाली सूची देता है None)।

यह दृष्टिकोण अंतिम चाल से पहली चाल के लिए पुनरावर्ती है: उठाए गए चालों की कुल संख्या की समता के आधार पर, हम या तो अंतिम लाल चाल या अंतिम पीली चाल को हटा देते हैं (या यदि संभव नहीं है तो विफल); परिणामी बोर्ड की जांच करें कि क्या प्रतिद्वंद्वी के पास 4-इन-ए-पंक्ति है (जिस स्थिति में विफल हो, क्योंकि खेल को पहले ही रोक दिया जाना चाहिए); अन्यथा, तब तक पुनरावृत्ति करें जब तक कि बोर्ड खाली न हो (जो वैध हो)।

4-इन-ए-रो कोड सबसे ब्लोटी हिस्सा है। मैट्रिक्स के लिए सभी विकर्ण तार bद्वारा उत्पन्न होते हैं:

[
    ''.join(
        (u[j]+' '*14)[n-j] for j in range(7)
    )
    for u in[b,b[::-1]]for n in range(12) 
]

जो पहले 'डाउन-स्लोपिंग' विकर्णों को सूचीबद्ध करता है, और फिर 'अप-स्लोपिंग' को।

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