aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbigail <abigail@abigail.freedom.nl>2022-01-25 13:09:57 +0100
committerAbigail <abigail@abigail.freedom.nl>2022-01-25 20:15:02 +0100
commitf6f8fa27a551ad1171389cc9ca8b5c9a0e39e025 (patch)
tree0efe47175309676fddf55b2d071e939bed4462e7
parent71357563d9ac3439af7adbcfee0345271e144edf (diff)
downloadperlweeklychallenge-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.md16
-rw-r--r--challenge-149/abigail/bc/ch-1.bc68
-rw-r--r--challenge-149/abigail/c/ch-1.c111
-rw-r--r--challenge-149/abigail/go/ch-1.go69
-rw-r--r--challenge-149/abigail/java/ch-1.java58
-rw-r--r--challenge-149/abigail/lua/ch-1.lua49
-rw-r--r--challenge-149/abigail/node/ch-1.js48
-rw-r--r--challenge-149/abigail/pascal/ch-1.p78
-rw-r--r--challenge-149/abigail/python/ch-1.py45
-rw-r--r--challenge-149/abigail/r/ch-1.r59
-rw-r--r--challenge-149/abigail/ruby/ch-1.rb49
-rw-r--r--challenge-149/abigail/scheme/ch-1.scm43
-rw-r--r--challenge-149/abigail/t/ctest.ini5
-rw-r--r--challenge-149/abigail/tcl/ch-1.tcl46
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 ""
+}