Проблема: https://www.hackerrank.com/challenges/encryption/problem

Это мое первое средство для решения проблемы программирования. Я постараюсь объяснить шаги в логическом порядке. Сначала мы посмотрим на нашу проблему, чтобы понять ее.

Сначала они определяют сетку строк и столбцов и просто вписывают строку, но без пробелов. Затем они просто получают окончательную строку, читая сверху вниз для каждого столбца. Итак, первая проблема заключается в том, чтобы определить количество строк и столбцов, они дают нам три условия:

  1. строки * столбцы ≥ L, L — количество символов (без пробелов)
  2. строки * столбцы должны иметь наименьшую площадь
  3. строки всегда меньше столбцов, если это возможно

Хороший способ подсчитать количество строк и столбцов — это корень. Корень будет между двумя числами (рациональное число) или будет положительным целым числом. Существуют три падежа, условные сверху вниз:

  1. √L * √L = L, поэтому наши номера строк и столбцов равны (например, √25 = 5 * 5). Если это не так, то возможно:
  2. √L * (√L + 1) ≥ L (например, √26 находится между 5 и 6), но если это также неверно:
  3. (√L + 1) * (√L + 1) ≥ L должно быть правильным.

Итак, теперь мы знаем, как посчитать количество столбцов и строк. Теперь мы помещаем эту логику в код Python.

Мы передали нашу строку в функцию. Сначала мы создаем список со всеми символами строки, для этого я буду использовать понимание списка. Затем мы вычисляем наше первое предположение о количестве строк. Мы также выяснили, что расчет идет в условном порядке.

Теперь мы хотим вычислить строки на самом деле. В первой строке будут размещены первые символы columns_number. Во второй строке следующие символы columns_number и так далее. Мы будем использовать вложенный цикл for для этого процесса.

Сначала мы создаем строки списка, строки будут помещены в виде строк. В нашем первом цикле мы определяем, как часто мы переходим во второй цикл, где мы затем хотим добавить к нашей пустой строковой строке первые символы columns_number.

Нам нужен try, кроме, потому что возможно, что в сетке строк и столбцов есть пустые места. Например, L = 8 разбивается на 3 строки и 3 столбца. Но 3 * 3 = 9, поэтому в последней строке и последнем столбце останется 1 место. Если мы сейчас захотим заполнить это место символом, то, конечно же, появится IndexError, потому что наша сетка больше, чем количество символов.

После того, как мы получили наши строки, нам просто нужно вернуть последнюю строку. Мой подход немного сложнее, есть более простые, но они оставлены для вас.

Полный код: