米娅套装顺序


9

骰子游戏Mia引入了大小为2的一组非常平凡的顺序:

{3,1} < {3,2} < {4,1} < {4,2} < {4,3} < {5,1} < {5,4} < {6,1} < {6,5} < {1,1} < {2,2} < {6,6} < {1,2}

通常,元组中的顺序无关紧要{x,y}={y,x}{1,2}比其他任何东西都大,对大于大于非对,并且数值决定是否平局。

现在假设您要使用n骰子。另外,骰子有m面孔。

例:

  • {1,5,3,4} < {1,2,6,3} 自5431 <6321
  • {1,2,3,5} < {1,1,5,6} < {1,1,5,5}, {1,1,6,6} < {1,1,1,3} < {2,2,2,3} < {1,1,1,1} < {1,2,3,4}
  • {2,2,5} < {1,1,6} 因为两个集合都有一对,所以611> 522

简而言之,{1, ..., n}比什么都重要。设p > q,则实物p大于实物q。如果出现平局,则以第二(,第三,...)最长的同类获胜。最后,如果尚未做出决定,则以最大的数值为准。集合的数值是您可以使用串联从集合中的可用数字构建的最大整数。例:

  • {2,5,4,3} 变成5432
  • {4,11,3,4} 变为B443(允许使用大于6个面的骰子,B = 11)

您的任务是以您选择的语言编写尽可能小的程序(即函数),给定两个容器(列表,数组,集合,...),则返回第一个还是第二个获胜。

注意:您可以假定两个容器的长度相同,并且仅包含正整数,而没有其他内容。特别是它们可能未排序。返回值可以是任何值,例如{第一个获胜,平局,第二个获胜}的{-1、0、1}。


1
其中1个胜场{1,1,6}{2,2,5}?您是否比较最大同类或任何骰子的数值?
马丁·恩德

1
让我检查一下我对顺序的理解是否正确:首先,{1,...,n}是最高的。对于每个列表,采用最常见的值,而同样常见的值采用最大的值。如果一个列表中有更多列表,则获胜。如果同样普遍,则取胜。如果共同点和价值都相等,则从每个列表中删除所有那些并再次进行比较。
xnor

@马丁:很好的问题。我猜对此没有“规范”的决定,并且由于我的朱莉娅程序说{1,1,6}胜过{2,2,5},所以就这样。
pasbi

@xnor:是的,但是请考虑马丁的评论和我的回答。
pasbi

@oVooVo哦,是的,考虑到您的示例,在将数字从大到小排序之后,您只需按数值对它们进行排序就可以了。
马丁·恩德

Answers:


2

果冻,16 字节

ṢŒrUṢṚZ
Ṣ⁼J;ǵÐṀ

获取一个列表列表,每个列表代表一个掷骰子(如果需要,可以大于两个),并返回获奖者列表。

在线尝试!...或者这里是一个版本,将滚动从最弱到最强排序。

怎么样?

Ṣ⁼J;ǵÐṀ - Main link: list of list of dice rolls, L
     µÐṀ - filter keep maximal (i.e. sort L by the previous link as a key and keep maximums)
         -                                            e.g. [5,3,1,3]
Ṣ        -     sort roll                                   [1,3,3,5]
  J      -     range(length(roll))                         [1,2,3,4]
 ⁼       -     equal? [1,2,3,...n] beats everything        0
    Ç    -     call last link as a monad with input roll   [[2,1,1],[3,5,1]]
   ;     -     concatenate                                 [0,[2,1,1],[3,5,1]]

ṢŒrUṢṚZ - Link 1, rest of sort key: dice rolls        e.g. [5,3,1,3]
Ṣ       - sort the roll                                    [1,3,3,5]
 Œr     - run length encode                                [[1,1],[3,2],[5,1]]
   U    - upend (reverse each)                             [[1,1],[2,3],[1,5]]
    Ṣ   - sort                                             [[1,1],[1,5],[2,3]]
     Ṛ  - reverse                                          [[2,3],[1,5],[1,1]]
      Z - transpose                                        [[2,1,1],[3,5,1]]
        -     ...this is a list of: 1) the group sizes descending; and
                 2) the face values of each group, descending across equal group sizes

@oVooVo当我尝试更多地打高尔夫球时,我注意到它1,1,2并且1,2,2被认为是相等的,但是目前规范也无法将它们区分开。
乔纳森·艾伦

@oVooVo经过进一步检查,示例在{1,1,5,6} < {1,1,5,5}何处6 > 5。你能澄清一下吗?
乔纳森·艾伦

@oVooVo也许它应该像这样 -我已经取代了“最大选择” ÐṀ,带着几分,Þ用于测试目的-从例如使用的项目它排序他们进入的顺序相同。所使用的顺序是:首先,如果它是“ top-dog”,则通过等面孔数递减,最后通过唯一面孔数递减。
乔纳森·艾伦

{1,1,5,5}具有两个“同类2”:(1,1)和(5,5)。{1,1,5,6}只有一个“ 2种”。因此{1,1,5,5}获胜。此值无关紧要。同样,{1,1,2,2}> {4,5,6,6}。
pasbi

{1,2,2}> {1,1,2}。因为两者都有一种,所以采用数字平局决胜制。{1,2,2} => 221和{1,1,2} => 211。显然221大于211。我将在规格中阐明这一点。
pasbi

