[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