Concurs de Sant Jordi

24 Abril 2010 at 1:32 pm 1 comentari

Des que anava a l’escola que, suposo que com tothom (voluntàriament o involuntària), participo en concursos de Sant Jordi. Cada any el mateix: dibuixar un auca, escriure un poema, inventar una història… I cada any el mateix resultat: Res.
Pensava que un cop a la universitat, donat que ningú no m’obligaria a escriure res, perdria l’oportunitat de, per un cop a la vida guanyar un concurs de Sant Jordi. Aquest any però, el Departament de Llenguatges i Sistemes informàtics de la Facultat d’Informàtica de Barcelona, va organitzar un concurs de Sant Jordi, i hi vaig decidir participar.

Per celebrar la diada de Sant Jordi, el Jutge de Programació organitza un petit concurs de programació literària.

L’objectiu del concurs és resoldre un problema de programació correctament. La solució es pot escriure en qualsevol dels llenguatges de programació disponibles al Jutge. D’entre tots els programes acceptats perl Jutge, els Jurat n’escollirà tres guanyadors. Els criteris seràn la correctesa i la qualitat literària de la presentació del programa. Tot pot comptar: elegància, claredat, indentació, ús dels identificadors, comentaris, humor, ofuscació, secretisme, incomprensió… La valoració d’aquests criteris es deixa a la discreció dels jurat.

L’enunciat del problema era el següent:

Teniu un taulell n × n, on cada posicio pot estar permesa o prohibida. Donada la posicio inicial d’un cavall, cal determinar si es possible que el cavall passi exactament un cop per cada posicio permesa, fent els salts dels escacs es a dir, incrementant o decrementant una de les dimensions en una unitat, i l’altra dimensio en dues unitats).

Vaig decidir escriure el codi en C++, ja que havia fet exercicis similars en el passat en aquest llenguatge, i per tant em podria centrar en la part artístico-literària i no tant en la part del correcte funcionament del programa. Un cop vaig tenir el programa funcionant, va començar la part on em vaig sentir com si tornés a ser a l’escola, buscant paraules noves, intentant trobar adjectius i verbs, per tal de poder explicar una història fent servir entre d’altres coses el codi del mateix programa. Vaig estar dijous fins més tard de les 2 de la matinada per tenir una història mínimament coherent.
Aquesta va ser la meva solució:

