Un TP de programacion / 0 / en python 2013

#-------------------------------------------------------------------------------
# Name:        Trabajo practico numero 16
# Purpose:     funciones y listas
#
# Author:      Vladimiro Gaston D'Achary
#
# Created:     12/10/2013
# Copyright:   (c) camilion 2013
# Licence:     <licenciatura en sistemas - UNGS>
#-------------------------------------------------------------------------------
#!/usr/bin/env python

def main():
    pass

if __name__ == '__main__':
    main()

from math import sqrt

# calcula el diametro
def calculaDiametro(rad:float):
    diametro=2*rad
    return diametro

# calcula el perimetro
def calculaPerimetro(rad:float):
    perimetro=pi*(rad*rad)
    return perimetro

# calcula la superficie
def calculaSuperficie(rad:float):
    superficie=2*pi*rad
    return superficie

def conDivisoresPares(hasta:int):
    ## variable de control para el ciclo while
    i=1
    cont=0
    ## itera hasta llegar al valor ingresado por el usuario en el parametro
    ## y va tanteando si ese mismo valor es divisible por la variable de control
    ## que se comporta como un divisor de "a"
    while i<=hasta:
        ## si el resto de a div i=0 entonces es divisor, y suma sucesivamente los
        ## todos los divisores de a
        if (hasta%i)==0:
            ## si es par lo imprime en patalla
            if i%2==0:
                print(i)
                cont=cont+1
        i=i+1
    ## si no encontro divisores entonces devuelve el mensaje:
    if cont==0:
        print("no tiene divisores pares")

## funcion que recibe como argumento un numero natural "a" y devuelve
## la cantidad de divisores de "a"
def sumaDivisores(hasta:int):
    ## variable de control para el ciclo while
    i=1
    ## es un contador que devuelve en pantalla la cantidad de divisores de a
    cont=0
    acum=0
    ## itera hasta llegar al valor ingresado por el usuario en el parametro
    ## y va tanteando si ese mismo valor es divisible por la variable de control
    ## que se comporta como un divisor de "a", si es divisor de n, lo suma al
    ## acumulador si no lo es solo incrementa la variable de control.
    while i<=hasta:
        ## si el resto de a div i=0 entonces es divisor, y lo muestra en pantalla
        if (hasta%i)==0:
            cont=cont+1
            acum=acum+cont
            i=i+1
        ## si no es divisor solo incrementa la variable de control
        else:
            i=i+1
    ## devuelve el valor acumulado
    return acum

## funcion que recibe como argumento un numero natural "a" y devuelve
## los c primeros divisores de a
def ultimosDivisores(a:int,c:int):
    ## variable para tantear los divisores de a
    i=a
    ## es un contador que devuelve en pantalla la cantidad de divisores de a y
    ## a su vez actua como variable de control del while
    cont=1
    ## itera hasta llegar al valor ingresado por el usuario o hasta que encuentre
    ## los c primeros divisores de a. detiene la iteracion si el usuario ingreso
    ## un argumento que supera la posibilidad de hallar esos c ultimos numeros
    ## divisores
    ## ejemplo:
    ## ultimosDivisores(14,2)  --> { 14 ; 7 }
    ## ultimosDivisores(14,14) --> { 14 ; 7 ; 2 ; 1 }
    while(cont<=c) and (i>=1):
    ## si el resto de a div i=0 entonces es divisor, y lo muestra en
    ## pantalla
        if (a%i)==0:
           print(i)
           cont=cont+1
           i=i-1
        ## si no es divisor solo incrementa la variable de control
        else:
           i=i-1

# funcion que recibe como argumento un numero natural "a" y devuelve
# los c primeros divisores de a
def primerosDivisores(a:int,c:int):
    ## variable para tantear los divisores de a
    i=1
    ## es un contador que devuelve en pantalla la cantidad de divisores de a y
    ## a su vez actua como variable de control del while
    cont=1
    ## itera hasta llegar al valor ingresado por el usuario o hasta que encuentre
    ## los c primeros divisores de a.
    while(cont<=c):
    ## si el resto de a div i=0 entonces es divisor, y lo muestra en
    ## pantalla
        if (a%i)==0:
           print(i)
           cont=cont+1
           i=i+1
        ## si no es divisor solo incrementa la variable de control
        else:
           i=i+1

