aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbigail <abigail@abigail.be>2021-07-05 18:40:41 +0200
committerAbigail <abigail@abigail.be>2021-07-06 00:55:53 +0200
commit0242bf8e30c825fb37e1a19fb70e8d8b6a47957f (patch)
tree64a3d069aff080ba761fea76c69f70808cd94fec
parenta781fb0ab337d2da7233100cc3414694dec59f40 (diff)
downloadperlweeklychallenge-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.md6
-rw-r--r--challenge-120/abigail/awk/ch-2.awk25
-rw-r--r--challenge-120/abigail/bash/ch-2.sh38
-rw-r--r--challenge-120/abigail/bc/ch-2.bc44
-rw-r--r--challenge-120/abigail/befunge-93/ch-2.bf9312
-rw-r--r--challenge-120/abigail/c/ch-2.c33
-rw-r--r--challenge-120/abigail/go/ch-2.go38
-rw-r--r--challenge-120/abigail/java/ch-2.java45
-rw-r--r--challenge-120/abigail/lua/ch-2.lua26
-rw-r--r--challenge-120/abigail/node/ch-2.js26
-rw-r--r--challenge-120/abigail/perl/ch-2.pl51
-rw-r--r--challenge-120/abigail/python/ch-2.py27
-rw-r--r--challenge-120/abigail/r/ch-2.r28
-rw-r--r--challenge-120/abigail/ruby/ch-2.rb25
-rw-r--r--challenge-120/abigail/t/ctest.ini3
-rw-r--r--challenge-120/abigail/tcl/ch-2.tcl28
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 ""
+}