nixp.ru v3.0

17 октября 2017,
вторник,
12:25:10 MSK

DevOps с компанией «Флант»
bazooka написал 10 апреля 2009 года в 23:19 (388 просмотров) Ведет себя неопределенно; открыл 1 тему в форуме, оставил 5 комментариев на сайте.


sub scan {
  my ($f, $l, $r)=@_;
  my @res=([$l, $r]);
  my ($c_on, $c_off)=(0, 1);
  foreach ([0, 1], [0, -1], [1, 0], [-1, 0]) {
    my ($dl, $dr)=@$_;
    my ($a, $b)=($l, $r);
    foreach (1..3) {
      $a+=$dl;
      $b+=$dr;
      last if ($a<0 or $a>9 or $b<0 or $b>9);
      if ($f->[$a][$b] == 1) {
        $c_on++;
        push @res, [$a, $b];
      } elsif ($f->[$a][$b] == 4) {
        $c_off++;
        push @res, [$a, $b];
      } else {
        last;
      }
    }
  }
  return (\@res, $c_on, $c_off);
}

че делает эта функция?

параметры ее:

$f — двумерная матрица 10х10

$l, $r — числа

переведите если можно на пхп или питон

metal
bazooka

sub scan {
  my ($f, $l, $r)=@_;#Запоминаем входные параметры.
  my @res=([$l, $r]);#Кладем в масив ссылку на список из входных параметров
  my ($c_on, $c_off)=(0, 1);#судя из назавания что-то включенное, выключенное.
  foreach ([0, 1], [0, -1], [1, 0], [-1, 0]) { #конструкция для прохода по строкам и столбцам в прямом и обратном направлении.
    my ($dl, $dr)=@$_; #текущий вариант прохода
    my ($a, $b)=($l, $r); #вероятно, входные параметры - это место, с которого надо начинать.
    foreach (1..3) { # вероятно нас интересуют только не далее 3-х квадратов от начальной точки
      $a+=$dl; #  сдвигаемся от текущей точки.
      $b+=$dr;
      last if ($a<0 or $a>9 or $b<0 or $b>9); # не допускаем выхода за границы массива.
      if ($f->[$a][$b] == 1) { # 1- что -то включено, запоминаем это место в результате
        $c_on++;
        push @res, [$a, $b];
      } elsif ($f->[$a][$b] == 4) { # 4 - что -то выключено, запоминаем это место в результате
        $c_off++;
        push @res, [$a, $b];
      } else { # в противном случае не идем дальше в этом направлении.
        last;
      }
    }
  }
  return (\@res, $c_on, $c_off); возвращаем результат.
}

че делает эта функция?

параметры ее:

$f — двумерная матрица 10х10

$l, $r — числа

переведите если можно на пхп или питон

Определяет количество чего-то в окрестностях точки.

bazooka

$f->[$a][$b]

это просто взять значение с координатами а и б? Не какая-то фунция?

metal
bazooka
$f->[$a][$b]

это просто взять значение с координатами а и б? Не какая-то фунция?

да

metal

Что бы было понятнее, $f — это не массив, а ссылка на него.

bazooka

Еще одна функция, вроде должна расставлять корабли, помогите с переводом на питон

##################################

sub create_field {

return [map {[map {0} (0..9)]} (0..9)];

}

sub set_ships {

my $f=create_field();

foreach my $len qw/4 3 3 2 2 2 1 1 1 1/ {

# ищем куда можно поставить

# формируем массив возможностей

my @ww=();

foreach my $d qw/1 2/ {

my ($lo, $ro, $dl, $dr)=$d==2?(9, 10-$len, 0, 1):(10-$len, 9, 1, 0);

foreach my $l (0..$lo) {

foreach my $r (0..$ro) {

my ($a, $b, $c)=($l, $r, 0);

foreach my $i (0..$len-1) {

$c++ if ($f->[$a][$b]==0);

$a+=$dl;

$b+=$dr;

}

if ($c==$len) {

push @ww, [$l, $r, $d];

}

}

}

}

die unless (@ww); # невероятная ситуация

# выбираем случайный

my ($l, $r, $d)=@{$ww[int(rand(@ww))]};

# устанавливаем

my ($l1, $l2, $r1, $r2)=map {$_<0?0:$_>9?9:$_}

$d==2?($l-1, $l+1, $r-1, $r+$len):

($l-1, $l+$len, $r-1, $r+1);

foreach my $a ($l1..$l2) {

foreach my $b ($r1..$r2) {

$f->[$a][$b]=2;

}

}

my ($dl, $dr)=$d==2?(0, 1):(1, 0);

foreach my $i (0..$len-1) {

$f->[$l][$r]=1;

$l+=$dl;

$r+=$dr;

}

}

return [map {[map {$_==1?1:0} @$_]} @$f];

}

bazooka

ужасно «красивый» этот перл (

myst

Какой автор кода, такой и код. Это не от языка зависит.

bazooka

согласен, но язык тоже влияет на автора

а па теме мб ктонить хотябы прокомментирует? )

myst

Не влияет. Т.е. влияет, но не в этом.

По теме: зачем делать за тебя твою работу? Там разобраться можно за час, даже если иметь только базовые знания. Если бы ты не жевал сопли и не ждал, что само с неба упадёт, давно бы уже разобрался.

bazooka

Я никого не заставляю делать за меня мою работу, я просил помощи. Сопли я не жую и написал функцию эту уже снуля. Сомневаюс что тут «за час» можно разобраться — foreach my $d qw/1 2/ О,о

спасиба народ, тему клоуз

myst

а что не так с foreach my $d qw/1 2/? Ну написано дебилом, конечно, но ясно же, что это for my $d («1», «2»).