|
|
1.1 root 1: # CROSS(6)
2: #
3: # Display intersection of words
4: #
5: # William P. Malloy
6: #
7: # Last modified 8/14/84
8: #
9:
10: global fast, place, array, csave, fsave, number
11:
12: procedure main()
13: local opt, words, letter, line
14: letter := &lcase ++ &ucase
15: words := []
16: while line := map(read()) do
17: if upto(~letter,line) then stop("input contains nonletter")
18: else put(words,line)
19: number := *words
20: kross(words)
21: end
22:
23: procedure kross(words)
24: local one, tst, t
25: array := [get(words)]
26: t := 0
27: while one := get(words) do {
28: tst := *words
29: if fit(one,array,0 | 1) then
30: t := 0
31: else {
32: t +:= 1
33: put(words,one)
34: if t > tst then
35: break
36: }
37: }
38: if *words = 0 then Print(array)
39: else write("cannot construct puzzle")
40: end
41:
42: procedure fit(word,matrix,where)
43: local i, j, k, l, one, test, t, s
44: s := *matrix
45: t := *matrix[1]
46: every k := gen(*word) do
47: every i := gen(s) do
48: every j := gen(t) do
49: if matrix[i][j] == word[k] then {
50: # test for vertical fit
51: if where = 0 then {
52: test := 0
53: every l := (i - k + 1) to (i + (*word - k)) do
54: if tstv(matrix,i,j,l,s,t) then {
55: test := 1
56: break
57: }
58: if test = 0 then
59: return putvert(matrix,word,i,j,k)
60: }
61: if where = 1 then {
62: test := 0
63: every l := (j - k + 1) to (j + (*word - k)) do
64: if tsth(matrix,i,j,l,s,t) then {
65: test := 1
66: break
67: }
68: if test = 0 then
69: return puthoriz(matrix,word,i,j,k)
70: }
71: }
72: end
73:
74: procedure tstv(matrix,i,j,l,s,t)
75: return ((matrix[(l ~= i) & (s >= l) & (0 < l)][0 < j-1] ~== " ") |
76: (matrix[(l ~= i) & (s >= l) & (0 < l)][t >= j + 1] ~== " ") |
77: (matrix[(i ~= l-1) & (s >= l-1) & (0 < l-1)][j] ~== " ") |
78: (matrix[(i ~= l + 1) & (s >= l+1) & (0 < l + 1)][j] ~== " ") |
79: (matrix[(l ~= i) & (s >= l) & (0 < l)][j] ~== " "))
80: end
81:
82: procedure tsth(matrix,i,j,l,s,t)
83: return ((matrix[0 < i-1][(l ~= j) & (t >= l) & (0 < l)] ~== " ") |
84: (matrix[s >= i + 1][(l ~= j) & (t >= l) & (0 < l)] ~== " ") |
85: (matrix[i][(j ~= l-1) & (t >= l-1) & (0 < l-1)] ~== " ") |
86: (matrix[i][(j ~= l + 1) & (t >= l + 1) & (0 < l + 1)] ~== " ") |
87: (matrix[i][(l ~= j) & (t >= l) & (0 < l)] ~== " "))
88: end
89:
90: procedure gen(i)
91: local tmp, up, down
92: tmp := i / 2
93: if (i % 2) = 1 then
94: tmp +:= 1
95: suspend tmp
96: up := tmp
97: down := tmp
98: while (up < i) do {
99: suspend up +:= 1
100: suspend (down > 1) & (down -:= 1)
101: }
102: end
103:
104: # put `word' in vertically at pos(i,j)
105:
106: procedure putvert(matrix,word,i,j,k)
107: local hdim, vdim, up, down, l, m, n
108: vdim := *matrix
109: hdim := *matrix[1]
110: up := 0
111: down := 0
112: up := abs(0 > (i - k))
113: down := abs(0 > ((vdim - i) - (*word - k)))
114: every m := 1 to up do
115: push(matrix,repl(" ",hdim))
116: i +:= up
117: every m := 1 to down do
118: put(matrix,repl(" ",hdim))
119: every l := 1 to *word do
120: matrix[i + l - k][j] := word[l]
121: return matrix
122: end
123:
124: # put `word' in horizontally at position i,j in matrix
125:
126: procedure puthoriz(matrix,word,i,j,k)
127: local hdim, vdim, left, right, l, m, n
128: vdim := *matrix
129: hdim := *matrix[1]
130: left := 0
131: right := 0
132: left := (abs(0 > (j - k))) | 0
133: right := (abs(0 > ((hdim - j) - (*word - k)))) | 0
134: every m := 1 to left do
135: every l := 1 to vdim do
136: matrix[l] := " " || matrix[l]
137: j +:= left
138: every m := 1 to right do
139: every l := 1 to vdim do
140: matrix[l] ||:= " "
141: every l := 1 to *word do
142: matrix[i][j + l - k] := word[l]
143: return matrix
144: end
145:
146: procedure Print(matrix)
147: local i
148: write("+",repl("-",*matrix[1]),"+")
149: every i := 1 to *matrix do
150: write("|",matrix[i],"|")
151: write("+",repl("-",*matrix[1]),"+")
152: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.