tenaglia@mis.mcw.edu (Chris Tenaglia - 257-8765) (02/28/90)
Icon is a great language for recreational programming as well. I recently read a Scientific American where someone described a program that takes a known text and scrambles it in a most bizaare fashion. The output is not unlike a Max Headroom monolog. Also they interfaced it with a rhyming engine to generate bizaare poetry. Well I thought it would be fun to try doing it in icon. Below is the scrambler. I guess I was lazy not to do the rhyming engine. It chooses subsequent words based on the likelyhood of them occuring after the current word. This icon program accomplishes that. I find it rather amusing what it does to my own documentation. Perhaps someone has a more clever method, or perhaps someone would want to post a rhyming engine? ##################### 80 lines follow ############################ # # # Poet.Icn 02/28/90 BY TENAGLIA # # # # THIS PROGRAM TAKES A DOCUMENT AND RE-OUTPUTS IT IN A CLEVERLY # # SCRAMBLED FASHION. IT USES THE NEXT TWO MOST LIKELY WORDS TO # # TO FOLLOW. USAGE : ICONX POET INPUT_FILE [OUTPUT_FILE] # # IF NO OUTPUT FILE IS SPECIFIED, THE GIBBERISH IS SENT TO TTY # # THE CONCEPT WAS FOUND IN A RECENT SCIENTIFIC AMERICAN AND ICON # # SEEMED TO OFFER THE BEST IMPLEMENTATION. # # # ################################################################## global vocab,index procedure main(param) source := param[1] | input("_Source:") target := param[2] | "tt:" (in := open(source)) | stop("Can't open ",source) (out := open(target,"w")) | stop("Can't open ",target) vocab:= [] index:= table([]) write("Loading vocabulary") while line := read(in) do { vocab |||:= parse(line,' ') writes(".") } close(in) write("\nindexing...\n") every i := 1 to *vocab-2 do index[vocab[i]] |||:= [i] index[vocab[-2]] |||:= [-2] # wrap end to front in order to index[vocab[-1]] |||:= [-1] # prevent stuck loop if last word chosen n := -1 ; &random := map(&clock,":","0") ; line := "" write("\n") every 1 to *vocab/2 do { (n > 1) | (n := ?(*vocab-2)) word := vocab[n] follows := vocab[(?(index[word]))+1] n := (?(index[follows])) + 1 if (*line + *word + *follows + 2) > 80 then { write(out,line) line := "" } line ||:= word || " " || follows || " " } write(out,line,".") close(out) end ################################################################## # # # THIS PROCEDURE PULLS ALL THE ELEMENTS (TOKENS) OUT OF A LINE # # BUFFER AND RETURNS THEM IN A LIST. A VARIABLE NAMED 'CHARS' # # CAN BE STATICALLY DEFINED HERE OR GLOBAL. IT IS A CSET THAT # # CONTAINS THE VALID CHARACTERS THAT CAN COMPOSE THE ELEMENTS # # ONE WISHES TO EXTRACT. # # # ################################################################## procedure parse(line,delims) static chars chars := &cset -- delims tokens := [] line ? while tab(upto(chars)) do put(tokens,tab(many(chars))) return tokens end ################################################################## # # # THIS PROCEDURE IS TERRIBLY HANDY IN PROMPTING AND GETTING # # AN INPUT STRING # # # ################################################################## procedure input(prompt) writes(prompt) return read() end Yours truly, Chris Tenaglia (System Manager) Medical College of Wisconsin 8701 W. Watertown Plank Rd. Milwaukee, WI 53226 (414)257-8765 tenaglia@mis.mcw.edu