Skip to content

Commit 0c5b4cd

Browse files
authored
Add Zeckendorf in Awk (#5327)
1 parent f7be4b0 commit 0c5b4cd

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

archive/a/awk/zeckendorf.awk

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
function usage() {
2+
print "Usage: please input a non-negative integer"
3+
exit(1)
4+
}
5+
6+
function str_to_number(s) {
7+
return (s ~ /^\s*[+-]*[0-9]+\s*$/) ? s + 0 : "ERROR"
8+
}
9+
10+
function fibonacci_up_to(n, fibs, a, b, c, k) {
11+
a = 1
12+
b = 2
13+
for (k = 1; a <= n; k++) {
14+
fibs[k] = a
15+
c = a + b
16+
a = b
17+
b = c
18+
}
19+
}
20+
21+
function zeckendorf(n, zecks, i, k) {
22+
fibonacci_up_to(n, fibs)
23+
k = length(fibs)
24+
i = 1
25+
while (k > 0 && n > 0) {
26+
fib = fibs[k]
27+
if (fib <= n) {
28+
zecks[i++] = fib
29+
n -= fib
30+
k -= 2
31+
} else {
32+
k--
33+
}
34+
}
35+
}
36+
37+
function show_array(arr, idx, s) {
38+
s = ""
39+
for (idx in arr) {
40+
if (s) {
41+
s = s ", "
42+
}
43+
s = s arr[idx]
44+
}
45+
46+
print s
47+
}
48+
49+
BEGIN {
50+
if (ARGC < 2) {
51+
usage()
52+
}
53+
54+
n = str_to_number(ARGV[1])
55+
if (n == "ERROR" || n < 0) {
56+
usage()
57+
}
58+
59+
zeckendorf(n, zecks)
60+
show_array(zecks)
61+
}

0 commit comments

Comments
 (0)