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