The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Bash Brainfuck , !*! pavlinux, 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 сек.

  • Bash Brainfuck , !*! Andrey Mitrofanov, 17:12 , 29-Ноя-18 (1)
    >элементы массива/списка
    > Прим.
    >
     
    > $> ./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
    $ _

    • Bash Brainfuck , !*! pavlinux, 17:34 , 29-Ноя-18 (2)

      > shuf;

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

    • Bash Brainfuck , !*! михалыч, 19:27 , 29-Ноя-18 (3)
      да, вы, батенька, shu-лер, как я погляжу )))
      (ухмыляясь и доставая краплёную колоду)

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

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

      • Bash Brainfuck , !*! Andrey Mitrofanov, 09:48 , 30-Ноя-18 (4)
        > да, вы, батенька, 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
        $ _

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

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

          • Bash Brainfuck , !*! Andrey Mitrofanov, 14:43 , 30-Ноя-18 (6)
            >[оверквотинг удален]
            >>  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 жавафагов.

            • Bash Brainfuck , !*! ACCA, 04:57 , 03-Дек-18 (7)
              Не, так не пойдёт, там сзади сидит 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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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