2016-01-03 5 views
0

Я пытаюсь проверить последовательные символы в строке, чтобы увидеть, смежны ли они на клавиатуре. Это часть программы, которую я пишу, чтобы оценить силу пароля.Проверка строки для смежных символов на клавиатуре

У меня есть этот код, который инициализирует клавиатуру как массив:

KeyboardRow1 = ["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", ""] 
KeyboardRow2 = ["", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", ""] 
KeyboardRow3 = ["", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "", "", ""] 
KeyboardRow4 = ["", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", "", "", ""] 
KeyboardRow1S = ["~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", ""] 
KeyboardRow2S = ["", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "{", "}", "|"] 
KeyboardRow3S = ["","A", "S", "D", "F", "G", "H", "J", "K", "L", ":", "", "", ""] 
KeyboardRow4S = ["", "Z", "X", "C", "V", "B", "N", "M", "<", ">", "?", "", "", ""] 
Rows = [KeyboardRow1, KeyboardRow2, KeyboardRow3, KeyboardRow4, \ 
     KeyboardRow1S, KeyboardRow2S, KeyboardRow3S, KeyboardRow4S] 

Тогда у меня есть эта функция, которая превращает каждый символ введенного пароля в координаты внутри массива клавиатуры:

def ConvertToCoordinates(Password): 

    Coordinates = [] 
    for c in Password: 
     for i, r in enumerate(Rows): 
      try: 
       Coordinates.append((i % 4, r.index(c))) 
      except: 
       pass 
    return Coordinates 

Наконец, это функция, которая проверяет смежность - где мне нужна помощь:

def CheckForAdjacency(Coordinates): 

    Adjacent = 0 
    for pairs in combinations(Coordinates, 2): 
     if (abs(pairs[0][0] - pairs[1][0]) == 1) \ 
      and (abs(pairs[0][1] - pairs[1][1]) == 1): 
      Adjacent += 1 
    return Adjacent 

Вышеуказанная функция проверяет каждый символ в строке относительно друг друга, а не только символы, которые находятся рядом друг с другом в строке.

Например, я хотел бы, чтобы qwerty возвращал 5 смежных символов и qetwr для возврата 0. Если qwerty является паролем, функция действительно возвращает 5. Однако, если qetwr является паролем, он также возвращает 5; он проверяет все символы вместо символов рядом друг с другом.

Как я могу заставить его проверять только символы рядом друг с другом в строке? Я знаю, что проблема связана с использованием «для пар в комбинациях», я думаю, что проверяет все возможные конфигурации и пары.

ответ

1

Я думаю, что логика в определении двух соседних ключей не совсем правильная. Если две клавиши смежны (или одинаковы), то их координаты x или y не могут быть больше 1.

Также itertools.combinations генерирует всю комбинацию координат, но вы хотите только вычислить их рядом друг с другом.

например. password = 'ABCD' дают вам «AB AC AD BC BD CD»

def isAdjacent(Coord1, Coord2): 
    if abs(Coord1[0] - Coord2[0]) > 1 or abs(Coord1[1] - Coord2[1]) > 1: 
     return False 
    else: 
     return True 

def CheckForAdjacency(Coordinates): 
    Adjacent = 0 
    for i in range(len(Coordinates) - 1): 
     if isAdjacent(Coordinates[i], Coordinates[i +1]): 
      Adjacent += 1 
    return Adjacent 
Смежные вопросы