2015-07-27 5 views
0

После некоторого поиска подсказок я обнаружил, что мне пришлось import re и использовать регулярные выражения. Ответ - «связанный список». http://www.pythonchallenge.com/pc/def/equality.htmlPython Challenge - # 3 * спойлеры *

Но мне любопытно, что я сделал не так, моя предыдущая попытка его решить?

tekstas = "the string that i need to decode" 

possible_solution = [] 

for i in range(0, len(tekstas)): 
    if ((ord(tekstas[i]) < 123) and (ord(tekstas[i]) > 96)) and ((ord(tekstas[i-1])) > 64) and ((ord(tekstas[i-1])) < 90) \ 
    and ((ord(tekstas[i-2])) > 64) and ((ord(tekstas[i-2])) < 90) and ((ord(tekstas[i-3])) > 64) and ((ord(tekstas[i-3])) \ 
    < 90) and ((ord(tekstas[i+1])) > 64) and ((ord(tekstas[i+1])) < 90) and ((ord(tekstas[i+2])) > 64) and \ 
    ((ord(tekstas[i+2])) < 90) and ((ord(tekstas[i+3])) > 64) and ((ord(tekstas[i+3])) < 90): 
     possible_solution.append(tekstas[i-4]+tekstas[i-3]+tekstas[i-2]+tekstas[i-1]+tekstas[i]+tekstas[i+1]+tekstas[i+2]+\ 
      tekstas[i+3]+tekstas[i+4]) 

for i in range (0, len(possible_solution)): 
    candidate = possible_solution[i] 
    if (ord(candidate[0]) < 123) and (ord(candidate[0]) > 96) and (ord(candidate[8]) < 123) and (ord(candidate[8]) > 96): 
     print(candidate[1:8]) 

Ответы, которые я получаю: IQNlQSL OEKiVEY CNDeHSB OIXdKBF CJAsACF KWGtIDC

маленькие буквы, которые я получаю от этого: liedst Почему я пропускаю несколько букв ??

+0

Где вы тестирование для ** точно ** три больших телохранителей? Я думаю, что вы только тестируете * по крайней мере * три. –

+0

первый цикл ищет по крайней мере три. следующий цикл ищет ровно три – pptt

+0

И как ваш ответ включает большие буквы? Ваш ответ должен содержать только небольшие буквы. –

ответ

2

Вы исключаете Z, потому что вы проверяете свои заглавные буквы (ord(tekstas[i-2])) < 90, а не (ord(tekstas[i-2])) < 91.

Обратите внимание, что вам не нужно использовать ord() здесь вообще можно сравнивать непосредственно с буквами:

tekstas[i-2] < '[' 

или, возможно, более непосредственно узнаваем:

tekstas[i-2] <= 'Z' 

Вам не нужно отдельный tekstas[i-2] >= 'A' and tekstas[i-2] <= 'Z' тесты; вы могли бы использовать цепь сравнениях:

'A' <= tekstas[i-2] <= 'Z' 

Самый простой способ, однако, использовать str.isupper() method:

tekstas[i-2].isupper() 

который для локали по умолчанию верно только если все символы в более строка - это строчные буквы ASCII.

Это означает, что вы можете протестировать более чем одну букву за раз; вместе с str.islower() вашим первым if теста может быть уменьшены до:

tekstas[i].islower() and (tekstas[i - 3:i] + tekstas[i + 1:i + 4]).isupper() 
+0

Спасибо, Z действительно был исключен. Спасибо за подробные примеры – pptt