これはファイブアップ(ドミノ)の有効なゲームですか?


8

ドミノのセットは、0からNまでの整数のすべての組み合わせが表されるように、2つの数字が付いたタイルで構成されます。以下の例では便宜上N = 6を参照していますが、N = 9とN = 12も一般的です。タイルの方向は関係ありません(通常、数字ではなくドットで印刷されます)。そのため、同じタイル[1-6][6-1]参照します。タイルはセットに1つしかありません。

ドミノでプレイするほとんどのゲームでは、プレーヤーが順番にドミノをテーブルに追加した行にドミノを追加していきます。そのため、新しいドミノの数字の1つは、テーブルの行の一端にある同じ数字の隣に配置されます。したがって、あなたは追加される場合があります[2-5]が、既存ラインの両端に[2-3][3-3][3-5]生じる、[5-2][2-3][3-3][3-5]または[2-3][3-3][3-5][5-2]

そのようなゲームの多くは、「ダブル」、つまり同じ数の2つのドミノを、それらに接続されている他のドミノに垂直に配置する必要があります。私たちがここで気にしていないスコアリングを除いて、これは次の場合を除いて効果がありません...

これらのゲームの多くは、「ライン」が一部またはすべてのダブルで分岐することを許可します。ファイブアップは、ラインが各ダブルで3つの新しいラインに分岐できるようなゲームなので、ダブルの4辺すべてに対応するドミノが接続されている場合があります。

以下は、ファイブアップ(A | BまたはABがシングルドミノ)のゲームで設定された「ダブル6」セットからのドミノのレイアウト例です。

     4
     -
     0

3|0 0|0 0|2

     0
     -
     1

4|1 1|1 1|6
                3
     1          -
     -          6
     5
                6
6|5 5|5 5|0 0|6 - 6|2 2|1
                6
     5
     -          6
     4          -
                4

あなたのタスクは、テーブルに追加された順序でドミノのリストを取得し、この順序がファイブアップの合法的なゲームを表すかどうかを判断することです。

stdinから入力を受け取るプログラム全体、または1つ以上のパラメーターとして入力を受け取る関数を作成できます。

正規入力は、整数の2タプルのリストまたは配列になります。上記のいずれかを表す文字列や複数の文字列と同様に、リストのリスト、配列の配列、タプルのベクトルなどはすべて、入力を受け取る有効な形式です。入力には、負でない整数のペア、有効なドミノのみが含まれます。

有効なゲームと無効なゲームのそれぞれについて、出力は真または偽の値である必要があります。

コードは、言語の最大整数値の範囲内で、任意の大きなドミノ番号を受け入れる必要があります。

例:

  • 0-6 他のシングルドミノと同様に有効です
  • 0-6 6-0は無効です。0-6セットにドミ​​ノが1つしかありません
  • 6-6 6-5 5-3 3-0 有効で、単純な線形配置
  • 6-6 6-5 3-0 5-3何があり、有効ではないではない3か、0と前に接続するための第三のドミノのために劇中で5-3演奏されています
  • 1-1 1-2 1-3 1-4 1-5 1-6は無効です。4つのオープン1エンドがすべて使用され、1-6
  • 1-1 1-2 1-3 1-4 1-5 3-6 1-6 有効です。3-6は1-3に接続し、1-6は3-6に接続できます
  • 5-5 5-4 5-0 0-6 6-6 6-4 6-2 2-1 6-3 5-1 1-1 1-6 4-1 1-0 0-0 2-0 3-0 0-4 上記の例は有効です
  • 12-12 12-1 3-12 3-1 1-2 3-3 有効で、より大きなドミノを使用し、あいまいな配置

注:ここで必要な機能は、有効なファイブアップゲームの完全なチェックではありません。ここでは、最初にどのドミノがプレイされるかについてのルールを無視します。これは、ゲームのバリエーションとプレイヤーの数に関する詳細な情報を必要とし、入力のかなりの少数を失格にします。


配置の幾何学的制約、つまりドミノチェーン自体がクラッシュすることを考慮する必要がありますか?
xnor

@xnorはしません。「線」がドミノのゲームで便宜上任意に曲がることができるという一般的な慣習について言及するのを忘れていました。テーブルの端を回避するのにも適しています:)
Sparr

自己交差を避けられないダブルの12セットのドミノで、病的な秩序のあるプレーを生み出すことは可能かもしれないと思います。より大きなセットでも間違いなく可能です。それらのケースを無視してみましょう。最悪の場合、3Dで線を曲げることで解決できます:)
Sparr

実際に、値が6より大きいドミノを処理できるようにする必要がありますか?もしそうなら、仕様をもっと明確にして、テストケースを追加してください。それ以外の場合は、素晴らしいチャレンジ-私から+1。
Shaggy

@Shaggyがより大きなドミノのテストケースを追加
Sparr

回答:


1

Haskell188 174 168バイト

f(p:r)=[p]!r$p?p
(s!(p:r))o|b<-[p,reverse p]=or[(q:s)!r$q%o|q<-b,elem(q!!0)o,all(`notElem`s)b]
(s!_)o=1<3
p@[x,y]?r=[c|x==y,c<-p]++r
p@[x,y]%(a:r)|a/=x=a:p%r|z<-y:r=p?z

オンラインでお試しください!使用例:f [[6,6],[6,5],[5,3],[3,0]]yields True

未ゴルフ:

f :: [[Int]] -> Bool
f (p:r) = check [p] (double p p) r

check :: [[Int]] -> [Int] -> [[Int]] -> Bool
check seen open [] = True
check seen open ([x,y]:r) = 
	  notElem [x,y] seen
   && notElem [y,x] seen
   && (elem x open && check ([x,y]:seen) (update [x,y] open) r 
   ||  elem y open && check ([y,x]:seen) (update [y,x] open) r)

double :: [Int] -> [Int] -> [Int]
double [x,y] rest = 
    if x==y 
    then [x,y] ++ rest 
    else rest

update :: [Int] -> [Int] -> [Int]
update [x,y] (a:rest) = 
    if x==a 
    then double [x,y] (y:rest) 
    else a : update [x,y] rest

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


0

R、224バイト

function(L,x=c(),y=c()){o=T
z=length
if(z(L)){p=sort(L[1:2])
w=rep(p,2-(p[2]>p[1]))
x=rbind(p,x)
if(z(y)){m=match(p,y,0)
v=which.max(m)
if(m[v]>0){y=y[-m[v]]
w=w[-v]}}
y=c(y,w)
L=L[-1:-2]
o=o&f(L,x,y)&!sum(duplicated(x))}
o}

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

コードはピースを順序付きリストとして受け取り、仕様に従ってTRUEまたはFALSEを返します。この関数は、すべてのピースを再帰的にスキャンし、ピースをインデックスに追加して重複がないことを確認し、利用可能な挿入ポイントを追跡して、ピースをスタックに効果的に追加できることを確認します。ピース接続の処理(1から2への1から2の接続など)は貪欲な方法で行われるため、一部の奇妙な構成が爆発する可能性はまったくありません。


残念ながら貪欲だけでは十分ではありません。のどちらか一方に配置されている可能性があるため、6-6 6-3 6-2 2-3これを次2-_または3-_次で処理できるようにする必要があると考えてください2-3
Sparr

ちょっと見てみます。
NofP 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.