[ peromalosutra @ 18.06.2005. 21:06 ] @
Zapeo sam vec na drugom zadatku! Razumijem ga, ali ne razumijem zasto moj kod ne radi. Evo teksta:
Citat:

...your job is to write a program which takes the names of a group and a comet and then determines whether the group should go with the UFO behind that comet.

Both the name of the group and the name of the comet are converted into a number in the following manner: the final number is just the product of all the letters in the name, where "A" is 1 and "Z" is 26. For instance, the group "USACO" would be 21 * 19 * 1 * 3 * 15 = 17955. If the group's number mod 47 is the same as the comet's number mod 47, then you need to tell the group to get ready! (Remember that "a mod b" is the remainder left over after dividing a by b; 34 mod 10 is 4.)

Write a program which reads in the name of the comet and the name of the group and figures out whether according to the above scheme the names are a match, printing "GO" if they match and "STAY" if not. The names of the groups and the comets will be a string of capital letters with no spaces or punctuation, up to 6 characters long.


a evo i mog koda:
Code:

program ride;
uses wincrt;
var buffin,buffout:text;
    komet,grupa:string;
function desifruj (ime:string):longint;
var i,br:integer;
    znak:char;
    p:real;
begin
p:=1;
br:=0;
for i:=1 to length(ime) do
    for znak:='A' to 'Z' do
    begin
    inc(br,1);
    if ime[i]=znak then p:=p*br;
    if znak='Z' then br:=0;
    end;
desifruj:=round(p) mod 47;
end;

begin
assign (buffin,'c:/test.in');
reset (buffin);
readln (buffin, komet, grupa);
close (buffin);
assign (buffout,'c:/test.out');
rewrite (buffout);
if desifruj (komet)=desifruj (grupa)
   then write (buffout,'GO')
   else write (buffout,'STAY');
close (buffout);
end.

U cemu je greska?
[ ivanho @ 18.06.2005. 21:28 ] @
za funkciju desifruj ovo ti je mnogo bolje resenje:

Code:

function desifruj (ime:string):integer;
var i, p:integer;
begin
p:=1;
for i:=1 to length(ime) do
 begin
  if ime[i] in ['A'..'Z'] then
   p:=p*(Ord(ime[i])-64);
 end;
 Result:=p mod 47



[ peromalosutra @ 18.06.2005. 21:34 ] @
Pokusao sam sa tvojom funkcijom:
Code:

program ride;
uses wincrt;
var buffin,buffout:text;
    komet,grupa:string;

function desifruj (ime:string):integer;
var i, p:integer;
begin
p:=1;
for i:=1 to length(ime) do
 begin
  if ime[i] in ['A'..'Z'] then
   p:=p*(Ord(ime[i])-64);
 end;
 desifruj:=p mod 47;
 end;
begin
assign (buffin,'c:/test.in');
reset (buffin);
readln (buffin, komet, grupa);
close (buffin);
assign (buffout,'c:/test.out');
rewrite (buffout);
if desifruj (komet)=desifruj (grupa)
   then write (buffout,'GO')
   else write (buffour,'STAY');
end.

ali i dalje ne radi. Test primjeri su:
Citat:


Input Output
-----------------
COMETQ
HVNGAT GO

ABSTAR
USACO STAY
[ peromalosutra @ 18.06.2005. 21:35 ] @
Pokusao sam sa tvojom funkcijom:
Code:

program ride;
uses wincrt;
var buffin,buffout:text;
    komet,grupa:string;

function desifruj (ime:string):integer;
var i, p:integer;
begin
p:=1;
for i:=1 to length(ime) do
 begin
  if ime[i] in ['A'..'Z'] then
   p:=p*(Ord(ime[i])-64);
 end;
 desifruj:=p mod 47;
 end;
begin
assign (buffin,'c:/test.in');
reset (buffin);
readln (buffin, komet, grupa);
close (buffin);
assign (buffout,'c:/test.out');
rewrite (buffout);
if desifruj (komet)=desifruj (grupa)
   then write (buffout,'GO')
   else write (buffout,'STAY');
end.

ali i dalje ne radi. Test primjeri su:
Citat:


Input Output
-----------------
COMETQ
HVNGAT GO

ABSTAR
USACO STAY
[ cassey @ 18.06.2005. 21:56 ] @
Pazi, koliko vidim ti ne ucitavac stringove dobro. U input-u se po jedan string nalazi u zasebnom redu, tako da ti ne mozes da ih ucitavas sa ReadLn (jedna, drugi)... Ukoliko u inputu imas samo brojeve onda ih ucitavaj sa Read, bez obzira da li su oni u jednom ili vise reda. Ali kad imas string uvek moras da ucitavas sa ReadLn ali time ucitas ceo red...

Drugo, pazi da ti (u tvom kodu) ovo p ne prekoraci Real (pogledaj u helpu koja su ogranicenja za koje tipove) pa bi trebalo cesce (u ovom zadatku) da radis ... Ali opet (ovaj zadatak je prost pa nije bitno) pazi, jer funkcija mod radi dosta sporo tj. ona radi na principu oduzimanja dok se ne dobije manji broj od onog po kome se trai mod. Znaci ako ti trazis 743254843289 po modulu 2 on ce da oduzima 2 od ovog broja dok ne dobije 1 ili 0, sto je mnogo sporo....

