aboutsummaryrefslogtreecommitdiff
path: root/challenge-286
diff options
context:
space:
mode:
authorRoger Bell_West <roger@firedrake.org>2024-09-10 14:53:59 +0100
committerRoger Bell_West <roger@firedrake.org>2024-09-10 14:53:59 +0100
commit6c07685dde45308744705be12a38a14ced9efcb5 (patch)
tree75c41364769a9b4bd217669f168e1751f5e08afc /challenge-286
parent168b71c4ba308de675a2a7959066a20f14a58501 (diff)
downloadperlweeklychallenge-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-xchallenge-286/roger-bell-west/crystal/ch-2.cr32
-rwxr-xr-xchallenge-286/roger-bell-west/javascript/ch-2.js49
-rw-r--r--challenge-286/roger-bell-west/kotlin/ch-2.kt40
-rwxr-xr-xchallenge-286/roger-bell-west/lua/ch-2.lua53
-rwxr-xr-xchallenge-286/roger-bell-west/perl/ch-2.pl35
-rw-r--r--challenge-286/roger-bell-west/postscript/ch-2.ps86
-rwxr-xr-xchallenge-286/roger-bell-west/python/ch-2.py45
-rwxr-xr-xchallenge-286/roger-bell-west/raku/ch-2.p629
-rwxr-xr-xchallenge-286/roger-bell-west/ruby/ch-2.rb37
-rwxr-xr-xchallenge-286/roger-bell-west/rust/ch-2.rs38
-rw-r--r--challenge-286/roger-bell-west/scala/ch-2.scala42
-rw-r--r--challenge-286/roger-bell-west/tests.json17
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
+ }
+ ]
+}