拼图游戏


13

也许您知道Set的游戏(对孩子们来说是一个很棒的游戏)是一款拥有81张纸牌的纸牌游戏,其中每张纸牌上都有一个具有4种不同属性(形状,数字,颜色和填充)的数字。每个属性具有3个不同的值:

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

桌子上放了12张纸牌,现在的挑战是要显示一组。一组包含三张卡,每个属性值出现0、1或3次。拥有两张带有红色数字,不透明或一张数字的卡是不好的。请参阅提供的链接以获取更直观的说明。

我确实设想了一张卡片的代码,其中所有属性都被编码为

"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,文件,参数)以及输入和输出数据的外观。还提供样品运行的视觉表示(屏幕截图或类似内容)。
— manatwork

1
我撤回了我的近距离表决,并对此表示支持。这很有趣!:)
— 门把手

4
地狱是指“儿童游戏”吗?
— 2013年

2
等等...有4个不同的第4个字母:N,D,S和
— O。–展位

1
@boothby:我会说相反的话。如果字母不重叠,则对于每个候选集,您只需计算每个字母或数字出现的次数:当且仅当没有数字或字母出现两次时,该集合才有效。
— flodel 2013年

Answers:


4

Ruby,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,OG3O两次,因为DR1D示例数据中有两个。

说明:

$*.combination(3).map{|c|-3张卡的每种组合
puts c*?,if-如果...,则输出该集合
(0..3).all?{|i|-如果所有从0到3的数字(字符串中属性的索引)的值都等于true传递到此块时的值
c.map{|x|x[i]}-取i每个字符串的th索引
.uniq.size!=2}-如果唯一属性(形式,颜色等)的数量不是2(所以1或3)


假设这个挑战将变成代码高尔夫,我可以提出两项改进措施:a)摆脱end加几个换行符:转换if ... puts ... end为puts ... if ...b)全部都可以占用一个块,因此x.map{}.all?等于x.all?{}
— Howard

@How谢谢,我将在使用计算机时进行那些改进。
— 门把手

@Howard编辑以同时包含两者。谢谢!
— 门把手

还要在之后删除空格if。
— 霍华德

我喜欢红宝石解决方案,简短,简洁,或多或少可读性
— 杰里博士(Jerry Dr)2013年

5

Mathematica 93 92 93 82 76 73

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

逻辑

StringSplit@#~Subsets~{3}产生一个三张牌子集的列表。每个三元组,例如:

{{“ D”,“ G”,“ 3”,“ N”},{“ W”,“ G”,“ 3”,“ S”},{“ O”,“ G”,“ 3”, “ O”}}

要么

数组1

然后换位

阵列2

并计算Tally/@(Characters@#^T)每行中不同项目的数量。

{3,1,1,3}

3对应于“所有不同”;1对应于“全部相同”。

FreeQ[...,2]确定2张相同类型或三张相同的牌。如果2不在记数范围内,则根据“局限游戏”规则,三张牌为“局”。


用法

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

在线尝试!

通过输入变量获取输入,并通过输出变量生成输出。

第二个测试用例取自其编码中最近关闭的副本,因为此解决方案实际上并不关心实际含义是什么。

                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}*;}/}/}/

输入必须在STD​​IN上提供,例如在线:

> 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
我想说一下代码高尔夫的明显赢家。豪威尔完全无法理解..
— 杰瑞博士

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代码谢谢!
— jerry博士

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'}]

这是一种非常不同的方法,使用了以下解释:Set是投影线GF(3)^4:

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

我有点生气了D两次,直到我弄清楚如何滥用它。但更好的是,我也滥用该find方法。str.find如果找不到字母,则返回-1。既然-1 = 2 mod 3,这封信S得到了适当的处理,因为它不在中出现'WODRPG123N'。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.