aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-05-22 21:05:48 +0100
committerGitHub <noreply@github.com>2022-05-22 21:05:48 +0100
commit6f6e8cc7b460ac24ee4a6b6183a600ab62687029 (patch)
tree123f14bf8d4511b8b2aee1e8c370bdcd917c92aa
parent88600f28eb27deaedf5bef47f751da0c52ecb1a9 (diff)
parentf1396895b8cb450de429d5e543355a0af5df4b5f (diff)
downloadperlweeklychallenge-club-6f6e8cc7b460ac24ee4a6b6183a600ab62687029.tar.gz
perlweeklychallenge-club-6f6e8cc7b460ac24ee4a6b6183a600ab62687029.tar.bz2
perlweeklychallenge-club-6f6e8cc7b460ac24ee4a6b6183a600ab62687029.zip
Merge pull request #6134 from Hiranyaloka/ch-165
ch-165 SVG and Line of Best Fit
-rwxr-xr-xchallenge-165/rick-bychowski/raku/ch-1.raku33
-rwxr-xr-xchallenge-165/rick-bychowski/raku/ch-2.raku68
-rw-r--r--challenge-165/rick-bychowski/raku/ch1.data4
-rw-r--r--challenge-165/rick-bychowski/raku/ch2.data6
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