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.
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.
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.
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.
Antes de enviar la solución del reto, por favor tenga en cuenta los siguientes aspectos:
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`|
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.
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}")
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.
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…
Esta web usa cookies.