কয়েকটি বাইট ব্যবহার করে 2048 এর একটি ডিটারমিনিস্টিক সংস্করণটি সমাধান করুন


17

একটি প্রোগ্রাম লিখুন যা গেমটির ডিটারমিনিস্টিক বৈকল্পিকের চলনগুলির বিজয় ক্রম তৈরি করে 2020. ক্রমটি 0: আপ, 1: ডান, 2: ডাউন, 3 সহ 0-3 সংখ্যার একটি স্ট্রিং আকারে হওয়া উচিত পড়ে থাকবে। উদাহরণস্বরূপ, স্ট্রিং "1132" এর অর্থ ডান বাম নিচে। বিজয়ী প্রোগ্রামটি সংক্ষিপ্ততম উত্স কোড যা 2048 এ যায়!

নির্ধারিত 2048 এর নিয়ম: গেমটি 4x4 গ্রিডে প্রথম দিকে 1 টাইলযুক্ত উপরের বাম-কোণে খেলা হয়। প্রতিটি পদক্ষেপে "বাম", "ডান", "উপরে" বা "নীচে" কমান্ড থাকে। কমান্ড বাম কমান্ড গ্রিডের সমস্ত টাইলগুলি বাম দিকে স্লাইড করে, তারপরে বাম থেকে শুরু করা টাইলগুলির মতো একত্রিত হয়ে যোগফল যোগ করবে। তেমনি, কমান্ড ডানদিকে টাইলস স্লাইড করে, তারপরে ডান থেকে শুরু করে একত্রিত হয়।

প্রতিটি টাইল প্রতিটি চালচালনের জন্য কেবল একটি সংমিশ্রনে অংশ নিতে পারে।

সরানোর পরে, বাম দিক থেকে প্রথম কলামে একটি উপলব্ধ স্থান সহ একটি নতুন 2 টাইল তৈরি করা হবে, সেই কলামের উপরের দিক থেকে প্রথম উপলব্ধ স্পেসে।

উদাহরণস্বরূপ, ক্রম "ডান ডান বাম নিচে" রাজ্যগুলিতে নিয়ে যায়

2___
____
____
____

2__2
____
____
____


2__4
____
____
____


24__
2___
____
____


2___
____
____
44__

কমান্ডের ডানদিকে সারি প্রয়োগ করা হয়েছে _ 2 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
@ কোয়াডমাস্টার এক্স এলআই আপনি আপনার বিবরণে টানা 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 characters অক্ষর। নিম্নলিখিতটি উপরেরটির ঠিক সমান, কোনও হার্ড-কোডেড সমাধান বা কোনও কিছুই:

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

ট্রিভিয়া: সমাধানটি জিএসপিড এবং বেস 64-এনকোডড থাকলে 309 বাইট গিজিপিড এবং 418 বাইট রয়েছে। সুতরাং এটি কেবল ডিকোড করা এবং এটিকে মুদ্রণ করা একটি ছোট প্রোগ্রাম হবে, তবে এটি কোনও মজাদার নয়

ব্যাখ্যা :

এখানে সরল সংস্করণটির একটি পেস্টবিন যা প্রতিটি পদক্ষেপের পরে বোর্ডটি প্রিন্ট করে, দেখতে খুব মজাদার!

এটি একটি খুব সাধারণ প্রাণশক্তি এআই। এটি প্রতিটি বোর্ড পদের জন্য একটি ইভি নিয়োগ করে:

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

16 কে :

ইউরেকা! 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

ক্রম এখানে

32 কে :

হ্যাঁ মহিলা ও ভদ্রলোক, আমরা 32k চিহ্ন পেয়েছি। ইভি ফাংশনটি একটি ধ্রুবক দ্বারা স্কোয়ারগুলি বাড়ানোর পরিবর্তে প্রতিটি বর্গটি নিম্নলিখিত শক্তিতে উত্থাপন করে এবং সেগুলি যুক্ত করে। xমানে বর্গটি জড়িত নয়:

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

এটি এখনও সমস্ত মান একবারে যোগ করে এবং প্রতিটি খালি স্কোয়ারের জন্য 256 যোগ করে। লুকাহেড 32 কিলোমিটার পর্যন্ত 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; পাইথন এ
থিডক্টর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.