-
Notifications
You must be signed in to change notification settings - Fork 0
/
fizzbuzz.lua
68 lines (48 loc) · 1.55 KB
/
fizzbuzz.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/env luax
--[[@@@
The Lua implementation of Fizzbuzz is based on a functional style,
using function compositions.
It computes the `"fizz"` and `"buzz"` parts and return them
if at least one of them is not `nil`{.lua}.
Otherwise it returns its argument unchanged.
```{ .dot render="{{dot}}" name=fizzbuzz-lua width=100% }
digraph {
n [label="n" shape=oval]
compute_fizz [label="\"fizz\"\nif n = 0 (mod 3)" shape=box]
compute_buzz [label="\"buzz\"\nif n = 0 (mod 5)" shape=box]
combine [label="combine" shape=box]
select [label="Choose\n\"fizz\", \"buzz\", \"fizzbuzz\"\nor n" shape=box]
fizz [label="\"fizz\" or nil" shape=oval]
buzz [label="\"buzz\" or nil" shape=oval]
fizzbuzz [label="\"fizz\", \"buzz\", \"fizzbuzz\"\nor nil" shape=oval]
fizzbuzz_n [label="\"fizz\", \"buzz\", \"fizzbuzz\"\nor n" shape=oval]
n -> compute_fizz -> fizz -> combine
n -> compute_buzz -> buzz -> combine
n -> select
combine -> fizzbuzz -> select
select -> fizzbuzz_n
{ rank=same; combine, fizzbuzz, select }
}
```
```{.lua include="fizzbuzz.lua" pattern="%-%-%s*fizzbuzz%s*{%s*(.-)%s*%-%-%s*}" format="%1"}
```
@@@]]
local F = require "F"
-- fizzbuzz {
local function div(d, s, n)
return n % d == 0 and s or nil
end
local fizz = F.partial(div, 3, "fizz")
local buzz = F.partial(div, 5, "buzz")
local function combine(a, b)
return a and (a..(b or "")) or b
end
local function fizzbuzz(n)
return combine(fizz(n), buzz(n)) or n
end
-- }
local n = tonumber(arg[1])
assert(n, tostring(arg[1])..": not a number")
F.range(n)
: map(fizzbuzz)
: foreachi(print)