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

Константин Рябов thekostya на gmail.com
Пт Окт 26 09:06:50 PDT 2012


$image->box(fill => {hatch=> [1,0,0,0,1,0,0,0]});

Time: 0.00926995277404785
File size: 498291
Result: 53753348.2797253



У Mons-а  

Всего точек  1024 * 1024 = 1048576
Hatch заполняет квадратами 8x8 = 64
tile_L - квадрат заполненный 2-умя буквами L  там 27 черных точек и 64 - 27 = 37 белых
всего квадратов 128 * 128 = 16384
всего черных 16384 * 27 = 442368
всего белых 16384 * 37 = 606208

Выше написанное - ответ почему 442368 точек. 

Но это превышает условия задачи 39293 точек.



Мой вариант исправляющий Mons-а

$image->box(fill => {hatch=> [254,255,255,255,254,255,255,255]});

Time: 0.00906610488891602
File size: 500339
Result: 55187868.0128333


Константин Рябов
thekostya на gmail.com



26.10.2012, в 19:38, Михаил Монашёв <postmaster на softsearch.ru> написал(а):

> Здравствуйте.
> 
> Вот  код,  дающий  пока  лучший  результат.  Основан  на  коде Руслана
> Закирова  с  подобранной  на  глаз константой для srand, дающей худшее
> сжатие  и увеличено количество точек. Они наслаиваются и увеличение до
> 40000  даёт  непревышение  лимита.
> 
> Также добавлена  проверка  на количество пикселей.
> 
> #!/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(13);
> my $dots = 40000;
> my (@color) = map Imager::Color->new(rand(255), rand(255), rand(255), 255 ), (1..30);
> my $dots_per_color = $dots/@color;
> foreach my $color (@color) {
>    $image->setpixel(
>        x => [map rand(1024), 1..$dots_per_color],
>        y => [map rand(1024), 1..$dots_per_color],
>        color => $color
>    );
> }
> 
> my $after = time();
> 
> my $black_color = Imager::Color->new(0, 0, 0);
> my $nonblack_pixels=0;
> for my $x (0..1023) {
>        for my $y (0..1023) {
>                unless ( $image->getpixel(x=>$x, y=>$y)->equals( other=>$black_color, ignore_alpha=>1) ) {
>                        $nonblack_pixels++;
>                }
>        }
> }
> if ($nonblack_pixels > 39293) {
>        die 'Too match non-black pixels: '.$nonblack_pixels;
> }
> 
> $image->write(file=>$filename) or die $image->errstr;
> my $filesize = -s $filename;
> my $elapsed = ($after-$before) or die 'You are winner!';
> 
> print "Nonblack pixels: ",$nonblack_pixels,"\nTime: ",$elapsed,"\nFile size: ", $filesize, "\nResult: ",$filesize/$elapsed,"\n";
> 
> -- 
> С уважением,
> Михаил                          mailto:postmaster на softsearch.ru
> 
> -- 
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org



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