Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 4, 2012 09:10:35

Dryg
Зарегистрирован: 2012-04-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Строка формируется следующим образом:

Ребят help..! Только начал изучать Python/ подскажите как можно решить такую задачу..!

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

Я сделал так:

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

Но вот только как теперь сделать так чтобы формировалась строка
a
aab
aabaabc
и так далее..?

Офлайн

#2 Апрель 4, 2012 09:47:50

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Строка формируется следующим образом:

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

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



Отредактировано fata1ex (Апрель 4, 2012 10:48:41)

Офлайн

#3 Апрель 6, 2012 11:25:59

Dryg
Зарегистрирован: 2012-04-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Строка формируется следующим образом:

нет ни хрена не так
вот что у меня получилось:

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

Задачка Дональда Кнута..! Этот человек просто гений..! Он мега мозг..!

Отредактировано Dryg (Апрель 6, 2012 11:27:51)

Офлайн

#4 Апрель 6, 2012 12:27:56

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Строка формируется следующим образом:

Сформировать список, а потом выдергивать из него нужный элемент нельзя по условию задачи?



Офлайн

#5 Апрель 9, 2012 05:16:30

Dryg
Зарегистрирован: 2012-04-04
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Строка формируется следующим образом:

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

Офлайн

#6 Апрель 9, 2012 05:20:55

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Строка формируется следующим образом:

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]



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version