Annotation of 43BSD/contrib/icon/src/cmd/cross.icn, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.