1 | unit BFCodeTools;
|
---|
2 |
|
---|
3 | interface
|
---|
4 |
|
---|
5 | uses
|
---|
6 | Classes, SysUtils, StrUtils, Math;
|
---|
7 |
|
---|
8 | function GenerateNumber(Number: Integer): string;
|
---|
9 | function GenerateNumberSimple(Number: Integer): string;
|
---|
10 | function GenerateText(Text: string): string;
|
---|
11 | function FormatCode(Text: string): string;
|
---|
12 | function ShrinkCode(Text: string): string;
|
---|
13 |
|
---|
14 |
|
---|
15 | implementation
|
---|
16 |
|
---|
17 | function GenerateNumber(Number: Integer): string;
|
---|
18 | var
|
---|
19 | Base: Integer;
|
---|
20 | Multiplier: Integer;
|
---|
21 | Remainder: Integer;
|
---|
22 | const
|
---|
23 | Overhead = 7;
|
---|
24 | begin
|
---|
25 | Result := '';
|
---|
26 | Base := Trunc(Sqrt(Number));
|
---|
27 | Remainder := Number;
|
---|
28 | if Base > 1 then begin
|
---|
29 | Multiplier := Trunc(Remainder / Base);
|
---|
30 | Result := Result + '>' + GenerateNumberSimple(Base) + '[<' +
|
---|
31 | GenerateNumberSimple(Multiplier) + '>-]<';
|
---|
32 | Remainder := Remainder - Base * Multiplier;
|
---|
33 | end;
|
---|
34 | Result := Result + GenerateNumberSimple(Remainder);
|
---|
35 | if Length(Result) > Number then
|
---|
36 | Result := GenerateNumberSimple(Number);
|
---|
37 | end;
|
---|
38 |
|
---|
39 | function GenerateNumberSimple(Number: Integer): string;
|
---|
40 | begin
|
---|
41 | Result := DupeString('+', Number);
|
---|
42 | end;
|
---|
43 |
|
---|
44 | function GenerateText(Text: string): string;
|
---|
45 | var
|
---|
46 | I: Integer;
|
---|
47 | MinValue: Integer;
|
---|
48 | begin
|
---|
49 | Result := '';
|
---|
50 |
|
---|
51 | if Length(Text) > 1 then begin
|
---|
52 | MinValue := MaxInt;
|
---|
53 | for I := 1 to Length(Text) do
|
---|
54 | MinValue := Min(MinValue, Ord(Text[I]));
|
---|
55 |
|
---|
56 | if MinValue > 1 then
|
---|
57 | Result := DupeString('>', Length(Text)) + GenerateNumber(MinValue) +
|
---|
58 | '[' + DupeString('<+', Length(Text)) + DupeString('>', Length(Text)) + '-]';
|
---|
59 | Result := Result + DupeString('<', Length(Text));
|
---|
60 | end;
|
---|
61 |
|
---|
62 | for I := 1 to Length(Text) do begin
|
---|
63 | Result := Result + GenerateNumberSimple(Ord(Text[I]) - MinValue) + '>';
|
---|
64 | end;
|
---|
65 | end;
|
---|
66 |
|
---|
67 | function FormatCode(Text: string): string;
|
---|
68 | var
|
---|
69 | IndentLevel: Integer;
|
---|
70 | I: Integer;
|
---|
71 | const
|
---|
72 | IndentText = ' ';
|
---|
73 | begin
|
---|
74 | Result := '';
|
---|
75 | IndentLevel := 0;
|
---|
76 | for I := 1 to Length(Text) do begin
|
---|
77 | if Text[I] = '[' then begin
|
---|
78 | Result := Result + LineEnding + DupeString(IndentText, IndentLevel) +
|
---|
79 | Text[I] + LineEnding ;
|
---|
80 | Inc(IndentLevel);
|
---|
81 | Result := Result + DupeString(IndentText, IndentLevel);
|
---|
82 | end
|
---|
83 | else if Text[I] = ']' then begin
|
---|
84 | Dec(IndentLevel);
|
---|
85 | Result := Result + LineEnding + DupeString(IndentText, IndentLevel) +
|
---|
86 | Text[I] + LineEnding + DupeString(IndentText, IndentLevel);
|
---|
87 | end
|
---|
88 | else if Text[I] > ' ' then
|
---|
89 | Result := Result + Text[I];
|
---|
90 | end;
|
---|
91 | end;
|
---|
92 |
|
---|
93 | // Remove all non-printable characters
|
---|
94 | function ShrinkCode(Text: string): string;
|
---|
95 | var
|
---|
96 | Pos: Integer;
|
---|
97 | I: Integer;
|
---|
98 | begin
|
---|
99 | Pos := 1;
|
---|
100 | for I := 1 to Length(Text) do begin
|
---|
101 | if Text[I] > ' ' then begin
|
---|
102 | Text[Pos] := Text[I];
|
---|
103 | Inc(Pos);
|
---|
104 | end;
|
---|
105 | end;
|
---|
106 | SetLength(Text, Pos - 1);
|
---|
107 | Result := Text;
|
---|
108 | end;
|
---|
109 |
|
---|
110 | end.
|
---|
111 |
|
---|