Czy to dobra tablica 2048?

26

To jest moje pierwsze pytanie tutaj, więc wszelkie sugestie w komentarzach będą mile widziane! Dzięki ;)

Wprowadzenie

Jednym z bardzo wspólna strategia dla 2048 gry jest nigdy przesuwając w dół . To umieszcza wszystkie duże liczby na górze, a dolne na dole. Tak więc, jeśli zastosujesz tę strategię poprawnie, twoja plansza zawsze będzie pasować do następującego wzoru:

Wzór do sprawdzenia / Twoje zadanie

Twoje zgłoszenie powinno być albo pełnym programem, albo funkcją, która zwraca prawdziwą wartość, jeśli tablica może być opisana w następujący sposób: schodząc w dół każdej kolumny tablicy, pierwsza liczba powinna być najwyższa z kolumny, druga liczba powinna być mniejsza równa lub równa pierwszej liczbie itp. Dobra plansza 2048 jest definiowana jako plansza, na której najwyższe liczby znajdują się na górze. To jest golf golfowy , więc wygrywa najkrótszy kod na język (w bajtach).

I / O

Dane wejściowe można pobierać w dowolny odpowiedni sposób, na przykład tablicę 4 tablic, z których każda zawiera 4 liczby lub tablicę 16 liczb. W sumie zawsze będzie to 16 liczb, reprezentujących tablicę 4x4 . Wyjście powinno być prawdziwą wartością wejściową jest „dobra tablica 2048”, a w przeciwnym razie wartość fałsz.

Przykłady

Prawda:

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


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

Falsy:

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


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

Uwaga

Spójrz na drugi przypadek testu fałszowania: gdy gdzieś jest pusta wartość (lub zero), a nawet jeśli po niej następuje wartość wyższa niż ostatnia niezerowa liczba, powinno to być fałszowanie, ponieważ następna wartość po zero byłoby wyższe niż samo zero, co powoduje, że jest ono nieprawidłowe.

Powodzenia!

dv02
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Martin Ender

Odpowiedzi:

16

Haskell , 21 bajtów

all$scanr1 max>>=(==)

Wypróbuj online!

Pobiera listę kolumn, z pustymi spacjami jako 0.

xnor
źródło
Daje zły wynik dla [[16,8,4,0],[16,0,4,4],[16,4,4,4],[16,4,4,4]].
Jonathan Allan
@JonathanAllan Zwraca fałsz, tak jak powinien, druga kolumna to [16,0,4,4], co nie jest monotoniczne. A może coś mi brakuje?
Chcę robić gry
0 jest twoim symbolem zastępczym dla pustej komórki, a nie wartością 0.
Jonathan Allan
2
@Iwanttomakegames ten komentarz był dla Ciebie (zamień „twoje” na „the”).
Jonathan Allan
@JonathanAllan Przykro mi z powodu całego zamieszania, ale w rzeczywistości 0, reprezentując pustą komórkę, należy liczyć jako wartość 0. Puste komórki należy traktować jak wartość „0”.
dv02
10

05AB1E , 4 bajty

€{íQ

Wypróbuj online!

Tak samo jak moje pozostałe dwie odpowiedzi. Obiecuję, że to mój ostatni, dopóki inni nie odpowiedzą :)

HyperNeutrino
źródło
9

APL (Dyalog) , 7 4 bajtów

Przyjmuje macierz 4 na 4, używając 0 jako spacji jako argumentu.

⊢≡⌊⍀

Wypróbuj online!

⌊⍀ to pionowe skumulowane minimum

 identyczny z

 niezmodyfikowany argument?

Adám
źródło
Niesamowity golf! (Spodziewałem się tego po kimś, kto pracuje dla Dyalog i programuje APL od dłuższego czasu). I tak, MY ma wiele symboli APL, chociaż nie są to symbole APL. Alpha, Iota, Omega są wszystkie greckie, a nie technicznie APL. Najpierw przyszło im do głowy myślenie o poleceniach jednoznakowych. Stąd wzrost i ubytek MEGO należą do Jelly, ponieważ to przyszło mi do głowy jako pierwsze. (Aby Cię powiadomić, jestem zawieszony na czacie, stąd odpowiedź tutaj.)
Zacharý
7

