Определите количество пятизначных шестнадцатеричных чисел, в записи которых ровно одна цифра из набора 0...9
Как решить данную задачу? Помогите, пожалуйста. Мне нужно через itertools и product. Я смог решить, но получается очень массивно. Можно ли как- то короче и роще сделать?
from itertools import *
k = 0
for x in product('0123456789abcdef', repeat = 5):
s = ''.join(x)
if s[0] != '0' and ((s.count('0') == 1 and (s.count('1') + s.count('2') + s.count('3') +s.count('4') +s.count('5') +s.count('6') +s.count('7') +s.count('8') +s.count('9')) == 0)\
or (s.count('1') == 1 and (s.count('0') + s.count('2') + s.count('3') +s.count('4') +s.count('5') +s.count('6') +s.count('7') +s.count('8') +s.count('9')) == 0)\
or (s.count('2') == 1 and (s.count('0') + s.count('1') + s.count('3') +s.count('4') +s.count('5') +s.count('6') +s.count('7') +s.count('8') +s.count('9')) == 0)\
or (s.count('3') == 1 and (s.count('0') + s.count('2') + s.count('1') +s.count('4') +s.count('5') +s.count('6') +s.count('7') +s.count('8') +s.count('9')) == 0)\
or (s.count('4') == 1 and (s.count('0') + s.count('2') + s.count('3') +s.count('1') +s.count('5') +s.count('6') +s.count('7') +s.count('8') +s.count('9')) == 0)\
or (s.count('5') == 1 and (s.count('0') + s.count('2') + s.count('3') +s.count('4') +s.count('1') +s.count('6') +s.count('7') +s.count('8') +s.count('9')) == 0)\
or (s.count('6') == 1 and (s.count('0') + s.count('2') + s.count('3') +s.count('4') +s.count('5') +s.count('1') +s.count('7') +s.count('8') +s.count('9')) == 0)\
or (s.count('7') == 1 and (s.count('0') + s.count('2') + s.count('3') +s.count('4') +s.count('5') +s.count('6') +s.count('1') +s.count('8') +s.count('9')) == 0)\
or (s.count('8') == 1 and (s.count('0') + s.count('2') + s.count('3') +s.count('4') +s.count('5') +s.count('6') +s.count('7') +s.count('1') +s.count('9')) == 0)\
or (s.count('9') == 1 and (s.count('0') + s.count('2') + s.count('3') +s.count('4') +s.count('5') +s.count('6') +s.count('7') +s.count('8') +s.count('1')) == 0)):
k += 1
print(k)
Ответы (1 шт):
Если нужно именно сгенерировать все возможные числа и отобрать нужные, то достаточно перебрать символы строки, увеличивая счётчик на цифрах 0..9 (проверку я сделал примитивную, быстрее будет проверять if c < 'a'
или вхождение в set).
Отбрасываются строки, начинающиеся с нуля (они не являются пятизначными hex-числами)
from itertools import *
k = 0
for x in product('0123456789abcdef', repeat = 5):
s = ''.join(x)
n = 0
if s[0] != "0":
for c in s:
if c in '0123456789':
n += 1
if n > 1:
break
if n==1:
k+=1
print(k)
А вот как можно похитрее получить результат:
print((9+4*10)*6**4)
Логика такая - если цифра идет первой, она может принимать 9 значений, иначе 10 значений. Остальные 4 позиции заняты буквами, для каждой 6 вариантов.