Λύσεις της Α Φασης!

Γενικά θέματα για το διαγωνισμό. Ερωτήσεις, προτάσεις και ό,τι άλλο ταιριάζει.
Άβαταρ μέλους
kernelpanic
Δημοσιεύσεις: 404
Εγγραφή: Κυρ Δεκ 21, 2008 8:16 pm
Τοποθεσία: Αθήνα

Λύσεις της Α Φασης!

Δημοσίευση από kernelpanic »

'Οποιος θέλει ποστάρει τη λύση του εδώ, σχολιάζει τις άλλες, περιγράφει γλαφυρά τα πλεονεκτήματα του αλγορίθμου του :P , κλπ. :)
Αρχίζω:

Κώδικας: Επιλογή όλων

/*LANG:C++
TASK: Alexander*/
#include<fstream>
#include <stdlib.h>
using namespace std;
int main(){
register short int line,col,cl,cc;
register char s1='P',s2='V',pvpv='\0',*point,*point2,*line1,*line2;
char check;
ifstream inpy("Alexander.in");
ofstream outy("Alexander.out");
inpy >> line >> col >> check;
inpy.close();
if(check=='V')pvpv++;
line1=(char*)malloc((col+2);
if((line1==NULL)) return 0;
line2=(char*)malloc((col+2);
if((line2==NULL)) return 0;
point=line1;
point2=line2;
for(cc=0;cc<col;cc++)
    {if(pvpv%2){*point=s2;*point2=s1;}else{*point=s1;*point2=s2;}
point++;
point2++;
pvpv++;}
*point='\n';
*point2='\n';
point++;
point2++;
*point='\0';
*point2='\0';
pvpv='\0';
for(cl=0;cl<line;cl++)
    {if(pvpv%2){outy<<line2;}else{outy<<line1;}
pvpv++;}
outy.close();
return 0;}
Τελευταία επεξεργασία από το μέλος kernelpanic την Παρ Φεβ 20, 2009 4:20 pm, έχει επεξεργασθεί 1 φορά συνολικά.
99 little bugs in the code,
99 bugs in the code,
Fix one bug,
Compile again,
104 little bugs in the code.

chris
Δημοσιεύσεις: 528
Εγγραφή: Κυρ Δεκ 28, 2008 9:27 am

Re: Λύσεις της Α Φασης!

Δημοσίευση από chris »

Να και ο δικός μου κώδικας!
Είναι αργός, αλλά αυτόν υπέβαλλα! :|
Spoiler: show
/*
LANG: C
TASK: Alexander
*/
#include <stdio.h>

int main (void)
{
FILE *in;
FILE *out;
int L = 0, C = 0, i, j;
char fchar, pchars[2], temp;

in=fopen("Alexander.in", "r");
fscanf(in,"%d %d\n%c", &L, &C, &fchar);
fclose(in);
if (fchar=='V')pchars[0]='V', pchars[1]='P' ;
else pchars[0]='P', pchars [1]='V';
pchars[2]='\0';

out=fopen("Alexander.out", "w");
for(i=0;i<L;i++){
for(j=0;j<(C/2);j++){
fprintf(out,"%s",pchars);
}
if (C%2==1) fprintf(out,"%c",fchar);
fprintf(out,"\n");

temp=pchars[0];
pchars[0]=pchars[1];
pchars[1]=temp;

}



return 0;
}
Μετα από 397 δημοσιεύσεις, έβαλα και υπογραφή.

Άβαταρ μέλους
kernelpanic
Δημοσιεύσεις: 404
Εγγραφή: Κυρ Δεκ 21, 2008 8:16 pm
Τοποθεσία: Αθήνα

Re: Λύσεις της Α Φασης!

Δημοσίευση από kernelpanic »

Μια χαρά είναι :)
Η μόνη μου ένσταση:

if (C%2==1)

Το %2 ή 0 θα είναι ή 1, και κάθε αριθμός άνισος του 0 είναι αληθής, οπότε δε χρειάζεσαι το ==1
Τελευταία επεξεργασία από το μέλος kernelpanic την Παρ Φεβ 20, 2009 4:24 pm, έχει επεξεργασθεί 1 φορά συνολικά.
99 little bugs in the code,
99 bugs in the code,
Fix one bug,
Compile again,
104 little bugs in the code.

dimitris
Δημοσιεύσεις: 55
Εγγραφή: Πέμ Δεκ 18, 2008 12:49 am

Re: Λύσεις της Α Φασης!

Δημοσίευση από dimitris »

Να σε πω κάτι kernelpanic; Αν έγραψες τον κώδικά σου στην μορφή που τον γράφεις εδώ ατράνταχτα πιστεύω ότι δεν κάνεις για προγραμματιστής ελεύθερου λογισμικού :)

