주간 챌린지 - #079 작업 #2::Perl
저는 전문 프로그래머는 아니지만 perl과 C lang에 대한 경험이 있습니다. 이것은 기본적으로 perl/raku 언어를 위한 것이지만 사이트에서 "Guest"라고 하는 "Other Language"의 많은 흥미로운 문제를 해결할 수 있으며 다른 사람의 코드를 살펴보고 환상적인 리뷰도 즐길 수 있습니다.
다른 분들에게 많은 것을 배웠고 아직 미스테리한 부분도 있지만 너무 좋은 기회였어요~!!
다음주부터는 너무 바빠서 코딩을 못 할 것 같고, 지난주처럼 참여할 수 없을 것 같습니다. 나는 그들 모두에게 감사하고 그것에 대해 블로그를 게시하기로 결정하고 싶습니다.
그래서..
This is task #2 솔루션과 다양한 솔루션 방법이 있어야 합니다.
나는 왼쪽 데이터에서 시작하여 오른쪽만 살펴보고 왼쪽보다 더 큰(또는 동일한) 벽이 있는지 확인합니다.
가능한 저수지가 담을 수 있는 모든 경우의 물 용량을 계산했습니다.
...
for ( my $x = 1; $x < @T; ) {
if ( $left <= $T[$x] ) { # increasing only: no useful data
( $start, $left ) = ( $x, $T[$x] );
++$x;
}
elsif ( (my $ri = firstidx { $_ >= $left } @T[$x..$#T]) >= 0 ) {
my $abs_ri = $x+$ri;
my $water_level = min( $left, $T[$abs_ri] );
for (($start+1) .. ($abs_ri-1)) { # water area only
$W[$_] = $water_level - $T[$_]
}
( $start, $left ) = ( $x, $T[$abs_ri] );
$x += $ri;
}
...
그러나이 접근 방식은 마지막 섹션에서 문제가 있습니다. 나는 그것을 수정해야했다
두 번째로 높은 벽(왼쪽 경계보다 작음)을 찾아서 필요한 경우 용량을 계산합니다.
else { # generally decreasing ...
# find a tallest one as right boundary
my $tallest = max @T[$x .. $#T];
if ( (my $ri = firstidx { $_ == $tallest } @T[$x..$#T]) >= 0 ) {
my $abs_ri = $x+$ri;
my $water_level = min( $left, $T[$abs_ri] );
for (($start+1) .. ($abs_ri-1)) {
$W[$_] = $water_level - $T[$_];
}
( $start, $left ) = ( $x, $T[$x] );
++$x;
}
}
...
따라서 여기서 @W 배열을 합산하면 총 용량을 얻을 수 있습니다.
그러나 이것은 우리가 해야 할 일만이 아닙니다.
우리는 히스토그램을 인쇄해야 합니다!! 저는 #75에 인쇄한 경험이 있어서 그리 어렵지 않았습니다. 근데 코드 자체가 좀 길다
유니코드 문자와 색상을 추가하고 싶기 때문입니다.
이것이 내 rxvt-unicode에 있는지 확인하는 방법입니다.
보고 싶다면 코드입니다.
sub ssprintf ($$) { sprintf "%#$_[0]s", $_[1] }
sub map_ssprintf { map { sprintf "%#$_[0]s", $_ } @_[1..$#_] }
sub u_($) { # unicode
return $_[0] unless $::utf8;
my $a = shift;
state %u = ( qw{` └
- ─
| │
~ ≈}, '#' => '■' );
$u{$a} // $a
}
sub ch($$;$) { # unicode with colour
my $a = shift;
my $ww = shift // 2;
my $colour_str = shift;
if ( $::colour and defined $colour_str ) {
$a eq '#' and $a = ' '; # distinguish by color
return colored( [ $colour_str ], ssprintf $ww, u_$a );
}
return ssprintf $ww, u_$a;
}
sub printTrappedInWater {
my @T = @{$_[0]}; # territory heights
my @W = @{$_[1]}; # water capacty
my $maxh = max @T; # max height
my $ww = 1 + length $maxh; # word width
for my $y ( reverse 1 .. $maxh ) {
my $line = ssprintf $ww, $y;
$line .= u_"|";
for my $x ( 0.. $#T ) {
my $ch;
if ( $T[$x] >= $y ) {
$ch = ch("#", $ww, 'black on_yellow' );
}
elsif ( $W[$x] > 0 and $T[$x]+$W[$x] >= $y ) {
$ch = ch("~", $ww, 'black on_cyan');
}
else {
$ch = ch(" ", $ww);
}
$line .= $ch;
}
say $line;
}
say ssprintf( $ww, " " ), u_"`",
map_ssprintf( $ww, ( (u_("-") x $ww ) x scalar @T ) );
say ssprintf($ww, " "), " ",map_ssprintf( $ww, @T );
}
그래서.. 어떻게 생각해? 왜 PWC에 가입하지 않습니까??
Reference
이 문제에 관하여(주간 챌린지 - #079 작업 #2::Perl), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jeongoon/the-perl-weekly-challenge-079-9ij텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)