diff options
| author | Roger Bell_West <roger@firedrake.org> | 2024-01-16 14:13:30 +0000 |
|---|---|---|
| committer | Roger Bell_West <roger@firedrake.org> | 2024-01-16 14:13:30 +0000 |
| commit | 81e18817e54f47758158bc184be04b8c2ea3107f (patch) | |
| tree | 529f47d72368ed8da59830703afe02961d7fc150 | |
| parent | 7efb373bb9adffa79f84825217015835805298b5 (diff) | |
| download | perlweeklychallenge-club-81e18817e54f47758158bc184be04b8c2ea3107f.tar.gz perlweeklychallenge-club-81e18817e54f47758158bc184be04b8c2ea3107f.tar.bz2 perlweeklychallenge-club-81e18817e54f47758158bc184be04b8c2ea3107f.zip | |
RogerBW solutions for challenge no. 252
21 files changed, 759 insertions, 0 deletions
diff --git a/challenge-252/roger-bell-west/javascript/ch-1.js b/challenge-252/roger-bell-west/javascript/ch-1.js new file mode 100755 index 0000000000..079ec31913 --- /dev/null +++ b/challenge-252/roger-bell-west/javascript/ch-1.js @@ -0,0 +1,26 @@ +#! /usr/bin/node + +"use strict" + +function specialnumbers(a) { + let t = 0; + a.forEach((n, i) => { + if (a.length % (i + 1) == 0) { + t += n * n; + } + }); + return t; +} + +if (specialnumbers([1, 2, 3, 4]) == 21) { + process.stdout.write("Pass"); +} else { + process.stdout.write("FAIL"); +} +process.stdout.write(" "); +if (specialnumbers([2, 7, 1, 19, 18, 3]) == 63) { + process.stdout.write("Pass"); +} else { + process.stdout.write("FAIL"); +} +process.stdout.write("\n"); diff --git a/challenge-252/roger-bell-west/javascript/ch-2.js b/challenge-252/roger-bell-west/javascript/ch-2.js new file mode 100755 index 0000000000..d5c713cae2 --- /dev/null +++ b/challenge-252/roger-bell-west/javascript/ch-2.js @@ -0,0 +1,58 @@ +#! /usr/bin/node + +"use strict" + +// by Frank Tan +// https://stackoverflow.com/questions/38400594/javascript-deep-comparison +function deepEqual(a,b) +{ + if( (typeof a == 'object' && a != null) && + (typeof b == 'object' && b != null) ) + { + var count = [0,0]; + for( var key in a) count[0]++; + for( var key in b) count[1]++; + if( count[0]-count[1] != 0) {return false;} + for( var key in a) + { + if(!(key in b) || !deepEqual(a[key],b[key])) {return false;} + } + for( var key in b) + { + if(!(key in a) || !deepEqual(b[key],a[key])) {return false;} + } + return true; + } + else + { + return a === b; + } +} + +function uniquesumzero(n) { + if (n == 1) { + return [0]; + } + let p = Array(n - 1).fill().map((element, index) => index + 1); + p.push(-n * (n-1) / 2); + return p; +} + +if (deepEqual(uniquesumzero(5), [1, 2, 3, 4, -10])) { + process.stdout.write("Pass"); +} else { + process.stdout.write("FAIL"); +} +process.stdout.write(" "); +if (deepEqual(uniquesumzero(3), [1, 2, -3])) { + process.stdout.write("Pass"); +} else { + process.stdout.write("FAIL"); +} +process.stdout.write(" "); +if (deepEqual(uniquesumzero(1), [0])) { + process.stdout.write("Pass"); +} else { + process.stdout.write("FAIL"); +} +process.stdout.write("\n"); diff --git a/challenge-252/roger-bell-west/kotlin/ch-1.kt b/challenge-252/roger-bell-west/kotlin/ch-1.kt new file mode 100644 index 0000000000..7bff2fa828 --- /dev/null +++ b/challenge-252/roger-bell-west/kotlin/ch-1.kt @@ -0,0 +1,26 @@ +fun specialnumbers(a: List<Int>): Int { + var t = 0 + a.forEachIndexed {i, n -> + if (a.size % (i + 1) == 0) { + t += n * n + } + } + return t +} + +fun main() { + + if (specialnumbers(listOf(1, 2, 3, 4)) == 21) { + print("Pass") + } else { + print("Fail") + } + print(" ") + if (specialnumbers(listOf(2, 7, 1, 19, 18, 3)) == 63) { + print("Pass") + } else { + print("Fail") + } + println("") + +} diff --git a/challenge-252/roger-bell-west/kotlin/ch-2.kt b/challenge-252/roger-bell-west/kotlin/ch-2.kt new file mode 100644 index 0000000000..38fc67172e --- /dev/null +++ b/challenge-252/roger-bell-west/kotlin/ch-2.kt @@ -0,0 +1,31 @@ + fun uniquesumzero(n: Int): List<Int> { + if (n == 1) { + return listOf(0) + } + var p = ArrayList(generateSequence(1) { it + 1 }.take(n - 1).toList()) + p.add(-n * (n-1) / 2) + return p.toList() + } + +fun main() { + + if (uniquesumzero(5) == listOf(1, 2, 3, 4, -10)) { + print("Pass") + } else { + print("Fail") + } + print(" ") + if (uniquesumzero(3) == listOf(1, 2, -3)) { + print("Pass") + } else { + print("Fail") + } + print(" ") + if (uniquesumzero(1) == listOf(0)) { + print("Pass") + } else { + print("Fail") + } + println("") + +} diff --git a/challenge-252/roger-bell-west/lua/ch-1.lua b/challenge-252/roger-bell-west/lua/ch-1.lua new file mode 100755 index 0000000000..de7ec27e60 --- /dev/null +++ b/challenge-252/roger-bell-west/lua/ch-1.lua @@ -0,0 +1,26 @@ +#! /usr/bin/lua + +function specialnumbers(a) + local t = 0 + for i, n in ipairs(a) do + if #a % i == 0 then + t = t + n * n + end + end + return t +end + +if specialnumbers({1, 2, 3, 4}) == 21 then + io.write("Pass") +else + io.write("FAIL") +end +io.write(" ") + +if specialnumbers({2, 7, 1, 19, 18, 3}) == 63 then + io.write("Pass") +else + io.write("FAIL") +end +print("") + diff --git a/challenge-252/roger-bell-west/lua/ch-2.lua b/challenge-252/roger-bell-west/lua/ch-2.lua new file mode 100755 index 0000000000..b262f82a1e --- /dev/null +++ b/challenge-252/roger-bell-west/lua/ch-2.lua @@ -0,0 +1,64 @@ +#! /usr/bin/lua + +-- by Michael Anderson at +-- https://stackoverflow.com/questions/8722620/comparing-two-index-tables-by-index-value-in-lua +-- modified by Roger +function recursive_compare(t1,t2) + -- Use usual comparison first. + if t1==t2 then return true end + -- We only support non-default behavior for tables + if (type(t1)~="table") then return false end + -- They better have the same metatables + local mt1 = getmetatable(t1) + local mt2 = getmetatable(t2) + if( not recursive_compare(mt1,mt2) ) then return false end + -- Build list of all keys + local kk = {} + for k1, _ in pairs(t1) do + kk[k1] = true + end + for k2, _ in pairs(t2) do + kk[k2] = true + end + -- Check each key that exists in at least one table + for _, k in ipairs(kk) do + if (not recursive_compare(t1[k], t2[k])) then + return false + end + end + return true +end + +function uniquesumzero(n) + if n == 1 then + return { 0 } + end + local p = {} + for j = 1, n-1 do + table.insert(p, j) + end + table.insert(p, -n * (n-1) / 2) + return p +end + +if recursive_compare(uniquesumzero(5), {1, 2, 3, 4, -10}) then + io.write("Pass") +else + io.write("FAIL") +end +io.write(" ") + +if recursive_compare(uniquesumzero(3), {1, 2, -3}) then + io.write("Pass") +else + io.write("FAIL") +end +io.write(" ") + +if recursive_compare(uniquesumzero(1), {0}) then + io.write("Pass") +else + io.write("FAIL") +end +print("") + diff --git a/challenge-252/roger-bell-west/perl/ch-1.pl b/challenge-252/roger-bell-west/perl/ch-1.pl new file mode 100755 index 0000000000..add86f3523 --- /dev/null +++ b/challenge-252/roger-bell-west/perl/ch-1.pl @@ -0,0 +1,20 @@ +#! /usr/bin/perl + +use strict; +use warnings; +use experimental 'signatures'; + +use Test::More tests => 2; + +is(specialnumbers([1, 2, 3, 4]), 21, 'example 1'); +is(specialnumbers([2, 7, 1, 19, 18, 3]), 63, 'example 2'); + +sub specialnumbers($a) { + my $t = 0; + foreach my $i (0 .. $#{$a}) { + if ((scalar @{$a}) % ($i + 1) == 0) { + $t += $a->[$i] * $a->[$i]; + } + } + return $t; +} diff --git a/challenge-252/roger-bell-west/perl/ch-2.pl b/challenge-252/roger-bell-west/perl/ch-2.pl new file mode 100755 index 0000000000..69e52e5f3a --- /dev/null +++ b/challenge-252/roger-bell-west/perl/ch-2.pl @@ -0,0 +1,20 @@ +#! /usr/bin/perl + +use strict; +use warnings; +use experimental 'signatures'; + +use Test::More tests => 3; + +is_deeply(uniquesumzero(5), [1, 2, 3, 4, -10], 'example 1'); +is_deeply(uniquesumzero(3), [1, 2, -3], 'example 2'); +is_deeply(uniquesumzero(1), [0], 'example 3'); + +sub uniquesumzero($n) { + if ($n == 1) { + return [0]; + } + my @p = (1 .. $n - 1); + push @p, -$n * ($n - 1) / 2; + return \@p; +} diff --git a/challenge-252/roger-bell-west/postscript/ch-1.ps b/challenge-252/roger-bell-west/postscript/ch-1.ps new file mode 100644 index 0000000000..7a105b6057 --- /dev/null +++ b/challenge-252/roger-bell-west/postscript/ch-1.ps @@ -0,0 +1,100 @@ +%!PS + +% begin included library code +% see https://codeberg.org/Firedrake/postscript-libraries/ +/test { + /test.count test.count 1 add def + { + /test.pass test.pass 1 add def + } { + ( ) print + test.count (....) cvs print + (-fail) print + } ifelse +} bind def + +/filter { % array proc(bool) -> array + 1 dict begin + /p exch def + [ exch + { + dup p not + { + pop + } if + } forall + ] + end +} bind def + +/map { % array proc -> array + 2 dict begin + /p exch def + [ exch + { + p + } forall + ] + end +} bind def + +/test.end { + ( ) print + test.count 0 gt { + (Passed ) print + test.pass (...) cvs print + (/) print + test.count (...) cvs print + ( \() print + test.pass 100 mul test.count idiv (...) cvs print + (%\)) print + (\r\n) print + } if +} bind def + +/test.start { + print (:) print + /test.pass 0 def + /test.count 0 def +} bind def + +/enumerate.array { + 1 dict begin + /a exch def + [ + 0 1 a length 1 sub { + [ exch dup a exch get ] + } for + ] + end +} bind def + +/reduce { % array proc -> value + 2 dict begin + /p exch def + /a exch def + a 0 get + 1 1 a length 1 sub { + a exch get + p + } for + end +} bind def + + +% end included library code + +/specialnumbers { + 0 dict begin + dup /l exch length def + enumerate.array + { 0 get 1 add l exch mod 0 eq } filter + { 1 get dup mul } map + { add } reduce + end +} bind def + +(specialnumbers) test.start +[1 2 3 4] specialnumbers 21 eq test +[2 7 1 19 18 3] specialnumbers 63 eq test +test.end diff --git a/challenge-252/roger-bell-west/postscript/ch-2.ps b/challenge-252/roger-bell-west/postscript/ch-2.ps new file mode 100644 index 0000000000..b3797f0aea --- /dev/null +++ b/challenge-252/roger-bell-west/postscript/ch-2.ps @@ -0,0 +1,116 @@ +%!PS + +% begin included library code +% see https://codeberg.org/Firedrake/postscript-libraries/ +/test.end { + ( ) print + test.count 0 gt { + (Passed ) print + test.pass (...) cvs print + (/) print + test.count (...) cvs print + ( \() print + test.pass 100 mul test.count idiv (...) cvs print + (%\)) print + (\r\n) print + } if +} bind def + +/test { + /test.count test.count 1 add def + { + /test.pass test.pass 1 add def + } { + ( ) print + test.count (....) cvs print + (-fail) print + } ifelse +} bind def + +/deepeq { + 2 dict begin + /a exch def + /b exch def + a type b type eq { + a type /dicttype eq { + a length b length eq { + << + a { + pop + true + } forall + b { + pop + true + } forall + >> + true exch + { + pop + dup a exch known { + dup b exch known { + dup a exch get exch b exch get deepeq not { + pop false + } if + } { + false + } ifelse + } { + false + } ifelse + } forall + } { + false + } ifelse + } { + a type dup /arraytype eq exch /stringtype eq or { + a length b length eq { + true + 0 1 a length 1 sub { + dup a exch get exch b exch get deepeq not { + pop false + exit + } if + } for + } { + false + } ifelse + } { + a b eq + } ifelse + } ifelse + } { + false + } ifelse + end +} bind def + +/test.start { + print (:) print + /test.pass 0 def + /test.count 0 def +} bind def + + +% end included library code + +/uniquesumzero { + 0 dict begin + /n exch def + n 1 eq { + [ 0 ] + } { + [ + 1 1 n 1 sub { + } for + n dup 1 sub mul neg 2 idiv + ] + } ifelse + end +} bind def + +(uniquesumzero) test.start +5 uniquesumzero [1 2 3 4 -10] deepeq test +3 uniquesumzero [1 2 -3] deepeq test +1 uniquesumzero [0] deepeq test +test.end diff --git a/challenge-252/roger-bell-west/python/ch-1.py b/challenge-252/roger-bell-west/python/ch-1.py new file mode 100755 index 0000000000..4e89dbfcc6 --- /dev/null +++ b/challenge-252/roger-bell-west/python/ch-1.py @@ -0,0 +1,20 @@ +#! /usr/bin/python3 + +def specialnumbers(a): + t = 0 + for i, v in enumerate(a): + if len(a) % (i + 1) == 0: + t += v * v + return t + +import unittest + +class TestSpecialnumbers(unittest.TestCase): + + def test_ex1(self): + self.assertEqual(specialnumbers([1, 2, 3, 4]), 21, 'example 1') + + def test_ex2(self): + self.assertEqual(specialnumbers([2, 7, 1, 19, 18, 3]), 63, 'example 2') + +unittest.main() diff --git a/challenge-252/roger-bell-west/python/ch-2.py b/challenge-252/roger-bell-west/python/ch-2.py new file mode 100755 index 0000000000..f8bf61a527 --- /dev/null +++ b/challenge-252/roger-bell-west/python/ch-2.py @@ -0,0 +1,23 @@ +#! /usr/bin/python3 + +def uniquesumzero(n): + if n == 1: + return [0] + p = list(range(1, n)) + p.append(-n * (n - 1) / 2) + return p + +import unittest + +class TestUniquesumzero(unittest.TestCase): + + def test_ex1(self): + self.assertEqual(uniquesumzero(5), [1, 2, 3, 4, -10], 'example 1') + + def test_ex2(self): + self.assertEqual(uniquesumzero(3), [1, 2, -3], 'example 2') + + def test_ex3(self): + self.assertEqual(uniquesumzero(1), [0], 'example 3') + +unittest.main() diff --git a/challenge-252/roger-bell-west/raku/ch-1.p6 b/challenge-252/roger-bell-west/raku/ch-1.p6 new file mode 100755 index 0000000000..4290a75ffa --- /dev/null +++ b/challenge-252/roger-bell-west/raku/ch-1.p6 @@ -0,0 +1,18 @@ +#! /usr/bin/raku + +use Test; + +plan 2; + +is(specialnumbers([1, 2, 3, 4]), 21, 'example 1'); +is(specialnumbers([2, 7, 1, 19, 18, 3]), 63, 'example 2'); + +sub specialnumbers(@a) { + my $t = 0; + for (0 .. @a.end) -> $i { + if (@a.elems % ($i + 1) == 0) { + $t += @a[$i] * @a[$i]; + } + } + return $t; +} diff --git a/challenge-252/roger-bell-west/raku/ch-2.p6 b/challenge-252/roger-bell-west/raku/ch-2.p6 new file mode 100755 index 0000000000..8f3935d7e1 --- /dev/null +++ b/challenge-252/roger-bell-west/raku/ch-2.p6 @@ -0,0 +1,18 @@ +#! /usr/bin/raku + +use Test; + +plan 3; + +is-deeply(uniquesumzero(5), [1, 2, 3, 4, -10], 'example 1'); +is-deeply(uniquesumzero(3), [1, 2, -3], 'example 2'); +is-deeply(uniquesumzero(1), [0], 'example 3'); + +sub uniquesumzero($n) { + if ($n == 1) { + return [0]; + } + my @p = [1 .. $n - 1]; + @p.push(-$n * ($n - 1) div 2); + return @p; +} diff --git a/challenge-252/roger-bell-west/ruby/ch-1.rb b/challenge-252/roger-bell-west/ruby/ch-1.rb new file mode 100755 index 0000000000..3302e4a406 --- /dev/null +++ b/challenge-252/roger-bell-west/ruby/ch-1.rb @@ -0,0 +1,25 @@ +#! /usr/bin/ruby + +def specialnumbers(a) + t = 0 + a.each_with_index do |n, i| + if a.length % (i + 1) == 0 then + t += n * n + end + end + return t +end + +require 'test/unit' + +class TestSpecialnumbers < Test::Unit::TestCase + + def test_ex1 + assert_equal(21, specialnumbers([1, 2, 3, 4])) + end + + def test_ex2 + assert_equal(63, specialnumbers([2, 7, 1, 19, 18, 3])) + end + +end diff --git a/challenge-252/roger-bell-west/ruby/ch-2.rb b/challenge-252/roger-bell-west/ruby/ch-2.rb new file mode 100755 index 0000000000..3568fe1292 --- /dev/null +++ b/challenge-252/roger-bell-west/ruby/ch-2.rb @@ -0,0 +1,28 @@ +#! /usr/bin/ruby + +def uniquesumzero(n) + if n == 1 then + return [0] + end + p = Array.new(n - 1) {|i| i + 1} + p.push(-n * (n-1) / 2) + return p +end + +require 'test/unit' + +class TestUniquesumzero < Test::Unit::TestCase + + def test_ex1 + assert_equal([1, 2, 3, 4, -10], uniquesumzero(5)) + end + + def test_ex2 + assert_equal([1, 2, -3], uniquesumzero(3)) + end + + def test_ex3 + assert_equal([0], uniquesumzero(1)) + end + +end diff --git a/challenge-252/roger-bell-west/rust/ch-1.rs b/challenge-252/roger-bell-west/rust/ch-1.rs new file mode 100755 index 0000000000..76fcc063d4 --- /dev/null +++ b/challenge-252/roger-bell-west/rust/ch-1.rs @@ -0,0 +1,20 @@ +#! /bin/sh +//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit + +#[test] +fn test_ex1() { + assert_eq!(specialnumbers(vec![1, 2, 3, 4]), 21); +} + +#[test] +fn test_ex2() { + assert_eq!(specialnumbers(vec![2, 7, 1, 19, 18, 3]), 63); +} + +fn specialnumbers(a: Vec<u32>) -> u32 { + a.iter() + .enumerate() + .filter(|(i, _n)| a.len() % (i + 1) == 0) + .map(|(_i, n)| n * n) + .sum() +} diff --git a/challenge-252/roger-bell-west/rust/ch-2.rs b/challenge-252/roger-bell-west/rust/ch-2.rs new file mode 100755 index 0000000000..a23ce60251 --- /dev/null +++ b/challenge-252/roger-bell-west/rust/ch-2.rs @@ -0,0 +1,26 @@ +#! /bin/sh +//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit + +#[test] +fn test_ex1() { + assert_eq!(uniquesumzero(5), vec![1, 2, 3, 4, -10]); +} + +#[test] +fn test_ex2() { + assert_eq!(uniquesumzero(3), vec![1, 2, -3]); +} + +#[test] +fn test_ex3() { + assert_eq!(uniquesumzero(1), vec![0]); +} + +fn uniquesumzero(n: i32) -> Vec<i32> { + if n == 1 { + return vec![0]; + } + let mut p = (1..n).collect::<Vec<i32>>(); + p.push(-n * (n - 1) / 2); + p +} diff --git a/challenge-252/roger-bell-west/scala/ch-1.scala b/challenge-252/roger-bell-west/scala/ch-1.scala new file mode 100644 index 0000000000..01edd50657 --- /dev/null +++ b/challenge-252/roger-bell-west/scala/ch-1.scala @@ -0,0 +1,27 @@ + +object Specialnumbers { + def specialnumbers(a: List[Int]): Int = { + var t = 0 + for ((n, i) <- a.zipWithIndex) { + if (a.length % (i + 1) == 0) { + t += n * n + } + } + return t + } + def main(args: Array[String]) { + if (specialnumbers(List(1, 2, 3, 4)) == 21) { + print("Pass") + } else { + print("Fail") + } + print(" ") + if (specialnumbers(List(2, 7, 1, 19, 18, 3)) == 63) { + print("Pass") + } else { + print("Fail") + } + println("") + + } +} diff --git a/challenge-252/roger-bell-west/scala/ch-2.scala b/challenge-252/roger-bell-west/scala/ch-2.scala new file mode 100644 index 0000000000..f4d30ac857 --- /dev/null +++ b/challenge-252/roger-bell-west/scala/ch-2.scala @@ -0,0 +1,33 @@ +import scala.collection.mutable.ListBuffer + +object Uniquesumzero { + def uniquesumzero(n: Int): List[Int] = { + if (n == 1) { + return List(0) + } + var p = List.range(1, n).to[ListBuffer] + p += -n * (n-1) / 2 + return p.toList + } + def main(args: Array[String]) { + if (uniquesumzero(5) == List(1, 2, 3, 4, -10)) { + print("Pass") + } else { + print("Fail") + } + print(" ") + if (uniquesumzero(3) == List(1, 2, -3)) { + print("Pass") + } else { + print("Fail") + } + print(" ") + if (uniquesumzero(1) == List(0)) { + print("Pass") + } else { + print("Fail") + } + println("") + + } +} diff --git a/challenge-252/roger-bell-west/tests.yaml b/challenge-252/roger-bell-west/tests.yaml new file mode 100644 index 0000000000..44b469c187 --- /dev/null +++ b/challenge-252/roger-bell-west/tests.yaml @@ -0,0 +1,34 @@ +--- +ch-1: + - function: specialnumbers + arguments: + - 1 + - 2 + - 3 + - 4 + result: 21 + - arguments: + - 2 + - 7 + - 1 + - 19 + - 18 + - 3 + result: 63 +ch-2: + - function: uniquesumzero + arguments: 5 + result: + - 1 + - 2 + - 3 + - 4 + - -10 + - arguments: 3 + result: + - 1 + - 2 + - -3 + - arguments: 1 + result: + - 0 |
