Python 3: Опитва се да повтори редове от азбуката въз основа на функцията на i

Опитвам се да напиша програма, която прави следното:

В тази програма отпечатваме i**q % p букви от азбуката на ред i, например, ако q=2 и p=12, тогава искаме да отпечатаме:

1**2 % 12 = 1
2**2 % 12 = 4
3**2 % 12 = 9
4**2 % 12 = 4
5**2 % 12 = 1

... така че първите пет реда на изхода ще бъдат:

a                                                                             
bcde                                                                       
fghijklmn                                                                  
opqr                                                                       
s   

В моя случай функцията за определяне на броя знаци е (i**2)%9, но идеята е същата. Конкретната задача е следната:

„Отпечатайте 1834 реда, като използвате буквите a-z в последователност, така че номерът на ред i ще използва (i**2 ) % 9 букви. Първата буква, използвана за отпечатване на ред 1834 е: _________

Започнах да кодирам и имам два основни въпроса. Първо, как да накарам азбуката да започне отначало, след като достигна "z" (или по-вероятно "25-то място")?
Също така, какво трябва да направя за програмата? Досега имам:

letters="abcdefghijklmnopqrstuvwxyz"
for i in range[1,1834]:
    x=((i**2)%9)
    print(letters[])

...но не знам как да продължа. Щях да опитам метод на парче, но не знам. Всеки принос ще бъде оценен.


person JackD    schedule 15.10.2012    source източник
comment
FYI: pow(x, y, z) е еквивалентен на (x**y)%z, но по-бърз (особено ако x**y е много голям).   -  person nneonneo    schedule 15.10.2012


Отговори (4)


Опитайте следното решение. Вие премествате рамка върху буквите, така че всеки път, когато започне нова итерация на цикъл, променлива start_position трябва да запомни на коя буква е спряла предишната итерация. Размерът на рамката се определя от вашето x изчисление.

Ако искате да се върнете към началото на азбуката, то трябва да е по модул на дължината на азбуката. end_position = end_position % 26

letters="abcdefghijklmnopqrstuvwxyz"
alphabet_length = len(letters)
start_position = 0
for i in range(1,1834):
    x=((i**2)%9)
    end_position = start_position + x
    end_position = end_position % alphabet_length
    if end_position < start_position:
         print letters[start_position:alphabet_length-1] + letters[0:end_position]
    else:
         print letters[start_position:end_position] 
    start_position = end_position
person lefterav    schedule 15.10.2012
comment
Това има смисъл! Сега обаче получавам грешка при типа: обектът „тип“ не може да се записва - person JackD; 15.10.2012

Ето нещо, с което можете да работите, като използвате itertools:

from string import ascii_lowercase
from itertools import cycle, islice

letters = cycle(ascii_lowercase)
for num in (1, 4, 9, 4, 1, 13, 12, 9, 5):
    print (''.join(islice(letters, num)))

#a
#bcde
#fghijklmn
#opqr
#s
#tuvwxyzabcdef
#ghijklmnopqr
#stuvwxyza
#bcdef
person Jon Clements♦    schedule 15.10.2012
comment
Не мисля, че това е начинът, по който OP трябва да го прави - твърде магически за домашна работа - но +1 за елегантност! - person DSM; 15.10.2012

Изглежда, че това трябва да е домашна работа, така че ще отговоря така:

  • За да разделите от индекс a до индекс b, можете да използвате my_list[a:b]
  • За да рестартирате броенето от 0, когато достигнете 26, имате нужда от остатъка от итератора i, разделен на броя на буквите 26. a%b е остатъкът от a, разделен на b.
  • range(n) е функция, която връща числа от 0 до n-1, така че общо ще получите n елемента. И това е функция, така че трябва да използвате скоби, т.е. range(1834) не range[1834] (това е нарязване).
  • Също така имайте предвид, че range(1,1834) ще има общо 1834-1=1833 елемента, което не е това, от което се нуждаете...
  • Има пакет, наречен string, който има списъци със знаци от азбуката (малки, главни букви, цифри, ...). Вижте например string.lowercase.
person jadkik94    schedule 15.10.2012

Двата въпроса са свързани: можете да използвате цикъл от itertools до вземете итератор, който безкрайно ще обикаля азбуката (или всеки друг низ, за ​​този въпрос), и за да получите n букви за даден ред, можете да извикате next() на итератора n пъти.

Вашият въпрос изглежда като домашна работа, така че вместо да съкращавам образованието ви, ще дам пример за подобен въпрос за отпечатване на n букви на ред n:

import itertools
str = "abcdefghijklmnopqrstuvwxyzicopiedthisfromstackoverflow"
it = itertools.cycle( str )
for i in range( 1 , 10 ):
    line=""
    for j in range( i ):
        line+=it.next()
    print i,line

редактирайте както е подходящо :-)

person Dave    schedule 15.10.2012