좋은 2048 보드입니까?


26

이것은 나의 첫 번째 질문이므로 의견에 대한 제안은 감사하겠습니다! 감사 ;)

소개

2048 게임 의 가장 일반적인 전략 중 하나 는 결코 스 와이프하지 않는 것입니다 . 이렇게하면 모든 큰 숫자가 맨 위에 배치되고 아래쪽에있는 큰 숫자가 배치됩니다. 따라서이 전략을 올바르게 적용하면 보드는 항상 다음 패턴과 일치합니다.

확인할 패턴 / 작업

제출물은 전체 프로그램 또는 보드가 다음과 같이 설명 될 수있는 경우 진실한 값을 반환하는 함수 여야합니다. 보드의 각 열을 내려 가면 첫 번째 숫자가 열의 가장 높고 두 번째 숫자는 더 작아야합니다. 제 개수와 같거나, 등 좋은 2048 보드 최고 숫자 위에 모두되는 기판으로 정의된다. 이것은 code-golf 이므로 언어 ​​당 가장 짧은 코드 (바이트)가 이깁니다.

I / O

입력은 적절한 방법으로 수행 할 수 있습니다 (예 : 각각 4 개의 숫자를 포함하는 4 개의 배열 배열 또는 16 개의 숫자 배열). 4x4 보드를 나타내는 전체 숫자는 항상 16 개의 숫자입니다 . 출력은 입력의 실제 값이 "좋은 2048 보드"여야하고 그렇지 않은 경우 잘못된 값이어야합니다.

진실한 :

|-------------------|
| 16 |    | 64 |  8 |
|-------------------|
|  8 |    | 32 |  8 |
|-------------------|
|  4 |    | 32 |  2 |
|-------------------|
|  2 |    |    |    |
|-------------------|


|-------------------|
| 16 | 128| 64 | 32 |
|-------------------|
|  8 | 128| 32 |  8 |
|-------------------|
|  4 | 16 |  8 |  2 |
|-------------------|
|  4 |    |    |    |
|-------------------|

거짓 :

|-------------------|
| 16 |    | 64 |  8 |
|-------------------|
|  8 |    | 32 | 16 |
|-------------------|
| 32 |    | 128|  2 |
|-------------------|
|  2 |    |    |    |
|-------------------|


|-------------------|
| 16 | 128| 64 | 32 |
|-------------------|
|  8 |  32|    |  8 |
|-------------------|
|  4 | 16 |  8 |  2 |
|-------------------|
|  4 |    |    |    |
|-------------------|

노트

두 번째 거짓 테스트 사례를 살펴보십시오. 어딘가에 빈 값 (또는 0)이 있고 그 뒤에 0이 아닌 마지막 숫자보다 높은 값이 오는 경우에도 다음 값이 잘못되므로 거짓이어야합니다. 0은 0보다 높으므로 유효하지 않습니다.

행운을 빕니다!


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
마틴 엔더

답변:


16

하스켈 , 21 바이트

all$scanr1 max>>=(==)

온라인으로 사용해보십시오!

공백이 0 인 열 목록을 가져옵니다.


에 대한 잘못된 출력을 제공합니다 [[16,8,4,0],[16,0,4,4],[16,4,4,4],[16,4,4,4]].
Jonathan Allan

@JonathanAllan 두 번째 열은 [16,0,4,4]이며 단조롭지 않습니다. 아니면 뭔가 빠졌습니까?
나는

0은 값이 아닌 빈 셀의 자리 표시 자입니다.
Jonathan Allan

2
@Iwanttomakegames 댓글은 당신을위한 것입니다 ( "your"를 "the"로 바꾸십시오).
Jonathan Allan

@JonathanAllan 모든 혼란에 대해 유감스럽게 생각하지만 빈 셀을 나타내는 동안 0은 값 0으로 계산됩니다. 빈 셀은 값 '0'과 같이 처리해야합니다.
dv02


9

APL (Dyalog) , 7 4 바이트

