拼图游戏


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

与例如OR1NDG3N

在此处输入图片说明

它是一组(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 ... endputs ... 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.