Shape Recognizer

The Snobol4 reference manual now available online from University of Arizona. pdf

I can't remember what class had me writing Snobol but I'd already learned it on my own from a free short-course taught by Mike Shapiro.

Objects were to be identified as contiguous, two-dimensional spans of a single character. These were erased as found. The length of the last two lines determined the shape: increasing, decreasing or unchanged meant pyramid, ball, or block respectively.

This program read the following input that was provided by the instructor. Output was each shape, printed alone and appropriately classified.

  
   11                        555
    111                    5555555
     11111                555555555 
      1111111             555555555 
       111111111           5555555
        11111111111          555
         1111111111111
  
                         99 
      9999999999999     9999
      9999999999999     9999
      9999999999999    999999 
      9999999999999    999999 
                      99999999
                      99999999
                     9999999999 
  

I can remember struggling with the logic until I put the pattern matcher in "full scan" which turned off search optimizations. This is a sure sign that I was abusing the matcher.

* PATTERN RECOGNITION PROGRAM * HOWARD CUNNINGHAM 11/15/72 FULLSCAN = 1; TRIM = 1 OUTPUT('PRINT',2,'(/1X,135A1)') LINE = ARRAY(20) * DEFINITIONS TOP.LINE = SPAN(' ') ?L (LEN(1) $ C SPAN(*C)) . O ?R NEXT.LINE = ?L *LE(L,OR) SPAN(*C) . O ?R *GE(R,OL) * INPUT PICTURE INPUT OUTPUT = INPUT :F(TOP) LENGTH = LENGTH + 1 LINE<LENGTH> = OUTPUT :(INPUT) * LOCATE TOP OF OBJECT TOPN = 1; A = 0; PRINT = NEXT LINE<N> TOP.LINE = DUPL(' ',R) :S(SCAN) N = LT(N,LENGTH) N + 1 :S(NEXT) PRINT = 'ALL OBJECTS LOCATED' * SCAN TO BOTTOM OF OBJECT SCAN N = N + 1; A = A + R - L; K = OR - OL - R + L OR = R; OL = L; OUTPUT = DUPL(' ',L) O LINE<N> NEXT.LINE = DUPL(' ',R) :S(SCAN) * IDENTIFY KIND OF OBJECT L = 'PYRAMID'; L = EQ(K) 'BLOCK'; L = GT(K) 'BALL' PRINT = 'OBJECT IS ' L ' OF COLOR ' C ' AND SIZE ' + A ' CENTERED AT ' (OL + OR) / 2 :(TOP) END