セットパズルゲーム


13

セットのゲーム(子供向けの素晴らしいゲーム)81枚のカードゲームを知っいるかもしれません。各カードには、4つの異なる属性(フォーム、番号、色、塗りつぶし)の数字があります。各属性には3つの異なる値があります。

form: wave, oval, diamond
colour: red, purple, and green
number: 1, 2, 3
fill: none, dashed, opaque.

12枚のカードがテーブルに開かれ、今の課題はセットを示すことです。セットは、すべての属性値が0、1、または3回出現する3つのカードで構成されます。赤い数字のカード、不透明なカード、または1枚のカードを持つのは良くありません。より視覚的な説明については、提供されているリンクを参照してください。

すべての属性がエンコードされているカードのコードを想定しています

"WP2N"

を意味する

2 Purple Waves with No fill

一緒に例えばとOR1Nし、DG3N

そして ここに画像の説明を入力してください

セット(3つの異なるフォーム、3つの異なる色、3つの異なる番号、1つの塗りつぶし)です。

入力は、カードを表すスペースで区切られた一意のコード(81の可能なコードからランダムに選択)の文字列です。

"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D"

ソリューションは、指定されたコレクション内のすべての可能なセットを示す必要があります。そう

OR1N, WP2N, DG3N

他のすべてのセットとともにソリューションの一部である必要があります。


5
有望ですが、処理する必要がある入力データの種類(stdin、file、parameter)、および入力データと出力データの外観をより正確に指定してください。サンプル実行の視覚的表現(スクリーンショットなど)も提供します。
マナトワーク

1
私は投票を撤回し、これを支持しました。とても面白いです!:)
ドアノブ

4
「子供向けゲーム」とはどういう意味ですか?
ブースビー

2
Waitaminute ... 4つの異なる4番目の文字があります:N、D、S、および
O。-ブース

1
@boothby:私は反対を言っていたでしょう。アルファベットが重ならない場合、すべての候補セットについて、各文字または数字が表示される回数を数えることができます。数字または文字が2回表示されない場合にのみ、セットは有効です。
flodel

回答:


4

ルビー、104 98 81 80文字

$*.combination(3).map{|c|puts c*?,if(0..3).all?{|i|c.map{|x|x[i]}.uniq.size!=2}}

サンプルの実行(サンプルデータを使用):

c:\a\ruby>set.rb OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D
OR1N,WP2N,DG3N
WP2N,DR1D,OG3O
WP2N,DR1D,OG3O
DG3N,WG3S,OG3O

出力します WP2N,DR1D,OG3ODR1Dサンプルデータにが2つあるため、2回れます。

説明:

$*.combination(3).map{|c|- 3枚の各組合せ
puts c*?,if-出力組、もし...
(0..3).all?{|i|- 0から3(列のプロパティのindeces)を評価する数値の全てならばtrue、このブロックに渡されたときには
c.map{|x|x[i]}-取るi各列のindex番目の
.uniq.size!=2}-一意のプロパティ(フォーム、色など)の量が2ではない場合(つまり、1または3)


)を取り除く:この挑戦はcodegolfになる、私は2つの改良を提案することができるだろうと仮定すると、endプラスいくつかの改行:変換if ... puts ... endputs ... if ...b)は、すべてのブロックを取ることができ、これはx.map{}.all?に等しいx.all?{}
ハワード

@How Thanks、私はコンピューターに着いたときにこれらの改善を行います。
ドアノブ

@Howard編集して両方を含める。ありがとう!
ドアノブ

また、後にスペースを削除しますif
ハワード

私はルビーのソリューションが好きで、短く、簡潔で、多かれ少なかれ読みやすいです
ジェリー博士

5

Mathematica 93 92 93 82 76 73

