Autor Tema: Ejercicios de Python. Curso edX  (Leído 8748 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Ejercicios de Python. Curso edX
« en: 27 de Agosto de 2015, 07:15:56 »
Por fin los primeros practicos, los 2 primeros los vi bastante faciles. el otro hasta ahora creia que lo tenia pero me fallo en algunos :/

Para el que no esta anotado:

1ero:
Citar
Assume s is a string of lower case characters.

Write a program that counts up the number of vowels contained in the string s. Valid vowels are: 'a', 'e', 'i', 'o', and 'u'. For example, if s = 'azcbobobegghakl', your program should print:

Number of vowels: 5

2do:
Citar
Assume s is a string of lower case characters.

Write a program that prints the number of times the string 'bob' occurs in s. For example, if s = 'azcbobobegghakl', then your program should print

Number of times bob occurs is: 2

3ero y el cual estoy peleando:
Citar
Write a program that prints the longest substring of s in which the letters occur in alphabetical order. For example, if s = 'azcbobobegghakl', then your program should print

Longest substring in alphabetical order is: beggh


In the case of ties, print the first substring. For example, if s = 'abcbcd', then your program should print

Longest substring in alphabetical order is: abc

No se si poner los codigos o no, cuando ustedes lo terminen lo ponemos de esa forma comparamos.

EDIT: Completados todos.
Estaba aproximandome mal a la solucion del ultimo.
En ves de hacer una comparacion valor anterior con valor actual, hacia valor actual con proximo valor, y eso daba mas dolores de cabeza que nunca.

Lo que si me parecio bastante raro es que en la lina del interprete poniendo esto:

Código: Python
  1. a = 10
  2. def f(x):
  3.       return x + a
  4. a = 3
  5. f(1)
Resultado: 4

Sea valido ( a pesar que "a" no es un parametro que se paso a la funcion, y no de un error.

----------------------------

Hasta ahora la primer semana hubo varios ejemplos en el que te hace usar el interprete y ver los resultados, especialmente el tipo de resultado:

Código: Python
  1. 2**3 + 1
  2. (2 + 3) * 4
  3. 2 + 3 * 4
  4. 10/3
  5. 10.0/3.0
  6. - - 4
  7. 2.2 * 3.0 #( este es uno de los mas geniales ya que se ve cuando hay errores por la representacion binaria., y termina dando un resultado 6.600000000005 o algo por el estilo)

Despues algunas con logica y resultados booleanos

Código: Python
  1. 3 > 4 or (2 < 3 and 9 > 10)
  2. not(4 > 3 and 100 > 6)
  3. 3.0 - 1.0 != 5.0 - 3.0

Luego asignacion a variables ( todo un solo codigo )

Código: Python
  1. b = 10
  2. c = b > 9
  3. c
Que tipo da y cual es el valor, obviamente es un bool y es True

Luego empezamos con los valores no escalares como las strings:

Código: Python
  1. "a" + "bc"
  2. 3 * "bc"

Y su forma de indexarlas

Código: Python
  1. "abcd"[1]
  2. "abcd"[0:2]
  3. "abcd"[:2]

Lo que si aprendi aca es esto s[i:j:k], que no lo sabia o no me acordaba.
comienzo:fin:pasos

entonces algo asi:

Código: Python
  1. 'helloworld'[::-1]
Resultado: dlrowolleh

es decir a la inversa por el paso en -1

Código: Python
  1. 'helloworld'[1:9:2]
Resultado: elwr

Finalizando la semana aprendes sobre AND/OR , type(), int(), float(), una introduccion a raw_input(), print().
Conjunto con if/elif/else

Esto acerca de python. habia una introduccion que me durmio acerca de la ciencia de la computacion. Que por cierto tengo a los videos a la velocidad de 1.25x por que sino te duerme, es muy lento hablando, y por ahi hay unos videos en el que el sonido es MUY malo.
Solo resta esperar la proxima semana.
« Última modificación: 30 de Agosto de 2015, 07:28:59 por Picuino, Razón: Añadido el mensaje anterior, que se había perdido al dividir el hilo. »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Curso de edx por arrancar
« Respuesta #1 en: 27 de Agosto de 2015, 11:40:26 »
Quiero avisarles que ya arranco.
Todo en ingles xD al menos el primer video y no habia subtitulos. No problem at all
En YouTube (Pinchando el logo de YouTube) se pueden ver subtítulos en inglés.
También se pueden traducir al español, aunque la traducción automática es mala.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Curso de edx por arrancar
« Respuesta #2 en: 27 de Agosto de 2015, 12:30:30 »
Gracias KILLERJC.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Ejercicios de Python. Curso edX
« Respuesta #3 en: 29 de Agosto de 2015, 08:24:32 »
Por fin los primeros practicos, los 2 primeros los vi bastante faciles. el otro hasta ahora creia que lo tenia pero me fallo en algunos :/

Para el que no esta anotado:

1ero:
Citar
Assume s is a string of lower case characters.

Write a program that counts up the number of vowels contained in the string s. Valid vowels are: 'a', 'e', 'i', 'o', and 'u'. For example, if s = 'azcbobobegghakl', your program should print:

Number of vowels: 5

2do:
Citar
Assume s is a string of lower case characters.

Write a program that prints the number of times the string 'bob' occurs in s. For example, if s = 'azcbobobegghakl', then your program should print

Number of times bob occurs is: 2

3ero y el cual estoy peleando:
Citar
Write a program that prints the longest substring of s in which the letters occur in alphabetical order. For example, if s = 'azcbobobegghakl', then your program should print

Longest substring in alphabetical order is: beggh


In the case of ties, print the first substring. For example, if s = 'abcbcd', then your program should print

Longest substring in alphabetical order is: abc

No se si poner los codigos o no, cuando ustedes lo terminen lo ponemos de esa forma comparamos.

EDIT: Completados todos.
Estaba aproximandome mal a la solucion del ultimo.
En ves de hacer una comparacion valor anterior con valor actual, hacia valor actual con proximo valor, y eso daba mas dolores de cabeza que nunca.

Lo que si me parecio bastante raro es que en la lina del interprete poniendo esto:

Código: Python
  1. a = 10
  2. def f(x):
  3.       return x + a
  4. a = 3
  5. f(1)
Resultado: 4

Sea valido ( a pesar que "a" no es un parametro que se paso a la funcion, y no de un error.
« Última modificación: 29 de Agosto de 2015, 10:19:40 por KILLERJC »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Curso de edx por arrancar
« Respuesta #4 en: 29 de Agosto de 2015, 14:04:20 »
Solución al primero:
Código: Python
  1. import re
  2. print(len(re.findall('[aeiou]', 'azcbobobegghakl')))


Solución al segundo:
Código: Python
  1. import re
  2. print(len(re.findall('(?<=bo)b', 'azcbobobegghakl')))


El último es un poco más largo:
Código: Python
  1. # -*- coding: cp1252 -*-
  2. s = 'azcbobobegghakl'
  3.  
  4. # Divide la cadena en subcadenas ordenadas
  5. subs = [[]]
  6. old_c = None
  7. for c in s:
  8.    if c >= old_c:
  9.       subs[-1].append(c)
  10.    else:
  11.        subs.append([c])
  12.    old_c = c
  13.    
  14. # Une los caracteres de cada subcadena en orden inverso
  15. subs = [''.join(s)  for s in subs[::-1]]
  16.  
  17. # Encuentra la última cadena más larga
  18. maxs = ''
  19. for s in subs:
  20.     if len(s) > len(maxs): maxs = s
  21. print (maxs)

Un saludo.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Curso de edx por arrancar
« Respuesta #5 en: 29 de Agosto de 2015, 16:19:41 »
¿Esto se supone que es nivel básico? Hay instrucciones que ni había visto en los tutoriales que estoy leyendo.

Código: Python
  1. a = 10
  2.     def f(x):
  3.           return x + a
  4.     a = 3
  5.     f(1)
En este trozo de código entiendo el resultado lo que no entiendo el porque usa el valor de a = 3 que esta fuera de la función y no usa el valor de a = 10 el cual también se encuentra fuera de la función.

Saludos!
« Última modificación: 29 de Agosto de 2015, 16:28:45 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Curso de edx por arrancar
« Respuesta #6 en: 29 de Agosto de 2015, 17:57:52 »
El código que he puesto no es difícil de entender... después de estudiarlo. Tiene muchos conceptos propios de Python que se tienen que ver poco a poco. Imagino que todo se irá viendo más adelante. Lo importante por ahora es saber que Python es muy potente para esas operaciones.


El segundo ejemplo es sencillo, igual que c.
a es una variable global, funciona igual que c.

a = 10
f(1)
Dará un resultado de 11

Si luego haces:
a=5
f(2)
Dará un resultado de 7

En cada momento toma el valor actual de a.
Un saludo.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Curso de edx por arrancar
« Respuesta #7 en: 29 de Agosto de 2015, 18:11:26 »
Entiendo gracias Picuino, lo que no encuentro es que hace el import re ni lo que hace findall aunque la traducción parece que seria buscar todos los 'aeiou'

Gracias de nuevo.

Ya lo encontré:

re.findall(pattern, string, flags=0)

    Return all non-overlapping matches of pattern in string, as a list of strings. The string is scanned left-to-right, and matches are returned in the order found. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result unless they touch the beginning of another match.

    New in version 1.5.2.

    Changed in version 2.4: Added the optional flags argument.
« Última modificación: 29 de Agosto de 2015, 18:23:20 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Curso de edx por arrancar
« Respuesta #8 en: 29 de Agosto de 2015, 19:12:32 »
Primero
Citar
Entiendo gracias Picuino, lo que no encuentro es que hace el import re ni lo que hace findall aunque la traducción parece que seria buscar todos los 'aeiou'

Lo bueno de python que tenes toda la API en internet

https://docs.python.org/2/library/re.html
https://docs.python.org/2/howto/regex.html

Y lo correcto, por que esta entre [], es que busca todos los 'a','e','i','o','u'

Citar
¿Esto se supone que es nivel básico?

Si es basico, nomas que tenes mas herramientas para hacerlo ademas de "lo basico", por ejemplo como Picuino uso, las RE

Con regular expresion era mucho mas "corto" facil de hacerlo, MI primer idea fue hacerlo asi tambien, pero parece que SU(la gente de los cursos) idea era no meter justamente re. sino hacerlo con lo "basico" y las funciones built-in que habia.

Tu ultimo codigo Picuino se acerca bastante al mio, aunque no lo especifique deberia ser la primera cadena mas larga que encuentre, en la condicion lo dice, en caso de haber un "empate" debe ser la primera. Y tu codigo en este string:

s = 'loyqgcosalsdaosbrlr'

da como resultado: aos
cuando deberia dar: loy

Imagino que con un simple cambio de una codicion ya estaria.

Igual esta:

s = 'zyxwvutsrqponmlkjihgfedcba'

ocurre exactamente lo mismo. o podes tomar 'z' o podes tomar 'a' , aunque si es la primera es 'z'.

Con respecto a los primeros codigos no se si se pueda hacer con regular expresion, en realidad deberias evitarlo a mas no poder a las RE por la lentitud de las mismas (si es que no mal recuerdo cuando lei sobre su funcionamiento). Aunque es una solucion valida. Presento la solucion a los primeros 2 codigos que son demasiados simples:

Código: Python
  1. x=0
  2. for a in ['a','e','i','o','u']:
  3.     x += s.count(a)
  4. print ('Number of vowels: '+str(x))

Código: Python
  1. x = 0
  2. count = 0
  3. while True:                 #do..While
  4.     x = s.find('bob',x)+1
  5.     if(x<=0):
  6.         break               #it can't find anything more
  7.     else:
  8.         count += 1          #it found 1
  9.  
  10. print ('Number of times bob occurs is: '+str(count))

Me recuerda cuando me pidieron en el curso que debia sumar los numeros del 1 a end, e imprimirlas. Mi solucion fue:

Código: Python
  1. print ((end*(end+1))/2)
  2. #o
  3. print(sum(range(end)))

Pero queria que lo hiciera con un while, asi que no fue valido.


----------

Lamentablemente no se usar el timeit como para probar realmente cuanto tarda el codigo
« Última modificación: 29 de Agosto de 2015, 19:53:02 por KILLERJC »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Curso de edx por arrancar
« Respuesta #9 en: 30 de Agosto de 2015, 05:40:49 »
Para usar timeit:
Código: Python
  1. import timeit
  2.  
  3. init = """
  4. import re
  5. s = 'azcbobobegghakl'
  6. """
  7.  
  8. prog1 = "len(re.findall('[aeiou]', s))"
  9.  
  10. prog2 = """
  11. x=0
  12. for a in ['a','e','i','o','u']:
  13.   x += s.count(a)
  14. """
  15.  
  16. def runtime(init, prog):
  17.    return 10*min(timeit.Timer(prog, setup=init).repeat(3, 100000))
  18.  
  19. print(runtime(init, prog1))
  20. print(runtime(init, prog2))

Tu código es más rápido (resultados en microsegundos):

Código: [Seleccionar]
prog1 = 3.42162068642
prog2 = 2.39134226419


El problema con el orden de las subcadenas está en una errata de mi programa. donde pone:

Código: Python
  1. for s in subs:
  2.    if len(s) > len(maxs): maxs = s

debería poner

Código: Python
  1. for s in subs:
  2.    if len(s) >= len(maxs): maxs = s

¡¡¡Que cuidadín hay que tener con las condiciones!!!

Un saludo.
« Última modificación: 30 de Agosto de 2015, 05:45:11 por Picuino »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Curso de edx por arrancar
« Respuesta #10 en: 30 de Agosto de 2015, 06:44:35 »
Citar
¡¡¡Que cuidadín hay que tener con las condiciones!!!

Por eso decia que seguro era una condicion y se arreglaba xD, pero si un error y seguro que anda todo mal.

Como ya pusiste el codigo que da la solucion, aca dejo el mio.

Código: Python
  1. ans=''
  2. temp=s[0]
  3. for x in s[1:]:
  4.     if(temp[-1]<=x):
  5.         temp+=x
  6.     elif(temp[-1]>x):
  7.         if(len(ans)<len(temp)):
  8.             ans=temp
  9.         temp=x
  10. if(len(temp)>len(ans)):
  11.    ans=temp
  12.  
  13. print ('Longest substring in alphabetical order is: '+str(ans))

Mi anterior programa tenia el problema que me habia centrado en tomar valores por delante de lo que iba. Me explico:

Código: Python
  1. for x in range(len(s)-1):
  2.     if s[x]<=s[x+1]:
  3.         #...

Eso hacia que si usaba len(s) me pasaba del indice. Y luego era un dolor de cabeza intentar arreglar ese ultimo valor.
Y bueno para el que no entiende el codigo, a diferencia de Picuino que va guardando todas las posibilidades y luego revisa cual es mayor (te digo que se me paso por la cabeza hacer lo mismo, pero me encerre que deberia ser un poco mas simple).
Yo guardo la primera posibilidad en "ans" mientras voy creando la nueva en "temp", cuando termina de encontrar una posibilidad pregunta si es mayor a la guardada en ans y va en busca de otra hasta terminar el string. en caso de ser la ultima ( o que no se haya actualizado ans para nada) el ultimo if carga el valor.

Esta asumido que la string contiene al menos 2 letras.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Ejercicios de Python. Curso edX
« Respuesta #11 en: 30 de Agosto de 2015, 07:30:33 »
He divivido el hilo para tratar aparte los problemas del curso edX
Por un pequeño fallo al dividir el tema, he tenido que editar el primer mensaje de KILLERJC para juntar dos mensajes en uno.
Un saludo.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Ejercicios de Python. Curso edX
« Respuesta #12 en: 30 de Agosto de 2015, 07:42:25 »
Yo guardo la primera posibilidad en "ans" mientras voy creando la nueva en "temp", cuando termina de encontrar una posibilidad pregunta si es mayor a la guardada en ans y va en busca de otra hasta terminar el string. en caso de ser la ultima ( o que no se haya actualizado ans para nada) el ultimo if carga el valor.

Python maneja listas de forma muy eficiente y con poco código. Cuando programo en Python intento centrarme más en hacer el programa sencillo de entender y genérico:
  Primero formateo los datos para conseguir todas las soluciones en una base de datos ordenada (una lista)
  Luego extraer los datos que interesa.
Si más tarde te interesa extraer otros datos, la modificación es trivial.

Hay que tener en cuenta que Python es interpretado. Su fuerte no es la rapidez (aunque sea muy rápido), sino la legibilidad y facilidad de mantenimiento.
Python es uno de los lenguajes más fáciles de mantener. Si programas bien, puedes volver a el dos años despues y reutilizar el código, quitar un bug o añadir funcionalidades con mucha facilidad.

Si quieres código muy rápido, mejor ir al c
En Python hay que esforzarse por hacer código sencillo de entender.


Copio aquí el Zen de Python:
https://www.python.org/dev/peps/pep-0020
http://mundogeek.net/archivos/2007/07/02/el-zen-de-python/
Citar
Hace mucho tiempo el entusiasta de Python Tim Peters plasmó de forma concisa los principios de diseño por los que guiarse al escribir en Python según el BDFL (NT: Benevolent Dictator for Life o Dictador Benévolo de por Vida, en este caso Guido van Rossum, el creador de Python) en 20 aforismos, de los cuales sólo 19 han pasado a forma escrita.

    1. Hermoso es mejor que feo.
    2. Explícito es mejor que implícito.
    3. Simple es mejor que complejo.
    4. Complejo es mejor que complicado.
    5. Plano es mejor que anidado.
    6. Disperso es mejor que denso.
    7. La legibilidad cuenta.
    8. Los casos especiales no son suficientemente especiales como para romper las reglas.
    9. Aunque lo pragmático gana a la pureza.
    10. Los errores nunca deberían dejarse pasar silenciosamente.
    11. A menos que se silencien explícitamente.
    12. Cuando te enfrentes a la ambigüedad, rechaza la tentación de adivinar.
    13. Debería haber una — y preferiblemente sólo una — manera obvia de hacerlo.
    14. Aunque puede que no sea obvia a primera vista a menos que seas holandés. (NT: Guido van Rossum es holandés)
    15. Ahora es mejor que nunca.
    16. Aunque muchas veces nunca es mejor que *ahora mismo*.
    17. Si la implementación es difícil de explicar, es una mala idea.
    18. Si la implementación es sencilla de explicar, puede que sea una buena idea.
    19. Los espacios de nombres son una gran idea — ¡tengamos más de esas!

Atención a la 13. Es la que diferencia Python de Ruby. Python intenta que las cosas se hagan de una sola manera, Ruby de muchas maneras.
Esto hace a Ruby más divertido, y mucho menos mantenible.

Saludos.
« Última modificación: 30 de Agosto de 2015, 10:30:23 por Picuino, Razón: Corregida numeración de puntos 17,18 y19 »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Ejercicios de Python. Curso edX
« Respuesta #13 en: 30 de Agosto de 2015, 07:54:31 »
6. Disperso es mejor que denso.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ejercicios de Python. Curso edX
« Respuesta #14 en: 30 de Agosto de 2015, 09:36:10 »
Entiendo...

Es una cosa que no tuve en cuenta al ser interpretado.
Yo toque un poco de Perl en un momento y si no mal recuerdo Ruby me parecia una mezcla de Perl/Python


 

anything