Как стать автором
Обновить

Эффект Кембриджского университета

Программирование *
Перемешивание букв. Эффект Кембриджского университета.


По рзелульаттам илссеовадний одонго анлигйсокго унвиертисета, не иеемт занчнеия, в кокам пряокде рсапожолены бкувы в солве. Галвоне, чотбы преавя и пслоендяя бквуы блыи на мсете. Осатьлыне бкувы мгоут селдовтаь в плоонм бсепордяке, все-рвано ткест чтаитсея без побрелм. Пичрионй эгото ялвятеся то, что мы чиатем не кдаужю бкуву по отдльенотси, а все солво цликеом.
Тема очень старая и гуляет по интернетам давно, но везде приводится как пример один и тот же текст, мне было интересно попробовать данный эффект на собственных текстах, в результате чего и родилась эта программа.

Пример работы программы:


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

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

Исходного кода совсем немного, функция преобразования текста:
       string eng_rus_alphavit = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯяAaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
        Random rnd = new Random((int)DateTime.Now.Ticks);
        /// <summary>
        /// Перемешивание букв в слове за исключением первого и последнего символа
        /// </summary>
        public string RndSym(string word)
        {
            if (word.Length > 2)
            {
                string ret = "";
                //Построим массив случайно перемешанных индексов кроме первого и последнего
                int[] index = new int[word.Length];
                for (int i = 0; i < word.Length; i++)
                    index[i] = -1;
                index[0] = 0;
                index[word.Length - 1] = word.Length - 1;
                int v = rnd.Next(1, word.Length - 1);
                for (int i = 1; i < word.Length - 1; i++)
                {
                    while (index[v] != -1)
                        v = rnd.Next(1, word.Length - 1);
                    index[v] = i;
                }
                //Соберем слово используя массив индексов
                for (int i = 0; i < word.Length; i++)
                {
                    ret += word[index[i]];
                }
                return ret;
            }
            return word;
        }
        /// <summary>
        /// Преобразование текста
        /// </summary>
        private string TransformText(string text)
        {
            int begin;
            string nword;
            char[] array = text.ToCharArray();
            for (int i = 0; i < array.Length; i++)
            {
                if (eng_rus_alphavit.Contains(array[i].ToString()))
                {
                    begin = i;
                    while (eng_rus_alphavit.Contains(array[i].ToString()) && (++i < array.Length)) ;
                    nword = RndSym(text.Substring(begin, i - begin));
                    //Замена исходного слова на перемешанное
                    for (int j = begin; j < i; j++)
                    {
                        array[j] = nword[j - begin];
                    }
                }
            }
            string ret = "";
            foreach (char c in array)
                ret += c;
            return ret;
        }


Релиз(Win x86/x64) и исходники(C#, VS2010) можно скачать здесь.

Практической пользы программа не несет, разве что прокачать навыки чтения и подгрузить мозг.
Теги:
Хабы:
Всего голосов 141: ↑93 и ↓48 +45
Просмотры 40K
Комментарии Комментарии 135