aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbigail <abigail@abigail.be>2021-10-26 01:38:18 +0200
committerAbigail <abigail@abigail.be>2021-10-26 01:38:18 +0200
commitfb5bf8970ed9e1caf0ddcc71e6dd3ffd9162d1af (patch)
treefcee9a785be0a8389e3725726771eb6c7bd288d1
parent06a9225e5fc1b019c41bea9504c016310b15d824 (diff)
downloadperlweeklychallenge-club-fb5bf8970ed9e1caf0ddcc71e6dd3ffd9162d1af.tar.gz
perlweeklychallenge-club-fb5bf8970ed9e1caf0ddcc71e6dd3ffd9162d1af.tar.bz2
perlweeklychallenge-club-fb5bf8970ed9e1caf0ddcc71e6dd3ffd9162d1af.zip
Tcl solutions for week 136
-rw-r--r--challenge-136/abigail/tcl/ch-1.tcl47
-rw-r--r--challenge-136/abigail/tcl/ch-2.tcl28
2 files changed, 75 insertions, 0 deletions
diff --git a/challenge-136/abigail/tcl/ch-1.tcl b/challenge-136/abigail/tcl/ch-1.tcl
new file mode 100644
index 0000000000..53a25f8956
--- /dev/null
+++ b/challenge-136/abigail/tcl/ch-1.tcl
@@ -0,0 +1,47 @@
+#
+# See ../README.md
+#
+
+#
+# Run as: tclsh ch-1.tcl < input-file
+#
+
+#
+# Find the GCD, using Stein's algorithm
+# (https://en.wikipedia.org/wiki/Binary_GCD_algorithm)
+#
+proc gcd {u v} {
+ set u_odd [expr $u % 2]
+ set v_odd [expr $v % 2]
+ if {$u == $v || $v == 0} {return $u}
+ if { $u == 0} {return $v}
+ if {$u_odd == 0 && $v_odd == 0} {
+ return [expr [gcd [expr $u >> 1] [expr $v >> 1]] << 1]
+ }
+ if {$u_odd == 0 && $v_odd > 0} {
+ return [gcd [expr $u >> 1] $v]
+ }
+ if {$u_odd > 0 && $v_odd == 0} {
+ return [gcd $u [expr $v >> 1]]
+ }
+ if {$u > $v} {
+ return [gcd [expr $u - $v] $v]
+ }
+ return [gcd [expr $v - $u] $u]
+}
+
+
+while {[gets stdin line] >= 0} {
+ lassign [split $line " "] m n
+ set ggcd [gcd $m $n]
+ set valid 0
+ if {$ggcd > 1} {
+ while {$ggcd % 2 == 0} {
+ set ggcd [expr $ggcd / 2]
+ }
+ if {$ggcd == 1} {
+ set valid 1
+ }
+ }
+ puts $valid
+}
diff --git a/challenge-136/abigail/tcl/ch-2.tcl b/challenge-136/abigail/tcl/ch-2.tcl
new file mode 100644
index 0000000000..6062392bce
--- /dev/null
+++ b/challenge-136/abigail/tcl/ch-2.tcl
@@ -0,0 +1,28 @@
+#
+# See ../README.md
+#
+
+#
+# Run as: tclsh ch-2.tcl < input-file
+#
+
+proc _count {target this_fib prev_fib} {
+ if {$target < $this_fib} {
+ return 0
+ }
+ if {$target == $this_fib} {
+ return 1
+ }
+ return [expr [_count [expr $target - $this_fib] \
+ [expr $this_fib + $prev_fib] $this_fib] + \
+ [_count $target \
+ [expr $this_fib + $prev_fib] $this_fib]]
+}
+
+proc count {target} {
+ return [_count $target 1 1]
+}
+
+while {[gets stdin line] >= 0} {
+ puts [count $line]
+}