Galaretka , 4 bajty

Ṣ€U⁼

Wypróbuj online!

Dane wejściowe jako tablica kolumn. Współpracuje z siatkami o dowolnej wielkości.

HyperNeutrino
źródło
Jaka jest reprezentacja pustej komórki? (np. 3. kolumna 2. przypadku testowego Falsey) - „w sumie zawsze będzie to 16 liczb”. Działa z zerami, jeśli odfiltrujesz je najpierw.
Jonathan Allan
@JonathanAllan Według specyfikacji, myślę, że to też jest ważne
HyperNeutrino
Mimo, że teraz nie będzie mój zaproponował sprawdzian powrocie 0zamiast 1.
Jonathan Allan
@JonathanAllan Jak filtrujesz w galaretce ._. Spodziewałbym się, że to zadziała, ale ḟ0nie działa
HyperNeutrino
1
@DirtyDev W porządku, jesteśmy tutaj, aby cieszyć się wyzwaniami i pomagać nowym użytkownikom przyzwyczaić się do tego miejsca :) Mam nadzieję, że podoba Ci się społeczność
HyperNeutrino
6

R (+ pryr), 23 bajty

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

Który ocenia się na funkcję

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

Który przyjmuje macierz jako dane wejściowe:

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

Po otrzymaniu matrycy diffautomatycznie oblicza różnice w wierszach (zaskakujące. Nie znałem tej funkcji, dopóki nie wypróbowałem jej w tym wyzwaniu).

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

Żadna z tych wartości nie może wynosić 1 lub więcej na dobrej płycie, więc testujemy <1i sprawdzamy, czy allwartości macierzy są zgodne.

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

[1] TRUE
JAD
źródło
5

JavaScript, 37 bajtów

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

Nazwij to tak:

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

Testowane na Firefox, Chrome, JavaScript Shell i Node.js.

tsh
źródło
Dlaczego zamieniasz wynik w ciąg? ( ''+)
Zacharý
@ Zacharý sortto zmienna metoda, która zmutuje tablicę. pierwsza konwersja na ciąg spowoduje zapisanie kopii tablicy. przekonwertowanie na ciąg powoduje również, że równa operacja działa według wartości (ciąg) zamiast odwołania.
tsh
4

C # (.NET Core) , 71 bajtów

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

Wypróbuj online!

NUDNY sposób. Oczekuje, że dane wejściowe zostaną spłaszczone do tablicy liniowej.

Alternatywnie wyraźnie zabroniony sposób:

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

Wypróbuj online!

Zgłasza wyjątek IndexOutOfBoundsException, aby wskazać wartość true, kończy się normalnie, wskazując wartość false. Próbowałem wersji zawierającej konwersję z wyjątku / brak wyjątku na prawda / fałsz, ale skończyło się tak długo, jak zwykła wersja.

Kamil Drakari
źródło
4

JavaScript, 34 , 32 bajty

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

Wywołaj, przekazując jedną tablicę zawierającą pierwszą kolumnę, a następnie drugą, trzecią i czwartą.

Porównuje każdą liczbę z poprzednim numerem z wyjątkiem pierwszej liczby w każdej kolumnie i zwraca true, jeśli wszystkie są prawdziwe.

Test

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

Edycja: zapisane 2 bajty dzięki tsh

Grax32
źródło
po pewnej transformacji boolowskiej:v=>!v.some((x,i)=>i%4&&x>v[i-1])
tsh
3

Haskell , 28 bajtów

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

Jest także

all$(==)=<<sort

15 bajtów, ale wymaga import Data.Listto tylko pracy z Preludium. Alternatywnie,

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

z 25 bajtami działa w GHCI.

Bergi
źródło
3

Gaia , 3 6 bajtów

+3 bajty, ponieważ najwyraźniej nie wiedziałem, jak działa mój język

ọ¦_ẏ⁇!

Jest to funkcja przyjmująca listę kolumn i pozostawiająca wynik na stosie.

Istnieje kilka innych 6-bajtowych rozwiązań, w tym 0+¦o¦ẏi ọ¦_ẏ¦ỵ.

Wypróbuj online!

Wyjaśnienie

