Ja z innej beczki - o SPOJu wiedziałem od dawna. Ale nigdy jakoś nie chciało się mi zgłaszać tam rozwiązań. Teraz zainteresowany tym tematem zgłośiłem swoje rozwiązanie do tego zadania. Ale jako że cepepe nie zdzierżę to wysłałem w FPC. I oba rozwiązania przyjeło. Tylko ciekawe czy samo zaakceptowanie znaczy, że już jest wszystko ok? Bo nie wertowałem opisów SPOJa.
Tylko ciekawa jedna rzecz. Bo tam przeczą sobie troszkę, widać to choćby na przykładzie właśnie tego zadania JPESEL. Mianowcie przykładowy input i output sugerują, że należy jednak te dane najpierw pobrać, a później wypisac. Także albo robimy to nieoptymalnie na kilka zmiennych. Ale najprościej w większości języków będzie to zrobić stosując tablicę. Skoro mamy najpierw pobrać, a później wypisać. Ale obydwa warianty mi przjęto. Tylko jeżeli ktoś później ma oceniać albo wzrorować się na tych kodach, to na pewno w jakim by języku nie pisać. To za wysoko kodów podanych powyżej ocenić nie można. Chyba większość języków posiada takie elemnty składniowe jak funkcje. Dlatego ja zrobiłem tak jak poniżej dla FPC.
Sam kod tej funkcji do PESELa, żeby nie rzeźbić jej od nowa wziąłem z jakiegoś starego mojego programu w Delphi. Chyba nawet sam algo był gdzieś podany w takiej postaci na Google czy nawet na WIKI. Tylko zangielszczyłem nazewnictwo elementów kodu, bo nie lubię mieszania raz po polsku, a później po innemu. Btw, @madmike'owa marudo Ty moja, pewnie tutaj nie zajrzysz, ale tym razem masz enterów aż nadto. Po samym source wkleje jeszcze kilka żebyś miał na zapaś ;P Anyway, jeśli kiedyś znajdę czas to sobie porozwiązuje. Ale taki SPOJ to chyba lepiej do ćwiczenia nauki jakiegoś języka od podstaw. Pewnie są i trudniejsze zadania, ale klepanie tam tylko po to żeby sprawdzać kod, to imo trochę marnowanie czasu ;)
program pesel;
{$MODE DELPHI}
function StrToInt(const S : string) : integer;
var
E : integer;
begin
Val(S, Result, E);
end;
function CheckIsPeselValid(Pesel : string) : boolean;
const
Mult_Arr : array[1..10] of integer = (1, 3, 7, 9, 1, 3, 7, 9, 1, 3);
var
I : integer;
Sum, ControlDigit : integer;
begin
Result := False;
if Length(Pesel) = 11 then
begin
Sum := 0;
for I := 1 to Length(Pesel) - 1 do
begin
Sum := Sum + (StrToInt(Pesel[I]) * Mult_Arr[I]);
end;
Sum := Sum + StrToInt(Pesel[11]);
ControlDigit := (10 - (Sum mod 10)) mod 10;
Result := ControlDigit = 0;
end;
end;
const
Results_Arr : array[boolean] of Char = ('N', 'D');
var
S : string;
I, Code : integer;
Arr : array of string;
begin
repeat
Readln(S);
Val(S, I, Code);
until (Code = 0) and (I > 0);
SetLength(Arr, I);
for I := Low(Arr) to High(Arr) do
begin
Readln(Arr[I]);
end;
for I := Low(Arr) to High(Arr) do
begin
Writeln(Results_Arr[CheckIsPeselValid(Arr[I])]);
end;
end.
Powyżej były ENTERy bonusowe dla @madmike, bo ma ich za mało w moich postach ;)