공백으로 0을 사용하여 4x4 행렬을 인수로 사용합니다.

⊢≡⌊⍀

온라인으로 사용해보십시오!

⌊⍀ 수직 누적 최소값입니다

 와 동일

 수정되지 않은 논쟁?


놀라운 골프! (Dyalog에서 일하고 오랫동안 APL을 프로그래밍 한 사람으로부터 기대했습니다). 그리고 그렇습니다. MY에는 APL 기호가 아니지만 많은 APL 기호가 있습니다. 알파, 이오타, 오메가는 기술적으로 APL이 아니라 그리스어입니다. 그들은 한 글자의 명령을 생각할 때 가장 먼저 떠 올랐습니다. 따라서 나의 증가와 감소는 젤리의 것입니다. (당신에게 알리기 위해 대화가 중단되었으므로 여기에서 답변을드립니다.)
Zacharý

7

젤리 , 4 바이트

Ṣ€U⁼

온라인으로 사용해보십시오!

열 배열로 입력하십시오. 임의 크기의 격자와 함께 작동합니다.


빈 셀의 표현은 무엇입니까? (예 : 두 번째 거짓 테스트 사례의 3 번째 열)- "총 16 자리입니다." 먼저 필터링하면 0으로 작동합니다.
Jonathan Allan


그러나 이제 제안 된 테스트 사례가0 아닌 반환 되지 않습니다 1.
Jonathan Allan

@JonathanAllan Jelly에서 어떻게 필터링합니까? 나는 이것이 작동 할 것으로 기대 하지만 작동 ḟ0하지 않습니다
HyperNeutrino

1
@DirtyDev 그것은 우리가이 장소 : 난 당신이 사회 즐기고있는 희망에 익숙해 도전과 도움 새로운 사용자를 즐길 수있는 여기, 괜찮아
HyperNeutrino

6

R (+ pryr), 23 바이트

pryr::f(all(diff(x))<1)

어떤 기능으로 평가

function (x) 
all(diff(x)) < 1

행렬을 입력으로 사용합니다.

     [,1] [,2] [,3] [,4]
[1,]   16    0   64    8
[2,]    8    0   32    8
[3,]    4    0   32    2
[4,]    2    0    0    0

매트릭스가 주어지면 diff행 내 차이를 자동으로 계산합니다 (놀랍게도이 도전에 대해 시도 할 때 까지이 기능을 알지 못했습니다).

     [,1] [,2] [,3] [,4]
[1,]   -8    0  -32    0
[2,]   -4    0    0   -6
[3,]   -2    0  -32   -2

좋은 보드에서는 이러한 값 중 어느 것도 1 이상이 될 수 없으므로 행렬 값이 적합한 지 테스트 <1하고 확인합니다 all.

     [,1] [,2] [,3] [,4]
[1,] TRUE TRUE TRUE TRUE
[2,] TRUE TRUE TRUE TRUE
[3,] TRUE TRUE TRUE TRUE

[1] TRUE

5

자바 스크립트, 37 바이트

x=>''+x==x.map(v=>v.sort((x,y)=>y-x))

다음과 같이 호출하십시오.

|-------------------|
| 16 |    | 64 |  8 |
|-------------------|
|  8 |    | 32 |  8 |
|-------------------|
|  4 |    | 32 |  2 |
|-------------------|
|  2 |    |    |    |
|-------------------|

f([[8,8,2,0],[64,32,32,0],[0,0,0,0],[16,8,4,2]])

Firefox, Chrome, JavaScript Shell 및 Node.js에서 테스트되었습니다.


결과를 문자열로 바꾸는 이유는 무엇입니까? ( ''+)
Zacharý

@ Zacharý sort는 변경 가능한 메소드이므로 배열을 변경합니다. 먼저 문자열로 변환하면 배열의 사본이 저장됩니다. 문자열로 변환하면 참조 대신 (문자열) 값으로 동일한 작업이 수행됩니다.
tsh


4

C # (. NET 코어) , 71 바이트

