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)
# 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
Publicar un comentario