Potitos

“¡Javi! ¡Parece que éste tampoco le gusta!” se convirtió en cantinela habitual a la hora de la comida, antes de que el pequeño dejara definitivamente de comer potitos una tarde. Darle de comer era misión imposible; pese a la paciencia de sus padres, el niño había heredado el carácter cabezón del padre y mantenía la boca cerrada, inmune a los vuelos de la cucharita y a las monerías de quienes le rodeaban. Era necesario encontrar una solución.

Se les ocurrió que, quizá, el aparentemente caprichoso rechazo a los potitos se debía a algún ingrediente concreto. Comenzaron a anotar, cuidadosamente, todos los ingredientes de cada potito que le daban, junto con un comentario de si el pequeño se lo había tomado o no. Tras varios días, estaban convencidos de que podrían averiguar cuáles eran los ingredientes que no le gustaban, y así comprar aquellos potitos que fuera a comerse. ¿Puedes ayudarles a encontrarlos?

Entrada

La entrada estará compuesta de múltiples casos de prueba. Cada uno comienza con un número indicando el número de potitos que se han intentado dar al bebé (como máximo 25).

A continuación aparece una línea por cada potito. La línea comienza por SI: o NO: dependiendo de si el pequeño se comió o no el potito. Después aparece la lista de los ingredientes del potito separados por espacios. La lista se cierra con la palabra FIN, que no debe considerarse un ingrediente. Ningún potito tiene más de 10 ingredientes, y todos los ingredientes están compuestos por una única palabra de hasta 20 letras minúsculas.

La entrada acaba con un caso de prueba sin potitos.

Salida

Para cada caso de prueba se deben mostrar, en una línea, los ingredientes que no le gustan al niño, ordenados alfabéticamente y separados por espacio. Si todos los ingredientes le gustan, se dejará la linea en blanco.

Entrada de ejemplo

3
SI: patata maiz tomate FIN
NO: patata puerro guisantes pollo FIN
SI: tomate zanahoria puerro pollo calabacin arroz FIN
2
SI: tomate zanahoria pollo calabacin arroz FIN
NO: tomate ternera puerro FIN
0

Salida de ejemplo

guisantes
puerro ternera

Solución propuesta

if __name__ == '__main__':
    respuestas = []
    numeros_potitos = int(input())
    while numeros_potitos != 0:
        set_si = set()
        set_no = set()
        for i in range(numeros_potitos):
            posicion = 1
            potito = input().split(' ')
            if potito[0] == 'SI:':
                while potito[posicion] != 'FIN':
                    set_si.add(potito[posicion])
                    posicion += 1
            else:
                while potito[posicion] != 'FIN':
                    set_no.add(potito[posicion])
                    posicion += 1

        ingredientes = list(set_no - set_si)
        sorted(ingredientes)
        respuesta = ''
        for ingrediente in ingredientes:
            respuesta += ingrediente + ' '
        respuestas.append(respuesta)
        numeros_potitos = int(input())
    for respuesta in respuestas:
        print(respuesta)

Esta semana el problema puede parecer bastante sencillo y conceptualmente lo es, es decir, tenemos muy claro qué debe hacer el programa para dar la respuesta. Lo único que debemos hacer son dos listas, una con los ingredientes que el gustan y otra con los que no. Posteriormente hay que mostrar los ingredientes que no le gustan al niño, en este caso de Javi.

Hasta aquí todo claro, sin embargo, antes he comentado la palabra lista. ¿Realmente hay que hacer dos listas? No exactamente, ya que cada ingrediente debe ser apuntado una sola vez, al igual que cuando uno realiza la lista de la compra, solo apunta café una vez, aunque los muy cafeteros puedes poner un (x2).

Por tanto, para controlar que solo exista una sola aparición de un ingediente en una lista se puede realizar si antes de añadirlo, se comprueba antes. Pero, esto es algo bastante tedioso, a nivel computacional aunque solo implique una línea en código. Por lo que vamos a utilizar un nuevo tipo de datos llamado set o en español, conjunto. ¿Qué caracterísitcas tiene el dicho tipo de datos? Pues vamos a quedarnos con que solo puede aparecer una vez un elemento y que es un tipo de datos desordenado, por ahora no necesitamos nada más.

Una vez que tenemos claro qué tipo de datos vamos a utlizar o mejor dicho, vamos a necesitar. lo que nos queda es ir leyendo cada lista y añadir los ingredientes. Por último, hay que comprobar los ingredientes que al niño no le gustan, por lo que volvemos a hacer uso de las operaciones de los conjuntos. En este caso se realiza la diferencia entre el conjunto de los ingredientes que no le gustan eliminando los que sí le gustan. Con lo cual nos quedan los ingredientes que seguro que no le gustan.

Para este paso, volvemos a tener que cambiar el tipo de datos, ya que como el problema nos pide devolver dichos ingredientes ordenados alfabéticamente. Dicho orden solo podemos ordenados con la función sorted que se aplica a las listas.

Y con este problema, hemos introducido el tipo set o conjunto.

Enlace del código

Enlace en aceptaelreto.com

Publicado el 14 de agosto de 2017