diff options
| -rw-r--r-- | challenge-126/abigail/README.md | 4 | ||||
| -rw-r--r-- | challenge-126/abigail/bc/ch-1.bc | 51 | ||||
| -rw-r--r-- | challenge-126/abigail/go/ch-1.go | 41 | ||||
| -rw-r--r-- | challenge-126/abigail/scheme/ch-1.scm | 44 | ||||
| -rw-r--r-- | challenge-126/abigail/t/ctest.ini | 3 | ||||
| -rw-r--r-- | challenge-126/abigail/tcl/ch-1.tcl | 23 | ||||
| -rw-r--r-- | challenge-132/abigail/README.md | 2 | ||||
| -rw-r--r-- | challenge-132/abigail/go/ch-1.go | 41 | ||||
| -rw-r--r-- | challenge-132/abigail/tcl/ch-1.tcl | 55 |
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] +} |
