Có phải là một bảng 2048 tốt?


26

Đây là câu hỏi đầu tiên của tôi ở đây, vì vậy bất kỳ đề xuất trong các ý kiến ​​sẽ được đánh giá cao! Cảm ơn ;)

Giới thiệu

Một chiến lược rất phổ biến cho trò chơi năm 2048không bao giờ bị trượt xuống . Vị trí này tất cả các số lớn ở trên cùng và những số thấp hơn ở phía dưới. Vì vậy, nếu bạn áp dụng chiến lược này một cách chính xác, bảng của bạn sẽ luôn khớp với mẫu sau:

Mẫu để kiểm tra / Nhiệm vụ của bạn

Nội dung gửi của bạn phải là một chương trình đầy đủ hoặc một hàm trả về giá trị trung thực nếu bảng có thể được mô tả như thế này: Đi xuống từng cột của bảng, số đầu tiên phải là số cao nhất của cột, số thứ hai sẽ ít hơn hơn hoặc bằng số đầu tiên, v.v ... Một bảng 2048 tốt được định nghĩa là một bảng trong đó các số cao nhất đều nằm trên cùng. Đây là môn đánh gôn , vì vậy Mã ngắn nhất cho mỗi ngôn ngữ (tính bằng byte) sẽ thắng.

Tôi / O

Đầu vào có thể được thực hiện theo bất kỳ cách thích hợp nào, ví dụ một mảng gồm 4 mảng, mỗi mảng chứa 4 số hoặc một mảng gồm 16 số. Tổng cộng, nó sẽ luôn là 16 số, đại diện cho bảng mạch 4 Đầu ra phải là giá trị trung thực của đầu vào là "bảng 2048 tốt" và ngược lại là giá trị giả.

Ví dụ

Sự thật:

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


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

Giả mạo:

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


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

chú thích

Nhìn vào trường hợp thử nghiệm giả thứ 2: Khi có một giá trị trống (hoặc 0) ở đâu đó và ngay cả khi nó được theo sau bởi một giá trị cao hơn số khác không cuối cùng, thì giá trị này sẽ bị sai, bởi vì giá trị tiếp theo sau số 0 sẽ cao hơn chính 0, làm cho nó không hợp lệ.

Chúc may mắn!


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Martin Ender

Câu trả lời:


16

Haskell , 21 byte

all$scanr1 max>>=(==)

Hãy thử trực tuyến!

Lấy danh sách các cột, với khoảng trắng là 0.


Cung cấp đầu ra sai cho [[16,8,4,0],[16,0,4,4],[16,4,4,4],[16,4,4,4]].
Jonathan Allan

@Jonathan ALLan Nó trả về false như bình thường, cột thứ 2 của bạn là [16,0,4,4] không đơn điệu. Hay tôi đang thiếu một cái gì đó?
Tôi muốn làm trò chơi vào

0 là trình giữ chỗ của bạn cho một ô trống, không phải là giá trị 0.
Jonathan Allan

2
@Iwanttomakegames bình luận đó là dành cho bạn (thay thế "của bạn" bằng "the").
Jonathan Allan

@Jonathan ALLan Tôi xin lỗi vì tất cả sự nhầm lẫn, nhưng thực sự 0, trong khi đại diện cho một ô trống, được tính là giá trị 0. Các ô trống nên được coi như giá trị '0'.
dv02


9

APL (Dyalog) , 7 4 byte

Lấy ma trận 4 nhân 4, sử dụng 0 cho khoảng trắng, làm đối số.

⊢≡⌊⍀

Hãy thử trực tuyến!

⌊⍀ là mức tối thiểu tích lũy dọc

 giống hệt

 lập luận chưa sửa đổi?


Golf tuyệt vời! (Tôi mong đợi điều đó từ một người làm việc cho Dyalog và đã lập trình APL trong một thời gian dài). Và, vâng, MY có rất nhiều biểu tượng APL, mặc dù chúng không phải là biểu tượng APL. Alpha, Iota, Omega đều là người Hy Lạp, không phải APL về mặt kỹ thuật. Họ nghĩ đến đầu tiên khi nghĩ về các lệnh một ký tự. Do đó, tăng và giảm của MY là Jelly, vì điều đó xuất hiện trong đầu. (Chỉ để thông báo cho bạn, tôi bị đình chỉ trò chuyện, do đó phản hồi ở đây.)
Zacharý

