1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
#!/opt/local/bin/python
#
# See ../README.md
#
#
# Run as python ch-2.py < input-file
#
#
# We're reading a start time, the current time, and a file name
# from STDIN, separated by white space. The file contains the
# tracks played.
#
import fileinput
for line in fileinput . input ():
start_time, current_time, file_name = line . split ()
#
# You need a 64 bit integer for this; 32 bits of holds
# a five week vacation in milliseconds, but the author
# of the puzzle lives somewhere were people take 14 week
# holidays...
#
time_diff = (int (current_time) - int (start_time)) * 1000
#
# Parse the media file; store the track into an array tracks.
#
tracks = []
total_time = 0
for track in open (file_name, "r"):
play_time, title = track . strip () . split (",", 2)
play_time = int (play_time)
tracks . append ([play_time, title])
total_time = total_time + play_time
#
# We're not interested in playing full loops.
#
time_diff = time_diff % total_time
#
# Find the current track playing. If $time_diff is less than the
# play time of the track, this is the track currently playing. If
# so, print the track name (with quotes, as given in the example --
# although they don't belong there, as they're from the CSV encoding;
# for that reason, we won't deescape anything else either). Otherwise
# (track length is shorter than $time_diff), we subtrack the length
# of the track from $time_diff, and continue checking the next track.
#
for track in tracks:
if time_diff - track [0] < 0:
time_diff = int (time_diff / 1000)
hours = int (time_diff / 3600)
minutes = int ((time_diff % 3600) / 60)
seconds = time_diff % 60
if hours > 0:
format_str = "{0}\n{1:02d}:{2:02d}:{3:02d}"
else:
format_str = "{0}\n{2:02d}:{3:02d}"
print (format_str . format (track [1], hours, minutes, seconds))
break
else:
time_diff = time_diff - track [0]
|