i=>{for(int n=3;++n<i.Length;)if(i[n]>i[n-4])return false;return true;}

온라인으로 사용해보십시오!

보링 방식. 입력이 선형 배열로 평탄화 될 것으로 예상합니다.

또는 명시 적으로 금지 된 방법 :

i=>{for(int n=3;i[++n]<=i[n-4];);}

온라인으로 사용해보십시오!

true를 나타 내기 위해 IndexOutOfBoundsException을 던지고, 보통 false를 나타 내기 위해 종료합니다. 예외 / 예외에서 참 / 거짓으로의 변환을 포함하는 버전을 시도했지만 일반 버전만큼 오래되었습니다.


4

자바 스크립트, 34 , 32 바이트

v=>!v.some((x,i)=>i%4&&x>v[i-1])

첫 번째 열과 두 번째, 세 번째 및 네 번째 열이 포함 된 단일 배열을 전달하여 호출합니다.

각 열의 첫 번째 숫자를 제외하고 각 숫자를 이전 숫자와 비교하고 모두 참이면 true를 반환합니다.

테스트

f=v=>!v.some((x,i)=>i%4&&x>v[i-1])

f([16,8,4,2,0,0,0,0,64,32,32,0,8,8,2,0])
f([16,8,4,4,128,128,16,0,64,32,8,0,32,8,2,0])
f([16,8,32,2,0,0,0,0,64,32,128,0,8,16,2,0])
f([16,8,4,4,128,32,16,0,64,0,8,0,32,8,2,0])

편집 : tsh 덕분에 2 바이트 저장


부울 변환 후 :v=>!v.some((x,i)=>i%4&&x>v[i-1])
tsh

3

하스켈 , 28 바이트

all$and.(zipWith(>=)=<<tail)

또한있다

all$(==)=<<sort

15 바이트이지만 import Data.List Prelude로 작업 할 때만 합니다. 또는

all$(==)=<<Data.List.sort

25 바이트는 GHCI에서 작동합니다.


3

가이아 , 3 6 바이트

언어가 어떻게 작동하는지 몰랐기 때문에 +3 바이트

ọ¦_ẏ⁇!

열 목록을 허용하고 결과를 스택에 남겨 두는 함수입니다.

몇 가지 다른 6 개 바이트 솔루션을 포함하여 존재 0+¦o¦ẏ하고ọ¦_ẏ¦ỵ .

온라인으로 사용해보십시오!

설명

ọ¦      Deltas of each column
  _     Flatten
   ẏ⁇   Keep only positive numbers
     !  Negate (is it empty?)

공감 할 수는 없지만 도전 과제가 게시 된 후 언어에 추가 된 연산자를 사용하는 것은 공평하지 않은 것 같습니다 . 또한 에 따라 기본적으로 금지되어있는 것 같습니다 .
Cinaski

본 @Cinaski 우리는 가지, 그 규칙에서 멀리 이동 한 여기 . 어느 쪽이든, 대안 솔루션은 도전 전에 존재했던 연산자 만 사용합니다.
비즈니스 고양이

난 그냥 다른 것 중 하나로 변경하겠습니다
Business Cat

신경 쓰지 마라, 나는 그 새로운 규칙을 몰랐다.
Cinaski

3

TI-BASIC, 25 바이트

Ans에서 입력을 4x4 행렬로 사용합니다.

