From bfa8b8a3dda2ac37c22c7f4fc2867211f92f65e0 Mon Sep 17 00:00:00 2001 From: Paulo Custodio Date: Tue, 9 Mar 2021 19:51:39 +0000 Subject: Add Perl, Lua and Python solutions to challenge 103 --- challenge-103/paulo-custodio/lua/ch-2.lua | 97 +++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 challenge-103/paulo-custodio/lua/ch-2.lua (limited to 'challenge-103/paulo-custodio/lua/ch-2.lua') diff --git a/challenge-103/paulo-custodio/lua/ch-2.lua b/challenge-103/paulo-custodio/lua/ch-2.lua new file mode 100644 index 0000000000..cb0a0f74a6 --- /dev/null +++ b/challenge-103/paulo-custodio/lua/ch-2.lua @@ -0,0 +1,97 @@ +#!/usr/bin/env lua + +--[[ +Challenge 103 + +TASK #2 › What’s playing? +Submitted by: Albert Croft +Working from home, you decided that on occasion you wanted some background +noise while working. You threw together a network streamer to continuously +loop through the files and launched it in a tmux (or screen) session, giving +it a directory tree of files to play. During the day, you connected an audio +player to the stream, listening through the workday, closing it when done. + +For weeks you connect to the stream daily, slowly noticing a gradual drift of +the media. After several weeks, you take vacation. When you return, you are +pleasantly surprised to find the streamer still running. Before connecting, +however, if you consider the puzzle of determining which track is playing. + +After looking at a few modules to read info regarding the media, a quick bit +of coding gave you a file list. The file list is in a simple CSV format, each +line containing two fields: the first the number of milliseconds in length, +the latter the media’s title (this example is of several episodes available +from the MercuryTheatre.info): + + 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)" +For this script, you can assume to be provided the following information: + + * the value of $^T ($BASETIME) of the streamer script, + * the value of time(), and + * a CSV file containing the media to play consisting of the length in +milliseconds and an identifier for the media (title, filename, or other). +Write a program to output which file is currently playing. For purposes of +this script, you may assume gapless playback, and format the output as you +see fit. + +Optional: Also display the current position in the media as a time-like value. + +Example: + +Input: 3 command line parameters: start time, current time, file name + + # Streamer start time: Tue Nov 23 12:22:03 2020 + 1606134123 + + # Current time: Mon Mar 1 09:34:36 2021 + 1614591276 + + # filelist.csv + +Output: + + "Les Miserables Episode 1: The Bishop (broadcast date: 1937-07-23)" + 00:17:33 +--]] + +start_secs = tonumber(arg[1]) +current_secs = tonumber(arg[2]) +playlist_file = arg[3] + +-- read playlist +playlist = {} +playlist_total_secs = 0 +for line in io.lines(playlist_file) do + local ms, title = line:match('%s*(.-),%s*"(.-)"') + local secs = math.floor(tonumber(ms)/1000+0.5) + table.insert(playlist, { secs, title }) + playlist_total_secs = playlist_total_secs + secs +end + +-- compute location +total_secs = current_secs - start_secs +playlist_secs = total_secs % playlist_total_secs + +-- find current track +for k, v in pairs(playlist) do + local secs, title = v[1], v[2] + if playlist_secs < secs then -- playing this title + io.write(title, "\n") + + local hh = math.floor(playlist_secs / 3600) + playlist_secs = playlist_secs % 3600 + local mm = math.floor(playlist_secs / 60) + playlist_secs = playlist_secs % 60 + local ss = playlist_secs + + io.write(string.format("%02d:%02d:%02d", hh, mm, ss), "\n") + break + else + playlist_secs = playlist_secs - secs + end +end -- cgit From c51f9bd979dbd79f20cb0abd543dc9b4df9f4e84 Mon Sep 17 00:00:00 2001 From: Paulo Custodio Date: Tue, 9 Mar 2021 20:01:18 +0000 Subject: Remove tabs --- challenge-103/paulo-custodio/lua/ch-2.lua | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) (limited to 'challenge-103/paulo-custodio/lua/ch-2.lua') diff --git a/challenge-103/paulo-custodio/lua/ch-2.lua b/challenge-103/paulo-custodio/lua/ch-2.lua index cb0a0f74a6..955beca20e 100644 --- a/challenge-103/paulo-custodio/lua/ch-2.lua +++ b/challenge-103/paulo-custodio/lua/ch-2.lua @@ -67,10 +67,10 @@ playlist_file = arg[3] playlist = {} playlist_total_secs = 0 for line in io.lines(playlist_file) do - local ms, title = line:match('%s*(.-),%s*"(.-)"') - local secs = math.floor(tonumber(ms)/1000+0.5) - table.insert(playlist, { secs, title }) - playlist_total_secs = playlist_total_secs + secs + local ms, title = line:match('%s*(.-),%s*"(.-)"') + local secs = math.floor(tonumber(ms)/1000+0.5) + table.insert(playlist, { secs, title }) + playlist_total_secs = playlist_total_secs + secs end -- compute location @@ -79,19 +79,19 @@ playlist_secs = total_secs % playlist_total_secs -- find current track for k, v in pairs(playlist) do - local secs, title = v[1], v[2] - if playlist_secs < secs then -- playing this title - io.write(title, "\n") - - local hh = math.floor(playlist_secs / 3600) - playlist_secs = playlist_secs % 3600 - local mm = math.floor(playlist_secs / 60) - playlist_secs = playlist_secs % 60 - local ss = playlist_secs - - io.write(string.format("%02d:%02d:%02d", hh, mm, ss), "\n") - break - else - playlist_secs = playlist_secs - secs - end + local secs, title = v[1], v[2] + if playlist_secs < secs then -- playing this title + io.write(title, "\n") + + local hh = math.floor(playlist_secs / 3600) + playlist_secs = playlist_secs % 3600 + local mm = math.floor(playlist_secs / 60) + playlist_secs = playlist_secs % 60 + local ss = playlist_secs + + io.write(string.format("%02d:%02d:%02d", hh, mm, ss), "\n") + break + else + playlist_secs = playlist_secs - secs + end end -- cgit