Как улучшить условие проверки на цифры в строке?
Элементы последовательности - четырёхзначные натуральные числа. Найдите все тройки элементов последовательности, для которых десятичная запись произведения всех чисел тройки содержит все 10 цифр (0..9), а сумма всех чисел тройки меньше, чем сумма цифр всех чисел в файле. В ответе запишите количество найденных троек, затем минимальную из сумм элементов таких троек. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.
Реализовал программу вот так, но условие на проверку всех подходящих чисел получилось уж слишком большим и некрасивым, как я могу его сократить?
file = open("17-316.txt")
all_numb = 51686818
count = 0
minimum = 99**99
pred1 = ""
pred2 = ""
for x in file:
x = int(x)
if pred1 != "":
if pred2 != "":
prod = str(x * pred2 * pred1)
if (x + pred2 + pred1) < all_numb and (prod.count("0") > 0 and prod.count("1") > 0 and prod.count("2") > 0 and prod.count("3") > 0 and prod.count("4") > 0 and prod.count("5") > 0 and prod.count("6") > 0 and prod.count("7") > 0 and prod.count("8") > 0 and prod.count("9") > 0):
count += 1
if minimum > (pred1 + pred2 + x):
minimum = (pred1 + pred2 + x)
pred2 = pred1
pred1 = x
print(count, minimum)
Ответы (2 шт):
Можно воспользоваться встроенной функцией all:
if (x + pred2 + pred1) < all_numb and all(str(i) in prod for i in range(10)):
...
Вместо prod.count("0") > 0 лучше проверять "0" in prod - это быстрее, так как не нужно искать все нули, а достаточно проверить, что есть хотя бы один.
k=0
a=[]
f=open('17-316.txt')
n=list(map(int,f.readlines()))
y=sum(n)
for i in range(2,len(n)):
p=str(n[i-2]*n[i-1]*n[i])
sp=n[i-2]+n[i-1]+n[i]
if ('0' in p)and('1'in p)and('2'in p)and('3'in p)and('4'in p)and('4'in p)and('5'in p)and('6'in p)and('7'in p)and('8'in p)and('9'in p):
if sp<y:
k+=1
a.append(sp)
print(k,min(a))