victor@cs.vu.nl (L. Victor Allis) (01/03/88)
The one thing which struck me seeing all those self-replicating programs was the way they looked: UGLY. Every program needed apart from the standard idea, some tricks to solve the quotemarkproblem and most of them involved counting the number of characters in the program. Therefore I tried to write a Father program which will produce a selfreplicating Son, without dirty tricks. I must admit that I did not have to solve the quotemark problem, since I used the ord() and chr() functions. This method works on all machines as long as the Father program and the resulting Son work on the same machine. Furthermore I did not try to get a very short selfreplicater or Father. Clarity was the main goal, and I think I succeeded. (Notice that all programs have a nice layout). To test it, feed the following program as input to itself. The output is a selfreplicating program (which does not get input). As you will see, the Father and Son are much alike, while the Grandson will be identical to the Son. -------------------------- program Reproduce(input, output); const StartLines = 10; StopLines = 27; Maximum = 80; var Start : array[1..StartLines, 1..Maximum] of char; Stop : array[1..StopLines, 1..Maximum] of char; StartLength : array[1..StartLines] of integer; StopLength : array[1..StopLines] of integer; i, j : integer; begin for i := 1 to StartLines do begin j := 0; while not eoln do begin j := j + 1; read(Start[i, j]) end; StartLength[i] := j; readln end; for i := 1 to 23 do readln; for i := 1 to StopLines do begin j := 0; while not eoln do begin j := j + 1; read(Stop[i, j]) end; StopLength[i] := j; readln end; for i := 1 to StartLines do begin for j := 1 to StartLength[i] do write(Start[i, j]); writeln end; for i := 1 to StartLines do begin for j := 1 to StartLength[i] do writeln(' Start[', i:1, ', ', j:1, '] := chr(', ord(Start[i, j]):1, ');'); writeln(' StartLength[', i:1, '] := ', StartLength[i]:1, ';') end; for i := 1 to StopLines do begin for j := 1 to StopLength[i] do writeln(' Stop[', i:1, ', ', j:1, '] := chr(', ord(Stop[i, j]):1, ');'); writeln(' StopLength[', i:1, '] := ', StopLength[i]:1, ';') end; for i := 1 to StopLines do begin for j := 1 to StopLength[i] do write(Stop[i, j]); writeln end end. -------------------------- Victor Allis. Vrije Universiteit van Amsterdam. The Netherlands.