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的一部分