Python骰子:避免重复三次

时间:2019-04-13 06:37:50

标签: python-3.x dice

我解决了这个DICE难题,而且我的想法一直停留在场景上。


在试验中发生了多少次,恰好有两个6互相滚动?例如,在序列56611166626634416中发生了两次,恰好是两个6互相抛出。


问题是:如何避免让计数器计算那些666。

注意:我尝试了多个跟踪器(键),但是又遇到了另一个问题:

  

IndexError:列表索引超出范围

Throws=[6,6,2,6,6,6,3,6,6,3,6,6,6]
Counter_6 = 0
X=0


for i in range (0,len(Throws)):

    if i==len(Throws) or i+1>len(Throws) or i+2>len(Throws):
        key1= Throws[i]
        key2=0
        key3=0

    elif i+2>=len(Throws):
        key1 = Throws[i]
        key2 = Throws[i + 1]
        key3 = 0

    else:
        key1=Throws[i]
        key2 = Throws[i + 1]
        key3 = Throws[i + 2]
    print("key 1 is", key1)
    print("key 2 is", key2)
    print("key 3 is", key3)

    if key1==6 and key2==6 and key3!=6 and X==0:
        Counter_6 = Counter_6 + 1
        X=1
    elif key1!=6 and key2 ==6 and key3==6 and X==0:
        Counter_6 = Counter_6 + 1
        X=1
    elif key1==6 and key2==6 and key3==6:
        Counter_6 = Counter_6
        X=0

print("number of double 6 are: ",Counter_6)

计数器应等于2

4 个答案:

答案 0 :(得分:2)

itertools.groupby()将为您提供或多或少的连续数字组:

from itertools import groupby

throws =  [6,6,2,6,6,6,3,6,6,3,6,6,6]
[tuple(v) for k,v in groupby(throws)]

>> [(6, 6), (2,), (6, 6, 6), (3,), (6, 6), (3,), (6, 6, 6)]

您可以将其与collections.Counter结合以获取(6,6)元组的计数:

from itertools import groupby
from collections import Counter

throws =  [6,6,2,6,6,6,3,6,6,3,6,6,6]
c = Counter(tuple(v) for k,v in groupby(throws))
c[(6,6)]

>> 2

答案 1 :(得分:0)

我能想到的一种更简单的方法是用一个在掷骰子中不会出现的整数来标记3个连续六分之三中的第三个六分之一。例如-1

throws=[6,6,2,6,6,6,3,6,6,3,6,6,6]
counter = 0

for i in range (0, len(throws)-2):

    if throws[i] == 6 and throws[i+1] == 6:
        if throws[i+2] == 6:
            throws[i+2] = -1
print(throws)
#[6, 6, 2, 6, 6, -1, 3, 6, 6, 3, 6, 6, -1]

此后,您可以遍历列表,并在遇到两个连续的6且第三个元素不是-1时创建计数器。

for i in range (0, len(throws)-2):

    if throws[i] == 6 and throws[i+1] == 6 and throws[i+2] != -1:
        counter+=1

print(counter)
#2

可以肯定地完善这种方法。

答案 2 :(得分:0)

一种可能的方法是使用正则表达式。这样,您可以指定精确的模式并简单地计算它们发生了多少次,其附加的优点是它也可以用于具有以下特征的系统的结果字母或符号。

import re

throws = [6, 6, 2, 6, 6, 6, 3, 6, 6, 3, 6, 6, 6]

throws_string = "".join(str(x) for x in throws)  # Make the list into a string to be able to apply regex to it.

match = re.findall(r"(?:[^6]|\A)(6{2})(?:[^6]|\Z)", throws_string)

assert len(match) == 2

(6{2})中间的捕获组符合我们的需求,周围的非捕获组确保我们不匹配3个或更多6个点的任何簇。必须使用\A\Z来匹配字符串的开头和结尾,否则“不是六个” [^6]将寻找一个不同的字符而找不到任何字符。

请注意,Python中的变量名应使用snake_case,并且至关重要的是,首字母应小写以区分变量和类名。

答案 3 :(得分:0)

这是简单有效的解决方案,无需使用任何扩展库。我们定义stack等于我们看到的连续6的数量,每次出现6以外的任何数字时(或遍历抛出之后),我们检查是否{ {1}}等于stack,如果是,我们将2递增,并将counter_6重置为stack

0