Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Yidu

#51
Pues eso...

Supongo que es un libro que conocereis todos. Poco a poco,  su autor lo ha ido traduciendo a la lengua de Cervantes. Y ahora, creo,  esta mas o menos completo.

A ver si se anima y traduce tambien los otros que tiene. Ya que pintan muy bien.
Desde aqui doy las gracias a su autor por la iniciativa.

Inventa tus propios juegos de computadora con Python
http://inventwithpython.com/es/
#52
Cita de: Eleкtro en 19 Julio 2015, 04:45 AM
Si, a mi me tarda 4 segundos el último código que publiqué (redondeando los

Determina si el valor "count" es un múltiplo de 1.000.000

¿Por qué 1.000.000 y no 100.000?, para reducir la escritura en el buffer y así incrementar el rendimiento general.



Ah, vale. Aunque no entiendo de todo el proceso. Veo que modificando este valor, el contador va mas deprisa o despacio. Dicho linea la he modificado a:

Código (python) [Seleccionar]
elif (count%100000000 == 0):

Para un testeo de:

Código (python) [Seleccionar]
if (count == 1.481076071314056e+16):

Ahora la salida por consola va con una cuenta de 100.000.000. Igual tengo que abortar el proceso, claro. Si todo fuera bien, me tendria que mostrar la ultima combinacion de esas 1.481076071314056e+16.

Me gusta la idea que has mostrado. Ya que de esa forma, no se te inunda la pantalla de tuplas y en cambio aparece como un contador. Lo siguiente seria crear el codigo para que reste las combinaciones que van apareciendo con el total de las mismas. Asi, sabriamos lo que falta para que termine el proceso.

Por cierto, para que este numero:  1.481076071314056e+16 lo podamos dejar en entero con hacer
Código (python) [Seleccionar]
int(1.481076071314056e+16)
>>> 14810760713140560
es suficiente ¿No?


Saludos!
#53
Si, pero en esos casos el tiempo de calculo es minimo...10 segundos, 20 segundos, incluso horas.

Pero imagina si has de tratar con combinaciones que arrojan cifras como esta:

2.245100430901328e+16

Es decir, 200 numeros en combinaciones de 10 grupos. Ahi, da igual que imprimas por pantalla, que no. Seguramente tardaria años en arrojar algun resultado.

Ya que cuando subimos un poco el numero de grupos,  las combinaciones son intratables.

Por cierto, a mi me tarda unos diez segundos el calculo,  que te tarda cuatro a ti. Eso ya es cosa de ordenadores, supongo.

Tengo una duda con esta linea:
Código (python) [Seleccionar]
elif (count%1000000 == 0):

¿Que hace realmente? Esta claro que trata de hallar el resto de la operacion ¿Pero el parametro 1000000 es siempre fijo?
#54
Cita de: Eleкtro en 18 Julio 2015, 18:44 PM

Te entiendo perfectamente, pero imprimir en la consola implica un mayor, mucho mayor tiempo de procesado.

Lo que se suele hacer en estos casos con algoritmos "pesados" es mostrar una barra o texto de progreso indeterminado (ej: "Calculating values, please wait..."), ya que, o prescindes de la información visual en pantalla, o prescindes del rendimiento del algoiritmo en general, ¡tú decides a que darle mayor prioridad!.

Saludos!

Ok. Supongo,  que dependiendo del ordenador, a mi me puede tardar 18 segundos y en otro mas potente, 1 segundo o menos.

RECTIFICACION:

No puedo poner nunca que me de la combianacion 100.000.000. Por el simple hecho que 100 numeros en grupos de 5, da como maximo 75287520 combinaciones.

En todo caso, por ejemplo, ponemos:

Código (python) [Seleccionar]
if indice == 75000000:
       print('La combinacion con indice', indice, 'es', x)


Y si nos arroja:

Código (python) [Seleccionar]
La combinacion con indice 75000000 es (66, 77, 86, 90, 100)
0:00:20.209156
#55
Cita de: Eleкtro en 18 Julio 2015, 14:30 PM
1. La razón de que el código de arriba demore siglos es por que estás imprimiendo cada valor en el buffer de salida de la consola (stdOut), mientras eso sea así no puedes pretender que la respuesta sea "inmediata". elimina el "print" y resuelto.



2. Puedes disminuir considerablemente el tiempo de "respuesta" omitiendo la escritura en la consola, por ejemplo añadiendo los valores a una variables, y luego, si quieres, imprimir una única vez en la consola:

Muchas gracias. Desde luego que mejora considerablemente. De hecho he probado que halle la combinacion 100.000.000 y ha tardado 18 segundos en darla.

El script del punto 2,  lo probare. Ya que aun no sabia que se podia meter la funcion enumerate en una variable.

De todas formas, creo recordar, que probe alguna vez algo parecido a lo que comentas. Osea, que no imprimiera toda la iteracion de las combinaciones por pantalla. Pero claro, como la consola se quedaba en espera no sabia si iba a tardar un minuto en darme el resultado o en un mes  :rolleyes: En cambio, al imprimir por pantalla sabes cuantas combinaciones faltan para el testeo. Pero bueno, de momento me conformo con tu idea.

Muchas Gracias!  :D

#56
Pues me he estancado.

Aunque ya he realizado alguna consulta por la web, no le veo solucion a mi duda. O todavia no tengo los conocimientos para desarrollar el codigo.
Mi duda:

Escogemos 100 numeros del 1 al 100. Y acto seguido pedimos las combinaciones de 5 grupos. Total 75287520 combinaciones. Correcto. Pero,  si por ejemplo, quiero que me de la combinacion con su indice 1000000 me tarda unos 9 segundos a recorrer dichas combinaciones con un ciclo FOR (que tambien probe con un WHILE).

¿Como le puedo pedir a un script que me devuelva de forma inmediata las combinaciones a traves del indice que se le indica? Ya no hablo de arreglos (que se podria hacer para pocos vectores).

La duda me viene por que no se como los programas construyen las combinaciones o el algoritmo que usan.

En el ejemplo que detallo, para encontrar la combinacion que se haya en la posicion o indice 1000000 tarda unos 9 segundos ¿Se puede hacer que de forma inmediata nos la de? Con un FOR, creo, desde luego que no. Ya que debe recorrer todas ellas hasta llegar a la posicion 1000000

Código (python) [Seleccionar]
import itertools
from datetime import datetime


inicio = datetime.now()
muestra = tuple(range(1, 101))
for indice, x in enumerate(itertools.combinations(muestra, 5),1):
    print(indice, x)
    if indice == 1000000:
        print('La combinacion con indice', indice, 'es', x)
        break
       
final = datetime.now()
tiempo = final - inicio
print(tiempo)


Salida:

Código (python) [Seleccionar]
...
999994 (1, 9, 18, 21, 29)
999995 (1, 9, 18, 21, 30)
999996 (1, 9, 18, 21, 31)
999997 (1, 9, 18, 21, 32)
999998 (1, 9, 18, 21, 33)
999999 (1, 9, 18, 21, 34)
1000000 (1, 9, 18, 21, 35)
La combinacion con indice 1000000 es (1, 9, 18, 21, 35)
0:00:09.510784


Si pedimos un indice mayor o jugamos con otras combinaciones, nos puede arrojar horas, dias o semanas en devolvernos la combinacion con el indice pedido ¿No?

#57
¡Muchas gracias! Que simple. Con las vueltas que le dí. Tendré que echar mas de un vistazo a las built-ins. En todo caso me equivoque en esta línea:

Código (python) [Seleccionar]
num = 4
matriz = [[1,2,3],[4,5,6],[7,8,9]]
num in lista # Aquí debería haber puesto:



Código (python) [Seleccionar]

num in matriz


Tu línea la he modificado para Python 3:

Código (python) [Seleccionar]
print (any(value in arr for arr in arr2D))

Por si alguien usa esta versión y le da error. Supongo que otra forma sería definiendo nosotros la función. Como cita en el ejemplo del enlace que has posteado.

¡Saludos!
#58
Hola.

Antes de postear he dudado en hacerlo. Porque supongo que la solución será muy fácil. Pero por más que le doy vueltas no doy con la tecla.

Para saber si un elemento esta en una lista o vector, solo hemos de hacer así:

Código (python) [Seleccionar]
num = 4
lista = [1,2,3,4,5]
num in lista


Y nos devuelve True.

¿Pero como hacerlo 'fácil' si hemos de hacer la comprobación en una matriz?

Código (python) [Seleccionar]
num = 4
matriz = [[1,2,3],[4,5,6],[7,8,9]]
num in lista


Logicamente nos devolverá False. Ya que comprobará el número 4 con una lista o vector entero.

Hacer esto, no lo veo del todo bien:

Código (python) [Seleccionar]
num in matriz[0] or num in matriz[1] or num in matriz[2]

Y si usamos un ciclo For, como el número a comprobar esta en matriz[1], nos devolverá False. Ya que la variable de control del For se detendrá en matriz[2]. Y como allí no esta el 4, dará False.

La pregunta, es, ¿Cómo enfocarlo en estos casos?


Bueno, saludos!
#59
Yo te recomiendo este libro sin dudarlo. Ya que trata de algoritmos con Python. Y luego, hacia el final, explican la programación orientada a objetos. También hay un canal muy bueno. Te paso los dos enlaces:

LIBRO:

http://www.etnassoft.com/biblioteca/algoritmos-y-programacion-con-lenguaje-python/

CANAL YOUTUBE:

https://www.youtube.com/playlist?list=PLEtcGQaT56chpYflEjBWRodHJNJN8EKpO

Y enfocado a POO:

https://www.youtube.com/playlist?list=PLEtcGQaT56cj70Vl_C1qfUinyMELunL-N

Espero te sirva!
#60
Dándole vueltas al asunto (e intentando crear esta estructura sin POO) me asaltan nuevas dudas.

De momento quiero crear un árbol simple, osea, binario. Los numerosos ejemplos se basan en la raíz principal y dos nodos izquierdo y derecho. Para estos ejemplos se usan números.
En el nodo principal (padre) se pone un número cualquiera. Y los que se generan después, si son mayor o igual al nodo padre, se sitúan al nodo derecho. Si son menores, al nodo izquierdo. Esto se va repitiendo y creando por los diferentes nodos.

Bien, ¿Pero como se implementa cuando se trata de preguntas y no números? He de suponer que ya no vale el 'mayor o igual que' o 'menor que' ¿Estos operadores se sustituyen en su caso por 'si' y 'no'?

Cuando tenga un primer borrador de código lo posteo. Aunque seguro que me lloverán criticas a diestro y siniestro.