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

B5 №309

GasDM21: Возможно в задании содержится ошибка. Или неверно расписан пример работы алгоритма. Или наблюдается двоякость толкования задания. Из задания: Например, для числа 13 двоичные коды цифр: 1 = 00012, 3 = 00112. С добавленными битами чётности: 00011 и 00110, результат шага 1: 0001100110. Заменяем два левых разряда на 1 и добавляем справа 0: 10110011002 = 716. В примере заменен только один крайний левый разряд. Возможно два толкования условия: 1. вместо двух первых разрядов добавляется одна 1, 2. каждый из двух первых разрядов заменяется на 1.

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

s11kai: GasDM21 пишет: Возможно в задании содержится ошибка. Или неверно расписан пример работы алгоритма. Или наблюдается двоякость толкования задания. нет там ошибок! GasDM21 пишет: Заменяем два левых разряда на 1 и добавляем справа 0: 1011001100 = 716. В примере заменен только один крайний левый разряд. а ничего, что слева было три 0, а стал 1 GasDM21 пишет: результат шага 1: 0001100110. Результата, т.е. ответ можно получить двумя способами либо в лоб - перебором, либо пошагово от обратного, например так: Пишем команду в питоне и запускаем ее на выполнение: print(bin(674890)[2:]) получаем двоичный код: 1010000110001001010 удаляем правый нолик и разбиваем код на пятерки 1010 01001 10001 00101 Убираем справа от каждой группы по единице кроме левой, где справа стоит 0, который говорит, что до замены двух левых символов было ровно две 1, поэтому убираем справа 0, а слева, наоборот - добавляем 0 0101 0100 1000 0010 Получили 4 тетрады, декодируя которые получаем число 5 4 8 2

GasDM21: Спасибо за пояснение. Надеюсь на экзамене такого не будет.

s11kai: GasDM21 пишет: Надеюсь на экзамене такого не будет. Думаю, что это гораздо проще, чем написать код! Например, автор предлагает такое решение: [pre2] def alg( n ): s = '' for d in str(n): sd = f'{int(d):04b}' s += sd + '0' if sd.count('1') % 2 == 0 else \ sd + '1' s = '1' + s[2:] + '0' return int( s, 2 ) for n in range(1, 10000): if alg(n) == 674890: print( n ) break [/pre2] Если разум воспримет, то, как говорится, ни пуха ни пера!


GasDM21: Мой вариант решения немного больше ))) [pre2] uses School; var n: integer; function four_bits(n: integer): string; var c: integer; d: Dictionary<integer, string> := Dict(Arr((0, '00000'),(1, '00011'), (2, '00101'),(3, '00110'), (4, '01001'),(5, '01010'), (6, '01100'),(7, '01111'), (8, '10001'),(9, '10010'))); begin Result := ''; while n > 0 do begin c := n mod 10; Result := d[c] + Result; n := n div 10; end; end; function automat(n: integer): integer; var n2: string; begin n2 := four_bits(n); n2 := '1' + Copy(n2, 3, n2.Length) + '0'; Result := Dec(n2, 2); end; begin n := 13; while automat(n) <> 674890 do begin //Writeln($'n = {n} -> R = {automat(n)}'); n += 1; end; Writeln($'n = {n} -> R = {automat(n)}'); end. [/pre2]

s11kai: двумя пальцами если набирать, то в минуту 100 символов среднему ученику можно настучать, здесь более 1000 символов, т.е. 10 минут как с куста только на набор, да еще нужно продумать алгоритм - еще как минимум 10, если не более, а остальные задачки когда решать? Кроме того, даже для алгоритмов высокого уровня дается от 10 до 20 строк, а данное задание базового уровня, и это превышает по количеству строк даже высокий уровень.

GasDM21: Был "спортивный" интерес решить задание. Решил

s11kai: GasDM21 пишет: "спортивный" интерес Похвально, но очень уж длинно! В питоне например алгоритм, предложенный мной выше, может выглядеть гораздо короче, примерно так: [pre2] st ='' s = bin(674890)[2:] s = s[:-1] for i in range(4): s = s[:-1] s1 = s[-4:] s2 = int(s1,2) st = str(s2)+st s = s[:-4] print(st) [/pre2]Надеюсь, что разница примерно 1 к 10, т.е. на порядок - очевидна, может стоит сменить язык или упростить алгоритм решения?

s11kai: Оказывается, без потери работоспособности можно еще сократить длину кода сливанием двух строк в одну [pre2] st ='' s = bin(674890)[2:] s = s[:-1] for i in range(4): s = s[:-1] s1 = s[-4:] st = str(int(s1,2))+st s = s[:-4] print(st) [/pre2]

GasDM21: Менять - нет, а в дополнение - прорабатывается

s11kai: GasDM21 пишет: в дополнение - прорабатывается тогда вот решение перебором, вдруг пригодится [pre2] def f( n ): s = '' for d in str(n): sd = bin(int(d))[2:] while len(sd)<4: sd = '0'+sd if sd.count('1') % 2 == 0: s += sd + '0' else: s += sd + '1' s = '1' + s[2:] + '0' return int( s, 2 ) for n in range(1000, 10000): if f(n) == 674890: print( n ) break [/pre2]

GasDM21: Спасибо. Мой алгоритм, записанный выше занимается тем же. Просто решение разбито на этапы, оформленные в виде функций.

s11kai: GasDM21 пишет: Просто решение разбито на этапы, оформленные в виде функций. Я это понял, но возник один вопрос, для чего было строить эту таблицу := Dict(Arr((0, '00000'),(1, '00011'), (2, '00101'),(3, '00110'), (4, '01001'),(5, '01010'), (6, '01100'),(7, '01111'), (8, '10001'),(9, '10010'))); неужели в паскале нет возможности, ее создавать кодом, по мере возникновения необходимости, что то вроде:

GasDM21: Захотелось "прикрутить" словарь, из которого по ключу выбирались бы значения. В Python словари есть, PascalABC.Net тоже ими обзавелся. Знаю, что можно было обойтись и обычным массивом, и списком.

s11kai: GasDM21 пишет: Захотелось "прикрутить" словарь, А, если захотелось - то конечно! Кстати, я уже это ХОЧУ где-то рядом слышал! На мой взгляд, было бы интереснее попробовать перевести число в двоичный код, который обработать соответствующим образом. Но, видимо, у разных людей - разные тараканы. Удачи

GasDM21: Что есть, то есть.

s11kai: GasDM21 пишет: Что есть, то есть Да, уж.......



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