elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Python (Moderador: Danielㅤ)
| | |-+  [Python] Ayuda con "Runtime error"
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Python] Ayuda con "Runtime error"  (Leído 4,077 veces)
nacho87

Desconectado Desconectado

Mensajes: 71


Ver Perfil WWW
[Python] Ayuda con "Runtime error"
« en: 14 Diciembre 2009, 19:01 pm »

Hola a todos!

Estoy haciendo un pequeño programa en python para resolver éste problema: http://juegos.microsiervos.com/matematicas/17-por-17.html

Bueno, la verdad es que no pretendo resolverlo ya que es bastante dificil pero estoy aprendiendo bastante creando un programa que lo intente. En resumen el problema trata de crear una matriz 17x17 en la que con 4 colores distintos (números) no se formen "rectángulos virtuales", es decir, que no haya los mismos 4 números en formando las esquinas de ningún rectángulo en la matriz.

Por ahora con mi programa consigo si problema hasta las de 11x11, sin embargo al pasar a las 12x12 python me da un error pasado un rato que no se cómo evitar. El code de mi programa es el siguiente:

Código
  1. #!/usr/bin/python
  2.  
  3. import numpy
  4. from random import uniform
  5. import os
  6. import sys
  7. m = int(sys.argv[1])
  8. matriz = numpy.zeros((m,m), dtype="int")
  9. x = 0
  10. y = 0
  11. uno = 0
  12. dos = 0
  13. tres = 0
  14. cuatro = 0
  15. count = 0
  16. error = 0
  17. def check(num,x,y):
  18. column = []
  19. #print "x=%s,y=%s" % (x,y)
  20. for col in range(0,x):
  21. if num == matriz[col][y]:
  22. column.append(col)
  23. #print "colision de columna en %s %s con numero %s" % (col,y,num)
  24. if col == x - 1:
  25. return column
  26.  
  27. def check2(num,x,y):
  28. fila = []
  29. #print "x=%s,y=%s" % (x,y)
  30. for fil in range(0,y):
  31. if num == matriz[x][fil]:
  32. #print "colision de fila en %s %s con numero %s" % (x,fil,num)
  33. fila.append(fil)
  34. if fil == y - 1:
  35. return fila
  36.  
  37.  
  38.  
  39.  
  40. def colision(nam,x,y):
  41. i=0
  42. j=0
  43. if x==0 or y==0:
  44. return 1
  45. micol = check(nam,x,y)
  46. mifil = check2(nam,x,y)
  47. #print micol
  48. #print mifil
  49. if micol == None:
  50. return 1
  51. elif mifil == None:
  52. return 1
  53. else:
  54. for i in micol:
  55. for j in mifil:
  56. if matriz[i][j] == nam:
  57. #print "colision de diagonal en %s %s con numero %s" % (i,j,nam)
  58. return 0
  59. return 1
  60.  
  61.  
  62. def fix(nam,x,y,countck):
  63. i=0
  64. j=0
  65. micol = check(nam,x,y)
  66. mifil = check2(nam,x,y)
  67. for i in micol:
  68. for j in mifil:
  69. if matriz[i][j] == nam:
  70. mynewnum = int(uniform(1,5))
  71. while mynewnum == nam:
  72. mynewnum = int(uniform(1,5))
  73. if countck > 20 and countck < 40:
  74. countck = 0
  75. matriz[i][j] = mynewnum
  76. elif countck >= 40:
  77. countck = 0
  78. matriz[x][j] = mynewnum
  79. else:
  80. matriz[i][y] = mynewnum
  81. #print "cambio (%s,%s) por %s porque colisiona con (%s,%s)" % (i,y,mynewnum,i,j)
  82. def checkear(countck):
  83. x = 1
  84. y = 1
  85. while True:
  86. if colision(matriz[x][y],x,y) == 0:
  87. print "matriz con errores en (%s,%s)" % (x,y)
  88. countck += 1
  89. fix(matriz[x][y],x,y,countck)
  90. os.system('clear')
  91. print "\n"*8 + str(matriz)
  92. print countck
  93. checkear(countck)
  94. else:
  95. if x == m - 1:
  96. if y == m - 1:
  97. print "matriz sin errores"
  98. exit()
  99. x = -1
  100. y += 1
  101. x += 1
  102.  
  103.  
  104.  
  105.  
  106.  
  107. while True:
  108. mynum = int(uniform(1,5))
  109. if colision(mynum,x,y) != 0:
  110. matriz[x][y] = mynum
  111. if mynum == 1:
  112. uno +=1
  113. elif mynum == 2:
  114. dos +=1
  115. elif mynum == 3:
  116. tres +=1
  117. elif mynum == 4:
  118. cuatro +=1
  119. #print "x = " + str(x)
  120. #print "y = " + str(y)
  121. os.system('clear')
  122. print "\n"*8 + str(matriz)
  123. print "errores: %s" % error
  124. print "hay %s unos, %s doses, %s treses y %s cuatros" % (uno,dos,tres,cuatro)
  125. if x == m - 1:
  126. if y == m - 1:
  127. checkear(countck = 0)
  128. x = -1
  129. y += 1
  130. x += 1
  131. count = 0
  132. else:
  133. count += 1
  134. if count == 15:
  135. fix(mynum,x,y,0)
  136. matriz[x][y] = mynum
  137. error += 1
  138. os.system('clear')
  139. print "\n"*8 + str(matriz)
  140. print "errores: %s" % error
  141. print "hay %s unos, %s doses, %s treses y %s cuatros" % (uno,dos,tres,cuatro)
  142. if x == m - 1:
  143. if y == m - 1:
  144. checkear(countck = 0)
  145. x = -1
  146. y += 1
  147. x += 1
  148. count = 0
  149.  

