python

Python – Detectando copia en exámenes (ejercicio resuelto)

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:

Ejercicio resuelto de copias de exámenes en Python

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.