На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение





Сообщение: 146
ссылка на сообщение  Отправлено: 09.04.22 04:22. Заголовок: задание 5 из 5 варианта генератора


Здравствуйте, Константин Юрьевич!
Решая 5 задание 5 варианта из генератора, отталкивался от предложенного решения за № 184 ege5.doc,
 
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

К сожалению, так и не смог понять, для чего нужна эта строка:doInversion = True, если программа и без нее работает ...
Пришлось искать другие пути.
К своему удивлению нашел более короткие и понятные для себя алгоритмы, буду рад, если Вы сочтете возможным какое - либо из них опубликовать, в крайнем случае, может они помогут таким же как я, начинающим "питонистам" форума

решение 184 задания перебором 1:
  
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 )

решение 184 способ 2:
  
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)

решение 184 задания с конца:
  
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)

или
  
s = "{:08b}".format(18)
s = s.replace('1', 'k')
s = s.replace('0', '1')
s = s.replace('k', '0')
print(int(s,2)+1)

Отсда и аналогичные решения для задания 5 варианта 5
 
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)

и
 
s = bin(220)[2:]
s = s.replace('1', 'k')
s = s.replace('0', '1')
s = s.replace('k', '0')
print(int(s,2))

Спасибо!
С уважением, Александр

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 5 [только новые]


Администратор




Сообщение: 3444
ссылка на сообщение  Отправлено: 09.04.22 08:55. Заголовок: s11kai пишет: К сожа..


s11kai пишет:
 цитата:
К сожалению, так и не смог понять, для чего нужна эта строка:doInversion = True, если программа и без нее работает ...

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

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 147
ссылка на сообщение  Отправлено: 09.04.22 11:27. Заголовок: Поляков пишет: хитр..


Поляков пишет:

 цитата:
хитрО сделана инверсия через замены


Увы, инверсия через замены, к сожалению - не моя идея, заметил ее на стриме у Алексея Кабанова, ее предложил кто-то из участников.

Спасибо!

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 148
ссылка на сообщение  Отправлено: 10.04.22 02:59. Заголовок: Оказывается, что инв..



 цитата:
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, например так:
 
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)

А в конкретном примере это сделать еще проще, например так:
 
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)


Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 187
ссылка на сообщение  Отправлено: 21.11.22 15:18. Заголовок: оказывается можно ещ..


оказывается можно еще короче, например так!
 
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)


Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 188
ссылка на сообщение  Отправлено: 21.11.22 15:44. Заголовок: забыл сказать что, и..


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 522
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет