试图模拟20个骰子随机抛出,代码需要用括号括起一个相同的值,括号出现,但我在公式上遗漏了一些东西,任何建议都可以大大帮助,例如:
1 ( 4 1 ) 2 3 6 1 4 3 2 6 6 6 5 6 2 1 3 5 3 # incorrect 1 4 1 2 3 6 1 4 3 2 ( 6 6 6 ) 5 6 2 1 3 5 3 # this is a correct example
def main():
exampleList = [ ]
for i in range(20):
exampleList.append(randint(1, 6))
print(exampleList)
print(list(range(0,20)))
max_count = 0
run_count = 0
matched = False #inRun = False
# find max run
for rollValue in exampleList:
#print(rollValue)
if run_count == 19:
print()
else:
print("-------")
print("Roll Value %s" % exampleList[run_count])
print("Position %s" % run_count)
print("Next Roll value %s" % exampleList[run_count + 1])
if exampleList[run_count] == exampleList[run_count + 1]:
matched = True
print("------->>>matched")
else:
matched = False#inRun = False
run_count += 1
if rollValue < 19:
if exampleList[rollValue] == exampleList[rollValue + 1]:
run_count += 1
if matched == False:
matched == True
run_count = rollValue
else:
matched = False
if run_count > max_count:
run_count = 1
# print sequence
for rollValue in range(20):
if rollValue == run_count:
print("(", exampleList[rollValue], end = " ")
elif rollValue == run_count + max_count + 1:
print(exampleList[rollValue], ")", end = " ")
else:
print(exampleList[rollValue], end = " ")
main()
答案 0 :(得分:2)
这是使用正则表达式的解决方案。这会在骰子卷上创建一个字符串,然后找到重复的数字并使用re.sub
添加括号。
import re
import random
rolls = ''.join(map(str, [random.choice(range(1, 7)) for _ in range(20)]))
rolls = ' '.join(re.sub(r'(\d)(\1+)', r'(\1\2)', rolls))
print(rolls)
一些样本运行:
4 1 4 3 4 6 5 2 3 ( 5 5 ) 1 6 4 3 5 2 5 ( 4 4 )
2 ( 1 1 ) 4 1 ( 5 5 ) ( 3 3 ) 6 2 ( 1 1 ) 5 1 4 3 4 ( 5 5 )
正则表达式解释:
( // start of matching group 1
\d // matches a single digit
) // end of matching group 1
( // start of matching group 2
\1+ // matches group 1, 1 or more times
) // end of matching group 2
答案 1 :(得分:0)
您的代码存在许多问题,因此重写整个内容的速度更快。
{{1}}
正如您所看到的,我通过使用变量来跟踪我是否在括号内。我期待下一个数字来猜测我是否应该添加一个右括号。
最后一个案例由try-except处理。
您还可以通过向前和向后查看来处理每个号码,但这需要您为try-except部分添加一些额外条件,因此这只是
答案 2 :(得分:0)
有多种方法可以做到这一点,但这与你刚才做的最相似。基本上只是迭代滚动列表的索引。我们检查每个数字以查看它是否与之前的数字相同,如果是,那么我们递增计数并继续前进。如果没有,那么我们添加了许多该数字在计数中的输出。如果有的话,我们会在括号中单独写出来,如果更多的话。
exampleList = [randint(1, 6) for i in range(20)]
# the current number that could be a potential sequence
current = exampleList[0]
# count for the number of occurences in a sequence (often 1)
count = 1
# The string to outpu
output = ''
# Iterate over the rolls, ignoring the first one
for i in range(1, len(exampleList)):
if exampleList[i] == current:
count += 1
else:
if count > 1:
output += ('(' + count * str(current) + ')')
else:
output += str(current)
current = exampleList[i]
count = 1
# Handle final addition
if count > 1:
output += ('(' + count * str(current) + ')')
else:
output += str(current)
print(output)
输出:
64(66)15253(66)2143454(22)
答案 3 :(得分:0)
这会将括号添加为列表的一部分:
#!/usr/bin/python
import sys
from random import randint
# add parenthesis as part of the list
def main():
exampleList = [ ]
previous = -1
opened = False
for i in range(20):
roll = randint(1, 6)
if roll == previous:
if not opened:
exampleList.insert(-1, '(')
opened = True
else:
if opened:
exampleList.append(')')
opened = False
exampleList.append(roll)
previous = roll
if opened:
exampleList.append(')')
for item in exampleList:
sys.stdout.write('{0} '.format(item))
sys.stdout.write('\n')
if __name__ == '__main__':
main()
示例:
( 2 2 ) 4 5 1 2 1 ( 6 6 ) 1 6 1 4 1 ( 6 6 ) 1 6 2 4
2 ( 6 6 ) ( 1 1 ) 3 2 1 ( 4 4 ) 1 2 5 4 1 5 3 ( 5 5 5 )
答案 4 :(得分:0)
逻辑错误是您混淆&#34;运行开始的索引&#34;用&#34;(最后)运行的长度&#34;。
您需要一个像max_run_start_index
这样的变量。
查看代码:
if rollValue == run_count:
print("(", exampleList[rollValue], end = " ")
如果下一个输出的索引等于 last 运行的长度,请在它之前输出开放括号&#39>将它读回给自己&#39; ;
因此,如果最后一次运行的长度是3,则最长运行从索引3开始? 当然不是......
我不是Python程序员,所以你需要自己解决它...