[Moscow.pm] Конкурс

Михаил Монашёв postmaster на softsearch.ru
Пт Окт 26 05:01:59 PDT 2012


Здравствуйте.

Возникла   идея  провести  конкурс  по  творческому  программированию.
Участвовать  может  каждый.  Достаточно  прислать  в лист свой вариант
решения  задачи.  Другие  участники  могут использовать чужие решения,
беря  оттуда  всё,  что им нужно, развивая и дорабатывая их. Побеждает
тот,   кто  пришлёт  наилучшее  решение.  Возможно  победителей  будет
несколько,   если   их   решения   будут  давать  примерно  одинаковые
результаты.  Дату  окончания  конкурса  пока  фиксировать  наверное не
стоит. А там видно будет.

Задача.

Требуется сгенерить jpeg-файл размером 1024х1024 точек 16777216 цветов
максимального размера за минимальное время. На изображении этого файла
до  сжатия  должно  быть  не  более  39293  нечёрных(rbg=0,0,0) точек.
Временем  работы  скрипта  считается  время  создания  изображения. Не
считаются сжатие и сохранение на диск результирующего файла.

Повторные   запуски   скрипта   должны  давать  идентичные  файлы.  XS
использовать  нельзя. Пишем только на перле. Нельзя увеличивать размер
файла за счёт добавления комментариев и прочих метаданных. Изображение
создаётся в последней версии Imager-а.

Считается  отношение  размера  файла,  на  время  работы.  У  кого это
отношение будет наибольшим, тот и победил.

При  этом  каждый  может  проверить  код  другого  участника у себя на
компьютере.  Результаты конечно могут отличаться, но это не важно, ибо
в  процессе  конкурса  будет  видно, кто предлагает лучше оригинальные
идеи,  кто  лучше  оптимизирует  реализации чужих и т.п. Заодно узнаем
силу коллективного разума, и существует ли он вообще. :-)

Вот первая и самая примитивная версия генерилки файла:

#!/usr/bin/perl
use strict;
use warnings;

use Imager;
use Time::HiRes qw(time);

my $filename = 'competition.jpg';
my $image = Imager->new(xsize=>1024, ysize=>1024);
my $before = time();

# этот блок кода надо ускорить
srand(123);
for (my $i=0; $i<39293; $i++) {
        my $color = Imager::Color->new(rand(255), rand(255), rand(255) );
        $image->setpixel(x=>rand(1024), y=>rand(1024), color=>$color);
}

my $after = time();
$image->write(file=>$filename) or die $image->errstr;
my $filesize = -s $filename;
my $elapsed = ($after-$before) or die 'You are winner!';

print "Time: ",$elapsed,"\nFile size: ", $filesize, "\nResult: ",$filesize/$elapsed,"\n";

P.S.
Я никого не нанимаю. Конкурс исключительно ради развлечения.

-- 
С уважением,
 Михаил                          mailto:postmaster на softsearch.ru



Подробная информация о списке рассылки Moscow-pm