# funcion que recive un numero entero y devuelve su mayor divisor distinto de
# si mismo.
# ej. maxDivisor(14) --> 7
def maxDivisor(n:int):
    maxDiv=0
    i=1
    while i<n:
        if (n%i==0):
             maxDiv=i
        i=i+1
    return maxDiv

# ln(2) = 1- 1/2 + 1/3 - 1/4 + 1/5...
def aproxLogNat2(canAprox:float):
    i=1
    k=2
    aux=1
    while i<=canAprox:
        ## aux - 1/2
        aux=aux-(1/k)
        ## denom 3
        k=k+1
        ## aux + 1/3
        aux=aux+(1/k)
        ## denom 4
        k=k+1
        ## incrementa la variable de control, cuenta las vueltas hasta llegar
        ## a la cantidad limite de aproximaciones solicitada
        i=i+1
    return aux

# pi = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15
def aproxPi(canAprox:float):
    i=1
    ## denom
    k=3
    aux=1
    while i<=canAprox:
        ## aux - 1/3
        aux=aux-(1/k)
        ## denom 5
        k=k+2
        ## aux + 1/5
        aux=aux+(1/k)
        ## denom 7
        k=k+2
        ## incrementa la variable de control, cuenta las vueltas hasta llegar
        ## a la cantidad limite de aproximaciones solicitadas
        i=i+2
    return aux

# calcula el factorial de un numero entero.(n!)
def factorial(num:int):

    ## la variable aux actua como un acumulador de productos
    ## sucesivos en la medida en que la variable de control i
    ## actua como el proximo factor a multiplicar por el produc
    ## to ya acumulado.
    aux=1

    ## se situa en 1 porque, al multiplicarse por cero, aux
    ## siempre va a ser cero
    i=1

    ## itera hasta que llega la marca del fin, que es el numero
    ## del cual se desea calcular el factorial
    while i<=num:
        aux=aux*i
        i=i+1
    return aux

# aproximacion al numero e, e = 1/0! + 1/1! + 1/2! + 1/3! ...
# def aproxNumE(cantAprox:int):
    i=1
    aux=1
    while i<=cantAprox:
        aux=aux+(1/factorial(i))
        i=i+1
    return aux

# calcula el maximo comun divisor de dos numeros enteros
def mcd(a:int,b:int):
    ## la variable de control esta posicionada en 1 porque no se puede
    ## dividir por cero
    i=1

    ## inicializacion de las variables auxiliares
    comunDivisor=0
    restA=0
    restB=0

    ## fija como maxima cantidad de iteraciones al menor de los numeros
    ## ingresados como argumento
    if a<b:
        limite=a
    else:
        limite=b
    ## mientras no se llegue al fin, va buscar al divisor mas grande
    ## de ambos. al resto de la division lo almacena en la variable
    ## resto y luego las compara, si es igual a cero quiere decir
    ## que se encontr
    while i<=limite:
        ## resto de a,b por i
        restA=a%i
        restB=b%i
        ## si el resto de ambos es igual a cero, el mcd es i
        if restA==0 and restB==0:
            comunDivisor=i
        i=i+1
    ## devuelve el maximo comun divisor
    return comunDivisor

def serie(num:int):
    acum=0
    if num<=0:
        print("la serie no puede calcularse")
    else:
        for i in range(1,num+1):
            numQ=i/2**i
            acum=acum+numQ
        return acum

# funcion que compara dos edades ingresadas por el usuario
def comparaEdades(eda,edb):
    maximo=0
    if eda>maximo:
        maximo=eda
        return eda
    else:
        maximo=edb
        return edb

# devuelve el valor absoluto de un numero entero sin usar la funcion
# valor absoluto(abs) de python.
def valorAbs(n):
    if n>0:
        return n
    else:
        return (n*-1)

