Mathematica收集列表中的元素

时间:2016-02-15 18:17:17

标签: tuples wolfram-mathematica filtering counting

鉴于生成的256个元组:

Tuples[{a,b,c,d},4] = {{a,a,a,a},{a,a,a,b}...,{d,d,d,d}}

我想过滤所有具有3种类型的元组。例如,我想保留{c,b,c,c}& {a,a,d,a}等。但不是{d,d,d,d}或{a,b,b,c}。

我知道有:

Binomial[4,3]*4*3 = 48
从简单的数学中得到这样的元组。但我正在寻找一种计算方法来计算这些。

我的最终目标是来自元组:

Tuples[{1,2,3,...,n},k]

我想知道这些元组中有多少只有一个具有m类的子集,其中所有其他子组的大小都小于m。

如果您感兴趣,这个问题就会产生这样的问题:在游戏“反对人类的卡片”之前赢得的平均轮数是多少?假设我们有n个玩家并且第一个拥有x卡的人获胜。

2 个答案:

答案 0 :(得分:2)

这将找到你的48个元组

Select[Tuples[{a, b, c, d}, 4], 
  MatchQ[Sort[#], {a_, a_, a_, b_} | {b_, a_, a_, a_}] && 
  Length[Union[#]] != 1 &]

这将显示超过1,...,6的四个项目的元组,其中m个相同的项目,而所有其他项目的出现次数少于m次。

m = 2;
f[v_] := Module[{runlens},
  runlens = Sort[Map[Length, Split[Sort[v]]]]; 
  runlens[[-1]] == m && If[Length[runlens] == 1, True, runlens[[-2]] < m]]
];
Select[Tuples[Range[6], 4], f]

对结果使用Count,你知道你有多少。

答案 1 :(得分:1)

另一种方法:

Select[ Tuples[{a, b, c, d}, 4] ,
 ((Count[#, 3] == 1 && Max[#] == 3) &@Tally[#][[All, 2]] ) & ]

当然,如果设置的大小超过列表长度的一半,则检查MaxCount

是多余的