/*La*/ class/*ica*/ Llegenda { /*de Sant Jordi autocontinguda recursiva*/

/*Diuen que assolava els voltants de la FIB*/
/*un*/ferotge monstre;/*que poseia les facultats*/
/*d'*/int/*entar*/ suspendre;/*els alumnes*/
int/*eressats e*/n;/*aprovar.*/
/*Els alumnes, */int/*el·ligentment, van pensar que*/el,/*podrien contenir*/un/*a mica*/;
/*si cada setmana, un bene*/bool/*estudiant oferia el seu*/ aprovat;
/*Un bon dia, el*/ferotge drac;/*va demanar l'aprovat de l'unica noia de la FIB*/
/*Tots els nois es van oposar a la peticio del*/
/*cap d'o*/void/*e monstruos i van*/provar (/*d'*/int/*ervenir-hi.*/
/*No van faltar*/pas,/*els qui*/ int/*ent*/a/*ven evitar-ho*/,/*ofer*/int/*-se per substituir la*/j/*ove*/){
/*Nomes hi havia una persona pero, que podia derrotar el monstre: Sant Jordi*/
/*Era d*/if/*icil deixar la*/(not/*a en*/aprovat /*, a Sant Jordi li feia m*/and/*r*/a>=0 /*de g*/and/*ul*/
/*pero no pens*/a</*a e*/n /*ab*/and/*onar una*/j/*o*/>=/*e*/0 and/*alusa*/
/*i a un*/ j/*o*/</*e*/n/*t*/ /*t*/and/*edicat, davant del*/ monstre[a/*famat i*/][j/*uganer*/]==".") {
/*El bot*/if/*ler Jordi pero, no tenia*/((pas+1)<cavall)/*amb que combatre el*/monstre/*gens*/[a][j/*ocat*/]="0"
/*doncs aquest s'havia perdut en un*/+laberint(/*no feia*/pas+1/*gaire*/);
/*El cavall menjador d'herba m*/else/*ra havia estat capturat pel*/monstre[/*geg*/a/*nt i*/][j/*acent*/]=/*al*/laberint(pas/*tador*/+1);
/*Sant Jordi va demanar als estudiants, un algorisme*/recursiu(/*pel*/pas/*tador d'herba*/+1,a,j/*udar*/);
/*i d'aquesta manera al*/monstre[a/*niquilar*/][/*i la*/j/*ove aprovar*/] = ".";
/*El programa havia de tenir 191 linies, i donat un tauler d'entrada, i la posicio del cavall, determinar el cami per poder
 passar per totes les caselles, sense repetir-ne cap. D'aquesta manera podria trencar la malediccio del laberint.*/}}

	/*L'algorisme recursiu que van dissenyar els alumnes va ser aquest*/
    void recursiu (int pas, int x, int y)
	{
        /*Per cada pas del cavall, van mirar si aquest ja havia fet tots els passos*/
		if (pas==n*n-suspendre)
		{
            /*Si ja havia aconseguit fer els passos, l'aprovat era realitat*/
			aprovat = true;

			/*I es constatava una obvietat, que el drac era un monstre*/
			drac = monstre;
        }
		/*Si no, el cavall seguia provant, de tantes maneres com podia*/
		else
		{
			provar(pas,x+2,y-1); provar(pas,x+2,y+1);
            provar(pas,x+1,y+2); provar(pas,x-1,y+2);
            provar(pas,x-2,y+1); provar(pas,x-2,y-1);
            provar(pas,x-1,y-2); provar(pas,x+1,y-2);
		}
	}

/*Pero */public:/*no us avanceu*/
/*La*/ Llegenda (/*d'*/int/*e*/n/*tar derrotar el*/, ferotge monstre, /*no es pas succ*/int a,
/*i no ens podem deixar res al t*/int er, /*sobre el laber*/int /*malef*/i/*c*/) {

		this/*cret*/->/*havia ser Sant Jordi per evitar l'alumna*/suspendre=i/*no aprovar*/;
		this/*tret*/->/*havia d'estar el */monstre /*per no veure el mata*/=monstre/*s*/;
		/*malgrat tot*/
		this/*tret*/->n/*o*/ = /*a*/n/*ava el drac i*/;
		this/*cret*/->el/*l no v*/=a/*ser perque aquest va ser el resultat, */;
		this/*putat*/->un /*enfrontament que hi va hav*/=er;

		aprovat = false;

		this/*suasiu pero el*/->monstre[/*p*/el/*ut no va ser, tot i que va*/][/*sumar un p*/un/*t*/] = "01";

/*Sant Jordi va intentar executar l'algorisme*/recursiu(/*per salvar*/1,el,/*seu cavall del prof*/un/*d laberint*/);}

	/*Mira Sant Jordi, t'hem fet dues funcions auxiliars!*/
	bool el_cavaller ()
	{
        return aprovat;
    }

	ferotge en_un_tres_i_no_res()
	{
	    return drac;
	}
};

