가장 적은 바이트를 사용하여 결정적 버전의 2048을 해결하십시오.


17

게임 2048의 결정적 변형으로이기는 연속 시퀀스를 생성하는 프로그램을 작성하십시오. 시퀀스는 0 : 위, 1 : 오른쪽, 2 : 아래, 3 :의 숫자 0-3의 문자열 형식이어야합니다. 왼쪽. 예를 들어, 문자열 "1132"는 오른쪽 오른쪽 아래를 의미합니다. 우승 프로그램은 2048 년에 이르는 가장 짧은 소스 코드입니다!

결정 론적 2048의 규칙 : 게임은 왼쪽 상단 모서리에 타일 1 개가 처음 포함 된 4x4 그리드에서 재생됩니다. 각 이동은 "왼쪽", "오른쪽", "위"또는 "아래"명령으로 구성됩니다. left 명령은 그리드의 모든 타일을 왼쪽으로 슬라이드 한 다음 왼쪽부터 시작하여 타일처럼 결합하고 합칩니다. 마찬가지로 오른쪽 명령은 타일을 오른쪽으로 밀고 오른쪽에서 시작하여 결합합니다.

각 타일은 이동 당 하나의 조합에만 참여할 수 있습니다.

이동 후 왼쪽에서 첫 번째 열에 사용 가능한 공간이있는 새 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
도전은 독립적이어야합니다. 만약 그 링크가 죽으면 어떻게 될까요?
Doorknob

2
이 질문은 본질적으로 "링크 전용 질문"이므로 주제에 맞지 않는 것 같습니다.
Doorknob

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

1
@QuadmasterXLII 당신은 당신의 설명에서 3 ​​개의 연속적인 (동일한) 숫자에 대한 예상 된 행동을 분명히 할 수 있습니다
Martin Ender

1
큰! 마감 투표가 취소되었습니다. 여전히 여기에 문제가 있습니다. 결정적이므로 사람들이 가장 짧은 출력을 찾은 다음 출력 할 수 없습니까?
Doorknob

답변:


26

Python, 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

(몇 바이트를 절약하기 위해 들여 쓰기를위한 공백이있는 혼합 탭)

위의 코드를 압축하고 base-64로 인코딩하면 exec665 자 이므로 골프를 쳤을 것 입니다. 다음은 위와 동일하며 하드 코딩 된 솔루션 또는 기타 사항이 없습니다.

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 및 base64로 인코딩 된 경우 418 바이트입니다. 따라서 그것을 해독하고 인쇄하는 것이 더 짧은 프로그램 일 것입니다. 그러나 그것은 전혀 재미없습니다 .

설명 :

다음은 매번 움직 인 후 보드를 인쇄 하는 볼링되지 않은 버전의 페이스트 빈입니다 .

매우 단순한 무차별 인공 지능입니다. 각 보드 위치에 EV를 할당합니다.

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

4 번의 심도 우선 검색을 수행하고 4 번의 이동 중 가장 높은 EV로 이어지는 경로를 선택합니다. ev 기능을 사용하면 보드를 정리하고 가장 가치가 높은 부분을 구석에 유지하여 매우 최적의 결과를 얻을 수 있습니다. 거기에 도착하기에 충분합니다!

다른 보드 지점에 더 높은 값을 배치하도록 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를 기록했습니다. 정사각형에 상수를 곱하는 대신 EV 함수는 각 정사각형을 다음과 같이 제곱하여 더합니다. x사각형이 관련되지 않았 음을 의미합니다.

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

여전히 모든 값을 한 번 합산하고 빈 사각형마다 256을 더합니다. Lookahead는 최대 32k까지 4 였고 최대 5 명까지 올라갔지 만 실제로는 많이하지 않는 것 같습니다. 엔드 보드 :

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

24,625 이동 시퀀스의 Pastebin .


1
이 솔루션은 훌륭합니다 (나는 당신의 무차별 대입 DFS를 좋아합니다). +1!
ProgrammerDan

좋은 것! 깊이가있는 휴리스틱을 먼저 사용하면 최적의 솔루션 (가장 짧은 이동 순서)에 도달하지 못할 수 있습니다. 아마 당신은 A * search :-)를 통합 할 수 있습니다
Mau

tar -xzvf a.tar; python a
TheDoctor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.