aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-126/abigail/README.md4
-rw-r--r--challenge-126/abigail/bc/ch-1.bc51
-rw-r--r--challenge-126/abigail/go/ch-1.go41
-rw-r--r--challenge-126/abigail/scheme/ch-1.scm44
-rw-r--r--challenge-126/abigail/t/ctest.ini3
-rw-r--r--challenge-126/abigail/tcl/ch-1.tcl23
-rw-r--r--challenge-132/abigail/README.md2
-rw-r--r--challenge-132/abigail/go/ch-1.go41
-rw-r--r--challenge-132/abigail/tcl/ch-1.tcl55
9 files changed, 264 insertions, 0 deletions
diff --git a/challenge-126/abigail/README.md b/challenge-126/abigail/README.md
index 07235caf33..ee8f84f1bb 100644
--- a/challenge-126/abigail/README.md
+++ b/challenge-126/abigail/README.md
@@ -28,12 +28,16 @@ There are 13 numbers between `1` and `25` that don't contain digit `1`:
### Solutions
* [AWK](awk/ch-1.awk)
* [Bash](bash/ch-1.sh)
+* [bc](bc/ch-1.bc)
* [C](c/ch-1.c)
+* [Go](go/ch-1.go)
* [Lua](lua/ch-1.lua)
* [Node.js](node/ch-1.js)
* [Perl](perl/ch-1.pl)
* [Python](python/ch-1.py)
* [Ruby](ruby/ch-1.rb)
+* [Scheme](scheme/ch-1.scm)
+* [Tcl](tcl/ch-1.tcl)
### Blog
[Perl Weekly Challenge 126: Count Numbers][blog1]
diff --git a/challenge-126/abigail/bc/ch-1.bc b/challenge-126/abigail/bc/ch-1.bc
new file mode 100644
index 0000000000..a3204ccc31
--- /dev/null
+++ b/challenge-126/abigail/bc/ch-1.bc
@@ -0,0 +1,51 @@
+#
+# See ../README.md
+#
+
+#
+# Run as: bc ch-1.bc < input-file
+#
+
+#
+# Kind of reverses a number. Trailing zero's will be dropped though
+#
+define reverse (n) {
+ result = 0
+ while (n > 0) {
+ result = 10 * result + (n % 10)
+ n = n / 10
+ }
+ return result
+}
+
+
+while (1) {
+ n = read (); if (n == 0) {break}
+ #
+ # Reverse the number -- after adding a 1
+ #
+ n = reverse (10 * n + 1)
+
+ result = 0
+ seen_one = 0
+ while (n > 9) {
+ digit = n % 10
+ n = n / 10
+ result = result * 9
+ if (seen_one == 1) {
+ result = result + 8
+ } else {
+ if (digit == 1) {
+ seen_one = 1
+ } else {
+ if (digit > 0) {
+ result = result + digit - 1
+ }
+ }
+ }
+ }
+ result
+}
+
+
+halt
diff --git a/challenge-126/abigail/go/ch-1.go b/challenge-126/abigail/go/ch-1.go
new file mode 100644
index 0000000000..a769bbf4af
--- /dev/null
+++ b/challenge-126/abigail/go/ch-1.go
@@ -0,0 +1,41 @@
+package main
+
+//
+// See ../README.md
+//
+
+//
+// Run as: go run ch-1.go
+//
+
+import (
+ "fmt"
+ "bufio"
+ "os"
+)
+
+func main () {
+ var reader = bufio . NewReader (os. Stdin)
+ for {
+ var text, err = reader . ReadString ('\n')
+ if (err != nil) {
+ break
+ }
+ result := 0
+ seen_one := false
+ for _, digit := range text {
+ if digit < '0' || digit > '9' {
+ continue
+ }
+ result = 9 * result
+ if seen_one {
+ result += 8
+ } else if digit == '1' {
+ seen_one = true
+ } else if digit != '0' {
+ result = result + int (digit - '0') - 1
+ }
+ }
+ fmt . Println (result)
+ }
+}
diff --git a/challenge-126/abigail/scheme/ch-1.scm b/challenge-126/abigail/scheme/ch-1.scm
new file mode 100644
index 0000000000..7ae444e59d
--- /dev/null
+++ b/challenge-126/abigail/scheme/ch-1.scm
@@ -0,0 +1,44 @@
+;;;
+;;; See ../README.md
+;;;
+
+;;;
+;;; Run as: guile --no-auto-compile ch-1.scm < input-file
+;;;
+
+(use-modules (ice-9 rdelim))
+
+;;
+;; Return the first character of a string, *as a number*.
+;; We won't call this with an empty or non-numeric string.
+;;
+(define (first str)(string->number (string-take str 1)))
+
+
+(define (_nr-of-ones input result seen-one)
+ (if (string-null? input) result
+ (_nr-of-ones (string-drop input 1)
+ (+ (* result 9)
+ (cond (seen-one 8)
+ ((> (first input) 0) (- (first input) 1))
+ (else 0)))
+ (or seen-one (= (first input) 1))))
+)
+
+;;
+;; Wrapper around _nr-of-ones, supplying additional parameters.
+;;
+(define (nr-of-ones input)(_nr-of-ones input 0 #f))
+
+
+(define (main)
+ (define line (read-line))
+ (if (not (eof-object? line))
+ (begin
+ (display (nr-of-ones line))(newline)
+ (main)
+ )
+ )
+)
+
+(main)
diff --git a/challenge-126/abigail/t/ctest.ini b/challenge-126/abigail/t/ctest.ini
index 84c6227ab4..dd16bcecfe 100644
--- a/challenge-126/abigail/t/ctest.ini
+++ b/challenge-126/abigail/t/ctest.ini
@@ -7,3 +7,6 @@
1-1 = Given Examples
1-2 = Other Examples
2-1 = Given Example
+
+[1-1,1-2/bc]
+add_to_input = 0
diff --git a/challenge-126/abigail/tcl/ch-1.tcl b/challenge-126/abigail/tcl/ch-1.tcl
new file mode 100644
index 0000000000..664cf75b90
--- /dev/null
+++ b/challenge-126/abigail/tcl/ch-1.tcl
@@ -0,0 +1,23 @@
+#
+# See ../README.md
+#
+
+#
+# Run as: tclsh ch-1.tcl < input-file
+#
+
+while {[gets stdin line] >= 0} {
+ set result 0
+ set seen_one 0
+ foreach char [split $line ""] {
+ set result [expr 9 * $result]
+ if {$seen_one == 1} {
+ set result [expr $result + 8]
+ } elseif {$char == 1} {
+ set seen_one 1
+ } elseif {$char > 0} {
+ set result [expr $result + $char - 1]
+ }
+ }
+ puts $result
+}
diff --git a/challenge-132/abigail/README.md b/challenge-132/abigail/README.md
index 5eef101325..00f4ac117d 100644
--- a/challenge-132/abigail/README.md
+++ b/challenge-132/abigail/README.md
@@ -5,11 +5,13 @@
* [AWK](awk/ch-1.awk)
* [Bash](bash/ch-1.sh)
* [C](c/ch-1.c)
+* [Go](go/ch-1.go)
* [Lua](lua/ch-1.lua)
* [Node.js](node/ch-1.js)
* [Perl](perl/ch-1.pl)
* [Python](python/ch-1.py)
* [Ruby](ruby/ch-1.rb)
+* [Tcl](tcl/ch-1.tcl)
## Part 2
diff --git a/challenge-132/abigail/go/ch-1.go b/challenge-132/abigail/go/ch-1.go
new file mode 100644
index 0000000000..648a8ff8fa
--- /dev/null
+++ b/challenge-132/abigail/go/ch-1.go
@@ -0,0 +1,41 @@
+package main
+
+//
+// See ../README.md
+//
+
+//
+// Run as: go run ch-1.go
+//
+
+import (
+ "fmt"
+)
+
+func g2j (Y int, M int, D int) int {
+ return ((1461 * (Y + 4800 + (M - 14) / 12)) / 4 +
+ (367 * (M - 2 - 12 * ((M - 14) / 12))) / 12 -
+ (3 * ((Y + 4900 + (M - 14) / 12) / 100)) / 4 + D - 32075)
+}
+
+func j2g (J int) (int, int, int) {
+ e := 4 * (J + 1401 + (((4 * J + 274277) / 146097) * 3) / 4 - 38) + 3
+ D := ((5 * ((e % 1461) / 4) + 2) % 153) / 5 + 1
+ M := (((5 * ((e % 1461) / 4) + 2) / 153 + 2) % 12) + 1
+ Y := (e / 1461) - 4716 + (12 + 2 - M) / 12
+ return Y, M, D
+}
+
+func main () {
+ julian_today := g2j (2021, 9, 22)
+ var Y, M, D int
+ for n, err := fmt . Scanf ("%d/%d/%d", &Y, &M, &D); n == 3 && err == nil
+ n, err = fmt . Scanf ("%d/%d/%d", &Y, &M, &D) {
+ julian_then := g2j (Y, M, D)
+ Y1, M1, D1 := j2g (2 * julian_then - julian_today)
+ Y2, M2, D2 := j2g (2 * julian_today - julian_then)
+ fmt . Printf ("%04d/%02d/%02d, %04d/%02d/%02d\n",
+ Y1, M1, D1, Y2, M2, D2);
+
+ }
+}
diff --git a/challenge-132/abigail/tcl/ch-1.tcl b/challenge-132/abigail/tcl/ch-1.tcl
new file mode 100644
index 0000000000..f2a49a8977
--- /dev/null
+++ b/challenge-132/abigail/tcl/ch-1.tcl
@@ -0,0 +1,55 @@
+#
+# See ../README.md
+#
+
+#
+# Run as: tclsh ch-1.tcl < input-file
+#
+
+proc idiv {a b} {
+ set sign 1
+ if {$a < 0} {
+ set sign [expr $sign * -1]
+ set a [expr -$a]
+ }
+ if {$b < 0} {
+ set sign [expr $sign * -1]
+ set b [expr -$b]
+ }
+ return [expr $sign * ($a / $b)]
+}
+
+proc g2j {Y M D} {
+ set M14 [expr $M - 14]
+ set M12 [idiv $M14 12]
+ set e1 [idiv [expr 1461 * ($Y + 4800 + $M12)] 4]
+ set e2 [idiv [expr 367 * ($M - 2 - 12 * $M12)] 12]
+ set e3 [idiv [expr $Y + 4900 + $M12] 100]
+ set e4 [idiv [expr 3 * $e3] 4]
+ return [expr $e1 + $e2 - $e4 + $D - 32075]
+}
+
+proc j2g {J} {
+ set e [expr 4 * ($J + 1401 + (((4 * $J + 274277) / 146097) * 3) / 4 \
+ - 38) + 3]
+ set D [expr ((5 * (($e % 1461) / 4) + 2) % 153) / 5 + 1]
+ set M [expr (((5 * (($e % 1461) / 4) + 2) / 153 + 2) % 12) + 1]
+ set Y [expr ($e / 1461) - 4716 + (12 + 2 - $M) / 12]
+ return "$Y $M $D"
+}
+
+set julian_today [g2j 2021 9 22]
+
+while {[gets stdin line] >= 0} {
+ lassign [split $line "/"] year month date
+ if {[string index $month 0] eq "0"} {
+ set month [string index $month 1]
+ }
+ if {[string index $date 0] eq "0"} {
+ set date [string index $date 1]
+ }
+ set julian_then [g2j $year $month $date]
+ lassign [j2g [expr 2 * $julian_then - $julian_today]] Y1 M1 D1
+ lassign [j2g [expr 2 * $julian_today - $julian_then]] Y2 M2 D2
+ puts [format "%04d/%02d/%02d, %04d/%02d/%02d" $Y1 $M1 $D1 $Y2 $M2 $D2]
+}