[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