PERL-GOLF: Первая игра (Ну что, поехали?)

Модератор: Модераторы разделов

Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

PERL-GOLF: Первая игра

Сообщение madskull »

Так значит.
Думал я думал, и наконец придумал. Попробуем замутить пародию на perl-golf.

Задание: реализация на перле следующей команды:

Код: Выделить всё

find где-то ! -type d

запускаться должно так:

Код: Выделить всё

perl -w pfind где-то

в результате мы должны получить список файлов без каталогов.

ПРАВИЛА:
1. Ответы присылаются мне на ПМ. Я проверяю и публикую здесь в треде под порядковым номером, по очередности получения ответов.
2. "Самовольно" публикуемые ответы к рассмотрению не принимаются.
3. Если подряд приходят несколько сообщений от одного участника, рассматривается самое последнее.
4. При написании ответа необходимо указывать номер ответа, над которым были произведены изменения.

Подсчет результата:
6. Рассматривается и подсчитывается только тело функции find (см.ниже стартовый скрипт), то есть текст между 'sub find{' и '}' включительно.
7. Табуляторы и пробелы перед строками и символы новой строки перед подсчетом будут убираться, так что не стоит в ответе их убирать в ущерб читабельности.
8. Подсчет результата я буду производить так

Код: Выделить всё

 $ perl -wle '$text=`cat`;$text=~s/^\s+//mg;$text=~s/\n//mg; print length($text)'

9. Соревнование заканчивается 30 июля в 14:00. То есть в это время я принимаю последний ответ, публикую его, поздравляю победителя и сваливаю в отпуск :)
10. Со своей стороны я обязуюсь регулярно проверять свой ПМ, за исключением выходных, глубоких ночей и времени перемещения между работой и домом. Ну и "форсмажорных обстоятельств"
11. Сам я участвовать не буду, за исключением, если мне покажется, что ваши идеи истощились, а у меня есть что показать. Соответственно, победителем я быть не могу.

Дополнения Срд Июл 21 17:08:07
12. Нельзя изменять имя функции find
13. Обязательно должен быть перевод строки после последней строки вывода


ПЕРВОНАЧАЛЬНЫЙ СКРИПТ
Пускай, стартовый скрипт выглядит так:

Код: Выделить всё

use DirHandle;
# начало проверки
sub find
{
    my $d = shift;
    my $h = new DirHandle($d) or die "$!";
    my @f = $h->read();
    for my $i (@f) {
        my $p = "$d/$i";
        unless ( $i =~ /^\.\.?$/ ) {
            if ( -d $p ) {
                find($p);
            }
            else {
                print "$p\n";
            }
        }
    }
}
# конец проверки
find($ARGV[0]);


ЧТО Я ХОЧУ ВИДЕТЬ ОТ ВАС

Код: Выделить всё

#Ответ на номер 15
sub find
{
bla-bla-bla
}
#Комментарий (*)

(*) Комментарий будет добавлен при публикации. Это просто строчка-две безотносительно к заданию (например, "таки я его сделал!") :)

Вот вроде и все, если что-то забыл -- добавлю.


ВРЕМЯ ПОШЛО!

(и огромная просьба: не флудить в этом треде)
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

Так, вроде дело сдвинулось:
Решение #2
Автор: AndyX
Количество символов: 147
Комментарий: Так, для затравки ;)

Код: Выделить всё

sub find
{
    my $d = shift;
    $h = new DirHandle($d) || die $!;
    for $i ($h->read()) {
        $p = "$d/$i";
        if ( $i !~ /^\.+$/ ) {
            -d $p ? find($p) : print "$p\n";
        }
    }
}


Со своей стороны, я добавил убранное :)
die $! - в правилах не указано, но все-таки пусть будет так. Должны же мы видеть, почему он умер.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

Решение #3
Автор: AndyX
Количество символов: 136
Комментарий: А что, больше никто не хочет поучаствовать? :)

Код: Выделить всё

sub find
{
    my $d = shift;
    $h = new DirHandle($d) || die $!;
    for ($h->read()) {
        $p = "$d/$_";
        /^\.+$/ ? '' : -d $p ? find($p) : print "$p\n";
    }
}



А что мы пробелы ВНУТРИ не убираем?
Мой рекорд сейчас 110 символов

кстати /^\.+$/ не совсем корректно: а если будет файл "...."?
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

Решение #4
Автор: AndyX
Количество символов: 119
Комментарий:

Код: Выделить всё

