diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-03-14 01:13:27 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-14 01:13:27 +0000 |
| commit | 54e5f2804276368240c68f279bcb64d131c7db6a (patch) | |
| tree | 65f10ecad9431ef67cb99f26d5be4d2243937b64 | |
| parent | e5b9f1f47d0972ede97b8acb6346688a7c3f59c2 (diff) | |
| parent | 9629be84207155ac7e81dbd6eaa1e91e9528ad02 (diff) | |
| download | perlweeklychallenge-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.pl | 71 | ||||
| -rw-r--r-- | challenge-103/lubos-kolouch/perl/ch-2.pl | 59 |
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; |