7

Thạch , 4 byte

Ṣ€U⁼

Hãy thử trực tuyến!

Đầu vào như một mảng của các cột. Hoạt động với lưới kích thước tùy ý.


Đại diện của một ô trống là gì? (ví dụ: col thứ 3 của trường hợp thử nghiệm falsey thứ 2) - "tổng cộng nó sẽ luôn là 16 số". Nó sẽ hoạt động với số không nếu bạn lọc chúng ra trước.
Jonathan Allan


Tuy nhiên, điều đó bây giờ sẽ thất bại trong trường hợp thử nghiệm đề nghị của tôi trở lại 0chứ không phải 1.
Jonathan Allan

@Jonathan ALLan Làm thế nào để bạn lọc trong Jelly ._. Tôi hy vọng sẽ hoạt động nhưng ḟ0không hoạt động
HyperNeutrino

1
@DentyDev Không sao, chúng tôi ở đây để tận hưởng những thách thức và giúp người dùng mới làm quen với nơi này :) Tôi hy vọng bạn sẽ thích cộng đồng
HyperNeutrino

6

R (+ pryr), 23 byte

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

Mà đánh giá chức năng

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

Mà lấy một ma trận làm đầu vào:

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

Khi được cung cấp một ma trận, diffsẽ tự động tính toán sự khác biệt trong các hàng (thật đáng ngạc nhiên. Tôi không biết tính năng này cho đến khi tôi thử nó cho thử thách này).

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

Không có giá trị nào trong số này có thể là 1 hoặc cao hơn trong một bảng tốt, vì vậy chúng tôi kiểm tra <1và xem liệu allcác giá trị của ma trận có tuân thủ hay không.

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

[1] TRUE

5

JavaScript, 37 byte

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

Gọi nó như thế này:

|-------------------|
| 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]])

Đã thử nghiệm trên Firefox, Chrome, JavaScript Shell và, Node.js.


Tại sao bạn biến kết quả thành một chuỗi? ( ''+)
Zacharý

@ Zacharý sortlà phương pháp có thể thay đổi, sẽ làm thay đổi mảng. đầu tiên chuyển đổi thành chuỗi sẽ lưu một bản sao của mảng. chuyển đổi thành chuỗi cũng làm cho hoạt động bằng nhau hoạt động theo giá trị (chuỗi) thay vì tham chiếu.
tsh


4

C # (.NET Core) , 71 byte

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

Hãy thử trực tuyến!

Cách BORING. Mong đợi đầu vào được làm phẳng thành một mảng tuyến tính.

Mặt khác, cách bị cấm rõ ràng:

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

Hãy thử trực tuyến!

Ném một IndexOutOfBoundException để chỉ ra đúng, kết thúc bình thường để chỉ ra sai. Tôi đã thử một phiên bản bao gồm chuyển đổi từ ngoại lệ / không ngoại lệ thành đúng / sai, nhưng nó đã kết thúc miễn là phiên bản thông thường.


4

JavaScript, 34 , 32 byte

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

Gọi bằng cách chuyển vào một mảng duy nhất chứa cột đầu tiên, tiếp theo là thứ 2, 3 và 4.

So sánh từng số với số trước trừ số đầu tiên của mỗi cột và trả về giá trị true nếu tất cả đều đúng.

Kiểm tra

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])

Chỉnh sửa: đã lưu 2 byte nhờ tsh


sau một số biến đổi boolean:v=>!v.some((x,i)=>i%4&&x>v[i-1])
tsh

3

Haskell , 28 byte

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

Cũng có

all$(==)=<<sort

với 15 byte nhưng nó chỉ yêu cầu import Data.Listkhi làm việc với Prelude. Ngoài ra,

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

