सबसे कम बाइट्स का उपयोग करके 2048 के एक निर्धारक संस्करण को हल करें


17

एक प्रोग्राम लिखें जो गेम के नियतात्मक संस्करण में चालों के एक विजयी क्रम को उत्पन्न करता है 2048। यह क्रम संख्या 0-3 की एक स्ट्रिंग के रूप में होना चाहिए, जिसमें 0: अप, 1: सही, 2: डाउन, 3: बाएं। उदाहरण के लिए, स्ट्रिंग "1132" का अर्थ है दाएं बाएं नीचे। जीतने का कार्यक्रम सबसे छोटा स्रोत कोड है जो 2048 तक जाता है!

नियतात्मक 2048 के नियम: खेल शुरू में 4x4 ग्रिड पर खेला जाता है जिसमें ऊपरी बाएँ कोने में 1 टाइल होती है। प्रत्येक चाल में कमांड "लेफ्ट", "राइट", "अप" या "डाउन" होता है। कमांड बाईं ओर ग्रिड पर सभी टाइलों को स्लाइड करती है, फिर बाईं ओर से शुरू होने वाली टाइलों की तरह जोड़ती है और सम्स करती है। इसी तरह, कमांड दाईं ओर स्लाइड करती है, फिर दाईं ओर से शुरू होती है।

प्रत्येक टाइल केवल एक संयोजन प्रति चाल में भाग ले सकती है।

एक चाल के बाद, एक नया 2 टाइल पहले कॉलम में बाईं ओर से उपलब्ध स्थान के साथ बनाया जाता है, उस कॉलम में ऊपर से पहले उपलब्ध स्थान में।

उदाहरण के लिए, अनुक्रम "दाईं ओर बाईं ओर" राज्यों की ओर जाता है

2___
____
____
____

2__2
____
____
____


2__4
____
____
____


24__
2___
____
____


2___
____
____
44__

कमांड राइट ने पंक्ति में लागू किया _ _ 2 2 परिणाम _ _ 2 4 में कमांड राइट ने पंक्ति 2 2 2 2 परिणामों में लागू किया _ _ 4 4

यह सवाल http://jmfork.github.io/2048/ से प्रेरित है


2
चुनौतियां स्व-निहित होनी चाहिए - क्या होगा यदि वह लिंक मर जाता है?
दरवाज़े

2
यह प्रश्न ऑफ़-टॉपिक प्रतीत होता है क्योंकि यह अनिवार्य रूप से "लिंक-ओनली प्रश्न है।"
दरवाज़े

2
$(".tile-container").addItem("<div class="tile tile-2048 tile-position-3-4">2048</div>");
TheDoctor

1
@QuadmasterXLII आप अपने विवरण में 3 लगातार (समान) संख्याओं के लिए अपेक्षित व्यवहार को स्पष्ट कर सकते हैं
मार्टिन एंडर

1
महान! करीबी वोट वापस हो गए। मेरे पास अभी भी एक मुद्दा है: चूंकि यह नियतात्मक है, इसलिए क्या लोग केवल सबसे छोटा आउटपुट नहीं खोज सकते हैं और फिर सिर्फ आउटपुट ही?
दरवाज़े

जवाबों:


26

पायथन, 740 वर्ण (665 वर्ण संपीड़ित)

कोड :

R=range
G=lambda:[[0]*4for _ in R(4)]
J=[(0,4,1),(2,-1,-1),(1,4,1)]
H=[0,-1,1]
def M(P,d):
 C=G();g,z=[(0,-1),(1,0),(0,1),(-1,0)][d];Q=H[g];W=H[z]
 while 1:
    N=[r[:]for r in P]
    for x in R(*J[g]):
     for y in R(*J[z]):
        s=N[y][x];q,w=y-W,x-Q;d=N[q][w];a,b,c=(((0,s,d),(1,0,s+d))[s==d],(0,0,s or d))[s<1 or d<1];
        if 2-a-(C[y][x]+C[q][w]>0):N[y][x]=b;N[q][w]=c;C[q][w]+=a
    if N==P:break
    P=N
 return N
