diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-11-14 18:20:37 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-14 18:20:37 +0000 |
| commit | 415f63ec02f2f662597344fac4496e39393f92ff (patch) | |
| tree | bfca349a7b95244ea5b6ed87c6cf0cbc90b26a7a /challenge-138 | |
| parent | cd4ee69e6e59e7f6db4a40bc1102db61643bc525 (diff) | |
| parent | 5049c688283ac6acb3c32bcd74411073cc529cfe (diff) | |
| download | perlweeklychallenge-club-415f63ec02f2f662597344fac4496e39393f92ff.tar.gz perlweeklychallenge-club-415f63ec02f2f662597344fac4496e39393f92ff.tar.bz2 perlweeklychallenge-club-415f63ec02f2f662597344fac4496e39393f92ff.zip | |
Merge pull request #5212 from Abigail/abigail/week-138
Abigail/week 138
Diffstat (limited to 'challenge-138')
35 files changed, 1333 insertions, 6 deletions
diff --git a/challenge-138/abigail/README.md b/challenge-138/abigail/README.md index 6af7507c57..bb2b1dda43 100644 --- a/challenge-138/abigail/README.md +++ b/challenge-138/abigail/README.md @@ -10,13 +10,9 @@ * [Go](go/ch-1.go) * [Java](java/ch-1.java) * [Lua](lua/ch-1.lua) -* Node.js - * [Using look-up](node/ch-1.js) - * [Using Doomsday values](node/ch-1a.js) +* [Node.js](node/ch-1.js) * [Pascal](pascal/ch-1.p) -* Perl - * [Using look-up](perl/ch-1.pl) - * [Using Doomsday values](perl/ch-1a.pl) +* [Perl](perl/ch-1.pl) * [Python](python/ch-1.py) * [R](r/ch-1.r) * [Ruby](ruby/ch-1.rb) diff --git a/challenge-138/abigail/awk/ch-1.awk b/challenge-138/abigail/awk/ch-1.awk new file mode 100644 index 0000000000..b60e858f5e --- /dev/null +++ b/challenge-138/abigail/awk/ch-1.awk @@ -0,0 +1,39 @@ +#!/usr/bin/awk + +# +# See ../README.md +# + +# +# Run as: awk -f ch-1.awk < input-file +# + +BEGIN { + split ("261 261 260 260 261 261 261 262 262 261 260 261 262 262", \ + lookup, " ") + SUNDAY = 0 + MONDAY = 1 + TUESDAY = 2 + WEDNESDAY = 3 + THURSDAY = 4 + FRIDAY = 5 + SATURDAY = 6 +} + +function doomsday (year, anchor, x, y) { + x = int (year / 100) % 4 + anchor = x == 0 ? TUESDAY \ + : x == 1 ? SUNDAY \ + : x == 2 ? FRIDAY \ + : WEDNESDAY + y = year % 100; + return ((int (y / 12) + (y % 12) + int ((y % 12) / 4)) + anchor) % 7 +} + +function is_leap (year) { + return (year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0) ? 1 : 0 +} + +{ + print (lookup [1 + 7 * is_leap($1) + doomsday($1)]) +} diff --git a/challenge-138/abigail/awk/ch-2.awk b/challenge-138/abigail/awk/ch-2.awk new file mode 100644 index 0000000000..b0fca5ffc4 --- /dev/null +++ b/challenge-138/abigail/awk/ch-2.awk @@ -0,0 +1,29 @@ +#!/usr/bin/awk + +# +# See ../README.md +# + +# +# Run as: awk -f ch-2.awk < input-file +# + +function can_split (target, number, pow_10) { + if (target > number || target < 0) {return 0} + if (target == number) {return 1} + + pow_10 = 10 + + while (pow_10 <= number) { + if (can_split(target - (number % pow_10), int (number / pow_10))) { + return 1 + } + pow_10 *= 10 + } + + return 0 +} + +{ + print ($1 > 1 && can_split(sqrt ($1), $1) ? 1 : 0) +} diff --git a/challenge-138/abigail/bash/ch-1.sh b/challenge-138/abigail/bash/ch-1.sh new file mode 100644 index 0000000000..982392620d --- /dev/null +++ b/challenge-138/abigail/bash/ch-1.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +# +# See ../README.md +# + +# +# Run as: bash ch-1.sh < input-file +# + +set -f + +SUNDAY=0 +MONDAY=1 +TUESDAY=2 +WEDNESDAY=3 +THURSDAY=4 +FRIDAY=5 +SATURDAY=6 + +LOOKUP=(261 261 260 260 261 261 261 262 262 261 260 261 262 262) +DDVALS=($TUESDAY $SUNDAY $FRIDAY $WEDNESDAY) + +function doomsday () { + local year=$1 + local anchor=${DDVALS[$(((year / 100) % 4))]} + local y=$((year % 100)) + doomsday=$((((y / 12) + (y % 12) + ((y % 12) / 4) + anchor) % 7)) +} + +function is_leap () { + local year=$1 + is_leap=$(((year % 400 == 0) || + (year % 4 == 0) && (year % 100 != 0) ? 1 : 0)) +} + +while read year +do doomsday $year + is_leap $year + echo ${LOOKUP[$((7 * $is_leap + $doomsday))]} +done diff --git a/challenge-138/abigail/bash/ch-2.sh b/challenge-138/abigail/bash/ch-2.sh new file mode 100644 index 0000000000..f8de32c814 --- /dev/null +++ b/challenge-138/abigail/bash/ch-2.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +# +# See ../README.md +# + +# +# Run as: bash ch-2.sh < input-file +# + +set -f + +function can_split () { + local target=$1 + local number=$2 + + if ((target > number)) + then can_split=0; return + fi + if ((target < 0)) + then can_split=0; return + fi + if ((target == number)) + then can_split=1; return + fi + + local pow_10=10 + + while ((pow_10 <= number)) + do can_split $((target - (number % pow_10))) $((number / pow_10)) + if ((can_split == 1)) + then return + fi + ((pow_10 *= 10)) + done + + can_split=0 +} + + +while read num +do sqrt=$(echo "sqrt($num)" | bc) + if ((num > 1)) + then can_split $sqrt $num + if ((can_split == 1)) + then echo 1 + else echo 0 + fi + else echo 0 + fi +done diff --git a/challenge-138/abigail/bc/ch-1.bc b/challenge-138/abigail/bc/ch-1.bc new file mode 100644 index 0000000000..454cb60728 --- /dev/null +++ b/challenge-138/abigail/bc/ch-1.bc @@ -0,0 +1,55 @@ +# +# See ../README.md +# + +# +# Run as: bc ch-1.bc < input-file +# + +sunday = 0 +monday = 1 +tuesday = 2 +wednesday = 3 +thursday = 4 +friday = 5 +saturday = 6 + +lookup [ 0] = 261 +lookup [ 1] = 261 +lookup [ 2] = 260 +lookup [ 3] = 260 +lookup [ 4] = 261 +lookup [ 5] = 261 +lookup [ 6] = 261 +lookup [ 7] = 262 +lookup [ 8] = 262 +lookup [ 9] = 261 +lookup [10] = 260 +lookup [11] = 261 +lookup [12] = 262 +lookup [13] = 262 + +anchor [ 0] = tuesday +anchor [ 1] = sunday +anchor [ 2] = friday +anchor [ 3] = wednesday + +define doomsday (year) { + a = anchor [(year / 100) % 4] + y = year % 100 + return (((y / 12) + (y % 12) + ((y % 12) / 4)) + a) % 7 +} + +define is_leap (year) { + if ((year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0)) { + return 1 + } else { + return 0 + } +} + + +while (1) { + year = read (); if (year == 0) {break} + lookup [7 * is_leap (year) + doomsday (year)] +} diff --git a/challenge-138/abigail/c/ch-1.c b/challenge-138/abigail/c/ch-1.c new file mode 100644 index 0000000000..7883dc9a0f --- /dev/null +++ b/challenge-138/abigail/c/ch-1.c @@ -0,0 +1,43 @@ +# include <stdlib.h> +# include <stdio.h> +# include <string.h> + +/* + * See ../README.md + */ + +/* + * Run as: cc -o ch-1.o ch-1.c; ./ch-1.o < input-file + */ + +# define SUNDAY 0 +# define MONDAY 1 +# define TUESDAY 2 +# define WEDNESDAY 3 +# define THURSDAY 4 +# define FRIDAY 5 +# define SATURDAY 6 + +int lookup [] = {261, 261, 260, 260, 261, 261, 261, + 262, 262, 261, 260, 261, 262, 262}; +int anchors [] = {TUESDAY, SUNDAY, FRIDAY, WEDNESDAY}; + +int doomsday (int year) { + int anchor = anchors [(year / 100) % 4]; + int y = year % 100; + return (((y / 12) + (y % 12) + ((y % 12) / 4)) + anchor) % 7; +} + +int is_leap (int year) { + return (year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)) ? 1 : 0; +} + +int main (void) { + int year; + + while (scanf ("%d", &year) == 1) { + printf ("%d\n", lookup [is_leap (year) * 7 + doomsday (year)]); + } + + return (0); +} diff --git a/challenge-138/abigail/c/ch-2.c b/challenge-138/abigail/c/ch-2.c new file mode 100644 index 0000000000..2b92934899 --- /dev/null +++ b/challenge-138/abigail/c/ch-2.c @@ -0,0 +1,39 @@ +# include <stdlib.h> +# include <stdio.h> +# include <string.h> +# include <stdbool.h> +# include <math.h> + +/* + * See ../README.md + */ + +/* + * Run as: cc -o ch-2.o ch-2.c; ./ch-2.o < input-file + */ + +bool can_split (long long target, long long number) { + if (target > number || target < 0) {return false;} + if (target == number) {return true;} + + long long pow_10 = 10; + + while (pow_10 <= number) { + if (can_split (target - (number % pow_10), number / pow_10)) { + return true; + } + pow_10 *= 10; + } + + return false; +} + +int main (void) { + long long number; + + while (scanf ("%lld", &number) == 1) { + printf ("%d\n", number > 1 && + can_split ((long long) sqrt (number), number) ? 1 : 0); + } + return (0); +} diff --git a/challenge-138/abigail/go/ch-1.go b/challenge-138/abigail/go/ch-1.go new file mode 100644 index 0000000000..e86ea3fbb7 --- /dev/null +++ b/challenge-138/abigail/go/ch-1.go @@ -0,0 +1,52 @@ +package main + +// +// See ../README.md +// + +// +// Run as: go run ch-1.go < input-file +// + +import ( + "fmt" +) + +const SUNDAY = 0 +const MONDAY = 1 +const TUESDAY = 2 +const WEDNESDAY = 3 +const THURSDAY = 4 +const FRIDAY = 5 +const SATURDAY = 6 + +var lookup = [2] [7] int { + {261, 261, 260, 260, 261, 261, 261}, + {262, 262, 261, 260, 261, 262, 262}, +} + +var anchors = [4] int {TUESDAY, SUNDAY, FRIDAY, WEDNESDAY} + +func doomsday (year int) int { + anchor := anchors [(year / 100) % 4] + y := year % 100 + return (((y / 12) + (y % 12) + ((y % 12) / 4)) + anchor) % 7 +} + +func is_leap (year int) int { + if (year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0) { + return 1 + } + return 0 +} + +func main () { + for { + var year int + n, err := fmt . Scanf ("%d", &year) + if (n != 1 || err != nil) { + break + } + fmt . Println (lookup [is_leap (year)] [doomsday (year)]) + } +} diff --git a/challenge-138/abigail/go/ch-2.go b/challenge-138/abigail/go/ch-2.go new file mode 100644 index 0000000000..981efe77ee --- /dev/null +++ b/challenge-138/abigail/go/ch-2.go @@ -0,0 +1,46 @@ +package main + +// +// See ../README.md +// + +// +// Run as: go run ch-2.go < input-file +// + +import ( + "fmt" + "math" +) + +func can_split (target int, number int) bool { + if target > number || target < 0 {return false} + if target == number {return true} + + pow_10 := 10 + + for pow_10 <= number { + if can_split (target - (number % pow_10), number / pow_10) { + return true + } + pow_10 *= 10 + } + + return false +} + +func main () { + for { + var number, sqrt int + n, err := fmt . Scanf ("%d", &number) + if (n != 1 || err != nil) { + break + } + sqrt = int (math . Round (math . Sqrt (float64 (number)))) + if number > 1 && can_split (sqrt, number) { + fmt . Println (1) + } else { + fmt . Println (0) + } + } +} diff --git a/challenge-138/abigail/java/ch-1.java b/challenge-138/abigail/java/ch-1.java new file mode 100644 index 0000000000..b4aff34076 --- /dev/null +++ b/challenge-138/abigail/java/ch-1.java @@ -0,0 +1,47 @@ +// +// See ../README.md +// + +// +// Run as: ln ch-1.java ch1.java; javac ch1.java; java ch1 < input-file +// + +import java.util.*; + +public class ch1 { + static int [] [] lookup = { + {261, 261, 260, 260, 261, 261, 261}, + {262, 262, 261, 260, 261, 262, 262}, + }; + + public static final int SUNDAY = 0; + public static final int MONDAY = 1; + public static final int TUESDAY = 2; + public static final int WEDNESDAY = 3; + public static final int THURSDAY = 4; + public static final int FRIDAY = 5; + public static final int SATURDAY = 6; + + static int [] anchors = {TUESDAY, SUNDAY, FRIDAY, WEDNESDAY}; + + public static int doomsday (int year) { + int anchor = anchors [(year / 100) % 4]; + int y = year % 100; + return (((y / 12) + (y % 12) + ((y % 12) / 4)) + anchor) % 7; + } + + public static int is_leap (int year) { + if ((year % 400 == 0) || (year % 4 == 0) && (year % 100 != 0)) { + return 1; + } + return 0; + } + + public static void main (String [] args) { + Scanner scanner = new Scanner (System . in); + while (scanner . hasNextInt ()) { + int year = scanner . nextInt (); + System . out . println (lookup [is_leap (year)] [doomsday (year)]); + } + } +} diff --git a/challenge-138/abigail/java/ch-2.java b/challenge-138/abigail/java/ch-2.java new file mode 100644 index 0000000000..065fd97f4f --- /dev/null +++ b/challenge-138/abigail/java/ch-2.java @@ -0,0 +1,42 @@ +// +// See ../README.md +// + +// +// Run as: ln ch-2.java ch2.java; javac ch2.java; java ch2 < input-file +// + +import java.util.*; +import java.lang.*; + +public class ch2 { + public static boolean can_split (long target, long number) { + if (target > number || target < 0) {return false;} + if (target == number) {return true;} + + long pow_10 = 10; + + while (pow_10 <= number) { + if (can_split (target - (number % pow_10), number / pow_10)) { + return true; + } + pow_10 *= 10; + } + + return false; + } + + public static void main (String [] args) { + Scanner scanner = new Scanner (System . in); + while (scanner . hasNextInt ()) { + int number = scanner . nextInt (); + int sqrt = (int) Math . round (Math . sqrt (number)); + if (number > 1 && can_split (sqrt, number)) { + System . out . println (1); + } + else { + System . out . println (0); + } + } + } +} diff --git a/challenge-138/abigail/lua/ch-1.lua b/challenge-138/abigail/lua/ch-1.lua new file mode 100644 index 0000000000..5f61cb3ec6 --- /dev/null +++ b/challenge-138/abigail/lua/ch-1.lua @@ -0,0 +1,44 @@ +#!/opt/local/bin/lua + +-- +-- See ../README.md +-- + +-- +-- Run as: lua ch-1.lua < input-file +-- + +local SUNDAY = 0 +local MONDAY = 1 +local TUESDAY = 2 +local WEDNESDAY = 3 +local THURSDAY = 4 +local FRIDAY = 5 +local SATURDAY = 6 + +local lookup = { + {261, 261, 260, 260, 261, 261, 261}, + {262, 262, 261, 260, 261, 262, 262}, +} + +local anchors = {TUESDAY, SUNDAY, FRIDAY, WEDNESDAY} + +function doomsday (year) + local anchor = anchors [1 + math . floor (year / 100) % 4] + local y = year % 100 + return ((math . floor (y / 12) + (y % 12) + math . floor ((y % 12) / 4)) + + anchor) % 7 +end + +function is_leap (year) + if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 ~= 0)) then + return 1 + end + return 0 +end + + +for year in io . lines () do + year = tonumber (year) + print (lookup [1 + is_leap (year)] [1 + doomsday (year)]) +end diff --git a/challenge-138/abigail/lua/ch-2.lua b/challenge-138/abigail/lua/ch-2.lua new file mode 100644 index 0000000000..fa7fbe87b6 --- /dev/null +++ b/challenge-138/abigail/lua/ch-2.lua @@ -0,0 +1,40 @@ +#!/opt/local/bin/lua + +-- +-- See ../README.md +-- + +-- +-- Run as: lua ch-2.lua < input-file +-- + +function can_split (target, number) + if target > number or target < 0 then + return false + end + if target == number then + return true + end + + local pow_10 = 10 + + while pow_10 <= number do + if can_split (target - (number % pow_10), + math . floor (number / pow_10)) then + return true + end + pow_10 = pow_10 * 10 + end + + return false +end + +for number in io . lines () do + number = tonumber (number) + if number > 1 and + can_split (math . floor (math . sqrt (number)), number) then + print (1) + else + print (0) + end +end diff --git a/challenge-138/abigail/node/ch-1.js b/challenge-138/abigail/node/ch-1.js new file mode 100644 index 0000000000..b969a761ef --- /dev/null +++ b/challenge-138/abigail/node/ch-1.js @@ -0,0 +1,44 @@ +#!/usr/local/bin/node + +// +// See ../README.md +// + +// +// Run as: node ch-1.js < input-file +// + +let SUNDAY = 0 +let MONDAY = 1 +let TUESDAY = 2 +let WEDNESDAY = 3 +let THURSDAY = 4 +let FRIDAY = 5 +let SATURDAY = 6 + +let lookup = [ + [261, 261, 260, 260, 261, 261, 261], + [262, 262, 261, 260, 261, 262, 262], +] + +function doomsday (year) { + let anchor = [TUESDAY, SUNDAY, FRIDAY, WEDNESDAY] + [Math . floor (year / 100) % 4] + let y = year % 100 + let doomsday = ((Math . floor (y / 12) + (y % 12) + + Math . floor ((y % 12) / 4)) + anchor) % 7 + return (doomsday) +} + +// +// Given a year, return whether it's a leap year or not +// +function is_leap (year) { + return ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0) ? 1 : 0) +} + + require ('readline') +. createInterface ({input: process . stdin}) +. on ('line', year => { + console . log (lookup [is_leap (+year)] [doomsday (+year)]) +}) diff --git a/challenge-138/abigail/node/ch-2.js b/challenge-138/abigail/node/ch-2.js new file mode 100644 index 0000000000..571e5ff5f2 --- /dev/null +++ b/challenge-138/abigail/node/ch-2.js @@ -0,0 +1,34 @@ +#!/usr/local/bin/node + +// +// See ../README.md +// + +// +// Run as: node ch-2.js < input-file +// + +function can_split (target, number) { + if (target > number || target < 0) {return false} + if (target == number) {return true} + + let pow_10 = 10 + + while (pow_10 <= number) { + if (can_split (target - (number % pow_10), + Math . floor (number / pow_10))) { + return true + } + pow_10 *= 10 + } + + return false +} + + + require ('readline') +. createInterface ({input: process . stdin}) +. on ('line', number => { + console . log (number > 1 && can_split + (Math . trunc (Math . sqrt (number)), number) ? 1 : 0) +}) diff --git a/challenge-138/abigail/pascal/ch-1.p b/challenge-138/abigail/pascal/ch-1.p new file mode 100644 index 0000000000..594c76f307 --- /dev/null +++ b/challenge-138/abigail/pascal/ch-1.p @@ -0,0 +1,58 @@ +Program XXX; + +(* *) +(* See ../README.md *) +(* *) + +(* *) +(* Run as: fpc -och-1.out ch-1.p; ./ch-1.out < input-file *) +(* *) + +const + SUNDAY = 0; + MONDAY = 1; + TUESDAY = 2; + WEDNESDAY = 3; + THURSDAY = 4; + FRIDAY = 5; + SATURDAY = 6; + +var + anchors: Array [0 .. 3] of Integer = ( + TUESDAY, SUNDAY, FRIDAY, WEDNESDAY + ); + lookup: Array [0 .. 1, 0 .. 6] of Integer = ( + (261, 261, 260, 260, 261, 261, 261), + (262, 262, 261, 260, 261, 262, 262) + ); + year: Integer; + + +function doomsday (year: Integer): Integer; + var + anchor, y: Integer; + + begin + anchor := anchors [(year div 100) mod 4]; + y := year mod 100; + doomsday := (((y div 12) + (y mod 12) + + ((y mod 12) div 4)) + anchor) mod 7; + end; + +function is_leap (year: Integer): Integer; + begin + if (year mod 400 = 0) or + ((year mod 4 = 0) and (year mod 100 <> 0)) then begin + is_leap := 1; + end + else begin + is_leap := 0; + end + end; + +begin + while not eof do begin + readln (year); + writeln (lookup [is_leap (year)] [doomsday (year)]); + end +end. diff --git a/challenge-138/abigail/pascal/ch-2.p b/challenge-138/abigail/pascal/ch-2.p new file mode 100644 index 0000000000..cb5790803a --- /dev/null +++ b/challenge-138/abigail/pascal/ch-2.p @@ -0,0 +1,51 @@ +Program ch2; + +(* *) +(* See ../README.md *) +(* *) + +(* *) +(* Run as: fpc -och-2.out ch-2.p; ./ch-2.out < input-file *) +(* *) + +function can_split (target: longint; number: longint): boolean; + var + pow_10: longint; + begin + if (target > number) or (target < 0) then begin + can_split := false; + exit; + end; + if (target = number) then begin + can_split := true; + exit; + end; + + pow_10 := 10; + + while pow_10 <= number do begin + if can_split (target - (number mod pow_10), + number div pow_10) then begin + can_split := true; + exit; + end; + + pow_10 := pow_10 * 10; + end; + + can_split := false; + exit; + end; + +var + number: longint; + +begin + while not eof do begin + readln (number); + if (number > 1) and can_split (round (sqrt (number)), number) then + writeln (1) + else + writeln (0) + end +end. diff --git a/challenge-138/abigail/perl/ch-1.pl b/challenge-138/abigail/perl/ch-1.pl new file mode 100644 index 0000000000..eae1bea355 --- /dev/null +++ b/challenge-138/abigail/perl/ch-1.pl @@ -0,0 +1,89 @@ +#!/opt/perl/bin/perl + +use 5.028; + +use strict; +use warnings; +no warnings 'syntax'; + +use experimental 'signatures'; +use experimental 'lexical_subs'; + +# +# See ../README.md +# + +# +# Run as: perl ch-1.pl < input-file +# |
