|
|
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.