với 25 byte hoạt động trong GHCI.


3

Gaia , 3 6 byte

+3 byte vì rõ ràng tôi không biết ngôn ngữ của mình hoạt động như thế nào

ọ¦_ẏ⁇!

Đây là một hàm chấp nhận danh sách các cột và để lại kết quả trên ngăn xếp.

Một vài giải pháp 6 byte khác tồn tại bao gồm 0+¦o¦ẏọ¦_ẏ¦ỵ.

Hãy thử trực tuyến!

Giải trình

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

Không thể downvote, nhưng sử dụng một toán tử được thêm vào ngôn ngữ sau khi thử thách được đăng không có vẻ công bằng với tôi. Ngoài ra, nó dường như bị cấm theo mặc định theo điều này .
Cinaski

@Cinaski Chúng tôi đã loại bỏ quy tắc đó, như đã thấy ở đây . Dù bằng cách nào, các giải pháp thay thế của tôi chỉ sử dụng các toán tử chắc chắn tồn tại trước thách thức.
Mèo kinh doanh

Tôi sẽ chỉ đổi nó thành một trong những cái khác tôi đoán
Business Cat

Đừng bận tâm, tôi đã không nhận thức được quy tắc mới đó.
Cinaski

3

TI-BASIC, 25 byte

Đưa đầu vào dưới dạng ma trận 4 x 4 trong Ans.

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

Giải trình

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

JavaScript (ES6), 42 byte

Có một mảng các cột; trả về một số (trung thực) hoặc false.

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

JavaScript (ES6), 54 47 byte

Nỗ lực đầu tiên. Có một mảng các cột; trả lại truehoặc false.

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

Giá trị nào bạn đang mong đợi cho các ô trống?
Arnauld

2

MATL , 4 byte

SGX=

Hãy thử trực tuyến!

Đầu vào như một mảng các hàng, lộn ngược.

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

Không hoạt động đối với các trường hợp nên trả về giá trị trung thực có các số 0 giữa các phần tử cột như thế này chẳng hạn.
Jonathan Allan

Bạn nói đúng, tôi đang làm việc trên một giải pháp. BTW Tôi không phải là người duy nhất gặp vấn đề với các ô trống;)
Cinaski

Vâng tôi có thể hiểu. Tôi đề nghị một trường hợp thử nghiệm cho nó quá. Ping khi được sửa và bạn sẽ nhận được upvote từ tôi :)
Jonathan Allan

@Jonathan ALLan chờ đợi, ai nói rằng nó sẽ trả về sự thật khi có các số 0 giữa các phần tử cột? Nhìn vào trường hợp thử nghiệm giả thứ hai của tôi, một ô trống / 0 theo sau là giá trị cao hơn khi đi xuống là không hợp lệ.
dv02

@DentyDev FYI với từ ngữ ban đầu được đưa ra, và cách giải thích hợp lý của nó, trường hợp chim ưng thứ hai của bạn vẫn sẽ là chim ưng; đó chỉ là trường hợp thử nghiệm được đề xuất của tôi sẽ là sự thật.
Jonathan Allan


2

APL Dyalog, 21 19 15 byte

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

Hãy thử trực tuyến! (sửa đổi để nó sẽ chạy trong tryapl)

Đưa đầu vào dưới dạng mảng 2D.

Làm sao?

  • đầu vào
  • hoán vị
  • Mảng 2D => vectơ 1D của vectơ 1D
  • { ... }¨áp dụng điều này cho mỗi thành viên (đối số ):
    • ⍵[⍒⍵] sắp xếp giảm dần
    • ⍵≡ bình đẳng với
  • ∧/cho dù mọi yếu tố là 1.


2

Japt , 7 byte

Đã thử một vài phương thức khác nhau cho phương pháp này, nhưng cuối cùng, cách ngắn nhất tôi có thể nghĩ ra cuối cùng là một giải pháp JS của tsh.

Lấy một mảng các cột làm đầu vào. Các ô trống có thể được 0bỏ qua hoặc không có số nào khác trong cột.