For(R,1,3
*row+(-1,Ans,R+1,R
End
Ans=abs(Ans

설명

For(R,1,3             Loop from row 1 to 3.

*row+(-1,Ans,R+1,R    Multiply row R+1 by -1 and add it to row R in-place.
                      Effectively, this subtracts row R+1 from row R.

End                   Now the first 3 rows contain the row differences,
                      and the 4th row is non-negative assuming valid input.

Ans=abs(Ans           Check whether every element in the matrix is equal to its
                      absolute value, or in other words, contains no negative values.

2

하스켈 , 41 바이트

f[x]=1>0
f(a:b:c)|a<b=1<0|1>0=f$b:c
all f

온라인으로 사용해보십시오!

포인트가없는 함수를 정의합니다. all f여기서 f리스트가 정렬되는지 여부를 결정합니다.


Darn, 이것은 1 바이트만큼 Python을 능가합니다 .P
HyperNeutrino

@HyperNeutrino 글쎄 xnor의 비트는 21로 파이썬을 이겼습니다. : P
Wheat Wizard

다음 f과 같이 정의 할 수도 있습니다.f(a:b:c)=a>=b&&f(b:c)
Cristian Lupascu

2

자바 스크립트 (ES6), 42 바이트

열 배열을 취합니다. (truthy) 숫자 또는를 반환합니다 false.

a=>a.every(c=>c.reduce((r,n)=>r&&n<=r&&n))

자바 스크립트 (ES6), 54 47 바이트

첫번째 시도. 열 배열을 취합니다. 반환 true또는 false.

a=>a.every(c=>c.slice(1).every((n,i)=>n<=c[i]))

빈 셀에 대해 어떤 값을 기대하십니까?
Arnauld

2

MATL , 4 바이트

SGX=

온라인으로 사용해보십시오!

거꾸로 행의 배열로 입력하십시오.

S       % sort columns
GX=     % compare with input
        % true if arrays are numerically equal
        % (implicit) convert to string and display

같은 열 요소들 사이의 제로가 truthy를 반환해야합니다 경우에 작동하지 않습니다 예를 들어.
Jonathan Allan

당신이 맞아요, 나는 해결책을 찾고 있습니다. BTW 빈 셀에 문제가있는 유일한 사람은 아닙니다.)
Cinaski

응, 알 겠어 나는 그것을 위해 테스트 케이스를 제안했다. Ping 고정되면 당신은 나에게서
Jonathan Allan

@JonathanAllan은 열 요소 사이에 0이있을 때 진실을 반환해야한다고 누가 말했습니까? 내 두 번째 잘못된 테스트 사례를 살펴보십시오. 빈 셀 / 0 다음에 내려갈 때 더 높은 값이 유효하지 않습니다.
dv02

@DirtyDev FYI 원래 주어진 단어와 그 의미있는 해석으로, 두 번째 거짓 사례는 여전히 거짓 일 것입니다. 그것은 내가 제안한 테스트 사례가 진실한 것입니다.
Jonathan Allan


2

Dyalog APL, 21 19 15 바이트

∧/{⍵≡⍵[⍒⍵]}¨↓⍉⎕

온라인으로 사용해보십시오!(tryapl에서 실행되도록 수정 됨)

입력을 2D 배열로 취합니다.

방법?

  • 입력
  • 바꾸어 놓다
  • 2D 배열 => 1D 벡터의 1D 벡터
  • { ... }¨이것을 각 멤버 (argument )에 적용하십시오 .
    • ⍵[⍒⍵] 내림차순으로 정렬
    • ⍵≡ 평등
  • ∧/모든 요소가 1입니다.


2

Japt , 7 바이트

이것에 대한 몇 가지 다른 방법을 시도했지만 결국 가장 짧은 방법은 tsh의 JS 솔루션 포트가되었습니다.

열 배열을 입력으로 사용합니다. 0열에 다른 숫자가 없으면 빈 셀을 생략하거나 생략 할 수 있습니다 .

P+U¥®n§

그것을 테스트


설명

배열의 암시 적 입력 U.

P+U

U빈 문자열을 앞에 추가 하여 배열을 문자열로 변환합니다.

¥

오른쪽도 문자열로 캐스트하는 평등을 확인하십시오.

®

위에지도를 표시 U합니다.

정렬 ( n)에 의해 <=.

부울 결과를 내재적으로 출력합니다.


두 번째 건너 뛰기 좋은 준비 U. nn마지막에도 할 수 있습니다;)
ETHproductions

U이 경우 두 번째 작업 을 생략하면 @ETHproductions라는 사실에 놀랐습니다. 변수가 왼쪽에있는 유일한 경우에만 작동한다고 생각했습니다 .== . 나중에 사용할 수 있도록 기억해야합니다.
Shaggy


1

자바 8, 69 바이트

b->{for(int[]c:b)for(int i=0,f=1;i<3;)if(c[i]<c[++i])f=0;return f>0;}

글을 쓰는 시점에서 이것은 스위프트 솔루션을 능가합니다. 완전히 간단합니다. 입력은 정수 배열의 배열이며, 내부 배열은 보드의 열입니다 (먼저 위 사각형). 캐스트Function<int[][], Boolean> .


1

, 66 62 20 바이트 (비경쟁)

ω⍉ω⍉A6ǵ'ƒ⇹(E8ǵ'ƒ⇹(Π←

온라인으로 사용해보십시오!

이것이 경쟁이 아닌 이유는 내가 최근에 구현했기 때문입니다. 8E (≡) APL과 같습니다 .

방법?

  • ω⍉ 첫 번째 명령 행 인수
  • ω⍉ 첫 번째 명령 행 인수
  • A6ǵ'푸시 chr(0x6A)( 내림차순으로 정렬 코드 페이지에서)
  • ƒ 문자열이 아닌 함수로서
  • 각 인수에 팝된 함수를 매핑하는 함수를 푸시
  • ( 대다
  • E8ǵ'ƒ⇹(chr(0x8E)일치 명령 인을 제외하고는 동일한 것 ( ) 합니다.
  • Π 생성물
  • 줄 바꿈없이 출력

예, 많은 MY의 기호는 APL과 정확히 동일하거나 유사합니다. 설명은 내가 1 자 명령을 원할 때 마음에 들었다는 것입니다. (왜 T 를 조옮김에 사용하지 않았는지 모르겠습니다 )


0

수학, 27 바이트

t=Thread;-t[Sort/@-t@#]==#&

설명:

  • Thread행렬이 주어 졌을 때 조옮김을 취하는 이상한 일반적인 전치 행 연산입니다 .
  • t=Thread;바이트를 절약하기 위해 두 t번 대신 두 번 사용할 수 있습니다 Thread.
  • Sort 목록을 오름차순으로 정렬합니다.
  • Sort\@ 지도 Sort함수를 목록의 각 요소에 개별적으로 . 행렬에 적용되면 행을 정렬합니다.
  • t@# 조옮김 기능을 입력에 적용 # 주 기능 에 .
  • - 변환 된 행렬의 행 (원본의 열)을 정렬하면 원하는 방식으로 정렬 할 수 있도록 모든 항목의 음수를 사용합니다.
  • 바깥 쪽 -t[...]은 음수와 전치를 취소하므로 실제로 행을 가장 큰 것부터 가장 작은 것까지 정렬하면됩니다.
  • ==# 이 새로운 열 정렬 매트릭스가 원래 입력과 같은지 테스트합니다.
  • &#우리가 정의한 입력으로 익명 함수를 종료합니다 .

Wolfram Cloud 샌드 박스 에서 다음과 같은 코드를 붙여 넣고 Gear- > "셀 평가"를 클릭하거나 Shift + Enter 또는 숫자 키패드 Enter를 눌러 온라인으로 시도 할 수 있습니다 .

t=Thread;-t[Sort/@-t@#]==#&@{{16,128,64,32},{8,32,0,8},{4,16,8,2},{4,0,0,0}}

또는 모든 테스트 사례의 경우 :

t=Thread;-t[Sort/@-t@#]==#&//Map[#,{{{16,0,64,8},{8,0,32,8},{4,0,32,2},{2,0,0,0}},{{16,128,64,32},{8,128,32,8},{4,16,8,2},{4,0,0,0}},{{16,0,64,8},{8,0,32,16},{32,0,128,2},{2,0,0,0}},{{16,128,64,32},{8,32,0,8},{4,16,8,2},{4,0,0,0}}}]&
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.