diff options
| author | Rick Bychowski <rick@hiranyaloka.com> | 2022-05-22 05:33:13 -0700 |
|---|---|---|
| committer | Rick Bychowski <rick@hiranyaloka.com> | 2022-05-22 05:33:13 -0700 |
| commit | f1396895b8cb450de429d5e543355a0af5df4b5f (patch) | |
| tree | d8b276dc896e8ba05992b84b2be7359782164ecb | |
| parent | 914fc5dec5a114e33e1acc3504f38e85654daf9e (diff) | |
| download | perlweeklychallenge-club-f1396895b8cb450de429d5e543355a0af5df4b5f.tar.gz perlweeklychallenge-club-f1396895b8cb450de429d5e543355a0af5df4b5f.tar.bz2 perlweeklychallenge-club-f1396895b8cb450de429d5e543355a0af5df4b5f.zip | |
ch-165 SVG and Line of Best Fit
| -rwxr-xr-x | challenge-165/rick-bychowski/raku/ch-1.raku | 33 | ||||
| -rwxr-xr-x | challenge-165/rick-bychowski/raku/ch-2.raku | 68 | ||||
| -rw-r--r-- | challenge-165/rick-bychowski/raku/ch1.data | 4 | ||||
| -rw-r--r-- | challenge-165/rick-bychowski/raku/ch2.data | 6 |
4 files changed, 111 insertions, 0 deletions
diff --git a/challenge-165/rick-bychowski/raku/ch-1.raku b/challenge-165/rick-bychowski/raku/ch-1.raku new file mode 100755 index 0000000000..072d0d0028 --- /dev/null +++ b/challenge-165/rick-bychowski/raku/ch-1.raku @@ -0,0 +1,33 @@ +#!/usr/bin/env raku +use SVG; + +sub MAIN( Str $datafile where .IO ~~ :e = './ch1.data'){ + + my $svg = svg => [ + :width(300), + :height(100), + :text(:x(10),:y(80),'Challenge 165 #1'), + ]; + + for $datafile.IO.lines -> $line { + my @p = $line.split(",",:skip-empty); + if @p.elems == 4 { + my ($x1, $y1, $x2, $y2) = @p; + my $line = line => [ + :x1($x1), + :y1($y1), + :x2($x2), + :y2($y2), + :style("stroke:rgb(0,0,0);stroke-width:2") + ]; + $svg.<svg>.push: $line; + } elsif @p.elems == 2 { + my ($x, $y) = @p; + my $circle = circle => [:cx($x.Int), :cy($y.Int), :r(5), :fill('red')]; + $svg.<svg>.push: $circle; + } + } + + say SVG.serialize($svg); +} + diff --git a/challenge-165/rick-bychowski/raku/ch-2.raku b/challenge-165/rick-bychowski/raku/ch-2.raku new file mode 100755 index 0000000000..d7766e189b --- /dev/null +++ b/challenge-165/rick-bychowski/raku/ch-2.raku @@ -0,0 +1,68 @@ +#!/usr/bin/env raku +use SVG; +use Data::Dump; + +# https://theweeklychallenge.org/blog/perl-weekly-challenge-165/ +# Least Squares Regression +# https://www.mathsisfun.com/data/least-squares-regression.html + +sub MAIN( Str $datafile where .IO ~~ :e = './ch2.data'){ + my @dots; + + my $svg = svg => []; + + my Int $sum_x; + my Int $sum_y; + my Int $sum_xy; + my Int $sum_xx; + my Int $max_x = 0; + my Int $max_y = 0; + my Int $N = 0; + + for $datafile.IO.lines -> $line { + my @points = $line.split(/\s+/,:skip-empty).map: {[.split(",").map: {.Int}]}; + for @points -> @p { + $N++; + my ($x, $y) = @p; + $max_x = $x if $x > $max_x; + $max_y = $y if $y > $max_y; + $sum_x += $x; + $sum_y += $y; + $sum_xy += $x * $y; + $sum_xx += $x**2; + my $circle = circle => [:cx($x.Int), :cy($y.Int), :r(3), :fill('black')]; + $svg.<svg>.push: $circle; + } + } + + my $width = $max_x + 30; + my $height = $max_y + 30; + $svg.<svg>.push: :width( $width ); + $svg.<svg>.push: :height( $height ); + my $text = text => [:x(10), :y($height), 'Challenge 165 #2']; + $svg.<svg>.push: $text; + + my $slope = ( + $N * $sum_xy - $sum_x * $sum_y + ) / ( + $N * $sum_xx - $sum_x**2 + ); + + my $y_int = ($sum_y - $slope * $sum_x) / $N; + + # Find y value for max x value + my $y_max_x = $slope * $max_x + $y_int; + + # Draw line from ( 0, y_int) and ( max_x, y @ max_x) + my $line = line => [ + :x1(0), + :y1($y_int), + :x2($max_x), + :y2($y_max_x), + :style("stroke:rgb(255,0,0);stroke-width:2") + ]; + $svg.<svg>.push: $line; + + say SVG.serialize($svg); +} + diff --git a/challenge-165/rick-bychowski/raku/ch1.data b/challenge-165/rick-bychowski/raku/ch1.data new file mode 100644 index 0000000000..b513bb61cd --- /dev/null +++ b/challenge-165/rick-bychowski/raku/ch1.data @@ -0,0 +1,4 @@ +53,10 +53,10,23,30 +23,30 + diff --git a/challenge-165/rick-bychowski/raku/ch2.data b/challenge-165/rick-bychowski/raku/ch2.data new file mode 100644 index 0000000000..9e5ecc346a --- /dev/null +++ b/challenge-165/rick-bychowski/raku/ch2.data @@ -0,0 +1,6 @@ +333,129 39,189 140,156 292,134 393,52 160,166 362,122 13,193 +341,104 320,113 109,177 203,152 343,100 225,110 23,186 282,102 +284,98 205,133 297,114 292,126 339,112 327,79 253,136 61,169 +128,176 346,72 316,103 124,162 65,181 159,137 212,116 337,86 +215,136 153,137 390,104 100,180 76,188 77,181 69,195 92,186 +275,96 250,147 34,174 213,134 186,129 189,154 361,82 363,89 |
