Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемешать данные, переставить все буквы в строке\массиве 
:(
    Опции темы
wkd
Дата 17.8.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.5.2008

Репутация: нет
Всего: нет



Возникла проблемма, прошу помочь с решением.
На входе имеется строка, вида: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccddddddddddeeeee"
Необходимо перемешать все данные случайным образом, чтоб на выходе получить что-то похожее на: "...dacbbcdaaabceda...". Как это сделать, по возможности качественно перемешать все и быстро? Голову сломал, нашел лишь похожую проблемму http://forum.vingrad.ru/topic-170846.html, но так и не разобрался, уровень знание пока не тот, а сделать надо. Помогите пожалуйста!
PS: даже при одинаковой вводной, конечный результат должен быть случайным.

Это сообщение отредактировал(а) wkd - 17.8.2009, 15:57
PM MAIL   Вверх
ginnie
Дата 17.8.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



wkd, предлагаю "нетрадиционный" вариант
Код

my $in="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccddddddddddeeeee";
print join("", sort {int(rand(3))-1} split(//, $in));




--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
wkd
Дата 17.8.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.5.2008

Репутация: нет
Всего: нет



Огромное спасибо, работает быстро даже при большом вводном массиве! Мои изыски подвешивали машинку=((( Есть куда стремиться!  Но есть ли возможность перемешать данные более качественно? Пример, вводные:
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccddddddddddddddddddddeeeeeeeeeeeeeeeeeeee
Вывод следующий:
eseloesbeeosssbbossbssssbsblslsssssslsebelleelbeeebbeeeeoleeeboeblblbobblbblbbllllloololoooloooooooo
Под час повторение значений еще более жесткое! Можно ли перемешать качественнее? Пропускать строку так несколько раз, заметно замедляет работу=(

Это сообщение отредактировал(а) wkd - 17.8.2009, 16:30
PM MAIL   Вверх
ginnie
Дата 17.8.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Да не за что, этого добра у нас полно (традиционный вариант):

Код

my $in="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccddddddddddeeeee";
my @out;
my $dimension = length $in;
for my $symbol (split //, $in) {
    my $index = int rand($dimension);
    while(defined $out[$index++]) {
        $index %= $dimension;
    }
    $out[--$index] = $symbol;
}
print join "", @out;


Это сообщение отредактировал(а) ginnie - 17.8.2009, 16:27


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
wkd
Дата 17.8.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.5.2008

Репутация: нет
Всего: нет



Спасибо, второй вариант лучше=)
PM MAIL   Вверх
KSURi
Дата 17.8.2009, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 5
Всего: 27



Тоже, вроде, традиционный:
Код

use List::MoreUtils qw(uniq);

my $str = 'aaaaabbbbbbbbbccccccccddddddddeeeeeeee';
my @chars = uniq split //, $str;
my $random = join '', map($chars[int rand scalar @chars], 1 .. length $str)


Это сообщение отредактировал(а) KSURi - 17.8.2009, 21:49


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 17.8.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



KSURi, а ты уверен в корректности своего кода? Для "ab" он случайно "aa" не может выдать?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 17.8.2009, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 5
Всего: 27



Может, не подумал об этом. Но судя по входным данным такого не будет.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
amg
Дата 18.8.2009, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Можно так:
Код
use List::Util qw(shuffle);
my $in="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccddddddddddeeeee";
print (join '', shuffle(split //, $in));

Функция shuffle из стандартного модуля List::Util работает быстро, в несколько раз быстрее, чем последний код ginnie. Но, впрочем, когда я вставил код функции из модуля в основную программу, ускорение практически исчезло. smile 
PM MAIL   Вверх
ginnie
Дата 18.8.2009, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Цитата(amg @  18.8.2009,  07:48 Найти цитируемый пост)
Но, впрочем, когда я вставил код функции из модуля в основную программу, ускорение практически исчезло.

amg, ты говоришь про код функции shuffle()? Там же XS. Или ты взял код из List::Util::PP?


Это сообщение отредактировал(а) ginnie - 18.8.2009, 10:15


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 18.8.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Цитата(ginnie @  18.8.2009,  10:07 Найти цитируемый пост)
amg, ты говоришь про код функции shuffle()? Там же XS. Или ты взял код из List::Util::PP?
Да, а я и не заметил, действительно XS. За счет этого основное ускорение. Но в List::Util есть и "обыкновенный" код, весьма быстрый и хитрый (для меня), его можно вставить в свой код:
Код
sub shuffle (@) {
  my @a=\(@_);
  my $n;
  my $i=@_;
  map {
    $n = rand($i--);
    (${$a[$n]}, $a[$n] = $a[$i])[0];
  } @_;
}

PM MAIL   Вверх
KSURi
Дата 18.8.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 5
Всего: 27



Практически мой любимый модуль, а про shuffle() забыл...


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0908 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.