|
|
1.1 root 1: # PARENS(1)
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: every 1 to limit do {
29: if \varying then k := 2 * ?bound else k := 2 * bound
30: string := ""
31: r := 0
32: while k ~= r do {
33: if r = 0 then string ||:= Open()
34: else if ?0 < probClose()
35: then string ||:= Close() else string ||:= Open()
36: }
37: while k > 0 do string ||:= Close()
38: write(string)
39: }
40: end
41:
42: procedure Open()
43: r +:= 1
44: k -:= 1
45: return lp
46: end
47:
48: procedure Close()
49: r -:= 1
50: k -:= 1
51: return rp
52: end
53:
54: procedure probClose()
55: return ((r * (r + k + 2)) / (2.0 * k * (r + 1)))
56: end
57:
58: procedure Usage()
59: stop("usage: parens [-n i -b i -l s -r s]")
60: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.