Задание на зимние каникулы.Создать скрипт выводящий элементы массива/списка в случайном порядке.
Элементы вводятся через аргументы (argv). Размер массива - динамический (не известен).Прим.
$> ./test "Vasya Anton Petya Dima Anton Anton Vova Sasha Gray Anton"Petya
Anton
Anton
Anton
Vova
Sasha
Gray
Dima
Vasya
На трояк - любое решение;
На 4 - без захламления кода, читаемый, вменяемое время работы.
на 5 - работа через stdin, работа на 10000 эл. не более 30 сек.
на 5+ - минимизация внешних вызовов (утилит)
на 5++ - прохождение теста DieHard http://webhome.phy.duke.edu/~rgb/General/dieharder.php
на 5+++ - время выполнения при 1 млн элементов не более 10 сек.
>элементы массива/списка
> Прим.
>
> $> ./test "Vasya Anton Petya Dima Anton Anton Vova Sasha Gray Anton"
А у Вас "массив/список" в строку склеился! :)>[оверквотинг удален]
> Anton
> Anton
> Anton
> Vova
> Sasha
> Gray
> Dima
> Vasya
>
> На трояк - любое решение;На от[-троя-]сь:
$ function test() { xargs -n1 <<<"$*" |shuf; }
$ dat() { test "Vasya Anton Petya Dima Anton Anton Vova Sasha Gray Anton"; }
$ diff -u <(dat) <(dat)
--- /dev/fd/63 2018-11-29 17:09:07.893484064 +0300
+++ /dev/fd/62 2018-11-29 17:09:07.893484064 +0300
@@ -1,10 +1,10 @@
-Vasya
-Dima
+Gray
Anton
-Petya
+Vasya
Vova
-Anton
Sasha
Anton
Anton
-Gray
+Dima
+Anton
+Petya
$ _
> shuf;прекрасно... Это называется правильно понял смысл задачи :)
да, вы, батенька, shu-лер, как я погляжу )))
(ухмыляясь и доставая краплёную колоду)perl -MList::Util=shuffle -e 'print "$_\n" for shuffle @ARGV' Vasya Anton Petya Dima Anton Anton Vova Sasha Gray Anton
(понимаю, это вне конкурса, простите, не удержался)
> да, вы, батенька, shu-лер, как я погляжу )))
> (ухмыляясь и доставая краплёную колоду)
> perl -MList::Util=shuffle -e 'print "$_\n" for shuffle @ARGV' Vasya Anton Petya Dima
> Anton Anton Vova Sasha Gray Antonвай, шайтанама.
> (понимаю, это вне конкурса, простите, не удержался)Так нет ни призов, ни конкурса... ни каникул. :) Благородные доны "развлекаются". O-9
$ function test() { local D; [ "$1" = -d ] && shift && D=1; local A; read -a A <<<"$*"; local -i N=${#A[*]} R; while [ $N -gt 0 ]; do let R=RANDOM%N; echo "${D:+$N $R }${A[R]}"; unset A[R]; A=("${A[@]}"); let N--; done; }
$ dat() { test "Vasya Anton Petya Dima Anton Anton Vova Sasha Gray Anton"; }
$ diff -u <(dat) <(dat)
--- /dev/fd/63 2018-11-30 09:40:56.638756256 +0300
+++ /dev/fd/62 2018-11-30 09:40:56.638756256 +0300
@@ -1,10 +1,10 @@
Anton
-Dima
-Anton
-Anton
-Gray
-Sasha
-Vasya
Petya
Anton
Vova
+Sasha
+Gray
+Anton
+Anton
+Vasya
+Dima
$ _
>[оверквотинг удален]
> Petya
> Anton
> Vova
> +Sasha
> +Gray
> +Anton
> +Anton
> +Vasya
> +Dima
> $ _а вариант для 5+++ есть?
"Элементы вводятся через аргументы (argv)" + "при 1 млн элементов" ?
>[оверквотинг удален]
>> Vova
>> +Sasha
>> +Gray
>> +Anton
>> +Anton
>> +Vasya
>> +Dima
>> $ _
> а вариант для 5+++ есть?
> "Элементы вводятся через аргументы (argv)" + "при 1 млн элементов" ?Судя по
$ time echo $(yes 1|head -1000000) |wc -l
1real 0m1,006s
, и, для RANDOM%N bash-варианта,
$ time test $(yes 1|head -1000) |wc -l
1000real 0m1,116s
$ time test $(yes 1|head -2000) |wc -l
2000real 0m4,376s
, и, для xargs/shuf,
$ time test $(yes 1|head -1000) |wc -l
1000real 0m0,816s
$ time test $(yes 1|head -10000) |wc -l
10000real 0m8,254s
, для 5-c-+++ нужен неленивый [-вырезано-] без фантазии и...
...с компилятором.
Ждём прибытия в тему переписирастов и из старшЫх братьЁв по iq жавафагов.
Не, так не пойдёт, там сзади сидит sort -R. Ключи группированы:
> Anton
> Anton
> Antonпотому DieHard под вопросом. Так получше:
$ echo "Vasya Anton Petya Dima Anton Anton Vova Sasha Gray Anton"|tr ' ' $'\n'|nl -n'ln'|shuf|cut -f 2
А для 5+++ нужно просто машинку понаряднее:$ time sh -c "yes 1|head -1000000 |tr ' ' $'\n'|nl -n'ln'|shuf|cut -f 2 |wc -l"
1000000real 0m0.221s
user 0m0.288s
sys 0m0.046sбез фантазии и компилятора.