Код: Выделить всё
# из этого
['a','a','b','b','b','c','d','e','e','f','g','h']
# надо получить
['a','b','c','d','e','f','g','h']
# кстати необязательно в таком порядкеМодератор: Модераторы разделов
Код: Выделить всё
# из этого
['a','a','b','b','b','c','d','e','e','f','g','h']
# надо получить
['a','b','c','d','e','f','g','h']
# кстати необязательно в таком порядкеКод: Выделить всё
@arr = ('a','a','b','b','b','c','d','e','e','f','g','h');
@arr = grep {! $tmp{$_}++ } @arr;А что, тоже ваиант.(AndyX @ Пятница, 01 Апреля 2005, 18:58) писал(а):О!!! Perl golf!!!
(agbr @ Суббота, 02 Апреля 2005, 15:53) писал(а):Код: Выделить всё
@arr = ('a','a','b','b','b','c','d','e','e','f','g','h'); @arr = grep { ($_ ne $t) ? $t=$_ : 0 } @arr;
Где $t - некая временная переменная, которая содержит предыдущее значение.
Но этот способ годится только для отсортированных массивов, но по сравнению с предыдущим
1) не занимает дополнительное место, для хранения временного хэша
2) не выполняет операций поиска/вставки в хэш, т.е. в целом работает быстрее
Код: Выделить всё
use Benchmark;
@arr = ('a','a','b','b','b','c','d','e','e','f','g','h');
timethese(1000000,
{
test1 => '@a1 = grep { ($_ ne $t) ? $t=$_ : 0 } @arr',
test2 => '@a2 = grep {! $tmp{$_}++ } @arr',
}
);Код: Выделить всё
Benchmark: timing 1000000 iterations of test1, test2...
test1: 28 wallclock secs (29.22 usr + 0.06 sys = 29.28 CPU) @ 34153.01/s (n=1000000)
test2: 9 wallclock secs ( 9.82 usr + 0.01 sys = 9.83 CPU) @ 101729.40/s (n=1000000)Код: Выделить всё
use Benchmark;
@arr = (1..1000000);
timethese(100,
{
test1 => '@a1 = grep { ($_ ne $t) ? $t=$_ : 0 } @arr',
test2 => '@a2 = grep {! $tmp{$_}++ } @arr',
}
);Код: Выделить всё
Benchmark: timing 100 iterations of test1, test2...
test1: 616 wallclock secs (602.90 usr + 4.96 sys = 607.86 CPU) @ 0.16/s (n=100)
test2: 220 wallclock secs (214.56 usr + 1.73 sys = 216.29 CPU) @ 0.46/s (n=100)Код: Выделить всё
@arr = grep { ($_ ne $t) ? $t=$_ : 0 } @arr