dimitris
Δημοσιεύσεις: 55
Εγγραφή: Πέμ Δεκ 18, 2008 12:49 am

Re: Λύσεις της Α Φασης!

Δημοσίευση από dimitris »

Όσο για σένα chris πιστεύω ότι καλύτερο θα ήταν να μην χρησιμοποιούσες πίνακες αλλά κατευθείαν να τύπωνες τους χαρακτήρες στο αρχείο.

Άβαταρ μέλους
compileGuy
Δημοσιεύσεις: 218
Εγγραφή: Δευ Ιαν 19, 2009 5:39 pm

Re: Λύσεις της Α Φασης!

Δημοσίευση από compileGuy »

Να και η δικιά μου λύση!!
Spoiler: show
/*
LANG: C++
TASK: Alexander
*/

#include <iostream>
#include <string>
#include <fstream>
#include <math.h>
using namespace std;

int main()
{
ofstream TextOut;
ifstream TextIn;
int C;
int L;
char PStype,*array;
int i,j,k;
string strP1,strP2,strP3;
TextIn.open ("Alexander.in");
TextIn >>L>>C>>PStype;
TextIn.close();
if (L>=10 && L<=10000 && C>=10 && C<=12000 && PStype=='P' || PStype=='V')
{
if (fmod(C,2)==0)
{
for (i=0; i<C/2; i++)
{
strP1+="PV";
}
for (j=0; j<C/2; j++)
{
strP2+="VP";
}
strP1+="\n";
strP2+="\n";
}
else
{
for (i=0; i<(C-1)/2; i++)
{
strP1+="PV";
}
strP1+="P";
strP1+="\n";
for (j=0; j<(C-1)/2; j++)
{
strP2+="VP";
}
strP2+="V";
strP2+="\n";
}
if (fmod(L,2)==0)
{
if (PStype=='P')
{
for (k=0; k<L/2; k++)
{
strP3+=strP1;
strP3+=strP2;
}
}
else
{
for (k=0; k<L/2; k++)
{
strP3+=strP2;
strP3+=strP1;
}
}
}
else
{
if (PStype=='P')
{
for (k=0; k<(L-1)/2; k++)
{
strP3+=strP1;
strP3+=strP2;
}
strP3+=strP1;
}
else
{
for (k=0; k<(L-1)/2; k++)
{
strP3+=strP2;
strP3+=strP1;
}
strP3+=strP2;
}
}
array = new char [strP3.size()+1];
strcpy (array, strP3.c_str());
TextOut.open ("Alexander.out");
TextOut.write (array,L*C+L);
TextOut.close();
}
else
{
std::cout <<"Wrong Input";
}
return 0;
}
Τί λέτε!? Είμαι απαισιόδοξος για το αποτέλεσμα!! :? :?

thelastnicholas
Δημοσιεύσεις: 74
Εγγραφή: Παρ Φεβ 13, 2009 8:07 pm

Re: Λύσεις της Α Φασης!

Δημοσίευση από thelastnicholas »

Και η δικιά μου...

Κώδικας: Επιλογή όλων

#include <cstdio>

int main(){
 
 int L,C;
 char line[2][12001]={0};
 FILE *IN  =fopen("Alexander.in","r");
 FILE *OUT =fopen("Alexander.out","w");
 
 fscanf(IN,"%d %d %c",&L,&C,&line[0][0]);
 fclose(IN);
 
 if(line[0][0]=='P') line[1][0]='V';
 else line[1][0]='P';
  
 for(int i=1;i<C;i++){
   line[0][i]=line[1][i-1];
   line[1][i]=line[0][i-1];
  }
  
 line[0][C] = line[1][C] = '\n';
 
 for(int i=0;i<(int)(L/2);i++){ 
  fwrite(line[0],C+1,sizeof(char),OUT);
  fwrite(line[1],C+1,sizeof(char),OUT);
 }

 if(L%2)
  fwrite(line[0],C+1,sizeof(char),OUT);
 fclose(OUT);

 return 0;    
} 

Άβαταρ μέλους
kernelpanic
Δημοσιεύσεις: 404
Εγγραφή: Κυρ Δεκ 21, 2008 8:16 pm
Τοποθεσία: Αθήνα

Re: Λύσεις της Α Φασης!

Δημοσίευση από kernelpanic »

@dimitris:
1)Γιατί καλέ;

