diff options
| author | Abigail <abigail@abigail.freedom.nl> | 2022-01-25 13:09:57 +0100 |
|---|---|---|
| committer | Abigail <abigail@abigail.freedom.nl> | 2022-01-25 20:15:02 +0100 |
| commit | f6f8fa27a551ad1171389cc9ca8b5c9a0e39e025 (patch) | |
| tree | 0efe47175309676fddf55b2d071e939bed4462e7 | |
| parent | 71357563d9ac3439af7adbcfee0345271e144edf (diff) | |
| download | perlweeklychallenge-club-f6f8fa27a551ad1171389cc9ca8b5c9a0e39e025.tar.gz perlweeklychallenge-club-f6f8fa27a551ad1171389cc9ca8b5c9a0e39e025.tar.bz2 perlweeklychallenge-club-f6f8fa27a551ad1171389cc9ca8b5c9a0e39e025.zip | |
Week 149, part 1: More solutions
bc, C, Go, Java, Lua, Node.js, Pascal, Python, R, Ruby, Scheme, and Tcl.
| -rw-r--r-- | challenge-149/abigail/README.md | 16 | ||||
| -rw-r--r-- | challenge-149/abigail/bc/ch-1.bc | 68 | ||||
| -rw-r--r-- | challenge-149/abigail/c/ch-1.c | 111 | ||||
| -rw-r--r-- | challenge-149/abigail/go/ch-1.go | 69 | ||||
| -rw-r--r-- | challenge-149/abigail/java/ch-1.java | 58 | ||||
| -rw-r--r-- | challenge-149/abigail/lua/ch-1.lua | 49 | ||||
| -rw-r--r-- | challenge-149/abigail/node/ch-1.js | 48 | ||||
| -rw-r--r-- | challenge-149/abigail/pascal/ch-1.p | 78 | ||||
| -rw-r--r-- | challenge-149/abigail/python/ch-1.py | 45 | ||||
| -rw-r--r-- | challenge-149/abigail/r/ch-1.r | 59 | ||||
| -rw-r--r-- | challenge-149/abigail/ruby/ch-1.rb | 49 | ||||
| -rw-r--r-- | challenge-149/abigail/scheme/ch-1.scm | 43 | ||||
| -rw-r--r-- | challenge-149/abigail/t/ctest.ini | 5 | ||||
| -rw-r--r-- | challenge-149/abigail/tcl/ch-1.tcl | 46 |
14 files changed, 726 insertions, 18 deletions
diff --git a/challenge-149/abigail/README.md b/challenge-149/abigail/README.md index b24b6faa38..c6c703c150 100644 --- a/challenge-149/abigail/README.md +++ b/challenge-149/abigail/README.md @@ -4,35 +4,21 @@ * [AWK](awk/ch-1.awk) * [Bash](bash/ch-1.sh) -* [Basic](basic/ch-1.bas) * [Bc](bc/ch-1.bc) -* [Befunge-93](befunge-93/ch-1.bf93) * [C](c/ch-1.c) -* [Cobol](cobol/ch-1.cb) -* [Csh](csh/ch-1.csh) -* [Erlang](lua/ch-1.erl) -* [Forth](lua/ch-1.fs) -* [Fortran](fortran/ch-1.f90) * [Go](go/ch-1.go) * [Java](java/ch-1.java) * [Lua](lua/ch-1.lua) -* [m4](m4/ch-1.m4) -* [MMIX](mmix/ch-1.mms) * [Node.js](node/ch-1.js) -* [OCaml](ocaml/ch-1.ml) * [Pascal](pascal/ch-1.p) * [Perl](perl/ch-1.pl) -* [PHP](php/ch-1.php) -* [PostScript](postscript/ch-1.ps) * [Python](python/ch-1.py) * [R](r/ch-1.r) -* [Rexx](rexx/ch-1.rexx) * [Ruby](ruby/ch-1.rb) * [Scheme](scheme/ch-1.scm) -* [Sed](sed/ch-1.sed) -* [SQL](sql/ch-1.sql) * [Tcl](tcl/ch-1.tcl) + ## Part 2 * [AWK](awk/ch-2.awk) diff --git a/challenge-149/abigail/bc/ch-1.bc b/challenge-149/abigail/bc/ch-1.bc new file mode 100644 index 0000000000..85f46b7a03 --- /dev/null +++ b/challenge-149/abigail/bc/ch-1.bc @@ -0,0 +1,68 @@ +#!/usr/bin/bc + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 +# + +# +# Run as: bc ch-1.bc < input-file +# + +define digit_sum (n) { + auto sum + sum = 0 + while (n > 0) { + sum = sum + n % 10 + n = n / 10 + } + return (sum) +} + +f = 1 +g = 1 +fib [0] = 0 +fib [1] = 1 +fib_count = 2 + +define is_fib (n) { + auto t, min, max + while (g < n) { + t = g + g = f + g + f = t + fib [fib_count] = g + fib_count = fib_count + 1 + } + min = 0 + max = fib_count + while (min < max) { + mid = (min + max) / 2 + if (fib [mid] == n) { + return (1) + } + if (fib [mid] < n) { + min = mid + 1 + } else { + max = mid + } + } + return (0) +} + + +while (1) { + n = read () + if (n == 0) { + break + } + for (k = 0; n > 0; k ++) { + if (is_fib (digit_sum (k)) == 1) { + print k, " " + n = n - 1 + } + } + print " +" +} + +halt diff --git a/challenge-149/abigail/c/ch-1.c b/challenge-149/abigail/c/ch-1.c new file mode 100644 index 0000000000..5acb89bc23 --- /dev/null +++ b/challenge-149/abigail/c/ch-1.c @@ -0,0 +1,111 @@ +# include <stdlib.h> +# include <stdio.h> +# include <string.h> +# include <stdbool.h> + +/* + * See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 + */ + +/* + * Run as: cc -o ch-1.o ch-1.c; ./ch-1.o < input-file + */ + +# define BASE 10 +int digit_sum (long n) { + int out = 0; + while (n) { + out += n % BASE; + n /= BASE; + } + return (out); +} + +# define DEFAULT_FIB_CAB 100 +# define FIB_CAP_INC_PERC 50 + +typedef long fib_t; + +fib_t fib_prev, fib_last; +size_t fib_count; +size_t fib_cap; +fib_t * fib = NULL; + +bool is_fib (fib_t n) { + if (fib == NULL) { + fib_prev = 1; + fib_last = 1; + fib_count = 2; + fib_cap = DEFAULT_FIB_CAB; + if ((fib = (fib_t *) malloc (fib_cap * sizeof (fib_t))) == NULL) { + perror ("Malloc failed"); + exit (1); + } + fib [0] = 0; + fib [1] = 1; + } + + /* + * If n exceeds the maximum Fibonacci number so far, generate + * new numbers until we reach or exceed n. If we generate n, + * n is a Fibonacci number; if we exceed n, n is not. + */ + while (fib_last < n) { + fib_t t = fib_last; + fib_last += fib_prev; + fib_prev = t; + while (fib_count >= fib_cap) { + fib_cap += 1 + FIB_CAP_INC_PERC * fib_cap / 100; + if ((fib = (fib_t *) + realloc (fib, fib_cap * sizeof (fib_t))) == NULL) { + perror ("Ralloc failed"); + exit (1); + } + } + fib [fib_count ++] = fib_last; + if (fib_last == n) { + return (true); + } + if (fib_last > n) { + return (false); + } + } + + /* + * If n is less than the maximum Fibonaccie number generated so far, + * do a binary search. + */ + size_t min = 0; + size_t max = fib_count; + while (min < max) { + size_t mid = (min + max) / 2; + if (fib [mid] == n) { + return (true); + } + if (fib [mid] < n) { + min = mid + 1; + } + else { + max = mid; + } + } + return (false); +} + + + +int main (void) { + int n; + + while (scanf ("%d", &n) == 1) { + for (int k = 0; n > 0; k ++) { + if (is_fib (digit_sum (k))) { + printf ("%d ", k); + n --; + } + } + printf ("\n"); + } + + return (0); +} diff --git a/challenge-149/abigail/go/ch-1.go b/challenge-149/abigail/go/ch-1.go new file mode 100644 index 0000000000..e659623095 --- /dev/null +++ b/challenge-149/abigail/go/ch-1.go @@ -0,0 +1,69 @@ +package main + +// +// See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 +// + +// +// Run as: go run ch-1.go < input-file +// + +import ( + "fmt" +) + +func digit_sum (n int) int { + sum := 0 + base := 10 + for n > 0 { + sum += n % base + n /= base + } + return (sum) +} + +var fib_prev, fib_last int +var fib map [int] bool + +func fib_init () { + fib = make (map [int] bool) + fib_prev = 0 + fib_last = 1 + fib [fib_prev] = true + fib [fib_last] = true +} + + +func is_fib (n int) bool { + for fib_last < n { + t := fib_last + fib_last += fib_prev + fib_prev = t + fib [fib_last] = true + } + + _, ok := fib [n] + + return (ok) +} + + +func main () { + fib_init () + for { + var n int + + c, err := fmt . Scanf ("%d", &n) + if c != 1 || err != nil { + break + } + + for k := 0; n > 0; k ++ { + if is_fib (digit_sum (k)) { + fmt . Printf ("%d ", k) + n -= 1 + } + } + fmt . Printf ("\n") + } +} diff --git a/challenge-149/abigail/java/ch-1.java b/challenge-149/abigail/java/ch-1.java new file mode 100644 index 0000000000..feed6ae6ae --- /dev/null +++ b/challenge-149/abigail/java/ch-1.java @@ -0,0 +1,58 @@ +// +// See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 +// + +// +// Run as: ln ch-1.java ch1.java; javac ch1.java; java ch1 < input-file +// + +import java.util.*; +import java.util.Map; + +public class ch1 { + private static int digit_sum (int n) { + int sum = 0; + int base = 10; + while (n > 0) { + sum += n % base; + n = (int) Math . floor (n / base); + } + return (sum); + } + + private static int fib_prev = 0; + private static int fib_last = 1; + private static Map <Integer, Boolean> fib = + new Hashtable <Integer, Boolean> (); + + private static void fib_init () { + fib . put (fib_prev, true); + fib . put (fib_last, true); + } + + private static boolean is_fib (int n) { + while (fib_last < n) { + int t = fib_last; + fib_last += fib_prev; + fib_prev = t; + fib . put (fib_last, true); + } + return (fib . containsKey (n)); + } + + + public static void main (String [] args) { + fib_init (); + Scanner scanner = new Scanner (System . in); + while (scanner . hasNextInt ()) { + int n = scanner . nextInt (); + for (int k = 0; n > 0; k ++) { + if (is_fib (digit_sum (k))) { + System . out . printf ("%d ", k); + n --; + } + } + System . out . printf ("\n"); + } + } +} diff --git a/challenge-149/abigail/lua/ch-1.lua b/challenge-149/abigail/lua/ch-1.lua new file mode 100644 index 0000000000..ce9ef0ddb6 --- /dev/null +++ b/challenge-149/abigail/lua/ch-1.lua @@ -0,0 +1,49 @@ +#!/opt/local/bin/lua + +-- +-- See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 +-- + +-- +-- Run as: lua ch-2.lua < input-file +-- + +function digit_sum (number) + local sum = 0 + while number > 0 do + sum = sum + number % 10 + number = math . floor (number / 10) + end + return (sum) +end + +fib = {} +fib_prev = 0 +fib_last = 1 +fib [fib_prev] = 1 +fib [fib_last] = 1 + +function is_fib (n) + while fib_last < n do + local t = fib_last + fib_last = fib_last + fib_prev + fib_prev = t + fib [fib_last] = 1 + end + + return fib [n] +end + + +for n in io . lines () do + n = tonumber (n) + k = 0 + while n > 0 do + if is_fib (digit_sum (k)) then + io . write (k .. " ") + n = n - 1 + end + k = k + 1 + end + print ("") +end diff --git a/challenge-149/abigail/node/ch-1.js b/challenge-149/abigail/node/ch-1.js new file mode 100644 index 0000000000..a158744432 --- /dev/null +++ b/challenge-149/abigail/node/ch-1.js @@ -0,0 +1,48 @@ +#!/usr/local/bin/node + +// +// See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 +// + +// +// Run as: node ch-1.js < input-file +// + +function digit_sum (number) { + let sum = 0 + let base = 10 + while (number > 0) { + sum += number % base + number = Math . floor (number / base) + } + return sum +} + +let fib = {} +let fib_prev = 0 +let fib_last = 1 +fib [fib_prev] = true +fib [fib_last] = true + +function is_fib (n) { + while (fib_last < n) { + let t = fib_last + fib_last += fib_prev + fib_prev = t + fib [fib_last] = true + } + return (fib [n]) +} + + require ('readline') +. createInterface ({input: process . stdin}) +. on ('line', n => { + n = +n + for (let k = 0; n > 0; k ++) { + if (is_fib (digit_sum (k))) { + process . stdout . write (k . toString () + " ") + n -- + } + } + process . stdout . write ("\n") +}) diff --git a/challenge-149/abigail/pascal/ch-1.p b/challenge-149/abigail/pascal/ch-1.p new file mode 100644 index 0000000000..c97107e46a --- /dev/null +++ b/challenge-149/abigail/pascal/ch-1.p @@ -0,0 +1,78 @@ +Program ch1; + +(* *) +(* See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 *) +(* *) + +(* *) +(* Run as: fpc -och-1.out ch-1.p; ./ch-1.out < input-file *) +(* *) + +uses + fgl; + +type + fib_t = longint; + +var + n, k: integer; + fib_prev: fib_t; + fib_last: fib_t; + fib: specialize TFPGMap <fib_t, boolean>; + +function digit_sum (n: longint): integer; + const + base = 10; + + var + sum: integer; + + begin + sum := 0; + while n > 0 do begin + sum := sum + (n mod base); + n := n div base; + end; + digit_sum := sum; + end; + +procedure init_fib; + begin + fib := specialize TFPGMap <fib_t, boolean> . Create; + fib_prev := 0; + fib_last := 1; + fib . Add (fib_prev, true); + fib . Add (fib_last, true); + end; + +function is_fib (n: fib_t): boolean; + var + t: fib_t; + + begin + while fib_last < n do begin + t := fib_last; + fib_last := fib_prev + fib_last; + fib_prev := t; + + fib . Add (fib_last, true); + end; + + is_fib := fib . IndexOf (n) >= 0; + end; + +begin + init_fib; + while not eof do begin + readln (n); + k := 0; + while n > 0 do begin + if is_fib (digit_sum (k)) then begin + write (k, ' '); + dec (n); + end; + inc (k); + end; + writeln (''); + end; +end. diff --git a/challenge-149/abigail/python/ch-1.py b/challenge-149/abigail/python/ch-1.py new file mode 100644 index 0000000000..1a7f8d33ac --- /dev/null +++ b/challenge-149/abigail/python/ch-1.py @@ -0,0 +1,45 @@ +#!/usr/local/bin/python3 + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 +# + +# +# Run as: python ch-1.py < input-file +# + + +def digit_sum (number): + sum = 0 + base = 10 + while number > 0: + sum = sum + number % base + number = number // base + return sum + +fib = {} +fib_prev = 0 +fib_last = 1 +fib [fib_prev] = True; +fib [fib_last] = True; + +def is_fib (n): + global fib, fib_prev, fib_last + while fib_last < n: + t = fib_last + fib_last = fib_last + fib_prev + fib_prev = t + fib [fib_last] = True; + return n in fib + +import fileinput, sys + +for n in fileinput . input (): + n = int (n) + k = 0 + while n > 0: + if is_fib (digit_sum (k)): + sys . stdout . write (str (k) + " ") + n = n - 1 + k = k + 1 + print ("") diff --git a/challenge-149/abigail/r/ch-1.r b/challenge-149/abigail/r/ch-1.r new file mode 100644 index 0000000000..b624414048 --- /dev/null +++ b/challenge-149/abigail/r/ch-1.r @@ -0,0 +1,59 @@ +#!/usr/local/bin/Rscript + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 +# + +# +# Run as: Rscript ch-1.r < input-file +# + +suppressPackageStartupMessages ( + library (hash) +) + +digit_sum <- function (n) { + base <- 10 + sum <- 0 + while (n > 0) { + sum <- sum + n %% base + n <- n %/% base + } + return (sum) +} + +fib <- hash () +fib_prev <- 0 +fib_last <- 1 +.set (fib, fib_prev, TRUE) +.set (fib, fib_last, TRUE) + +is_fib <- function (n) { + while (fib_last < n) { + t <- fib_last + fib_last <- fib_last + fib_prev + fib_prev <- t + .set (fib, fib_last, TRUE) + } + + return (has.key (as.character (n), fib)) +} + +stdin <- file ('stdin', 'r') +repeat { + n <- readLines (stdin, n = 1) + if (length (n) == 0) { + break + } + n = as.integer (n) + + k <- 0 + while (n > 0) { + if (is_fib (digit_sum (k))) { + cat (k, "") + n <- n - 1 + } + k <- k + 1 + } + cat ("\n") +} diff --git a/challenge-149/abigail/ruby/ch-1.rb b/challenge-149/abigail/ruby/ch-1.rb new file mode 100644 index 0000000000..327e7bbef8 --- /dev/null +++ b/challenge-149/abigail/ruby/ch-1.rb @@ -0,0 +1,49 @@ +#!/usr/bin/ruby + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 +# + +# +# Run as: ruby ch-1.rb < input-file +# + +def digit_sum (number) + sum = 0 + base = 10 + while number > 0 do + sum += number % base + number /= base + end + return sum +end + +$fib = {} +$fib_prev = 0 +$fib_last = 1 +$fib[$fib_prev] = true +$fib[$fib_last] = true + +def is_fib (n) + while $fib_last < n do + t = $fib_last + $fib_last += $fib_prev + $fib_prev = t + $fib[$fib_last] = true + end + + return $fib[n] +end + +ARGF . each_line do |n| + n = n . to_i + k = 0 + while n > 0 do + if is_fib(digit_sum(k)) then + printf "%d ", k + n -= 1 + end + k += 1 + end + puts ("") +end diff --git a/challenge-149/abigail/scheme/ch-1.scm b/challenge-149/abigail/scheme/ch-1.scm new file mode 100644 index 0000000000..e356255706 --- /dev/null +++ b/challenge-149/abigail/scheme/ch-1.scm @@ -0,0 +1,43 @@ +#!/usr/local/bin/guile +!# + +;;; +;;; See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 +;;; + +;;; +;;; Run as: guile --no-auto-compile ch-1.scm < input-file +;;; + + +(use-modules (ice-9 rdelim)) +(use-modules (ice-9 format)) + +(define (digit_sum n) + (define base 10) + (if (= n 0) 0 (+ (modulo n base) (digit_sum (floor/ n base))))) + +(define (_is_fib n prev last) + (cond ((= n prev) #t) + ((< n prev) #f) + (else (_is_fib n last (+ last prev))))) + +(define (is_fib n) (_is_fib n 0 1)) + +(define (digit_fib k n) + (cond ((= n 0) #f) + ((is_fib (digit_sum k)) + (begin (format #t "~d " k) (digit_fib (+ k 1) (- n 1)))) + (else (digit_fib (+ k 1) n)))) + + +(define (main) + (define n (read-line)) + (define k 0) + (if (not (eof-object? n)) + (begin + (digit_fib 0 (string->number n)) + (newline) + (main)))) + +(main) diff --git a/challenge-149/abigail/t/ctest.ini b/challenge-149/abigail/t/ctest.ini index c8a2ad68d3..e737bb117f 100644 --- a/challenge-149/abigail/t/ctest.ini +++ b/challenge-149/abigail/t/ctest.ini @@ -13,7 +13,6 @@ [challenges/2/basic]
add_to_input = -1
-[challenges/2/bc]
+[1-1,1-2,2-1,2-2,2-3/bc]
add_to_input = 0
-
-
+env = BC_LINE_LENGTH=1000
diff --git a/challenge-149/abigail/tcl/ch-1.tcl b/challenge-149/abigail/tcl/ch-1.tcl new file mode 100644 index 0000000000..b0047ec4d6 --- /dev/null +++ b/challenge-149/abigail/tcl/ch-1.tcl @@ -0,0 +1,46 @@ +#!/usr/local/opt/tcl-tk/bin/tclsh + +# +# See https://theweeklychallenge.org/blog/perl-weekly-challenge-149 +# + +# +# Run as: tclsh ch-1.tcl < input-file +# + +proc digit_sum number { + set base 10 + set sum 0 + while {$number > 0} { + incr sum [expr $number % $base] + set number [expr int ($number / $base)] + } + return $sum +} + +set fib [dict create] +set fib_prev 0 +set fib_last 1 +dict set fib $fib_prev 1 +dict set fib $fib_last 1 + +proc is_fib n { + global fib fib_prev fib_last + while {$fib_last < $n} { + set t $fib_last + set fib_last [expr $fib_last + $fib_prev] + set fib_prev $t + dict set fib $fib_last 1 + } + return [dict exists $fib $n] +} + +while {[gets stdin n] >= 0} { + for {set k 0} {$n > 0} {incr k} { + if {[is_fib [digit_sum $k]]} { + puts -nonewline "${k} " + incr n -1 + } + } + puts "" +} |