f={}⋃Select[StringSplit@#~Subsets~{3}, FreeQ[Tally/@(Characters@#^T),2]&]&

ロジック

StringSplit@#~Subsets~{3}3カードのサブセットのリストを生成します。次のような各トリプル:

{{「D」、「G」、「3」、「N」}、{「W」、「G」、「3」、「S」}、{「O」、「G」、「3」、 「O」}}

または

array 1

その後、転置され、

array 2

そしてTally/@(Characters@#^T)、各行における個別のアイテムの数を集計。

{3,1,1,3}

3は「すべて異なる」に対応します。1は「すべて同じ」に対応します。

FreeQ[...,2]同じタイプの2枚のカードかトリプルのカードかを決定します。2が集計に含まれない場合、セットのゲームのルールに従って、3枚のカードは「セット」です。


使用法

f["OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"]

{{"DG3N"、 "WG3S"、 "OG3O"}、{"OR1N"、 "WP2N"、 "DG3N"}、{"WP2N"、 "DR1D"、 "OG3O"}}


重複が許可されている場合は、短くすることができます。f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&出力は次のようになります{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
-alephalpha

「すべて同じ」または「すべて異なる」を確認する非常に賢い方法です!
DavidC

4

Mathematica 73

f = Select[StringSplit@#~Subsets~{3}, FreeQ[Tally /@ Thread@Characters@#, 2] &] &

使用法

f["OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"]

{{"OR1N"、 "WP2N"、 "DG3N"}、{"WP2N"、 "DR1D"、 "OG3O"}、{"WP2N"、 "DR1D"、 "OG3O"}、{"DG3N"、 "WG3S "、" OG3O "}}


4

Brachylog、12バイト

ṇ₁⊇Ṫz{=|≠}ᵐz

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

入力変数を介して入力を取得し、生成します出力変数を介して出力します。

このソリューションは実際に何かが何を意味するのかを本当に気にかけないため、エンコーディングで最近閉じられた複製から取られた2番目のテストケース。

                The output variable is
  ⊇             a subsequence
   Ṫ            of length 3
ṇ₁              of the input split on spaces,
    z      z    the columns of which
     {   }ᵐ     are all
       |        either
      =         the same element repeated,
        ≠       or entirely free of duplicates.


3

GolfScript、53文字

" "/:w,,{:a,{:^,{a^]{w=}%.0\zip{.&,2=|}/!{.p}*;}/}/}/

入力は、STDINで提供する必要があります。オンライン

> OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D
["OR1N" "DG3N" "WP2N"]
["WP2N" "OG3O" "DR1D"]
["DG3N" "OG3O" "WG3S"]
["WR2D" "OR2D" "DR2D"]

コメントされたコード:

" "/:w          # split the input at spaces and assign it to variable w
,,              # create the array [0..n-1] (n being the length of w)
{:a,{:^,{       # three nested loops: a=0..n-1, ^=0..a-1, _=0..b-1 
                # (third loop has no variable assigned but just pushes on stack)
    a^]         # make an array [a,^,_] of the three loop variables
    {w=}%       # take the corresponding list items, i.e. [w[a],w[^],w[_]]
    .0\         # push zero, add duplicate of the the array
    zip         # zip transposes the array, thus [OR1N WP2N DG3N] -> [OWD RPG 123 NNN]
    {           # loop over those entries
      .&        # unique
      ,2=       # length equals 2?
      |         # "or" with top of stack (two zero pushed before)
    }/          # end of loop, on stack remains the results of the "or"s
    !{.p}*      # if no length of 2 is there, make a copy of the set and print it
    ;           # discard stack item
}/}/}/          # closing the three nested loops

2
コードゴルフの明確な勝者と言えます。Hower全く読めない...
DRジェリー・

1
@drjerry他のgolfscriptコードと比較すると、非常に読みやすくなっています。たとえば、単純なループのみが含まれ、高度なトリックは含まれていません。コードの説明は後で追加します。
ハワード

0\zip{.&,2=|}/!短縮できますzip{.&,}%2&!
ピーターテイラー

1

JavaScript 323 313

function a(b){d=h=[];c=e=f=0;for(i in b){for(j in b){for(k in b[i]){if(b[i][k]==b[j][k]){if(c+f<4)c++;else if(c==4){h+=b[j];if(h.length=3)return h}}else{for(l in d){for(m in d[l]){g=f;if(d[l][2]==i){if(d[l][3]==k)if(b[j][k]!=d[l][0]&&b[j][k]!=d[l][1])f++;}else{continue}}if(g==f)d[e++]=[b[i][k],b[j][k],j,k]}}}}}}

オブジェクトの配列を受け取り、オブジェクトの配列を返す関数。

デモフィドル(片付けあり)。


変数を宣言する必要はありません...
Doorknob

@Doorknob私はそれを取り戻します、あなたは正しいです。編集しました。ありがとう!
数学チラー

1

APL(IBM)、76

⍉¨x/⍨{{⍵≡1⌽⍵}⍵=1⌽⍵}¨x←⊃¨(∘.,/3⍴⊂⍪¨(' '≠y)⊂y←⍞)⌷⍨¨z/⍨∧/¨2</¨z←,⍳3⍴12

IBM APLはありませんが、これでうまくいくと思います。

サンプル実行(Dyalog APLでのIBM APLのエミュレーション)

OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D
 OR1N  WP2N  WP2N  DG3N 
 WP2N  DR1D  DR1D  WG3S 
 DG3N  OG3O  OG3O  OG3O 

初めてaplコードに感謝します!
ジェリー博士

1

セージ、71

Cが文字列の場合、たとえば"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"、実行

[c for c in Subsets(C.split(),3)if{1,3}>={len(set(x))for x in zip(*c)}]

取得するため [{'DR1D', 'OG3O', 'WP2N'}, {'DR2D', 'WR2D', 'OR2D'}, {'WG3S', 'OG3O', 'DG3N'}, {'DG3N', 'WP2N', 'OR1N'}]

そして、セットが射影線であるという解釈を使用した非常に異なるアプローチがありGF(3)^4ます:

[c for c in Subsets(C.split(),3)if sum(matrix(3,map('WODRPG123N'.find,''.join(c))))%3==0]

D2回使用されて少しイライラしました...それを悪用する方法を考え出すまで。しかし、さらに良いことに、私もこのfind方法を悪用しています。str.find文字が見つからない場合は-1を返します。以来-1 = 2 mod 3、手紙Sはで発生しないため、適切に処理され'WODRPG123N'ます。


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