2)Πίστεψέ με, δε θες, τα συγκρινα (L*C και L) και το πρώτο πηγαίνει πολύ, πολύ πιο αργά.

@compile:
Μη φτιάχνεις διαφορετική έκδοση για κάθε εκδοχή. Δε θα τους αρέσει νομίζω.
Το if στην αρχή δε δουλέυει σωστά καί δε χρειάζεται, το PStype=='P' || PStype=='V' πρέπει να το βάλεις σε παρένθεση.
Βγάλε όλα τα περιττά, δε σου χρειάζονται.
Έχω ακούσει φήμες ότι οι μεγάλες μεταβλητές είναι κακές
Απ'την άλλη, μπράβο στη χρήση του new, εγώ δε μπορούσα να το χρησιμοποιήσω και έβαλα malloc :oops:
Για να σταματήσω να σε ροκανίζω, πολύ καλή δουλειά! Μπράβο! ;)
99 little bugs in the code,
99 bugs in the code,
Fix one bug,
Compile again,
104 little bugs in the code.

userresu
Δημοσιεύσεις: 191
Εγγραφή: Τρί Δεκ 16, 2008 9:53 pm

Re: Λύσεις της Α Φασης!

Δημοσίευση από userresu »

kernelpanic έγραψε:@dimitris:
1)Γιατί καλέ;
Μάλλον εννοεί ότι ο κώδικάς σου είναι δύσκολο να διαβαστεί :P

Άβαταρ μέλους
kernelpanic
Δημοσιεύσεις: 404
Εγγραφή: Κυρ Δεκ 21, 2008 8:16 pm
Τοποθεσία: Αθήνα

Re: Λύσεις της Α Φασης!

Δημοσίευση από kernelpanic »

Εμένα;;; Πώς σου ήρθε; :lol:
Πάντως μου πήρε ώρα να καταλάβω πλήρως το πρόγραμμα του Compile :oops:
99 little bugs in the code,
99 bugs in the code,
Fix one bug,
Compile again,
104 little bugs in the code.

georgeha98
Δημοσιεύσεις: 48
Εγγραφή: Τετ Δεκ 17, 2008 9:42 pm

Re: Λύσεις της Α Φασης!

Δημοσίευση από georgeha98 »

Μέχρι τώρα νομίζω ότι ο thelastnicholas έχει την καλύτερη λύση - αν και θα μπορούσε λίγο καλύτερη, σε αυτό το μοτίβο - αλλά αν είναι να ποστάρουμε καλύτερα να μας δείξει κάποιος μια λύση που αξίζει.

userresu
Δημοσιεύσεις: 191
Εγγραφή: Τρί Δεκ 16, 2008 9:53 pm

Re: Λύσεις της Α Φασης!

Δημοσίευση από userresu »

georgeha, είσαι γεννημένος το 98; :shock:

Άβαταρ μέλους
kernelpanic
Δημοσιεύσεις: 404
Εγγραφή: Κυρ Δεκ 21, 2008 8:16 pm
Τοποθεσία: Αθήνα

Re: Λύσεις της Α Φασης!

Δημοσίευση από kernelpanic »

Το παιδί θαύμα :P
99 little bugs in the code,
99 bugs in the code,
Fix one bug,
Compile again,
104 little bugs in the code.

stathis
Site Admin
Δημοσιεύσεις: 379
Εγγραφή: Κυρ Δεκ 14, 2008 6:01 pm
Τοποθεσία: Αθήνα
Επικοινωνία:

Re: Λύσεις της Α Φασης!

Δημοσίευση από stathis »

Ως τώρα πρέπει να 'ναι του thelastnicholas η καλύτερη λύση, όντως.
Αν και με χαλάνε τα "sizeof" που κάνει εκεί, χάνει κάποια ms, μπορούσε να μη τα κάνει καθόλου και να βάλει 1, ή απλά να καλέσει μόνο μια φορά το sizeof, αντί για L.

Κώδικας: Επιλογή όλων

#include <stdio.h>

