Cali Cali Introducción a la Programación Noviembre 27 de 2006 Nombre: Pregunta 1 2 3 Total Puntos 30 30 50 110 Cal. 1 (30 Puntos) Un pirata necesita encontrar un tesoro en una isla, para hacerlo cuenta con una pista inicial y una serie de convenciones. La idea es que a través de esta pista encontrará nuevas pistas que lo irán llevando hasta encontrar el tesoro. Suponga que la isla está representada por una matriz y que la pista inicial no es más que la posición en la isla donde va a encontrar la siguiente pista. Las convenciones traducen lo que el pirata encuentra en la isla a las acciones que debe tomar para seguir buscando. Escriba una función en python que le ayude al pirata a encontrar el tesoro. Debido a que el pirata sufre de mala memoria, esta función debe retornar la lista de las posiciones por donde pasó el pirata para llegar al tesoro. Pista oeste-5 este-8 norte-7 sur-1 tesoro Acción Caminar 5 pasos al oeste Caminar 8 pasos al este Caminar 7 pasos al norte Caminar 1 pasos al sur El tesoro fue encontrado! ##Version i t e r a t i v a def t e s o r o (M, i, j ) : while M[ i ] [ j ]!= t e s o r o : p = M[ i ] [ j ] i f p == este 8 : j = j + 8 e l i f p == oeste 5 : j = j 5 e l i f p == sur 1 : i = i + 1 e l i f p == norte 7 : Página 1 de 6
i = i 7 else : print Error en l a s p i s t a s return [ i, j ] 2 (30 Puntos) Un cubo de Rubik es un rompecabezas mecánico donde cada uno de sus 6 lados está a su vez dividido en 9 partes (3 3). Cada una de estas partes tienen un color que puede ser: rojo, naranja, amarillo, blanco, verde, azul. La idea del juego es, a partir de un cubo con todos los colores mezclados, llegar a un cubo donde cada cara tenga un color uniforme. A continuación se presenta la definición de un cubo de Rubik en python. Cada uno de los campos del registro es una matriz de 3 3 que corresponde a la cara. Los colores se representan mediante letras. Rojo: R, Naranja: N, Amarillo: A, Blanco: B, Verde: V, Azul: Z. from record import class cubo ( record ) : r o j o =[[ V, B, V ], [ R, R, N ], [ N, A, R ] ] naranja =[[ R, R, A ], [ A, N, V ], [ B, A, A ] ] a m a r i l l o =[[ B, Z, Z ], [ A, A, V ], [ Z, Z, N ] ] blanco =[[ N, V, N ], [ N, B, B ], [ V, B, R ] ] verde =[[ Z, Z, A ], [ B, V, V ], [ V, N, A ] ] azul =[[ Z, Z, V ], [ R, Z, N ], [ R, R, B ] ] Escriba una función en python que, dado un cubo de Rubik, calcule cuál es la cara más armada. Es decir, la cara en donde la mayoría de sus partes están en su lugar. Una parte está en su lugar si su color coincide con el color que debe tener la cara. Para el ejemplo de la definición, la cara de color rojo tiene solamente dos partes en el lugar correcto: (1, 0), (1, 1), (2, 2). from record import class rubik ( r e c ord ) : r o j o = [ ] naranja = [ ] a m a r i l l o = [ ] blanco = [ ] verde = [ ] azul = [ ] def c a r a c o r r e c t o s (C, c o l o r ) : Página 2 de 6
c o r r e c t o s = 0 for X in C: for Y in X: i f Y == c o l o r : c o r r e c t o s = c o r r e c t o s + 1 return c o r r e c t o s def cara mas armada (Cb ) : cmp = [ ] cmp. append ( [ r o j o, c a r a c o r r e c t o s (Cb. rojo, R ) ] ) cmp. append ( [ naranja, c a r a c o r r e c t o s (Cb. naranja, N ) ] ) cmp. append ( [ a m a r i l l o, c a r a c o r r e c t o s (Cb. amarillo, A ) ] ) cmp. append ( [ blanco, c a r a c o r r e c t o s (Cb. blanco, B ) ] ) cmp. append ( [ verde, c a r a c o r r e c t o s (Cb. verde, V ) ] ) cmp. append ( [ azul, c a r a c o r r e c t o s (Cb. azul, Z ) ] ) cara = cmp [ 0 ] [ 0 ] c o r r e c t o s = cmp [ 0 ] [ 1 ] for X in cmp : i f X[ 1 ] > c o r r e c t o s : c o r r e c t o s = X[ 1 ] cara = X[ 0 ] return [ cara, c o r r e c t o s ] 3 () Se tienen ubicadas n reinas en un tablero de ajedrez de tamaño n n, y se desea saber si estas reinas están ubicadas de tal forma que no se atacan entre ellas. Las posiciones en las que existen reinas contienen la letra R, mientras que las que no tienen reina contienen la letra B. La Figura presenta el caso de un tablero de 8 8, en la parte izquierda las reinas están bien ubicadas (no se atacan), en la derecha las reinas se atacan (algunos ataques están representados por flechas). Recuerde que en el ajedrez la reina se puede mover en todas las direcciones (horizontal, vertical, diagonal) las casillas que quiera. Página 3 de 6
(a) 10 Puntos Escriba una función en python que dado un tablero de ajedrez y una fila, verifique si en esa fila del tablero existen reinas que se atacan. def h o r i z o n t a l (M, i ) : for X in M[ i ] : i f X == R : (b) 10 Puntos Escriba una función en python que dado un tablero de ajedrez y una columna, verifique si en esa columna del tablero existen reinas que se atacan. def v e r t i c a l (M, j ) : for X in range ( f i l a s (M) ) : i f M[X ] [ j ] == R : (c) 10 Puntos Escriba una función en python que dado un tablero de ajedrez y las coordenadas donde inicia una diagonal, verifique si en esa diagonal del tablero existen reinas que se atacan. def d i a g o n a l (M, i, j ) : Página 4 de 6
f i = i ; f j = j bi = i ; bj = j while f i < f i l a s (M) and f j < columnas (M) : i f M[ f i ] [ f j ] == R : f j = f j + 1 f i = f i + 1 i f r e i n a s > 1 : return True while bi >= 0 and bj >= 0 : i f M[ bi ] [ bj ] == R : bj = bj 1 bi = bi 1 def d i a g o n a l i n v (M, i, j ) : f i = i ; f j = j bi = i ; bj = j while f i < f i l a s (M) and f j >= 0 : i f M[ f i ] [ f j ] == R : f j = f j 1 f i = f i + 1 i f r e i n a s > 1 : return True while b i >= 0 and b j < columnas (M) : i f M[ bi ] [ bj ] == R : bj = bj + 1 bi = bi 1 (d) 20 Puntos Escriba un programa en python que dado un tablero de ajedrez de dimensiones n n, representado por una matriz, verifique si las reinas que hay en el tablero se atacan o no. Para esto utilice las funciones definidas anteriormente. Página 5 de 6
def queens (M) : for x in range ( f i l a s (M) ) : i f h o r i z o n t a l (M, x ) or v e r t i c a l (M, x ) : return False for y in range ( columnas (M) ) : i f M[ x ] [ y ] == R : return True i f d i a g o n a l (M, x, y ) or d i a g o n a l i n v (M, x, y ) : return False Página 6 de 6