Pull to refresh

Фокусы с клавиатурой

Reading time2 min
Views1.7K
Сегодня во второй половине дня, мечтая дожить до выходных и перечитывая bash.org.ru, наткнулся на цитату:

Знаете ли вы, что всякий набравший английское слово entity (сущность) по ошибке в русской раскладке, будет немедленно утешен? :-)

Сразу же заинтересовался, а сколько вообще таких последовательностей клавиш, которые будучи нажаты в английской и русской раскладке будут давать существующие слова?



Разумеется, как программист я не мог себе отказать в удовольствии написать такую программу, которая бы нашла все такие слова. В первую очередь потребовались словари со всеми словоформами. Всё, что душе угодно, нашлось на http://wiki.services.openoffice.org/wiki/Dictionaries

Далее код:

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.TreeSet;

public class EqualTypedWords {
final static String RU = "абвгдежзийклмнопрстуфхцчшщъыьэюя";
final static String EN = "f,dult;pbqrkvyjghcnea[wxio]sm'.z";
private static final int WORD_SIZE = 3;

static TreeSet readFile(String fname) throws IOException {
TreeSet result = new TreeSet();
List lines = FileUtils.readLines(new File(fname), "KOI8-R");
for (String s : lines) {
result.add(s.split("/")[0].toLowerCase());
}
return result;
}

public static void main(String[] args) throws IOException {
TreeSet ruset = readFile("data/ru_RU_ie.dic");
TreeSet enset = readFile("data/en_GB.dic");
for (String en : enset) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < en.length(); i++) {
int ind = EN.indexOf(en.charAt(i));
if (ind != -1) {
sb.append(RU.charAt(ind));
}
}
String newWord = sb.toString();
String c = ruset.ceiling(newWord);
String f = ruset.floor(newWord);
if (ruset.contains(newWord) && fit(newWord)) {
System.out.println("en: " + en + "; ru: " + newWord);
continue;
}
if (!fit(c) || !fit(f) || !fit(newWord)) continue;
if (newWord.startsWith(f)) {
System.out.println("en: " + en + "; ru: " + f + "; retyped: " + newWord);
}
if (c.startsWith(newWord)) {
System.out.println("en: " + en + "; ru: " + c + "; retyped: " + newWord);
}
}
}

private static boolean fit(String c) {
return (c != null && c.length() > WORD_SIZE);
}
}


Если кратко, этот код читает содержимое en и ru словарей openoffice и для каждого английского слова пытается найти похожее русское, которое было бы напечатано простой сменой раскладки клавиатуры.

И вот самые интересные результаты:

en: ababa; ru: фифи; retyped: фифиф
en: belt; ru: иудее; retyped: иуде
en: blench; ru: идут; retyped: идутср
en: blend; ru: идут; retyped: идутв
en: celsius; ru: суды; retyped: судышгы
en: derby; ru: вуки; retyped: вукин
en: eire; ru: ушкуев; retyped: ушку
en: entity; ru: утешен
en: entrench; ru: утекут; retyped: утекутср
en: exec; ru: учусь; retyped: учус
en: hdtv; ru: рвем
en: herb; ru: руки

en: herbage; ru: руки; retyped: рукифпу
en: herbal; ru: руки; retyped: рукифд
en: herbert; ru: руки; retyped: рукиуке
en: inert; ru: штуке
en: kbps; ru: лизы
en: kerb; ru: луки
en: lens; ru: дутыш; retyped: дуты
en: next; ru: тучегонители; retyped: туче
en: verb; ru: муки



Tags:
Hubs:
+100
Comments96

Articles

Change theme settings