|
|
1.1 root 1: # PARENS
2: #
3: # Produce parenthesis-balanced strings
4: #
5: # Ralph E. Griswold
6: #
7: # Last modified 8/11/84
8: #
9:
10: global r, k, lp, rp
11:
12: procedure main(a)
13: local string, i, s, bound, limit, varying
14: bound := limit := 10 # default bound and limit
15: lp := "(" # default left paren
16: rp := ")" # default right paren
17: i := 0
18: while s := a[i +:= 1] do
19: if s[1] == "-" then
20: case s of {
21: "-b": bound := integer(a[i +:= 1]) | Usage() # bound
22: "-n": limit := integer(a[i +:= 1]) | Usage() # total number
23: "-l": lp := a[i +:= 1] | Usage() # left paren
24: "-r": rp := a[i +:= 1] | Usage() # right paren
25: "-v": varying := 1 # varying length
26: default: Usage()
27: }
28: else Usage()
29: every 1 to limit do {
30: if \varying then k := 2 * ?bound else k := 2 * bound
31: string := ""
32: r := 0
33: while k ~= r do {
34: if r = 0 then string ||:= Open()
35: else if ?0 < probClose()
36: then string ||:= Close() else string ||:= Open()
37: }
38: while k > 0 do string ||:= Close()
39: write(string)
40: }
41: end
42:
43: procedure Open()
44: r +:= 1
45: k -:= 1
46: return lp
47: end
48:
49: procedure Close()
50: r -:= 1
51: k -:= 1
52: return rp
53: end
54:
55: procedure probClose()
56: return ((r * (r + k + 2)) / (2.0 * k * (r + 1)))
57: end
58:
59: procedure Usage()
60: stop("usage: parens [-v -n i -b i -l s -r s]")
61: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.