Форум сайта python.su
1
Доброе утро, решил поупражняться в питоне и набрел на сайт http://www.pythonchallenge.com/pc/def/map.html
первая задачка ушла влет
теперь мучаюсь с перебором списка
задание такое: 
g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.
код реализовывал таким способом (даже не приводил ничего в порядок, как писал так и писал)
x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] # k -->m # o -->q # e -->g e = [] s = [] m = [] q = [] y = ["g fmnc wms bgblr rpylqjyrc gr zw fylb rfyrq ufyr amknsrcpq ypc dmp bmgle gr gl zw fylb gq glcddgagclr ylb rfyrq ufw rfgq rcvr gq qm jmle sqgle qrpgle kyicrpylq() gq pcamkkclbcb lmu ynnjw ml rfc spj"] for i in y: if len(i)>1: for t in i: e.append(t) else: e.append(i) #print(e) for i in e: for b in x: if i ==b: s.append(x.index(b)+2) for i in s: if i == 26: i = 1 elif i == 27: i = 2 m.append(i) else: m.append(i) print(m) for i in m: print(x[i], end = '')
Офлайн
568
for i in y: if len(i)>1:
Офлайн
1
FishHookя почему то думал, что некоторые части списка могут идти скомпанованно, вот и подстраховался
x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] # k -->m # o -->q # e -->g e = [] s = [] m = [] y = ["g fmnc wms bgblr rpylqjyrc gr zw fylb rfyrq ufyr amknsrcpq ypc dmp bmgle gr gl zw fylb gq glcddgagclr ylb rfyrq ufw rfgq rcvr gq qm jmle sqgle qrpgle kyicrpylq() gq pcamkkclbcb lmu ynnjw ml rfc spj"] for i in y: e.append(i) #print(e) for i in e: for b in x: if i ==b: s.append(x.index(b)+2) for i in s: if i == 26: i = 1 elif i == 27: i = 2 m.append(i) else: m.append(i) print(m) for i in m: print(x[i], end = '')
Отредактировано sl0w (Июнь 16, 2016 09:42:12)
Офлайн
568
sl0w
Давайте по порядку. Ваши циклы в цикле - это плохо. Хардкодить размер сдвига - еще хуже. А реализация этого сдвига - совсем плохо. Для начала сделайте словарь соответствия исходного алфавита сдвинутому. Это очень просто: вы делите исходный алфавит на две части в соответствии со значением сдвига. Если сдвиг == 12, то первая часть - это первые 12 символов, вторая - остальные. Потом вы меняете части местами, и получаете сдвинутый алфавит. Из исходного и сдвинутого алфавитов собираете словарь. А по словарю уже изменяете нужный текст.
Отредактировано FishHook (Июнь 16, 2016 10:05:11)
Офлайн
6
sl0w
Вашем же способом получается что то такое
x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] # k -->m # o -->q # e -->g s = [] st='' y = "g fmnc wms bgblr rpylqjyrc gr zw fylb rfyrq ufyr amknsrcpq ypc dmp bmgle gr gl zw fylb gq glcddgagclr ylb rfyrq ufw rfgq rcvr gq qm jmle sqgle qrpgle kyicrpylq() gq pcamkkclbcb lmu ynnjw ml rfc spj" splittedstr = y.split() for i in splittedstr: for b in i: if b in x: a=(x.index(b)+2) if a==26: a=0 elif a==27: a=1 st+=x[a] else: st+=b s.append(st) st='' print(' '.join(s))
Отредактировано Firik (Июнь 16, 2016 10:24:10)
Офлайн
1
переделал немного код
# алфавит и строка x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] y = ["g fmnc wms bgblr rpylqjyrc gr zw fylb rfyrq ufyr amknsrcpq ypc dmp bmgle gr gl zw fylb gq glcddgagclr ylb rfyrq ufw rfgq rcvr gq qm jmle sqgle qrpgle kyicrpylq() gq pcamkkclbcb lmu ynnjw ml rfc spj"] s = [] m = [] for i in y: for t in i: for b in x: if b == t: #если значение в строке y и словаре совпадает, то if x.index(b)>23: q = x.index(b)-24 s.append(q) else: s.append(x.index(b)+2) #print(s) for i in s: print(x[i], end = ' ')
Отредактировано sl0w (Июнь 16, 2016 10:45:40)
Офлайн
1
Firikбольшое спасибо, буду разбираться в вашем образце
sl0wВашем же способом получается что то такое
Отредактировано sl0w (Июнь 16, 2016 10:46:55)
Офлайн
221
Вот к примеру решение достаточно простое, проверяющее границы
#!/usr/bin/env python3 class Shifter: def __init__(self, value, shift): self._value = value self._shift = shift self._max_index = len(value) - 1 self._length = len(value) def shift(self, key): index = self._value.index(key) + self._shift if index > 0: while index > self._max_index: index -= self._length elif index < 0: while index < 0: index += self._length return self._value[index] if __name__ == '__main__': shifter = Shifter('abcdef', 1) assert 'b' == shifter.shift('a') assert 'a' == shifter.shift('f') assert 'f' == shifter.shift('e') shifter = Shifter('abcdef', 6) assert 'a' == shifter.shift('a') assert 'f' == shifter.shift('f') assert 'e' == shifter.shift('e') shifter = Shifter('abcdef', 12) assert 'a' == shifter.shift('a') assert 'f' == shifter.shift('f') assert 'e' == shifter.shift('e') shifter = Shifter('abcdef', -1) assert 'f' == shifter.shift('a') assert 'e' == shifter.shift('f') assert 'd' == shifter.shift('e') shifter = Shifter('abcdef', -6) assert 'a' == shifter.shift('a') assert 'f' == shifter.shift('f') assert 'e' == shifter.shift('e')
Офлайн
8
Музыкой навеяло 
text = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj." tmp = [] for i in text: if i == ' ' or i =="'" or i =='.' or i == '(' or i == ')': tmp.append(i) continue if ord(i) == 121: tmp.append('a') if ord(i) == 122: tmp.append('b') tmp.append(chr(ord(i) + 2)) print (''.join([txt for txt in tmp if txt != '{' and txt != "|"]))
Отредактировано Vigi (Июнь 17, 2016 07:24:51)
Офлайн
73
добавлю свои пять копеек кода
text = '''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.''' alphabet = [chr(i) for i in range(ord('a'),ord('z')+1)] len_alphabet = len(alphabet) shift_text = '' for i in text: if i.isalpha(): index_i = alphabet.index(i) i = alphabet [ (len_alphabet + index_i+2 ) % len_alphabet] shift_text += i print( shift_text)
Отредактировано marvellik (Июнь 18, 2016 21:32:08)
Офлайн