Яндекс.Метрика

    Юмор

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

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

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


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



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

    Далее код:


    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: муки