Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 55 additions & 43 deletions C#/TollCalculator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,33 +13,6 @@ public class TollCalculator
* @return - the total toll fee for that day
*/

public int GetTollFee(Vehicle vehicle, DateTime[] dates)
{
DateTime intervalStart = dates[0];
int totalFee = 0;
foreach (DateTime date in dates)
{
int nextFee = GetTollFee(date, vehicle);
int tempFee = GetTollFee(intervalStart, vehicle);

long diffInMillies = date.Millisecond - intervalStart.Millisecond;
long minutes = diffInMillies/1000/60;

if (minutes <= 60)
{
if (totalFee > 0) totalFee -= tempFee;
if (nextFee >= tempFee) tempFee = nextFee;
totalFee += tempFee;
}
else
{
totalFee += nextFee;
}
}
if (totalFee > 60) totalFee = 60;
return totalFee;
}

private bool IsTollFreeVehicle(Vehicle vehicle)
{
if (vehicle == null) return false;
Expand All @@ -52,6 +25,31 @@ private bool IsTollFreeVehicle(Vehicle vehicle)
vehicleType.Equals(TollFreeVehicles.Military.ToString());
}

private Boolean IsTollFreeDate(DateTime date)
{
int year = date.Year;
int month = date.Month;
int day = date.Day;

if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday) return true;

if (year == 2013)
{
if (month == 1 && day == 1 ||
month == 3 && (day == 28 || day == 29) ||
month == 4 && (day == 1 || day == 30) ||
month == 5 && (day == 1 || day == 8 || day == 9) ||
month == 6 && (day == 5 || day == 6 || day == 21) ||
month == 7 ||
month == 11 && day == 1 ||
month == 12 && (day == 24 || day == 25 || day == 26 || day == 31))
{
return true;
}
}
return false;
}

public int GetTollFee(DateTime date, Vehicle vehicle)
{
if (IsTollFreeDate(date) || IsTollFreeVehicle(vehicle)) return 0;
Expand All @@ -71,29 +69,43 @@ public int GetTollFee(DateTime date, Vehicle vehicle)
else return 0;
}

private Boolean IsTollFreeDate(DateTime date)
public int GetTollFee(Vehicle vehicle, DateTime[] dates)
{
int year = date.Year;
int month = date.Month;
int day = date.Day;
if (vehicle == null || dates == null || dates.Length == 0)
return 0;

if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday) return true;
Array.Sort(dates);

if (year == 2013)
DateTime intervalStart = dates[0];
int totalFee = 0;
int tempFee = GetTollFee(intervalStart, vehicle);

for (int i = 1; i < dates.Length; i++)
{
if (month == 1 && day == 1 ||
month == 3 && (day == 28 || day == 29) ||
month == 4 && (day == 1 || day == 30) ||
month == 5 && (day == 1 || day == 8 || day == 9) ||
month == 6 && (day == 5 || day == 6 || day == 21) ||
month == 7 ||
month == 11 && day == 1 ||
month == 12 && (day == 24 || day == 25 || day == 26 || day == 31))
DateTime date = dates[i];
int nextFee = GetTollFee(date, vehicle);

TimeSpan diff = date - intervalStart;
if (diff.TotalMinutes <= 60)
{
return true;

if (nextFee > tempFee)
tempFee = nextFee;
}
else
{

totalFee += tempFee;
intervalStart = date;
tempFee = nextFee;
}
}
return false;

totalFee += tempFee;
if (totalFee > 60)
totalFee = 60;

return totalFee;
}

private enum TollFreeVehicles
Expand Down