def F(N):
 for x in R(4):
    for y in R(4):
     if N[y][x]==0:N[y][x]=2;return N
def Z(P,i):
 X=[d for d in R(4)if M(P,d)!=P]
 return i==0and(sum((256,c)[c>0] for v in P for c in v)+P[3][3]*10+P[3][2]*9,-1)or max((Z(F(M(P,d)),i-1)[0],d)for d in X)if X else(-1,-1)
B=G()
B[0][0]=2
h=''
while B[3][3]!=2048:_,X=Z(B,4);h+=`X`;B=F(M(B,X))
print h

(कुछ बाइट्स को बचाने के लिए इंडेंटेशन के लिए रिक्त स्थान के साथ टैब मिलाता है)

मुझे इसे गोल्फ में चूसना चाहिए था क्योंकि अगर मैं सिर्फ उपरोक्त कोड को संकुचित करता हूं, तो बेस -64 इसे एनकोड करता है, और execयह, यह केवल 6565 अक्षर है। निम्नलिखित उपरोक्त के बराबर है, कोई हार्ड-कोडेड समाधान या कुछ भी नहीं:

exec"""eJxVUl1vozAQfMa/wn2qnRjJcNzpDnf7QKS2qlRE+1IUy2oJkARdwl2hbT5+/a0NiXqSZXYH78zY
u0/QFe2qJrewKbaLqoi1lmYSLf909IU2LX1iETfkHjSTIhIBFywUfoALo8AhhtyBlhYMDKnqJX1g
mah4TOgMbhlXK3F01WOJxF06It8mRldGPcKdXhn1jJ+jIXS3bjY1DWLipaA7HRvrprNuMkM8m+wH
a5N7LEMlj1rwcAaPDvR6SPXB6L1Rb2IHB/9Z7P1HVSH6ZvTOqEIsRAmMoZ8eHTt3op9WnOseoDLW
KAIUuR12FbjwKjAK2ZslDf3CZ7NBYzobWK8lj0dZWKhRCko1/p5CQWxpCpDFi64ufhMvg5TQrn7/
6Fqauie8Yal9wC9XjeyNvtzS5dQSjVogz7Kh+o9sjv1oLF0OunKc1YmjOXXrAvBpTx4aJCvaivUf
W8bC7z9EyXV5LY2r/XR9cGFpw08+zfQ3g2sSyCEMzeSXbTce2RZ7xubshg0yXDSI44RhfDaSWxs5
rTd9zYbRIomdHJLgQVwQkjVcXpJhLJJB7AJCGf2MX0QOc5aIiKv1FF7zV5WAFUtEzjn52zXtO13/
AwRvylc=""".decode('base64').decode('zip')

उत्तर :

1111-चाल वाले अनुक्रम को खोजने के लिए ~ 47 सेकंड (17 सेकंड अनऑल्फॉर्स्ड) लेता है:

2221230232213120120232222222221221203211012312310123123101223113322222123230210302321222323223212322101202323123322032132021233212312332023123312111123231223113312312322312232123222021221332111332221012222312222302232021233212312332023212222222123221202332023120312123223221232232222222122122323222222212212232222222221322233231222322200232122312232313132022322212312332121332312320212211332312323223212320232322322133223213212323202123123321231313332122232310112113322212323222220130231233211313332122232312312223232231231232312222220232212312220212232312232123222021221332111332221012222312222302232021233212312332023212222222123221202332023120312123223221322323223312230230323312232313133232223233212312323123323222332222222132221321320323233223232121323212232013221323233032021223320231233220322203132123202123321231233202131321221111231213232131210212312232332132103123130213133213232213321323212332332212222123323322202302333121220222323232113123323221223032131201123212133123131222323313133313300123231332011222221223232331313313112312113230231121232332122323232321312323213212232313212323211330231231012

