• ( Substring function in Python, Lisp) -- [Hijack] contains [hijk]

    From HenHanna@21:1/5 to All on Sat Feb 15 21:36:20 2025
    XPost: rec.puzzles, comp.lang.python

    The Substring function is a nice Programming puzzle.

    Why did I have to write it myself?

    Does it come standard in some library (package)
    in Python or (Gauche)Scheme?

    ________________

    A few weeks ago, i was curious to see What English words contained (
    abcd... ) consecutive letters of the alphabet.

    defrag defg
    defang defg
    defog defg

    hijack hijk

    ________________________________(Is there such a word containing 5
    letters? )



    Am i too Abced-minded ????

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Richard Tobin@21:1/5 to HenHanna@dev.null on Sun Feb 16 00:18:32 2025
    XPost: rec.puzzles, comp.lang.python

    In article <7513d4f4cf89bfd31edda3eb5ed84052@www.novabbs.com>,
    HenHanna <HenHanna@dev.null> wrote:

    A few weeks ago, i was curious to see What English words contained ( >abcd... ) consecutive letters of the alphabet.

    defrag defg
    defang defg
    defog defg

    hijack hijk

    ________________________________(Is there such a word containing 5
    letters? )

    $ awk 'BEGIN {for(i=97; i<=118; i++) printf("%c.*%c.*%c.*%c.*%c\n", i, i+1, i+2, i+3, i+4);}' | while read e; do grep -i $e /usr/share/dict/words; done

    -- Richard

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Lawrence D'Oliveiro@21:1/5 to HenHanna on Sat Feb 15 23:56:43 2025
    On Sat, 15 Feb 2025 21:36:20 +0000, HenHanna wrote:

    Does it come standard in some library (package) in Python or
    (Gauche)Scheme?

    In Python, strings are just sequences of Unicode code points. You can use
    slice notation on them, as you can with any other sequence type.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Madhu@21:1/5 to All on Sun Feb 16 06:26:38 2025
    Pro tip: sanitise replies to Hen Hannas posts with emacs with
    (replace-regexp "^>+[ \t]+" "> ")

    * HenHanna <7513d4f4cf89bfd31edda3eb5ed84052@www.novabbs.com> :
    Wrote on Sat, 15 Feb 2025 21:36:20 +0000:

    defrag defg
    defang defg
    defog defg

    hijack hijk

    ________________________________(Is there such a word containing 5
    letters? )

    Not in my /usr/share/dict/words.

    (defun intern-runs (word &optional hash-table)
    (let ((pos 0) (len 1) (pos-max 0) (len-max 1))
    (labels ((finish ()
    (when (and (> len 1)
    (>= len len-max))
    (setq pos-max pos len-max len)
    (when hash-table
    (pushnew word
    (gethash (subseq word pos-max (+ pos-max len-max))
    hash-table nil)
    :test #'equal)))))
    (loop for index from 0 for c across word
    for prev = nil then curr
    for curr = (char-code c)
    when prev do
    (cond ((= (1+ prev) curr) (incf len))
    (t (finish) (setq pos index len 1)))
    finally (finish))
    (unless (zerop len-max)
    (cons pos-max len-max)))))


    (intern-runs "hijacks")
    ;; => (0 . 3) - longest substr of length 3 at position 0

    (defvar $h (make-hash-table :test #'equal))

    (clrhash $h)
    (intern-runs "abcdxyz" $h)
    ;; inspect $h -> keys are substrings whose characters are consecutive
    ;; values are the strings of which the keys are substrings


    (clrhash $h)
    (defvar $a (slurp-lines "/usr/share/dict/words"))
    (length $a)
    ;; => 234937
    (time (map nil (lambda (w) (intern-runs w $h)) $a))
    ;; terrible performance
    (hash-table-count $h)
    ;; => 37

    there are 37 "runs" i.e. substrings of words which are consecutive
    chars.

    (apply #'max (mapcar 'length (hash-keys $h))) ; 4
    ;; maxiumum length is 4.

    (remove-if-not (lambda (x) (= (length x) 4)) (hash-keys $h))
    ;; => ("rstu" "mnop")

    ;; largest strings are "rstu" and "mnop"
    (gethash "rstu" $h)
    ("understuffing" "understuff" "understudy" "superstuff" "overstuff" "overstudy"
    "overstudiousness" "overstudiously" "overstudious" "overstudied" "overstud"
    "afterstudy")


    ;; how many words are threre for each "run"
    (let (ret)
    (maphash (lambda (k v)
    (push (cons k (length v)) ret))
    $h)
    (sort ret #'> :key #'cdr))

    (("st" . 20497) ("de" . 12816) ("no" . 10914) ("op" . 10215) ("hi" . 9962)
    ("ab" . 8882) ("tu" . 4052) ("rs" . 3286) ("ef" . 1861) ("gh" . 1619)
    ("lm" . 959) ("kl" . 753) ("nop" . 737) ("mn" . 598) ("xy" . 574)
    ("stu" . 487) ("def" . 400) ("rst" . 340) ("uv" . 255) ("bc" . 206)
    ("yz" . 135) ("mno" . 134) ("ij" . 71) ("ghi" . 60) ("cd" . 20) ("mnop" . 19)
    ("rstu" . 12) ("fg" . 6) ("abc" . 4) ("cde" . 4) ("hij" . 2) ("fgh" . 2)
    ("pq" . 2) ("lmn" . 1) ("qr" . 1) ("efg" . 1) ("ijk" . 1))

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Paul Rubin@21:1/5 to Madhu on Sat Feb 15 23:30:58 2025
    Madhu <enometh@meer.net> writes:
    (intern-runs "hijacks")
    ;; => (0 . 3) - longest substr of length 3 at position 0

    I think that is not the question that was asked. Although OP used the
    term "substring", I think what was actually wanted is usually called a subsequence, i.e. the characters in it don't have to be consecutive. So "hijacks" has HIJK which has length 4. "firefighting" and
    "prizefighting" both have EFGHI which has length 5.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Paul Rubin@21:1/5 to Paul Rubin on Sat Feb 15 23:38:26 2025
    Paul Rubin <no.email@nospam.invalid> writes:
    "firefighting" and "prizefighting" both have EFGHI which has length 5.

    Forgot, "absconded" has ABCDE, also length 5.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Paul Rubin@21:1/5 to Richard Tobin on Sat Feb 15 23:43:10 2025
    XPost: rec.puzzles, comp.lang.python

    richard@cogsci.ed.ac.uk (Richard Tobin) writes:
    $ awk 'BEGIN {for(i=97; i<=118; i++) printf("%c.*%c.*%c.*%c.*%c\n", i,
    i+1, i+2, i+3, i+4);}' | while read e; do grep -i $e
    /usr/share/dict/words; done

    Nice! That picked up "Kilimanjaro" which my more complicated Python
    script missed, because it didn't case-fold.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From HenHanna@21:1/5 to Paul Rubin on Sun Feb 16 13:37:11 2025
    XPost: rec.puzzles, comp.lang.python

    On Sun, 16 Feb 2025 7:43:10 +0000, Paul Rubin wrote:

    richard@cogsci.ed.ac.uk (Richard Tobin) writes:
    $ awk 'BEGIN {for(i=97; i<=118; i++) printf("%c.*%c.*%c.*%c.*%c\n", i,
    i+1, i+2, i+3, i+4);}' | while read e; do grep -i $e
    /usr/share/dict/words; done

    Nice! That picked up "Kilimanjaro" which my more complicated Python
    script missed, because it didn't case-fold.


    ___________How about alphabetically backwards?


    eponym ponm

    gifted gfed


    __________ short Python program for Subseq (with & without using
    RE) ?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Madhu@21:1/5 to All on Sun Feb 16 21:13:20 2025
    * Paul Rubin <874j0ucpn1.fsf@nightsong.com> :
    Wrote on Sat, 15 Feb 2025 23:30:58 -0800:

    Madhu <enometh@meer.net> writes:
    (intern-runs "hijacks")
    ;; => (0 . 3) - longest substr of length 3 at position 0

    I think that is not the question that was asked.

    oops.

    Although OP used the
    term "substring", I think what was actually wanted is usually called a subsequence, i.e. the characters in it don't have to be consecutive. So "hijacks" has HIJK which has length 4. "firefighting" and
    "prizefighting" both have EFGHI which has length 5.

    This becomes the Longest Increasing Subsequence Problem

    https://en.wikipedia.org/wiki/Longest_increasing_subsequence

    There are several good writeups about this on the web and lecture notes,
    much better than the implementation I once cobbled up from the wiki

    In common lisp: https://kaygun.github.io/clean/2014-10-26-longest_increasing_subsequence.html https://kaygun.github.io/clean/2015-10-26-longest_increasing_subsequence_revisited.html

    Using a suitable implementaion in a stupid way:

    (defun lca (string)
    (map 'string 'code-char (lca::longest-inc-seq (map 'list 'char-code
    string))))

    and running it on to extract into a hashtable with the keys as lcas

    (hash-table-count $h2)
    ;; => 20437

    (gethash "abcde" $h2)
    ("oxylabracidae" "cerambycidae" "bambocciade" "amoebicide" "ambuscade"
    "absconded" "aborticide")


    (sort (mapcar (lambda (x) (cons (car x) (length (cdr x))))
    (group2 (hash-keys $h2) :test #'= :key #'length))
    #'< :key #'car)

    ;; "length of lca . number of words"
    ((2 . 241) (3 . 1596) (4 . 4833) (5 . 7024) (6 . 4961) (7 . 1545) (8 . 217)
    (9 . 19) (10 . 1))

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From HenHanna@21:1/5 to Madhu on Sun Feb 16 18:33:58 2025
    On Sun, 16 Feb 2025 15:43:20 +0000, Madhu wrote:


    * Paul Rubin <874j0ucpn1.fsf@nightsong.com> :
    Wrote on Sat, 15 Feb 2025 23:30:58 -0800:

    Madhu <enometh@meer.net> writes:
    (intern-runs "hijacks")
    ;; => (0 . 3) - longest substr of length 3 at position 0

    I think that is not the question that was asked.

    oops.

    Although OP used the
    term "substring", I think what was actually wanted is usually called a
    subsequence, i.e. the characters in it don't have to be consecutive. So
    "hijacks" has HIJK which has length 4. "firefighting" and
    "prizefighting" both have EFGHI which has length 5.

    This becomes the Longest Increasing Subsequence Problem

    https://en.wikipedia.org/wiki/Longest_increasing_subsequence

    There are several good writeups about this on the web and lecture notes,
    much better than the implementation I once cobbled up from the wiki

    In common lisp: https://kaygun.github.io/clean/2014-10-26-longest_increasing_subsequence.html https://kaygun.github.io/clean/2015-10-26-longest_increasing_subsequence_revisited.html

    Using a suitable implementaion in a stupid way:

    (defun lca (string)
    (map 'string 'code-char (lca::longest-inc-seq (map 'list 'char-code
    string))))

    and running it on to extract into a hashtable with the keys as lcas

    (hash-table-count $h2)
    ;; => 20437

    (gethash "abcde" $h2)
    ("oxylabracidae" "cerambycidae" "bambocciade" "amoebicide" "ambuscade"
    "absconded" "aborticide")


    (sort (mapcar (lambda (x) (cons (car x) (length (cdr x))))
    (group2 (hash-keys $h2) :test #'= :key #'length))
    #'< :key #'car)

    ;; "length of lca . number of words"
    ((2 . 241) (3 . 1596) (4 . 4833) (5 . 7024) (6 . 4961) (7 . 1545) (8 .
    217)
    (9 . 19) (10 . 1))



    ____________

    (9 . 19) (10 . 1))


    wow.... I'd love to know what these Longest words are!

    who is the (sole) Grand winner?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Richard Tobin@21:1/5 to no.email@nospam.invalid on Sun Feb 16 19:02:35 2025
    XPost: rec.puzzles, comp.lang.python

    In article <87v7tabai9.fsf@nightsong.com>,
    Paul Rubin <no.email@nospam.invalid> wrote:

    $ awk 'BEGIN {for(i=97; i<=118; i++) printf("%c.*%c.*%c.*%c.*%c\n", i,
    i+1, i+2, i+3, i+4);}' | while read e; do grep -i $e
    /usr/share/dict/words; done

    Nice! That picked up "Kilimanjaro" which my more complicated Python
    script missed, because it didn't case-fold.

    Or, closer to (my) home, "Kilmarnock".

    -- Richard

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Carl G.@21:1/5 to HenHanna on Sun Feb 16 11:44:16 2025
    XPost: rec.puzzles, comp.lang.python

    On 2/15/2025 1:36 PM, HenHanna wrote:
    The Substring function  is a nice Programming puzzle.

               Why did I have to write it myself?

                         Does it come standard in some library (package)
                           in Python or (Gauche)Scheme?

    ________________

    A few weeks ago,  i was curious to see What English words contained  ( abcd...  )  consecutive letters of the alphabet.

            defrag          defg
            defang          defg
            defog           defg

            hijack          hijk

    ________________________________(Is there such a word containing 5
    letters? )



                Am i  too Abced-minded ????

    The letters of my last name ("GINNOW") are in alphabetical order (but
    they are not all consecutive, just "NO"). Can you find any well-known
    names in which all of the letters are in alphabetical order (not
    necessarily consecutive)?

    My first name is "CARL". If I had been named "ABE", my first and last
    name together would have alphabetical letters. Can you find any
    well-known names in which the first and last name together is alphabetical?

    --
    Carl G.


    --
    This email has been checked for viruses by AVG antivirus software.
    www.avg.com

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Paul Rubin@21:1/5 to Madhu on Sun Feb 16 13:31:15 2025
    Madhu <enometh@meer.net> writes:
    This becomes the Longest Increasing Subsequence Problem

    Still not quite, the subsequence is supposed to be consecutive, not just increasing. Like "abcde" not "acegi".

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Madhu@21:1/5 to All on Mon Feb 17 12:21:53 2025
    * Paul Rubin <87bjv1vaos.fsf@nightsong.com> :
    Wrote on Sun, 16 Feb 2025 13:31:15 -0800:

    Madhu <enometh@meer.net> writes:
    This becomes the Longest Increasing Subsequence Problem

    Still not quite, the subsequence is supposed to be consecutive, not just increasing. Like "abcde" not "acegi".

    Hen's posts really bring out the my reading comprehension skills.

    "Longest Increasing Consecutive Subsequence Problem"

    Google finds plenty of code but I guess it is not of any research
    interest.

    FWIW My code is pretty clunky, somehow TIME SBCL says it conses 0 bytes
    when I run it on individual words without interning although when I'm explicitly manipulating plists and arrays.

    (defun intern-lics (word &optional hash-table dp)
    "Returns the longest increasing consective sequence (lics) of WORD.
    If DP is supplied it should be an array with fill-pointer with enough
    capacity to contain (LENGTH WORD) integers. If hash-table is supplied
    it should be an EQUAL hashtable with STRING keys and LIST values.
    WORD is pushed onto the list which is the hash-value of the lics.
    WORD is assumed consist of lowercase ASCII characters.
    Ignores subsequences of length 1."
    (let* ((n (length word))
    (map nil) ;; (getf map c) -> last index of c in word
    (dp ;; dp[i] = length of the lics that end at index i of word
    (cond (dp (setf (fill-pointer dp) n) dp)
    (t (make-array n))))
    (maximum -1) ;;the length of the lics
    (index -1) ;;index in word where where the lics ends
    )
    (loop for i from 0 for c across word
    for prev = (code-char (1- (char-code c)))
    ;; if prev is present in word before the ith index, then c
    ;; will add to the increasing subsequence which has prev.
    for prev-idx = (getf map prev)
    for newl = (if prev-idx
    (1+ (elt dp prev-idx))
    1)
    do
    (setf (elt dp i) newl)
    (setf (getf map c) i)
    (when (< maximum (elt dp i))
    (setq maximum (elt dp i))
    (setq index i)))
    (when (> maximum 2) ; otherwise not interesting
    (let ((subseq (map 'string 'code-char
    (reverse (loop for i downfrom (char-code (elt word index))
    repeat maximum
    collect i)))))
    (when hash-table
    (pushnew word (gethash subseq hash-table nil)
    :test #'equal))
    subseq))))


    (intern-lics "absconder") ;"abcde"
    (intern-lics "afterstudy") ; => "rstu"

    (time (loop repeat 10 do (intern-lics "absconder")))
    #||
    0.000 seconds of real time
    0.000074 seconds of total run time (0.000073 user, 0.000001 system)
    100.00% CPU
    148,248 processor cycles
    0 bytes consed
    ||#

    ;; 0 bytes? rly?

    (defvar $a(slurp-lines "/usr/share/dict/words"))
    (length $a)
    ;; => 234937
    (map-into $a 'string-downcase $a)
    (setq $a (delete-duplicates $a :test #'equalp))
    (length $a)
    ;; => 233615
    (defvar $h (make-hash-table :test #'equal))
    (clrhash $h)
    (setq $array (make-array 124 :fill-pointer t))
    (time (map nil (lambda (w) (intern-lics w $h $array)) $a))

    #||
    1.916 seconds of real time
    1.916782 seconds of total run time (1.916782 user, 0.000000 system)
    100.05% CPU
    4,047,899,870 processor cycles
    61,527,200 bytes consed
    ||#

    (hash-table-count $h)
    ;; => 44
    (setq $keys (sort (hash-keys $h) #'string<))
    (sort (group2 $keys :test #'equal :key #'length) #'< :key #'car)
    ((3 "xyz" "wxy" "uvw" "tuv" "stu" "rst" "qrs" "pqr" "opq" "nop" "mno" "lmn"
    "klm" "jkl" "ijk" "hij" "ghi" "fgh" "efg" "def" "cde" "bcd" "abc")
    (4 "stuv" "rstu" "qrst" "nopq" "mnop" "lmno" "klmn" "ijkl" "hijk" "fghi"
    "efgh" "defg" "cdef" "bcde" "abcd")
    (5 "rstuv" "lmnop" "klmno" "efghi" "defgh" "abcde"))


    (gethash "abcde" $h)
    ("oxylabracidae" "cerambycidae" "carbacidometer" "bambocciade" "amoebicide"
    "ambuscader" "ambuscade" "amblycephalidae" "abstractedness" "absconder"
    "abscondence" "abscondedly" "absconded" "aborticide" "abjectedness")

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Madhu@21:1/5 to All on Mon Feb 17 12:39:05 2025
    * HenHanna <507d06f8062ea2f4dc1b226979b23021@www.novabbs.com> :
    Wrote on Sun, 16 Feb 2025 18:33:58 +0000:
    On Sun, 16 Feb 2025 15:43:20 +0000, Madhu wrote:

    [Badly proofread, sorry. The letters "LCA" are meaningless in this
    context. it could be LIS (longest increasing subsequence)]

    Using a suitable implementaion in a stupid way:
    (defun lca (string)
    (map 'string 'code-char (lca::longest-inc-seq (map 'list 'char-code string))))

    and running it on to extract into a hashtable with the keys as lcas

    (hash-table-count $h2)
    ;; => 20437

    (gethash "abcde" $h2)
    ("oxylabracidae" "cerambycidae" "bambocciade" "amoebicide" "ambuscade" "absconded" "aborticide")


    (sort (mapcar (lambda (x) (cons (car x) (length (cdr x))))
    (group2 (hash-keys $h2) :test #'= :key #'length))
    #'< :key #'car)

    ;; "length of lca . number of words"
    ((2 . 241) (3 . 1596) (4 . 4833) (5 . 7024) (6 . 4961) (7 . 1545) (8 .
    217)
    (9 . 19) (10 . 1))
    ____________

    (9 . 19) (10 . 1))

    wow.... I'd love to know what these Longest words are!
    who is the (sole) Grand winner?

    This historgram was of just the keys, or the subsequences, not the
    words. The longest increasing subsequence was of length 10,
    "achilopsty" and the word was

    (gethash "achilopsty" $h2)
    ;; => ("tarsochiloplasty"), T

    #||
    lrwxrwxrwx 1 root root 4 Dec 28 2020 /usr/share/dict/words -> web2
    -rw-r--r-- 1 root root 2486824 Oct 21 2000 /usr/share/dict/web2
    ||#

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Paul Rubin@21:1/5 to Madhu on Sun Feb 16 23:44:22 2025
    Madhu <enometh@meer.net> writes:
    FWIW My code is pretty clunky, somehow TIME SBCL says it conses 0 bytes
    when I run it on individual words without interning although when I'm explicitly manipulating plists and arrays.

    Yikes. I did a Python version that conses a lot but is fairly concise,
    I thought. From the looks of things, your /usr/share/dict/words is
    larger than mine. Mine has about 100k entries and this code took about
    0.7 seconds on my laptop, not great, but obviously many optimizations
    are possible with the same basic approach:

    from collections import defaultdict

    def runlen(word:str) -> int:
    d = defaultdict(int)
    def pred(c): return chr(ord(c)-1) # unicode predecessor
    for c in word:
    d[c] = d[pred(c)] + 1
    return max((n,c) for c,n in d.items())

    def main():
    for w in open('/usr/share/dict/words'):
    n,c = runlen(w.strip())
    if n>=5: print(w.strip(),n,c)

    main()

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From HenHanna@21:1/5 to Madhu on Mon Feb 17 11:50:35 2025
    XPost: rec.puzzles, comp.lang.python

    On Mon, 17 Feb 2025 7:09:05 +0000, Madhu wrote:

    * HenHanna <507d06f8062ea2f4dc1b226979b23021@www.novabbs.com> :
    Wrote on Sun, 16 Feb 2025 18:33:58 +0000:
    On Sun, 16 Feb 2025 15:43:20 +0000, Madhu wrote:

    [Badly proofread, sorry. The letters "LCA" are meaningless in this
    context. it could be LIS (longest increasing subsequence)]

    Using a suitable implementaion in a stupid way:
    (defun lca (string)
    (map 'string 'code-char (lca::longest-inc-seq (map 'list 'char-code
    string))))

    and running it on to extract into a hashtable with the keys as lcas

    (hash-table-count $h2)
    ;; => 20437

    (gethash "abcde" $h2)
    ("oxylabracidae" "cerambycidae" "bambocciade" "amoebicide" "ambuscade"
    "absconded" "aborticide")


    (sort (mapcar (lambda (x) (cons (car x) (length (cdr x))))
    (group2 (hash-keys $h2) :test #'= :key #'length))
    #'< :key #'car)

    ;; "length of lca . number of words"
    ((2 . 241) (3 . 1596) (4 . 4833) (5 . 7024) (6 . 4961) (7 . 1545) (8 .
    217)
    (9 . 19) (10 . 1))
    ____________

    (9 . 19) (10 . 1))

    wow.... I'd love to know what these Longest words are!
    who is the (sole) Grand winner?

    This historgram was of just the keys, or the subsequences, not the
    words. The longest increasing subsequence was of length 10,
    "achilopsty" and the word was

    (gethash "achilopsty" $h2)
    ;; => ("tarsochiloplasty"), T

    #||
    lrwxrwxrwx 1 root root 4 Dec 28 2020 /usr/share/dict/words -> web2 -rw-r--r-- 1 root root 2486824 Oct 21 2000 /usr/share/dict/web2
    ||#

    ______________

    tarsochiloplasty

    thank you... that word is in the dictionary I'm using.

    This looks good too: abdominoplasty


    whch contains abd in opsty
    ach il opsty


    abdominoplasty -- is shorter and its meaning is kinda obvious!

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)