/*Sant Jordi va */int/*entar executar el codi fet per la*/main/*ada*/ () {
/*pero l'*/int/*e*/n/*t va*/,f,r/*acassar*/,j/*a que faltava el programa*/,principal=0;
/*mentre el*/ferotge monstre;/*estava despistat*/
cin/*c dels*/ >> n/*ois van aprofitar*/;
/*per re*/string/*ir*/ la/* seva visio*/;
/*el*/monstre = ferotge(n/*o es va ado*/,n/*ar*/);
/*que el grup s'estava en*/for/*t*/(int i /*ben aviat van tr*/=0/*bar el programa*/;/*pr*/i<n/*c*/;i/*pal*/++){
/*Un cop el codi sencer van acabar, a Sant Jordi li'l van entregar*/
/*I gracies al programa el seu cavall el cami de sortida va trobar*/
/*Al·lu*/cin/*ant va ser*/ >> la /*facilitat amb que Sant Jordi*/;
/*un cop recuperat el boca*/for/*t cavall*/ (j/*a*/ = /*n*/0; /*semblava necessitar a*/j/*uda de */<n/*ingu*/; j++){
/*Sant Jordi va matar el*/monstre[i][/*els*/j/*oves ben contents van quedar, de*/]=la[j/*ove noia recuperar*/];
/*Sobre una cat*/if/*a el*/(monstre[i/*nert*/][/*van fer*/j/*aure i de la seva pell va sortir una gota de sang*/]=="*") {
/*La sang del*/monstre[/*flu*/i/*a*/][/*i ra*/j/*ava sense parar*/]="**";
/*I la seva sang va passar a ser el punt d'atencio*/principal++;}}}
/*Poca estona mes tard, tothom va poder veure el naixement d'una fas*/cin/*ant*/ >> f/*lor de*/ >> r/*osa*/;

/*I aixi acaba la*/Llegenda/*de*/Sant_Jordi(/*e*/n,/*que un*/monstre, f/*erotge*/-1, /*c*/r/*uel i*/-1, principal/*ment dolent*/);
/*Va intentar suspendre l'unica noia de la FIB*/
/*i gracies a la grat*/if/*icant ajuda de*/(Sant_Jordi.el_cavaller()) {
/*i la inestimable ajuda dels alumnes, el temible*/ monstre = /*va poder ser despatxat per*/Sant_Jordi.en_un_tres_i_no_res();

		// Mira Sant Jordi, aquesta part del codi escriu la solucio amb els espais i els saltets que ens vas demanar!
		for(int i=0;i<n;i++)
		{
			if(i!=0) cout << endl;
			for (int j=0; j<n; j++)
			{
				cout << monstre[i][j];
				if (j!=(n-1)) cout << " ";
			}
			if (i==(n-1)) cout << endl;
			}
	}
	else cout << "sense solucio" << endl;

}

/*I per si no us n'heu adonat, precisament aquest petit programa que heu anat seguint, 
 va ser el que va ajudar a Sant Jordi a alliberar el seu cavall, derrotar el drac, i salvar l'aprovat de l'alumna.
 I us preguntareu: Com es possible que al programa que se li va entregar a Sant Jordi s'hi expliqui la historia sobre el propi programa?
 L'ou o la gallina?
 */

Finalment, al cap de dues hores d’acabar la data límit, el jurat va escollir els 3 guanyadors, entre ells, la meva història!

Aquí hi ha més detalls sobre el concurs, així com el codi dels altres 2 guanyadors, l’enunciat ampliat, les bases…, per si hi voleu participar el proper any!

Fins aviat!

Entry filed under: FIB, Software. Tags: .

TMB iBus Chrome Extension eduroam des de Mac OSX Snow Leopard

1 Comentari Add your own

  • 1. Jordi  |  25 Abril 2010 a les 12:56 pm

    Fa una estona estava mirant la web del concurs i he vist que havies guanyat, i al veure el codi de veritat que ho he entès! Quina currada, nano…! Enhorabona!!

    Ja ens explicaràs quins llibres demanaràs😉

    Respon

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed


RSS Twitter

  • S'ha produït un error; probablement el canal ha deixat de funcionar. Torneu-ho a provar d'aquí una estona.

Flickr Photos

Palacio de cristal #iphone7 #takenwithaniphone7 #palaciodecristal #madrid #retiro #park #architecture #glass #blue #sky

Barcelona buildings #iphone7 #takenwithaniphone7 #barcelona #buildings #skyscraper #skyline #sky #sunset #night #agbar

Sailing Barcelona #iphone7 #takenwithaniphone7 #barcelona #sailing #sky #skyline #whotel #hotelw #sky #clouds #mediterranean

More Photos

Blog Stats

  • 47,970 hits

del.icio.us


%d bloggers like this: