73 lines
1.4 KiB
Text
73 lines
1.4 KiB
Text
program Test;
|
|
{$IFDEF FPC}{$MODE DELPHI}{$ELSE}{$APPTYPE}{$ENDIF}
|
|
uses
|
|
sysutils;
|
|
const
|
|
cCHAR: array[0..1] of char = ('_','#');
|
|
type
|
|
TRow = array of byte;
|
|
|
|
function ConvertToRow(const s:string):tRow;
|
|
var
|
|
i : NativeInt;
|
|
Begin
|
|
i := length(s);
|
|
setlength(Result,length(s));
|
|
For i := i downto 0 do
|
|
result[i-1]:= ORD(s[i]=cChar[1]);
|
|
end;
|
|
|
|
function OutRow(const row:tRow):string;
|
|
//create output string
|
|
var
|
|
i: NativeInt;
|
|
Begin
|
|
i := length(row);
|
|
setlength(result,i);
|
|
For i := i downto 1 do
|
|
result[i]:= cChar[row[i-1]];
|
|
end;
|
|
|
|
procedure NextRow(row:pByteArray;MaxIdx:NativeInt);
|
|
//compute next row in place by the using a small storage for the
|
|
//2 values, that would otherwise be overridden
|
|
var
|
|
leftValue,Value: NativeInt;
|
|
i,trpCnt: NativeInt;
|
|
Begin
|
|
leftValue := 0;
|
|
trpCnt := row[0]+row[1];
|
|
|
|
i := 0;
|
|
while i < MaxIdx do
|
|
Begin
|
|
Value := row[i];
|
|
//the rule for survive : PopCnt == 2
|
|
row[i] := ORD(trpCnt= 2);
|
|
//reduce popcnt of element before
|
|
dec(trpCnt,leftValue);
|
|
//goto next element
|
|
inc(i);
|
|
leftValue := Value;
|
|
//increment popcnt by right element
|
|
inc(trpCnt,row[i+1]);
|
|
//move to next position in ring buffer
|
|
end;
|
|
row[MaxIdx] := ORD(trpCnt= 2);
|
|
end;
|
|
|
|
const
|
|
TestString: string=' ### ## # # # # # ';
|
|
var
|
|
s: string;
|
|
row:tRow;
|
|
i: NativeInt;
|
|
begin
|
|
s := Teststring;
|
|
row:= ConvertToRow(s);
|
|
For i := 0 to 9 do
|
|
Begin
|
|
writeln(OutRow(row));
|
|
NextRow(@row[0],High(row));
|
|
end;
|
|
end.
|