Как я могу определить, находится ли символ рядом с другим символом на клавиатуре QWERTY?
Я разрабатываю систему обнаружения нежелательной почты, и меня предупредили, что она не может обнаруживать строки, подобные этой - "asdfsdf".
Мое решение этой проблемы заключается в определении того, находились ли предыдущие клавиши рядом с другими клавишами на клавиатуре. Я не получаю ввод (для обнаружения спама) с клавиатуры, я получаю его в виде строки.
Все, что я хочу знать, - это является ли символ одним ключом, двумя ключами или более чем двумя ключами от другого символа.
Для например, на современной QWERTY-клавиатуре символы "q" и "w" будут находиться на расстоянии 1 клавиши. То же самое было бы с символами "q" и "s". Люди могут понять это логически, как я мог сделать это в коде?
4 answers
Вы можете просто создать двумерную карту для стандартной qwerty-клавиатуры. В принципе, это может выглядеть примерно так:
map[0][0] = 'q';
map[0][1] = 'a';
map[1][0] = 'w';
map[1][1] = 's';
И так далее.
Когда вы получаете два символа, вам просто нужно найти их x и y в массиве "карта" выше, и вы можете просто вычислить расстояние с помощью пифагора. Это не соответствовало бы требованиям, которые у вас были, поскольку "q" и "s" находятся на расстоянии 1 расстояния. Но скорее это будет sqrt(1^2+1^2) приблизительно 1.4
Формула будет быть:
- Символы c1 и c2
- Найдите координаты для c1 и c2: (x1,y1) и (x2,y2)
- Вычислите расстояние с помощью Пифагора: dist= sqrt((x2-x1)^2+(y2-y1)^2).
- При необходимости, завершите или завершите результат.
Например:
Скажем, вы получаете символы c1='q' и c2='w'. Изучите карту и найдите, что "q" имеет координаты (x1, y1) = (0, 0), а "w" имеет координаты (x2, y2) = (1, 0). Расстояние составляет
sqrt((1-0)^2 + (0-0)^2) = sqrt(1) = 1
Что ж, давайте посмотрим. Это трудный вопрос. Я всегда использую метод грубой силы и держусь подальше от передовых концепций, таких как тот парень, которого Пифагор пытался нам навязать, так как насчет двумерной таблицы? Что-то вроде этого. может быть:
+---+---+---+---+---+---+---
| | a | b | c | d | f | s ...
+---+---+---+---+---+---+---
| a | 0 | 5 | 4 | 2 | 4 | 1 ...
| b | 5 | 0 | 3 | 3 | 2 | 4 ...
| c | 4 | 3 | 0 | 1 | 2 | 2 ...
| d | 2 | 3 | 1 | 0 | 1 | 1 ...
| f | 3 | 2 | 2 | 1 | 0 | 2 ...
| s | 1 | 4 | 2 | 1 | 2 | 0 ...
+---+---+---+---+---+---+---
Может ли это сработать для тебя? У вас даже могут быть отрицательные числа, чтобы показать, что один ключ находится слева от другого. КРОМЕ того, вы можете поместить структуру из 2 целых чисел в каждую ячейку, где второе значение int является положительным или отрицательным, чтобы показать, что вторая буква вверх или вниз от первого. Позвони моему патентному поверенному, быстро!
Постройте карту от клавиш до позиций на идеализированной клавиатуре. Что-то вроде:
'q' => {0,0},
'w' => {0,1},
'a' => {1,0},
's' => {1,1}, ...
Затем вы можете принять "расстояние" за математическое расстояние между двумя точками.
Основная идея состоит в том, чтобы создать карту символов и их расположения на клавиатуре. Затем вы можете использовать простую формулу расстояния, чтобы определить, насколько они близки друг к другу.
Например, рассмотрим левую сторону клавиатуры:
1 2 3 4 5 6
q w e r t
a s d f g
z x c v b
Символ a
имеет позицию [2, 0]
, а символ b
имеет позицию [3, 4]
. Формула для их расстояния друг от друга такова:
sqrt((x2-x1)^2 + (y2-y1)^2);
Таким образом, расстояние между a
и b
равно sqrt((4 - 0)^2 + (3 - 2)^2)
Это займет у вас немного времени. немного усилий, чтобы отобразить ключи в прямоугольную сетку (мой пример не идеален, но он дает вам представление). Но после этого вы можете создать карту (или словарь), и поиск будет простым и быстрым.