89 lines
2.2 KiB
Plaintext
89 lines
2.2 KiB
Plaintext
Program Anagrams;
|
|
|
|
// assumes a local file
|
|
|
|
uses
|
|
classes, math;
|
|
|
|
var
|
|
i, j, k, maxCount: integer;
|
|
sortedString: string;
|
|
WordList: TStringList;
|
|
SortedWordList: TStringList;
|
|
AnagramList: array of TStringlist;
|
|
|
|
begin
|
|
WordList := TStringList.Create;
|
|
WordList.LoadFromFile('unixdict.txt');
|
|
for i := 0 to WordList.Count - 1 do
|
|
begin
|
|
setLength(sortedString,Length(WordList.Strings[i]));
|
|
sortedString[1] := WordList.Strings[i][1];
|
|
|
|
// sorted assign
|
|
j := 2;
|
|
while j <= Length(WordList.Strings[i]) do
|
|
begin
|
|
k := j - 1;
|
|
while (WordList.Strings[i][j] < sortedString[k]) and (k > 0) do
|
|
begin
|
|
sortedString[k+1] := sortedString[k];
|
|
k := k - 1;
|
|
end;
|
|
sortedString[k+1] := WordList.Strings[i][j];
|
|
j := j + 1;
|
|
end;
|
|
|
|
// create the stringlists of the sorted letters and
|
|
// the list of the original words
|
|
if not assigned(SortedWordList) then
|
|
begin
|
|
SortedWordList := TStringList.Create;
|
|
SortedWordList.append(sortedString);
|
|
setlength(AnagramList,1);
|
|
AnagramList[0] := TStringList.Create;
|
|
AnagramList[0].append(WordList.Strings[i]);
|
|
end
|
|
else
|
|
begin
|
|
j := 0;
|
|
while sortedString <> SortedWordList.Strings[j] do
|
|
begin
|
|
inc(j);
|
|
if j = (SortedWordList.Count) then
|
|
begin
|
|
SortedWordList.append(sortedString);
|
|
setlength(AnagramList,length(AnagramList) + 1);
|
|
AnagramList[j] := TStringList.Create;
|
|
break;
|
|
end;
|
|
end;
|
|
AnagramList[j].append(WordList.Strings[i]);
|
|
end;
|
|
end;
|
|
|
|
maxCount := 1;
|
|
for i := 0 to length(AnagramList) - 1 do
|
|
maxCount := max(maxCount, AnagramList[i].Count);
|
|
|
|
// create output
|
|
writeln('The largest sets of words have ', maxCount, ' members:');
|
|
for i := 0 to length(AnagramList) - 1 do
|
|
begin
|
|
if AnagramList[i].Count = maxCount then
|
|
begin
|
|
write('"', SortedWordList.strings[i], '": ');
|
|
for j := 0 to AnagramList[i].Count - 2 do
|
|
write(AnagramList[i].strings[j], ', ');
|
|
writeln(AnagramList[i].strings[AnagramList[i].Count - 1]);
|
|
end;
|
|
end;
|
|
|
|
// Cleanup
|
|
WordList.Destroy;
|
|
SortedWordList.Destroy;
|
|
for i := 0 to length(AnagramList) - 1 do
|
|
AnagramList[i].Destroy;
|
|
|
|
end.
|