Определите количество пятизначных шестнадцатеричных чисел, в записи которых ровно одна цифра из набора 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 шт):

Автор решения: MBo

Если нужно именно сгенерировать все возможные числа и отобрать нужные, то достаточно перебрать символы строки, увеличивая счётчик на цифрах 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 вариантов.

→ Ссылка