Peter’s blog ✴ Week 367 ✴ 30 March 2026
THE WEEKLY CHALLENGE
Bits of conflicts
You are given two events' start and end times. Write a script to find out if there is a conflict between the two events. A conflict happens when two events have a non-empty intersection.
Example 1 Input: @event1 = ('10:00', '12:00') @event2 = ('11:00', '13:00') Output: true Both events overlap from '11:00' to '12:00'. Example 2 Input: @event1 = ('09:00', '10:30') @event2 = ('10:30', '12:00') Output: false Event1 ends exactly at 10:30 when Event2 starts. Since the problem defines intersection as non-empty, exact boundaries touching is not a conflict. Example 3 Input: @event1 = ('14:00', '15:30') @event2 = ('14:30', '16:00') Output: true Both events overlap from 14:30 to 15:30. Example 4 Input: @event1 = ('08:00', '09:00') @event2 = ('09:01', '10:00') Output: false There is a 1-minute gap from '09:00' to '09:01'. Example 5 Input: @event1 = ('23:30', '00:30') @event2 = ('00:00', '01:00') Output: true They overlap from '00:00' to '00:30'.
This is somewhat harder than it looks because of ambiguity in the input. Specifically, consider the following data:
Event 1: 20:00 to 04:00, event 2: 03:00 to 19:00
Event 1 starts on (say) Monday and ends on Tuesday.
But does event 2 start at 03:00 on Monday, in which case it doesn't overlap event 1, or at 03:00 on Tuesday in which case it overlaps event 1 from 03:00 to 04:00? There's no way to tell.
To resolve this, I have assumed that if event 2 could be interpreted to start more than 12 hours before event 1, then it starts 24 later than that.
I have also assumed that if either event apparently finishes before, or at the same time as, it starts, then I assume it is running into the following day. For example, I interpret 09:00-08:00 to be a 23-hour event and 09:00-09:00 to be a 24-hour marathon.
Having dealt with that, it's neccesary to cope with four cases of overlap:
and two of non-overlap:
The post features a very well thought out, extensive solution in Perl that uses string multiplication to create the largest odd binary number. He gives us a lin2dec utility that helps validate his solutions. He also provides an excellent explanation of the underlying mathematical principles behind the task he has undertaken.
This review may cover either or both challenges for this week.
I am sorry that the 'Try it' feature is currently working very slowly or not at all owing to some issue with my web hosting provider.
#!/usr/bin/perl # Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge use v5.26; # The Weekly Challenge - 2026-03-30 use utf8; # Week 367 - task 2 - Conflict events use warnings; # Peter Campbell Smith binmode STDOUT, ':utf8'; use Encode; conflict_events('09:00', '12:00', '10:00', '13:00'); conflict_events('09:00', '12:00', '10:00', '11:00'); conflict_events('09:00', '12:00', '08:00', '13:00'); conflict_events('09:00', '12:00', '08:00', '11:00'); conflict_events('22:00', '02:00', '23:00', '03:00'); conflict_events('22:00', '02:00', '23:00', '01:00'); conflict_events('22:00', '02:00', '21:00', '00:00'); conflict_events('22:00', '02:00', '00:00', '03:00'); conflict_events('09:00', '12:00', '12:00', '15:00'); conflict_events('12:00', '15:00', '09:00', '12:00'); sub conflict_events { my (@events, $e, @times, $overlap_starts, $overlap_ends); # initialise @events = @_; say qq[\nInput: $events[0]-$events[1] and $events[2]-$events[3]]; # convers times to mins past midnight for $e (0 .. 3) { if ($events[$e] =~ m|(\d\d):(\d\d)|) { @times[$e] = $1 * 60 + $2; } else { say qq[Output: malformed time $events[$e]]; return; } } # if end times precede start times assume the next day $times[1] += 1440 if $times[1] < $times[0]; $times[2] += 1440 if $times[0] - $times[2] >= 720; $times[3] += 1440 if $times[3] < $times[2]; # overlap is from the latest start to the earliest finish $overlap_starts = $times[0] > $times[2] ? $events[0] : $events[2]; $overlap_ends = $times[1] > $times[3] ? $events[3] : $events[1]; # report if ($times[2] >= $times[1] or $times[0] >= $times[3]) { say qq[Output: false - events do not overlap]; } else { say qq[Output: true - events overlap from $overlap_starts until $overlap_ends]; } }
19 lines of code
Input: 09:00-12:00 and 10:00-13:00 Output: true - events overlap from 10:00 until 12:00 Input: 09:00-12:00 and 10:00-11:00 Output: true - events overlap from 10:00 until 11:00 Input: 09:00-12:00 and 08:00-13:00 Output: true - events overlap from 09:00 until 12:00 Input: 09:00-12:00 and 08:00-11:00 Output: true - events overlap from 09:00 until 11:00 Input: 22:00-02:00 and 23:00-03:00 Output: true - events overlap from 23:00 until 02:00 Input: 22:00-02:00 and 23:00-01:00 Output: true - events overlap from 23:00 until 01:00 Input: 22:00-02:00 and 21:00-00:00 Output: true - events overlap from 22:00 until 00:00 Input: 22:00-02:00 and 00:00-03:00 Output: true - events overlap from 00:00 until 02:00 Input: 09:00-12:00 and 12:00-15:00 Output: false - events do not overlap Input: 12:00-15:00 and 09:00-12:00 Output: false - events do not overlap
Any content of this website which has been created by Peter Campbell Smith is in the public domain