Foros del Web » Programando para Internet » Python »

Desafíos 2014 - Semana 1

Estas en el tema de Desafíos 2014 - Semana 1 en el foro de Python en Foros del Web. Problema: Un numero primo, es un numero entero mayor o igual a 2, el cual no tiene mas divisores mas que 1 y el mismo. ...
  #1 (permalink)  
Antiguo 23/01/2014, 17:24
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Desafíos 2014 - Semana 1

Problema:
Un numero primo, es un numero entero mayor o igual a 2, el cual no tiene mas divisores mas que 1 y el mismo. Por ejemplo 5 es numero primo porque 2, 3 ni 4 dividen exactamente ese numero. En cambio 9 es un numero compuesto porque existen números entre 2 y 9 que los dividen perfectamente como 3.

Los primeros números primos son 2, 3, 5, 7, 11, ...

Tu misión si decides aceptarla es dado un numero entre 1 y 1000 que sera la posición del numero primo en la lista de números primos. Por ejemplo, si doy 1 el resultado debe ser 2, ya que 2 es el primer numero primo. Si doy 5 el resultado debe de ser 11.

Entrada:
Cada linea tendrá un numero entero valido en el rango de 1 a 1000 inclusive (1 <= N <= 1000), la linea no entra espacios antes ni después.

Salida:
Por cada numero de entrada, la salida debe debe se ser una sola linea sin espacio, indicando el numero primo que corresponda.

Ejemplo de Entrada:
Código:
1
2
3
4
5

Ejemplo de Salida:
Código:
2
3
5
7
11
Puntaje:
Cada respuesta sera evaluada con respecto a 2 puntos:

1. Numero de lineas
2. Tiempo de ejecución

Notas:
1. No deben de usar librerías de terceros.
2. La versión en el que sera ejecutados las pruebas sera 2.7 o 3.3
3. La solución debe de estar en un solo archivo .py
4. Para evaluar el script se utilizara el siguiente comando: time cat entrada.txt | python script.py > salida_text.txt


Score:

Carbon
Status: Incorrecto
Lineas: 24
Tiempo: 0.915s

sukoy
Status: Correcto
Lineas: 16
Tiempo: 0.375s


Script para evaluación de tiempo y exactitud del programa: entrada.txt y salida.txt son los archivos con las respuestas.
Código BASH:
Ver original
  1. #!/usr/bin/env bash
  2.  
  3. timeout 10 bash -c "time cat entrada.txt | python script.py > salida_test.txt"
  4.  
  5. if [ "$?" == "124" ]
  6.   then
  7.     echo "Timeout";
  8.     exit 0;
  9. fi
  10.  
  11. diff salida.txt salida_test.txt &> /dev/null
  12. if [ "$?" == "0" ]
  13.   then
  14.     echo "Correcto";
  15.   else
  16.     echo "Incorrecto";
  17. fi

Plantilla para resolver el problema:
Código Python:
Ver original
  1. def answer(number):
  2.     "Implementa tu respuesta aqui"
  3.     return 0
  4.  
  5. while True:
  6.     try:
  7.         number = int(raw_input())
  8.         print answer(number)
  9.     except EOFError:
  10.         break

Última edición por razpeitia; 24/01/2014 a las 16:59
  #2 (permalink)  
Antiguo 23/01/2014, 20:58
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 2 meses
Puntos: 35
Respuesta: Desafíos 2014 - Semana 1

Mi solución. No me fijé en la cantidad de líneas sino en la claridad del código.

Código Python:
Ver original
  1. def is_prime(n):
  2.     return all(n % i for i in range(2, n))
  3.  
  4. prime_numbers = []
  5. count = 0
  6. current_number = 1
  7. while count <= 1000:
  8.     if is_prime(current_number):
  9.         prime_numbers.append(current_number)
  10.         count += 1
  11.     current_number += 1
  12.  
  13. allowed_range = range(1, 1001)
  14.  
  15. while True:
  16.     index = 0
  17.     while index not in allowed_range:
  18.         try:
  19.             index = int(raw_input(u"Número entre 1 y 1000: "))
  20.         except ValueError:
  21.             pass
  22.         else:
  23.             break
  24.     print prime_numbers[index]

  #3 (permalink)  
Antiguo 23/01/2014, 21:17
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Desafíos 2014 - Semana 1

Recuerda que el script debe de terminar.
  #4 (permalink)  
Antiguo 23/01/2014, 21:20
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 2 meses
Puntos: 35
Respuesta: Desafíos 2014 - Semana 1

Claro, lo termina el usuario con CTRL-C al menos en Windows. Por cierto, no puedo editar el mensaje...
  #5 (permalink)  
Antiguo 23/01/2014, 21:26
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Desafíos 2014 - Semana 1

No termina, por favor checa el punto 4, en notas. PD: Puedes volverlo a poner.
  #6 (permalink)  
Antiguo 23/01/2014, 21:34
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 2 meses
Puntos: 35
Respuesta: Desafíos 2014 - Semana 1

Pues entonces solo debo pedir un numero y luego terminar?
  #7 (permalink)  
Antiguo 23/01/2014, 21:59
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Desafíos 2014 - Semana 1

No, simplemente termina cuando termines de leer. Ejemplo:

