Dobble / SpotItカードジェネレーター


15

前書き

Dobble / SpotItは、最短時間でペアのカードに同じシンボルを見つけ、それを示し、次のペアに移動するカードゲームです。各カードには複数のシンボル(通常バージョンでは8)がありますが、各ペアのカード間で正確に1つのシンボルが共通しています。

ゲームの物理コピーの例: ペアの例のあるカード

チャレンジ

単一のカードに一連の記号(単一のASCII文字)と記号の数を指定して、各カードの記号を含む出力リストカードを作成するプログラムを作成します。明らかに多くの同等の組み合わせがあります。プログラムは、指定された入力に対して最大量のカードを生成する組み合わせのいずれかを記述する必要があります。

それはコードゴルフですので、コードが短いほど良いです。

最も複雑なケースで、宇宙の熱死の前に計算が終了することも素晴らしいことです。

入力

function / stdinへの2つの引数(選択)

  • それらの最初は、 'ABCDE'や['A'、 'B'、 'C​​'、 'D'、 'E']のようなシンボルのコレクションです-あなたが選択したフォーマット、文字列、セット、リスト、ストリーム、または選択した言語の慣用的なもの。文字は[A-Za-z0-9]のセットから与えられ、重複はありません(したがって、入力シンボルセットの最大サイズは62です)。これらは必ずしも順序付けられません( 6シンボルの場合にも「yX4i9A」を取得できます)。

  • 2番目の引数は整数で、単一のカードのシンボルの量を示します。シンボルセットのサイズよりも<=になります。

出力

改行で区切られた複数の行を印刷します。各行には単一のカードのシンボルが含まれます。

ABC
2
>>>>
AB
BC
AC

または

ABCDEFG
3
>>>>
ABC
BDE
CEF
BFG
AEG
CDG
ADF

または

ABCDE
4
>>>>
ABCD

ヒント

  • 作成されるカードの数は、個別のシンボルの量より多くすることはできません。多くの組み合わせでは、かなり小さくなります
  • 問題の数学の側面で助けが必要な場合は、いくつかの数学の背景を読みたいかもしれません

これは私の最初のコードゴルフチャレンジですので、フォーマット/スタイルに関する問題の可能性をご容赦ください-コメントで指摘した場合は、エラーを修正しようとします。



推奨されるテストケース('abcdefghijklmnopqrstu', 5)-> ['abcde', 'afghi', 'ajklm', 'anopq', 'arstu', 'bfjnr', 'bgkpt', 'bhlou', 'bimqs', 'cfkqu', 'cgjos', 'chmpr', 'cilnt', 'dfmot', 'dglqr', 'dhkns', 'dijpu', 'eflps', 'egmnu', 'ehjqt', 'eikor']または他の21カードのワーキングソリューション。(これは次数4の射影有限平面であることに注意してください)。
ジョナサンアラン

回答:


5

パイソン2192の 162バイト

これにより、すべてのシナリオで最大のカードセットが生成され、3つのテストケースが処理されるという議論があります。

from itertools import*
def m(a,s):
    C=["".join(x)for x in combinations(a,s)]
    while len(C):
        print C[0]
        C=list(set(A for A in C if len(set(A)&set(C[0]))==1<s))

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

アルゴリズム

アルファベットaとカードサイズを指定してss要素のすべての組み合わせを取得しa、呼び出しますC

  • の最初の要素を取り、Cそれを呼び出しますC0
  • セーブ C0
  • 等しくないC和集合を持つすべての要素を削除しますC01
  • の2番目の要素で繰り返します C
  • C空になるまで続ける

次に、保存した要素を印刷します。

引数

の空でないサブセットCは、最大のソリューションですK。それは少なくとも1種の元素を含有する任意の2つの要素が区別できないため、任意の要素を選択するC0と、CであることK。任意の要素のためeK、カーディナリティのe連合はx1であるx != eにおいてKCとの結合C0がカーディナリティ1 を持たないすべての要素を削除します。同じ理由で、で新しい任意の要素を選択しC、に追加しK、を減らしCます。最終的にCは空のセットでありK、他の要素と区別できる要素を選択した点はないため、最大のソリューションになります。


テストケース

これらのテストケースは、印刷が要件であることに気付く前に作成されました。

a=["a","b","c"]
b=2
c=3
d=m(a,b)
print d,len(d)==c
>> ['bc', 'ab', 'ac'] True

a=["a","b","c","d","e","f","g"]
b=3
c=7
d=m(a,b)
print d,len(d)==c
>> ['aef', 'abc', 'bde', 'ceg', 'adg', 'cdf', 'bfg'] True

a=["a","b","c","d","e"]
b=4
c=1
d=m(a,b)
print d,len(d)==c
>> ['abcd'] True

更新

  • +9 [16-12-07]印刷要件に適合
  • -11 [16-12-07] R変数をゴルフアウト
  • -30 [16-12-09] @LeoのKおかげで変数をゴルフアウトしました

1
あなたは本当にすべてのステップでCからセットKを引く必要がありますか?A for A in C if len(set(A)&set(C[0]))==1s == 1(この場合len(set(C [0])&set(C [0]))が1でない限り、フィルタリング()は選択した要素を既に削除していると思います。:あなたは、最後の行までにゴルフあなたの第二の可能性C=[A for A in C if len(set(A)&set(C[0]))==1<s]
レオ

私はサンドボックスでDobbleチャレンジを書いていましたが、Dom Hastingsはこの質問をだましだと指摘しました(おそらくそうかもしれません)が、気づいたことの1つは、N * NのフルDobbleデッキを作成するのがはるかに難しいことです+ N + 1カード(およびシンボル)。カードごとにN + 1個のシンボルがあり、Nは非プライムプライムパワーです。N = 4 = 2 ^ 2の場合、これは4 * 4 + 4 + 1 = 21シンボルと同じ数のカードを使用するデッキになります。ただし、このソリューションでは13枚のカードのデッキしか作成できませんが、21 枚のカードを使用できます。
ジョナサンアラン

@JonathanAllan TIOリンクを追加しました。21文字のアルファベットとカードごとに5文字で関数を実行しました。21枚のカードを出力します。誤解しない限りこれは正しいと思います。
NonlinearFruit

うーん、すみません、私はそれをローカルで実行するのに間違いを犯したに違いありません!(それは順序4のフルドブルデッキです。: ))
ジョナサンアラン

2

Haskell、175 156バイト

ゴルフの最初のテイク、何かを台無しにしたかどうかを教えてください。

import Data.List
f 0_=[[]]
f n a=g$c n a
c n a=[a!!i:x|i<-[0..(length a)-1],x<-f(n-1)(drop(i+1)a)]
g[]=[]
g(x:t)=x:g(filter(\z->length(z`intersect`x)<= 1)t)

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

@Paul Mutserに改善と-19バイトをありがとう


元のバージョン


1
PPCGへようこそ!インポートはスコアにカウントされることに注意してください。可能な改善:インポートを含め156バイト、
ポールMutser

頭を上げてくれてありがとう。
バグ

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