aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-03-14 01:13:27 +0000
committerGitHub <noreply@github.com>2021-03-14 01:13:27 +0000
commit54e5f2804276368240c68f279bcb64d131c7db6a (patch)
tree65f10ecad9431ef67cb99f26d5be4d2243937b64
parente5b9f1f47d0972ede97b8acb6346688a7c3f59c2 (diff)
parent9629be84207155ac7e81dbd6eaa1e91e9528ad02 (diff)
downloadperlweeklychallenge-club-54e5f2804276368240c68f279bcb64d131c7db6a.tar.gz
perlweeklychallenge-club-54e5f2804276368240c68f279bcb64d131c7db6a.tar.bz2
perlweeklychallenge-club-54e5f2804276368240c68f279bcb64d131c7db6a.zip
Merge pull request #3713 from LubosKolouch/master
Challenge 103 LK Perl
-rw-r--r--challenge-103/lubos-kolouch/perl/ch-1.pl71
-rw-r--r--challenge-103/lubos-kolouch/perl/ch-2.pl59
2 files changed, 130 insertions, 0 deletions
diff --git a/challenge-103/lubos-kolouch/perl/ch-1.pl b/challenge-103/lubos-kolouch/perl/ch-1.pl
new file mode 100644
index 0000000000..40a94e5f93
--- /dev/null
+++ b/challenge-103/lubos-kolouch/perl/ch-1.pl
@@ -0,0 +1,71 @@
+#!/usr/bin/perl
+#===============================================================================
+#
+# FILE: ch-1.pl
+#
+# USAGE: ./ch-1.pl
+#
+# DESCRIPTION: Perl Weekly Challenge 103
+# Task 1 - Chinese Zodiac
+#
+# AUTHOR: Lubos Kolouch
+# CREATED: 03/13/2021 11:06:43 AM
+#===============================================================================
+
+use strict;
+use warnings;
+
+
+sub get_zodiac {
+ my $year = shift;
+
+ my @animals = ('Rat', 'Ox', 'Tiger', 'Rabbit', 'Dragon', 'Snake', 'Horse', 'Goat', 'Monkey', 'Rooster', 'Dog', 'Pig');
+
+ my @elements = ('Wood', 'Fire', 'Earth', 'Metal', 'Water');
+
+ my $year_diff;
+ my $elem_diff;
+
+ # 1924 was chosen just because of the wiki entry
+ # ignoring Julian calendar
+
+ if ($year >= 1924) {
+ $year_diff = ($year-1924) % scalar @animals;
+ $elem_diff = int(($year-1924) / 2) % scalar @elements;
+ } else {
+ # 1923 => 5 diff 2 / 2 = 1 - 1 = 0
+ # 1922 => 5 diff 3 / 2 = 1 - 1 = 0
+ # 1921 => 4 diff 4 / 2 = 2 - 1 = 1
+ # 1920 => 4 diff 5 / 2 = 2 - 1 = 1
+ # 1919 => 3 diff 6 / 2 = 3 - 1 = 2
+ # 1913 => diff 12 / 2 = 6 - 1 = 5
+ # 1910 => diff 15 / 2 = 7 - 1 = 6 = 1 = 4
+
+ $year_diff = -((1924-$year) % scalar @animals);
+
+ $elem_diff = (1925-$year);
+ $elem_diff = int($elem_diff / 2) - 1;
+ $elem_diff = $elem_diff % 5;
+ $elem_diff = 5 - $elem_diff;
+ $elem_diff -= 1;
+ }
+
+ return $elements[$elem_diff].' '.$animals[$year_diff];
+}
+
+use Test::More;
+is(get_zodiac(1804), 'Wood Rat');
+is(get_zodiac(1845), 'Wood Snake');
+is(get_zodiac(1910), 'Metal Dog');
+is(get_zodiac(1923), 'Water Pig');
+is(get_zodiac(1924), 'Wood Rat');
+is(get_zodiac(1925), 'Wood Ox');
+is(get_zodiac(1926), 'Fire Tiger');
+is(get_zodiac(1927), 'Fire Rabbit');
+is(get_zodiac(1934), 'Wood Dog');
+is(get_zodiac(1938), 'Earth Tiger');
+is(get_zodiac(1976), 'Fire Dragon');
+is(get_zodiac(2017), 'Fire Rooster');
+
+
+done_testing;
diff --git a/challenge-103/lubos-kolouch/perl/ch-2.pl b/challenge-103/lubos-kolouch/perl/ch-2.pl
new file mode 100644
index 0000000000..21976f63c4
--- /dev/null
+++ b/challenge-103/lubos-kolouch/perl/ch-2.pl
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+#===============================================================================
+#
+# FILE: ch-2.pl
+#
+# USAGE: ./ch-2.pl
+#
+# DESCRIPTION: Perl Weekly Challenge 103
+# Task 1 - What's Playing?
+#
+# AUTHOR: Lubos Kolouch
+# CREATED: 03/13/2021 11:06:43 AM
+#===============================================================================
+
+use strict;
+use warnings;
+use Data::Dumper;
+
+sub now_playing {
+ my $what = shift;
+
+ open my $file, '<', $what->{filename};
+
+ my %tracks;
+ my $total_length = 0;
+ my $track = 0;
+ while (<$file>) {
+ chomp;
+
+ my ($len, $title) = split /,/, $_;
+
+ $tracks{$track}{'track_start'} = $total_length;
+ $tracks{$track}{'len'} = $len;
+ $tracks{$track}{'title'} = $title;
+ $total_length += $len;
+ $tracks{$track}{'total_length'} = $total_length;
+ $track++;
+ }
+
+ # damned miliseconds, took me long debugging to notice them
+ my $diff = ($what->{now} - $what->{start})*1000;
+ $diff %= $total_length;
+
+ $track = 0;
+ $track++ while $tracks{$track}{'total_length'} <= $diff;
+
+ my $track_pos = int(($diff - $tracks{$track}{'track_start'})/1000);
+
+ my $hour = int($track_pos / 3600);
+ my $min = int(($track_pos - $hour*60) / 60);
+ my $sec = $track_pos - $min*60;
+
+ return "$tracks{$track}{'title'} at $hour:$min:$sec";
+}
+
+use Test::More;
+is(now_playing({start => 1606134123, now => 1614591276, filename => 'now_playing.csv'}), '"Les Miserables Episode 1: The Bishop (broadcast date: 1937-07-23)" at 0:10:24');
+
+done_testing;