aboutsummaryrefslogtreecommitdiff
path: root/challenge-138/java
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-138/java')
-rw-r--r--challenge-138/java/WorkDays.java106
1 files changed, 106 insertions, 0 deletions
diff --git a/challenge-138/java/WorkDays.java b/challenge-138/java/WorkDays.java
new file mode 100644
index 0000000000..8d98f71adf
--- /dev/null
+++ b/challenge-138/java/WorkDays.java
@@ -0,0 +1,106 @@
+// The Weekly Challenge - 138
+// Task 1 Work Days
+// Usage: java WorkDays YYYY
+
+import java.time.LocalDate;
+
+public class WorkDays
+{
+ public static void main(String[] args)
+ {
+ int year = Integer.parseInt(args[0]);
+ System.out.println(numOfWorkDays(year));
+
+ testing();
+ benchmark();
+
+ }
+
+ public static void testing()
+ {
+ for (int i = 1900; i <= 2400; i++)
+ {
+ if (numOfWorkDays(i) != simple_days_count(i))
+ System.out.println("big event in " + i);
+ }
+ }
+
+ public static int numOfWorkDays (int year) {
+ LocalDate MondayJan = LocalDate.of(year, 1, 1);
+ int ans = 0;
+ int ga = gd(MondayJan);
+ while (ga != 1)
+ {
+ if (ga <= 5 && ga >= 2)
+ ans++;
+ MondayJan = MondayJan.plusDays(1);
+ ga = gd(MondayJan);
+ }
+ LocalDate lastDay = MondayJan.plusWeeks(51);
+ ans += 51*5;
+ int gb = gd(lastDay);
+ while (lastDay.getDayOfYear() < lastDay.lengthOfYear())
+ {
+ if (gb <= 5 && gb >= 1)
+ ans++;
+ lastDay = lastDay.plusDays(1);
+ gb = gd(lastDay);
+ }
+ ans += gb <= 5 ? 1 : 0;
+ return ans;
+ }
+
+
+ public static int simple_days_count(int year)
+ {
+ int i = 0;
+ LocalDate my_day = LocalDate.of(year, 1, 1);
+ while (my_day.getYear() == year)
+ {
+ if (gd(my_day) != 6 && gd(my_day) != 7)
+ {
+ i++;
+ }
+ my_day = my_day.plusDays(1);
+ }
+ return i;
+ }
+
+
+ public static int gd(LocalDate date)
+ {
+ var a = date.getDayOfWeek();
+ switch(a)
+ {
+ case MONDAY: return 1;
+ case TUESDAY: return 2;
+ case WEDNESDAY: return 3;
+ case THURSDAY: return 4;
+ case FRIDAY: return 5;
+ case SATURDAY: return 6;
+ case SUNDAY: return 7;
+ }
+ return 0;
+ }
+
+ public static void benchmark()
+ {
+ long time_0 = System.nanoTime();
+ for (int i = 1975; i < 2400; i++) {
+ simple_days_count(i);
+ }
+ long time_1 = System.nanoTime();
+ for (int i = 1975; i < 2400; i++) {
+ numOfWorkDays(i);
+ }
+ long time_2 = System.nanoTime();
+ System.out.println("simple_days_count " + (time_1 - time_0));
+ System.out.println("numOfWorkDays " + (time_2 - time_1));
+
+ // Output:
+ // simple_days_count 10398009
+ // numOfWorkDays 344198
+
+ }
+
+}