#! /usr/bin/gawk -f # Last edited on 1999-07-21 06:33:37 by stolfi # Converts a folio permutation string to a nested parenthesis sequence. BEGIN { abort = -1; up = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; dn = "abcdefghijklmnopqrstuvwxyz"; split("", flip); # "flip[c]" flips the case of letter "c" for (i=1; i<=26; i++) { a = substr(up,i,1); b = substr(dn,i,1); flip[a] = b; flip[b] = a; } } (abort >= 0) { exit abort; } /^ *$/{print; next;} /^[#]/{print; next;} /./ { print; for(k=1; k<=NF; k++) { if (k > 1) { printf " "; } printf "%s", paren_from_perm($(k)); } printf "\n"; } function paren_from_perm(p, paren,seen,n,i,pi,res) { split("", paren); # "paren[c]" is the parenthesis associated to "c" split("", seen); res = ""; n = length(p); for (i=1; i<=n; i++) { pi = substr(p,i,1); if (pi in seen) { error("not permutation"); } if (! (pi in flip)) { error("bad letter"); } if (! (pi in paren)) { paren[pi] = "("; paren[flip[pi]] = ")"; } res = (res paren[pi]); seen[pi] = 1; } return res; } function error(msg) { printf "line %d: %s\n", NR, msg > "/dev/stderr"; abort = 1; exit 1; }