Автор | Сообщение |
|
Отправлено: 15.03.23 14:37. Заголовок: B5 №309
Возможно в задании содержится ошибка. Или неверно расписан пример работы алгоритма. Или наблюдается двоякость толкования задания. Из задания: Например, для числа 13 двоичные коды цифр: 1 = 00012, 3 = 00112. С добавленными битами чётности: 00011 и 00110, результат шага 1: 0001100110. Заменяем два левых разряда на 1 и добавляем справа 0: 10110011002 = 716. В примере заменен только один крайний левый разряд. Возможно два толкования условия: 1. вместо двух первых разрядов добавляется одна 1, 2. каждый из двух первых разрядов заменяется на 1.
| |
|
Ответов - 16
, стр:
1
2
All
[только новые]
|
|
|
Отправлено: 22.03.23 15:52. Заголовок: GasDM21 пишет: Возм..
GasDM21 пишет: цитата: | Возможно в задании содержится ошибка. Или неверно расписан пример работы алгоритма. Или наблюдается двоякость толкования задания. |
| нет там ошибок! GasDM21 пишет: цитата: | Заменяем два левых разряда на 1 и добавляем справа 0: 1011001100 = 716. В примере заменен только один крайний левый разряд. |
| а ничего, что слева было три 0, а стал 1 GasDM21 пишет: цитата: | результат шага 1: 0001100110. |
| Результата, т.е. ответ можно получить двумя способами либо в лоб - перебором, либо пошагово от обратного, например так: Пишем команду в питоне и запускаем ее на выполнение: print(bin(674890)[2:]) получаем двоичный код: 101000011000100101 0 удаляем правый нолик и разбиваем код на пятерки 101 0 0100 1 1000 1 0010 1 Убираем справа от каждой группы по единице кроме левой, где справа стоит 0, который говорит, что до замены двух левых символов было ровно две 1, поэтому убираем справа 0, а слева, наоборот - добавляем 0 0101 0100 1000 0010 Получили 4 тетрады, декодируя которые получаем число 5 4 8 2
| |
|
|
Отправлено: 22.03.23 16:00. Заголовок: Спасибо за пояснение..
Спасибо за пояснение. Надеюсь на экзамене такого не будет.
| |
|
|
Отправлено: 22.03.23 16:06. Заголовок: GasDM21 пишет: Наде..
GasDM21 пишет: цитата: | Надеюсь на экзамене такого не будет. |
| Думаю, что это гораздо проще, чем написать код! Например, автор предлагает такое решение: 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 Если разум воспримет, то, как говорится, ни пуха ни пера!
| |
|
|
Отправлено: 22.03.23 16:11. Заголовок: Мой вариант решения ..
Мой вариант решения немного больше ))) 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.
| |
|
|
Отправлено: 22.03.23 16:32. Заголовок: двумя пальцами если ..
двумя пальцами если набирать, то в минуту 100 символов среднему ученику можно настучать, здесь более 1000 символов, т.е. 10 минут как с куста только на набор, да еще нужно продумать алгоритм - еще как минимум 10, если не более, а остальные задачки когда решать? Кроме того, даже для алгоритмов высокого уровня дается от 10 до 20 строк, а данное задание базового уровня, и это превышает по количеству строк даже высокий уровень.
| |
|
|
Отправлено: 22.03.23 16:38. Заголовок: Был "спортивный&..
Был "спортивный" интерес решить задание. Решил
| |
|
|
Отправлено: 23.03.23 02:35. Заголовок: GasDM21 пишет: "..
GasDM21 пишет: Похвально, но очень уж длинно! В питоне например алгоритм, предложенный мной выше, может выглядеть гораздо короче, примерно так: 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) Надеюсь, что разница примерно 1 к 10, т.е. на порядок - очевидна, может стоит сменить язык или упростить алгоритм решения?
| |
|
|
Отправлено: 23.03.23 04:45. Заголовок: Оказывается, без пот..
Оказывается, без потери работоспособности можно еще сократить длину кода сливанием двух строк в одну 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)
| |
|
|
Отправлено: 23.03.23 09:35. Заголовок: Менять - нет, а в до..
Менять - нет, а в дополнение - прорабатывается
| |
|
|
Отправлено: 23.03.23 10:17. Заголовок: GasDM21 пишет: в до..
GasDM21 пишет: цитата: | в дополнение - прорабатывается |
| тогда вот решение перебором, вдруг пригодится 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
| |
|
|
Отправлено: 23.03.23 11:17. Заголовок: Спасибо. Мой алгорит..
Спасибо. Мой алгоритм, записанный выше занимается тем же. Просто решение разбито на этапы, оформленные в виде функций.
| |
|
|
|
Отправлено: 23.03.23 13:46. Заголовок: GasDM21 пишет: Прос..
GasDM21 пишет: цитата: | Просто решение разбито на этапы, оформленные в виде функций. |
| Я это понял, но возник один вопрос, для чего было строить эту таблицу := Dict(Arr((0, '00000'),(1, '00011'), (2, '00101'),(3, '00110'), (4, '01001'),(5, '01010'), (6, '01100'),(7, '01111'), (8, '10001'),(9, '10010'))); неужели в паскале нет возможности, ее создавать кодом, по мере возникновения необходимости, что то вроде:
| |
|
|
Отправлено: 23.03.23 14:55. Заголовок: Захотелось "прик..
Захотелось "прикрутить" словарь, из которого по ключу выбирались бы значения. В Python словари есть, PascalABC.Net тоже ими обзавелся. Знаю, что можно было обойтись и обычным массивом, и списком.
| |
|
|
Отправлено: 24.03.23 02:06. Заголовок: GasDM21 пишет: Захо..
GasDM21 пишет: цитата: | Захотелось "прикрутить" словарь, |
| А, если захотелось - то конечно! Кстати, я уже это ХОЧУ где-то рядом слышал! На мой взгляд, было бы интереснее попробовать перевести число в двоичный код, который обработать соответствующим образом. Но, видимо, у разных людей - разные тараканы. Удачи
| |
|
|
Отправлено: 24.03.23 07:52. Заголовок: Что есть, то есть. ..
Что есть, то есть.
| |
|
Ответов - 16
, стр:
1
2
All
[только новые]
|
|
|