निम्नलिखित अंतिम बोर्ड की स्थिति और चाल के साथ:

   4    2   16    4
   2    8  128    8
   2    .    . 1024
   .    .    . 1024
Best move: s, with EV=25654

सामान्य ज्ञान: समाधान 309 बाइट्स gzipped और 418 बाइट्स अगर gzipped और base64-एन्कोडेड है। इस प्रकार यह केवल उस डिकोड करने और इसे प्रिंट करने के लिए एक छोटा प्रोग्राम होगा, लेकिन यह है भी मज़ेदार नहीं है

व्याख्या :

यहाँ एक है ungolfed संस्करण का एक पेस्टबिन है जो प्रत्येक चाल के बाद बोर्ड को प्रिंट करता है, देखने में बहुत मजेदार है!

यह एक बहुत ही सरल जानवर-बल AI है। यह प्रत्येक बोर्ड की स्थिति के लिए एक ईवी प्रदान करता है:

ev =   256 * number of spaces 
     + sum_of_values 
     + 10 * board_bottom_right 
     +  9 * board_bottom_2nd_right

यह एक गहराई-पहली खोज चार चालों को आगे बढ़ाता है और उस पथ को चुनता है जो चार चालों में उच्चतम ईवी की ओर जाता है। Ev फ़ंक्शन इसे बोर्ड को साफ करने और कोने में उच्चतम-मूल्यवान टुकड़ों को रखने के लिए प्रोत्साहित करता है, जो कि बहुत इष्टतम होने के लिए समाप्त होता है। यह वहाँ पाने के लिए पर्याप्त है!

यदि आप अन्य बोर्ड स्पॉट पर उच्च मूल्य रखने के लिए ईवी फ़ंक्शन को संशोधित करते हैं, तो कुछ इस तरह है:

1  1  1  1
1  1  1  1
1  1  9 10
1  9 10 11 

उस फंक्शन को इसे जहाँ तक मिलता है:

   2    8    4    2
  16   32   64   16
  64  128  512 1024
   2  256 2048 8192

16k :

यूरेका! 4 के बजाय 5-स्टेप लुकहेड और निम्न वज़न के साथ:

1  1  4  4 
1  1  4 10
1  1 14 16
1 16 18 20 

यह लगभग 32k हो जाता है, जिस पर समाप्त होता है:

   2  128    4     2
  64  256  512     4
   4  128 1024  4096
  16 2048 8192 16384

अनुक्रम यहाँ है

32k :

हाँ महिलाओं और सज्जनों, हमने 32k अंक मारा है। ईवी फ़ंक्शन, वर्गों को एक स्थिर से गुणा करने के बजाय, प्रत्येक वर्ग को निम्न शक्तियों को बढ़ाता है और उन्हें जोड़ता है। xइसका मतलब है कि वर्ग इसमें शामिल नहीं है:

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

यह अभी भी एक बार सभी मानों को जोड़ देता है और प्रत्येक खाली वर्ग के लिए 256 जोड़ देता है। लुकहेड 32k तक पूरे रास्ते में 4 था, और फिर यह 5 तक उछला, लेकिन यह वास्तव में बहुत कुछ नहीं करता है। अंतिम बोर्ड:

   2  128    8     2
  64  256  512     4
   4  128 1024  2048
  16 4096 8192 32768

24,625-चाल अनुक्रम का पास्टबिन


1
यह समाधान शानदार है (मुझे आपकी पाशविक शक्ति + लुक-फॉरवर्ड डीएफएस से प्यार है), महाकाव्य स्पष्टीकरण और दो की उच्चतर शक्तियों के लिए आपकी खोज सबसे उत्कृष्ट है। +1!
प्रोग्रामरडान

अच्छा है! पहले गहराई के साथ एक अनुमानी का उपयोग करना संभवत: आपको इष्टतम समाधान (सबसे छोटी चाल अनुक्रम) तक पहुंचने से रोकता है। हो सकता है कि आप
मऊ

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