週刊Challenge - Cenz - 079タスク
私がperl weekly challengeに加入してから10週間が経ちました.
私はプロのプログラマーではありませんが、私はPerlといくつかのC言語での経験を持っています.これは基本的にPerl/RAKUの言語ですが、“他の言語”では、多くの興味深い課題を解決することができます-“ゲスト”と呼ばれるサイトの-と他のコードを見て、素晴らしいレビューをお楽しみください.
私は他から多くのものを学びました、それらのいくつかはまだミステリーであります、しかし、それはそのような大きなチャンス~!
私はおそらく来週からのコードに忙しすぎて、おそらく私は過去数週間で行ったように参加することはできません.皆さんに感謝してブログを投稿しました.
…
This is task #2の解決方法は、広範囲の解決方法でなければなりません.
私は左側のデータから出発しているだけで、右側の側を見ている場合、左よりも大きい(または等しい)壁がある場合.
私は、貯水池が持つことができるあらゆる機会で水容量を計算しました.
番目の最も高い壁(左の境界より小さいです)を見つけることによって、そして、私がそうしなければならなかったならば、容量を計算してください.
しかし、これは我々がしなければならないことだけではありません.
私たちはヒストグラムを印刷する必要があります!私は75 kgで印刷する経験があります.しかし、コード自体は少し長いです
いくつかのUnicode文字と色を追加したいので.
それで、それが私のRXVTユニコードの上にあるならば、これは私が見ている方法です
そして、あなたが見たいならば、これはコードです
私はプロのプログラマーではありませんが、私はPerlといくつかのC言語での経験を持っています.これは基本的にPerl/RAKUの言語ですが、“他の言語”では、多くの興味深い課題を解決することができます-“ゲスト”と呼ばれるサイトの-と他のコードを見て、素晴らしいレビューをお楽しみください.
私は他から多くのものを学びました、それらのいくつかはまだミステリーであります、しかし、それはそのような大きなチャンス~!
私はおそらく来週からのコードに忙しすぎて、おそらく私は過去数週間で行ったように参加することはできません.皆さんに感謝してブログを投稿しました.
…
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 kgで印刷する経験があります.しかし、コード自体は少し長いです
いくつかのUnicode文字と色を追加したいので.
それで、それが私のRXVTユニコードの上にあるならば、これは私が見ている方法です
そして、あなたが見たいならば、これはコードです
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
この問題について(週刊Challenge - Cenz - 079タスク), 我々は、より多くの情報をここで見つけました https://dev.to/jeongoon/the-perl-weekly-challenge-079-9ijテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol