Ocean
а что за книжка с головоломками?)
“Твоё свободное время”. Там прикольные задачи, не Мурзилка ни разу и не Весёлые картинки.
Некоторые задачи по несколько месяцев решить не мог. Давно это было. Они были интересные, но решать это их никак не помогало.
Ocean
У меня дурацкий вопрос: а почему в решении так
?
Потому что он разбирает цифры, а их десять всего - 0 1 2 3 4 5 6 7 8 9. Соответственно, мы можем использовать индексы массива (ну, списка в данном случае, массивы - в языке C, этот приём оттуда) для поиска ячейки, куда сохраняем поступающие данные - очередную цифру.
Что будет, если умножить в Python список на число? Операция умножения в питоне полиморфная, поэтому для чисел она работает как умножение, для строк - как повторение, а для списков - как повторение списка без глубокого копирования элементов. Операция одна, а для разных типов она работает абсолютно по-разному. Так как строки являются немутабельными объектами в Python, об их копировании можно не заботиться, они всё равно всегда заново создаются или берутся из кеша.
>>> [''] * 10
['', '', '', '', '', '', '', '', '', '']
>>>
>>> lst = [''] * 10
>>> lst
['', '', '', '', '', '', '', '', '', '']
>>> id(lst[0]), id(lst[1])
(140583817108144, 140583817108144)
>>>
>>> s = ''
>>> id(s)
140583817108144
>>>
Видишь, это одна и та же строка, которая берётся из кеша, чтобы её заново не генерировать, не выделять память для неё, не сохранять её по новому адресу и так далее.
Дальше при получении цифры 1, например, мы берём элемент списка с таким же индексом, там находится пустая строка, и мы к этой пустой строке прибавляем цифру один в строковом виде и сохраняем этот результат обратно в список уже вместо пустой строки. В следующий раз при получении цифры 1, мы берём элемент списка с таким же индексом, там находится строка с цифрой 1, и мы к этой строке с цифрой 1 прибавляем цифру один в строковом виде и сохраняем этот результат обратно в список уже вместо строки с цифрой 1. Так мы получаем строку с цифрами 11 по индексу 1 в списке со строками. И так для каждой цифры работает. Мы применили сишный приём.
В языке C работа с индексами в массиве идёт очень плотно, там массивы делались такими специально. Там старались всё со всем соединить, поэтому он такой компактный и может всё. И Python тоже компактный потому, что изначально это закос под C, только с продолжением. В других языках это всё сразу видно: что в питоне всё, как в C, так же всё соединено со всем; а в других языках нихера не соединено и приходится писать по многу-многу строк, потому что вот так вложить что-нибудь куда-нибудь не получается.