Ist es ein gutes 2048 Board?


26

Dies ist meine erste Frage hier, daher würden wir uns über Vorschläge in den Kommentaren freuen! Vielen Dank ;)

Einführung

Eine sehr verbreitete Strategie für das Spiel 2048 ist es, niemals nach unten zu streichen . Dies positioniert alle großen Zahlen oben und die unteren unten. Wenn Sie diese Strategie richtig anwenden, entspricht Ihr Board immer dem folgenden Muster:

Das zu überprüfende Muster / Ihre Aufgabe

Ihre Einsendung sollte entweder ein vollständiges Programm oder eine Funktion sein, die einen Wahrheitswert zurückgibt, wenn die Tafel wie folgt beschrieben werden kann: In jeder Spalte der Tafel sollte die erste Zahl die höchste der Spalte sein, die zweite die niedrigere als oder gleich der ersten Zahl usw. Ein gutes 2048-Board ist definiert als ein Board, bei dem die höchsten Zahlen alle oben liegen. Das ist Code-Golf , also gewinnt der kürzeste Code pro Sprache (in Bytes).

I / O

Die Eingabe kann auf jede geeignete Weise erfolgen, z. B. als Array von 4 Arrays mit jeweils 4 Zahlen oder als Array von 16 Zahlen. Insgesamt werden es immer 16 Zahlen sein, die die 4x4- Karte darstellen. Die Ausgabe sollte ein wahrer Wert sein, die Eingabe ist eine "gute 2048-Karte" und ansonsten ein falscher Wert.

Beispiele

Wahrheit:

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


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

Falsch:

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


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

Hinweis

Schauen Sie sich den zweiten falschen Testfall an: Wenn irgendwo ein leerer Wert (oder eine 0) vorhanden ist und selbst dann, wenn auf ihn ein Wert folgt, der höher ist als die letzte Zahl ungleich Null, sollte dies falsch sein, da der nächste Wert nach dem Null wäre höher als die 0 selbst, was es ungültig macht.

Viel Glück!


Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Martin Ender

Antworten:


16

Haskell , 21 Bytes

all$scanr1 max>>=(==)

Probieren Sie es online!

Nimmt eine Liste von Spalten mit Leerzeichen als 0.


Gibt die falsche Ausgabe für [[16,8,4,0],[16,0,4,4],[16,4,4,4],[16,4,4,4]].
Jonathan Allan

@JonathanAllan Es gibt falsch zurück, wie es sollte, Ihre 2. Spalte ist [16,0,4,4], was nicht monoton ist. Oder vermisse ich etwas?
Ich möchte Spiele machen

0 ist Ihr Platzhalter für eine leere Zelle, kein Wert von 0.
Jonathan Allan

2
@Iwanttomakegames dieser Kommentar war für Sie bestimmt (ersetzen Sie "Ihr" durch "das").
Jonathan Allan

@ JonathanAllan Es tut mir leid für die ganze Verwirrung, aber 0 sollte in der Tat, während es eine leere Zelle darstellt, als Wert 0 zählen. Leere Zellen sollten wie der Wert '0' behandelt werden.
DV02


9

APL (Dyalog) , 7 4 Bytes

Nimmt eine 4-mal-4-Matrix, wobei 0 für Leerzeichen als Argument verwendet wird.

⊢≡⌊⍀

Probieren Sie es online!

⌊⍀ ist das vertikale kumulative Minimum

 identisch mit

 das unveränderte argument?


Erstaunliches Golf! (Ich habe das von jemandem erwartet, der für Dyalog arbeitet und schon lange APL programmiert hat). Und ja, MY hat viele APL-Symbole, obwohl es keine APL-Symbole sind. Alpha, Iota, Omega sind alle griechisch, technisch gesehen nicht APL. Sie kamen zuerst in den Sinn, wenn sie an Befehle mit einem Zeichen dachten. Daher sind MEINS Inkrement und Dekrement Jellys, weil das zuerst in den Sinn kam. (Nur um Sie zu benachrichtigen, bin ich vom Chat ausgeschlossen, daher die Antwort hier.)
Zacharý

