Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Moleri <pmoleri@PABLOMOLERI-PC.(none)>2009-07-14 03:58:34 (GMT)
committer Pablo Moleri <pmoleri@PABLOMOLERI-PC.(none)>2009-07-14 03:58:34 (GMT)
commite1936018fa132037ada2e3954ae5c641b6b19247 (patch)
treec1e94116a66d38d81a86c11868198b46b6300462
parent0740b18fa60a62ef2d3358456a93e7f85ac840b2 (diff)
Se implementan 3 niveles
1 - números del 1 al 6 con resultados menores a 200 2 - números del 1 al 9 con resultados menores a 500 3 - todos los números del 4 al 9 Al cambiar el nivel automáticamente genera una nueva serie.
-rwxr-xr-xparentesis.activity/logica.py96
-rwxr-xr-xparentesis.activity/parentesis.py23
2 files changed, 72 insertions, 47 deletions
diff --git a/parentesis.activity/logica.py b/parentesis.activity/logica.py
index dbe23a1..a96c74c 100755
--- a/parentesis.activity/logica.py
+++ b/parentesis.activity/logica.py
@@ -1,3 +1,5 @@
+# -*- coding: cp1252 -*-
+
import re
import random
import types
@@ -8,7 +10,7 @@ import types
## Definicion a manopla para formulas de nivel 1
pattern1 = "\S*\(\S*\+\S*\)\S*" # ( ... + ... ) al menos un mas en el medio
pattern2 = "(\+\)|\*\)|\(\+|\(\*)" # ni (+ ni (* ni +) ni *)
-pattern3 = "^\(\S*\)$" # parentesis al principio y parentesis al final
+pattern3 = "^\(\S*\)$" # no parentesis al principio y parentesis al final
CANT_NUM = 6
def imprimirConfiguracion():
@@ -29,6 +31,7 @@ def validarString(s, original):
elif re.search(pattern3, s):
return None
elif eval(str(s)) == eval(str(original)): ## Python me obliga a poner str :(
+ # Elimina los casos en que los paréntesis van en sus posiciones triviales
return None
elif re.search(pattern1, s):
return s
@@ -60,19 +63,16 @@ def testearValidarStringNivelUno():
print "FIN DEL TEST!"
#notar los parametros opcionales ---remover---
-def generarListaNum(cant_num = CANT_NUM, rango_max = 9):
+def generarListaNum(cant_num, opciones = range(1,10) ):
"""genera una lista de tamano cant_num, con numeros entre 2 y rango_max
- uqe no pueden estar repetidos"""
- if cant_num + 1 > rango_max:
- return None ### deberia de tirar una excepcion esto es MAL ESTILO TO DO
- lista = []
- while len(lista) < cant_num:
- num = random.randint(2,rango_max)
- if not lista.count(num):
- lista.append(num)
+ que no pueden estar repetidos"""
+ if cant_num > len(opciones):
+ return None ### deberia de tirar una excepcion esto es MAL ESTILO TO DO
+ random.shuffle(opciones)
+ lista = opciones[:cant_num]
return lista
-def generarListaOp(cant_op = CANT_NUM - 1):
+def generarListaOp(cant_op):
""" genera una lista de largo cant_op alternando * y +, empezando por *"""
i = 1
lista = []
@@ -96,10 +96,7 @@ def alternarElementosLista(lst1, lst2):
lista.append(lst2[i])
i += 1
#si quedan elementos en la lista 1 los agrego
- largoNuevo = len(lst1)
- while i < largoNuevo:
- lista.append(lst1[i])
- i += 1
+ lista.extend(lst1[i:])
return lista
@@ -107,42 +104,63 @@ def alternarElementosLista(lst1, lst2):
def generarCasos(cant_num = CANT_NUM, nivel = 1): ## TO DO!
"""Recibe un numero y devuelve una lista con todos los casos posibles y con
los parentesis bien puestos"""
- listaNum = generarListaNum()
- listaOp = generarListaOp()
+
+ if nivel == 1:
+ opciones = range(1,7)
+ elif nivel == 2:
+ opciones = range(1,10)
+ elif nivel == 3:
+ opciones = range(4,10)
+ else:
+ opciones = range(4,10)
+
+ # Genera listas de números, operaciones y las intercala
+ listaNum = generarListaNum(cant_num, opciones)
+ listaOp = generarListaOp(cant_num-1)
base = alternarElementosLista(listaNum, listaOp)
baseStr = listaToString(base)
- i1 = buscarProxNum(base, 0)
- res = []
- while i1 < len(base) : ## mientras tenga sentido poner un '('
+
+ res = [] # Respuestas
+
+ # Genera todos los casos posibles haciendo todas las convinaciones válidas de i1 y i2,
+ # siendo éstos los índices de los paréntesis que se agregan
+ i1 = 0
+ while i1 < len(base): ## mientras tenga sentido poner un '('
lst = base[:]
lst.insert(i1, '(')
- i2 = i1 + 6 # lo pongo en la posicion para insertar ')'
- lst2 = lst[:]
- lst2.insert(i2, ')')
-
- aux = listaToString(lst2)
- if validarString(aux, baseStr) != None:
- res.append(aux)
-
- while i2 < len(base): ## chequear si es menor o menor e igual TO DO
+ # Parte de la lista 'lst' y busca todas las posiciones donde se pueden poner
+ # paréntesis que cierran.
+ # Parte de i1+4 (1, por el paréntesis que se agregó, 2 hasta el siguiente número, 1 más para insertar después del número)
+ i2 = i1 + 4
+ while i2 <= len(base): ## chequear si es menor o menor e igual TO DO
lst2 = lst[:]
- i2 += 2
lst2.insert(i2, ')')
aux = listaToString(lst2)
if validarString(aux, baseStr) != None:
res.append(aux)
-
- i1 = buscarProxNum(base, i1 + 1)
+ i2 += 2
- ## ( 1 * 2 + 3 * 4 + 5 * 6)
- return res
-
-### Ejemplo de devolucion lista = ["(1*2+3)*4 + 5 * 6", "1*2+3 * (4+5)*6"]
+ i1 = buscarProxNum(base, i1 + 1)
+
+ validar = lambda x: validarNivel(x, nivel)
+ return filter(validar, res)
+ ### Ejemplo de devolucion lista = ["(1*2+3)*4 + 5 * 6", "1*2+3 * (4+5)*6"]
+
+def validarNivel(string, nivel):
+ if nivel == 1:
+ # Sólo resultados menores a 300
+ return eval(string) <= 200
+ elif nivel == 2:
+ return eval(string) <= 500
+ else:
+ # Para el resto de los niveles siempre devuelve True
+ return True
def listaToString(lst):
"""Transforma una lista de cualquier cosa en un string conformado por la concatenacion de str de cada elemento """
texto = ''
+
for x in lst:
texto += str(x)
return texto
@@ -174,13 +192,13 @@ def buscarProxNum(lista, start = 0):
### [8, '*', 2, '+', 6, '*', 7, '+', 9, '*', 4]
-listaNum = generarListaNum()
-listaOp = generarListaOp()
+listaNum = generarListaNum(CANT_NUM)
+listaOp = generarListaOp(CANT_NUM-1)
res = alternarElementosLista(listaNum, listaOp)
if __name__ == "__main__":
testearValidarStringNivelUno()
lst = generarCasos()
for x in lst:
- print x
+ print "%s = %s" % (x, eval(x))
diff --git a/parentesis.activity/parentesis.py b/parentesis.activity/parentesis.py
index e49374b..ecc905e 100755
--- a/parentesis.activity/parentesis.py
+++ b/parentesis.activity/parentesis.py
@@ -25,17 +25,18 @@ class Controlador:
#self.serie = logica.generarCasos() # obtiene una serie o el conjunto de casos a resolver
#self.total_casos = len(self.serie) # los casos totales de la serie
#self.total_casos_pasados = 0 # cuenta los casos resueltos
+ self.level = 1
self.siguienteSerie()
def siguienteSerie(self):
- self.serie = logica.generarCasos()
+ self.serie = logica.generarCasos(nivel = self.level)
self.total_casos = len(self.serie) # los casos totales de la serie
self.total_casos_pasados = 0 # cuenta los casos resueltos
self.casoActual = self.serie.pop()
self.resActual = eval(self.casoActual)
self.fraccion_pbar = 1.0 / self.total_casos # calculo cuanto tiene que avanzar la barra en base a los casos totales
self.listaCasosResueltos = []
-
+
def siguienteCaso(self):
"""Obtiene el siguiente caso, si no hay mas casos, genera una serie"""
self.total_casos_pasados += 1
@@ -67,13 +68,13 @@ class Vista:
w.resize(SCREENSIZE[0], SCREENSIZE[1])
return w
-
+
def crear_combo_box_niveles(self):
- cbox = gtk.combo_box_entry_new_text() ## Funcion ULTRAMAGICA sacada de internet!. Ver manual para mas informacion.
- cbox.append_text('Nivel 1 (no sirve)')
- cbox.append_text('Nivel 2 (no sirve)')
- cbox.append_text('Nivel 3 (no sirve)')
- cbox.set_active(0)
+ cbox = gtk.combo_box_new_text()
+ cbox.append_text('Nivel 1 (1..6 < 200)')
+ cbox.append_text('Nivel 2 (1..9 < 500)')
+ cbox.append_text('Nivel 3 (4..9)')
+ cbox.set_active(0) # Selecciona el primero como activo
return cbox
@@ -97,6 +98,7 @@ class Vista:
self.combobox = self.crear_combo_box_niveles()
+ self.combobox.connect("changed", self.level_changed)
self.combobox.show()
self.botonAyuda = self.crear_boton_ayuda()
@@ -145,6 +147,11 @@ class Vista:
self.MostrarProblema(self.contr.casoActual)
self.window.show()
+ def level_changed(self, combobox):
+ self.contr.level = combobox.get_active() + 1
+ self.contr.siguienteSerie()
+ self.MostrarProblema(self.contr.casoActual)
+
def crear_etiqueta_instrucciones(self):
et = gtk.Label("Debes poner los parentesis para que el resultado sea " +
str(self.contr.resActual))