Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python骰子:避免三重重复_Python 3.x_Dice - Fatal编程技术网

Python 3.x Python骰子:避免三重重复

Python 3.x Python骰子:避免三重重复,python-3.x,dice,Python 3.x,Dice,我有一个骰子难题要解决,我的头脑被困在一个场景中 在试验中发生了多少次,恰好有两个6在后面滚动?例如,在序列5661116626634416中,发生了两次,正好有两个6被抛出 问题是:如何避免让计数器计算666。 注意:我尝试了多个跟踪器(键),但我还有另一个问题: 索引器:列表索引超出范围 计数器应该等于2我能想到的一个更简单的方法是在3个连续的6中标记第3个6,用一个不能在掷骰子时出现的整数。e、 g-1 throws=[6,6,2,6,6,6,3,6,6,3,6,6,6] counte

我有一个骰子难题要解决,我的头脑被困在一个场景中


在试验中发生了多少次,恰好有两个
6
在后面滚动?例如,在序列
5661116626634416
中,发生了两次,正好有两个
6
被抛出


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

注意:我尝试了多个跟踪器(键),但我还有另一个问题:

索引器:列表索引超出范围


计数器应该等于2

我能想到的一个更简单的方法是在3个连续的6中标记第3个6,用一个不能在掷骰子时出现的整数。e、 g-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

这个方法当然可以改进。

我能想到的一个更简单的方法是用一个整数在3个连续的6中标记第3个6,这个整数不能在掷骰子时出现。e、 g-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
这种方法肯定可以改进。

将为您提供一组或多或少现成的连续数字:

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)]
您可以将其与组合以获得
(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
将为您提供一组或多或少现成的连续数字:

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)]
您可以将其与组合以获得
(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

一种可能的方法是使用正则表达式。通过这种方法,您可以指定精确的模式,并简单地计算它们出现的次数,另外一个好处是,这也可以用于具有字母或符号的系统的结果

重新导入
抛出=[6,6,2,6,6,6,3,6,6,3,6,6,6]
throws_string=“”.join(str(x)表示throws中的x)#将列表制作成一个字符串,以便能够对其应用正则表达式。
match=re.findall(r“(?:[^6]|\A)(6{2})(?:[^6]|\Z)”,抛出字符串)
断言len(匹配)=2

中间的代码组>(6 { 2 })< /代码>匹配我们需要的,并且它周围的非捕获组确保我们不匹配任何3个或更多个six.code>\A和

\Z
必须匹配字符串的开头和结尾,否则“not A six”
[^6]
将查找其他字符,但找不到任何字符


请注意,Python中的变量名应该使用
snake\u case
,最重要的是,第一个字母应该是小写,以区分变量和类名。

一种可能的方法是使用正则表达式。这样,您可以指定精确的模式,并简单地计算它们出现的次数,另外一个好处是,这也可以用于具有字母或符号的系统的结果

重新导入
抛出=[6,6,2,6,6,6,3,6,6,3,6,6,6]
throws_string=“”.join(str(x)表示throws中的x)#将列表制作成一个字符串,以便能够对其应用正则表达式。
match=re.findall(r“(?:[^6]|\A)(6{2})(?:[^6]|\Z)”,抛出字符串)
断言len(匹配)=2

中间的代码组>(6 { 2 })< /代码>匹配我们需要的,并且它周围的非捕获组确保我们不匹配任何3个或更多个six.code>\A和

\Z
必须匹配字符串的开头和结尾,否则“not A six”
[^6]
将查找其他字符,但找不到任何字符


请注意,Python中的变量名应该使用
snake\u case
,最重要的是,第一个字母应该是小写,以区分变量和类名。

这是一个简单有效的解决方案,无需使用任何扩展库。我们定义的
stack
等于我们看到的连续
6
的数量,每当
6
以外的任何数字出现时(或在我们的抛出循环之后),我们检查
stack
是否等于
2
,如果是,我们增加
计数器6
,并将
stack
重置为
0

throws = [6,6,2,6,6,6,3,6,6,3,6,6,6]
counter_6 = 0
stack = 0

for i in throws:
    if i == 6:
        stack += 1
    else:
        if stack == 2:
            counter_6 += 1
        stack = 0
if stack == 2:
    counter_6 += 1

print(counter_6) # --> 2

这是一个简单高效的解决方案,无需使用任何扩展库。我们定义的
stack
等于我们看到的连续
6
的数量,每当
6
以外的任何数字出现时(或在我们的抛出循环之后),我们检查
stack
是否等于
2
,如果是,我们增加
计数器6
,并将
stack
重置为
0

throws = [6,6,2,6,6,6,3,6,6,3,6,6,6]
counter_6 = 0
stack = 0

for i in throws:
    if i == 6:
        stack += 1
    else:
        if stack == 2:
            counter_6 += 1
        stack = 0
if stack == 2:
    counter_6 += 1

print(counter_6) # --> 2

我认为这个正则表达式在结尾会错过一对6(即
抛出=[6,6]
)谢谢,我更正了它。我忘了包括我在注释中提到的
\Z
。我想这个正则表达式在结尾会遗漏一对6(即
throws=[6,6]
)谢谢,我更正了它。我忘了在笔记中提到的
\Z
。谢谢,这些都是不错的工具,但由于某些原因,我无法使用collections.counter,它会自动变灰(((此检查检测应解析但不解析的名称。由于动态分派和duck类型,在有限但有用的情况下,这是可能的。与实例项相比,支持顶级和类级项更好。))这是一个糟糕的@puzzer-collections是Python标准库的一部分,那里有很多很棒的优化工具。我注意到我在
计数器中有一个小写字母“c”的链接。不确定这是否是问题所在。谢谢,这些工具很好,但由于某些原因我不能使用collections.Counter,它会自动变灰((此检查检测应解析但不解析的名称。由于动态分派和duck类型,在有限但有用的情况下,这是可能的。顶级和类级项目比实例项目更受支持。))这是一个错误@puzzr-collections是t的一部分