sub find
{
    my($d)=@_;
    $h=new DirHandle($d)||die$!;
    map{$p="$d/$_";-d $p?find($p):print"$p\n";}grep!/^\.{1,2}$/,$h->read();
}



Все те же лица...
Наконец-то до map добрались... и это правильно.
вот только, почему же тебе не нравится "/^\.\.?$/"? Ведь "/^\.{1,2}$/" длиннее на два символа.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

Решение не засчитано
Автор: AndyX
Количество символов: 106
Комментарий:

Код: Выделить всё

sub find
{
    my($d)=@_;
    map{$p="$d/$_";-d $p?find($p):print"$p\n";}grep!/^\.{1,2}$/,new DirHandle($d)->read();
}



Нда, почти как у меня, но(!) проверки-то на правильность открытия каталога нету
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
AndyX
Сообщения: 116

Re: PERL-GOLF: Первая игра

Сообщение AndyX »

Упс. Проверку убрал случайно :(
Выслал последний вариант. Спасибо за подсказку про /^\.\.?$/ :)
I am in shape. Round is a shape.
Спасибо сказали:
sdk
Бывший модератор
Сообщения: 210

Re: PERL-GOLF: Первая игра

Сообщение sdk »

Нда. Про map я не знал :). И про grep тоже. Класс!
По моему, получилось весьма компактно :).
Во всяком случае, я минут пять подумал и никаких упрощений в голову не пришло. Или башка после работы не варит...

Может давайте next one? А AndyX приз дадим :).
Или народ сможет дальше компактить? На это тоже будет интересно поглядеть.
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

(sdk @ Wednesday, 21 July 2004, 21:42) писал(а):Нда. Про map я не знал :). И про grep тоже. Класс!
По моему, получилось весьма компактно :).
Во всяком случае, я минут пять подумал и никаких упрощений в голову не пришло. Или башка после работы не варит...

Может давайте next one? А AndyX приз дадим :).
Или народ сможет дальше компактить? На это тоже будет интересно поглядеть.

Нефиг смотреть, работай давай! :)
Надеюсь, хотя бы до 90-символов догребем.
Просто, как оказалось, придумать задание тоже не просто. Поэтому, в том, что я предложил, как минимум 35 символов константны. Что не есть хорошо. Ну, если народ заинтересуется, можно будет проводить соревнования на более "профессиональном" уровне. В конце концов, в перл-гольфе очки начисляются не только по количеству символов.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

Решение #5
Автор: AndyX
Количество символов: 112
Комментарий:

Код: Выделить всё

sub find
{
  my($d)=@_;
  map{$p="$d/$_";-d $p?find($p):print"$p\n"}grep!/^\.\.?$/,(new DirHandle($d)||die$!)->read();
}


Ну, как минимум на 4 символа сократить еще можно. Это, конечно, всего лишь "украшательства", но все же...


Прям какое-то соло получается. Видно, действительно, придется досрочно придумывать что-то еще.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
AndyX
Сообщения: 116

Re: PERL-GOLF: Первая игра

Сообщение AndyX »

Предлагаю считать этот турнир пробным, а то соревнования-то не получилось :)
2madskull: дык, свой-то вариант покажи ;)
I am in shape. Round is a shape.
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

Решение вне конкурса
Автор: madskull
Количество символов: 102
Комментарий:

Код: Выделить всё

sub find
{
    map{-d$_?find($_):print"$_\n"}map"$d/$_",grep!/^\.\.?$/,(new DirHandle($d=pop)||die$!)->read
}

В общем, очень похоже на последнее решение AndyX, только два map'a используется. Зачем - сам толком не пойму. Если его убрать, то перл ругается на ->read... видимо не проходит вызов метода без скобок.

Мдя, погорячился я про 90 символов. До ста никак не получается доползти. Хотя, может кто-нить свежим взглядом что-нить и заметит.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
AndyX
Сообщения: 116

Re: PERL-GOLF: Первая игра

Сообщение AndyX »

Красиво :)
А у меня больше, чем на те 4 символа, о которых ты говорил, сократить уже не получается...
I am in shape. Round is a shape.
Спасибо сказали:
Аватара пользователя
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9

Re: PERL-GOLF: Первая игра

Сообщение Sparky »

(madskull @ Thursday, 22 July 2004, 11:52) писал(а):Решение вне конкурса
Автор: madskull
Количество символов: 102
Комментарий:

Код: Выделить всё