Código Python:
Ver original
  1. def answer(number):
  2.     "Implementa tu respuesta aqui"
  3.     return 0
  4.  
  5. while True:
  6.     try:
  7.         number = int(raw_input())
  8.         print answer(number)
  9.     except EOFError:
  10.         break

Otra cosa, la salida se comparara carácter por carácter con el archivo final de respuesta, así que ten cuidado de no imprimir cosas innecesarias. Tampoco es validar cosas innecesarias como el rango, porque te aseguramos que así sera.
  #8 (permalink)  
Antiguo 23/01/2014, 22:16
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 2 meses
Puntos: 35
Respuesta: Desafíos 2014 - Semana 1

No entendi muy bien lo de la salida, de todo modos:

Código Python:
Ver original
  1. def is_prime(n):
  2.     return all(n % i for i in range(2, n))
  3.  
  4. prime_numbers = []
  5. count = 0
  6. current_number = 1
  7. while count <= 1000:
  8.     if is_prime(current_number):
  9.         prime_numbers.append(current_number)
  10.         count += 1
  11.     current_number += 1
  12.  
  13. allowed_range = range(1, 1001)
  14.  
  15. index = 0
  16. while index not in allowed_range:
  17.     try:
  18.         index = int(raw_input())
  19.     except ValueError:
  20.         continue
  21. print prime_numbers[index]


Última edición por carbon; 23/01/2014 a las 22:21
  #9 (permalink)  
Antiguo 23/01/2014, 23:16
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Desafíos 2014 - Semana 1

Esta muy bien, excepto que la salida solo imprime un numero.

El comando para ejecutar tu script:
Código:
time cat entrada.txt | python script.py > salida_test.txt
Ejemplo de entrada.txt
Código:
1
2
3
4
5
Ejemplo de salida.txt
Código:
2
3
5
7
11
Script que utilizo para checar los puntos:
Código BASH:
Ver original
  1. time cat entrada.txt | python script.py > salida_test.txt
  2.  
  3. diff salida.txt salida_test.txt 2> /dev/null
  4. if [ "$?" == "0" ]
  5.   then
  6.     echo "Correcto"
  7.   else
  8.     echo "Incorrecto"
  9. fi
  #10 (permalink)  
Antiguo 24/01/2014, 05:21
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 1 mes
Puntos: 18
Respuesta: Desafíos 2014 - Semana 1

Código Python:
Ver original
  1. from sys import stdin, stdout
  2.  
  3. def is_prime(n):
  4.     return all(n % i for i in range(2, int(n**0.5)+1))
  5.  
  6. entrada = map(int, [i.rstrip() for i in stdin.readlines()])
  7.  
  8. m = []
  9. num = 1
  10.  
  11. while len(m) < max(entrada):
  12.     num += 1
  13.     if is_prime(num):
  14.         m.append(num)
  15. for i in entrada:
  16.     stdout.write(str(m[i-1]) + '\n')

Ahí va el mio, gracias.
  #11 (permalink)  
Antiguo 24/01/2014, 08:54
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 2 meses
Puntos: 35
Respuesta: Desafíos 2014 - Semana 1

Ahora?

Código Python:
Ver original
  1. def is_prime(n):
  2.     return all(n % i for i in range(2, n))
  3.  
  4. prime_numbers = []
  5. count = 0
  6. current_number = 1
  7. while count <= 1000:
  8.     if is_prime(current_number):
  9.         prime_numbers.append(current_number)
  10.         count += 1
  11.     current_number += 1
  12.  
  13. allowed_range = range(1, 1001)
  14.  
  15. index = 0
  16. while index not in allowed_range:
  17.     try:
  18.         index = int(raw_input())
  19.     except ValueError:
  20.         continue
  21.     except EOFError:
  22.         break
  23.     else:
  24.         print prime_numbers[index]
  #12 (permalink)  
Antiguo 24/01/2014, 13:15
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Desafíos 2014 - Semana 1

carbon, sigues imprimiendo 1 sola respuesta.

Hint: Checa la condición del while.
  #13 (permalink)  
Antiguo 24/01/2014, 16:49
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 10 años, 5 meses
Puntos: 2
Respuesta: Desafíos 2014 - Semana 1

Yo tampoco entendí bien lo de entrada y salida. Me falta conocimiento para eso. Pero acá esta mi código:

Código:
1. def crear_lista_primos(numero):
2.	lista_primos, x = [], 1
3.	while len(lista_primos)<numero:
4.		x, es_primo = x+1, True
5.		for y in range(2,x-1): #(numeros entre 2 y x)
6.			if x%y == 0:
7.				es_primo = False
8.		if es_primo == True:
9.			lista_primos.append(x)
10.   	return lista_primos
11. def popular_output(lista_input):
12.	primos = crear_lista_primos(max(lista_input))
13.	lista_output = []
14.	for k in lista_input:
15.		lista_output.append(primos[k-1])
16.	return lista_output
17.lista_de_numeros = [] #AQUI VAN LOS NUMEROS
18.print popular_output(lista_de_numeros) #Devuelve la lista de numeros primos correspondiente
se entiende que la lista puede ser desordenada, [1,2,3,4,5] o [1,3,2,5,4].
Buen ejercicio.

#no se como añadir lineas al codigo XD

Última edición por stormearth; 24/01/2014 a las 16:56 Razón: añadir lineas

Etiquetas: semana
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 13:56.