summaryrefslogtreecommitdiff
path: root/ipl/progs/scramble.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/progs/scramble.icn')
-rw-r--r--ipl/progs/scramble.icn93
1 files changed, 93 insertions, 0 deletions
diff --git a/ipl/progs/scramble.icn b/ipl/progs/scramble.icn
new file mode 100644
index 0000000..2dc4791
--- /dev/null
+++ b/ipl/progs/scramble.icn
@@ -0,0 +1,93 @@
+############################################################################
+#
+# 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