aboutsummaryrefslogtreecommitdiff
path: root/challenge-103
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-103')
-rwxr-xr-xchallenge-103/roger-bell-west/perl/ch-1.pl24
-rwxr-xr-xchallenge-103/roger-bell-west/perl/ch-2.pl32
-rwxr-xr-xchallenge-103/roger-bell-west/python/ch-1.py22
-rwxr-xr-xchallenge-103/roger-bell-west/python/ch-2.py31
-rwxr-xr-xchallenge-103/roger-bell-west/raku/ch-1.p622
-rwxr-xr-xchallenge-103/roger-bell-west/raku/ch-2.p634
-rwxr-xr-xchallenge-103/roger-bell-west/ruby/ch-1.rb28
-rwxr-xr-xchallenge-103/roger-bell-west/ruby/ch-2.rb34
-rwxr-xr-xchallenge-103/roger-bell-west/rust/ch-1.rs29
-rw-r--r--challenge-103/roger-bell-west/rust/ch-2.rs47
-rw-r--r--challenge-103/roger-bell-west/t2.csv7
11 files changed, 310 insertions, 0 deletions
diff --git a/challenge-103/roger-bell-west/perl/ch-1.pl b/challenge-103/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..53d6dcaf63
--- /dev/null
+++ b/challenge-103/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,24 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 2;
+
+is(cz(2017),'Fire Rooster','example 1');
+is(cz(1938),'Earth Tiger','example 2');
+
+sub cz {
+ my $yy=shift;
+ my $y=$yy;
+ if ($y<0) {
+ $y++;
+ }
+ $y%=60;
+ while ($y<0) {
+ $y+=60;
+ }
+ return join(' ',
+ [qw(Metal Water Wood Fire Earth)]->[int($y/2)%5],
+ [qw(Monkey Rooster Dog Pig Rat),'Water Buffalo',qw(Tiger Cat Dragon Snake Horse Goat)]->[$y%12]);
+}
diff --git a/challenge-103/roger-bell-west/perl/ch-2.pl b/challenge-103/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..a99a672b78
--- /dev/null
+++ b/challenge-103/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,32 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+is(wp(1606134123,1614591276,'t2.csv'),'00:10:24 Les Miserables Episode 1: The Bishop (broadcast date: 1937-07-23)','example 1');
+
+use Text::CSV_XS qw(csv);
+use List::Util qw(sum);
+
+sub wp {
+ my $ts=shift;
+ my $tn=shift;
+ my $csvfile=shift;
+ my $td=($tn-$ts)*1000;
+ my $aoa=csv(in => $csvfile);
+ my $tp=sum(map {$_->[0]} @{$aoa});
+ $td %= $tp;
+ foreach my $t (@{$aoa}) {
+ if ($td < $t->[0]) {
+ $td=int($td/1000);
+ my $h=int($td/3600);
+ my $m=int($td/60) % 60;
+ my $s=$td % 60;
+ return sprintf('%02d:%02d:%02d %s',$h,$m,$s,$t->[1]);
+ } else {
+ $td-=$t->[0];
+ }
+ }
+}
diff --git a/challenge-103/roger-bell-west/python/ch-1.py b/challenge-103/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..92708e26fa
--- /dev/null
+++ b/challenge-103/roger-bell-west/python/ch-1.py
@@ -0,0 +1,22 @@
+#! /usr/bin/python3
+
+def cz(yy):
+ y=int(yy)
+ if y<0:
+ y += 1
+ y %= 60
+ while y<0:
+ y += 60
+ return " ".join([['Metal','Water','Wood','Fire','Earth'][int(y/2)%5],['Monkey','Rooster','Dog','Pig','Rat','Water Buffalo','Tiger','Cat','Dragon','Snake','Horse','Goat'][y%12]])
+
+import unittest
+
+class TestCz(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(cz(2017),'Fire Rooster','example 1')
+
+ def test_ex2(self):
+ self.assertEqual(cz(1938),'Earth Tiger','example 2')
+
+unittest.main()
diff --git a/challenge-103/roger-bell-west/python/ch-2.py b/challenge-103/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..eb804da2eb
--- /dev/null
+++ b/challenge-103/roger-bell-west/python/ch-2.py
@@ -0,0 +1,31 @@
+#! /usr/bin/python3
+
+import csv
+def wp(ts,tn,csvfile):
+ td=(tn-ts)*1000;
+ aoa=list()
+ with open(csvfile) as csvfile:
+ cr=csv.reader(csvfile)
+ for row in cr:
+ aoa.append(row)
+ tp=sum(int(t[0]) for t in aoa)
+ td %= tp
+ for t in aoa:
+ t[0]=int(t[0])
+ if td < t[0]:
+ td=int(td/1000)
+ h=int(td/3600)
+ m=int(td/60) % 60
+ s=td % 60
+ return "{:02d}:{:02d}:{:02d} {:s}".format(h,m,s,t[1])
+ else:
+ td -= t[0]
+
+import unittest
+
+class TestWp(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(wp(1606134123,1614591276,'t2.csv'),'00:10:24 Les Miserables Episode 1: The Bishop (broadcast date: 1937-07-23)','example 1')
+
+unittest.main()
diff --git a/challenge-103/roger-bell-west/raku/ch-1.p6 b/challenge-103/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..f75cbe4054
--- /dev/null
+++ b/challenge-103/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,22 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 2;
+
+is(cz(2017),'Fire Rooster','example 1');
+is(cz(1938),'Earth Tiger','example 2');
+
+sub cz($yy) {
+ my $y=$yy;
+ if ($y < 0) {
+ $y++;
+ }
+ $y%=60;
+ while ($y < 0) {
+ $y+=60;
+ }
+ return join(' ',
+ [qw|Metal Water Wood Fire Earth|].[floor($y/2)%5],
+ ['Monkey','Rooster','Dog','Pig','Rat','Water Buffalo','Tiger','Cat','Dragon','Snake','Horse','Goat'].[$y%12]);
+}
diff --git a/challenge-103/roger-bell-west/raku/ch-2.p6 b/challenge-103/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..5ed63d1a47
--- /dev/null
+++ b/challenge-103/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,34 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 1;
+
+is(wp(1606134123,1614591276,'t2.csv'),'00:10:24 Les Miserables Episode 1: The Bishop (broadcast date: 1937-07-23)','example 1');
+
+sub wp($ts,$tn,$csvfile) {
+ my $td=($tn-$ts)*1000;
+ my $fh=open :r,$csvfile;
+ my @aoa;
+ for $fh.lines {
+ .chomp;
+ my ($len,$title)=$_.comb(/<-[,]>+/,2);
+ $title ~~ s/^\"//;
+ $title ~~ s/\"$//;
+ @aoa.push([$len,$title]);
+ }
+ my $tp=sum(map {$_[0]},@aoa);
+ $td %= $tp;
+ for @aoa -> @t {
+ if ($td < @t[0]) {
+ $td=floor($td/1000);
+ my $h=floor($td/3600);
+ my $m=floor($td/60) % 60;
+ my $s=$td % 60;
+ return sprintf('%02d:%02d:%02d %s',$h,$m,$s,@t[1]);
+ } else {
+ $td-=@t[0];
+ }
+ }
+}
+
diff --git a/challenge-103/roger-bell-west/ruby/ch-1.rb b/challenge-103/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..7b335d9cbe
--- /dev/null
+++ b/challenge-103/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,28 @@
+#! /usr/bin/ruby
+
+def cz(yy)
+ y=yy
+ if y<0 then
+ y += 1
+ end
+ y = y % 60
+ while y<0
+ y += 60
+ end
+ return [['Metal','Water','Wood','Fire','Earth'][(y/2).floor%5],
+ ['Monkey','Rooster','Dog','Pig','Rat','Water Buffalo','Tiger','Cat','Dragon','Snake','Horse','Goat'][y%12]].join(' ')
+end
+
+require 'test/unit'
+
+class TestCz < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal('Fire Rooster',cz(2017))
+ end
+
+ def test_ex2
+ assert_equal('Earth Tiger',cz(1938))
+ end
+
+end
diff --git a/challenge-103/roger-bell-west/ruby/ch-2.rb b/challenge-103/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..85778e0927
--- /dev/null
+++ b/challenge-103/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,34 @@
+#! /usr/bin/ruby
+
+require 'csv'
+
+def wp(ts,tn,csvfile)
+ td=(tn-ts)*1000
+ aoa=Array.new
+ CSV.foreach(csvfile) do |row|
+ aoa.push([row[0].to_i,row[1]])
+ end
+ tp=aoa.map{|t| t[0]}.sum
+ td=td%tp
+ aoa.each do |t|
+ if td<t[0] then
+ td=(td/1000).floor
+ h=(td/3600).floor
+ m=(td/60).floor % 60
+ s=td % 60
+ return sprintf('%02d:%02d:%02d %s',h,m,s,t[1])
+ else
+ td -= t[0]
+ end
+ end
+end
+
+require 'test/unit'
+
+class TestWp < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal('00:10:24 Les Miserables Episode 1: The Bishop (broadcast date: 1937-07-23)',wp(1606134123,1614591276,'t2.csv'))
+ end
+
+end
diff --git a/challenge-103/roger-bell-west/rust/ch-1.rs b/challenge-103/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..9d3efc7884
--- /dev/null
+++ b/challenge-103/roger-bell-west/rust/ch-1.rs
@@ -0,0 +1,29 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(cz(2017),"Fire Rooster");
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(cz(1938),"Earth Tiger");
+}
+
+fn cz(yy: i32) -> String {
+ let mut y: i32=yy;
+ if y<0 {
+ y += 1;
+ }
+ y %= 60;
+ while y<0 {
+ y += 60;
+ }
+ let yu: usize=y as usize;
+ let mut out="".to_string();
+ out.push_str(vec!["Metal","Water","Wood","Fire","Earth"][(yu/2)%5]);
+ out.push_str(" ");
+ out.push_str(vec!["Monkey","Rooster","Dog","Pig","Rat","Water Buffalo","Tiger","Cat","Dragon","Snake","Horse","Goat"][yu%12]);
+ return out;
+}
diff --git a/challenge-103/roger-bell-west/rust/ch-2.rs b/challenge-103/roger-bell-west/rust/ch-2.rs
new file mode 100644
index 0000000000..c1b2015c9e
--- /dev/null
+++ b/challenge-103/roger-bell-west/rust/ch-2.rs
@@ -0,0 +1,47 @@
+// Cargo.toml needs:
+// [dependencies]
+// csv = "1.1"
+
+use std::fs::File;
+
+#[test]
+fn test_ex1() {
+ assert_eq!(wp(1606134123,1614591276,"t2.csv"),"00:10:24 Les Miserables Episode 1: The Bishop (broadcast date: 1937-07-23)");
+}
+
+pub struct Track {
+ length: i64,
+ title: String
+}
+
+fn wp (ts: i64,tn: i64,csvfile: &str) -> String {
+ let mut td: i64=(tn-ts)*1000;
+ let file=File::open(&csvfile).unwrap();
+ let mut rdr = csv::ReaderBuilder::new()
+ .has_headers(false)
+ .from_reader(file);
+ let mut aoa: Vec<Track>=vec![];
+ for result in rdr.records() {
+ let record = result.unwrap();
+ aoa.push(Track {
+ length: record.get(0).unwrap().parse::<i64>().unwrap(),
+ title: record.get(1).unwrap().to_string()
+ });
+ }
+ let tp: i64=aoa.iter()
+ .map(|t| t.length)
+ .sum();
+ td %= tp;
+ for t in aoa {
+ if td < t.length {
+ td=td/1000;
+ let h=td/3600;
+ let m=(td/60) % 60;
+ let s=td % 60;
+ return format!("{:02}:{:02}:{:02} {}",h,m,s,t.title);
+ } else {
+ td -= t.length;
+ }
+ }
+ return "".to_string();
+}
diff --git a/challenge-103/roger-bell-west/t2.csv b/challenge-103/roger-bell-west/t2.csv
new file mode 100644
index 0000000000..4d66b079d7
--- /dev/null
+++ b/challenge-103/roger-bell-west/t2.csv
@@ -0,0 +1,7 @@
+1709363,"Les Miserables Episode 1: The Bishop (broadcast date: 1937-07-23)"
+1723781,"Les Miserables Episode 2: Javert (broadcast date: 1937-07-30)"
+1723781,"Les Miserables Episode 3: The Trial (broadcast date: 1937-08-06)"
+1678356,"Les Miserables Episode 4: Cosette (broadcast date: 1937-08-13)"
+1646043,"Les Miserables Episode 5: The Grave (broadcast date: 1937-08-20)"
+1714640,"Les Miserables Episode 6: The Barricade (broadcast date: 1937-08-27)"
+1714640,"Les Miserables Episode 7: Conclusion (broadcast date: 1937-09-03)"