name: portada class: portada-slide, center, middle # Introducció a la competició de programació ## Sessions preparació ProgramaMe .footnote[Joan Puigcerver Ibáñez ([joan.puigcerver@itb.cat](mailto:joan.puigcerver@itb.cat))] --- layout: true class: regular-slide .right[.logo[]] --- # .blue[Introducció] * Competició de programació = Resolució de problemes. * Resolució __eficient__ de problemes mitjançant algorismes. * Molts dels problemes reals requereixen la combinació de diferents tipus d'algorismes i estructures de dades. * Des del punt de vista formatiu: * Complementar la formació en resolució de problemes de programació complexos. * Motivar i incentivar l'autonomia de l'alumnat. * Augmentar les possibilitats de sortida laboral dels alumnes. --- # .blue[ProgramaMe] ## Què és? El [ProgramaMe](http://www.programa-me.com/quees.php) és un concurs de programació per alumnes de FP. - 4h per resoldre entre 8 i 12 problemes, en C++ o Java. - Equips de 3 persones, 1 ordinador. - S'utilitza un jutge automàtic (de l'estil [AceptaElReto](https://www.aceptaelreto.com/)) per comprovar si els problemes estan bé. - [Problemes d'anys anteriors](https://www.aceptaelreto.com/problems/categories.php/?cat=51) - [Web ProgramaMe](http://www.programa-me.com/2020/reg/) --- # .blue[Problemes] * Problemes contextualitzats * Sempre llegeixen les dades desde la .blue[entrada estàndar] (`Scanner`) * Sempre mostren la solució mitjançant la .blue[sortida estàndar] (`System.out.print()`) .center[[Reduciendo envases](https://www.aceptaelreto.com/problem/statement.php?id=532&cat=125)] * Comproveu que funcione el vostre programa. * Podeu redirigir la entrada estàndar des d'un fitxer ```bash javac Problema.java java Problema < entrada.txt ``` --- # .blue[Jutge] * Els problemes s'autocorregeixen mitjançant un jutge automàtic. * Enviament de probelems. * Possibles resultats: * .blue[Accepted (AC)]: El problema s'ha resolt correctament. * .blue[Wrong Answer (WA)]: El problema s'ha executat correctament, però no s'ha resolt el problema. * .blue[Time Limit (TL)]: El problema ha superat el llímit de temps. * .blue[Memory Limit (ML)]: El problema ha superat el llímit de memòria. * .blue[Presentation Error (PE)]: El problema s'ha resolt correctament, però hi ha un problema amb la sortida. --- # .blue[Entrada] * Casos de prova * [Reduciendo envases](https://www.aceptaelreto.com/problem/statement.php?id=532&cat=125) ```java int nCases = in.nextInt(); while( nCases > 0 ) { entrada = llegirEntrada(); resultat = resoldreProblema(entrada); imprimir(resultat) nCases--; } ``` ```java int nCases = in.nextInt(); for( int i=0; i
--- # .blue[Solució:] Reduciendo envases ```java import java.util.Scanner; public class Envases { public static void main(String[] args) { Scanner in = new Scanner(System.in); int nCases = in.nextInt(); while(nCases > 0) { int pesNet = in.nextInt(); int pesTotal = in.nextInt(); int resultat = pesTotal - pesNet; System.out.println(resultat); nCases--; } } } ``` --- # .blue[Entrada] * Acaba en 0 * [Desembalse](https://www.aceptaelreto.com/problem/statement.php?id=535&cat=125) ```java while(True) { entrada = llegirEntrada(); if(entrada == 0) break; resultat = resoldreProblema(entrada); imprimir(resultat) } ``` * COMBINATS! * [La botella ganadora](https://www.aceptaelreto.com/problem/statement.php?id=533&cat=125) --- # .blue[Entrada] * Fins al final * [Huerto ecológico](https://www.aceptaelreto.com/problem/statement.php?id=536&cat=125) ```java while(in.hasNextLine()) { entrada = llegirEntrada(); resultat = resoldreProblema(entrada); imprimir(resultat) } ``` --- # .blue[Sortida] * Fixeu-se bé en que us demanen! ```java System.out.print(); System.out.println(); System.out.printf(); ``` * No deixeu espais en blanc al final de cada línia. * Pot suposar _PresentationError_ --- # .blue[Consideracions] * Resoldre abans el problema que codificar-lo! * Realitzeu comprovacions abans d'enviar el problema! * Proveu diferents entorns de programació i trieu-ne un. * Que no us asuste utilitzar el terminal, és el vostre millor aliat. --- # .blue[Errors comuns] * Si vols llegir un enter, i despres una línia, cal netejar el búffer! ```java 3 primera línia segona línia tercera línia ``` ```java int nLinies = in.nextInt(); in.nextLine(); // Netejem el salt de línia final while( nLinies-- > 0 ) { String linia = in.nextLine(); } ``` --- # .blue[Blibliografía] * [Skiena, Steven S., Revilla, Miguel A. _Programming Challenges, The Programming Contest Training Manual_](http://acm.cs.buap.mx/downloads/Programming_Challenges.pdf)