2

JavaScript(ES6),162个字节

(a,b,g=a=>a.map(n=>e[n]=e[n]+1||1,e=[1])&&[[...e].every(n=>n==1),...e.filter(i=x=>x).sort(h=(a,b)=>b-a),...a.sort(h)],c=g(a),d=g(b))=>d.map((n,i)=>n-c[i]).find(i)

说明:将两个数组作为参数。g将每个数组转换为计数列表。然后检查列表以查看它是否对应于集合1..n。对计数进行排序,然后将排序后的值连接在一起。然后比较两个结果。如果第二个数组获胜,则返回值为正整数;如果第一个数组获胜,undefined则返回负整数,否则返回伪造的JavaScript值。


您的程序说{1,1,6} <{2,2,5},这是错误的。
pasbi

@oVooVo对不起,我一定对规则有误解(我以为您根据同类最长的数字打破了平局)。
尼尔2017年

0

PHP 333字节

我假设骰子的数量较少,然后以最高的值面对,因为从1开始的街道

我多赚一点。输入是一个数组,其中包含两个以上的值。输出是排序的数组。

<? $m=$_GET[m];foreach($m as$k=>$v){rsort($v);$m[$k]=$v;}function t($a,$b){if($a==$r=range($x=count($a),1))return 1;elseif($b==$r)return-1;$c=array_pad(array_values(array_count_values($a)),$x,0);$d=array_pad(array_values(array_count_values($b)),$x,0);rsort($c);rsort($d);if($e=$c<=>$d)return$e;return$a<=>$b;}usort($m,t);print_r($m);

分解

$m=$_GET["m"]; # Array as Input
foreach($m as$k=>$v){
    rsort($v); # reverse sort of an item
    $m[$k]=$v; # replace the sort item
}
function t($a,$b){ #sorting algorithm
    if($a==$r=range($x=count($a),1))return 1; # $a is highest value
    elseif($b==$r)return-1; # $b is highest value
    $c=array_pad(array_values(array_count_values($a)),$x,0); 
# prepare check multiple values for fist value
    $d=array_pad(array_values(array_count_values($b)),$x,0); 
# prepare check multiple values for second value
    rsort($c);
    rsort($d);
    if($e=$c<=>$d)return$e; # compare first and second multiples
    return$a<=>$b; # compare dices
}
usort($m,"t"); # start sort
print_r($m); #print sorted array from low to high

0

朱莉娅(489字节)

function a(x,y)l=length;g=collect;s=sort;m=maximum;r=repmat;function b(z)w=sum(r(z,1,m(z)).==r(g(1:m(z))',l(z),1),1);u=zeros(m(w));map(i->if i>0 u[i]+=1;end,w);return u end;function c(x,y)if l(x)>l(y)return-1 elseif l(x)<l(y)return 1 else for i=l(x):-1:1 if x[i]>y[i] return-1 elseif x[i]<y[i] return 1 end end;return 0;end end;x=s(x);y=s(y);if x==y return 0;elseif x==g(1:l(x));return-1 elseif y==g(1:l(y))return 1 else d=c(b(x),b(y));if d==0 return c(x,y);else return d;end end end

可读性:

  1 function a(ds1, ds2)
  2     function countNOfAKind(ds)
  3         # return array. n-th value is number of occurences of n-of-a-kind.
  4         # e.g. findNOfAKind([1, 1, 1, 2, 2, 3, 3]) == [0, 2, 1]
  5         ps = sum(repmat(ds, 1, maximum(ds)) .== repmat(collect(1:maximum(ds))', length(ds), 1), 1);
  6         ls = zeros(maximum(ps));
  7         map(i -> if i>0 ls[i] += 1 end, ps);
  8         return ls
  9     end
 10 
 11     function cmpLex(ds1, ds2)
 12         # compare ds1, ds2 reverse-lexicographically, i.e. compare last distinct value.
 13         if length(ds1) > length(ds2)
 14             return -1
 15         elseif length(ds1) < length(ds2)
 16             return 1
 17         else
 18             for i = length(ds1):-1:1
 19                 if ds1[i] > ds2[i]
 20                     return -1
 21                 elseif ds1[i] < ds2[i]
 22                     return 1
 23                 end
 24             end
 25             return 0;
 26         end
 27     end
 28     
 29     ds1=sort(ds1);
 30     ds2=sort(ds2);
 31     if ds1 == ds2
 32         return 0;
 33     elseif ds1 == collect(1:length(ds1))
 34         return -1
 35     elseif ds2 == collect(1:length(ds2))
 36         return 1
 37     else
 38         d = cmpLex(countNOfAKind(ds1), countNOfAKind(ds2))
 39         if d == 0
 40             return cmpLex(ds1, ds2);
 41         else
 42             return d;
 43         end
 44     end
 45 end

为什么要比较长度?指令说“两个容器的长度相同”。我想念什么吗?
DavidC

我在第31行中删除了长度比较。这不是必需的,但也没有伤害。第15行进行比较是必要的,因为cmpLex不仅在第40行中用于比较原始输入,还在第38行中用于比较countNOfAKind的结果。但是,该函数可能会为相等大小的输入产生不同大小的输出:countNOfAKind([3,2])= [2](因为有两个孤独的数字(3和2)),countNOfAKind([2,2])= [0,1](因为没有孤独号码和一个对。
pasbi
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.