Найти - Пользователи
Полная версия: Как развернуть строку в обратном порядке
Начало » Python для новичков » Как развернуть строку в обратном порядке
1 2 3
py.user.next
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
Кстати, ради эксперимента решил в твой умный, всё учитывающий, код подставить шаг -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
>>>
Блин, сработало. Всё верно выводит. Хотя я это даже не планировал. Вот это показывает эту особенность, что простой код не только проще и быстрее менять, но и каких-то неучтённостей в нём тоже не остаётся, они не могут там спрятаться в запутанности и уйти из внимания.
m1r42
py.user.next
Блин, сработало. Всё верно выводит. Хотя я это даже не планировал. Вот это показывает эту особенность, что простой код не только проще и быстрее менять, но и каких-то неучтённостей в нём тоже не остаётся, они не могут там спрятаться в запутанности и уйти из внимания.
Да, но условие задачи не предусматривает использование каких либо списков.
py.user.next
m1r42
Да, но условие задачи не предусматривает использование каких либо списков.
Так оно и разных шагов не предусматривает, отличных от единицы. Это уже отсебятина идёт, но это полезная отсебятина.

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

А склеивать всё воедино, я тебе говорю, это как колёса к машине приваривать сварочным аппаратом. Это очень крепко и надёжно будет сидеть, но когда ты колесо проколешь вдруг внезапно и неожиданно, ты встанешь на дороге просто на весь день, потому что просто не сможешь поменять проколотое и приваренное колесо на целое колесо, взятое из багажника, даже при большом желании и всех возможностях.
xam1816
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
m1r42
xam1816
на эту тему есть даже поговорка: Все что сложно - то ложно.
На эту тему даже вспомнился бородатый анекдот:

Купили как-то суровым сибирским лесорубам японскую бензопилу.
Собрались в кружок лесорубы, решили ее испытать.
Завели ее, подсунули ей деревце.
«Вжик» — сказала японская пила.
«У, бл…» — сказали лесорубы.
Подсунули ей деревце потолще. «Вж-ж-жик!» — сказала пила.
«Ух, бл!» — сказали лесорубы.
Подсунули ей толстенный кедр. «ВЖ-Ж-Ж-Ж-Ж-Ж-Ж-ЖИК!!!» — сказала пила.
«Ух ты, бл!!» — сказали лесорубы.
Подсунули ей железный лом. «КРЯК!» — сказала пила.
«Ага, бл!!!» — укоризненно сказали суровые сибирские лесорубы! И ушли рубить лес топорами…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB