Форум » Кодирование и декодирование информации » Задание 8 #184 » Ответить

Задание 8 #184

ингрид: 184) Сколько шестнадцатеричных кодов чисел длиной 12 можно составить, если известно, что цифры идут в порядке убывания, при этом четные и нечетные цифры чередуются? Если решать вручную FEDCBA987654 FEDCBA987652 FEDCBA987650 FEDCBA987632 FEDCBA987630 Вроде перебираю верно, но если так делать, то это долго и 104 варианта вряд ли получу, где-то ошибусь. Можно это сделать вручную и при этом в прямую не перебирая?

Ответов - 11

Поляков: Один из вариантов - делать рекурсивный перебор и ставить следующей цифрой только подходящие (не строить все возможные варианты, их очень много). Например, если очередная цифра - 5, за ней могут стоять только 4, 2 или 0. Считает очень быстро.

Zarema2106: Здравствуйте, Константин Юрьевич! Можно ли добавить свое решение к этой задаче? Возможно кому-то будет полезно.

Поляков: Zarema2106 пишет: Можно ли добавить свое решение к этой задаче? Возможно кому-то будет полезно. Да, конечно. Вот здесь и публикуйте.


Zarema_Sokhova: Использовался подход с рекурсией, описанный в файле егэ8.doc с сайта Полякова К.Ю. c рекурсией: [pre2] def valid( word ): if word[0] =='0': return False for i in range(11): if word[ i ]<word[ i+1 ] or (int(word[ i ],16)%2) == (int(word[ i+1 ],16)%2): return False return True def rec(word, k, Alpha): if len(word) == k: if valid(word): print(word) return 1 return 0 count = 0 for c in Alpha: count += rec( word+c, k, Alpha[Alpha.find(c)+1:] ) return count print( rec( "", 12, "FEDCBA9876543210" ) ) [/pre2] без рекурсии (решение ученика): [pre2] d = "FEDCBA9876543210" count = 0 for i1 in d: for i2 in d[d.index(i1)+1::2]: for i3 in d[d.index(i2)+1::2]: for i4 in d[d.index(i3)+1::2]: for i5 in d[d.index(i4)+1::2]: for i6 in d[d.index(i5)+1::2]: for i7 in d[d.index(i6)+1::2]: for i8 in d[d.index(i7)+1::2]: for i9 in d[d.index(i8)+1::2]: for i10 in d[d.index(i9)+1::2]: for i11 in d[d.index(i10)+1::2]: for i12 in d[d.index(i11)+1::2]: count += 1 print(count)[/pre2]

Поляков: Zarema_Sokhova пишет: Использовался подход с рекурсией, описанный в файле егэ8.doc с сайта Полякова К.Ю. c рекурсией: https://i.postimg.cc/8cymLJm1/2021-09-29-14-41-49.png без рекурсии (решение ученика): https://i.postimg.cc/8kyRKvLG/Xhr-BAZme5-AM.jpg Ну, нехорошо приводить листинги в виде скринов или фото... А если я захочу проверить - заново набирать?

Zarema_Sokhova: Здравствуйте, Константин Юрьевич! Прошу прощения. Сначала не разобралась, как код разместить с отступами. Обнаружила потом. Все исправила.

tla: Здравствуйте! Предлагаю более простой переборный вариант, без строковых функций и срезов (даже массив d можно не задавать, просто написать n=16): [pre2] d = ['F','E','D','C','B','A','9','8','7','6','5','4','3','2','1','0'] n=len(d) count = 0 for i1 in range(n): for i2 in range(i1+1,n,2): for i3 in range(i2+1,n,2): for i4 in range(i3+1,n,2): for i5 in range(i4+1,n,2): for i6 in range(i5+1,n,2): for i7 in range(i6+1,n,2): for i8 in range(i7+1,n,2): for i9 in range(i8+1,n,2): for i10 in range(i9+1,n,2): for i11 in range(i10+1,n,2): for i12 in range(i11+1,n,2): count += 1 print(count) [/pre2]

Mari4727: alph = 'FEDCBA9876543210' N = { # словарь создан для распределения "веса"-значения каждой цифре-ключу, для сравнения их между собой и проверки на чётность 'F': 15, 'E': 14, 'D': 13, 'C': 12, 'B': 11, 'A': 10, '9': 9, '8': 8, '7': 7, '6': 6, '5': 5, '4': 4, '3': 3, '2': 2, '1': 1, '0': 0, } codes = [] # список для получившихся кодов # На первом месте могут стоять только FEDC, на втором - EDCB и т.д. for a in alph[:4]: for b in alph[1:5]: for c in alph[2:6]: for d in alph[3:7]: for e in alph[4:8]: for f in alph[5:9]: for g in alph[6:10]: for h in alph[7:11]: for i in alph[8:12]: for j in alph[9:13]: for k in alph[10:14]: for l in alph[11:]: if (N[a] > N > N[c] > N[d] > N[e] > N[f] > N[g] > N[h] > N > N[j] > N[k]> N[l] ) and \ ((N[a]%2 == 0 and N%2 != 0 and N[c]%2 == 0 and N[d]%2 != 0 and N[e]%2 == 0 and N[f]%2 != 0 and N[g]%2 == 0 and N[h]%2 != 0 and N%2 == 0 and N[j]%2 != 0 and N[k]%2 == 0 and N[l]%2 != 0) or \ (N[a]%2 != 0 and N%2 == 0 and N[c]%2 != 0 and N[d]%2 == 0 and N[e]%2 != 0 and N[f]%2 == 0 and N[g]%2 != 0 and N[h]%2 == 0 and N%2 != 0 and N[j]%2 == 0 and N[k]%2 != 0 and N[l]%2 == 0)): codes.append(a+b+c+d+e+f+g+h+i+j+k+l) print(len(codes))

Mari47277: tla, хотела на форуме посоветоваться по моему ошибочному решению, но увидела ваше! Ближе к 10 вечера мне оно кажется чем-то прекрасным. Спасибо!)

Максим101: def f(s): for i in range(len(s)-1): if s < s[i+1]: return False m = ''.join([str(int(i,16)%2) for i in s]) if '11' in m or '00' in m: return False return True k = 0 for i in ('C','E','B','D','F'): for i1 in ('B','D','A','C','E'): for i2 in ('A','C','B','D','9'): for i3 in ('9','B','8','A','C'): for i4 in ('8','A','7','9','B'): for i5 in ('7','9','6','8','A'): for i6 in ('6','8','5','7','9'): for i7 in ('5','7','4','6','8'): for i8 in ('4','6','3','5','7'): for i9 in ('3','5','2','4','6'): for i10 in ('2','4','1','3','5'): for i11 in ('1','3','0','2','4'): if f(i+i1+i2+i3+i4+i5+i6+i7+i8+i9+i10+i11):k+=1 print(k)

Ж: [pre2] s=''; n=0 def f(s): global n if len(s)<12: for c in [d for d in '0123456789abcdef' if s=='' or int(s[-1],16)%2!=int(str(d),16)%2 and int(s[-1],16)>int(str(d),16) ] : f(s+c) else: n+=1;print(n,s) f('') [/pre2]



полная версия страницы