<!--QuoteEBegin-->sub find<!--QuoteEBegin-->{<!--QuoteEBegin-->    map{-d$_?find($_):print"$_\n"}map"$d/$_",grep!/^\.\.?$/,(new DirHandle($d=pop)||die$!)->read<!--QuoteEBegin-->}<!--QuoteEBegin-->

В общем, очень похоже на последнее решение AndyX, только два map'a используется. Зачем - сам толком не пойму. Если его убрать, то перл ругается на ->read... видимо не проходит вызов метода без скобок.

Мдя, погорячился я про 90 символов. До ста никак не получается доползти. Хотя, может кто-нить свежим взглядом что-нить и заметит.

Хм... Я чесно ничего не смыслю в PERL но () это короче чем map или я чего то не понял? :blink:
Блог
--------------------

GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

(Sparky @ Thursday, 22 July 2004, 13:32) писал(а):Хм...  Я чесно ничего не смыслю в PERL но () это короче чем map  или я чего то не понял?  :blink:


Если я тебя "правильно не понял", то это две большие разницы. Если имеется в виду списковый контекст. Просто скобки - это просто список, а map позволяет что-то делать с каждым элементом списка.
А если я все-таки тебя вообще не понял, то какая между ними связь?

Кстати, игру можно считать закончившейся, так что народ: МОЖНО ФЛУДИТЬ :)

И играли мы не правильно... По идее, каждый ответ должен быть изменением предыдущего решения, причем, необязательно в сторону уменьшения размера. Или я неправильно понял описание на ненашенском языке.
Если кто силен в английском, может посмотрит на http://perlgolf.sourceforge.net/ и переведет правила на человеческий язык. Точнее, не столько правила, сколько смысл игры.
Да и просто сходите по этой ссылке и посмотрите на решения -- это что-то.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9

Re: PERL-GOLF: Первая игра

Сообщение Sparky »

Просто ты сказал что не знаешь зачем второй map видимо за тем что ->read не хочет без него вызываться без скобок (я так понял так: ->read()) вот я и подумал что может быть убрать map и поставиь ->read(), но я просто впринципе спросил, потому как думаю если ты хорошо знаешь этот язык то до такого уж как нибудь допер бы :)
Блог
--------------------

GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

(Sparky @ Thursday, 22 July 2004, 14:36) писал(а):Просто ты сказал что не знаешь зачем второй map видимо за тем что ->read не хочет без него вызываться без скобок (я так понял так: ->read()) вот я и подумал что может быть убрать map и поставиь ->read(), но я просто впринципе спросил, потому как думаю если ты хорошо знаешь этот язык то до такого уж как нибудь допер бы :)

Понятно. Скобки у read специательно убраны для экономии.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

Решение #6
Автор: Mitya-ncc
Количество символов: 99
Комментарий:

Код: Выделить всё

sub find
{
    map{-d$_?/\/\.\.?$/||find($_):print"$_\n"}map"$d/$_",(new DirHandle($d=pop)||die$!)->read
}

Ура! Рубеж в 100 символов преодолен!
Поздравляю!
Со своей стороны позволил себе некоторую вольность, а именно убрал пробел после первого map'а
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: PERL-GOLF: Первая игра

Сообщение t.t »

(madskull @ Tuesday, 27 July 2004, 8:43) писал(а):

Код: Выделить всё

-d$_?/\/\.\.?$/
Что-то вот здесь я никак не могу понять :dntknw:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

Проще будет объяснить весь код в блоке map

Код: Выделить всё

map{
   -d$_?           # если в переменной $_ каталог
      /\/\.\.?$/        # то проверяем, имеет ли он вид bla-bla/. или bla-bla/..
      ||find($_)       # и если не имеет, проверяем второе условие в OR , а по сути просто вызываем нужную нам функцию. Пользуемся тем, что нормальные языки не проверяют второго условия, если первое истинно.
   :print"$_\n"  # иначе печатаем имя "не каталога".
}
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: PERL-GOLF: Первая игра

Сообщение t.t »

(madskull @ Tuesday, 27 July 2004, 10:11) писал(а):Проще будет объяснить весь код в блоке map

Код: Выделить всё

map{
  -d$_?           # если в переменной $_ каталог
Спасибо. Я ещё вот тут запутался, а дальше вс ё понятно.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
AndyX
Сообщения: 116

Re: PERL-GOLF: Первая игра

Сообщение AndyX »

2Mitya-ncc: респект, красивое решение. А казалось, что все уже - некуда уменьшать :)
I am in shape. Round is a shape.
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

А вот вам то же самое, но вид сбоку. Количество символов тоже 99. Может, здесь можно что-то сделать?

