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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Формирование массива из 2-х с уник. значеними 
V
    Опции темы
Danissimo
Дата 15.9.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ты про объединение? или про разность? Объединение работает. Разность тоже работает. И выдает правильный результат. Имейте в виду, что разность -- некомутативная операция. Так что все правильно работает.

Другими словами, если множество X полностью является подмножеством Y, то вычитая из X Y, получаем пустое множество.

Добавлено @ 13:39 
А вот иллюстрация:

my @array2 = qw( a b c d i f );
my @array1 = qw( b d g );

my %x;
@x{@array1} = (1) x @array1;
delete @x{@array2};
print join ' ', sort keys %x;

Здесь множество array1 не является полным подмножеством array2. Что и сказывается на результате.
PM MAIL   Вверх
nitr
Дата 15.9.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



amg :) ты меня вынуждаешь извращаться :)
Код

#!/usr/bin/perl -w
my @array2 = qw(a b c d i f);
my @array1 = qw(b d f);
my @array3 = (@array1, @array2);

foreach my $i (@array3) {
    $array3->{$i} ++ unless grep {/\b$i\b/} @array2 && grep {/\b$i\b/} @array1;
}

print join "", sort keys %$array3;

и кста, Danissimo, свой код "подсвечивай"!


--------------------
PM   Вверх
amg
Дата 15.9.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Danissimo @  15.9.2006,  13:37 Найти цитируемый пост)
Ты про объединение? или про разность? Объединение работает. Разность тоже работает. И выдает правильный результат. Имейте в виду, что разность -- некомутативная операция. Так что все правильно работает.
Я про операцию, которая в некоторых книжках называется "симметричная разность". Перечитав еще раз самый первый пост, думаю, что именно коммутативная "симметричная разность" и была нужна.

Цитата(nitr @  15.9.2006,  13:41 Найти цитируемый пост)
amg smile ты меня вынуждаешь извращаться smile
 smile Так мы как раз этим и занимаемся уже по крайней мере всю вторую половину этой темы. Но для меня лично такие извращения - хороший тренинг.
Кстати, nitr, понимаю, что выгляжу полным занудой, но твой последний код опять не работает, если поменять @array2 и @array1. (Чтобы работал, надо в нем && заменить на and).
PM MAIL   Вверх
meridian
Дата 15.9.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо sharq, amg, nitr и остальным извращенцам   smile 
Работает как надо, проверил все.

PM   Вверх
Nab
Дата 18.9.2006, 04:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я вот тут посмотрел вашу писанину, и таки думаю что у amg идея была лучшая, но вы все одно кудато не туда рвонулиsmile
вот вариант в одну строку :

Код

@arr = split('\s',(($arr = "@{[sort(@array1,@array2)]}") =~ s/(\S+)\s+\1\s+//g)?$arr:'');

даст результат если в изначальных масивах значения уникальны, то есть в сумме дают 2, ну или четное число.
кстати вариант sharq тоже этим страдает...

А этот вариант дает разницу двух массивов, при условии что значения массивов не содержат символов пробела

Код

@arr = ((($_ = "@{[sort(@array1,@array2)]}") =~ s/(\S+)\s+(\1\s*)+//g)?$_:'')&&split;

можно тут конечно извратиться с заменой стандартного разделителя, но эт уже не то smile


Это сообщение отредактировал(а) Nab - 18.9.2006, 07:32


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Nab
Дата 18.9.2006, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот блин дурная голова рукам спокоя не дает smile
Упростил...
Код

@arr = ($_="@{[sort(@array1,@array2)]}")=~s/(\S+)\s+(\1\s*)+//g&&split;



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 18.9.2006, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Nab, респект!
Внёс твой однострочник (немного его модифицировав) в свою коллекцию Perl one-liners (там как раз разности не хватало)
Код

# Симметричная разность файлов (не содержащих неуникальных строк)
perl -e 'undef $"; ($_="@{[sort(<>)]}")=~s/(.+)\n\1\n//g; print' file1 file2

PM MAIL   Вверх
Nab
Дата 18.9.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



знаешь почему у меня в конце звезда стоит и плюсик?

Звезда потому что на последней строке файла окончания нет, и твоя регулярка не сработает, а моя сработает.

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

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


если же тебя такое поведение устраивает, то можно еще более упростить твою регулярку...

Код

perl -e 'undef $"; ($_="@{[sort(<>)]}")=~s/(.*\n)\1//g; print' file1 file2



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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