The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]



"Bash Brainfuck "
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Bash Brainfuck "  +/
Сообщение от pavlinux (ok), 29-Ноя-18, 16:32 
Задание на зимние каникулы.

Создать скрипт выводящий элементы массива/списка в случайном порядке.
Элементы вводятся через аргументы (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 сек.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Bash Brainfuck "  +/
Сообщение от Andrey Mitrofanov (?), 29-Ноя-18, 17:12 
>элементы массива/списка
> Прим.
>
 
> $> ./test "Vasya Anton Petya Dima Anton Anton Vova Sasha Gray Anton"


А у Вас "массив/список" в строку склеился[i]! :)  [/i]

>[оверквотинг удален]
> 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
$ _

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Bash Brainfuck "  +/
Сообщение от pavlinux (ok), 29-Ноя-18, 17:34 

> shuf;

прекрасно... Это называется правильно понял смысл задачи :)

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Bash Brainfuck "  +/
Сообщение от михалыч (ok), 29-Ноя-18, 19:27 
да, вы, батенька, shu-лер, как я погляжу )))
(ухмыляясь и доставая краплёную колоду)

perl -MList::Util=shuffle -e 'print "$_\n" for shuffle @ARGV' Vasya Anton Petya Dima Anton Anton Vova Sasha Gray Anton

(понимаю, это вне конкурса, простите, не удержался)

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

4. "Bash Brainfuck "  +/
Сообщение от Andrey Mitrofanov (?), 30-Ноя-18, 09:48 
> да, вы, батенька, 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
$ _

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Bash Brainfuck "  +/
Сообщение от ыы (?), 30-Ноя-18, 13:38 
>[оверквотинг удален]
>  Petya
>  Anton
>  Vova
> +Sasha
> +Gray
> +Anton
> +Anton
> +Vasya
> +Dima
> $ _

а вариант для 5+++ есть?
"Элементы вводятся через аргументы (argv)" + "при 1 млн элементов" ?

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Bash Brainfuck "  +/
Сообщение от Andrey Mitrofanov (?), 30-Ноя-18, 14:43 
>[оверквотинг удален]
>>  Vova
>> +Sasha
>> +Gray
>> +Anton
>> +Anton
>> +Vasya
>> +Dima
>> $ _
> а вариант для 5+++ есть?
> "Элементы вводятся через аргументы (argv)" + "при 1 млн элементов" ?

Судя по

$ time echo $(yes 1|head -1000000) |wc -l
1

real    0m1,006s

, и, для RANDOM%N bash-варианта,

$ time test $(yes 1|head -1000) |wc -l
1000

real    0m1,116s
$ time test $(yes 1|head -2000) |wc -l
2000

real    0m4,376s

, и, для xargs/shuf,

$ time test $(yes 1|head -1000) |wc -l
1000

real    0m0,816s
$ time test $(yes 1|head -10000) |wc -l
10000

real    0m8,254s

, для 5-c-+++ нужен неленивый [-вырезано-] без фантазии и...

...с компилятором.

Ждём прибытия в тему переписирастов и из старшЫх братьЁв по iq жавафагов.

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "Bash Brainfuck "  +/
Сообщение от ACCA (ok), 03-Дек-18, 04:57 
Не, так не пойдёт, там сзади сидит 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"
1000000

real    0m0.221s
user    0m0.288s
sys    0m0.046s

без фантазии и компилятора.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема


  Закладки на сайте
  Проследить за страницей
Created 1996-2018 by Maxim Chirkov  
ДобавитьПоддержатьВебмастеруГИД  
Hosting by Ihor