You are given a year
Write a script to determine the Chinese Zodiac for the given year.
Unfortunately I don't come from an Asian background, so had to rely on the task to give me clues. There seems to be some confusion / difference around the timing of the elements. The linked page has each element linked to a certain animal. This page has a 60 year cycle for the elements (12 years each), while this page has a 10 year cycle (2 years for each element). Using the two examples given in the task only the last link provides the expected solutions.
With that sorted out (hopefully), it is then a matter of creating two arrays
@elements and using simple arithmetic to display the correct element and animal.
» ./ch-1.pl 2017 Fire Rooster » ./ch-1.pl 1938 Earth Tiger
Full description here ... Write a program to output which file is currently playing ... Optional: Also display the current position in the media as a time-like value.
As regular readers of my blog would know I have two rules about these challenges. Firstly, never read other peoples solutions before doing my pull request. And secondly, don't use modules that aren't part of core Perl. Well I broke the second rule this week, and used Text::CSV to read the CSV file. Parsing CSV files correctly is not easy, and since it's not a core part of the task, I'm leaving it to a module that does things correctly.
The original task had the time specified as a formatted string, and I was going to write a blurb about converting that to epoch time (non-leap seconds since midnight 1/1/1970 UTC) and dealing with the weird parts of the world that change their clocks during summer (For the record, we haven't done this since 1992). By the time I wrote the code, the inputs are now expressed as epoch time.
Having said that, the output does not factor in any leap seconds between the start and current times.
Anyway, enough blabbering. On to the solution. My solution takes the following steps. All times are recorded as milliseconds (1/1000th of one second).
- Read the input values and makes sure they are correct.
- Reads the csv file into
$tracks(an array of arrays)
- Calculate the length of the playlist as
- Calculate how far we are through the playlist as
$playlist_position. This is the remainder of
($current-$start)*100and the playlist length.
- Work my way through the tracks. If the
$track_lengthis less than the
$playlist_positionwe subtract the first number from the second and continue on.
- We now know what tracks is playing, and the position (milliseconds since the start) we are of the track. With some more simple algebra, we can display the time in a suitable format.
I have to say it does feel good when the output from your code matches the examples given :)
» ./ch-2.pl 1606134123 1614591276 ~/wasteland/filelist.csv Les Miserables Episode 1: The Bishop (broadcast date: 1937-07-23) 00:10:24