home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
progs
/
scramble.icn
< prev
next >
Wrap
Text File
|
2000-07-29
|
2KB
|
94 lines
############################################################################
#
# File: scramble.icn
#
# Subject: Program to scramble a document
#
# Author: Chris Tenaglia
#
# Date: June 14, 1994
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# 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.
#
# The concept was found in a recent Scientific American and Icon
# seemed to offer the best implementation.
#
############################################################################
#
# Links: random
#
############################################################################
link random
global vocab,index
procedure main()
local line, i, n, word, follows
vocab:= []
index:= table([])
while line := read() do
{
vocab |||:= parse(line,' ')
}
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 ;
randomize()
line := ""
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(line)
line := ""
}
line ||:= word || " " || follows || " "
}
write(line,".")
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)
local tokens
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