# devuelve un numero elevado al cubo
def elevarAlCubo(n):
    aux=0
    aux=n*n*n
    return aux

def elevarAlCuadrado(n):
    return (n*n)

# devuelve la cantidad de divisores positivos de un numero entero
def divisoresPositivos(n):
    i=1
    cont=0
    while i<=n:
        if ((n%i)==0):
            cont=cont+1
        i=i+1
    return cont

# devuelve la enesima potencia de entera de un numero
def potencia(a,b):
    i=1
    acum=1
    while i<=b:
        acum=acum*a
        i=i+1
    return acum

# suma los divisores de un numero entero
def sumaDivisores(n):
    i=1
    acum=0
    while i<=n-1:
        if ((n%i)==0):
            acum=acum+i
        i=i+1
    return acum

# devuelve True si el numero entero es perfecto y false si no lo es
def numeroPerfecto(n):
    if sumaDivisores(n)==n:
        esPerfecto=True
    else:
        esPerfecto=False
    return esPerfecto

# devuelve True si la suma de sus divisores es mayor al entero ingresado
def numeroAbundante(n):
    if sumaDivisores(n)>n:
        abundante=True
    else:
        abundante=False
    return abundante

# devuelve true si es primo y false si no lo es
def esPrimo(n):
    aux=divisoresPositivos(n)
    auxB=False
    if aux>2:
        auxB=False
    else:
        auxB=True
    return auxB

# devuelve los factores primos de un numero entero
def factoresPrimos(n):
    i=2
    while i<=n:
        if ((n%i)==0):
            if esPrimo(i)==True:
                print(i)
        i=i+1

# devuelve True si es un numero poderoso y false si no lo es,
def numeroPoderoso(n):
    i=2
    while i<=n:
        if (n%i)==0:
            if esPrimo(i)==True:
                if n%(i*i)==0:
                    poderoso=True
                else:
                    poderoso=False
        i=i+1
    return poderoso

# devuelve True si el numero es libre de cuadrados y false si no lo es.
# un numero libre de cuadrados es si en su descomposicion en factores primos,
# no hay ningun factor que se repita dos o mas veces.
def libreDeCuadrados(n):
    i=2
    llegoElFin=False
    resto=0
    libre=True

    while i<=n and llegoElFin==False:
        ## significa que i es divisor de n
        if n%i==0:
            resto=n//i
            ## si el resto es divisible por i quiere decir que n no es libre de
            ## cuadrados porque hay un factor primo que lo divide mas de una vez
            if resto%i==0:
                llegoElFin=True

                ## si llego el fin es verdadero es porque n no es libre de
                ## cuadrados y devuelve false, en caso afirmativo devuelve True
                if llegoElFin:
                    libre=False
                else:
                    libre=True
        i=i+1
    return libre

# devuelve el numero primo mas cercano y mayor al numero entero ingresado por el
# usuario
def mayorPrimoCercano(n):
    aux=n
    llegoElFin=False

    while llegoElFin==False:
        aux=aux+1

        if esPrimo(aux)==True:
            llegoElFin=True

    return aux

# devuelve la posicion de una ocurrencia en la cadena,es
def indexOf(s,c):
    i=0
    while (i<=len(s)-1) and (s[i]!=c):
        i=i+1
    if i<=len(s):
        return (i)
    else:
        return (-1)

# devuelve la ultima posicion relativa de una ocurrencia en la cadena
def lastIndexOf(s,c):
    i=len(s)-1

    while (i>=0) and (s[i]!=c):
        i=i-1

    if i>0:
        return i+1
    else:
        return -1

# devuelve un caracter c una cant cantidad de veces
def replicate(c,cant):
    buff=""
    for i in range(0,cant):
        buff=buff+c
    return buff

# devuelve una cadena desde una posicion de la cadena hasta otra
def subString(s,desde,hasta):
    buff=""
    i=desde-1
    k=len(s)
    if ((desde>=0) and (desde<k)) and (hasta<=k):
        while i<=hasta:
            buff=buff+s[i]
            i=i+1
        return buff
    else:
        return -1

