From e1936018fa132037ada2e3954ae5c641b6b19247 Mon Sep 17 00:00:00 2001 From: Pablo Moleri Date: Tue, 14 Jul 2009 03:58:34 +0000 Subject: 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. --- 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)) -- cgit v0.9.1