ọ¦      Deltas of each column
  _     Flatten
   ẏ⁇   Keep only positive numbers
     !  Negate (is it empty?)
Business Cat
źródło
Nie można downvote, ale przy użyciu operatora dodanej do języka po prowokacji została wysłana nie wydaje się sprawiedliwe, by me.Also wydaje się być zabronione domyślnie według tego .
Cinaski,
@Cinaski Oddaliliśmy się od tej zasady, jak widać tutaj . Tak czy inaczej, moje alternatywne rozwiązania wykorzystują tylko operatorów, którzy zdecydowanie istnieli przed wyzwaniem.
Business Cat
Po prostu zmienię to na inne, jak sądzę
Business Cat
Nieważne, nie byłem świadomy tej nowej zasady.
Cinaski,
3

TI-BASIC, 25 bajtów

Pobiera dane wejściowe jako macierz 4x4 w Ans.

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

Wyjaśnienie

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.
calc84maniac
źródło
2

Haskell , 41 bajtów

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

Wypróbuj online!

Definiuje funkcję bez punktów all f, w której fokreśla, czy lista jest sortowana.

Kreator pszenicy
źródło
Cholera, to bije Python o 1 bajt; P
HyperNeutrino
@HyperNeutrino Cóż, xnor bije pytona przez 21.: P
Wheat Wizard
Możesz również zdefiniować fjakof(a:b:c)=a>=b&&f(b:c)
Cristian Lupascu
2

JavaScript (ES6), 42 bajty

Pobiera tablicę kolumn; zwraca (prawdę) liczbę lub false.

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

JavaScript (ES6), 54 47 bajtów

Pierwsze podejscie. Pobiera tablicę kolumn; zwraca truelub false.

a=>a.every(c=>c.slice(1).every((n,i)=>n<=c[i]))
darrylyeo
źródło
Jakiej wartości oczekujesz dla pustych komórek?
Arnauld
2

MATL , 4 bajty

SGX=

Wypróbuj online!

Dane wejściowe jako tablica wierszy do góry nogami.

S       % sort columns
GX=     % compare with input
        % true if arrays are numerically equal
        % (implicit) convert to string and display
Cinaski
źródło
Nie działa dla przypadków, które powinny powrócić truthy które zer między elementami kolumn, jak to na przykład.
Jonathan Allan
Masz rację, pracuję nad rozwiązaniem. BTW Nie tylko ja mam problemy z pustymi komórkami;)
Cinaski
Tak, widzę to. Zasugerowałem też dla tego testowy przypadek. Ping po naprawieniu, a dostaniesz ode mnie opinię :)
Jonathan Allan
@JonathanAllan czekaj, kto powiedział, że powinien zwracać prawdę, gdy między elementami kolumny są zera? Spójrz na mój drugi przypadek testowy fałsz, pusta komórka / a 0, po której następuje większa wartość, gdy zejście jest nieprawidłowe
dv02,
@DirtyDev FYI z pierwotnie podanym brzmieniem i rozsądną interpretacją, twój drugi przypadek falsey nadal byłby falsey; to tylko mój sugerowany przypadek testowy byłby prawdziwy.
Jonathan Allan
2

Swift 4 , 84 77 bajtów

func f(l:[[Int]]){print(l.filter{$0.reversed()==$0.sorted()}.count==l.count)}

Wypróbuj online!

Pan Xcoder
źródło
2

Dyalog APL, 21 19 15 bajtów

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

Wypróbuj online! (zmodyfikowany, aby działał w tryapl)

Pobiera dane wejściowe jako tablicę 2D.

W jaki sposób?

  • wkład
  • transponować
  • Tablica 2D => wektor 1D wektorów 1D
  • { ... }¨zastosuj to do każdego członka (argumentu ):
    • ⍵[⍒⍵] posortowane malejąco
    • ⍵≡ równość z
  • ∧/czy każdy element jest 1.
Zacharý
źródło
2

Japt , 7 bajtów

Wypróbowałem kilka różnych metod dla tego, ale ostatecznie najkrótsza, jaką mogłem wymyślić, okazała się być portem rozwiązania JS tsh.