Код: Выделить всё

sub find
{
    map{
        -d$_?
        /\/\.\.?$/||find(
            map{"$d/$_"}(new DirHandle($d=$_)||die$!)->read
        ):
        print"$_\n"
    }@_
}
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

а что именно непонятно?
-d - файловая проверка - каталог ли указан.
дальше идет стандартное условие(или как оно там называется по-научному?)
<условие>?<вариант true>:<вариант false>

Просто в отличие от C, где это используется в присваивании, в перле не обязательно присваивать или указывать что это условие или действие.

Таким образом, это безобразие можно заменить на более Сишное:

Код: Выделить всё

if ( -d $_ ) {
   <делаем что-то>
}
else {
   <делаем все наоборот>
}


Чем мне, собственно, и нравится перл.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: PERL-GOLF: Первая игра

Сообщение t.t »

Да нет, всё понятно, это я с недосыпу запутался. Меня вот эта последовательность символов ввела в непонятку:

Код: Выделить всё

?/\/\.\.?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Mitya-ncc
Сообщения: 268
Статус: Живущий тут

Re: PERL-GOLF: Первая игра

Сообщение Mitya-ncc »

А казалось, что все уже - некуда уменьшать

Говорят, что в эту игру можно долго играть.
В одном мгновеньи – видеть вечность,
Огромный мир в горсти песка,
В одной песчинке – бесконечность,
И небо в чашечке цветка.
Спасибо сказали:
Аватара пользователя
Dilan
Сообщения: 93
Статус: Супер модератор
ОС: Gentoo Linux

Re: PERL-GOLF: Первая игра

Сообщение Dilan »

Таким образом, это безобразие можно заменить на более Сишное:

Код: Выделить всё

if ( -d $_ ) {
   <делаем что-то>
}
else {
   <делаем все наоборот>
}


Чем мне, собственно, и нравится перл.

А мне перл этим не нравится. СЛИШКОМ компактно все... ИМХО, конечно же.
А перл нравится только компактностью и больше ничем? :)

З.Ы. Ой, прошу прощения за небольшой флуд. :)
Gentoo Base System version 1.12.1, gentoo-sources-2.6.17-r5, KDE-3.5.5
icq uid - 319283395
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: PERL-GOLF: Первая игра

Сообщение madskull »

(Dilan @ Сентябрь 28 2004, 5:27) писал(а):А мне перл этим не нравится. СЛИШКОМ компактно все... ИМХО, конечно же.

Конечно, можно любую программку вылизывать и уменьшать. Но зачем? В реальности, ужимается только то, что "лежит на поверхности". Иначе получаются слишком большие затраты времени.

Скажем, зачем писать

Код: Выделить всё

if ( $ret_val ) {
    my $f = new FileHandle(">outfile") or die;
    print $f "message";
    $f->close();
}

когда можно

Код: Выделить всё

(new FileHandle(">outfile") || die)->print("message") if $ret_val;

Причем, это "усовершенствование" видно сразу, не надо голову ломать.
Да и при просмотре программы, мне кажется, проще понять, когда действие умещено в одну команду, чем размазано на несколько строк.

(Dilan @ Сентябрь 28 2004, 5:27) писал(а):А перл нравится только компактностью и больше ничем? :)

З.Ы. Ой, прошу прощения за небольшой флуд. :)


Да нет, конечно. Это язык, идеальный для обработки текстов, ИМХО.
Да и вообще, на нем просто приятно программировать.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Dilan
Сообщения: 93
Статус: Супер модератор
ОС: Gentoo Linux

Re: PERL-GOLF: Первая игра

Сообщение Dilan »

(madskull @ Сентябрь 28 2004, 5:22) писал(а):Да нет, конечно. Это язык, идеальный для обработки текстов, ИМХО.


Вот с этим согласен на все 100 :)
Gentoo Base System version 1.12.1, gentoo-sources-2.6.17-r5, KDE-3.5.5
icq uid - 319283395
Спасибо сказали:
Аватара пользователя
Fakir
Сообщения: 167
ОС: Mandriva Linux 2006

Re: PERL-GOLF: Первая игра

Сообщение Fakir »

А будут еще игры?
Damn linux... damn open source!
Спасибо сказали:
Аватара пользователя
AndyX
Сообщения: 116

Re: PERL-GOLF: Первая игра

Сообщение AndyX »

Fakir писал(а):
09.10.2006 19:25
А будут еще игры?

Дык, предлагай задание - поиграем ;)
I am in shape. Round is a shape.
Спасибо сказали: