それは良い2048ボードですか?


26

これがここでの私の最初の質問ですので、コメントの提案は大歓迎です!ありがとう;)

前書き

以下のための1つの非常に一般的な戦略2048のゲームはありません下にスワイプ今までにありません。これにより、すべての大きな数字が上部に、下部の数字が下部に配置されます。したがって、この戦略を正しく適用すると、ボードは常に次のパターンに一致します。

チェックするパターン/あなたのタスク

提出は、完全なプログラムか、ボードが次のように記述できる場合に真実の値を返す関数のいずれかである必要があります。最初の数字以下など。適切な2048ボードは、一番上の数字が一番上にあるボードとして定義されます。これはcode-golfであるため、言語ごとの最短コード(バイト単位)が優先されます。

I / O

入力は、それぞれが4つの数字を含む4つの配列の配列、または16の数字の配列など、任意の適切な方法で取得できます。合計で、4x4ボードを表す合計16の数値に なります。出力は入力の真の値である必要があり、それ以外の場合は偽の値です。

真実:

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

注意

2番目の偽のテストケースを見てください:どこかに空の値(または0)があり、最後にゼロ以外の数値よりも大きい値が続いている場合でも、次の値は偽である必要があります。ゼロは0自体よりも大きいため、無効になります。

がんばろう!


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
マーティンエンダー

回答:


16

Haskell、21バイト

all$scanr1 max>>=(==)

オンラインでお試しください!

空のスペースを0にして、列のリストを取得します。


の出力が間違っています[[16,8,4,0],[16,0,4,4],[16,4,4,4],[16,4,4,4]]
ジョナサンアラン

@JonathanAllan本来のようにfalseを返します。2番目の列は[16,0,4,4]であり、単調ではありません。それとも何か不足していますか?
ゲームを作りたい

0は空のセルではなく、0の値のためのプレースホルダです
ジョナサン・アラン

2
@Iwanttomakegamesのコメントはあなた向けでした(「your」を「the」に置き換えてください)。
ジョナサンアラン

@JonathanAllan混乱してすみませんが、空のセルを表す0は、値0としてカウントする必要があります。空のセルは値「0」のように扱う必要があります。
-dv02


9

APL(Dyalog)7 4バイト

引数として0を空白として使用して、4行4列の行列を取ります。

⊢≡⌊⍀

オンラインでお試しください!

⌊⍀ 垂直累積最小値

 と同じ

 変更されていない引数?


素晴らしいゴルフ!(Dyalogで働いており、APLを長い間プログラミングしている人から期待していました)。そして、はい、MYには多くのAPLシンボルがありますが、APLシンボルではありません。アルファ、イオタ、オメガはすべてギリシャ語であり、技術的にはAPLではありません。1文字のコマンドを考えるとき、彼らは最初に思いつきました。したがって、MYの増分と減分はゼリーです。それが最初に頭に浮かんだからです。(ちょうどあなたに通知するために、私はチャットから中断されているため、ここでの応答。)
ザカリー

7

ゼリー、4バイト

Ṣ€U⁼

オンラインでお試しください!

列の配列として入力します。任意のサイズのグリッドで動作します。


空のセルの表現は何ですか?(たとえば、2番目の偽テストケースの3列目)-「合計で常に16桁の数字になります」。最初にフィルターで除外すると、ゼロで機能します。
ジョナサンアラン

@JonathanAllan仕様によると、これも有効だと思う
-HyperNeutrino

それでも、これは、提案されたテストケース0ではなくを返すことになり1ます。
ジョナサンアラン

@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

JavaScript、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ý sortは可変メソッドで、配列を変更します。最初に文字列に変換すると、配列のコピーが保存されます。文字列に変換すると、参照の代わりに(文字列)値で同等の操作が機能します。
tsh


4

C#(.NET Core)、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];);}

オンラインでお試しください!

IndexOutOfBoundsExceptionをスローしてtrueを示し、正常に終了してfalseを示します。例外/例外なしからtrue / falseへの変換を含むバージョンを試しましたが、通常のバージョンと同じくらい長くなりました。


4

JavaScriptが、34、32のバイト

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

最初の列を含む単一の配列を渡し、次に2番目、3番目、および4番目を渡すことによって呼び出します。

各列の最初の数を除いて、各数を前の数と比較し、すべてが真の場合に真を返します。

テスト

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

Haskell、28バイト

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

またあります

all$(==)=<<sort

15バイトですがimport Data.List、プレリュードのみで作業する場合に必要です。あるいは、

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

GHCIでは25バイトで動作します。


3

ガイア3 6バイト

+3バイト

ọ¦_ẏ⁇!

これは、列のリストを受け入れ、結果をスタックに残す関数です。

0+¦o¦ẏおよびを含む他のいくつかの6バイトソリューションが存在しọ¦_ẏ¦ỵます。

オンラインでお試しください!

説明

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

ダウン投票はできませんが、チャレンジが投稿された後に言語に追加された演算子を使用することは私にとって公平ではないようです。また、これによればデフォルトで禁止されているようです。
シナスキ

@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

JavaScript(ES6)、42バイト

列の配列を受け取ります。(真の)数値またはを返しますfalse

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

JavaScript(ES6)、54 47バイト

最初の試み。列の配列を受け取ります。trueまたはを返しますfalse

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

空のセルにどの値を期待していますか?
アーナルド

2

MATL、4バイト

SGX=

オンラインでお試しください!

逆さまの行の配列として入力します。

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

たとえば、このような列要素の間にゼロがある真偽を返す必要がある場合には機能しません。
ジョナサンアラン

あなたは正しい、私は解決策に取り組んでいます。ところで、空のセルに問題があるのは私だけではありません;)
シナスキ

ええ、私はそれを見ることができます。テストケースも提案しました。Pingを修正すると、私から賛成票がもらえます:)
ジョナサンアラン

@JonathanAllan待って、列要素の間にゼロがあるときに真実を返すべきだと言ったのは誰ですか?2番目の偽のテストケースを見てください。空のセル/ 0に続いて値が大きくなると、無効になります。
-dv02

@DirtyDev FYI最初に与えられた文言とその賢明な解釈を使用すると、2番目の偽のケースは依然として偽です。それは私の提案したテストケースが真実であることだけです。
ジョナサンアラン


2

Dyalog APL、21 19 15バイト

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

オンラインでお試しください!(tryaplで実行されるように変更)

入力を2D配列として受け取ります。

どうやって?

  • 入力
  • 転置
  • 2D配列=> 1Dベクトルの1Dベクトル
  • { ... }¨これを各メンバーに適用します(引数):
    • ⍵[⍒⍵] 降順で並べ替え
    • ⍵≡ と平等
  • ∧/すべての要素がであるかどうか1


2

Japt、7バイト

この方法のためにいくつかの異なる方法を試してみましたが、最終的に、私が思いつく最短の方法が最終的にtshのJSソリューションのポートになりました。

列の配列を入力として受け取ります。0列に他の数字がない場合は、空のセルを使用したり省略したりできます。

P+U¥®n§

試して


説明

arrayの暗黙的な入力U

P+U

U空の文字列を先頭に追加し、配列を文字列に変換します。

¥

等価性をチェックします。これにより、右側も文字列にキャストされます。

®

地図上 U

並べ替え(n)で<=ます。

暗黙的にブール値の結果を出力します。


2番目をスキップするすてきなアレンジメントUnn最後に行うこともできます;)
ETHproductions

Uこのケースで機能する2番目の@ETHproductions を省略すると、驚きました。変数がの左側にある唯一のものである場合にのみ機能すると思いました==。将来の使用のために覚えておく必要があります。
シャギー


1

Java 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;}

これを書いている時点では、これはSwiftソリューションに勝っています。とても簡単です。入力は整数配列の配列で、内側の配列はボードの列です(最初に正方形が上)。にキャストしFunction<int[][], Boolean>ます。


1

MY66 62 20バイト(非競合)

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

オンラインでお試しください!

これが競合しない理由は、最近実装したことです8E (≡)。これはAPLと同等ですです。

どうやって?

  • ω⍉ 転置された最初のコマンドライン引数
  • ω⍉ 転置された最初のコマンドライン引数
  • A6ǵ'プッシュchr(0x6A)コードページで、降順でソートします)
  • ƒ 文字列ではなく関数として
  • 各引数にポップされた関数をマップする関数をプッシュします
  • ( 適用する
  • E8ǵ'ƒ⇹( 除いて同じこと、chr(0x8E)matchコマンドです、()。
  • Π 製品
  • 改行なしで出力

はい、MYのシンボルの多くは、APLのシンボルとまったく同じか類似しています。説明は、1文字のコマンドが必要なときに頭に浮かんだということです。(転置にTを使用しなかった理由がわかりません)


0

Mathematica、27バイト

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

説明:

  • Threadは、行列が与えられたときに転置を行う奇妙な一般的な転置のような操作です。
  • t=Thread;バイトを節約するためtThread2 回ではなく2回使用できます。
  • Sort リストを(昇順で)ソートします。
  • Sort\@Sort関数をリストの各要素に個別にマップします。マトリックスに適用されると、行を並べ替えます。
  • t@#転置関数を#メイン関数の入力に適用します。
  • - 転置行列の行(元の列)を並べ替えると希望する方法で並べ替えられるように、すべてのエントリの負の値を取ります。
  • 外側-t[...]はネガと転置を元に戻すため、列を最大から最小に並べ替えるだけでした。
  • ==# この新しい列ソート行列が元の入力と等しいかどうかをテストします。
  • &#定義した入力で匿名関数を終了します。

次のようなコードを貼り付け、Gear-> "Evaluate cell"をクリックするか、Shift + EnterまたはテンキーEnterを押すと、Wolfram Cloudサンドボックスでオンライン試すことができます。

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.