Evo koda (nisam ga debagirao, ali probaj)...

Srecno

Code:

program ride;
const
  m = 47;
var
  s1, s2: String;
  Sol: Boolean;
  f, g: Text;

  procedure InPut;
  begin
    Assign (f, 'ride.in');
    Reset (f);
    ReadLn (f, s1);
    ReadLn (f, s2);
    Close (f);
  end;

  procedure Solve;
  var
    i, m1, m2: Longint;
  begin
    m1 := 1;
    for i := 1 to length (s1) do
      m1 := (m1 * (Ord (s1 [i]) - 64)) mod m;
    m2 := 1;
    for i := 1 to length (s2) do
      m2 := (m2 * (Ord (s2 [i]) - 64)) mod m;
    if (m1 = m2) then Sol := True
    else Sol := False;
  end;

  procedure OutPut;
  begin
    Assign (g, 'ride.out');
    ReWrite (g);
    if (Sol) then WriteLn (g, 'GO')
    else WriteLn (g, 'STAY');
    Close (g);
  end;

begin
  InPut;
  Solve;
  OutPut;
end.
[ Srki_82 @ 19.06.2005. 06:06 ] @
Ovo je verovatno neki zadatak u kojem ne mozes da radis bas sve tako prosto kao sto izgleda
Za ime grupe koje se sastoji od 20 slova Z broj za koji treba da izracunas mod 47 je 518131871275444637960845131776... pitam se koliki bi bio broj da ima, recimo 50 slova Z... taj broj ti nece stati ni u jedan tip promenljivih. Dakle... treba da pomnozis dva broja i da odlucis koji je bitan deo za pamcenje, a ostatak da zaboravis. Da si recimo trazio mod 2 bilo bi ti dovoljno da pamtis samo zadnju cifru.
Razmisli i ovome
[ peromalosutra @ 19.06.2005. 08:10 ] @
Citat:
Za ime grupe koje se sastoji od 20 slova Z broj za koji treba da izracunas mod 47 je 518131871275444637960845131776...


Ali u zadatku se kaze da ce najduze ime imati 6 znakova:

Code:
The names of the groups and the comets will be a string of capital letters with no spaces or punctuation, up to 6 characters long.


pa je najveci broj 26^6=308915776, a to je valjda dovoljno za longint.
[ peromalosutra @ 19.06.2005. 11:00 ] @
Rjesio sam zadatak, kod mene radi dobro za sve test primjere, ali kad ga posaljem na USACO, njihov kompajler kaze da je sve u redu, ali mi kasnije prijavi error 2 (pozivanje nepostojeceg fajla):

Citat:
Execution error: Your program (`test') exited with exit status `2'
when presented with test case 1, shown below.



Evo kompletnog koda:
Code:


{
ID: ivanraj1
PROG: test
LANG: PASCAL
}

program ride;
var buffin,buffout:text;
    komet,grupa:string;

function desifruj (ime:string):longint;
var i,br:integer;
    znak:char;
    p:longint;
begin

p:=1;
for i:=1 to length(ime) do
    p:=p*(ord(ime[i])-64);
desifruj:=p mod 47;
end;

begin
assign (buffin,'ride.in');
reset (buffin);
readln (buffin, komet);
readln (buffin, grupa);
close (buffin);
assign (buffout,'ride.out');
rewrite (buffout);
if desifruj (komet)=desifruj (grupa)
   then write ('GO')
   else write ('STOP');
end.

Pogledao sam ponovo, ali lijepo pise da ulazna datoteka mora biti RIDE.IN, a izlazna RIDE.OUT, bas kako sam ja naveo u svom programu.
[ Srki_82 @ 19.06.2005. 12:24 ] @
Pa ti ne pises u RIDE.OUT nego na CON: fajl. Write bez File parametra ispisuje podatak na default izlazu sto je ekran, a ne RIDE.OUT fajl. I jos nesto... otvaras RIDE.OUT fajl, a nigde ga ne zatvaras!!!
[ peromalosutra @ 19.06.2005. 20:35 ] @
Nisam te bas shvatio, u zadatku se kaze da se podaci ucitavaju sa ride.in, a cuvaju u ride.out. Zar trebam napisati assign (buffout,'file ride.out'), ne shvatam ovo bas. Zbunjuje me ta lokacija fajla, da ga trebam smjestiti negdje na mom kompjuteru samo bih naveo putanju, a ovako mi nista nije jasno. Sto se tice zatvaranja fajla, njima (USACO-u) sam poslao ispravan kod, slucajno sam izbrisao tu liniju u postu.
[ cassey @ 19.06.2005. 20:40 ] @
Ti iz fila ride.in ucitavas polazne podatke, a rezulatat stampas u fail raie.out. Ti si u tvom kodu rezultat stampao na standardnom izlazu a ne u dadoteci. Pogledaj moj kod (postovan je u nekoj o prethodnih poruka)...
[ cassey @ 19.06.2005. 20:44 ] @
I da, ukoliliko ti napises time se podrazumeva da je navedeni fail u istom folderu kao i sam tvoj program (exe verzija), a ukoliko napises celekupnu putanju na komp (npr c:\aaa\xxx.in) tada taj fail mora tu da se nalazi. USACO (kao i svi drugi online testeri) podrazumevaju da se in i out failovi nalaze gde i sam program...