P+U¥®n§

Kiểm tra nó


Giải trình

Đầu vào ngầm định của mảng U.

P+U

Chuẩn Ubị với một chuỗi rỗng, chuyển đổi mảng thành một chuỗi.

¥

Kiểm tra sự bằng nhau, cũng biến phía bên phải thành một chuỗi.

®

Bản đồ trên U.

Sắp xếp ( n) theo <=.

Ngẫu nhiên đầu ra kết quả boolean.


Sắp xếp tốt đẹp để bỏ qua thứ hai U. nnCuối cùng bạn cũng có thể làm được;)
ETHproductions

Tôi đã rất ngạc nhiên khi thấy rằng bỏ qua cái thứ hai Uhoạt động trong trường hợp này, @ETHproductions; Tôi nghĩ rằng nó sẽ chỉ hoạt động nếu biến là thứ duy nhất ở bên trái của ==. Tôi sẽ phải nhớ nó để sử dụng trong tương lai.
Xù xì


1

Java 8, 69 byte

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

Chà, khi viết bài này thì đánh bại giải pháp Swift, vậy đó! Hoàn toàn đơn giản. Đầu vào là một mảng các mảng số nguyên, các mảng bên trong là các cột của bảng (hình vuông trên trước). Đúc để Function<int[][], Boolean>.


1

MY , 66 62 20 byte (không biên dịch)

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

Hãy thử trực tuyến!

Lý do điều này không cạnh tranh là gần đây tôi đã thực hiện 8E (≡), tương đương với APL .

Làm sao?

  • ω⍉ Đối số dòng lệnh đầu tiên được hoán vị
  • ω⍉ Đối số dòng lệnh đầu tiên được hoán vị
  • A6ǵ'đẩy chr(0x6A)( trong bảng mã, sắp xếp giảm dần)
  • ƒ như một hàm, chứ không phải là một chuỗi
  • đẩy một hàm ánh xạ một hàm xuất hiện qua mỗi đối số
  • ( ứng dụng
  • E8ǵ'ƒ⇹( điều tương tự, ngoại trừ với chr(0x8E), đó là lệnh khớp ( ).
  • Π sản phẩm
  • đầu ra không có dòng mới

Có, rất nhiều biểu tượng của MY giống hệt hoặc tương tự với APL. Lời giải thích là họ nghĩ đến khi tôi muốn có lệnh 1 ký tự. (Tôi không biết tại sao tôi không sử dụng T để chuyển đổi)


0

Toán học, 27 byte

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

Giải trình:

  • Threadlà một hoạt động giống như chuyển vị chung kỳ lạ xảy ra để chuyển vị khi được đưa ra một ma trận .
  • t=Thread;cho phép tôi sử dụng thai lần thay vì Threadhai lần để lưu byte.
  • Sort sắp xếp một danh sách (theo thứ tự tăng dần).
  • Sort\@ánh xạ Sortchức năng đến từng yếu tố của một danh sách riêng lẻ; khi áp dụng cho một ma trận, nó sắp xếp các hàng.
  • t@#áp dụng hàm chuyển vị cho đầu vào #của hàm chính.
  • - lấy tiêu cực của tất cả các mục để sắp xếp các hàng của ma trận chuyển vị (các cột của bản gốc) sắp xếp chúng theo cách mong muốn.
  • Bên ngoài -t[...]hoàn tác âm và chuyển vị, vì vậy tất cả những gì chúng ta thực sự làm là sắp xếp các cột lớn nhất đến nhỏ nhất.
  • ==# kiểm tra xem liệu ma trận sắp xếp cột mới này có bằng với đầu vào ban đầu không.
  • &kết thúc chức năng ẩn danh với đầu vào #chúng tôi xác định.

Bạn có thể dùng thử trực tuyến trong hộp cát Wolfram Cloud bằng cách dán mã như sau và nhấp vào Gear -> "Đánh giá ô" hoặc nhấn Shift + Enter hoặc numpad Enter:

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

Hoặc cho tất cả các trường hợp thử nghiệm:

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}}}]&
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.