diff options
| author | Roger Bell_West <roger@firedrake.org> | 2024-09-10 14:53:59 +0100 |
|---|---|---|
| committer | Roger Bell_West <roger@firedrake.org> | 2024-09-10 14:53:59 +0100 |
| commit | 6c07685dde45308744705be12a38a14ced9efcb5 (patch) | |
| tree | 75c41364769a9b4bd217669f168e1751f5e08afc /challenge-286 | |
| parent | 168b71c4ba308de675a2a7959066a20f14a58501 (diff) | |
| download | perlweeklychallenge-club-6c07685dde45308744705be12a38a14ced9efcb5.tar.gz perlweeklychallenge-club-6c07685dde45308744705be12a38a14ced9efcb5.tar.bz2 perlweeklychallenge-club-6c07685dde45308744705be12a38a14ced9efcb5.zip | |
RogerBW solutions for challenge no. 286
Diffstat (limited to 'challenge-286')
| -rwxr-xr-x | challenge-286/roger-bell-west/crystal/ch-2.cr | 32 | ||||
| -rwxr-xr-x | challenge-286/roger-bell-west/javascript/ch-2.js | 49 | ||||
| -rw-r--r-- | challenge-286/roger-bell-west/kotlin/ch-2.kt | 40 | ||||
| -rwxr-xr-x | challenge-286/roger-bell-west/lua/ch-2.lua | 53 | ||||
| -rwxr-xr-x | challenge-286/roger-bell-west/perl/ch-2.pl | 35 | ||||
| -rw-r--r-- | challenge-286/roger-bell-west/postscript/ch-2.ps | 86 | ||||
| -rwxr-xr-x | challenge-286/roger-bell-west/python/ch-2.py | 45 | ||||
| -rwxr-xr-x | challenge-286/roger-bell-west/raku/ch-2.p6 | 29 | ||||
| -rwxr-xr-x | challenge-286/roger-bell-west/ruby/ch-2.rb | 37 | ||||
| -rwxr-xr-x | challenge-286/roger-bell-west/rust/ch-2.rs | 38 | ||||
| -rw-r--r-- | challenge-286/roger-bell-west/scala/ch-2.scala | 42 | ||||
| -rw-r--r-- | challenge-286/roger-bell-west/tests.json | 17 |
12 files changed, 503 insertions, 0 deletions
diff --git a/challenge-286/roger-bell-west/crystal/ch-2.cr b/challenge-286/roger-bell-west/crystal/ch-2.cr new file mode 100755 index 0000000000..39f0cf3c7d --- /dev/null +++ b/challenge-286/roger-bell-west/crystal/ch-2.cr @@ -0,0 +1,32 @@ +#! /usr/bin/crystal + +def ordergame(a) + p = a + while p.size > 1 + q = [] of Int32 + mm = true + p.each_slice(2) do |j| + if mm + q.push(j.min) + else + q.push(j.max) + end + mm = !mm + end + p = q + end + p[0] +end + +require "spec" +describe "ordergame" do + it "test_ex1" do + ordergame([2, 1, 4, 5, 6, 3, 0, 2]).should eq 1 + end + it "test_ex2" do + ordergame([0, 5, 3, 2]).should eq 0 + end + it "test_ex3" do + ordergame([9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8]).should eq 2 + end +end diff --git a/challenge-286/roger-bell-west/javascript/ch-2.js b/challenge-286/roger-bell-west/javascript/ch-2.js new file mode 100755 index 0000000000..5790c9a3bd --- /dev/null +++ b/challenge-286/roger-bell-west/javascript/ch-2.js @@ -0,0 +1,49 @@ +#! /usr/bin/node + +"use strict" + +// by VLAZ +// https://stackoverflow.com/a/59322890 +function toWindows(inputArray, size) { + return Array.from( + {length: inputArray.length - (size - 1)}, //get the appropriate length + (_, index) => inputArray.slice(index, index+size) //create the windows + ) +} + +function ordergame(a) { + let p = a; + while (p.length > 1) { + let q = []; + let mm = true; + for (let j of toWindows(p, 2)) { + if (mm) { + q.push(Math.min(...j)); + } else { + q.push(Math.max(...j)); + } + mm = !mm; + } + p = q; + } + return p[0]; +} + +if (ordergame([2, 1, 4, 5, 6, 3, 0, 2]) == 1) { + process.stdout.write("Pass"); +} else { + process.stdout.write("FAIL"); +} +process.stdout.write(" "); +if (ordergame([0, 5, 3, 2]) == 0) { + process.stdout.write("Pass"); +} else { + process.stdout.write("FAIL"); +} +process.stdout.write(" "); +if (ordergame([9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8]) == 2) { + process.stdout.write("Pass"); +} else { + process.stdout.write("FAIL"); +} +process.stdout.write("\n"); diff --git a/challenge-286/roger-bell-west/kotlin/ch-2.kt b/challenge-286/roger-bell-west/kotlin/ch-2.kt new file mode 100644 index 0000000000..6839c7cf57 --- /dev/null +++ b/challenge-286/roger-bell-west/kotlin/ch-2.kt @@ -0,0 +1,40 @@ +fun ordergame(a: List<Int>): Int { + var p = ArrayList(a) + while (p.size > 1) { + var q = ArrayList<Int>() + var mm = true + for (j in p.windowed(2)) { + if (mm) { + q += listOf(j[0], j[1]).minOrNull()!! + } else { + q += listOf(j[0], j[1]).maxOrNull()!! + } + mm = !mm + } + p = q + } + return p[0] +} + +fun main() { + + if (ordergame(listOf(2, 1, 4, 5, 6, 3, 0, 2)) == 1) { + print("Pass") + } else { + print("Fail") + } + print(" ") + if (ordergame(listOf(0, 5, 3, 2)) == 0) { + print("Pass") + } else { + print("Fail") + } + print(" ") + if (ordergame(listOf(9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8)) == 2) { + print("Pass") + } else { + print("Fail") + } + println("") + +} diff --git a/challenge-286/roger-bell-west/lua/ch-2.lua b/challenge-286/roger-bell-west/lua/ch-2.lua new file mode 100755 index 0000000000..2e80f72717 --- /dev/null +++ b/challenge-286/roger-bell-west/lua/ch-2.lua @@ -0,0 +1,53 @@ +#! /usr/bin/lua + +function windowed(a, n) + local out = {} + for i = 1, #a - n + 1 do + local t = {} + for j = i, i + n - 1 do + table.insert(t, a[j]) + end + table.insert(out, t) + end + return out +end + +function ordergame(a) + local p = a + while #p > 1 do + local q = {} + local mm = true + for _, j in ipairs(windowed(p, 2)) do + if mm then + table.insert(q, math.min(table.unpack(j))) + else + table.insert(q, math.max(table.unpack(j))) + end + mm = not mm + end + p = q + end + return p[1] +end + +if ordergame({2, 1, 4, 5, 6, 3, 0, 2}) == 1 then + io.write("Pass") +else + io.write("FAIL") +end +io.write(" ") + +if ordergame({0, 5, 3, 2}) == 0 then + io.write("Pass") +else + io.write("FAIL") +end +io.write(" ") + +if ordergame({9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8}) == 2 then + io.write("Pass") +else + io.write("FAIL") +end +print("") + diff --git a/challenge-286/roger-bell-west/perl/ch-2.pl b/challenge-286/roger-bell-west/perl/ch-2.pl new file mode 100755 index 0000000000..91eeb7341b --- /dev/null +++ b/challenge-286/roger-bell-west/perl/ch-2.pl @@ -0,0 +1,35 @@ +#! /usr/bin/perl + +use strict; +use warnings; +use experimental 'signatures'; + +use Test::More tests => 3; + +is(ordergame([2, 1, 4, 5, 6, 3, 0, 2]), 1, 'example 1'); +is(ordergame([0, 5, 3, 2]), 0, 'example 2'); +is(ordergame([9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8]), 2, 'example 3'); + +use List::Util qw(min max); +use List::MoreUtils qw(slideatatime); + +sub ordergame($a) { + my @p = @{$a}; + while (scalar @p > 1) { + my @q; + my $mm = 1; + my $dd = slideatatime 1, 2, @p; + while (my @j = $dd->()) { + if (scalar @j == 2) { + if ($mm) { + push @q, min(@j); + } else { + push @q, max(@j); + } + $mm = 1 - $mm; + } + } + @p = @q; + } + return $p[0]; +} diff --git a/challenge-286/roger-bell-west/postscript/ch-2.ps b/challenge-286/roger-bell-west/postscript/ch-2.ps new file mode 100644 index 0000000000..5de6784c25 --- /dev/null +++ b/challenge-286/roger-bell-west/postscript/ch-2.ps @@ -0,0 +1,86 @@ +%!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 + +/test.start { + print (:) print + /test.pass 0 def + /test.count 0 def +} bind def + +/rotor { + 5 dict begin + /delta exch def + /size exch def + dup length /len exch def + /ar exch def + /ix 0 def + [ + { + ix size add len gt { + exit + } if + ar ix size getinterval + /ix ix size delta add add def + } loop + ] + end +} bind def + + +% end included library code + +/ordergame { + 0 dict begin + /p exch def + { + p length 1 le { + exit + } if + /mm true def + [ + p 2 -1 rotor { + aload pop + mm { + min + } { + max + } ifelse + /mm mm not def + } forall + ] /p exch def + } loop + p 0 get + end +} bind def + +(ordergame) test.start +[2 1 4 5 6 3 0 2] ordergame 1 eq test +[0 5 3 2] ordergame 0 eq test +[9 2 1 4 5 6 0 7 3 1 3 5 7 9 0 8] ordergame 2 eq test +test.end diff --git a/challenge-286/roger-bell-west/python/ch-2.py b/challenge-286/roger-bell-west/python/ch-2.py new file mode 100755 index 0000000000..57a17abc2e --- /dev/null +++ b/challenge-286/roger-bell-west/python/ch-2.py @@ -0,0 +1,45 @@ +#! /usr/bin/python3 + +import collections +from itertools import islice + +# https://docs.python.org/3/library/itertools.html +def sliding_window(iterable, n): + # sliding_window('ABCDEFG', 4) --> ABCD BCDE CDEF DEFG + it = iter(iterable) + window = collections.deque(islice(it, n), maxlen=n) + if len(window) == n: + yield tuple(window) + for x in it: + window.append(x) + yield tuple(window) + +def ordergame(a): + p = a + while len(p) > 1: + q = [] + mm = True + for j in sliding_window(p, 2): + if mm: + q.append(min(j)) + else: + q.append(max(j)) + mm = not mm + p = q + return p[0] + + +import unittest + +class TestOrdergame(unittest.TestCase): + + def test_ex1(self): + self.assertEqual(ordergame([2, 1, 4, 5, 6, 3, 0, 2]), 1, 'example 1') + + def test_ex2(self): + self.assertEqual(ordergame([0, 5, 3, 2]), 0, 'example 2') + + def test_ex3(self): + self.assertEqual(ordergame([9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8]), 2, 'example 3') + +unittest.main() diff --git a/challenge-286/roger-bell-west/raku/ch-2.p6 b/challenge-286/roger-bell-west/raku/ch-2.p6 new file mode 100755 index 0000000000..91e324ab34 --- /dev/null +++ b/challenge-286/roger-bell-west/raku/ch-2.p6 @@ -0,0 +1,29 @@ +#! /usr/bin/raku + +use Test; + +plan 3; + +is(ordergame([2, 1, 4, 5, 6, 3, 0, 2]), 1, 'example 1'); +is(ordergame([0, 5, 3, 2]), 0, 'example 2'); +is(ordergame([9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8]), 2, 'example 3'); + +sub ordergame(@a) { + my @p = @a; + while (@p.elems > 1) { + my @q; + my $mm = True; + for @p.rotor(2 => -1) -> @j { + if (@j.elems == 2) { + if ($mm) { + @q.push(@j.min); + } else { + @q.push(@j.max); + } + $mm = 1 - $mm; + } + } + @p = @q; + } + return @p[0]; +} diff --git a/challenge-286/roger-bell-west/ruby/ch-2.rb b/challenge-286/roger-bell-west/ruby/ch-2.rb new file mode 100755 index 0000000000..26cf5cf113 --- /dev/null +++ b/challenge-286/roger-bell-west/ruby/ch-2.rb @@ -0,0 +1,37 @@ +#! /usr/bin/ruby + +def ordergame(a) + p = a + while p.size > 1 + q = [] + mm = true + p.each_slice(2) do |j| + if mm + q.push(j.min) + else + q.push(j.max) + end + mm = !mm + end + p = q + end + p[0] +end + +require 'test/unit' + +class TestOrdergame < Test::Unit::TestCase + + def test_ex1 + assert_equal(1, ordergame([2, 1, 4, 5, 6, 3, 0, 2])) + end + + def test_ex2 + assert_equal(0, ordergame([0, 5, 3, 2])) + end + + def test_ex3 + assert_equal(2, ordergame([9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8])) + end + +end diff --git a/challenge-286/roger-bell-west/rust/ch-2.rs b/challenge-286/roger-bell-west/rust/ch-2.rs new file mode 100755 index 0000000000..1a0411166b --- /dev/null +++ b/challenge-286/roger-bell-west/rust/ch-2.rs @@ -0,0 +1,38 @@ +#! /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!(ordergame(vec![2, 1, 4, 5, 6, 3, 0, 2]), 1); +} + +#[test] +fn test_ex2() { + assert_eq!(ordergame(vec![0, 5, 3, 2]), 0); +} + +#[test] +fn test_ex3() { + assert_eq!( + ordergame(vec![9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8]), + 2 + ); +} + +fn ordergame(a: Vec<u32>) -> u32 { + let mut p = a; + while p.len() > 1 { + let mut q = Vec::new(); + let mut mm = true; + for j in p.windows(2) { + if mm { + q.push(j[0].min(j[1])); + } else { + q.push(j[0].max(j[1])); + } + mm = !mm; + } + p = q; + } + p[0] +} diff --git a/challenge-286/roger-bell-west/scala/ch-2.scala b/challenge-286/roger-bell-west/scala/ch-2.scala new file mode 100644 index 0000000000..9689261cbc --- /dev/null +++ b/challenge-286/roger-bell-west/scala/ch-2.scala @@ -0,0 +1,42 @@ +import scala.collection.mutable.ListBuffer + +object Ordergame { + def ordergame(a: List[Int]): Int = { + var p = a.to[ListBuffer] + while (p.size > 1) { + var q = new ListBuffer[Int] + var mm = true + for (j <- p.sliding(2)) { + if (mm) { + q += List(j(0), j(1)).min + } else { + q += List(j(0), j(1)).max + } + mm = !mm + } + p = q + } + p(0) + } + def main(args: Array[String]) { + if (ordergame(List(2, 1, 4, 5, 6, 3, 0, 2)) == 1) { + print("Pass") + } else { + print("Fail") + } + print(" ") + if (ordergame(List(0, 5, 3, 2)) == 0) { + print("Pass") + } else { + print("Fail") + } + print(" ") + if (ordergame(List(9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8)) == 2) { + print("Pass") + } else { + print("Fail") + } + println("") + + } +} diff --git a/challenge-286/roger-bell-west/tests.json b/challenge-286/roger-bell-west/tests.json new file mode 100644 index 0000000000..41c2daea59 --- /dev/null +++ b/challenge-286/roger-bell-west/tests.json @@ -0,0 +1,17 @@ +{ + "ch-2" : [ + { + "function" : "ordergame", + "arguments" : [ 2, 1, 4, 5, 6, 3, 0, 2 ], + "result" : 1 + }, + { + "arguments" : [ 0, 5, 3, 2 ], + "result" : 0 + }, + { + "arguments" : [ 9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8 ], + "result" : 2 + } + ] +} |
