Во-первых, из вашего примера не очень ясно, как именно формируется строка. Насколько я понял, новая строка получается умножением предыдущей строки на 2 и прибавлением к ней нового символа.
Если в лоб:
def foo():
result = 'a'
while not result.endswith('z'):
result = ''.join([result*2, chr(ord(result[-1])+1)])
return result[::-1]
Запускайте :)
Ну а если подумать получше и представить себе размер получившейся строки, то можно понять, что строку формировать нам вовсе не нужно.
Для начала получим позиции, на которых впервые появится новый символ:
def gen_position():
... r = 1
... for _ in range(26):
... yield r
... r = r*2 + 1
Ну а дальше я бы написал что-нибудь вроде:
def what_the_char(number):
positions = list(gen_position)
for position in positions[::-1]:
if not number%position:
return chr(ord('a')+positions.index(position))
return "I don't get it"
Пишу прям в окошке, поэтому доделаете, надеюсь, самостоятельно. Плюс можете разобраться, как обойти неприятный разворот строки. Ну и добавить проверку, что number не равен over9000.
Кстати, решение не совсем верное, проверять на делимость недостаточно, потому что при добавлении нового символа позиция смещается. Но идею, надеюсь, вы уловили.