7

Gelee , 4 Bytes

Ṣ€U⁼

Probieren Sie es online!

Eingabe als Array von Spalten. Funktioniert mit Gittern beliebiger Größe.


Was ist die Darstellung einer leeren Zelle? (zB 3. Spalte des 2. Falsey-Testfalls) - "Insgesamt sind es immer 16 Zahlen". Es würde mit Nullen funktionieren, wenn Sie sie zuerst herausfiltern.
Jonathan Allan

@ JonathanAllan Nach den Angaben, ich denke, das ist auch gültig
HyperNeutrino

Aber das wird jetzt mein vorgeschlagener Testfall nicht mehr zurückgeben 0als 1.
Jonathan Allan

@ JonathanAllan Wie filtert man in Jelly ._. Ich würde erwarten, dass dies funktioniert, ḟ0aber nicht funktioniert
HyperNeutrino

1
@DirtyDev Das ist in Ordnung, wir sind hier, um die Herausforderungen zu genießen und neuen Benutzern zu helfen, sich an diesen Ort zu gewöhnen :) Ich hoffe, Sie genießen die Community
HyperNeutrino

6

R (+ Pryr), 23 Bytes

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

Welches zur Funktion auswertet

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

Welche nimmt eine Matrix als Eingabe:

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

diffBerechnet bei Angabe einer Matrix automatisch die Unterschiede innerhalb von Zeilen (überraschenderweise kannte ich diese Funktion erst, als ich sie für diese Herausforderung ausprobierte).

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

Keiner dieser Werte kann in einer guten Platine 1 oder höher sein, daher prüfen wir, <1ob die allWerte der Matrix übereinstimmen.

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

[1] TRUE

5

JavaScript, 37 Bytes

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

Nenne es so:

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

Getestet unter Firefox, Chrome, JavaScript Shell und Node.js.


Warum wandelst du das Ergebnis in einen String um? ( ''+)
Zacharý

@ Zacharý sortist eine veränderbare Methode, die das Array verändert. Beim ersten Konvertieren in einen String wird eine Kopie des Arrays gespeichert. Beim Konvertieren in einen String wird die Gleichheitsoperation auch durch einen (String-) Wert anstelle eines Verweises ausgeführt.
2.


4

C # (.NET Core) , 71 Byte

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

Probieren Sie es online!

Der langweilige Weg. Erwartet eine in ein lineares Array abgeflachte Eingabe.

Alternativ der ausdrücklich verbotene Weg:

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

Probieren Sie es online!

Löst eine IndexOutOfBoundsException aus, um true anzugeben, endet normalerweise, um false anzugeben. Ich habe eine Version ausprobiert, die die Konvertierung von Ausnahme / keine Ausnahme nach Wahr / Falsch beinhaltete, aber sie endete genauso lange wie die reguläre Version.


4

JavaScript, 34 , 32 Bytes

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

Rufen Sie auf, indem Sie ein einzelnes Array mit der ersten Spalte gefolgt von der zweiten, dritten und vierten Spalte übergeben.

Vergleicht jede Zahl mit der vorherigen Zahl mit Ausnahme der ersten Zahl jeder Spalte und gibt true zurück, wenn alle true sind.

Prüfung

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

Bearbeiten: 2 Bytes dank TSH gespeichert


nach einer booleschen Transformation:v=>!v.some((x,i)=>i%4&&x>v[i-1])
tsh

3

Haskell , 28 Bytes

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

Es gibt auch

all$(==)=<<sort

mit 15 bytes wird es aber nur import Data.Listbeim arbeiten mit dem prelude benötigt. Alternative,

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

mit 25 Bytes arbeitet in GHCI.


3

Gaia , 3 6 Bytes

+3 Bytes, weil ich anscheinend nicht wusste, wie meine Sprache funktioniert

ọ¦_ẏ⁇!

Dies ist eine Funktion, die eine Liste von Spalten akzeptiert und das Ergebnis auf dem Stapel belässt.

Es gibt einige andere 6-Byte-Lösungen, einschließlich 0+¦o¦ẏund ọ¦_ẏ¦ỵ.

Probieren Sie es online!

Erläuterung

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

Kann nicht downvote, aber einen Operator in der Sprache hinzugefügt verwenden , nachdem die Herausforderung nicht fair scheint es geschrieben wurde me.Also es standardmäßig nach verboten zu sein scheint dies .
Cinaski

@Cinaski Wir sind von dieser Regel abgewichen, wie hier zu sehen . In beiden Fällen verwenden meine alternativen Lösungen nur Betreiber, die definitiv vor der Herausforderung existierten.
Business Cat

Ich werde es einfach zu einem der anderen ändern, denke ich
Business Cat

Egal, ich war mir dieser neuen Regel nicht bewusst.
Cinaski

3

TI-BASIC, 25 Byte

Übernimmt die Eingabe als 4x4-Matrix in Ans.

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

Erläuterung

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

Nimmt ein Array von Spalten; gibt eine (wahrheitsgemäße) Zahl zurück oder false.

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

JavaScript (ES6), 54 Byte

Erster Versuch. Nimmt ein Array von Spalten; zurück trueoder false.

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

Welchen Wert erwarten Sie für leere Zellen?
Arnauld

2

MATL , 4 Bytes

SGX=

Probieren Sie es online!

Eingabe als Array von Zeilen mit dem Kopf nach oben.

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

Funktioniert nicht für Fälle , die truthy zurückgeben soll , die Nullen zwischen Spaltenelemente wie haben dies zum Beispiel.
Jonathan Allan

Du hast recht, ich arbeite an einer Lösung. Übrigens bin ich nicht der einzige, der Probleme mit leeren Zellen hat;)
Cinaski

Ja ich kann das sehen. Ich schlug auch einen Testfall dafür vor. Ping, wenn es repariert wird und du wirst eine Gegenstimme von mir bekommen :)
Jonathan Allan

@ JonathanAllan Warte, wer hat gesagt, dass es wahrheitsgemäß zurückgeben soll, wenn es Nullen zwischen den Spaltenelementen gibt? Schauen Sie sich meinen zweiten falschen Testfall an: Eine leere Zelle / eine 0 gefolgt von einem höheren Wert beim Herunterfahren ist ungültig.
DV02

@DirtyDev FYI mit dem ursprünglich gegebenen Wortlaut und seiner vernünftigen Interpretation wäre Ihr zweiter Fall immer noch falsch; es ist nur mein vorgeschlagener Testfall, der wahr ist.
Jonathan Allan


2

Dyalog APL, 21 19 15 Bytes

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

Probieren Sie es online! (so geändert, dass es in tryapl läuft)

Übernimmt die Eingabe als 2D-Array.

Wie?

  • Eingang
  • transponieren
  • 2D-Array => 1D-Vektor von 1D-Vektoren
  • { ... }¨Wende dies auf jedes Mitglied an (Argument ):
    • ⍵[⍒⍵] absteigend sortiert
    • ⍵≡ Gleichheit mit
  • ∧/ob jedes Element ist 1.


2

Japt , 7 Bytes

Versuchte ein paar verschiedene Methoden für diese, aber am Ende war die kürzeste, die ich finden konnte, eine Portierung der JS-Lösung von tsh.

Nimmt ein Array von Spalten als Eingabe. Leere Zellen können ein- 0oder ausgeblendet werden, wenn die Spalte keine anderen Zahlen enthält.

P+U¥®n§

Probier es aus


Erläuterung

Implizite Eingabe eines Arrays U.

