aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-138/java/WorkDays.java106
-rw-r--r--challenge-138/julia/ch-1.jl100
-rw-r--r--challenge-138/perl/ch-1.pl122
3 files changed, 328 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
+
+ }
+
+}
diff --git a/challenge-138/julia/ch-1.jl b/challenge-138/julia/ch-1.jl
new file mode 100644
index 0000000000..edd6a62b7f
--- /dev/null
+++ b/challenge-138/julia/ch-1.jl
@@ -0,0 +1,100 @@
+# The Weekly Challenge Week 138
+# Task 1 Work Days
+# Usage: include("ch-1.jl")
+# num_of_work_days(year)
+
+using Dates
+
+workday(x) = (
+ Dates.dayofweek(x) != Dates.Sunday
+ && Dates.dayofweek(x) != Dates.Saturday
+)
+
+
+
+function num_of_work_days(year)
+ ans = 0
+ my_day = Date(year, 1, 1)
+ while Dates.dayofweek(my_day) != Dates.Monday
+ if workday(my_day)
+ ans += 1
+ end
+ my_day += Dates.Day(1)
+ end
+
+ FirstMondayJan = my_day
+
+ SundayDec = Dates.lastdayofweek(Date(year,12,31))
+ if (Dates.year( SundayDec + Dates.Day(1) ) == year+1)
+ SundayDec -= Dates.Day(7)
+ end
+
+
+ LastMondayDec = SundayDec + Dates.Day(1);
+
+ ans += 5*(dayofyear(LastMondayDec) - dayofyear(FirstMondayJan))/7
+ # early version of CY's code: ans += 5*51
+ ans = convert(Int64, ans)
+
+ my_day = LastMondayDec
+ while Dates.year(my_day) == year
+ if workday(my_day)
+ ans += 1
+ end
+ my_day += Dates.Day(1)
+ end
+
+ return ans
+
+end
+
+
+
+function simple_days_count(year)
+ i = 0
+ my_day = Date(year, 1, 1)
+ while Dates.year(my_day) == year
+ if workday(my_day)
+ i += 1
+ end
+ my_day += Dates.Day(1)
+ end
+ return i
+end
+
+
+# testing
+for y = 1900:2400
+ if simple_days_count(y) != num_of_work_days(y)
+ println("big event in ", y)
+ end
+end
+
+
+#= benchmarking
+
+julia> function sdc()
+ for i = 1975:2400
+ simple_days_count(i)
+ end
+ end
+sdc (generic function with 1 method)
+
+julia> function nowd()
+ for i = 1975:2400
+ num_of_work_days(i)
+ end
+ end
+nowd (generic function with 1 method)
+
+julia> @benchmark sdc()
+ Time (median): 2.463 ms ┊ GC (median): 0.00%
+ Time (mean ± σ): 2.463 ms ± 65.409 μs ┊ GC (mean ± σ): 0.00% ± 0.00%
+
+julia> @benchmark nowd()
+ Time (median): 74.457 μs ┊ GC (median): 0.00%
+ Time (mean ± σ): 74.970 μs ± 3.365 μs ┊ GC (mean ± σ): 0.00% ± 0.00%
+
+
+
+=#
diff --git a/challenge-138/perl/ch-1.pl b/challenge-138/perl/ch-1.pl
new file mode 100644
index 0000000000..bb3e5fd167
--- /dev/null
+++ b/challenge-138/perl/ch-1.pl
@@ -0,0 +1,122 @@
+#!/usr/bin/perl
+# The Weekly Challenge 138
+# Task 1 Work Days
+# Usage: ch-1.pl $YEAR
+use v5.12.0;
+use warnings;
+use Time::Local qw 'timelocal_nocheck ';
+use Time::HiRes qw 'time'; #for benchmarking
+
+say count_work_days($ARGV[0]) if defined($ARGV[0]) && $ARGV[0] >= 1900;
+
+
+testing();
+benchmark();
+
+
+
+sub testing {
+ for my $i (1975..2400) {
+ say "big event in ", $i
+ if simple_days_count($i) != count_work_days($i);
+ }
+}
+
+
+
+sub count_work_days {
+ my $y = $_[0];
+ my %wday = (
+ "Mon" => 1,
+ "Tue" => 2,
+ "Wed" => 3,
+ "Thu" => 4,
+ "Fri" => 5,
+ "Sat" => 6,
+ "Sun" => 0,
+ );
+
+ my $_01Jan = localtime timelocal_nocheck 0, 0, 0, 1, 0, $y;
+ my $d_01Jan= $wday{(split " ", $_01Jan)[0]};
+
+ my $diff = (1 - $d_01Jan) % 7;
+
+ my @firstMonday = localtime timelocal_nocheck 0, 0, 0, 1+$diff, 0, $y;
+
+ my $_31Dec = localtime timelocal_nocheck 0, 0, 0, 31, 11, $y;
+
+ my $d_31Dec = $wday{(split " ", $_31Dec)[0]};
+
+ my $back_diff = ($d_31Dec - 5) % 7;
+
+
+ my @MondayAfterLastFriday
+# = $back_diff < 3
+# ? localtime timelocal_nocheck 0, 0, 0, 3-$back_diff, 0, $y+1
+# : localtime timelocal_nocheck 0, 0, 0, 31-$back_diff+3, 11, $y;
+ = localtime timelocal_nocheck 0, 0, 0, 3-$back_diff, 0, $y+1;
+
+ my $ans
+ = 5 * int (
+ (timelocal_nocheck(@MondayAfterLastFriday)
+ -timelocal_nocheck(@firstMonday))
+ /86400/7
+ );
+
+ $ans += 6-$d_01Jan if $d_01Jan > 1;
+ $ans += $d_31Dec if $d_31Dec < 5;
+
+ return $ans;
+
+}
+
+sub simple_days_count {
+ my %wday = (
+ "Mon" => 1,
+ "Tue" => 2,
+ "Wed" => 3,
+ "Thu" => 4,
+ "Fri" => 5,
+ "Sat" => 6,
+ "Sun" => 0,
+ );
+ my $y = $_[0];
+ my $day_var = timelocal_nocheck 0, 0, 0, 1, 0, $y;
+ my $my_day = scalar localtime $day_var;
+
+ my $d = $wday{(split " ", $my_day)[0]};
+
+ my $i = 0;
+ while ((split " ", $my_day)[4] == $y) {
+ $i++ if ($d >= 1 && $d <= 5);
+ $day_var = $day_var + 86400;
+ $my_day = scalar localtime $day_var;
+ $d = $wday{(split " ", $my_day)[0]};
+ }
+ return $i;
+}
+
+
+
+sub benchmark {
+ my $time_0 = time;
+ for my $i (1975..2400) {
+ simple_days_count($i);
+ }
+
+ my $time_1 = time;
+ for my $i (1975..2400) {
+ count_work_days($i);
+ }
+
+ my $time_2 = time;
+
+ say "Benchmarking:";
+ say "simple_days_count: ", $time_1 - $time_0;
+ say "count_work_days: ", $time_2 - $time_1;
+
+ # Output:
+ # simple_days_count: 0.491244077682495
+ # count_work_days: 0.0362129211425781
+}
+