aboutsummaryrefslogtreecommitdiff
path: root/challenge-187/mohammad-anwar/java/theweeklychallenge/DaysTogether.java
blob: 0c0d0869fb0006b27b2f65b3f70bc4d5ad810f57 (plain)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package theweeklychallenge;

/*

Week 187:

    https://theweeklychallenge.org/blog/perl-weekly-challenge-187

Task #1: Days Together

    Two friends, Foo and Bar gone on holidays seperately to the same
    city. You are given their schedule i.e. start date and end date.

    To keep the task simple, the date is in the form 'DD-MM' and all
    dates belong to the  same calendar year i.e. between '01-01' and
    '31-12'.

    Also the year is non-leap year and both dates are inclusive.

Compile and Run:

    mohammad-anwar/java$ javac theweeklychallenge/DaysTogether.java
    mohammad-anwar/java$ java  theweeklychallenge.DaysTogether

*/

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import junit.framework.TestCase;
import static junit.framework.Assert.*;

public class DaysTogether extends TestCase {

    public static void main(String[] args) {
        junit.textui.TestRunner.run(
            theweeklychallenge.DaysTogether.class
        );
    }

    public void testDaysTogether() {
        assertEquals(4, daysTogether("12-01","20-01","15-01","18-01"));
        assertEquals(0, daysTogether("02-03","12-03","13-03","14-03"));
        assertEquals(2, daysTogether("02-03","12-03","11-03","15-03"));
        assertEquals(4, daysTogether("30-03","05-04","28-03","02-04"));
    }

    public static int daysTogether(
        String sd1, String ed1, String sd2,    String ed2) {
        LocalDate _sd1 = _date(sd1);
        LocalDate _ed1 = _date(ed1);
        LocalDate _sd2 = _date(sd2);
        LocalDate _ed2 = _date(ed2);

        int days = 0;

        if (_ed1.compareTo(_sd2) < 0) {
            return days;
        }

        if (_sd1.compareTo(_sd2) > 0) {
            days = _daysTogether(_sd1, _ed1, _ed2);
        }
        else if (_ed2.compareTo(_sd2) > 0) {
            days = _daysTogether(_sd2, _ed1, _ed2);
        }

        return days;
    }

    public static LocalDate _date(String dateStr) {
        String[] splitDate = dateStr.split("-");
        int day   = Integer.parseInt(splitDate[0]);
        int month = Integer.parseInt(splitDate[1]);

        return LocalDate.of(2022, month, day);
    }

    public static int _daysTogether(
        LocalDate from, LocalDate to, LocalDate _to) {
        if (to.compareTo(_to) > 0) {
            to = _to;
        }

        long days = ChronoUnit.DAYS.between(from, to);
        return (int)days + 1;
    }
}