Hoy vamos a resolver un ejercicio de programación en Python que trata sobre detectar copia en exámenes. Básicamente es trabajar con entrada y salida de datos así como con listas y las operaciones que estas conllevan.
El ejercicio está confuso (me parece que a propósito) ya que da información innecesaria, pero supongo que es parte de su complejidad.
Veamos cómo resolverlo en pocas líneas usando Python.
Descripción del ejercicio
Uno de los profesores de programación de alguna universidad está comenzando a perder su memoria. Hace algún tiempo, cuando comenzó a trabajar como docente, no únicamente conocía perfectamente todos los nombres y apellidos de sus estudiantes, sino que además contaba con una habilidad increíble para detectar copia en los exámenes de programación.
Estaba tan seguro de sus capacidades que mientras los estudiantes se concentraban en analizar los problemas y diseñar algoritmos, él se sentaba en la última fila del salón a futuras clases sin preocuparse por los intentos de algunos estudiantes por hacer trampa.
La habilidad del profesor se basa en su memoria fotográfica. Cuando el profesor calificaba era capaz de recordar a la perfección si había visto un examen con las mismas respuestas o no, y si las resultó acusaba siempre al segundo estudiante de copiar.
Lamentablemente, durante los últimos meses su memoria fotográfica ya no funciona como antes y ahora solo recuerda algunos de los últimos exámenes que ha calificado.
Debido a estas circunstancias, el profesor ha decidido solicitar su ayuda para construir un programa en Python que le permita comprobar si la perdida de su memoria fotográfica podría tener como consecuencia una disminución en la cantidad de copias que se detectan durante los exámenes.
Entrada
La entrada estará formada por dos líneas: La primera línea aparecerán dos números N y K que indican el número de exámenes a calificar y el número de exámenes que el profesor es capaz de recordar.
La segunda línea contiene N números (entre 1 y 100) separados por espacios que representan las respuestas de cada uno de los exámenes.
Dos exámenes se consideran copiados si están representados por el mismo número.
Salida
El programa imprimirá dos números separados por un espacio.
El primero representará la cantidad de copias detectadas por el profesor considerando que al calificar un examen solo es capaz de recordar los K exámenes anteriores.
El segundo representará el número total de exámenes copiados.
Instrucciones para la calificación automática
Antes de enviar la solución del reto, por favor tenga en cuenta los siguientes aspectos:
- Cada caso de prueba se especifica con dos líneas. Cada línea debe contener los valores de los parámetros requeridos separados por un espacio.
- Es importante no utilizar ningún mensaje a la hora de capturar las entradas, es decir, al utilizar la función input no agregue ningún texto para capturar los datos. Los resultados se muestran en una única línea.
- Los dos valores requeridos deben estar separados por un espacio.
Casos de prueba
Recuerda que la entrada serán dos líneas y la salida será una línea. Quedan así (en el ejercicio original no se entendía nada):
|Entrada|Salida |
|--|--|
| `5 1`<br>`1 2 3 1 2`|`0 2`|
| `5 2`<br>`1 2 3 1 2`|`0 2`|
| `5 3`<br>`1 2 3 1 2`|`2 2`|
| `5 1`<br>`1 1 1 1 1`|`4 4`|
Mi interpretación
Básicamente tenemos que encontrar los números repetidos. Cada número repetido en la línea de respuestas cuenta como un examen copiado.
Para contarlo se debe recorrer la lista índice por índice y en cada iteración cortar la lista desde 0 hasta el índice actual; una vez cortada la lista, comprobamos si el valor actual está en la lista cortada. Si eso es verdadero, entonces una copia ha sido detectada.
En el caso de contarlo según el profesor, debemos cortar la lista pero no desde 0, sino desde el índice actual menos los exámenes que el profesor puede recordar (dado por el número K).
Y ya, así de simple. No hacía falta tanta explicación, qué divertido es ese profesor que puso texto para confundir; wow.
Código en Python
Vamos a leer de STDIN así que simplemente leemos con input sin mandar ningún mensaje. Para obtener K
y N
usamos split en la primera línea y luego convertimos esos valores a entero:
primera_linea = input().split(" ")
examenes = int(primera_linea[0])
examenes_recordados = int(primera_linea[1])
Luego leemos la segunda línea, no necesitamos convertir la lista, ya con haberla separado por espacios basta. También declaramos las variables que llevarán el conteo:
respuestas = input().split(" ")
copias_detectadas_por_profesor = 0
copias_detectadas_por_programa = 0
Y luego simplemente recorremos la lista, vamos cortándola y comprobamos si el elemento actual está en la porción de lista anterior al índice actual:
for i in range(examenes):
respuesta = respuestas[i]
if respuesta in respuestas[:i]:
copias_detectadas_por_programa += 1
if respuesta in respuestas[i-examenes_recordados:i]:
copias_detectadas_por_profesor += 1
print(f"{copias_detectadas_por_profesor} {copias_detectadas_por_programa}")
Poniendo todo junto
El código completo queda así:
"""
https://parzibyte.me/blog
"""
primera_linea = input().split(" ")
respuestas = input().split(" ")
examenes = int(primera_linea[0])
examenes_recordados = int(primera_linea[1])
copias_detectadas_por_profesor = 0
copias_detectadas_por_programa = 0
for i in range(examenes):
respuesta = respuestas[i]
if respuesta in respuestas[:i]:
copias_detectadas_por_programa += 1
if respuesta in respuestas[i-examenes_recordados:i]:
copias_detectadas_por_profesor += 1
print(f"{copias_detectadas_por_profesor} {copias_detectadas_por_programa}")
Recuerda que debes proporcionar la entrada, ya sea escribiendo las dos líneas (separadas por Enter
) o pasándole el contenido de un archivo. En mi caso tengo un archivo de entrada:
5 1
1 1 1 1 1
Y lo hago así: python 1.py < entrada1.txt
Justo como se ve en la siguiente imagen:
La salida (4 4
) es correcta tanto para el caso de prueba como para el ejercicio en sí, pues el profesor solo puede recordar el examen anterior, y debido a que todos son iguales, hay 4 copias, así que iguala a la computadora.
Obviamente tú eres libre de pasarle las demás entradas, esto solo fue un ejemplo.
Para terminar te dejo con más tutoriales y ejercicios de programación en Python.