ACM – ICPC Bolivia Solucionario Consolidado Utilizando PSeInt 2da Olimpiada Boliviana de Informática Estado Plurinacional de Bolivia, febrero de 2013 Alberto J. Suxo Riveros <[email protected]> Alberto J. Suxo Riveros 1 ACM – ICPC Bolivia Contenidos Fase 4 – Final Nacional....................................................................................................... 1 Problema A: Distancia de Hamming .............................................................................. 1 Problema B: Hallando números capicúas ....................................................................... 3 Problema C: Poema......................................................................................................... 5 Problema D: La Última Esperanza ................................................................................. 7 Problema E: Bolivia Word ............................................................................................ 10 Fase 3 - Departamental ..................................................................................................... 12 Problema A: Cena para Cinco....................................................................................... 12 Problema B: Código USSD .......................................................................................... 14 Problema C: Sumando Fibonacci.................................................................................. 17 Problema D: Leones ...................................................................................................... 19 Problema E: Número de la suerte ................................................................................. 21 Problema F: Aritmética Maya ....................................................................................... 24 Problema G: Narcisos ................................................................................................... 26 Fase 2 - Regional .............................................................................................................. 28 Problema A: Trinomios Triangulares ........................................................................... 28 Problema B: Calculadora Inca ...................................................................................... 30 Problema C: Aritmética ................................................................................................ 32 Problema D: Bender ...................................................................................................... 35 Problema E: Eratóstenes ............................................................................................... 37 Problema F: Examen ..................................................................................................... 39 Problema G: Lago ......................................................................................................... 42 Problema H: Química ................................................................................................... 44 Anexo ................................................................................................................................ 46 Opciones del Lenguaje .................................................................................................. 46 PSeInt ............................................................................................................................ 47 Alberto J. Suxo Riveros 2 ACM – ICPC Bolivia Fase 4 – Final Nacional Problema A: Distancia de Hamming Autor: Jorge Terán La distancia de Hamming entre dos números está definida como el número de posiciones en sus representaciones binarias en las que difieren. Los ceros a la izquierda son usados si son necesarios para que a las representaciones binarias tengan misma longitud. Por ejemplo, los números 11010 y 01100 difieren en la primera, tercera y cuarta posición, así que dan una distancia de Hamming de 3. La entrada son cadenas que contienen las representaciones binarias de ciertos números (cada par de números tiene la misma longitud). Debe devolver las distancias de Hamming de todos los pares de números dados. Entrada La primera línea tendrá un número N, que es la cantidad de casos de prueba. Seguido de N líneas, En cada línea se vienen dos cadenas con las representaciones binarias separadas por un espacio. Cada cadena tendrá entre 1 y 50 caracteres, inclusive. Todos los elementos de números contendrán sólo los caracteres 1 y 0. Salida La salida consiste en una línea para cada caso de prueba que contiene la distancia Hamming. Ejemplo de entrada 3 11010 01100 10000001 10000001 11111111 00000000 Ejemplo de salida 3 0 8 Alberto J. Suxo Riveros 1 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Distancia de Hamming Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* Proceso Hamming Definir N, i, j, cnt Como Entero; Definir a, b Como Caracter; Leer N; Para i<-1 Hasta N Con Paso 1 Hacer Leer a, b; cnt <- 0; Para j<-0 Hasta Longitud(a)-1 Con Paso 1 Hacer Si Subcadena(a,j,j) <> Subcadena(b,j,j) Entonces cnt <- cnt + 1; FinSi FinPara Escribir cnt; FinPara FinProceso Alberto J. Suxo Riveros 2 ACM – ICPC Bolivia Problema B: Hallando números capicúas Autor: Jorge Terán Tome un número, lo invierte, luego lo suma al número original, luego otra vez lo invierte y lo suma. Este proceso se repite hasta que la suma sea capicúa o se haya hecho 100 sumas. Por ejemplo el 14 lo invertimos y obtenemos 41 sumamos al número original obteniendo 55 es capicúa. Imprimimos 55. Otro ejemplo 95+59=154. Invertimos y sumamos 154+451=605. Repetimos el proceso 605+506=1111 que es capicúa. Entrada La primera fila tendrá un número N que es el número de datos de entrada, seguido de N líneas, cada línea consiste de un numero entero n ≤ 500 un una línea. Salida Por cada números de entrada el numero capicúa hallado. Si no existe un imprima la palabra imposible. Ejemplo de entrada 2 14 95 Ejemplo de salida 55 1111 Alberto J. Suxo Riveros 3 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Hallando números capicúas Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* SubProceso resultado <- invertir ( a ) Definir resultado Como Entero; Definir aux como Entero; aux <- 0; Mientras a > 0 Hacer aux <- (aux * 10) + (a % 10); a <- trunc(a / 10); FinMientras resultado <- aux; FinSubProceso Proceso Capicuas Definir N, i, cnt, A, B Como Entero; Definir seguir Como Logico; Leer N; Para i<-1 Hasta N Con paso 1 Hacer Leer A; cnt <- 0; seguir <- verdadero; Mientras seguir Hacer B <- invertir( A ); Si A = B Entonces seguir <- falso; Sino A <- A + B; FinSi cnt <- cnt + 1; Si cnt=100 Entonces seguir <- falso; FinSi FinMientras Si cnt = 100 Entonces Escribir "Imposible"; Sino Escribir A; FinSi FinPara FinProceso Alberto J. Suxo Riveros 4 ACM – ICPC Bolivia Problema C: Poema Autor: Alberto Suxo Como cada año, en el colegio de José se organiza todo un evento por el día de la madre. Comenzará con un himno, coreografías de bailes, una pequeña obra de teatro, una banda de estudiantes tocará un tema especialmente dedicado y, por último, un poema, (a cargo de José). Pero, José está muy nervioso, ha hecho todo lo posible para memorizar el poema. Sus amigos decidieron ayudar a José quitando todas las vocales del poema y remplazarlos por guiones, luego dejaron que José lo lea para ver si realmente lo ha memorizado todo. El problema es que los amigos de José quieren estar seguros de remplazarlos bien sin arruinar el poema, para lo cual decidieron hacerlo mediante un programa. Tu trabajo es ayudar a estos niños. Entrada La primera línea tendrá un número entero N (0 < N < 1000) que representa el número de líneas que tendrá el poema. Cada línea del poema tendrá un máximo de 100 caracteres que contendrá: mayúscula (A-Z), minúscula (a-z), espacios ( ), puntos (.) y comas (,). Salida En la salida se mostrará el poema sin vocales como se muestra en el ejemplo de salida. Ejemplo de entrada 5 Creci de a poco con tu calor, me alimentaba con tus caricias y frases de amor. Con miedo de perderte... Se hizo la luz Ejemplo de salida Cr-c- d- - p-c- c-n t- c-l-r, m- -l-m-nt-b- c-n t-s c-r-c--s y fr-s-s d- -m-r. C-n m--d- d- p-rd-rt-... S- h-z- l- l-z Alberto J. Suxo Riveros 5 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Poema Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* SubProceso resultado <- esVocal( ch ) Definir resultado Como Logico; Definir c Como Caracter; c <- Minusculas( ch ); Si c="a" | c="e" | c="i" | c="o" | c="u" Entonces resultado <- verdadero; Sino resultado <- falso; FinSi FinSubProceso Proceso Poema Definir n, i, j Como Entero; Definir linea Como Caracter; Definir car, temporal Como Caracter; Leer n; Para j<-1 Hasta n Hacer Leer linea; Para i<-0 Hasta Longitud(linea)-1 Con paso 1 Hacer car <- Subcadena(linea,i,i); Si esVocal( car ) Entonces // Reemplazar un caracter :'( Si i > 0 Entonces temporal <- concatenar(Subcadena(linea,0,i-1),"-"); Sino temporal <- "-"; FinSi Si i<Longitud(linea)-1 Entonces temporal <Concatenar(temporal,Subcadena(linea,i+1,Longitud(linea)-1)); FinSi linea <- temporal; // Fin de Reemplazar un caracter :-P FinSi FinPara Escribir linea; FinPara FinProceso Alberto J. Suxo Riveros 6 ACM – ICPC Bolivia Problema D: La Última Esperanza Autor: Alvaro Rojas Los Terrans están siendo atacados por los Protoss una raza de Humanoides que aparecen en la serie Star Craft. Los Terrans ya casi sin tropas y con poca estructuras solo tienen una esperanza para vencer en esta guerra contra los Protoss. Y esa esperanza es poder usar el arma más poderosa que tienen, “la Bomba Nuclear”. Entonces necesitan un soldado para poder marcar el blanco para el ataque nuclear a los Protoss, el cual es Ghost, un soldado capaz de volverse invisible y poder infiltrarse en la base de los Protoss. Ghost se dirige hacia la Base de los Protoss y logra infiltrarse en ella para poder marcar el blanco del ataque Nuclear. Ghost está indeciso para marcar el blanco para el ataque Nuclear así que los Terrans piden tu ayuda. Ghost te enviara coordenadas de cada estructura de la base Protoss. Así que él quiere saber el número de estructuras que serán destruidas dadas las coordenadas del blanco de la bomba nuclear y el radio de alcance de esta. Entrada La primera línea es un entero T (1 ≤ T ≤ 100) el número de casos de prueba. Seguidamente se te dará un entero N (1 ≤ N ≤ 100) el número de coordenadas x, y que te enviará Ghost. A continuación vendrán N líneas, cada una de 2 valores x, y (0 ≤ x, y ≤ 1000) donde cada una representa la coordenada de una estructura Protoss. La última línea tendrá 3 valores x, y, r. Donde x, y son las coordenadas del blanco del ataque nuclear y r (1 ≤ r ≤ 500) el radio de alcance de la bomba Nuclear. Salida Para cada caso de prueba imprimir el número de estructuras Potross destruidas por la bomba Nuclear (Una estructura será destruida si la coordenada de la estructura Protoss está en el radio de alcance de la Bomba Nuclear) Alberto J. Suxo Riveros 7 ACM – ICPC Bolivia Ejemplo de entrada 3 2 1 1 1 0 0 0 1 2 1 1 1 0 0 0 5 2 0 0 50 50 5 5 10 Ejemplo de salida 1 2 1 El gráfico corresponde al primer caso de prueba, donde claramente podemos notar que el alcance del radio de la bomba nuclear llega a tocar el punto (1, 0) (Pues la distancia del punto de la estructura Protoss a la bomba es menor o igual al radio de alcance de la bomba), por lo tanto la Bomba destruye una estructura, en cambio la estructura que se encuentra en el punto (1, 1) no es alcanzada por la bomba Nuclear. Alberto J. Suxo Riveros 8 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Ultima Esperanza Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* SubProceso resultado <- distancia( P1x, P1y, P2x, P2y) Definir resultado Como Real; resultado <- RC( (P1x-P2x)^2 + (P1y-P2y)^2 ); FinSubProceso Proceso UltimaEsperanza Definir t, n, coords, X, Y Como Entero; Definir bombX, bombY, radio Como Entero; Definir i, total Como Entero; Dimension coords[1001,2]; // alamacenaremos todas las coordenadas en las columnas // correspondientes, X en la primera columna y Y en la segunda. X <- 0; Y <- 1; Leer t; Mientras t > 0 Hacer t <- t - 1; Leer n; Para i <- 0 Hasta n-1 Hacer Leer coords[i,X]; Leer coords[i,Y]; FinPara // leer datos de la bomba Leer bombX, bombY, radio; total <- 0; Para i <- 0 Hasta n-1 Hacer Si distancia( coords[i,X], coords[i,Y], bombX, bombY)<= radio Entonces total <- total + 1; FinSi FinPara Escribir total; FinMientras FinProceso Alberto J. Suxo Riveros 9 ACM – ICPC Bolivia Problema E: Bolivia Word Autor: Alvaro Rojas La organización de la IOI BOLIVIA hizo hacer letras de tamaño grande, para poder ponerlas en varios lugares del evento. Mientras transportaban el paquete que almacenaba las letras este se rompió y dejo caer las letras, al caer las letras varias de estas se perdieron. Así que ellos no están seguros si con las letras restantes podrán armar las palabras que ellos querían. Por ejemplo si tenemos las letras O, I, L, I, B, V, A, Z, T y queremos armar la palabra BOLIVIA, notaremos claramente que es posible armarla. En cambio si tuviéramos las letras O, L, I, B, V, A, Z, T no será posible armar la palabra BOLIVIA pues no faltaría una letra (la letra I). Los organizadores piden tu ayuda. Ellos te darán las letras disponibles y quieren saber si es posible armar la palabra BOLIVIA. Entrada La primera línea contendrá un entero N (1 ≤ N ≤ 10) el número de casos de prueba. A continuación se te dará N líneas, cada una con una cadena (solo mayúsculas), donde cada carácter representa la letra disponible para armar la palabra BOLIVIA. Salida Para cada cadena que se te dio anteriormente, si es posible armar la palabra BOLIVIA imprimir “ES POSIBLE”, caso contrario “NO ES POSIBLE”'. Ejemplo de entrada 3 BOLIVIA BOOIILVA BOLVZATY Ejemplo de salida ES POSIBLE ES POSIBLE NO ES POSIBLE Alberto J. Suxo Riveros 10 ACM – ICPC Bolivia Solución // Olimpiada Boliviana De Informatica // Problema : Bolivia Word // Autor : Alberto Suxo // Copyright: Team SIM // Lenguaje : Pseudocodigo PSeInt // ******************************* Proceso BoliviaWord Definir N, j, k Como entero; Definir linea Como caracter; Definir car Como caracter; Definir B, O, L, I, V, A como Entero; Leer N; Para k <- 1 Hasta N Con Paso 1 Hacer Leer linea; B <- 0; O <- 0; L <- 0; I <- 0; V <- 0; A <- 0; Para j <- 0 Hasta Longitud(linea)-1 Con paso 1 Hacer car <- Subcadena(linea,j,j); Si car="B" Entonces B <- B + 1; Sino Si car="O" Entonces O <- O + 1; sino Si car="L" Entonces L <- L + 1; Sino Si car="I" Entonces I <- I + 1; Sino Si car="V" Entonces V <- V + 1; Sino Si car="A" Entonces A <- A + 1; FinSi FinSi FinSi FinSi FinSi FinSi FinPara Si B<1 | O<1 | L<1 | I<2 | V<1 | A<1 Entonces Escribir "NO ES POSIBLE"; Sino Escribir "ES POSIBLE"; FinSi FinPara FinProceso Alberto J. Suxo Riveros 11 ACM – ICPC Bolivia Fase 3 - Departamental Problema A: Cena para Cinco Autor: Gabriel Rea En un popular show llamado Cena para cinco, cinco concursantes compiten preparando delicias culinarias. Todas las noches uno de ellos hace la cena los otros cuatro lo califican entre 1 y 5. La cantidad de puntos que un concursante obtiene es igual a la suma de puntos que obtuvo. El ganador del programa de televisión es por supuesto el que obtiene más puntos. Escribe un programa que determine al ganador y cuantos puntos obtuvo. Entrada La primera línea contendrá un entero N (1 ≤ N ≤ 10) el número de casos de prueba. Cada caso de prueba está dado en cinco líneas, cada una contiene 4 enteros, los puntos que cada concursante obtuvo. Los concursantes están numerados del 1 al 5 en el orden en que sus puntajes son dados. Se garantiza que la entrada genera una solución única. Salida La salida es una línea con el número del ganador y sus puntos separados por un espacio. Ejemplos de entrada 5 4 4 5 5 4 4 4 5 5 4 4 5 5 5 4 4 4 4 5 4 4 3 3 5 4 3 5 5 5 2 4 5 5 5 1 4 4 4 4 Ejemplos de salida 4 19 2 17 Alberto J. Suxo Riveros 12 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Cena para Cinco Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* Proceso Cena Definir N, i, j, k, sum, puntos, ganador, x Como Entero; Leer N; Para k<-1 Hasta N Hacer puntos <- 0; ganador <- 0; Para i<-1 Hasta 5 Hacer sum <- 0; Para j<-1 Hasta 4 Hacer Leer x; sum <- sum + x; FinPara Si sum > puntos Entonces puntos <- sum; ganador <- i; FinSi FinPara Escribir ganador , " " , puntos; FinPara FinProceso Alberto J. Suxo Riveros 13 ACM – ICPC Bolivia Problema B: Código USSD Autor: Jorge Terán La empresa telefónica está implementando los códigos USSD para comunicarse con los teléfonos celulares de sus clientes para los cual te ha contratado con la finalidad de que elabores un programa que determine si un código USSD es válido. Los códigos USSD consisten de un texto que contiene un caracter asterisco seguido de un número de tres caracteres numéricos, continúa un segundo asterisco, sigue una cantidad variable de caracteres numéricos y termina con un caracter numeral. Por Ejemplo: *109*123456# . Se consideran códigos validos los que cumplen esta especificación. Entrada La primera línea contiene el número de casos de prueba. Las líneas siguientes contienen un caso de prueba. Salida Por cada caso de prueba imprima la frase "bien" si la cadena de caracteres es un código USSD valido ó "mal" si es código USSD es invalido. Ejemplos de entrada 8 *109*1234# *1234*109# *109*109# *109*1234#2 *109*109 109*109# *abc*1234# *109*ab34# Ejemplos de salida bien mal bien mal mal mal mal mal Alberto J. Suxo Riveros 14 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Código USSD Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* SubProceso resultado <- NoEsValido( car ) Definir resultado Como Logico; Si car="0" | car="1" | car="2" | car="3" | car="4" | car="5" | car="6" | car="7" | car="8" | car="9" Entonces resultado <- falso; Sino resultado <- verdadero; FinSi FinSubProceso Proceso CodigoUSSD Definir casos, tam, i, j Como Entero; Definir cad, num Como Caracter; Definir sw Como Logico; Leer casos; Para i<-1 Hasta casos Hacer Leer cad; Si Subcadena(cad,0,0)<>"*" Entonces Escribir "mal"; Sino Si Subcadena(cad,4,4)<>"*" Entonces Escribir "mal"; Sino tam <- Longitud(cad); Si Subcadena(cad,tam-1, tam-1)<>"#" Entonces Escribir "mal"; Sino sw <- Verdadero; num <- Subcadena(cad,1,4); Escribir num; Para j<-0 Hasta 2 Hacer Si NoEsValido( Subcadena(num,j,j) ) Entonces sw <- falso; FinSi FinPara Si sw Entonces num <- Subcadena(cad,5,tam-1); Escribir num; Para j<-0 Hasta Longitud(num)-2 Hacer Si NoEsValido( subcadena(num,j,j) ) Entonces sw <- falso; FinSi Alberto J. Suxo Riveros 15 ACM – ICPC Bolivia FinPara FinSi Si sw Entonces Escribir "bien"; Sino Escribir "mal"; FinSi FinSi FinSi FinSi FinPara FinProceso Alberto J. Suxo Riveros 16 ACM – ICPC Bolivia Problema C: Sumando Fibonacci Autor: Jorge Terán La serie de Fibonacci es aquella que se forma por la expresión f(n) = f(n - 1) + f(n - 2). Los primeros números de la serie son 1, 1, 2, 3, 5, 8, 13, 21, … Podemos representar cada número entero como una suma de números Fibonacci. Por ejemplo el número 33 puede expresarse como: 33 = 1 * 1 + 0 * 2 + 1 * 3 + 0 * 5 + 1 * 8 + 0 * 13 + 1 * 21 Tomando solamente los números binarios tendríamos Fib(33) = 1010101 Otros ejemplos son: Fib(18) = 000101 Fib(6) = 1001 Entrada La entrada de datos consiste en una línea con la representación de un número como la suma de números Fibonacci. Termina cuando no hay más datos. Vea que cuando lea la línea de entrada leerá caracteres 1 y 0 que se representan como los ascii 48 y 49 respectivamente. Salida La salida consiste en el número entero representado por la representación leída. Se imprime un número en una línea por cada línea de entrada. Ejemplos de entrada 1010101 000101 1001 Ejemplos de salida 33 18 6 Alberto J. Suxo Riveros 17 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Sumando Fibonacci Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* Proceso Fibo Definir linea Como Caracter; Definir tam, i, valor Como Entero; Definir vec Como Entero; Dimension vec[100]; Leer linea; tam <- Longitud( línea ); vec[0] <- 1; vec[1] <- 2; Para i<-2 Hasta tam Hacer vec[i] <- vec[i-1] + vec[i-2]; FinPara valor <- 0; Para i<-0 Hasta tam-1 Hacer Si Subcadena( linea, i, i )="1" Entonces valor <- valor + vec[i]; FinSi FinPara Escribir valor; FinProceso Alberto J. Suxo Riveros 18 ACM – ICPC Bolivia Problema D: Leones Autor: Leticia Blanco En la selva se han mimetizado varios leones, grrrrr....., debemos pasar la selva.... es necesario.... pero no queremos morir....... :S, - piensa Hugo; pero como debe guardar compostura y mantener la calma con sus hermanos Paco y Luis; no muestra su temor. Más al contrario ha decidido buscar cuántos leones hay mimetizados para saber el número de balas que debe cargar si es necesario tomar alguna medida de emergencia. Pero hay un problema y es que la selva de letras que deben atravesar puede ser muy tupida y complicada; por lo que ha decidido recordar sus dotes de programador y no ha tenido éxito. Por lo que ha solicitado que escribas un programa para encontrar el número de leones, dado que se tiene la selva de letras. Entrada La entrada consiste de un número entero n que indica la cantidad de casos, le siguen n líneas con cadenas de hasta 200 caracteres en mayúscula. Cada una de estas cadenas representa una selva de letras. Salida La salida es un número entero, que indica la cantidad de leones que hay en la selva. Ejemplos de entrada 2 SELVADELEJEMPLODONDESEENCUNETRANDOSLEONES LEONIDASUNGRANGUERRERODELAANTIGUAGRECIA Ejemplos de salida 2 1 Alberto J. Suxo Riveros 19 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Leones Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* SubProceso posi <- buscar (selva, letra, pos ) Definir posi Como Entero; Definir i Como Entero; posi <- -1; i <- pos ; Mientras i < Longitud(selva) & posi = -1 Hacer Si Subcadena(selva,i,i) = letra Entonces posi <- i; FinSi i <- i + 1; FinMientras FinSubProceso // retornará 'posi' SubProceso cant <- contarLeon ( selva ) Definir cant Como Entero; Definir pos, i Como Entero; Definir leon, letra Como Caracter; leon <- "LEON"; i <- 0; pos <- 0; cant <- 0; Mientras pos <> -1 Hacer Si i < 4 Entonces letra <- Subcadena( leon, i, i ); pos <- buscar ( selva, letra, pos ); Si pos <> -1 Entonces pos <- pos + 1; FinSi i <- i + 1; FinSi Si i = 4 & pos <> -1 Entonces cant <- cant + 1; i <- 0; FinSi FinMientras FinSubProceso // retornará 'cant' Proceso Leones Definir n, i Como Entero; Definir selva Como Caracter; Leer n; Para i <- 1 Hasta n Hacer Leer selva; Escribir contarLeon( selva ); FinPara FinProceso Alberto J. Suxo Riveros 20 ACM – ICPC Bolivia Problema E: Número de la suerte Autor: Jorge Terán En la teoría de números, un número de la suerte es un número natural en un conjunto que se genera por una criba similar a la Criba de Eratóstenes que genera los números primos. Comenzando con una lista de números enteros a partir de 1: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, … Se eliminan los números de dos en dos, todos los números pares; en esta primera iteración sólo quedan los números impares: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, … El segundo término de esta secuencia es 3. Entonces se eliminan todos los números de tres en tres: 1, 3, 7, 9, 13, 15, 19, 21, 25, … El tercer número que ha quedado es 7, así que cada séptimo número que queda se elimina: 1, 3, 7, 9, 13, 15, 21, 25, … Dado que este procedimiento se repite indefinidamente, los sobrevivientes son los números de la suerte: 1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, 87, 93, 99, … La lista anterior es también la lista de números de la suerte menores a 100. Entrada No existe entrada como tal, el estudiante debe asumir que buscamos los números de la suerte menores a 200. Salida Imprima en una línea cuantos números de la suerte existen menores a 200. Por ejemplo, para 100 es 23. Alberto J. Suxo Riveros 21 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Número de la suerte Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* // Cuenta el número de elementos del vector 'numeros' SubProceso resultado <- tam ( numeros ) Definir resultado Como Entero; Definir i como entero; i <- 0; Mientras numeros[i] > 0 Hacer i <- i + 1; FinMientras resultado <- i; FinSubProceso // Quita el elemento i del vector 'numeros' SubProceso quitar( numeros, i ) Definir j Como Entero; j <- i; Mientras numeros[j]>0 hacer numeros[j]<-numeros[j+1]; j <- j + 1; FinMientras FinSubProceso Proceso Suerte Definir max, i, j, vil, c, a, it, numerosTam Como Entero; Definir numeros Como Entero; Definir sw Como Logico; max <- 200; // <- buscamos en entre los primeros 200 Dimension numeros[201]; i <- 1; j <- 0; Mientras i <= max Hacer numeros[j] <- i; i <- i + 2; j <- j + 1; FinMientras sw <- Verdadero; numeros[j] <- 0; it <- 1; Mientras sw Hacer vil <- numeros[it]; it <- it + 1; numerosTam <- tam( numeros ); c <- numerosTam % vil; Alberto J. Suxo Riveros 22 ACM – ICPC Bolivia a <- numerosTam - c - 1; Si vil >= numerosTam Entonces sw <- falso; Sino i <- a; Mientras i>1 Hacer quitar( numeros, I ); i <- i - vil; FinMientras FinSi FinMientras Escribir numerosTam; FinProceso Alberto J. Suxo Riveros 23 ACM – ICPC Bolivia Problema F: Aritmética Maya Autor: Jorge Terán Los Mayas tenían una forma de escribir números que les permitía hacer los cálculos. La notación de sus números era con puntos y rayas que las representaremos por guiones. Cada punto representa la unidad y una raya representa 5 unidades. Veamos: -.. representaría el número 7, esto es una raya cinco más dos puntos da siete. Cada vez que tenemos 5 unidades, o sea 5 puntos se cambian por una raya. El número más grande que se puede representar es el 20 que son cuatro rayas. Como ejemplo veamos el siguiente número Maya --. .. -... --Cada una de las líneas representa un dígito Maya, por lo que las 4 líneas representan los dígitos 11, 2, 8, 15 que en notación decimal es 88975. El dígito 0 se representa con un cero en una sola línea. El digito menos significativo es el 15. Entrada La entrada contiene múltiples casos de entrada. La primera línea tiene el número de casos de prueba. Cada caso de prueba contiene 4 líneas. Cada línea contiene un número de cuatro dígitos en representación Maya. Salida Imprima en una línea el equivalente decimal del número Maya. Ejemplos de entrada 4 --. .. -... --. 0 0 0 --. . 0 0 0 0 0 - Alberto J. Suxo Riveros Ejemplos de salida 88975 8000 88400 5 24 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Aritmética Maya Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* Proceso Maya Definir casos, c1, decimal, i, j, unos, cincos Como Entero; Definir maya Como Caracter; Leer casos; Para c1<-1 Hasta casos hacer decimal <- 0; Para i<-0 Hasta 3 hacer Leer maya; unos <- 0; cincos <- 0; Para j<-0 Hasta Longitud(maya)-1 Hacer Si Subcadena(maya,j,j)="-" Entonces cincos <- cincos + 1; Finsi Si Subcadena(maya,j,j)="." Entonces unos <- unos + 1; finsi finpara decimal <- decimal*20+(cincos*5+unos); finpara escribir decimal; finpara FinProceso Alberto J. Suxo Riveros 25 ACM – ICPC Bolivia Problema G: Narcisos Autor: Leticia Blanco Como te imaginarás en el mundo de los números hay variedad de sociedades, una muy marcada es la comunidad de narcisistas. Estos ciudadanos son especiales y tienen niveles de alcurnia que están denotados por e, por ejemplo el 153 es un narcisista de nivel 3, ya que la suma de sus cifras elevadas al cubo suman el mismo número: 153 = 13 + 53 + 33. En general un número narciso num que tiene la forma: dn…d3d2d1d0, se dice que es narcisista de nivel de alcurnia e, si se cumple que num = dne +…+ d3e + d2e + d1e + d0e. En esta comunidad especial, es necesario identificar el nivel de alcurnia de algunos números si son narcisos. Para ello se cuenta con el número y sobre la base de esta información debes decidir cuál es el nivel de alcurnia del narciso. Se sabe que en esta comunidad ningún narciso tiene nivel de alcurnia menor a 2 ni mayor a 6. Por supuesto, hay números que quieren pasar por narcisos, en caso de no demostrar su alcurnia dentro los cañones de la comunidad, se debe emitir -1 como respuesta. Entrada La entrada consiste de un número entero c que indica la cantidad de casos. En las próximas c líneas están los números que quieren demostrar su nivel de narcisismo. Salida La salida por cada caso es el nivel de alcurnia del supuesto narciso. Ejemplos de entrada 3 153 1 22 Ejemplos de salida 3 2 -1 Alberto J. Suxo Riveros 26 ACM – ICPC Bolivia Solución // Olimpiada Boliviana De Informatica // Problema : Narcisos // Autor : Alberto Suxo // Copyright: Team SIM // Lenguaje : Pseudocodigo PSeInt // ******************************* SubProceso procesar( n ) Definir res, suma, copia, i Como Entero; Definir narciso Como Logico; narciso <- falso; i <- 2; Mientras i <= 6 & ~ narciso Hacer copia <- n; suma <- 0; mientras copia > 0 Hacer suma <- suma + (copia%10)^i; copia <- copia / 10; FinMientras narciso <- (suma=n); res <- i; i <- i + 1; FinMientras Si narciso Entonces Escribir res; Sino Escribir -1; FinSi FinSubProceso Proceso Narcisos Definir n, i, num Como Entero; Leer n; Para i<-1 Hasta n Hacer Leer num; procesar( num ); FinPara FinProceso Alberto J. Suxo Riveros 27 ACM – ICPC Bolivia Fase 2 - Regional Problema A: Trinomios Triangulares Autor: Jorge Terán Consideremos la siguiente expresión: (1 + x + x2)n Dado un valor de n se quiere conocer cuál es valor de los coeficientes de la expresión. Por ejemplo si n toma el valor de 1 los términos de la expresión son 1, 1, 1. Cuando n = 2 tenemos 1 + 2x + 3x2 + 2x3 + x4 por lo que la respuesta es 1, 2, 3, 2, 1 Entrada La primera línea contiene un número que indica el número de casos de prueba. En una línea viene un caso de prueba que contiene el numero 0 ≤ n ≤ 40 exponente de la expresión. Salida Por cada caso de prueba su programa debe escribir en una línea y separados por un espacio los coeficientes del polinomio resultante. Ejemplos de entrada 3 1 2 0 Ejemplos de salida 1 1 1 1 2 3 2 1 1 Alberto J. Suxo Riveros 28 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Trinomios Triangulares Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* Proceso Trinomiales // pre-calculamos todo // debemos llegar a la siguiente matriz: // 1 0 0 // 1 1 1 0 0 // 1 2 3 2 1 0 0 // 1 3 6 7 6 3 1 0 0 // 1 ..... Definir Mat Como Entero; Definir i, j, k, sum Como Entero; Definir casos, n Como Entero; Dimension Mat[41,84]; Mat[0,0] <- 1; Mat[0,1] <- 0; Mat[0,2] <- 0; Para i<-1 hasta 40 hacer Para j<-0 Hasta i*2 Hacer sum <- 0; Para k<-(j-2) Hasta j Hacer Si k>=0 entonces sum <- sum + Mat[i-1,k]; FinSi FinPara Mat[i,j] <- sum; FinPara Mat[i,i*2+1] <- 0; Mat[i,i*2+2] <- 0; FinPara // Leemos los datos Leer casos; Mientras casos>0 Hacer Leer n; casos <- casos - 1; j <- 0; Mientras Mat[n,j]>0 Hacer Escribir Mat[n,j]; j <- j + 1; FinMientras FinMientras FinProceso Alberto J. Suxo Riveros 29 ACM – ICPC Bolivia Problema B: Calculadora Inca Autor: Jorge Terán La Calculadora de los Incas denominada Yupana consiste de una base parecida a la base binaria. Los números se representan por varios unos y ceros que se dividen en 4 grupos como se muestra: 00000 000 00 0 Cada grupo representa a un número específico y corresponden a los números 5, 3, 2, 1. Cuando queremos representar un número simplemente colocamos en 1 en algunos de los 0 de las columnas. Por ejemplo para representar el numero 12 escogemos dos números de la columna de los cincos y uno de la columna del dos y escribimos: 00011 000 01 0 Un mismo número puede tener múltiples representaciones. La siguiente tabla muestra varias representaciones y su equivalente decimal. 00000 00000 00011 00000 00001 000 000 000 011 000 01 11 00 00 00 0 0 0 0 1 =2 =4 = 10 =6 =6 Hay que hacer notar que hay varias interpretaciones diferentes de una Yupana y esta es una de ellas, no hay un consenso sobre el tema. Entrada La primera línea contiene un número que indica el número de casos de prueba. Cada caso de prueba contiene una línea con la representación en el formato de la Yupana que consiste en 11 números 1 o ceros. Salida Por cada caso de prueba su programa debe escribir en una línea y separados por un espacio la representación en formato decimal del número en formato de Yupana. Ejemplos de entrada 5 00000000010 00000000110 00011000000 00000011000 00001000001 Alberto J. Suxo Riveros Ejemplos de salida 2 4 10 6 6 30 ACM – ICPC Bolivia Solución // Olimpiada Boliviana De Informatica // Problema : Calculadora Inca // Autor : Alberto Suxo // Copyright: Team SIM // Lenguaje : Pseudocodigo PSeInt // ******************************* Proceso CalculadoraInca Definir casos, i, total Como Entero; Definir cad Como Caracter; Leer casos; Para i<-1 Hasta casos Hacer total <- 0; Leer cad; Si Subcadena(cad, 0, 0) = "1" Entonces total <- total + 5; FinSi Si Subcadena(cad, 1, 1) = "1" Entonces total <- total + 5; FinSi Si Subcadena(cad, 2, 2) = "1" Entonces total <- total + 5; FinSi Si Subcadena(cad, 3, 3) = "1" Entonces total <- total + 5; FinSi Si Subcadena(cad, 4, 4) = "1" Entonces total <- total + 5; FinSi Si Subcadena(cad, 5, 5) = "1" Entonces total <- total + 3; FinSi Si Subcadena(cad, 6, 6) = "1" Entonces total <- total + 3; FinSi Si Subcadena(cad, 7, 7) = "1" Entonces total <- total + 3; FinSi Si Subcadena(cad, 8, 8) = "1" Entonces total <- total + 2; FinSi Si Subcadena(cad, 9, 9) = "1" Entonces total <- total + 2; FinSi Si Subcadena(cad, 10, 10) = "1" Entonces total <- total + 1; FinSi Escribir total; FinPara FinProceso Alberto J. Suxo Riveros 31 ACM – ICPC Bolivia Problema C: Aritmética Autor: Hernan Payrumani En la clase de matemática el profesor a veces se siente cansado y para que el tiempo pase rápido da de tarea unas operaciones aritméticas. Las operaciones a veces son cortas como 10 dígitos de longitud, pero a veces son largas con 100 dígitos de longitud. Es estos días donde tu profesor esta aburrido tú también lo estas, por eso prefieres que tu computadora resuelva estos ejercicios de aritmética, por lo tanto primero debes escribir un programa que te devuelva los resultados de estas operaciones Entrada La Primera línea contiene el número de casos de entrada, cada caso de entrada contiene 3 líneas. La primera línea contiene un entero positivo x, el primer operando. La segunda línea contiene un caracter ‘+’ o ‘*’representando la suma y la multiplicación. La tercera línea contiene un entero positivo y, el segundo operando. Los enteros x e y son potencias de 10 de hasta 10 dígitos. Salida El resultado de la operación entre x e y. Ejemplos de entrada 4 1000 * 100 10000 + 10 10 + 1000 1 * 1000 Ejemplos de salida 100000 10010 1010 1000 Alberto J. Suxo Riveros 32 ACM – ICPC Bolivia Solución // Olimpiada Boliviana De Informatica // Problema : Aritmetica // Autor : Alberto Suxo // Copyright: Team SIM // Lenguaje : Pseudocodigo PSeInt // ******************************* SubProceso Multiplicar( A, B ) Definir tamB, i Como Entero; Definir resultado Como Caracter; resultado <- A; tamB <- Longitud( B ); i <- 1; Mientras i < tamB Hacer resultado <- Concatenar( resultado, "0" ); i <- i + 1 ; FinMientras Escribir resultado; FinSubProceso SubProceso Sumar( A, B ) Definir tamA, tamB, max, i, sum Como Entero; Definir resultado Como Caracter; tamA <- Longitud( A ); tamB <- Longitud( B ); Si tamA > tamB Entonces max <- tamA; Sino max <- tamB; FinSi tamA <- tamA - max; tamB <- tamB - max; resultado <- ""; Para i<-0 Hasta max-1 Hacer sum <- 0; Si tamA>=0 & Subcadena(A,tamA,tamA)="1" Entonces sum <- sum + 1; FinSi Si tamB>=0 & Subcadena(B,tamB,tamB)="1" Entonces sum <- sum + 1; FinSi Segun sum Hacer 0: resultado <- Concatenar(resultado, "0" ); 1: resultado <- Concatenar(resultado, "1" ); 2: resultado <- Concatenar(resultado, "2" ); FinSegun tamA <- tamA + 1; tamB <- tamB + 1; FinPara Escribir resultado; FinSubProceso Alberto J. Suxo Riveros 33 ACM – ICPC Bolivia Proceso Aritmerica Definir casos Como Entero; Definir i Como Entero; Definir A, B, op Como Caracter; Leer casos; Para i <- 1 Hasta casos Hacer Leer A, op, B; Si op= "+" Entonces Sumar ( A, B ); sino // entonces op = "*" Multiplicar ( A, B ); FinSi FinPara FinProceso Alberto J. Suxo Riveros 34 ACM – ICPC Bolivia Problema D: Bender Autor: Hernan Payrumani El robot Bender es muy parecido a los humanos, en cuanto al sueño solo duerme bien cuando no tiene pesadillas. A diferencia de los humanos Bender sueña solo con dígitos binarios 0 y 1. Bender tiene pesadillas cuando sueña con dígitos distintos a 0 y 1. Por ejemplo si Bender sueña con 001111000111 el tendrá un dulce sueño. Pero si Bender sueña con 1110011111120000 Bender tendrá una pesadilla. Entrada La primera línea de entrada contiene el número de casos a ser evaluados. La primera línea de cada caso contiene c y f el número de columnas y filas de una matriz. Las siguientes líneas contienen f líneas con c dígitos entre 0 y 9. Salida Si la matriz solo contienen dígitos binarios 0, 1, imprime Dulce. Si la matriz contiene algún dígito que no es binario imprime Pesadilla Ejemplos de entrada 2 3 3 111 101 011 4 4 1110 0233 1111 0000 Ejemplos de salida Dulce Pesadilla Alberto J. Suxo Riveros 35 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Bender Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* Proceso Bender Definir n, m, i, j, casos, k Como Entero; Definir resultado, linea Como Caracter; Definir aux Como Caracter; Leer casos; Para k<-1 Hasta casos Hacer Leer n, m; resultado <- "Dulce"; Para i<-1 Hasta n Hacer Leer linea; Para j<-0 Hasta m-1 Hacer aux <- Subcadena(linea, j, j); Si aux<>"0" & aux<>"1" Entonces resultado <- "Pesadilla"; FinSi FinPara FinPara Escribir resultado; FinPara FinProceso Alberto J. Suxo Riveros 36 ACM – ICPC Bolivia Problema E: Eratóstenes Autor: Hernan Payrumani La criba de Eratóstenes es un famoso algoritmo para buscar todos los números primos hasta N. El algoritmo es: 1. Escribir todos los números entre 2 y N inclusive. 2. Buscar el menor número no tachado y llamarlo P, donde P es primo. 3. Dejando fuera P, tachar todos los múltiplos que aún no estén tachados. 4. Si todos los números no han sido tachados ir al paso 2. Escribe un programa que dado un número N y K encuentre el K-esimo entero que será tachado. Entrada La primera línea indica el número de casos a ser evaluados. Cada caso consiste en dos enteros N y K (2 ≤ K < N ≤ 1000) Saluda Imprimir el K-esimo número a ser tachado. Ejemplos de entrada 3 7 3 15 12 10 7 Ejemplos de salida 6 7 9 En el tercer ejemplo, tachamos en el siguiente orden: 2, 4, 6, 8, 10, 3, 9, 5 y 7 el séptimo número es 9. Alberto J. Suxo Riveros 37 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Eratostenes Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* Proceso Eratostenes Definir n, k, vec, cont, i, j, casos, k Como Entero; Dimension vec[500]; Leer casos; Para k<-1 Hasta casos Hacer Leer n; Leer k; cont <- 0; Para i<-2 Hasta n Hacer vec[i] <- 0; FinPara Para i<-2 Hasta n Hacer Si vec[i]=0 Entonces Para j<-i Hasta n Con Paso i Hacer Si vec[j] = 0 Entonces vec[j] <- 1; cont <- cont + 1; Si cont = k Entonces Escribir j; FinSi FinSi FinPara FinSi FinPara FinPara FinProceso Alberto J. Suxo Riveros 38 ACM – ICPC Bolivia Problema F: Examen Autor: Hernan Payrumani Alvaro, Edwin y Gabriel darán un examen para ingresar a un instituto, este instituto tiene la peculiaridad de siempre realizar exámenes de selección múltiple. Desafortunadamente ellos no siempre tienen tiempo de estudiar pero quieren aprovechar que se les dará un examen de selección múltiple, ya que ellos tienen una teoría sobre estos. Alvaro dice que tendrá mejor nota utilizando la secuencia: A, B, C, A, B, C, A, B, C ... Edwin está convencido de que la mejor secuencia: es B, A,B, C, B, A, B, C, B, A, B, C... Gabriel utilizara la secuencia: C, C, A, A, B, B, C, C, A, A, B, B ... Tu tarea es determinar las respuestas correctas para el examen y así determinar quién de los tres tenía razón con su secuencia, la cual es la que contiene más respuestas correctas. Entrada La primera línea contiene un entero N (1 ≤ N ≤ 100), la cantidad de preguntas en el examen. La segunda línea contiene una cadena con N letras ´A’, ’B’, ’C´ Estas son en orden las respuestas correctas de las preguntas del examen. Salida En la primera línea imprime M, la cantidad máxima de respuestas correctas de uno de los tres. Después imprime los nombres de los chicos en orden alfabético de quienes tienen M respuestas correctas. Ejemplos de entrada 5 BAACC 9 AAAABBBBB Ejemplos de salida 3 Edwin 4 Alvaro Edwin Gabriel Alberto J. Suxo Riveros 39 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Examen Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* Proceso Examen Definir len Como Entero; Definir linea, abc, babc, ccaabb Como Caracter; Definir ptsAlvaro, ptsEdwin, ptsGabriel Como Entero; Definir i, maximo Como Entero; Definir car Como Caracter; abc <- "ABC"; babc <- "BABC"; ccaabb <- "CCAABB"; Leer len; Leer linea; ptsAlvaro <- 0; ptsEdwin <- 0; ptsGabriel <- 0; Para i<-0 Hasta len-1 hacer car <- Subcadena( linea, i, i ); Si car = Subcadena( abc, i%3, i%3) Entonces ptsAlvaro <- ptsAlvaro + 1; FinSi Si car =Subcadena( babc, i%4, i%4) Entonces ptsEdwin <- ptsEdwin + 1; FinSi Si car = Subcadena( ccaabb, i%6, i%6 ) Entonces ptsGabriel <- ptsGabriel + 1; FinSi FinPara // encontrar el maximo maximo <- 0; Si ptsAlvaro > maximo Entonces maximo <- ptsAlvaro; FinSi Si ptsEdwin > maximo Entonces maximo <- ptsEdwin; FinSi Si ptsGabriel > maximo Entonces maximo <- ptsGabriel; FinSi // imprimir la respuesta Escribir maximo; Si ptsAlvaro = maximo Entonces Escribir "Alvaro"; FinSi Si ptsEdwin = maximo Entonces Alberto J. Suxo Riveros 40 ACM – ICPC Bolivia Escribir "Edwin"; FinSi Si ptsGabriel = maximo Entonces Escribir "Gabriel"; FinSi FinProceso Alberto J. Suxo Riveros 41 ACM – ICPC Bolivia Problema G: Lago Autor: Alvaro Rolas El lago Titicaca es el más alto y navegable del mundo, se encuentra a 3900 m sobre el nivel del mar. Este 2012 vinieron científicos reconocidos de Europa para poder hacer un análisis e investigaciones en el lago. La primera curiosidad que tienen es calcular el área (que es un polígono) del lago. Para tal propósito pudieron sacar las coordenadas x, y para poder calcular dicha área. Necesitan tu ayuda como participante IOI para poder calcular dicha área del lago. Se te darán coordenadas x y de manera ordenada y tú deberías retornar el área obtenida del lago. Entrada La entrada inicia con un entero N (Número de puntos x,y), seguidamente será listado N puntos xi, yi La entrada termina cuando N sea igual a 0. (3 ≤ n ≤ 50000), (−10000 ≤ x, y ≤ 10000). Salida Retornar el área del polígono. Ejemplos de entrada 3 0 0 1 0 0 1 0 Ejemplos de salida 0.50 Alberto J. Suxo Riveros 42 ACM – ICPC Bolivia Solución // Olimpiada Boliviana De Informatica // Problema : Lago // Autor : Alberto Suxo // Copyright: Team SIM // Lenguaje : Pseudocodigo PSeInt // ******************************* // Debe saber que el area de un poligono irregular se calcula // de la siguiente forma, dados los puntos: // P_1 = (x_1, y_1) // P_2 = (x_2, y_2) // . // : // P_n = (x_n, y_n) // // el área se calcula mediante la fórmula determinante de Gauss // | x_1 y_1 | // | x_1 y_1 | // | x_1 y_1 | // Area = _1_ | . . | // 2 | : : | // | x_n y_n | // | x_1 y_1 | Proceso Lago Definir n, sumas, i Como Entero; Definir X, Y Como Entero; Definir area Como Real; Dimension X[50001]; Dimension Y[50001]; Leer n; Mientras n>0 Hacer // Leer coordenadas Para i<-1 Hasta n Hacer Leer X[i]; // Leer un entero en la posicion i del vector X Leer Y[i]; FinPara // se copia la 1ra coordenada al final de los vectores X y Y X[n+1] <- X[1]; Y[n+1] <- Y[1]; // Se asume que los puntos estan ordenados // pro lo que no es necesario ordenarlos aqui sumas <- 0; Para i<-1 Hasta n Hacer sumas <- sumas + (X[i]*Y[i+1] - X[i+1]*Y[i] ); FinPara area <- sumas / 2.0; Escribir area; Leer n; // terminos cuando n=0 FinMientras FinProceso Alberto J. Suxo Riveros 43 ACM – ICPC Bolivia Problema H: Química Autor: Hernan Payrumani Lucas está jugando otra vez en la clase de química. En vez de estar balanceando ecuaciones él está escribiendo secuencias codificadas en un papel. Lucas modifica cada palabra adicionando después de cada vocal la letra ‘p’ y luego la misma vocal de nuevo. Por ejemplo, él tiene “clase” que llega a convertirse en “clapasepe” y la palabra “juego” llega a convertirse en “jupuepegopo”. El profesor mira el papel del Lucas con las palabras codificadas y desea saber que escribió. Escribe un programa que decodifique lo que escribió Lucas. Entrada En la primera línea se indica el número de casos que deberán ser evaluados. Cada una de las siguientes líneas es un caso de prueba que es una línea que contiene la sentencia codificada. La secuencia contiene solo letras minúsculas y espacios. Las palabras estarán separadas por un solo espacio y no habrá espacios de más al inicio o al final. La cantidad total de caracteres no sobrepasara los 100. Salida Imprime la sentencia decodificada en una sola línea. Ejemplos de entrada 2 zepelepenapa papapripikapa bapas jepe doposapadgapa opovapa kepemipijapa Ejemplos de salida zelena paprika bas je dosadga ova kemija Alberto J. Suxo Riveros 44 ACM – ICPC Bolivia Solución // // // // // // Olimpiada Boliviana De Informatica Problema : Quimica Autor : Alberto Suxo Copyright: Team SIM Lenguaje : Pseudocodigo PSeInt ******************************* Proceso Quimica Definir linea, car, resultado Como Caracter; Definir i, tam, casos Como Entero; Leer casos; Mientras casos > 0 Hacer casos <- casos - 1; Leer linea; tam <- Longitud(linea); i <- 0; resultado <- ""; Mientras i < tam Hacer car <- Subcadena( linea, i, i ); resultado <- Concatenar( resultado, car ); i <- i + 1; Si car="a" | car="e" | car="i" | car="o" | car="u" Entonces i <- i + 2; FinSi FinMientras Escribir resultado; FinMientras FinProceso Alberto J. Suxo Riveros 45 ACM – ICPC Bolivia Anexo Opciones del Lenguaje La ICPC- Bolivia ha visto por conveniente utiliza PSeInt como herramienta para programación y ejecución de diagramas de flujo. PSeInt puede ser encontrado en el siguiente enlace: http://pseint.sourceforge.net Una instalada la Herramienta PSeInt, PSeInt le preguntará Cuál opción de lenguaje utilizará. El presente documento está desarrollado bajo la opción de lenguaje “Estricto” Alberto J. Suxo Riveros 46 ACM – ICPC Bolivia PSeInt El presente anexo no pretende ser un manual de PSeInt, simplemente se listarán algunas de las opciones que ofrece PSeInt al estudiante. Nosotros lo utilizaremos ya que hace fácil al estudiante migrar del pseudocódigo a su respectivo lenguaje, además, PSeInt ofrece la posibilidad a futuro de exportar el Pseudocódigo a lenguaje C (esto está aún en fase experimental). Comentarios Los comentarios sin segmentos que no afectan el flujo del programan, inicial con ‘//’ y son utilizados para adicionar aclaraciones del código que por sí mismas no son muy intuitivas. También se debe aclarar que los comentarios son segmentos de documentación aclaratoria que es considerada como una buena práctica. Ejemplo // Todo o que sigue a esos dos ‘/’s es un comentario // y jamás se ejecuta. Tipos de Datos PSeInt soporta 4 tipos de datos. Entero Acepta valores enteros Real Acepta valore decimales Logico Acepta solo valores lógicos (verdadero o falso) Caracter Acepta caracteres y cadenas. Para definir una o más variables usamos la siguiente sintaxis: Sintaxis Definir <variable1> [,<variable2>,...,<variableN>] Como <Tipo> Ejemplo: Definir linea Como Caracter; Ejemplo: Definir x, y como Real; Asignación Primero evalúa la expresión de la derecha y luego asigna el resultado a la variable de la izquierda. (Deben coincidir en tipo). Sintaxis: <variable> <- <expresión> ; Ejemplo: nombre <- "Juan Perez"; Ejemplo: contador <- contador + 1 ; Operaciones o instrucciones Representaremos las operaciones de forma simple y lo más claro posible. Ejemplos: resultado <- 12 * 4 ; costo <- (resultado * 2) + 7 ; hipotenusa <- raiz( a*a + b*b ) ; Alberto J. Suxo Riveros 47 ACM – ICPC Bolivia Operadores La jerarquía de los operadores matemáticos es igual a la del algebra, y puede alterarse mediante el uso de paréntesis. Operador Relacionales > < = <= >= <> Lógicos & | ~ Algebraicos + * / ^ Significado Ejemplo Mayor que Menor que Igual que Menor o igual que Mayor i igual que Distinto que 3 > 2 10 < 50 4 = 5 2 <= 2 var >= 0 0 <> 0 Conjunción ( y ) Disyunción ( o ) Negación ( no ) (2<4) & (0=>1) // falso (2<4) | (0=>1) // verdadero ~( 2 < 4 ) // falso Suma Resta Multiplicación División Potencia Entrada de datos Podemos leer variables desde teclado. La entrada es secuencial y cada línea es almacenada en cada una de las variables respectivamente. Podemos definir más de una variable separándolas con comas. Sintaxis: Leer <variable1> [, <variable2>,…,<variableN>] ; Ejemplo: Leer nombre; Ejemplo: Leer x, y, radio; Salida de datos Podemos escribir datos en la pantalla, estos datos son los resultados de las expresiones o los contenidos de las variables. También podemos tener uno o más parámetros separados por comas. Sintaxis: Escribir <expresion1> [,<expresion2>,…,<expresionN>]; Ejemplo: Escribir "Ingrese un numero: "; Ejemplo: Escribir "Resultado: " , x*2 ; Condicionales Selectiva – si Las instrucciones selectivas representan instrucciones que pueden o no ejecutarse, según el cumplimiento de su condición. Alberto J. Suxo Riveros 48 ACM – ICPC Bolivia Sintaxis Si <condición> Entonces Instrucciones [Sino Instrucciones] FinSi La condición puede ser simple o compuesta, dando como único resultado una respuesta o verdadera o falsa. Ejemplo Si edad >= 18 Entonces Escribir "ya puede votar"; FinSi La instrucciones selectiva doble es opcional, solo se aplica cuando requerimos realiza otra tarea cuando no se cumple la condición. Ejemplo Si edad >= 18 Entonces Escribir "Ya puede votar" ; Sino Escribir "esperar una año más" ; Escribir "vuelva a intentar" ; FinSi Selectiva múltiple-casos Permite elegir entre dos o más posibles grupos de acciones. Evalúa el contenido de la variable y selecciona el camino a seguir. La variable debe ser de tipo numérico. Las opciones se delimitan por los dos puntos al final. Si un grupo de acciones se debe ejecutar en dos o más casos, los valores se pueden poner separados por comas en la misma línea. La opción final puede ser ‘De otro modo’, y se ejecuta si la variable no coincide con ninguna de las anteriores. Sintaxis Segun <variable> Hacer <valor1>[,<valor2>,…,<valorN>]: <instrucción(es)>; [<valor>,…<valor>:<instriccion(es)>;] [De Otro Modo: <Instrucción(es)>;] FinSegun Ejemplo: Leer A; Segun A Hacer 1: Escribir 1; 2,3,5,7: Escribir "es numero primo menor a 10"; De Otro Modo: Escribir "intente de nuevo"; FinSegun Estructuras iterativas (bucles) Mientras Como su nombre lo indica, se repite mientras la condiciones sea verdadera. En el bucle ‘mientras’ las instrucciones del contenido pueden o no ser ejecutadas dependiendo de Alberto J. Suxo Riveros 49 ACM – ICPC Bolivia la condiciones, (de ser inicialmente falsa jamás entrará dentro del bucle). Debe contener dentro alguna acción que pueda modificar la condición para salir. Sintaxis Mientras <condición> Hacer <instrucciones> FinMientras Ejemplo edad <-16 ; Mientras edad<18 Hacer Escribir edad; edad <- edad + 1 ; FinMientras Escribir "por fin puede votar con: " , edad , " años" ; Este programita dará como resultado: 16 17 Por fin puede votar con: 18 años Hacer – mientras La estructura ‘Hacer – Mientras’ no es soportada por PSeInt, pero estada definida en casi todos los lenguajes de programación. A diferencia del bucle ‘mientras’, en ‘hacer – mientras’ se tiene la seguridad que siempre se ejecutará por lo menos una vez el contenido del bucle, este contenido se ejecutará mientras la condición sea verdadera. Sintaxis: Hacer <instrucciones>; Mientras <condición>; Ejemplo ahorro <-10 ; Hacer ahorro <- ahorro + 10 ; Escribir "ya tengo Bs. " , ahorro , " de ahorro" ; Mientras ahorro<97 ; En este pequeño programita, seguiremos ahorrando hasta tener Bs.100 Bucle Repetir Algunos lenguajes de programación implementan el bucle ‘repetir – hasta que’ (ejemplo: Pascal), sin embargo, en lenguajes como C o Java simplemente no existe, pero se puede llegar a implementar negando la condición y utilizando la estructura ‘Hacer – Mientras’. El contenido del bucle se ejecutará hasta que la condición sea verdadera (o, lo que es lo mismo con ‘mientras’, se ejecutará mientras la condición sea falsa). Sintaxis Repetir <instrucciones>; Hasta Que <condición>; Alberto J. Suxo Riveros 50 ACM – ICPC Bolivia El equivalente con ‘Hacer – Mientras’ es: Hacer <Instrucciones>; Mientras ~ <condición> ; Ejemplo horasTrabajadas <- 0 ; Repetir Escribir "Trabajando…" ; horasTrabajadas <- horasTrabajadas + 1 ; Hasta Que horasTrabajadas=8 ; Bucle Para Quizá la estructura de control más utilizada, la cual se utiliza cuando se desea iterar un número conocido de veces, empleando una variable como índice que se incremente (o decremente). Sintaxis Para <variable> <- <valor inicial> Hasta <valor final> [Con Paso <incremento/decremento>] Hacer <instrucciones>; FinPara El equivalente con ‘mientras’ es: <variable> <- <valor inicial> Mientras <variable> <> <valor final> hacer <instrucciones>; <variable> <- <varialbe> + <incremento/decremento> ; FinMientras ‘Con Paso’ es opcional, cuando no está definido el incremento será de 1: Ejemplo Para i <- 1 Hasta 12 Hacer Escribir "Número " , i ; FinPara Este ejemplo escribe los números: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 y 12. Ejemplo: Para j <- 10 Hasta 0 Con paso -2 Hacer Escribir j; FinPara; En este ejemplo, los números resultantes serán: 10, 8, 6, 4, 2 y 0, en ese orden respectivamente. Arreglos Los arreglos son estructuras de datos unidimensionales (vectores) bidimensionales (matrices), etc de datos del mismo tipo. Alberto J. Suxo Riveros 51 ACM – ICPC Bolivia Para cerrar arreglos primero debemos definir su tipo, y luego, definir su tamaño de la siguiente forma: Sintaxis: Definir <nombre de arreglo> Como <Tipo de Dato>; Dimension <nombre de arreglo>[<tamaño>[,<tamaño>,…]]; Para declararlos utilizaremos la palabra ‘arreglo’ seguido de nombre de la variable y su tamaño. Ejemplo vector Definir i Como Entero; Definir datos Como Entero; Dimension datos[20]; datos[0] <- 0; datos[1] <- 1; Para i<-2 Hasta 19 Hacer datos[i] <- datos[i-1] + datos[i-2]; FinPara Escribir "El 20vo numero de Fivonacci es : " , datos[19]; Debemos tener claro que, cuando definimos un vector o matriz, siempre comenzará desde 0, es decir, si definimos un vector de 20 elementos, las posiciones de esos elementos serán: 0, 1, 2, … 17, 18 y 19, sumando un total de 20 elementos. Ejemplo matriz Definir mat, fila, col Como Entero; Dimension mat[4,6]; Para fila<-0 Hasta 3 Hacer Para col<-0 Hasta 5 Hacer mat[fila][col] <- fila + col; FinPara FinPara En este ejemplo podemos ver que una matriz se define por lo general como un arreglo de dimensionado por filas x columnas, siendo el número total de elementos la multiplicación de estos datos, (en el ejemplo es 4x6=24). También podemos ver que los bucles pueden anidarse. Funciones En muchas ocasiones, el número de instrucciones es muy grande y muchas veces repetitiva, para lo cual, utilizamos las funciones para simplificar el programa. Las funciones pueden o no recibir parámetros de entrada, y, no siempre devolverá algún resultado. Sintaxis SubProceso [<var resultado> <-] <nombre función>[(<paramentos>)] [Definir <var resultado> Como <Tipo>; ] <instrucciones>; [<var resultado> <- <instrucción> ; ] FinSubProceso Alberto J. Suxo Riveros 52 ACM – ICPC Bolivia Ejemplo: SubProceso prom <- Promedio ( arreglo, cantidad ) Definir i como Entero; Definir suma como Real; Definir prom como Real; suma <- 0; Para i<-0 Hasta cantidad-1 Hacer suma <- suma + arreglo[i]; FinPara prom <- suma/cantidad; FinSubProceso Proceso Principal Definir i,N como Entero; Definir acum,datos,prom como Reales; Dimension datos[100]; Escribir "Ingrese la cantidad de datos:"; Leer n; Para i<-0 Hasta n-1 Hacer Escribir "Ingrese el dato ",i+1,":"; Leer datos[i]; FinPara Escribir "El promedio es: ",Promedio(datos,n); FinProceso PSeInt nos provee de funciones predefinidas Funciones Matemáticas Función Significado RC(X) Raíz Cuadrada de X ABS(X) Valor Absoluto de X LN(X) Logaritmo Natural de X EXP(X) Función Exponencial de X SEN(X) Seno de X COS(X) Coseno de X ATAN(X) Arco tangente de X TRUNC(X) Parte entera de X REDON(X) Entero más cercano a X La función raíz cuadrada no debe recibir un argumento negativo. La función exponencial no debe recibir un argumento menor o igual a cero. Funciones para Cadenas Función Longitud(x) Mayusculas(x) Minusculas(x) Subcadena(x,inicio,fin) Concatenar(x,y) Alberto J. Suxo Riveros Significado Retorna la cantidad de caracteres de una cadena x. Convierte a mayúsculas la cadena x. Convierte a minúsculas la cadena x. Extrae una parte de la cadena x indicando desde cual hasta que letra. Une las cadenas x y y. 53