Как я могу определить, находится ли символ рядом с другим символом на клавиатуре QWERTY?


Я разрабатываю систему обнаружения нежелательной почты, и меня предупредили, что она не может обнаруживать строки, подобные этой - "asdfsdf".

Мое решение этой проблемы заключается в определении того, находились ли предыдущие клавиши рядом с другими клавишами на клавиатуре. Я не получаю ввод (для обнаружения спама) с клавиатуры, я получаю его в виде строки.

Все, что я хочу знать, - это является ли символ одним ключом, двумя ключами или более чем двумя ключами от другого символа.

Для например, на современной QWERTY-клавиатуре символы "q" и "w" будут находиться на расстоянии 1 клавиши. То же самое было бы с символами "q" и "s". Люди могут понять это логически, как я мог сделать это в коде?

Author: liamzebedee, 2011-10-01

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
 2
Author: Alexander Olsson, 2011-10-01 15:23:41

Что ж, давайте посмотрим. Это трудный вопрос. Я всегда использую метод грубой силы и держусь подальше от передовых концепций, таких как тот парень, которого Пифагор пытался нам навязать, так как насчет двумерной таблицы? Что-то вроде этого. может быть:

+---+---+---+---+---+---+---
|   | 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 является положительным или отрицательным, чтобы показать, что вторая буква вверх или вниз от первого. Позвони моему патентному поверенному, быстро!

 3
Author: Pete Wilson, 2011-10-01 15:36:27

Постройте карту от клавиш до позиций на идеализированной клавиатуре. Что-то вроде:

'q' => {0,0},
'w' => {0,1},
'a' => {1,0},
's' => {1,1}, ...

Затем вы можете принять "расстояние" за математическое расстояние между двумя точками.

 2
Author: Mat, 2011-10-01 15:20:42

Основная идея состоит в том, чтобы создать карту символов и их расположения на клавиатуре. Затем вы можете использовать простую формулу расстояния, чтобы определить, насколько они близки друг к другу.

Например, рассмотрим левую сторону клавиатуры:

  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)

Это займет у вас немного времени. немного усилий, чтобы отобразить ключи в прямоугольную сетку (мой пример не идеален, но он дает вам представление). Но после этого вы можете создать карту (или словарь), и поиск будет простым и быстрым.

 1
Author: Jim Mischel, 2011-10-01 15:25:32