diff options
| author | Abigail <abigail@abigail.be> | 2021-07-05 18:40:41 +0200 |
|---|---|---|
| committer | Abigail <abigail@abigail.be> | 2021-07-06 00:55:53 +0200 |
| commit | 0242bf8e30c825fb37e1a19fb70e8d8b6a47957f (patch) | |
| tree | 64a3d069aff080ba761fea76c69f70808cd94fec | |
| parent | a781fb0ab337d2da7233100cc3414694dec59f40 (diff) | |
| download | perlweeklychallenge-club-0242bf8e30c825fb37e1a19fb70e8d8b6a47957f.tar.gz perlweeklychallenge-club-0242bf8e30c825fb37e1a19fb70e8d8b6a47957f.tar.bz2 perlweeklychallenge-club-0242bf8e30c825fb37e1a19fb70e8d8b6a47957f.zip | |
Solutions in 14 languages for week 120, part 2
| -rw-r--r-- | challenge-120/abigail/README.md | 6 | ||||
| -rw-r--r-- | challenge-120/abigail/awk/ch-2.awk | 25 | ||||
| -rw-r--r-- | challenge-120/abigail/bash/ch-2.sh | 38 | ||||
| -rw-r--r-- | challenge-120/abigail/bc/ch-2.bc | 44 | ||||
| -rw-r--r-- | challenge-120/abigail/befunge-93/ch-2.bf93 | 12 | ||||
| -rw-r--r-- | challenge-120/abigail/c/ch-2.c | 33 | ||||
| -rw-r--r-- | challenge-120/abigail/go/ch-2.go | 38 | ||||
| -rw-r--r-- | challenge-120/abigail/java/ch-2.java | 45 | ||||
| -rw-r--r-- | challenge-120/abigail/lua/ch-2.lua | 26 | ||||
| -rw-r--r-- | challenge-120/abigail/node/ch-2.js | 26 | ||||
| -rw-r--r-- | challenge-120/abigail/perl/ch-2.pl | 51 | ||||
| -rw-r--r-- | challenge-120/abigail/python/ch-2.py | 27 | ||||
| -rw-r--r-- | challenge-120/abigail/r/ch-2.r | 28 | ||||
| -rw-r--r-- | challenge-120/abigail/ruby/ch-2.rb | 25 | ||||
| -rw-r--r-- | challenge-120/abigail/t/ctest.ini | 3 | ||||
| -rw-r--r-- | challenge-120/abigail/tcl/ch-2.tcl | 28 |
16 files changed, 455 insertions, 0 deletions
diff --git a/challenge-120/abigail/README.md b/challenge-120/abigail/README.md index f2ea164db7..84e672283a 100644 --- a/challenge-120/abigail/README.md +++ b/challenge-120/abigail/README.md @@ -74,12 +74,18 @@ Output: 120 degree ### Solutions * [AWK](awk/ch-2.awk) * [Bash](bash/ch-2.sh) +* [bc](bc/ch-2.bc) +* [Befunge-93](befunge-93/ch-2.bf93) * [C](c/ch-2.c) +* [Go](go/ch-2.go) +* [Java](java/ch-2.java) * [Lua](lua/ch-2.lua) * [Node.js](node/ch-2.js) * [Perl](perl/ch-2.pl) * [Python](python/ch-2.py) +* [R](r/ch-2.r) * [Ruby](ruby/ch-2.rb) +* [Tcl](tcl/ch-2.tcl) ### Blog [Clock Angle](https://abigail.github.io/HTML/Perl-Weekly-Challenge/week-120-2.html) diff --git a/challenge-120/abigail/awk/ch-2.awk b/challenge-120/abigail/awk/ch-2.awk new file mode 100644 index 0000000000..f7a32c7ee0 --- /dev/null +++ b/challenge-120/abigail/awk/ch-2.awk @@ -0,0 +1,25 @@ +#!/usr/bin/awk + +# +# See ../README.md +# + +# +# Run as: awk -f ch-2.awk < input-file +# + +BEGIN { + FS = ":" + DIFF_PER_MINUTE = 11 + MIN_PER_HOUR = 60 + FULL_CIRCLE = 720 +} + +{ + angle = (DIFF_PER_MINUTE * ($1 * MIN_PER_HOUR + $2)) % FULL_CIRCLE + if (2 * angle >= FULL_CIRCLE) { + angle = FULL_CIRCLE - angle + } + + print (angle / 2) +} diff --git a/challenge-120/abigail/bash/ch-2.sh b/challenge-120/abigail/bash/ch-2.sh new file mode 100644 index 0000000000..62540af529 --- /dev/null +++ b/challenge-120/abigail/bash/ch-2.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +# +# See ../README.md +# + +# +# Run as: bash ch-2.sh < input-file +# + +set -f + +IFS=":" + +DIFF_PER_MINUTE=11 # Half degrees +MIN_PER_HOUR=60 +FULL_CIRCLE=720 # Half degrees + +while read hours minutes +do # + # Bash is going to interpret an hour (or minute) of the form "08" + # or "09" as an illegal octal number. So, we're going to use a + # trick: we prepend a 1, and subtract 100. + # + ((hours = "1$hours" - 100)) + ((minutes = "1$minutes" - 100)) + ((angle = (DIFF_PER_MINUTE * (hours * MIN_PER_HOUR + minutes)) % + FULL_CIRCLE)) + if ((2 * angle >= FULL_CIRCLE)) + then ((angle = FULL_CIRCLE - angle)) + fi + + printf "%d" $((angle / 2)) + if ((angle % 2 == 1)) + then printf ".5" + fi + echo +done diff --git a/challenge-120/abigail/bc/ch-2.bc b/challenge-120/abigail/bc/ch-2.bc new file mode 100644 index 0000000000..6897ea94a8 --- /dev/null +++ b/challenge-120/abigail/bc/ch-2.bc @@ -0,0 +1,44 @@ +# +# See ../README.md +# + +# +# Run as: bc ch-2.bc < input-file +# + +diff_per_minute = 11 +min_per_hour = 60 +full_circle = 720 + +while (1) { + hours = read () + if (hours == -1) { + break + } + minutes = read () + + # + # Result scale to 0, otherwise % acts weirdly. + # + scale = 0 + angle = (diff_per_minute * (hours * min_per_hour + minutes)) % full_circle + if (2 * angle >= full_circle) { + angle = full_circle - angle + } + + # + # If the angle is an odd number of half degrees, we want + # a result ending in ".5", but if it's an even number of + # half degrees, we don't want to end in ".0" + # + scale = angle % 2 + + # + # Little hack to print a half as "0.5" + # + if (angle == 1) { + "0" + } + + angle / 2 +} diff --git a/challenge-120/abigail/befunge-93/ch-2.bf93 b/challenge-120/abigail/befunge-93/ch-2.bf93 new file mode 100644 index 0000000000..103f2830bf --- /dev/null +++ b/challenge-120/abigail/befunge-93/ch-2.bf93 @@ -0,0 +1,12 @@ +> & :1+!#@_ ~$ 543*** &+ 65+ * 65432**** % : 6543*** `#v_v +^ v v +^ v<<<<<<<<<<<<<<<<<<<<<<<<<<<</2 : < -\ ****23456 : < v +^ v ^<<<<<<<<<<<<<<<<<<<< +^ v +^ > : 56+9* `!#v_ : 554** / "0"+, 554** % > : 55+ / "0"+, > 55+% "0"+, v +^ v ^ ^ v +^ >>>>>>>>>>>>>>>>>>> : 9 `#^_ ^ v +^ v +^ v ,,".5" < v +^ v ^ v +^<<<<<<<<<<<<<<<<<<<<<<<<<< , +55 <<<<<<<<<<<<<<<<<<<< _^# !%2 <<< diff --git a/challenge-120/abigail/c/ch-2.c b/challenge-120/abigail/c/ch-2.c new file mode 100644 index 0000000000..56e1872d0d --- /dev/null +++ b/challenge-120/abigail/c/ch-2.c @@ -0,0 +1,33 @@ +# include <stdlib.h> +# include <stdio.h> +# include <string.h> + +/* + * See ../README.md + */ + +/* + * Run as: cc -o ch-2.o ch-2.c; ./ch-2.o < input-file + */ + +# define DIFF_PER_MINUTE 11 /* Half degrees */ +# define MIN_PER_HOUR 60 +# define FULL_CIRCLE 720 /* Half degrees */ + +int main (void) { + int hours, minutes; + + while (scanf ("%d:%d", &hours, &minutes) == 2) { + int angle = (DIFF_PER_MINUTE * (hours * MIN_PER_HOUR + minutes)) % + FULL_CIRCLE; + if (2 * angle >= FULL_CIRCLE) { + angle = FULL_CIRCLE - angle; + } + printf ("%d", angle / 2); + if (angle % 2) { + printf (".5"); + } + printf ("\n"); + } + return (0); +} diff --git a/challenge-120/abigail/go/ch-2.go b/challenge-120/abigail/go/ch-2.go new file mode 100644 index 0000000000..a4a6f4ce95 --- /dev/null +++ b/challenge-120/abigail/go/ch-2.go @@ -0,0 +1,38 @@ +package main + +// +// See ../README.md +// + +// +// Run as: go run ch-2.go < input-file +// + +import ( + "fmt" +) + +var DIFF_PER_MINUTE = 11; +var MIN_PER_HOUR = 60; +var FULL_CIRCLE = 720; + +func main () { + var hours, minutes int; + for { + var n, err = fmt . Scanf ("%d:%d", &hours, &minutes) + if (err != nil || n != 2) { + break; + } + var angle = (DIFF_PER_MINUTE * (hours * MIN_PER_HOUR + minutes)) % + FULL_CIRCLE; + if (2 * angle >= FULL_CIRCLE) { + angle = FULL_CIRCLE - angle; + } + + fmt . Print (angle / 2); + if (angle % 2 == 1) { + fmt . Print (".5") + } + fmt . Print ("\n") + } +} diff --git a/challenge-120/abigail/java/ch-2.java b/challenge-120/abigail/java/ch-2.java new file mode 100644 index 0000000000..9ffeb322ee --- /dev/null +++ b/challenge-120/abigail/java/ch-2.java @@ -0,0 +1,45 @@ +// +// See ../README.md +// + +// +// Run as: ln ch-2.java ch2.java; javac ch2.java; java ch2 < input-file +// + +import java.util.*; + + +public class ch2 { + public static void main (String [] args) { + int DIFF_PER_MINUTE = 11; // Half degrees + int MIN_PER_HOUR = 60; + int FULL_CIRCLE = 720; // Half degrees + Scanner scanner = new Scanner (System . in); + try { + while (true) { + String line = scanner . nextLine (); + String [] parts = line . split (":"); + int hours = Integer . parseInt (parts [0]); + int minutes = Integer . parseInt (parts [1]); + + int angle = (DIFF_PER_MINUTE * + (hours * MIN_PER_HOUR + minutes)) % FULL_CIRCLE; + + if (2 * angle >= FULL_CIRCLE) { + angle = FULL_CIRCLE - angle; + } + + System . out . print (angle / 2); + if (angle % 2 == 1) { + System . out . print (".5"); + } + System . out . print ("\n"); + } + } + catch (Exception e) { + // + // EOF + // + } + } +} diff --git a/challenge-120/abigail/lua/ch-2.lua b/challenge-120/abigail/lua/ch-2.lua new file mode 100644 index 0000000000..31c18d0b5e --- /dev/null +++ b/challenge-120/abigail/lua/ch-2.lua @@ -0,0 +1,26 @@ +#!/opt/local/bin/lua + +-- +-- See ../README.md +-- + +-- +-- Run as: lua ch-2.lua < input-file +-- + +local DIFF_PER_MINUTE = 11 +local MIN_PER_HOUR = 60 +local FULL_CIRCLE = 720 + +for line in io . lines () do + local _, _, hours, minutes = line : find ("([0-9][0-9]):([0-9][0-9])") + hours = tonumber (hours) + minutes = tonumber (minutes) + local angle = (DIFF_PER_MINUTE * (hours * MIN_PER_HOUR + minutes)) % + FULL_CIRCLE + if 2 * angle >= FULL_CIRCLE + then angle = FULL_CIRCLE - angle + end + + print (angle / 2) +end diff --git a/challenge-120/abigail/node/ch-2.js b/challenge-120/abigail/node/ch-2.js new file mode 100644 index 0000000000..4159eafa6d --- /dev/null +++ b/challenge-120/abigail/node/ch-2.js @@ -0,0 +1,26 @@ +#!/usr/local/bin/node + +// +// See ../README.md +// + +// +// Run as: node ch-2.js < input-file +// + +let DIFF_PER_MINUTE = 11 +let MIN_PER_HOUR = 60 +let FULL_CIRCLE = 720 + + require ('readline') +. createInterface ({input: process . stdin}) +. on ('line', line => { + let [hours, minutes] = line . trim () . split (":") + angle = (DIFF_PER_MINUTE * (+hours * MIN_PER_HOUR + +minutes)) % + FULL_CIRCLE + if (2 * angle >= FULL_CIRCLE) { + angle = FULL_CIRCLE - angle + } + + console . log (angle / 2) +}) diff --git a/challenge-120/abigail/perl/ch-2.pl b/challenge-120/abigail/perl/ch-2.pl new file mode 100644 index 0000000000..b533e7d8a6 --- /dev/null +++ b/challenge-120/abigail/perl/ch-2.pl @@ -0,0 +1,51 @@ +#!/opt/perl/bin/perl + +use 5.032; + +use strict; +use warnings; +no warnings 'syntax'; + +use experimental 'signatures'; +use experimental 'lexical_subs'; + +# +# See ../README.md +# + +# +# Run as: perl ch-2.pl < input-file +# + +my $MIN_PER_HOUR = 60; +my $DIFF_PER_MINUTE = 11; # Half degrees +my $FULL_CIRCLE = 720; # Half degrees + +while (<>) { + my ($hours, $minutes) = /[0-9]+/g; + # + # Every minute, the angle between the hour and minute hand + # increases by 5.5 degrees. So, we will calculate how many + # minutes have passed since 00:00, multiply this by 11, giving + # us the number of half degrees between two hands. + # We normalize the angle by modding it by 720. To get the smaller + # angle, if the angle is more than 360, we subtract the angle + # from 720 (the full circle). + # + # Finally, we divide by 2, to get the answer in degrees. + # + + # + # Note that this is going to work regardless whether the + # time is given in 12 hour format, a 24 hour format, or + # the silly format Americans use. + # + + my $angle = ($DIFF_PER_MINUTE * ($hours * $MIN_PER_HOUR + $minutes)) % + $FULL_CIRCLE; + $angle = $FULL_CIRCLE - $angle if 2 * $angle >= $FULL_CIRCLE; + + say $angle / 2; +} + +__END__ diff --git a/challenge-120/abigail/python/ch-2.py b/challenge-120/abigail/python/ch-2.py new file mode 100644 index 0000000000..5c01644600 --- /dev/null +++ b/challenge-120/abigail/python/ch-2.py @@ -0,0 +1,27 @@ +#!/opt/local/bin/python + +# +# See ../README.md +# + +# +# Run as: python ch-2.py < input-file +# + +import fileinput + +DIFF_PER_MINUTE = 11 +MIN_PER_HOUR = 60 +FULL_CIRCLE = 720 + +for line in fileinput . input (): + hours, minutes = line . strip () . split (":") + angle = (DIFF_PER_MINUTE * (int (hours) * MIN_PER_HOUR + int (minutes))) \ + % FULL_CIRCLE + if 2 * angle >= FULL_CIRCLE: + angle = FULL_CIRCLE - angle + + print ("{}" . format (int (angle / 2)), end = '') + if angle % 2: + print (".5", end = '') + print ("") diff --git a/challenge-120/abigail/r/ch-2.r b/challenge-120/abigail/r/ch-2.r new file mode 100644 index 0000000000..8fd4497435 --- /dev/null +++ b/challenge-120/abigail/r/ch-2.r @@ -0,0 +1,28 @@ +# +# See ../README.md +# + +# +# Run as: Rscript ch-2.r < input-file +# + +DIFF_PER_MINUTE <- 11 +MIN_PER_HOUR <- 60 +FULL_CIRCLE <- 720 + +stdin <- file ('stdin', 'r') +repeat { + time <- readLines (stdin, n = 1) + if (length (time) == 0) { + break + } + parts <- strsplit (time, ":") + hours <- as.numeric (parts [[1]] [[1]]) + minutes <- as.numeric (parts [[1]] [[2]]) + angle <- (DIFF_PER_MINUTE * (hours * MIN_PER_HOUR + minutes)) %% + FULL_CIRCLE + if (2 * angle >= FULL_CIRCLE) { + angle <- FULL_CIRCLE - angle + } + cat (angle / 2, "\n") +} diff --git a/challenge-120/abigail/ruby/ch-2.rb b/challenge-120/abigail/ruby/ch-2.rb new file mode 100644 index 0000000000..ad72cfa1fa --- /dev/null +++ b/challenge-120/abigail/ruby/ch-2.rb @@ -0,0 +1,25 @@ +#!/usr/bin/ruby + +# +# See ../README.md +# + +# +# Run as: ruby ch-2.rb < input-file +# + +diff_per_minute = 11 +min_per_hour = 60 +full_circle = 720 + +ARGF . each_line do + |time| + hours, minutes = time . split (/:/) + angle = (diff_per_minute * (hours . to_i * min_per_hour + minutes . to_i))\ + % full_circle + angle = full_circle - angle if 2 * angle >= full_circle + + print (angle / 2) + print (".5") if angle % 2 == 1 + print ("\n") +end diff --git a/challenge-120/abigail/t/ctest.ini b/challenge-120/abigail/t/ctest.ini index 4bfae653d8..4cd56690f3 100644 --- a/challenge-120/abigail/t/ctest.ini +++ b/challenge-120/abigail/t/ctest.ini @@ -11,3 +11,6 @@ [challenges/1/bc]
add_to_input = 0
+
+[challenges/2/bc]
+add_to_input = -1
diff --git a/challenge-120/abigail/tcl/ch-2.tcl b/challenge-120/abigail/tcl/ch-2.tcl new file mode 100644 index 0000000000..44989af0e1 --- /dev/null +++ b/challenge-120/abigail/tcl/ch-2.tcl @@ -0,0 +1,28 @@ +# +# See ../README.md +# + +# +# Run as: tclsh ch-2.tcl < input-file +# + +set DIFF_PER_MINUTE 11 +set MIN_PER_HOUR 60 +set FULL_CIRCLE 720 + +while {[gets stdin line] >= 0} { + set parts [split $line :] + set hours [expr 1[lindex $parts 0] - 100] + set minutes [expr 1[lindex $parts 1] - 100] + set angle [expr (($DIFF_PER_MINUTE * \ + ($hours * $MIN_PER_HOUR + $minutes))) % $FULL_CIRCLE] + if {2 * $angle >= $FULL_CIRCLE} { + set angle [expr $FULL_CIRCLE - $angle] + } + + puts -nonewline [expr $angle / 2] + if {$angle % 2 == 1} { + puts -nonewline ".5" + } + puts "" +} |