Hay partes que están comentadas ya que las usaba para "debugear" el programa ya que lo estoy haciendo con gedit y necesitaba alguna forma de ver donde fallaba.

La cuestión es que al intentar conseguir una matriz 12x12, algo antes de llegar a las 1000 ejecuciones de la función chequear() me lanza el siguiente error:
Código:
Exception RuntimeError:'maximum recursion depth exceeded while calling a Python object' in <type 'exceptions.AttributeError'> ignored

El código es un poco caótico ya que lo fui haciendo sobre la marcha y no tengo mucha idea de programar pero por mucho que lo reviso no encuentro la forma de evitar el error. Espero que me podais ayudar.

Un saludo!!


En línea

pucheto

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: [Python] Ayuda con "Runtime error"
« Respuesta #1 en: 14 Diciembre 2009, 19:14 pm »

El error es bastante claro...
Las recursiones no son infinitas... sino q las podes hacer hasta llenar el stack... si lo llenas... stack overflow...

En este caso... como es una matriz grande... y llamas a checkear muchas veces es muy probable q llegues al limite del stack... cuando eran mas chicas te alcanzaba....

Proba usando stackless python o no usando recursion...


En línea

nacho87

Desconectado Desconectado

Mensajes: 71


Ver Perfil WWW
Re: [Python] Ayuda con "Runtime error"
« Respuesta #2 en: 14 Diciembre 2009, 19:58 pm »

Gracias por la respuesta.

Con matrices más pequeñas(10x10 por ejemplo) encuantra la solución antes de saltar el error. Sin embargo con la de 11x11 hay veces que no la encuentra y el error salta en el mismo punto, poco antes de las 1000 recursiones.

He intentado cambiar el código para no usar la recursión en checkear() pero no se me ocurre como... :(

También he estado mirando lo del stackless. He probado pypy-stackless pero no consigo importar numpy, que lo uso para crear la matriz inicial.

Saludos!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Python: Syntax error en "def" o_o
Scripting
S3kh 1 3,263 Último mensaje 14 Agosto 2011, 01:02 am
por criskapunk
Error al enceder una Foxconn G41S "NOT ENOUGH SPACE IN RUNTIME AREA!!.SMBIOS DAT
Hardware
tito7 2 7,195 Último mensaje 20 Septiembre 2011, 19:36 pm
por Aprendiz-Oscuro
AYUDA: Modificar cadena en Runtime
Ingeniería Inversa
x64core 3 2,729 Último mensaje 7 Marzo 2012, 04:48 am
por Иōҳ
[ayuda] error en python
Scripting
colcrt 2 2,875 Último mensaje 14 Octubre 2015, 22:50 pm
por colcrt
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines