(* From a list of given numbers, find out which pairs are friends.
A pair of numbers, (A,B), is friend when A+B is a number which last digit is 0. *)
program friends_challenge;
uses crt; // for the Pause method, only
type TPair = record
a, b : byte;
end;
TList = array of byte;
TFrs = array of TPair;
// Pause method (compacted in one line):
procedure Pause; begin repeat until readkey = #13; end;
procedure GetNumbers(const q : byte; var list : TList);
(* Gets the list of numbers from the user. *)
var i : byte;
begin
SetLength(list, q);
for i:=0 to q-1 do
readln(list[i]);
end;
procedure GetFriends(const list : TList; var frs : TFrs);
(* Algorithm - gets the list of pairs of numbers which are friends. *)
const MAX = 255;
var i, j : byte;
seen : array [0..MAX, 0..MAX] of boolean;
begin
// initialization fo "seen"
for i:=0 to MAX do for j:=0 to MAX do seen[i,j]:=false;
// finding the friends...
for i:=low(list) to high(list)-1 do
for j:=i+1 to high(list) do
if ((list[i] + list[j]) mod 10 = 0) and not seen[list[i], list[j]] then begin
SetLength(frs, Length(frs)+1);
frs[Length(frs)-1].a := list[i];
frs[Length(frs)-1].b := list[j];
seen[list[i], list[j]] := true;
seen[list[j], list[i]] := true;
end;
end;
var n : byte; // how many numbers will be given
numbers : TList; // the list of numbers to search
friends : TFrs; // the list of pairs of number which are friends
elem : TPair; // usage: FOR-IN cycle
begin
// INPUT
repeat
readln(n);
if (n < 2) then writeln('Must be greater than or equal to 2!');
until (n >= 2);
GetNumbers(n, numbers); // getting the list...
GetFriends(numbers, friends); // getting the friends...
// OUTPUT
write('The ', Length(friends), ' friend pairs are: ');
for elem in friends do write('(', elem.a, ',', elem.b, ') ');
Pause;
end.
KCogRnJvbSBhIGxpc3Qgb2YgZ2l2ZW4gbnVtYmVycywgZmluZCBvdXQgd2hpY2ggcGFpcnMgYXJlIGZyaWVuZHMuCkEgcGFpciBvZiBudW1iZXJzLCAoQSxCKSwgaXMgZnJpZW5kIHdoZW4gQStCIGlzIGEgbnVtYmVyIHdoaWNoIGxhc3QgZGlnaXQgaXMgMC4gKikKIApwcm9ncmFtIGZyaWVuZHNfY2hhbGxlbmdlOwp1c2VzIGNydDsgIC8vIGZvciB0aGUgUGF1c2UgbWV0aG9kLCBvbmx5CiAKdHlwZSBUUGFpciA9IHJlY29yZAogICAgICAgIGEsIGIgOiBieXRlOwogICAgIGVuZDsKICAgICBUTGlzdCA9IGFycmF5IG9mIGJ5dGU7CiAgICAgVEZycyAgPSBhcnJheSBvZiBUUGFpcjsKIAovLyBQYXVzZSBtZXRob2QgKGNvbXBhY3RlZCBpbiBvbmUgbGluZSk6CnByb2NlZHVyZSBQYXVzZTsgYmVnaW4gcmVwZWF0IHVudGlsIHJlYWRrZXkgPSAjMTM7IGVuZDsKIApwcm9jZWR1cmUgR2V0TnVtYmVycyhjb25zdCBxIDogYnl0ZTsgdmFyIGxpc3QgOiBUTGlzdCk7CigqIEdldHMgdGhlIGxpc3Qgb2YgbnVtYmVycyBmcm9tIHRoZSB1c2VyLiAqKQp2YXIgaSA6IGJ5dGU7CmJlZ2luCiAgICBTZXRMZW5ndGgobGlzdCwgcSk7CiAgICBmb3IgaTo9MCB0byBxLTEgZG8KICAgICAgICByZWFkbG4obGlzdFtpXSk7CmVuZDsKIApwcm9jZWR1cmUgR2V0RnJpZW5kcyhjb25zdCBsaXN0IDogVExpc3Q7IHZhciBmcnMgOiBURnJzKTsKKCogQWxnb3JpdGhtIC0gZ2V0cyB0aGUgbGlzdCBvZiBwYWlycyBvZiBudW1iZXJzIHdoaWNoIGFyZSBmcmllbmRzLiAqKQpjb25zdCBNQVggPSAyNTU7CnZhciBpLCBqIDogYnl0ZTsKICAgIHNlZW4gOiBhcnJheSBbMC4uTUFYLCAwLi5NQVhdIG9mIGJvb2xlYW47CmJlZ2luCiAgICAvLyBpbml0aWFsaXphdGlvbiBmbyAic2VlbiIKICAgIGZvciBpOj0wIHRvIE1BWCBkbyBmb3Igajo9MCB0byBNQVggZG8gc2VlbltpLGpdOj1mYWxzZTsKIAogICAgLy8gZmluZGluZyB0aGUgZnJpZW5kcy4uLgogICAgZm9yIGk6PWxvdyhsaXN0KSB0byBoaWdoKGxpc3QpLTEgZG8KICAgICAgICBmb3Igajo9aSsxIHRvIGhpZ2gobGlzdCkgZG8KICAgICAgICAgICAgaWYgKChsaXN0W2ldICsgbGlzdFtqXSkgbW9kIDEwID0gMCkgYW5kIG5vdCBzZWVuW2xpc3RbaV0sIGxpc3Rbal1dIHRoZW4gYmVnaW4KICAgICAgICAgICAgICAgIFNldExlbmd0aChmcnMsIExlbmd0aChmcnMpKzEpOwogICAgICAgICAgICAgICAgZnJzW0xlbmd0aChmcnMpLTFdLmEgOj0gbGlzdFtpXTsKICAgICAgICAgICAgICAgIGZyc1tMZW5ndGgoZnJzKS0xXS5iIDo9IGxpc3Rbal07CiAgICAgICAgICAgICAgICBzZWVuW2xpc3RbaV0sIGxpc3Rbal1dIDo9IHRydWU7CiAgICAgICAgICAgICAgICBzZWVuW2xpc3Rbal0sIGxpc3RbaV1dIDo9IHRydWU7CiAgICAgICAgICAgIGVuZDsKZW5kOwogCnZhciBuIDogYnl0ZTsgICAgICAgICAvLyBob3cgbWFueSBudW1iZXJzIHdpbGwgYmUgZ2l2ZW4KICAgIG51bWJlcnMgOiBUTGlzdDsgIC8vIHRoZSBsaXN0IG9mIG51bWJlcnMgdG8gc2VhcmNoCiAgICBmcmllbmRzIDogVEZyczsgICAvLyB0aGUgbGlzdCBvZiBwYWlycyBvZiBudW1iZXIgd2hpY2ggYXJlIGZyaWVuZHMKICAgIGVsZW0gOiBUUGFpcjsgICAgIC8vIHVzYWdlOiBGT1ItSU4gY3ljbGUKIApiZWdpbgogICAgLy8gSU5QVVQKICAgIHJlcGVhdAogICAgICAgIHJlYWRsbihuKTsKICAgICAgICBpZiAobiA8IDIpIHRoZW4gd3JpdGVsbignTXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMiEnKTsKICAgIHVudGlsIChuID49IDIpOwogCiAgICBHZXROdW1iZXJzKG4sIG51bWJlcnMpOyAgICAgICAgLy8gZ2V0dGluZyB0aGUgbGlzdC4uLgogICAgR2V0RnJpZW5kcyhudW1iZXJzLCBmcmllbmRzKTsgIC8vIGdldHRpbmcgdGhlIGZyaWVuZHMuLi4KIAogICAgLy8gT1VUUFVUCiAgICB3cml0ZSgnVGhlICcsIExlbmd0aChmcmllbmRzKSwgJyBmcmllbmQgcGFpcnMgYXJlOiAnKTsKICAgIGZvciBlbGVtIGluIGZyaWVuZHMgZG8gd3JpdGUoJygnLCBlbGVtLmEsICcsJywgZWxlbS5iLCAnKSAnKTsKICAgIFBhdXNlOwplbmQu