# devuelve una cadena de caracteres y a su izquierda una cant cantidad de
# veces la ocurrencia c
# ejemplo: print(lPad("hola","x",3) --> "xxxholaxxx"
def lPad(s,c,cant):
    buff=""
    buff=replicate(c,cant)+s
    return buff

# devuelve una cadena de caracteres y a su derecha una cant cantidad de
# veces la ocurrencia c
def rPad(s,c,cant):
    buff=""
    buff=s+replicate(c,cant)
    return buff

# devuelve una cadena de caracteres en el centro y a sus costados una cant cantidad de
# veces la ocurrencia c
def cPad(s,c,cant):
    izq=cant//2
    der=cant-izq
    buff=""
    buff=replicate(c,izq)+s+replicate(c,der)
    return buff

# corta los espacios a la izquierda
def lTrim(s):
    i=0
    buff=""
    while i<=len(s) and s[i]==" ":
        i=i+1
    for i in range(i,len(s)):
        buff=buff+s[i]
    return buff

# corta los espacios a la derecha
def rTrim(s):
    i=len(s)-1
    buff=""
    while i>=0 and s[i]==" ":
        i=i-1
    for i in range(0,i):
        buff=buff+s[i]
    return buff

# cuenta la cantidad de veces que aparece un caracter $c en $s
def cuentaOcurrencia(s,c):
    i=0
    largo=len(s)
    cont=0
    while i<=largo-1:
        if s[i]==c:
            cont=cont+1
        i=i+1
    return cont

# elimina un cararcter de una cadena ingresada por el usuario
def borraOcurrencia(s,c):
    i=0
    largo=len(s)
    nuevaCadena=""
    while i<=largo-1:
        if s[i]!=c:
            nuevaCadena=nuevaCadena+s[i]
        i=i+1
    return nuevaCadena

# imprime en pantalla la cantidad de veces que el caracter $c se repite
# en la cadena #s
# la funcion requiere de dos funciones adicionales, cuentaOcurrencia y
# borraOcurrencia
def cantidadTotal(s):
    largo=len(s)
    cad=s
    llegoElFin=False

    while llegoElFin!=True:
        print(cad[0],"---",cuentaOcurrencia(cad,cad[0]))
        cad=borraOcurrencia(cad,cad[0])

        if len(cad)!=0:
            llegoElFin=False
        else:
            llegoElFin=True

# devuelve true si se repite una ocurrencia en la cadena, no importa cual sea
def tieneRepetidas(cad):
    i=0
    llegoElFin=False

    while i<=len(cad)-1 and llegoElFin!=True:
        if cuentaOcurrencia(cad,cad[i])>1:
            llegoElFin=True
        i=i+1
    return llegoElFin

# devuelve true si la ocurrencia aparece en la cadena y false en caso contrario
def aparece(s,c):
    i=0
    llegoElFin=False

    while i<=len(s)-1 and llegoElFin!=True:
        if s[i]==c:
            llegoElFin=True
        i=i+1
    return llegoElFin

# devuelve la primer letra repetida de la cadena
def dameRepetida(cad):
    i=0
    llegoElFin=False

    ## se entra al while solo si hay mas de una letra en la cadena de caracteres
    ## de lo contrario solo existiria una letra en la cadena y no habría nada
    ## repetido.
    if len(cad)>1:
        ## itera mientras no se pase del largo de la cadena y no llegue el fin
        ## que se transforma en True si detecto que la iesima ocurrencia de la
        ## cadena esta presente mas de una vez en la misma. para lo cual invoca
        ## a la funcion cuentaOcurrencias.
        ## ej. A="mala"  //  cuentaOcurrencias(A,A[0]) --> 1 // encontro una
        ## ocurrencia del caracter, eso quiere decir que no esta repetida
        ## cuentaOcurrencias(A,A[1]) --> 2 // encontro dos ocurrencias del prim.
        ## caracter, es decir se repite y como es la primera ocurrencia en rep
        ## etirse entonces llego el fin se vuelve True y se sale del ciclo
        while i<=len(cad)-1 and llegoElFin!=True:
            if cuentaOcurrencia(cad,cad[i])>1:
                llegoElFin=True
            i=i+1
        return cad[i-1]
    else:
        return -1

# reemplaza una ocurrencia en la posicion pos por un caracter c
def switchCase(s,pos,c):
    i=0
    ## para reescribir la cadena s y por eso esta vacia
    buff=""
    ## como el argumento c es del tipo char, es decir, un caracter y es lo que
    ## se desea reemplazar en la cadena original, debe tener un largo de 1, es
    ## dicir que c no puede ser "ll" que tiene un largo 2.
    ## la otra condicion que debe cumplirse es la posicion que se desea modificar
    ## no sea mayor que el largo de la cadena y para ello debe estar entre
    ## el valor 0 y el 10
    if (len(c)==1) and (pos>=0 and pos<=len(s)-1):
        while i<=len(s)-1:
            ## va copiando todos los caracteres de la cadena s a la variable buff
            ## hasta llegar a la posicion que se desea modificar.
            ## si entra a la primera rama del if es porque no llego a pos
            if i!=pos:
                buff=buff+s[i]
            ## si llego a la posicion que se desea modificar, no copia el valor
            ## s[i], en cambio va a sumarle a buff el caracter c del argumento
            else:
                buff=buff+c
            i=i+1
    else:
        ## si no tiene nada que modificar devuelve s
        buff=s
    return buff

# devuelve true si el token $tok estÃ
# ejemplo: a="mariana,jorge,patito,titi"
# seekLista(a,"pimba") -->> False
def seekLista(lista,tok):
    i=0
    llegoElFin=False
    contieneElTok=False
    ## itera hasta llegar al final de la lista o hasta que halla encontrado
    ## el token buscado. Si lo logra a contiene ElTok le asigna True y se
    ## termina el ciclo
    while (i<=len(lista)-1) and (llegoElFin!=True):
        if lista[i]==tok:
            contieneElTok=True
            llegoElFin=True
        i=i+1
    return contieneElTok

# devuelve la posicion i-esima del token $tok en la lista. si el token no esta
# en la lista devuelve -1 porque no tiene una posicion que devolver
def indexOfToken(lista,tok):
    i=0
    # si el token esta en la lista entonces devuelve su posicion i esima
    if seekLista(lista,tok)==True:
        while (i<=len(lista)-1) and (lista[i]!=tok):
            i=i+1
        return (i+1)
    else:
        return (-1)

# devuelve una lista de 4 elementos, cada uno de ellos un entero elevado al
# cuadrado. La funcion recibe como argumento una lista de cuatro numeros enteros
# y devuelve sus cuadrados respectivos
def listaDeCuadrados(lista):
    cuadrados=[]
    i=0
    while ( i<=len(lista)-1 ):
        cuadrados.append(lista[i]**2)
        i=i+1
    return cuadrados

# crea una lista de numeros enteros con n elementos. la marca del fin es un int
# menor a cero.
def grabaNumeros(lista):
    num=int(input("numero"))
    while (num>=0):
        lista.append(num)
        num=int(input("numero"))
    return lista

# recibe como argumento una lista de n valores y c contenidos, la funcion lo
# que hace es reemplazar el elemento objetivo por un elemento reemplazo en todas
# las posiciones en las que se encuentre.
# ejemplo: nombres=["coco","emilse","guty","vale","emilse"]
# print(reemplazador(nombres,"emilse","michi"))
# devuelve ---> ["coco","michi","guty","vale","michi"]
def reemplazador(lista,objetivo,reemplazo):
    i=0
    while ( i<=len(lista)-1 ):
        if (lista[i]==objetivo):
            lista[i]=reemplazo
        i=i+1
    return lista

# devuelve el menor valor entero de una lista
def menorEnLista(lista):
    i=0
    ## la cota inferior del minimo encontrado es el primer valor de la lista
    ## de numeros enteros
    menor=lista[i]
    ## itera mientras no se pase del largo de la lista
    while(i<=len(lista)-1):
        ## si el i esimo elemento de la lista es menor que el menor encontrado
        ## entonces es el menor de la lista y lo almacena en la variable menor.
        if lista[i]<=menor:
            menor=lista[i]
        i=i+1
    return menor

# devuelve el mayor valor de la lista
# ejemplo. A=[1,0,1,3,2,0]
# print(mayorEnLista(A)) --> 3
def mayorEnLista(lista):
    i=0
    ## determnia la cota superior hasta el momento ingresada,que es el
    ## valor de la primera posicion de la lista del argumento[0]->1
    mayor=lista[i]
    ## recorre la totalidad de los valores de la lista mientras que no se pase
    ## de su largo procesando uno por uno sus valores
    while(i<=len(lista)-1):
        ## al analiar cada elemento de la lista, lo que hace es compararlo con
        ## mas grande encontrado hasta el momento que es 1. Si es mas grande que
        ## que el mayor, entonces es el nuevo mayor y se asigna a la variable
        if lista[i]>=mayor:
            mayor=lista[i]
        i=i+1
    return mayor

# elimina todos los elementos $tok de una lista
# ejemplo. A=[1,0,1,3,2,0]
# A=(eliminaDeLista(A,0)) --> A=[1,1,3,2]
def eliminador(lista,tok):
    if lista!=[]:
        i=len(lista)-1
    ## la lista se recorre de atras hacia adelante para no tener problemas con
    ## los indices porque al ir liberandose direcciones de memoria el len se
    ## actualiza y los indices tambien.
        while (i>=0):
        ## si el elemento del indice de la lista es igual al tok buscado
        ## lo elimina y libera esa posicon de memoria
            if lista[i]==tok:
                lista.pop(i)
            i=i-1
    else:
        lista=-1
    return lista

# la funcion recibe como argumentos a dos listas, la primera es la del programa
# principal, donde se encuentra el conjunto de valores que se desea procesar y
# listaUno contiene las posiciones precisas que se desean eliminar.
# enteros=[7,9,11,1,0,11,11,11,5,0]
#     pos=[1,2,3]
def eliminadorSobreSelectivo(lista,listaUno):
    if lista!=[]:
        if (mayorMenor(listaUno,"mayor")) <= (len(lista)-1):
            i=len(listaUno)-1
            while i>=0:
                lista.pop(listaUno[i])
                i=i-1
        else:
            lista=-1
    return lista

# devuelve la lista ordenada de menor a mayor sin valores repetidos
def ordenaLista(lista):
    i=0
    ## establece la constante del maximo de la nueva lista a crear que es
    ## el mayor valor de la lista en el argumento
    largo=mayorEnLista(lista)+1

    listaOrdenada=[] ## se reserva el espacio pora una lista nueva
                     ## de tantos valores disponibles como el maximo
                     ## de la lista del argumento

    ## si el valor mas grande encontrado en la lista es 10, entonces
    ## lista ordenada tendra once lugares, y los inicializa en cero a todos
    for j in range(0,largo):
        listaOrdenada.append(0)

    ## recorre la lista del argumento desde su primera posicion y almacena en
    ## en la posicion de la nueva lista, el valor i esimo de la lista del argumento
    ## ejemplo. A={1,4,3,6}
    ##         NL={0,0,0,0,0,0,0}
    ## en la posicion A[0] se encuentra el valor 1, entonces...
    ## en la posicion NL[0] se graba el valor 1, esto seria:
    ## NL[A[i]]=A[i]

    while i<=len(lista)-1:
        ## importante: a un tipo de dato lista, le puedo asignar otro tipo de
        ## dato que sea una lista, si es un int, un char o un string no puedo
        listaOrdenada[lista[i]]=lista[i]
        i=i+1

           ## devuelve la NL ordenada de menor a mayor y sin ceros para lo cual
           ## invoca a la funcion eliminaDeLista, que la reescribe sin ceros.
    return eliminador(listaOrdenada,0)

# la funcion recibe como argumentos una lista y la opcion para que el usuario
# determine lo que quiere encontrar, Solo admite como eleccion las cadenas
# "mayor" o "menor", lo que significa que en una lista de numeros enteros
# la funcion devuelve el mayor o el menor segun corresponda
# ejemplo: enteros=[5,6,3,9,11,10]
# print(mayorMenor(enteros,"mayor")) ---> 11
# print(mayorMenor(enteros,"menor")) ---> 3
def mayorMenor(lista,eleccion):
    i=0
    maximoMinimo=-1
    if lista!=[]:
        maximoMinimo=lista[0]
        if eleccion=="mayor":
            while i<=len(lista)-1:
                if lista[i]>maximoMinimo:
                    maximoMinimo=lista[i]
                i=i+1
        else:
            if eleccion=="menor":
                while i<=len(lista)-1:
                    if lista[i]<maximoMinimo:
                        maximoMinimo=lista[i]
                    i=i+1
    return maximoMinimo

# la funcion recibe como argumentos una lista y la opcion para que el usuario
# determine lo que quiere encontrar, Solo admite como eleccion las cadenas
# "mayor" o "menor", tambien recibe como argumento a valor, que es un elemento
# con los que se van a comparar cada elemento de la lista. La funcion devuelve
# una lista con todos los elementos mayores o menores a ese valor.
# ejemplo. # ejemplo: enteros=[5,6,3,9,11,10]
# print(mayorMenorQue(enteros,"mayor",9)) ---> [11,10]
# print(mayorMenorQue(enteros,"menor",9)) ---> [5,6,3]
def mayorMenorQue(lista,eleccion,valor):
    i=0
    nuevaLista=[]
    ## primero verifica que la lista ingresada en el argumento tiene elementos
    ## de ser asi va a barrer la totalidad de sus elementos hasta encontrar
    ## lo buscado que es el mayor o menor valor en comparacion con el valor
    ## ingresado en el argumento $valor.
    if lista!=[]:
        if eleccion=="mayor":
            while i<=len(lista)-1:
                if lista[i]>valor:
                    nuevaLista.append(lista[i])
                i=i+1
        else:
            if eleccion=="menor":
                while i<=len(lista)-1:
                    if lista[i]<valor:
                        nuevaLista.append(lista[i])
                    i=i+1
            else:
                nuevaLista=-1

    return nuevaLista

# devuelve las posiciones del menor numero de la lista.
# ejemplo. A=[1,0,1,3,2,0]
# print(posicionDelMenor(A)) --> A=[1,5]
def posiciones(lista,elemento):
    i=0
    posiciones=[]

    if (elemento == "mayor") or (elemento == "menor"):
        tok=mayorMenor(lista,elemento)
    else:
        tok=elemento

    while i<=len(lista)-1 :
        ## si el iesimo elemento de la lista del argumento coincide con el menor
        ## entonces a la lista posiciones, se le aniade su posicion que es igual
        ## a i (la variable que controla la cantidad de vueltas/elementos de la
        ## lista, o del while, ambos coinciden para ser la posicion del menor)
        if lista[i]==tok:
            posiciones.append(i)
        i=i+1

    return posiciones

# la funcion recibe en su parametro los argumentos lista, la cual debe ser una
# lista vacia, la cantidad de filas y columnas que va a contener.
# ejemplo:
# creaMatriz(matriz,2,2)--> [0,0]
#                       --> [0,0]
def creaMatriz(lista,filas,columnas):
    ## condiciones para crear la matriz
    todoBien=False
    if (lista==[]) and (filas>0) and (columnas>0):
        ## se crea una lista vacia para poder llenarla con tantos ceros
        ## como columnas se necesite
        listaUno=[]
        ## se crean las columnas
        for i in range(0,columnas):
            listaUno.append(0)
        ## se crean las filas
        for i in range(0,filas):
            lista.append(listaUno)
        ## si llego aca es porque esta todo bien, es decir, se pudo crear la
        ## matriz entonces todoBien se vuelve True
        todoBien=True
    ## si no esta todo bien, o sea, la lista del argumento no esta vacia o
    ## la cantidad de filas o columnas esta en cero, no se puede crear una
    ## matriz entonces devuelve un valor negativo porque no tiene nada para
    ## procesar
    if todoBien==False:
        return -1
    ## si esta todo bien, entonces procesa los argumentos y a partir de ellos
    ## crea una matriz con los requisitos exigidos
    else:
        return lista

# devuelve true o false si el numero tiene una raiz cuadrada perfecta
def esCuadradoPerfecto(numero):
    num=numero
    numb=int(num)
    esCuadrado=False
    if (sqrt(numb)*sqrt(numb)) == num:
        esCuadrado=True
    return esCuadrado

def cargaMatriz(matriz,cadena):
    ## pasa una cadena de caracteres a lista
    lista=list(cadena)
    ## la raiz cuadrada del largo de la lista tiene que ser exacta, es decir
    ## igual a cero, de lo contrario no se puede armar una matriz cuadrada
    ## la variable valor representaria la cantidad de filas y columnas de la
    ## matriz cuadrada. Como sqrt devuelve un numero real, hay que pasar el
    ## resultado de llamarla a un numero entero
    valor=int(sqrt(len(cadena)))
    ## la variable todoBien sera verdadera si el cuadrado de valor es igual
    ## al largo de la lista, lo que quiere decir que es que con la raiz cuadrada
    ## de la lista se puede armar una matriz cuadrada perfecta.
    todoBien=(esCuadradoPerfecto(len(cadena))==True)

    ## si se puede armar una matriz cuadrada entonces va a crear una matriz
    ## de n lados y n filas invocando a la funcion creaMatriz
    if todoBien==True:
        matriz=[]
        matriz=creaMatriz(matriz,valor,valor)
        desde=0
        hasta=valor
        ## el ciclo for va a ir asignando a cada subLista de la matriz
        ## las filas que van desde el cero hasta valor. la variable de control
        ## del ciclo for permite saltar de una sublista a otra, es decir de una
        ## fila a otra.
        for i in range(0,valor):
            matriz[i]=lista[desde:hasta]
            ## es necesario actualizar los valores desde y hasta para poder
            ## ir copiando todos subIndices de la lista a la matriz armada
            desde=hasta
            hasta=desde+valor
        return matriz
    else:
        matriz=-1
        return matriz

def creaPalabra(matriz,fila,desde,hasta):
    pal=[]
    pal.append(matriz[fila][desde:hasta])
    pal=str(pal)
    pal=borraOcurrencia(pal," ")
    pal=borraOcurrencia(pal,"'")
    pal=borraOcurrencia(pal,"[")
    pal=borraOcurrencia(pal,",")
    pal=borraOcurrencia(pal,"]")
    return pal

def presentacion():
    print(" ------------------------------")
    print(" juego de sopa de letras       ")
    print(" programado por vladimiroGaston")
    print("-------------------------------")
    print()
    print()
    print("presione una tecla para jugar ")


# ------------------------
#   programa principal
# ------------------------

## matriz vacia
matriz=[]
cabecera="       0    1    2    3    4"

cadena="holaplahiaklmnzmundouvwxy"

## lista de palabras
palabras=["hola","paz"]

## crea una matriz cargada con el string cadena
matriz=cargaMatriz(matriz,cadena)

## muestra la presentacion del juego
presentacion()

n=input()

## la muestra en pantalla
print(cabecera)
print("      -------------------------")
for i in range(0,len(matriz)):
    print(i,"->",matriz[i])

## crea una cadena con los subIndices de la matriz
cadenaUno=creaPalabra(matriz,0,0,4)
print()
print()
print(cadenaUno)

Comentarios

Entradas populares de este blog

El juego del ahorcado, escrito en assembler i8086

Una posible implementacion en modo texto de una sopa de letras con python ( 2013 )

ayuda memoria sobre conversion dinamica descendente y polimorfismo