The program OSTRC is the first program that
Peter Struycken used to create art works.
The program was written in Algol 60 by Drs Stan Tempelaars while working at
the Institute
of Sonology. The program can be found in the exhibition catalogue
P. Struycken komputerstrukturen.
('Komputerstrukturen' is Dutch for computer structures). A transcript of the
program is:
0
1 BEGIN COMMENT INSTITUUT VOOR SONOLGOIE
2 PLOMPETORENGRACHT 14,UTRECHT
3 VISUELE STRUKTUREN 3;
4 INTEGER I,K,N,P,BR,H,R,S,Y,NR,REGEL,L,BRMAX;
5 REAL START;
6 BOOLEAN C;
7 INTEGER ARRAY X/1:100/;
8 BOOLEAN ARRAY BETA/0:40,1:4/;
9 SWITCH SWM:= MAIN1,MAIN2,M3,M4,M5,M6,M7,M8,MAIN9;
10 FOR K:= 0 STEP 1 UNTIL 10,15 STEP 1 UNTIL 20,27 STEP 1 UNTIL 30,35 STEP 1 UNTIL 39
11 DO FOR N:= 1,2,3,4 DO BETA/K,N/:= FALSE;
12 BETA/11,1/:= TRUE: BETA/11,2/:= BETA/11,3/:= BETA/11,4/:= FALSE;
13 BETA/21,1/:= BETA/21,2/:= TRUE: BETA/21,3/:= BETA/21,4/:= FALSE;
14 BETA/31,1/:= BETA/31,2/:= BETA/31,3/:= TRUE; BETA/31,4/:= FALSE;
15 FOR K:= 11,12,13,21,22,23,31,32,33 DO
16 FOR N:= 1,2,3,4 DO BETA/K+1,IF N=4 THEN 1 ELSE N+1/:= BETA/K,N/;
17 BETA/25,1/:= BETA/25,3/:= TRUE; BETA/25,2/:= BETA/25,4/:= FALSE;
18 BETA/26,2/:= BETA/26,4/:= TRUE; BETA/26,1/:= BETA/26,3/:= FALSE;
19 FOR N:= 1,2,3,4 DO BETA/40,N/:= TRUE;
20 MAIN0: M3:M4:M5:M6:M7:M8:
21 Y:= READ; IF Y>2^Y<9 THEN GOTO BB ELSE GOTO SWM/Y/;
22 MAIN1: NEW PAGE;
23 PRINTTEXT(<INSTITUUT VOOR SONOLOGIE>);NLCR;
24 PRINTTEXT(<PLOMPETORENGRACHT 14-16, UTRECHT>);NLCR;
25 PRINTTEXT(<VISUELE STRUKTUREN 3>);NLCR;NLCR;NLCR;
26 PRINTTEXT(<COMMENT :>);
27 AA: Y:= RESYM; IF Y=87 THEN BEGIN NLCR;NLCR; GOTO MAINNO END
28 PRSYM(Y); GOTO AA;
29
30 MAIN2: L:= READ; BRMAX:= READ; C:= TRUE; GOTO EE;
31 BB: C:= FALSE;
32 EE: BEGIN BOOLEAN ARRAY B/0:2*L+1,0:2*BRMAX+1/;
33 SWITCH SWSM:= M1,M2,MAIN3,MAIN4,MAIN5,MAIN6,MAIN7,MAIN8;
34 REGEL:= 0;
35 FOR K:= 0 STEP 1 UNTIL 2*BRMAX+1 DO B/0,K/:= B/2*L+1,K/:=FALSE;
36 FOR K:= 0 STEP 1 UNTIL 2*L+1 DO B/K,0/:= B/K,2*BRMAX+1/:=FALSE;
37 MAIN20: M1:M2: IF C THEN Y:= READ ELSE C:= TRUE; GOTO SWSM/Y/ ;
38 MAIN3: START:= READ; SETRANDOM(START); GOTO MAIN20;
39 MAIN4: BR:= READ; GOTO MAIN20;
40 MAIN5: H:= READ; GOTO MAIN20;
41 MAIN6: I:= READ;
42 FOR K:= 1 STEP 1 UNTIL I DO X/K/:= READ; GOTO MAIN20;
43 MAIN7: P:= 0;
44 CC: R:= ENTIER(I*RANDOM+1);
45 P:= P+1; S:= ENTIER((P-1)/BR);
46 IF S=H THEN BEGIN REGEL:= REGEL+S; GOTO DD END;
47 B/2*(REGELS+S)+1,2*(P-BR*S)-1/:= BETA/X/R/,1/: B/2*(REGELS+S)+1,2*(P-BR*S)/:= BETA/X/R/,2/;
48 B/2*(REGELS+S)+2,2*(P-BR*S)/: = BETA/X/R/,3/; B/2*(REGELS+S)+2,2*(P-BR*S)-1/:= BETA/X/R/,4/;
49 GOTO CC;
50 DD: FOR K:= 2*(REGEL-H)+1 STEP 1 UNTIL 2*REGEL DO
51 FOR N:= 2*BR+1 STEP 1 UNTIL 2*BRMAX DO B/K,N/:= FALSE;
52 GOTO MAIN20;
53 MAIN8: NLCR;NLCR;NLCR; NR:= 0';
54 FOR I:= 0 STEP 1 UNTIL 2*L DO
55 BEGIN NLCR; NR:= NR+1; ABSFIXT(4,0,NR); SPACE(4);
56 FOR K:= 1 STEP 1 UNTIL 2*BRMAX+1 DO
57 BEGIN IF (B/I,K/^-B/I,K-1/)^(-B/I,K/^B/I,K-1/)
58 THEN BEGIN PRSYM(12/);PRSYM(93)END ELSE PRSYM(93);
59 IF (B/I+1,K/^-B/I,K)v(-B/I+1,K/^B/I,K)
60 THEN BEGIN PRSYM(126); IF B/I,K/ THEN PRSYM(66) ELSE PRSYM(93) END
61 ELSE IF B/I,K/ THEN PRSYM(66) ELSE PRSYM (93)
62 END
63 END
64 END;
65 GOTO MAIN0;
66 MAIN9:
67 END
68
From analyzing the program, one can find out that that the program reacts on
commands it reads from the input. (The program was developed in a time when
compiling a program was still expensive compared to executing the program. It
was in a time that RAM usage was charged in Kilo bytes by the second.) Each
command starts with a number from 1 to 9 (including) and is optionally followed
by some arguments.
The commands are (with their function described behind the dash):
- 1 comment - the remainder of the line is printed on
the output file
- 2 nr-lines nr-columns - defines the size of the pattern
to be generated.
- 3 random-seed - seed to be used for initializing the
pseudo random function.
- 4 columns-to-fill - defined the number of columns to
be filled by fill command.
- 5 lines-to-fill - defined the number of lines to be
filled by fill command.
- 6 n x1 ... xn - define the
specific patterns to be used to fill the area. n
cannot be larger than 100. The chance a pattern is selected
is determined by the frequency it occurs, because the
fill algorithm selects value from this array with a uniform
distibution. Valid values for patterns are: 0, 11, 12, 13, 14,
21, 22, 23, 24, 25, 26, 31, 32, 33, 34, and 40.
- 7 - execute the fill command according to specified parameters.
- 8 - print the created pattern to the output file.
- 9 - exit the program.
The program has been reimplemented in JavaScript and included in this page. Because information about the
pseudo-random generator used by this version of Algol60, could not be found,
the standard random generator of JavaScript is used. This random generator does
not allow you to set the random see. So, the input from the random-seed command
is ignored. This also means that the output will be different everytime the
program is executed, resulting in another output that Struycken could have
selected for his work.
Output generated by program:
Below a black and white image of the output, rotated 90 degrees counter-clockwise,
like Struycken used it in his painting.
Example input for Komputerstrukturen 1
(based on analyses of work):
1 1
2 50 50
3 4545
4 25
5 4
6 5 0 0 11 11 21
7
5 1
6 9 0 0 0 11 11 21 21 21 21
7
5 3
6 5 0 11 11 21 21
7
5 1
6 2 11 21
7
6 12 11 11 11 11 11 21 21 21 21 21 31 34
7
5 3
6 9 11 11 11 21 21 21 21 31 31
7
5 4
6 5 11 21 21 31 31
7
5 2
6 2 21 31
7
5 3
6 8 21 21 21 31 31 31 40 40
7
5 2
6 6 21 31 31 31 40 40
5 1
6 2 31 40
7
8
9
|
Example input for Komputerstrukturen 1A
(based on analyses of work):
1 1A
2 50 50
3 4545
4 25
5 4
6 5 0 0 11 11 21
7
6 9 0 0 11 11 11 21 21 21 21
7
5 6
6 9 11 11 11 11 21 21 21 21 31
7
5 5
6 7 11 21 21 21 31 31 31
7
5 3
6 6 21 21 21 31 31 40
7
6 8 21 31 31 31 31 40 40 40
7
8
9
|
or:
1 1A
2 50 50
3 4545
4 25
5 4
6 19 0 0 0 0 0 0 0 0 11 11 11 11 11 11 11 21 21 21 21
7
5 4
6 14 0 0 0 11 11 11 11 11 21 21 21 21 21 21
7
5 6
6 9 11 11 11 11 21 21 21 21 31
7
5 5
6 15 11 11 21 21 21 21 21 21 31 31 31 31 31 31 31
7
5 3
6 16 21 21 21 21 21 21 21 21 31 31 31 31 31 40 40 40
7
5 3
6 17 21 21 31 31 31 31 31 31 31 31 40 40 40 40 40 40 40
7
8
9
|
At first sight, one would guess that both Komputerstrukturen 2
and Komputerstrukturen 2A are generated with:
1 2
2 50 50
3 4545
4 25
5 25
6 4 11 12 13 14
7
8
9
|
But closer analyses of the works, suggest something different. Note that
Komputerstrukturen 2 contains one element 23.
(It is unknown, whether this was on purpose or due to a copy error.)
Example input for Komputerstrukturen 2A (based on analyses of work):
1 2
2 50 50
3 4545
4 25
5 5
6 9 11 12 13 13 14 14 14 14 14
7
5 5
6 6 11 11 12 13 14 14
7
6 8 11 11 11 11 12 12 13 14
7
5 1
6 8 11 11 12 12 12 13 13 14
7
6 13 11 11 12 12 12 12 12 13 13 13 14 14 23
7
5 3
6 8 11 11 12 12 12 13 13 14
7
5 5
6 9 11 12 12 13 13 13 13 14 14
7
8
9
|
Example input for Komputerstrukturen 2A
(based on analyses of work):
1 2A
2 50 50
3 4545
4 25
5 5
6 9 11 12 13 13 14 14 14 14 14
7
6 6 11 11 12 13 14 14
7
6 8 11 11 11 11 12 12 13 14
7
6 18 11 11 11 11 11 12 12 12 12 12 12 12 13 13 13 13 14 14
7
6 7 11 12 13 13 13 14 14
7
8
9
|
Example input for Komputerstrukturen 3
(based on analyses of work):
1 3
2 50 50
3 4545
4 25
5 5
6 6 23 24 24 26 26 26
7
6 4 23 24 24 26
7
6 7 23 23 23 23 24 24 26
7
6 9 23 23 23 23 24 24 26 26 26
7
5 3
6 7 23 24 24 26 26 26 26
7
5 1
6 13 23 23 23 24 24 24 26 26 26 26 26 32 34
7
6 10 23 24 24 24 26 26 26 26 26 26
7
8
9
|
Example input for Komputerstrukturen 3A
(based on analyses of work):
1 3A
2 50 50
3 4545
4 25
5 1
6 11 14 23 24 24 24 24 26 26 26 26 26
7
5 4
6 7 23 24 24 26 26 26 26
7
5 5
6 7 23 23 24 24 24 26 26
7
6 6 23 23 23 24 24 26
7
6 6 23 23 23 24 24 26
7
5 3
6 4 23 24 26 26
7
5 1
6 13 23 23 23 23 24 24 24 24 26 26 26 26 34
7
6 9 23 24 24 24 26 26 26 26 26
7
8
9
|
Example input for Komputerstrukturen 4
based on table given on page 8 of P. Struycken from 1976:
1 4
2 50 50
3 4545
4 25
5 5
6 12 11 12 12 12 12 12 12 12 12 14 31 34
7
6 12 11 11 12 12 12 12 12 14 31 31 34 34
7
6 12 11 12 14 14 31 31 31 31 34 34 34 34
7
6 14 11 14 21 24 31 31 31 31 31 34 34 34 34 34
7
6 13 14 21 21 21 24 24 24 31 31 31 34 34 34
7
8
9
|
Example input based on
item AB15702:
1 4
2 50 50
3 4545
4 25
5 5
6 18 14 14 11 11 12 12 12 12 12 12 12 12 12 12 12 12 34 31
7
6 22 14 14 11 11 11 11 12 12 12 12 12 12 12 12 34 34 34 34 31 31 31 31
7
6 24 14 14 14 14 11 11 12 12 34 34 34 34 34 34 34 34 31 31 31 31 31 31 31 31
7
6 20 14 11 24 21 34 34 34 34 34 34 34 34 31 31 31 31 31 31 31 31
7
6 17 14 21 24 24 24 21 21 21 21 34 34 34 34 31 31 31 31
7
8
9
|
Example input for Komputerstrukturen 4A
based on table given on page 8 and 63 of P. Struycken from 1976:
1 4A
2 50 50
3 4545
4 25
5 5
6 13 11 11 11 11 11 11 11 11 14 14 13 33 34
7
6 13 11 11 11 11 13 13 14 14 33 33 34 34 34
7
6 12 11 11 13 13 14 33 33 33 34 34 34 34
7
6 14 14 24 23 33 33 33 33 33 33 34 34 34 34 34
7
6 13 13 23 23 23 24 24 24 33 33 33 34 34 34
7
8
9
|
But this input does not match the the reproduction of the computer print-out
that can be found on page 63 of Struycken from
1976 and that matches the work. It seems that the ninth column (of two by two
squares) was generated with a different rule, maybe to soften the transition
with the next set of five columns. The input might have looked like:
1 4A
2 50 50
3 4545
4 25
5 5
6 13 11 11 11 11 11 11 11 11 14 14 13 33 34
7
6 13 11 11 11 11 13 13 14 14 33 33 34 34 34
7
6 12 11 11 13 13 14 33 33 33 34 34 34 34
7
5 1
6 14 13 14 23 33 33 33 33 33 33 33 34 34 34 34
7
5 4
6 14 14 24 23 33 33 33 33 33 33 34 34 34 34 34
7
5 5
6 13 13 23 23 23 24 24 24 33 33 33 34 34 34
7
8
9
|
Home page