Pobiera tablicę kolumn jako dane wejściowe. Puste komórki można 0pominąć, jeśli w kolumnie nie ma innych liczb.

P+U¥®n§

Sprawdź to


Wyjaśnienie

Domniemane wejście tablicy U.

P+U

Przygotuj Uz pustym ciągiem, konwertując tablicę na ciąg.

¥

Sprawdź równość, która również rzutuje prawą stronę na sznurek.

®

Mapa nad U.

Sortuj ( n) według <=.

Wynik niejawnie wyprowadza wynik boolowski.

Kudłaty
źródło
Fajny układ na pominięcie drugiego U. Możesz też zrobić nnna końcu;)
ETHprodukcje
Byłem zaskoczony U, gdy zauważyłem, że pominięcie drugiego działało w tym przypadku, @ETHproductions; Myślałem, że zadziała tylko wtedy, gdy zmienna będzie jedyną rzeczą po lewej stronie ==. Będę musiał pamiętać o tym w przyszłości.
Shaggy
2

Clojure, 30 bajtów

(partial every? #(apply >= %))

spróbuj online

Kolja
źródło
Witamy w PPCG i miły pierwszy post!
Zacharý
1

Java 8, 69 bajtów

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

Cóż, w chwili pisania tego bije to rozwiązanie Swift, więc jest! Zupełnie proste. Dane wejściowe to tablica tablic liczb całkowitych, przy czym tablice wewnętrzne to kolumny tablicy (najpierw górne kwadraty). Przesyłaj do Function<int[][], Boolean>.

Jakob
źródło
1

MY , 66 62 20 bajtów (niekonkurencyjny)

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

Wypróbuj online!

Powodem, dla którego nie jest konkurencyjny, jest to, że niedawno wdrożyłem 8E (≡), co jest równoważne APL .

W jaki sposób?

  • ω⍉ Transponowano pierwszy argument wiersza poleceń
  • ω⍉ Transponowano pierwszy argument wiersza poleceń
  • A6ǵ'push chr(0x6A)( na stronie kodowej, która sortuje malejąco)
  • ƒ jako funkcja, a nie ciąg
  • przesuń funkcję, która mapuje wyskakującą funkcję nad każdym argumentem
  • ( zastosować
  • E8ǵ'ƒ⇹( to samo, z wyjątkiem with chr(0x8E), czyli komendy match ( ).
  • Π produkt
  • wyjście bez nowej linii

Tak, wiele symboli MY jest dokładnie takich samych lub podobnych do APL-ów. Wyjaśnienie jest takie, że przyszło im na myśl, gdy chciałem polecenia 1-znakowego. (Nie wiem, dlaczego nie użyłem T do transpozycji)

Zacharý
źródło
0

Mathematica, 27 bajtów

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

Wyjaśnienie:

  • Threadjest dziwną ogólną operacją podobną do transpozycji, która akceptuje transpozycję po otrzymaniu matrycy .
  • t=Thread;pozwala mi użyć tdwa razy zamiast Threaddwa razy, aby zapisać bajty.
  • Sort sortuje listę (w kolejności rosnącej).
  • Sort\@mapuje Sortfunkcję do każdego elementu listy indywidualnie; po zastosowaniu do matrycy sortuje wiersze.
  • t@#stosuje funkcję transpozycji na wejściu #funkcji głównej.
  • - przyjmuje negatyw wszystkich wpisów, dzięki czemu sortowanie wierszy transponowanej macierzy (kolumny oryginału) sortuje je w pożądany sposób.
  • Zewnętrzne -t[...]cofa negację i transpozycję, więc wszystko, co naprawdę zrobiliśmy, to posortowanie kolumn od największych do najmniejszych.
  • ==# sprawdza, czy ta nowa macierz posortowana według kolumn jest równa oryginalnej wartości wejściowej.
  • &kończy anonimową funkcję #zdefiniowanym przez nas wejściem .

Możesz wypróbować go online w piaskownicy Wolfram Cloud , wklejając poniższy kod i klikając Gear -> „Oceń komórkę” lub naciskając Shift + Enter lub Enter na klawiaturze numerycznej:

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

Lub dla wszystkich przypadków testowych:

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}}}]&
Znaki.
źródło