分析超支洗牌


13

Rod正在主持两个玩家George和Tim之间的纸牌游戏。目前,蒂姆正在洗牌。Rod怀疑Tim可能在作弊,因此他需要您的帮助来检查改组是否公平。

蒂姆(Tim)正在进行过度的洗牌:他从牌组的底部切出一堆纸牌,然后从牌堆的顶部切至卡牌的顶部,切开各个部分,然后重复该过程几次。

Rod眼神敏锐,可以确切地看到Tim每次切出多少张牌,但是他无法计算和跟踪Tim洗牌的速度。这就是您要进入的地方:Rod希望您编写一个程序或函数来获取详细的改组信息,并确定改组是公平的,微弱的还是技巧性的。

  • 如果改组后,少于25对相邻纸牌保持相邻(以相同顺序),则改组是公平的,游戏可以继续进行。
  • 如果至少有25对(但不是全部)对相邻纸牌保持相邻,则混洗很弱,Rod会在Tim的头上猛击,并要求他再混洗一些。
  • 如果最后所有牌都保持在同一位置,那么蒂姆显然在作弊,罗德将用一条大鳟鱼击打他。

这是代码高尔夫球,所以最短的代码获胜。

输入:

在几行中,您将获得一系列介于0和52之间的数字(均为排他性数字),各行之间用空格隔开,其中每行代表一轮洗牌,其开始和结束时都是将所有牌堆在一起。

在每一行中,第一个数字是Tim从牌组底部切下的纸牌数,随后的每个数字是他从他的手掉到牌组顶部的纸牌数。如果一行中最后一个数字之后还剩下任何纸牌,则应假定Tim将其放在牌组的顶部。

输入保证有效。至少有一行数字,每行至少包含两个数字。每行上的第一个数字不少于同一行上所有其他数字的总和。尾随换行符是可选的,您可以假定输入有一个或没有输入。

输出:

如果随机播放正常,则程序应打印/返回“正常”;如果随机播放较弱,则打印/返回“弱”;如果Tim保持所有卡的顺序相同,则打印/返回“特技”。尾随换行符是可选的。

例:

假设套牌有52张牌,但是出于演示目的,我将使用10张牌的小套牌。

输入:

5 3 1
4 2 2

初始甲板,从顶部观察:0 1 2 3 4 5 6 7 8 9
50 1 2 3 45 6 7 8 9手)
35 6 7 0 1 2 3 48 9手)
18 5 6 7 0 1 2 3 49手)
线➜的端9 8 5 6 7 0 1 2 3 4
49 8 5 6 7 01 2 3 4手)
21 2 9 8 5 6 7 03 4手)
23 4 1 2 9 8 5 6 7 0
4对保持相邻:(3 4) (1 2) (5 6) (6 7)

测试用例:

43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5

输出: fair


43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5

输出: weak


29 24
19 18
38 2 1 8 13 6 4
47 15 16 5 2 1 7
34 22 9 3
44 9 10 11 3 1 7
33 18 4 2 3 3

输出: fair


24 6 12 4
25 3 19
36 4 25 2
19 11 1 3
15 9 3
37 5 27

输出: weak


26 13
26 13
26 13
26 13

输出: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

输出: weak


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

输出: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
49 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

输出: fair

要求:

  • 如果编写函数,则它可以从标准输入中读取或作为单个字符串参数接收输入。同样,该函数可以打印输出或返回输出。
  • 该程序必须在Linux上使用免费软件运行。
  • 源代码只能使用ASCII字符。
  • 没有标准漏洞。

2
为什么要限制为ASCII?许多语言(APL,机器代码,TI-BASIC)根本不使用ASCII,因此您暗中禁止使用这些语言。
lirtosiast 2015年

@ThomasKwa因为我不喜欢与显示和计数非ASCII字符相关的问题。这些语言中的某些具有ASCII表示形式或替代形式。我认为这不是一个非常苛刻的限制,并且可以在一定程度上平息比赛环境。
aidtsu退出是因为SE为EVIL,2015年

我认为,如果您想激励可打印的ASCII提交,那么像“仅使用可打印的ASCII字符的条目的字节数乘以log(95)/ log(256)”这样的评分系统将是一个更好的选择。原因是得分相同的条目的信息内容将相等。就个人而言,我仍然希望按字节进行简单的评分。
lirtosiast

@ThomasKwa好的,这怎么样?仅可打印的unicode字符,以UTF-8编码计数字节
由于SE为EVIL,因此退出退出是

Answers:




2

JavaScript中,292个 289字节

这可能会挤出更多的字节,但这是目前的快速第一步:

d=[];for(i=0;i<52;i+=1)d[i]=i
s=prompt().split('\n')
s.forEach(function(e,i){s[i]=e.split(' ')
h=d.splice(-s[i][0],99)
for(j=1;j<s[i].length;j+=1)d.unshift.apply(d,h.splice(0,s[i][j]))
d.unshift.apply(d,h)})
for(c=0;i>1;i-=1)if(d[i-2]==d[i-1]-1)c+=1
alert(c<25?"fair":c<51?"weak":"trick")

编辑:i在计算相邻卡的数量时,通过重用套牌构建循环中的值来节省3个字节。

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.