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

топ 100 блогов hardsign — 08.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;

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

Архив записей в блогах:
Возвращалась как-то недавно домой. Похолодало, погода унылая, с неба капает, кругом проблемы, настроение не очень. Спустилась в метро. Там хмурые люди в серо-черной одежде, тоже мало позитива. Еще на эскалаторе услышала звуки музыки, потом увидела толпу народу. Остановилась, послушала. ...
На днях была 90-х летняя годовщина военного переворота в Польше, когда к власти в результате трехдневных боев (примерно 300 убитых и 1000 раненых) пришли военные во главе с маршалом Пилсудским. После чего в Польше до самой Второй мировой войны правила диктатура очень схожая с нынешним прав ...
Таки говорят в Пентагоне есть вменяемые люди, которые заслышав идею ввязываться в полноценную заварушку таки потупились, и мягко послали на хуй с этой просьбой несуразной. Понятное дело, неокони не сдаются, и продолжают пытаться. Но пока, говорят, они делают все то же, что раньше - ...
1. Зазеркалье 2. Осенняя цундера 3. Драконяши 4. С криком "Кия" и ударом ноги 5. Оранж Пеко 6. Дождливый день 7. Под сакурой 8. Ведьмо-нэка 9. Девочка с бабочками 10. Сакура в цвету 11. Босоногая меганэкка 12. Пять часов чего? ...
Это какой-то капец, везде транслируют еврейскую точку зрения. Особо понравился российский канал Известия - IZ.  Там показали, как израиль нанёс удары по ракетнм установкам, по ядерному объекту, а потом показали разшушенный жилой дом в Тель-Авиве с погибшими мирными жителями, причем, ...