О программировании

топ 100 блогов hardsign08.08.2023

О программировании Олег Макаренко публикует рассуждения о том, как отличить айтишника от неайтишника. В частности, в посте содержится задачка из ЕГЭ по программированию, причём задачка – на один балл:

О программировании

Я, понятно, считаю себя айтишником и поэтому решил быстренько написать решение. Времени, конечно, потребовалось много, минут двадцать, потому что кода «на кончиках пальцев» у меня нет, и приходится периодически заглядывать в справочник, уточняя синтаксис разных команд.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/perl

# https://olegmakarenko.ru/2774055.html

use strict;
use warnings;
use locale;
use utf8;
use open qw(:std :utf8);
use 5.010;
use Time::HiRes qw(gettimeofday tv_interval);

my @f;

sub minmax {
  my ($x, $y) = @_;
  my $c = @{$f[$y-1]}[$x-1];
  my ($mind, $maxd, $minr, $maxr);
  ($mind, $maxd) = minmax($x, $y+1) if (!($c =~ s/D//) && $y<@f);
  ($minr, $maxr) = minmax($x+1, $y) if (!($c =~ s/R//) && $x<@f);
  my $min = defined($mind) ? ($mind<($minr//1e9) ? $mind : $minr) : $minr//0;
  my $max = defined($maxd) ? ($maxd>($maxr//-1e9) ? $maxd : $maxr) : $maxr//0;
  return ($min+$c, $max+$c);
}

sub main {
  while(<>) {
    chomp;
    my @l = split /\s+/;
    push(@f, \@l);
  }
  my $start_time = [gettimeofday];
  my ($min, $max) = minmax(1,1);
  printf("min = %d, max = %d\n",$min,$max);
  printf ("Выполнено за %f секунд\n",tv_interval($start_time,[gettimeofday]));
}

$| = 1; &main;

Радостный, я публикую код в комментариях, на что хозяин блога замечает, что код работает на поле 4×4, но решения 30×30 я не дождусь.

Штош, сгенерировать исходник 30×30 – не проблема:

1
2
export cc=30
(for i in $(seq 1 ${cc}); do for j in $(seq 1 ${cc}); do echo -n $(($RANDOM % 100)) " " ; done; echo; done) | sed -re 's/ +/ /g;s/\s+$//' 

И действительно – не дождался. На поле 13×13 скрипт уже работает 17 секунд, что категорически неприемлемо.

Долго думал, могу ли я считать себя айтишником, не умея быстро писать программки для решения школьных задач. А вы как считаете?

P. S. Но если к моему скрипту добавить три строчки, то скорость его работы становится такой, какая нужна.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/perl

# https://olegmakarenko.ru/2774055.html

use strict;
use warnings;
use locale;
use utf8;
use open qw(:std :utf8);
use 5.010;
use Time::HiRes qw(gettimeofday tv_interval);

my @f;
my %pc;

sub minmax {
  my ($x, $y) = @_;
  return @{$pc{$x."-".$y}} if (exists($pc{$x."-".$y}));
  my $c = @{$f[$y-1]}[$x-1];
  my ($mind, $maxd, $minr, $maxr);
  ($mind, $maxd) = minmax($x, $y+1) if (!($c =~ s/D//) && $y<@f);
  ($minr, $maxr) = minmax($x+1, $y) if (!($c =~ s/R//) && $x<@f);
  my $min = defined($mind) ? ($mind<($minr//1e9) ? $mind : $minr) : $minr//0;
  my $max = defined($maxd) ? ($maxd>($maxr//-1e9) ? $maxd : $maxr) : $maxr//0;
  $pc{$x."-".$y} = [$min+$c, $max+$c];
  return ($min+$c, $max+$c);
}

sub main {
  while(<>) {
    chomp;
    my @l = split /\s+/;
    push(@f, \@l);
  }
  my $start_time = [gettimeofday];
  my ($min, $max) = minmax(1,1);
  printf("min = %d, max = %d\n",$min,$max);
  printf ("Выполнено за %f секунд\n",tv_interval($start_time,[gettimeofday]));
}

$| = 1; &main;

Оставить комментарий

Архив записей в блогах:
В понедельник очень устала. Булатов не спал полночи от почечных колик, вставала ему за таблетками и водой, и вообще беспокоилась. Под утро мне показалось что у него поднялась температура и начался сепсис, но, наверно, приснилось... Утром он уехал раньше меня, были ранние клиенты на яхте. ...
     Около десяти лет назад я приехала в Израиль, быстро выучила иврит на достаточном для успешной профессиональной абсорбции уровне и стала жить тихо и с удовольствием, пока не развелась. А после развода я быстро поняла, что у меня ...
Окаменевший хлеб из засыпанного вулканическим пеплом древнеримского города Геркуланум. Как вы вероятно помните печально известное извержение Везувия уничтожевшее Помпеи, Геркуланум и Стабии произошло в 79 году н.э. На хлебе, сверху хорошо читаемый отттиск штампа пекаря с текстом: "Целер, ...
Вчера разговаривала с подругой Ленкой. Говорит, что в этом году у них совсем не будет яблок. Ленка, говорю, какое счастье!!! Теперь я знаю, кому мы будем отдавать наши яблоки. Мы такого бурного цветения деревьев не видели никогда! А ведь дачи у нас всего в 30 км друг от друга. ...
Ребята собираются крепко пошатнуть основы "секретных школ скоростного заряжания". Классические стрипперы уже даже и не показывают. Что же до дозарядки по одному патрону с пояса - всё возвращается; когда я начинал стрелять, "турецкий пояс" всё ...