int main(void)
{
  int i=0, j=0, L, C, Last=1;
  char c, s1[65536], s2[65536];
  
  FILE *fin = fopen("Alexander.in", "r");
  fscanf(fin, "%d %d\n%c", &L, &C, &c);
  fclose(fin);
  
  s1[0] = 'P'; s2[0] = 'V';
  
  for (i=1;i<C;i++) {
      if (Last==1) {
           s1[i] = 'V';
           s2[i] = 'P';
           Last = 2;
      } else
      if (Last==2) {
           s1[i] = 'P';
           s2[i] = 'V';
           Last = 1;
      }
      j = i+1;
  }
  
  s1[j] = '\n'; s2[j] = '\n';  
  if (c=='P') Last = 1; if (c=='V') Last = 2;
  
  FILE *fout = fopen("Alexander.out", "w");
  for (i=1;i<=L;i++) {
      if (Last==1) {
           Last = 2;
           fwrite(s1, 1, C+1, fout);
      } else
      if (Last==2) {
           Last = 1;
           fwrite(s2, 1, C+1, fout);
      }
  }
  fclose(fout);
  
  return 0;
}
Τώρα, όσον αφορά τα τεράστια arrays, είχα προβλήματα με 12001, ακόμη και 20000.
Στο τέλος κάθε γραμμής μου πετούσε καμιά δεκάδα random ψηφία απ' τον πίνακα ASCII.
Οπότε το έβαλα σε ένα ψηλό αριθμό και ξένοιασα.

Και ναι, είναι η πρώτη μου υλοποίηση, γι' αυτό είναι τόσο χάλια, don't ask. :D

georgeha98
Δημοσιεύσεις: 48
Εγγραφή: Τετ Δεκ 17, 2008 9:42 pm

Re: Λύσεις της Α Φασης!

Δημοσίευση από georgeha98 »

userresu έγραψε:georgeha, είσαι γεννημένος το 98; :shock:
Spoiler: show
Ναι είμαι 10 χρονών, και έχω σκοπό πριν τελειώσω το δημοτικό να έχω κερδίσει μια δυο φορές την Ολυμπιάδα.. :P

Τυχαίο είναι το 98, απλά είχα φτιάξει το msn μου το '98 και επειδή δεν μπορούσα να βρω διαθέσιμο username, διάλεξα αυτό και εχει μείνει από τότε.

bour1992
Δημοσιεύσεις: 55
Εγγραφή: Πέμ Δεκ 18, 2008 1:50 pm

Re: Λύσεις της Α Φασης!

Δημοσίευση από bour1992 »

Αυτός είναι και ο δικός μου κώδικας.

Κώδικας: Επιλογή όλων

/*
LANG: C++
TASK: Alexander
*/

#include <fstream>  
#include <iostream>  
#include <string>
#include <stdlib.h>

using namespace std;  
int main()  
{  


ifstream inf("Alexander.in");  
ofstream ouf("Alexander.out");
int num, num2, CountHeight=0, CountWidth=0;
char char1;

	
 if (inf >> num >> num2)
{
            
 if (inf >> char1)
{
 
 if ((num>=10) && (num<=10000) && (num2>=10) && (num2<=12000))
 {
 
 if (char1 == 'P')
 {
 for (;;)
 {
     for (;;)
     {
     ouf << char1;
     CountWidth++;
     if (CountWidth>=num2)
     break;
     ouf << "V";
     CountWidth++;
     if (CountWidth>=num2)
     break;
     }
     ouf << "\n";
     CountWidth=0;
     CountHeight++;
     if (CountHeight>=num)
     break;
     for (;;)
     {
     ouf << "V";
     CountWidth++;
     if (CountWidth>=num2)
     break;
     ouf << char1;
     CountWidth++;
     if (CountWidth>=num2)
     break;    
     }
     ouf << "\n";  
     CountWidth=0;
     CountHeight++;
     if (CountHeight>=num)
     break;  
 }
}

 if (char1 == 'V')
 {
  for (;;)
 {
     for (;;)
     {
     ouf << char1;
     CountWidth++;
     if (CountWidth>=num2)
     break;
     ouf << "P";
     CountWidth++;
     if (CountWidth>=num2)
     break;
     }
     ouf << "\n";
     CountWidth=0;
     CountHeight++;
     if (CountHeight>=num)
     break;
     for (;;)
     {
     ouf << "P";
     CountWidth++;
     if (CountWidth>=num2)
     break;
     ouf << char1;
     CountWidth++;
     if (CountWidth>=num2)
     break;    
     }
     ouf << "\n";  
     CountWidth=0;
     CountHeight++;
     if (CountHeight>=num)
     break;  
 }
}


}

      inf.close();

	return (0);
}
}
}

hambos
Δημοσιεύσεις: 12
Εγγραφή: Πέμ Ιαν 29, 2009 8:53 pm

Re: Λύσεις της Α Φασης!

Δημοσίευση από hambos »

Τσιμπήστε και το δικό μου
Spoiler: show
#include <iostream>
#include <fstream>

using namespace std;

