Найти - Пользователи
Полная версия: Строка формируется следующим образом:
Начало » Центр помощи » Строка формируется следующим образом:
1
Dryg
Ребят help..! Только начал изучать Python/ подскажите как можно решить такую задачу..!

1. а
2. aab
3. aabaabc
4. aabaabcaabaabcd
и т.п.
Нужно вычислить какой символ будет находиться в заданной позиции справа налево после того как будут записаны все символы англ алфавита т.е. программа спрашивает число, и выводит в ответ символ. например: если введешь 1 то ответ z

Я сделал так:

def f(n):
return chr(26 - n + ord('a'))

Но вот только как теперь сделать так чтобы формировалась строка
a
aab
aabaabc
и так далее..?
fata1ex
Во-первых, из вашего примера не очень ясно, как именно формируется строка. Насколько я понял, новая строка получается умножением предыдущей строки на 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.

Кстати, решение не совсем верное, проверять на делимость недостаточно, потому что при добавлении нового символа позиция смещается. Но идею, надеюсь, вы уловили.
Dryg
нет ни хрена не так
вот что у меня получилось:

def len(n):
      if n<1:
           return 0
      if n==1:
           return 1
        return len(n-1)*2+1
def left_pos(step, pos):
       return len(step) - pos+1
alphabet = 'abcdefghijklmnopqrstuvwxyz'
def char_in_position(step=26, right_pos=1):
            current_len = len(step)
             if right_pos <= step:
                          return alphabet [:step][-right_pos]
                 lp = left_pos(step, right_pos)
                 new_step = -1

Задачка Дональда Кнута..! Этот человек просто гений..! Он мега мозг..!
FishHook
Сформировать список, а потом выдергивать из него нужный элемент нельзя по условию задачи?
Dryg
Вообще то никто и не выдергивает элемент из списка.. Мы просто выводим элемент находясь в нужной позиции справа налево..!
FishHook
Dryg
Вообще то никто и не выдергивает элемент из списка.. Мы просто выводим элемент находясь в нужной позиции справа налево..! =)
Это понятно, но если нет условий, например программа не должна нагружать оперативу или критично быстродействие, то задача становится тривиальной.
from string import ascii_lowercase
alpha=ascii_lowercase
lst=[alpha[0]]
for letter in alpha[:-1]:
     lst=lst*2
     lst.append( alpha[ alpha.index(letter)+1 ])
lst.append('z')
lst.reverse()
while 1:
    num=input('Enter number')
    print lst[num]
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