что не так с текущей реализацией (генерация списка монет)
В коде, который генерирует ваш список, вы создаете пустой список для каждой записи, которая должна быть в вашем списке.
for i in range(100):
coin_list=[] # <-- here you create an empty list
random_num=random.randint(0, 1)
if random_num == 1:
coin_list.append('H')
elif random_num == 0:
coin_list.append('T')
проверка длины списка монет:
len(coin_list)
output: 1
идеи, как это исправить
Это можно исправить, определив список за пределами l oop:
coin_list=[]
for i in range(100):
random_num=random.randint(0, 1)
if random_num == 1:
coin_list.append('H')
elif random_num == 0:
coin_list.append('T')
Поскольку вы все равно используете random
, вы можете посмотреть random.choice
:
coin_list = []
coins = ['H', 'T']
for i in range(100):
coin_list.append(random.choice(coins))
В обоих исправленных случаях длина списка равна 100.
что не так с подсчетом полос
Далее, streak_counter
не определено до ссылки, поэтому должно быть определено:
streak_counter = 0
L oop Если вы напишете для проверки наличия полос, вы столкнетесь со следующей ошибкой:
IndexError: list index out of range
Это потому, что вы пропустили x
от 0 до длины вашего списка -1, но затем использовали x + 2,3, 4,5 для доступа к элементам списка. Когда ваш l oop достигнет 4-го элемента в конце списка, он попытается получить доступ к элементу вне списка, что приведет к ошибке.
for x in range(0, len(coin_list)-1):
if coin_list[x] == coin_list[x+1] and coin_list[x] == coin_list[x+2] and \
coin_list[x] == coin_list[x+3] and coin_list[x] == coin_list[x+4] and \
coin_list[x] == coin_list[x+5]: # < -- here you are accessing x+5
streak_counter+=1
else:
continue
if streak_counter ==6:
numberOfStreaks+=1
streak_counter=0
else:
continue
Исправление для этого было бы позволить x
работать от 0 до len(list)-5
, это позволило бы завершить l oop. Тем не менее, способ проверки полосы является немного своеобразным:
for x in range(0, len(coin_list)-5):
print(x)
if coin_list[x] == coin_list[x+1] and coin_list[x] == coin_list[x+2] and \
coin_list[x] == coin_list[x+3] and coin_list[x] == coin_list[x+4] and \
coin_list[x] == coin_list[x+5]:
streak_counter+=1
else:
continue
Оператор if
проверяет, есть ли шесть последовательных идентичных записей в вашем списке. Если это так, вы увеличиваете streak_counter
.
Далее вы проверяете, является ли streak_counter
6
, затем вы считаете это штрихом и шагом numberOfStreaks
.
if streak_counter ==6:
numberOfStreaks+=1
streak_counter=0
else:
continue
Проблема в том, что для streak_counter, равного 6, условие if coin_list[x] == ...
должно быть выполнено шесть раз. Итак, вам нужно как минимум 11 последовательных идентичных значений, чтобы зарегистрировать полосу из шести.
пытается исправить это
Теперь, как решить эту проблему, я думаю, зависит от того, как вы считаете полосы: последовательность из 7 голов одна полоса из семи или две полоски из шести?
Для первого случая вы могли бы сделать что-то вроде этого:
s = ''.join(coin_list) # convert everything to string
tails_streaks = []
heads_streaks = []
for tails in s.split('H'): # remove all heads and check if what remains is at least 6 long
if len(tails) >=6:
tails_streaks.append(len(tails))
for heads in s.split('T'): # ditto for tails
if len(heads) >=6:
heads_streaks.append(len(heads))
Если вы хотите сосчитать все вхождения из шести последовательных идентичных результатов (что означает подсчет одной монеты несколько раз):
tails_sixes = []
heads_sixes = []
for tails in s.split('H'):
if len(tails) >=6:
tails_sixes += 1 + len(tails) - 6
for heads in s.split('T'):
if len(heads) >=6:
heads_sixes += 1 + len(tails) - 6