Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 19, 2023 07:57:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9891
Репутация: +  854  -
Профиль   Отправить e-mail  

Как развернуть строку в обратном порядке

xam1816
я сначала так и сделал, но с другим шагом не через 1, а через 5 к примеру, не выходит
А, а я не понял, что ты там решил расширить возможности алгоритма.

Я вот сделал две простых добавки в свой код (чтобы добавить шаг), причём очень быстро, без каких-либо размышлений, и он в итоге работает правильно, его даже проверять не надо.
  
>>> n = 4 # int(input())
>>> m = 5 # int(input())
>>> 
>>> index = 1
>>> step = 5
>>> for i in range(n):
...     row = []
...     for j in range(m):
...         row.append(index)
...         index += step
...     if i % 2 == 1:
...         row = row[::-1]
...     rowstr = ' '.join('{:>2}'.format(i) for i in row)
...     print(rowstr)
... 
 1  6 11 16 21
46 41 36 31 26
51 56 61 66 71
96 91 86 81 76
>>>
Код хоть и не оптимальный, я его не оптимизировал вообще, это и не нужно в этих учебных задачках, но он именно разделён по ответственностям. За вывод на экран отвечает одна часть кода, за вычисления отвечает другая часть кода. За формат этого вывода можно сделать ответственной ещё какую-то дополнительную часть, которая отформатирует поля чисел по длине максимального по длине возможного числа. Поэтому-то его так легко менять. То есть я могу вариативные поля сделать легко, хоть для пятизначных чисел, хоть для десятизначных чисел. То есть код будет сам определять, какую ширину брать в виде максимальной.

А у тебя как бы всё склеено в монолит, поэтому для единицы получается какой-то вот такой бред про вычисление единицы для умножения на эту единицу. А вырезать эту штуку нельзя, потому что она для пятёрки не сработает. Как бы строчек меньше в коде, памяти меньше оно ест, а как поменять его надо, так его не поменяешь даже, потому что всё прибито гвоздями друг к другу. Также нужно кубатурить долго, чтобы убедиться, что никаких ошибок в нём нет, что все его поведения учтёны и работают без ошибок.

Поэтому простой код, который легко читается и над которым думать не надо, он лучше, даже если он там больше. Об этом всём также говорит PEP20. Но это не там придумали, просто повторили те же идеи, которые ещё с UNIX известны.



Отредактировано py.user.next (Янв. 19, 2023 08:11:08)

Онлайн

#2 Янв. 19, 2023 08:04:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9891
Репутация: +  854  -
Профиль   Отправить e-mail  

Как развернуть строку в обратном порядке

Кстати, ради эксперимента решил в твой умный, всё учитывающий, код подставить шаг -3, а вдруг он сработает типа

  
>>> row = 6
>>> column = 8
>>> 
>>> n = 1
>>> step = -3
>>> for i in range(row):
...     for j in range(column):
...         print(f'{n:>4}', end=' ')
...         n += step
...     step *= -1
...     n += (column * abs(step)) + step
...     print()
... 
   1   -2   -5   -8  -11  -14  -17  -20 
   4    7   10   13   16   19   22   25 
  49   46   43   40   37   34   31   28 
  52   55   58   61   64   67   70   73 
  97   94   91   88   85   82   79   76 
 100  103  106  109  112  115  118  121 
>>>
Ну и что? И ничего. Для меня это не было неожиданностью. Не было неожиданностью потому, что сложный запутанный код как раз вот к такой фигне и приводит - что-то не учёл когда-то там и он сразу поплыл на каких-то новых входных данных. А исправлять его под эти новые данные надо три часа, если это вообще возможно сделать.

А потом я решил в свой код с добавленным шагом подставить шаг -3 и тоже проверить, а как он себя поведёт
  
>>> n = 4 # int(input())
>>> m = 5 # int(input())
>>> 
>>> index = 1
>>> step = -3
>>> for i in range(n):
...     row = []
...     for j in range(m):
...         row.append(index)
...         index += step
...     if i % 2 == 1:
...         row = row[::-1]
...     rowstr = ' '.join('{:>2}'.format(i) for i in row)
...     print(rowstr)
... 
 1 -2 -5 -8 -11
-26 -23 -20 -17 -14
-29 -32 -35 -38 -41
-56 -53 -50 -47 -44
>>>
Блин, сработало. Всё верно выводит. Хотя я это даже не планировал. Вот это показывает эту особенность, что простой код не только проще и быстрее менять, но и каких-то неучтённостей в нём тоже не остаётся, они не могут там спрятаться в запутанности и уйти из внимания.



Отредактировано py.user.next (Янв. 19, 2023 08:09:42)

Онлайн

#3 Янв. 19, 2023 08:15:56

m1r42
Зарегистрирован: 2022-07-26
Сообщения: 133
Репутация: +  7  -
Профиль   Отправить e-mail  

Как развернуть строку в обратном порядке

py.user.next
Блин, сработало. Всё верно выводит. Хотя я это даже не планировал. Вот это показывает эту особенность, что простой код не только проще и быстрее менять, но и каких-то неучтённостей в нём тоже не остаётся, они не могут там спрятаться в запутанности и уйти из внимания.
Да, но условие задачи не предусматривает использование каких либо списков.

Офлайн

#4 Янв. 19, 2023 09:03:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9891
Репутация: +  854  -
Профиль   Отправить e-mail  

Как развернуть строку в обратном порядке

m1r42
Да, но условие задачи не предусматривает использование каких либо списков.
Так оно и разных шагов не предусматривает, отличных от единицы. Это уже отсебятина идёт, но это полезная отсебятина.

Я бы вообще флажок сделал для чётных и нечётных строк, зачем числовые какие-то значения использовать. Флажок выключен - наращивай и устанавливай начало отсчёта в конце, флажок включен - уменьшай. Это упростит код значительно. То есть не нужно там с числами и их свойствами заморачиваться. Зато потом можно любые шаги делать, потому что флажок гарантированно отвечает за правильные отсеки кода.

А склеивать всё воедино, я тебе говорю, это как колёса к машине приваривать сварочным аппаратом. Это очень крепко и надёжно будет сидеть, но когда ты колесо проколешь вдруг внезапно и неожиданно, ты встанешь на дороге просто на весь день, потому что просто не сможешь поменять проколотое и приваренное колесо на целое колесо, взятое из багажника, даже при большом желании и всех возможностях.



Отредактировано py.user.next (Янв. 19, 2023 09:04:21)

Онлайн

#5 Янв. 19, 2023 12:08:15

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1372
Репутация: +  122  -
Профиль   Отправить e-mail  

Как развернуть строку в обратном порядке

py.user.next
Не было неожиданностью потому, что сложный запутанный код как раз вот к такой фигне и приводит - что-то не учёл когда-то там и он сразу поплыл на каких-то новых входных данных. А исправлять его под эти новые данные надо три часа, если это вообще возможно сделать.

А потом я решил в свой код с добавленным шагом подставить шаг -3 и тоже проверить, а как он себя поведёт

на эту тему есть даже поговорка: Все что сложно - то ложно.

  
row = 4
column = 5
n = 1
step = -3
k = (0 + step)//abs(step)
for i in range(row):
    for j in range(column):
        print(f'{n:>4}', end=' ')
        n += step
    step = -step
    n += k*(column * abs(step))+ step
    print()

   1   -2   -5   -8  -11 
-26 -23 -20 -17 -14
-29 -32 -35 -38 -41
-56 -53 -50 -47 -44

Офлайн

#6 Янв. 19, 2023 12:41:57

m1r42
Зарегистрирован: 2022-07-26
Сообщения: 133
Репутация: +  7  -
Профиль   Отправить e-mail  

Как развернуть строку в обратном порядке

xam1816
на эту тему есть даже поговорка: Все что сложно - то ложно.
На эту тему даже вспомнился бородатый анекдот:

Купили как-то суровым сибирским лесорубам японскую бензопилу.
Собрались в кружок лесорубы, решили ее испытать.
Завели ее, подсунули ей деревце.
«Вжик» — сказала японская пила.
«У, бл…» — сказали лесорубы.
Подсунули ей деревце потолще. «Вж-ж-жик!» — сказала пила.
«Ух, бл!» — сказали лесорубы.
Подсунули ей толстенный кедр. «ВЖ-Ж-Ж-Ж-Ж-Ж-Ж-ЖИК!!!» — сказала пила.
«Ух ты, бл!!» — сказали лесорубы.
Подсунули ей железный лом. «КРЯК!» — сказала пила.
«Ага, бл!!!» — укоризненно сказали суровые сибирские лесорубы! И ушли рубить лес топорами…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version