P+U

Stellen Sie Ueine leere Zeichenfolge voran und konvertieren Sie das Array in eine Zeichenfolge.

¥

Überprüfen Sie die Gleichheit, wodurch auch die rechte Seite in eine Zeichenfolge umgewandelt wird.

®

Karte über U.

Sortieren ( n) nach <=.

Boolesches Ergebnis implizit ausgeben.


Schöne Anordnung, um die Sekunde zu überspringen U. Das könnte man auch nnam Ende machen;)
ETHproductions

Ich war überrascht, dass das Weglassen der zweiten Uin diesem Fall funktioniert hat, @ETHproductions; Ich dachte, es würde nur funktionieren, wenn die Variable das einzige ist, was links von der ist ==. Ich muss es für die zukünftige Verwendung merken.
Shaggy


1

Java 8, 69 Bytes

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

Nun, zum jetzigen Zeitpunkt schlägt dies die Swift-Lösung, also gibt es das! Ganz einfach. Input ist ein Array von Integer-Arrays, wobei die inneren Arrays Spalten des Boards sind (obere Quadrate zuerst). Besetzung für Function<int[][], Boolean>.


1

MY , 66 62 20 Bytes (nicht konkurrierend)

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

Probieren Sie es online!

Der Grund, warum dies nicht konkurriert, ist, dass ich vor kurzem implementiert habe 8E (≡), was äquivalent zu APL ist .

Wie?

  • ω⍉ Das erste Befehlszeilenargument wurde umgesetzt
  • ω⍉ Das erste Befehlszeilenargument wurde umgesetzt
  • A6ǵ'push chr(0x6A)( in der Codepage, die absteigend sortiert)
  • ƒ als Funktion und nicht als Zeichenfolge
  • Schieben Sie eine Funktion, die eine POP-Funktion auf jedes Argument abbildet
  • ( sich bewerben
  • E8ǵ'ƒ⇹( das Gleiche, außer mit chr(0x8E), das der Match-Befehl ist ( ).
  • Π Produkt
  • Ausgabe ohne Zeilenumbruch

Ja, viele MY-Symbole sind genau gleich oder ähnlich zu APLs. Die Erklärung ist, dass sie mir einfielen, als ich einen 1-Zeichen-Befehl wollte. (Ich weiß nicht, warum ich T nicht für die Transponierung verwendet habe)


0

Mathematica, 27 Bytes

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

Erläuterung:

  • Threadist eine seltsame allgemeine transponierungsähnliche Operation, bei der die Transponierung ausgeführt wird, wenn eine Matrix angegeben wird .
  • t=Thread;Lässt mich tzweimal statt Threadzweimal verwenden, um Bytes zu speichern.
  • Sort sortiert eine Liste (in aufsteigender Reihenfolge).
  • Sort\@ordnet die SortFunktion jedem Element einer Liste einzeln zu; Bei Anwendung auf eine Matrix werden die Zeilen sortiert.
  • t@#Wendet die Transponierungsfunktion auf den Eingang #der Hauptfunktion an.
  • - Nimmt das Negativ aller Einträge, damit die Zeilen der transponierten Matrix (die Spalten des Originals) in der gewünschten Weise sortiert werden.
  • Das äußere -t[...]macht das Negative und die Transponierung rückgängig, sodass wir wirklich nur die Spalten vom größten zum kleinsten sortieren mussten.
  • ==# Überprüft, ob diese neue spaltensortierte Matrix der ursprünglichen Eingabe entspricht.
  • &Beendet die anonyme Funktion mit der von #uns definierten Eingabe .

Sie können es online in der Wolfram Cloud-Sandbox versuchen, indem Sie folgenden Code einfügen und auf Zahnrad -> "Zelle auswerten" klicken oder Umschalt + Eingabetaste oder die Zifferntaste drücken:

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

Oder für alle Testfälle:

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}}}]&
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.