Не имеет значения в каком порядке расположены буквы в слове ...
По рзелульаттам илссеовадний одонго анлигйсокго унвиертисета, не иеемт занчнеия, в кокам пряокде рсапожолены бкувы в солве. Галвоне, чотбы преавя и пслоендяя бквуы блыи на мсете. Осатьлыне бкувы мгоут селдовтаь в плоонм бсепордяке, все рвано ткест чтаитсея без побрелм. Пичрионй эгото ялвятеся то, что мы не чиатем кдаужю бкуву по отдльенотси, а все солво цликеом:))
Сегодня я приведу примеры реализации таких перемешиваний букв в словах. Первая реализация будет на языке Java, а вторая реализаций будет на JavaScript.
Реализация на Java
Цель: создать метод
turn, который принимает строку, а возвращает строку со словами, в которых перемешаны все буквы, кроме первой и последней.
Например,
turn("По результатам исследований") вернет следующий текст:
"По рзлуаьаттем иаслсеодинвй"
Необходимо подключить следующие пакеты для работы с регулярными выражениями:
import java.util.regex.Matcher;
import java.util.regex.Pattern; |
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Самое главное - регулярное выражение.
\p{L} - означает unicode символ
{4,} - задает количество от 4 до бесконечности
//регулярное выражение поиска unicode-последовательности из более 3-х символов
static final Pattern p = Pattern.compile("\\p{L}{4,}"); |
//регулярное выражение поиска unicode-последовательности из более 3-х символов
static final Pattern p = Pattern.compile("\\p{L}{4,}");
Реализация функции
turn:
//функция принимает строку в обычном виде,
//а возвращает в перемешанном
static String turn(String str){
//разбор строки
Matcher m = p.matcher(str);
//обработанные данные будем добавлять в переменную sb
StringBuilder sb = new StringBuilder();
//перебираем все фрагменты, которые нужно перемешать
while(m.find()){
//создаем массив из номеров позиций букв в массиве,
//которые нужно перемешать
int size = m.end() - m.start() - 2;
int[] a = new int[size];
int ndx = 0;
for(int j = m.start() + 1;j < m.end() - 1;j++){
a[ndx++] = j;
}
//просто копируем все символы, которые не нужно перемешивать
for(int i=sb.length();i<=m.start();i++){
sb.append(str.substring(i, i+1));
}
//перемешиванием массив
mix(a);
//добавляем в переменную sb перемешанные буквы
for(int el : a){
sb.append(str.substring(el, el + 1));
}
}
//добавляем последние символы, которые перемешивать не нужно
for(int i=sb.length();i<str.length();i++){
sb.append(str.substring(i, i+1));
}
return sb.toString();
} |
//функция принимает строку в обычном виде,
//а возвращает в перемешанном
static String turn(String str){
//разбор строки
Matcher m = p.matcher(str);
//обработанные данные будем добавлять в переменную sb
StringBuilder sb = new StringBuilder();
//перебираем все фрагменты, которые нужно перемешать
while(m.find()){
//создаем массив из номеров позиций букв в массиве,
//которые нужно перемешать
int size = m.end() - m.start() - 2;
int[] a = new int[size];
int ndx = 0;
for(int j = m.start() + 1;j < m.end() - 1;j++){
a[ndx++] = j;
}
//просто копируем все символы, которые не нужно перемешивать
for(int i=sb.length();i<=m.start();i++){
sb.append(str.substring(i, i+1));
}
//перемешиванием массив
mix(a);
//добавляем в переменную sb перемешанные буквы
for(int el : a){
sb.append(str.substring(el, el + 1));
}
}
//добавляем последние символы, которые перемешивать не нужно
for(int i=sb.length();i<str.length();i++){
sb.append(str.substring(i, i+1));
}
return sb.toString();
}
Ниже приведена функция перемешивания массива:
//функция перемешивания массива
static void mix(int[] arr){
for(int i=0;i<arr.length;i++){
int rnd1 = (int)(Math.random() * arr.length);
int rnd2 = (int)(Math.random() * arr.length);
int swap = arr[rnd1];
arr[rnd1] = arr[rnd2];
arr[rnd2] = swap;
}
} |
//функция перемешивания массива
static void mix(int[] arr){
for(int i=0;i<arr.length;i++){
int rnd1 = (int)(Math.random() * arr.length);
int rnd2 = (int)(Math.random() * arr.length);
int swap = arr[rnd1];
arr[rnd1] = arr[rnd2];
arr[rnd2] = swap;
}
}
Реализация на JavaScript
Из-за особенностей JavaScript реализация будет немного отличаться.
JavaScript поддерживает регулярные выражения, но не поддерживаются класс unicode-символов, а нам нужен класс символов
\p{L}.
Для решения этой проблемы будем использовать плагин
XRegExp.
Скачаем плагин с официального сайта
http://xregexp.com/plugins/ или
отсюда
Подключаем плагин к странице:
<script src="xregexp-all.js"></script> |
<script src="xregexp-all.js"></script>
Регулярное выражение создается с помощью функции XRegExp, в которую первым параметром передаем шаблон регулярного выражения(описание шаблона см.выше), а вторым параметром флаг
g, означающий поиск всех совпадений.
var exp = XRegExp('\\p{L}{4,}','g'); |
var exp = XRegExp('\\p{L}{4,}','g');
В реализации функции
turn есть несколько ньюансов:
1) Вместо ресурсозатратной операции конкатенации(склеивания) строк мы будет добавлять символы в массив с помощью метода
push. В конце мы сольем все элементы массива с помощью функции
join, которая параметром принимает разделитель между элементами, а в нашем случае это пустая строка.
2) В JavaScript при использовании такого синтаксиса:
for(el in arr), в переменную
el кладется не элемент массива, а ключ. Чтобы получить элемент нужно получить его из массива по ключу:
arr[el].
//функция принимает строку в обычном виде,
//а возвращает в перемешанном
function turn(text){
//обработанные данные будем добавлять в массив res
var res = [];
//перебираем все фрагменты, которые нужно перемешать
while(match = exp.exec(text)){
//создаем массив из номеров позиций букв в массиве,
//которые нужно перемешать
var first = match.index + 1;
var last = match.index + match.toString().length - 2;
var arr = [];
for(i=first;i<=last;i++){
arr.push(i);
}
fix(arr);//перемешиванием массив
//просто копируем все символы, которые не нужно перемешивать
for(i=res.length;i<=match.index;i++){
res.push(text.substring(i,i+1));
}
//добавляем перемешанные символы
for(el in arr){
var ndx = arr[el];
res.push(text.substring(ndx,ndx+1));
}
}
//добавляем последние символы, которые не нужно перемешивать
for(i=res.length;i<text.length;i++){
res.push(text.substring(i,i+1));
}
return res.join('');
} |
//функция принимает строку в обычном виде,
//а возвращает в перемешанном
function turn(text){
//обработанные данные будем добавлять в массив res
var res = [];
//перебираем все фрагменты, которые нужно перемешать
while(match = exp.exec(text)){
//создаем массив из номеров позиций букв в массиве,
//которые нужно перемешать
var first = match.index + 1;
var last = match.index + match.toString().length - 2;
var arr = [];
for(i=first;i<=last;i++){
arr.push(i);
}
fix(arr);//перемешиванием массив
//просто копируем все символы, которые не нужно перемешивать
for(i=res.length;i<=match.index;i++){
res.push(text.substring(i,i+1));
}
//добавляем перемешанные символы
for(el in arr){
var ndx = arr[el];
res.push(text.substring(ndx,ndx+1));
}
}
//добавляем последние символы, которые не нужно перемешивать
for(i=res.length;i<text.length;i++){
res.push(text.substring(i,i+1));
}
return res.join('');
}
Код перемешивания элементов массива:
//функция перемешивания массива
function fix(arr){
for(i=0;i<arr.length;i++){
var rnd1 = Math.floor(Math.random() * arr.length);
var rnd2 = Math.floor(Math.random() * arr.length);
var swap = arr[rnd1];
arr[rnd1] = arr[rnd2];
arr[rnd2] = swap;
}
} |
//функция перемешивания массива
function fix(arr){
for(i=0;i<arr.length;i++){
var rnd1 = Math.floor(Math.random() * arr.length);
var rnd2 = Math.floor(Math.random() * arr.length);
var swap = arr[rnd1];
arr[rnd1] = arr[rnd2];
arr[rnd2] = swap;
}
}
Готовую реализацию можно увидеть на странице:
Перемешивание букв в словах (Пример)
Добавить комментарий