Форум » Выполнение и анализ алгоритмов для исполнителей » задание 5 из 5 варианта генератора » Ответить

задание 5 из 5 варианта генератора

s11kai: Здравствуйте, Константин Юрьевич! Решая 5 задание 5 варианта из генератора, отталкивался от предложенного решения за № 184 ege5.doc, [pre2] def alg( x ): s = "{:08b}".format(x-1) s1 = "" doInversion = True for c in reversed(s): if c == '1': s1 = '0' + s1 else: s1 = '1' + s1 return int(s1,2) for i in range(1, 256): print( i, alg(i) ) if alg(i) == 18: break [/pre2] К сожалению, так и не смог понять, для чего нужна эта строка:doInversion = True, если программа и без нее работает ... Пришлось искать другие пути. К своему удивлению нашел более короткие и понятные для себя алгоритмы, буду рад, если Вы сочтете возможным какое - либо из них опубликовать, в крайнем случае, может они помогут таким же как я, начинающим "питонистам" форума решение 184 задания перебором 1: [pre2] for i in range(1, 256): s = "{:08b}".format(i-1) s = s.replace('1', '2') s = s.replace('0', '1') s = s.replace('2', '0') if int(s,2) == 18: print( i ) [/pre2] решение 184 способ 2: [pre2] for i in range(1,256): x = bin(i-1)[2:] s = '0'*(8-len(x))+x s = s.replace('1', '2') s = s.replace('0', '1') s = s.replace('2', '0') if int(s,2)==18: print('Решение перебором:',i) [/pre2] решение 184 задания с конца: [pre2] x=bin(18)[2:] s = '0'*(8-len(x))+x s = s.replace('1', 'k') s = s.replace('0', '1') s = s.replace('k', '0') print('Решение с конца:',int(s,2)+1) [/pre2] или [pre2] s = "{:08b}".format(18) s = s.replace('1', 'k') s = s.replace('0', '1') s = s.replace('k', '0') print(int(s,2)+1) [/pre2] Отсда и аналогичные решения для задания 5 варианта 5 [pre2] for i in range(10,100): x=bin(i)[2:] s = '0'*(8-len(x))+x s = s.replace('1', 'k') s = s.replace('0', '1') s = s.replace('k', '0') x=int(s,2)+1 if x==221: print('Решение перебором',i) [/pre2] и [pre2] s = bin(220)[2:] s = s.replace('1', 'k') s = s.replace('0', '1') s = s.replace('k', '0') print(int(s,2)) [/pre2] Спасибо! С уважением, Александр

Ответов - 5

Поляков: s11kai пишет: К сожалению, так и не смог понять, для чего нужна эта строка:doInversion = True, если программа и без нее работает ... Да, конечно, эта строка не нужна. Осталась от решения другой задачи (5.188). Спасибо за краткие варианты решения, хитрО сделана инверсия через замены. Вечером добавлю их в файл 5-184.py.

s11kai: Поляков пишет: хитрО сделана инверсия через замены Увы, инверсия через замены, к сожалению - не моя идея, заметил ее на стриме у Алексея Кабанова, ее предложил кто-то из участников. Спасибо!

s11kai: def alg( x ): s = "{:08b}".format(x-1) s1 = "" doInversion = True for c in reversed(s): if c == '1': s1 = '0' + s1 else: s1 = '1' + s1 return int(s1,2) for i in range(1, 256): print( i, alg(i) ) if alg(i) == 18: break Вдруг, кому пригодится, вот еще один алгоритм инверсии в три строки но без замены, для этого нужно отказаться от использования дополнительной переменной s1, например так: [pre2] for i in range(1, 240): s = "{:08b}".format(i-1) for c in range(len(s)): if s[c] == '0': s = s + '1' else: s = s + '0' if int(s[len(s)//2:],2) == 18: print(i) [/pre2] А в конкретном примере это сделать еще проще, например так:[pre2] for i in range(1, 240): s = "{:08b}".format(i-1) for c in range(len(s)): if s[c] == '0': s = s + '1' else:s = s + '0' if int(s[8:],2) == 18: print(i)[/pre2]


s11kai: оказывается можно еще короче, например так! [pre2] for i in range(256): s = (i-1)^255 if s == 18: print( i ) или, даже так: for i in range(256): if (i-1)^255 == 18: print(i) [/pre2]

s11kai: Забыл сказать - идею использования маски подсказал Михлин Б.С., за что ему огромное спасибо!



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