void toggle(char & c);
bool check_xy(int x, int y);

int main()
{
cout << "To pshfidwto tou M.Alexandrou (by Poulikidhs Haralampos)" << endl;
cout << "Hit enter to continue...";
cin.get();
int x,y;
char c;

ifstream fin;
ofstream fout;

fin.open("Alexander.in");
fin >> x >> y >> c;
fin.close();

if (!check_xy(x,y))
{
cout << "prosexe ti x,y dineis...";
cout << "Hit enter to continue...";
cin.get();
return 0;
}

fout.open("Alexander.out");

for (int i =0; i<x; i++)
{
for (int j=0; j<y; j++)
{
fout << c;
toggle(c);
}
fout << endl;
if (x%2==0) toggle(c);
}
fout.close();

return 0;
}

void toggle(char & c)
{
if (c=='P')c='V';
else c='P';
return;
}

bool check_xy(int x, int y)
{
if (x<10 || x>10000) return false;
if (y<10 || y>12000) return false;
return true;
}

c13
Δημοσιεύσεις: 5
Εγγραφή: Δευ Δεκ 22, 2008 12:33 am

Re: Λύσεις της Α Φασης!

Δημοσίευση από c13 »

και η δικιά μου λύση σε c

Κώδικας: Επιλογή όλων

#include<stdio.h>

int main() {
    FILE *f;
    int L, C, i, b;
    char E, E2;
    f=fopen("Alexander.in.txt", "r");
    fscanf(f,"%d %d", &L, &C);
    fscanf(f,"%s", &E);
    fclose(f);
    f=fopen("Alexander.out.txt", "w");
    E2 = (E == 'P') ? 'V' : 'P';
    for(i = 1; i <= L; i++) {
       for(b = 1; b <= C; b++)
          fprintf(f, "%c", (i+b) & 1 ? E2 : E);
       fprintf(f, "\n");
    }
    fclose(f);

return 0;
}

Άβαταρ μέλους
kernelpanic
Δημοσιεύσεις: 404
Εγγραφή: Κυρ Δεκ 21, 2008 8:16 pm
Τοποθεσία: Αθήνα

Re: Λύσεις της Α Φασης!

Δημοσίευση από kernelpanic »

@hambos:
Ελπίζω να έβγαλες τα cin όταν το υπέβαλες... :lol:
@c13:
:shock: Κατάληξη txt ;!
99 little bugs in the code,
99 bugs in the code,
Fix one bug,
Compile again,
104 little bugs in the code.

Thrasos
Δημοσιεύσεις: 29
Εγγραφή: Τετ Δεκ 17, 2008 9:41 pm

Re: Λύσεις της Α Φασης!

Δημοσίευση από Thrasos »

πφφ πολύ C έπεσε... ήρθε η ώρα για λίγο Pascal :D

έδωσα μια πολύ απλή λύση τελικά γιατί δεν προλαβαίνω τπτ με τα μαθήματα :evil:

η πολυπλοκότητα είναι τετραγωνική στην χειρότερη περίπτωση (μπορεί να γίνει πολύ εύκολα γραμμική......).

Κώδικας: Επιλογή όλων

program Alexander;

(*LANG: Pascal
  TASK: Alexander*)



uses
  sysutils;

var
 input,
 output:text;
 Diastaseis: string;
 ArxikhPsifida,DeyterhPsifida,
 i:char;
 count,count2,
 Sthles,grammes:integer;


begin


   assign(input,'Alexander.in');
   reset(input);
   Readln(input,Diastaseis);
   read(input,ArxikhPsifida);
   close(input);

  DeyterhPsifida:= 'V';
  if ArxikhPsifida = 'V' then DeyterhPsifida := 'P';


    count:=0   ;
  repeat
    count:=count+1;
    i:=Diastaseis[count]
  until i= ' ';

  grammes:= StrtoInt(Copy(Diastaseis,1,count-1))  ;

  sthles:= StrtoInt(Copy(Diastaseis,count+1,Length(DIastaseis)-count));



   Assign(output,'Alexander.out');
   Rewrite(output);

 for count2 := 1 to grammes do
  begin
    if count2 mod 2 =1 then
      for count := 1 to sthles do
       if count mod 2 =1 then
          write(output,ArxikhPsifida)
       else
          write(output,DeyterhPsifida)
    else
         for count := 1 to sthles do
       if count mod 2 =1 then
          write(output,DeyterhPsifida)
       else
          write(output,ArxikhPsifida) ;
    writeln(Output)  ;
  end;
   close(output);

  readln;




end.

Απάντηση