Форум » Кодирование и декодирование информации » ege5 Р-13 (демо-2021). » Ответить

ege5 Р-13 (демо-2021).

s11kai: Всем добрый вечер, предлагаю обсудить решение к задаче ege5 Р-13 (демо-2021) отличающееся от программы (П.Е. Финкель, г. Тимашевск) тем, что здесь каждой строке соответствует одновременное выполнение нескольких действий. Так например, строки: 2) kod0 = bin(i)[2:] - переводит значение i в двоичный код и сохраняет его в переменной - kod0 3) kod1 = kod0 + str(kod0.count('1')%2) - подсчитывает количество «1» в двоичном коде kod0, затем формирует новый код - kod1 с добавлением к нему бита четности либо «0» либо «1» 4) kod2 = kod1 + str(kod1.count('1')%2) - подсчитывает количество «1» в двоичном коде kod1, затем формирует новый двоичный код - kod2 с добавлением к нему бита четности либо «0» либо «1» 5) Переводит двоичный код в десятичное число и сравнивает найденное значение с указанным значением в условии… 6) Выводит на печать не только итоговые значения, но и демонстрирует промежуточные значения для визуального контроля [pre2] for i in range(1,70): kod0 = bin(i)[2:] kod1 = kod0 + str(kod0.count('1')%2) kod2 = kod1 + str(kod1.count('1')%2) if int(kod2,2)>77: print('N=',i,'R=',int(kod2,2),'0 =',kod0,'1 =',kod1,'2 =',kod2) break [/pre2] N= 19 R= 78 0 = 10011 1 = 100111 2 = 1001110

Ответов - 19, стр: 1 2 All

s11kai: 5solve-145 [pre2] for i in range(5,80): kod = bin(i)[2:] kod1 = kod + str(i%2) if kod.count('1')%2 == 0: kod1 = kod1+'00' else: kod1 = kod1+'11' if int(kod1,2)>80: print('N = ',i,'R =',int(kod1,2)) break [/pre2] N = 11 R = 95

Винникова: s11kai пишет: предлагаю обсудить решение к задаче ege5 Р-13 (демо-2021) Тоже так делаю. Но 4) пункт пропускаю, просто прибавляя в 3) пункте '0'. Последний бит всегда будет равен 0. s11kai пишет: 5solve-145 Не поняла, что за задача. С условием из файла ege5 № 145 не сходится.

s11kai: Винникова пишет: Не поняла, что за задача. С условием из файла ege5 № 145 не сходится. ege5 145 На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. 1) Строится двоичная запись числа N. 2) К этой записи дописывается (дублируется) последняя цифра. 3) Затем справа дописывается 0, если в двоичном коде числа N чётное число единиц, и 1, если нечётное. 4) К полученному результату дописывается ещё один бит чётности так, чтобы количество единиц в двоичной записи полученного числа стало чётным. Полученная таким образом запись (в ней на три разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R. Укажите минимальное число R, большее 80, которое могло получиться в результате работы автомата. В ответе это число запишите в десятичной системе.


Marия: flag=0 def r(n): n=bin(n)[2:] n=n+n[-1] if n.count('1')%2==0: n+='0' else: n+='1' if n.count('1')%2==1: n+='1' if n.count('1')%2==0: flag=1 return int(n,2) a=[] for n in range (1000): if r(n)>80: a.append(r(n)) print(min(a))

s11kai: Marия пишет: flag=0 def r(n): ... a.append(r(n)) print(min(a)) С вашего позволения, Мария, отформатирую ваш код для его понимания: [pre2] flag=0 def r(n): n=bin(n)[2:] n=n+n[-1] if n.count('1')%2==0: n+='0' else: n+='1' if n.count('1')%2==1: n+='1' if n.count('1')%2==0: flag=1 return int(n,2) a=[] for n in range (1000): if r(n)>80: a.append(r(n)) print(min(a)) [/pre2] Запустив программу на исполнение, получаем ответ 86 , хотя должно быть 95, если разговор о задаче 140 Кроме того, возник вопрос, для чего используется переменная flag, неужели только для того, чтобы перевести ее из состояния false в состояние true? Удаляем три строки, выделенные красным цветом, и запустив программу, убеждаемся что ответ остался тем же, стало быть эти три строки были лишними, чуть подправим программу, примерно так: [pre2] for n in range(1,100): # в цикле от 1 до 99 будем выполнять алгоритм s = bin(n)[2:] # Строится двоичная запись числа N ss=s+str(n%2) # К этой записи дописывается (дублируется) последняя цифра if s.count('1')%2==0: sss=ss+'0' # справа дописываем 0, если в двоичном коде числа N чётное число 1 else: sss=ss+'1' # справа дописываем 1, если в двоичном коде числа N нечётное число 1 if sss.count('1')%2==0: # если результат работы алгоритма содержит четное количество 1 sss=sss+'0' # справа дописываем 0 else: sss=sss+'1' # иначе справа дописываем 1 if int(sss,2)>80: # если десятичное значение двоичного кода больше 80 print(n,int(sss,2)) # выводим его на печать break Ответ: 95 [/pre2]

s11kai: Винникова пишет: ... 4) пункт пропускаю, просто прибавляя в 3) пункте '0'. Последний бит всегда будет равен 0. увы, последним нолик будет не всегда и далеко ходить не надо,вот, например, ege5 146: s11kai пишет: N = 17 R = 141 kod0 10001 kod 10001101

Винникова: s11kai пишет: увы, последним нолик будет не всегда, вот например: Не поняла, то ли я так читала, но под № 145 я увидела условие задачи 146. Но не важно. Вот ваш пример, как раз из задачи 146. А я про последний нолик говорила применительно к ege5 Р-13 (демо-2021). Но, Вы молодец)) я сначала формулировку "...если в двоичном коде числа N... " мимо ушей пропустила))

s11kai: Винникова пишет: Не поняла, то ли я так читала, но под № 145 я увидела условие задачи 146. нет, это я виноват, действительно перепутал программы

s11kai: Винникова пишет: Но, Вы молодец)) я сначала формулировку "...если в двоичном коде числа N... " мимо ушей пропустила)) спасибо кое как понял, о чем это вы из за этого если в двоичном коде числа N, почти весь вечер убил, пока не догадался сопоставлять пошагово каждую строку кода с алгоритмом...

s11kai: Винникова пишет: Тоже так делаю. с удовольствием посмотрю ваш код, поделитесь ссылочкой

Винникова: s11kai пишет: с удовольствием посмотрю ваш код, поделитесь ссылочкой 5 Р-07 [pre2] for n in range(8, 64): a1 = bin(n)[2:] r = a1 + str(a1.count('1') % 2) + '0' if int(r, 2) > 43: print(int(r, 2)) break [/pre2]

s11kai: Винникова пишет: 5 Р-07 [pre2] for n in range(8, 64): a1 = bin(n)[2:] r = a1 + str(a1.count('1') % 2) + '0' if int(r, 2) > 43: print(int(r, 2)) break [/pre2] Все так просто, поневоле хочется воскликнуть, "а что, так можно было!" Жаль, что вы свой код опубликовали позже, чем я до него "дотумкался", сколько времени было бы сэкономлено мною Да и не только мною, но и другими "жаждущими"

s11kai: s11kai пишет: Все так просто, поневоле хочется воскликнуть, "а что, так можно было!" и все же, меня не покидает сомнение и вот почему: получается, что вы в данной строке: r = a1 + str(a1.count('1') % 2) + '0' подменили пункт б предложенного алгоритма: б) над этой записью производятся те же действия – справа дописывается остаток от деления суммы её цифр на 2. на б) к этой записи - справа дописывается 0 а это "не совсем есть хорошо", поскольку алгоритм должен выполняется исполнителем, но не изменяться или подменяться им. Впрочем, я могу и ошибаться

Винникова: s11kai пишет: и все же, меня не покидает сомнение Так можно сделать применительно только к такому типу заданий (например, Р-07, Р-13). Если строка была, например, 1001, то станет 10010, затем, 100100, а если была 1011, то станет 10111, затем 101110. Первый бит четности (пункт а) делает число четным. В задачах 145, 146 задание другое

s11kai: Винникова пишет: Винникова пишет: Так можно сделать применительно только к такому типу заданий (например, Р-07, Р-13). Если строка была, например, 1001, то станет 10010, затем, 100100, а если была 1011, то станет 10111, затем 101110. Первый бит четности (пункт а) делает число четным. В задачах 145, 146 задание другое Спасибо, возьму на вооружение



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