diff options
| -rw-r--r-- | challenge-138/java/WorkDays.java | 106 | ||||
| -rw-r--r-- | challenge-138/julia/ch-1.jl | 100 | ||||
| -rw-r--r-- | challenge-138/perl/ch-1.pl | 122 |
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 +} + |
