s1Eva_IIT2007_T1 Hormiga busca arroz

Ejercicio: 1Eva_IIT2007_T1 Hormiga busca arroz

Propuesta de solución en Python: python.pdf, también en versión matlab.pdf.

Algoritmo con un paso  por cada turno

Considere ingresar la ubicación inicial (xh,yh) de la hormiga y que la posición del arroz (xa,ya) sea fija.

Suponga que la distancia inicial es la mayor y que la hormiga no ha encontrado el grano de arroz.

Para la dirección del movimiento de la hormiga y la cantidad de pasos se generan números aleatorios cuyos valores se usan para simular el movimiento al cambiar las coordenadas de la hormiga.

Luego de cada movimiento, se revisa si la hormiga encontró el grano de arroz o que las coordenadas sean iguales; también se puede revisar si la nueva distancia es mayor a las anteriores.

Cuente un turno completado, y repita el procedimiento hasta que se completen los 100 turnos o se haya encontrado el grano de arroz. Al final muestre los resultados buscados.

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIT2007_T1 Hormiga busca arroz
import random as rnd

# INGRESO
xa=int(input(' x arroz: '))
ya=int(input(' y arroz: '))

xh=int(input(' x hormiga: '))
yh=int(input(' y hormiga: '))

# PROCEDIMIENTO
encontro = 0
t = 0
while not((xh==xa and yh==ya) or t>100):
    
    # dirección de movimiento de hormiga
    d = int(rnd.random()*4)+1
    
    if (d==1):
        yh = yh+1
    if (d==2):
        yh = yh-1
    if (d==3):
        xh = xh+1
    if (d==4):
        xh = xh-1

    # Revisa si lo encontró
    if (xh==xa and yh==ya):
        encontro = 1
    t = t + 1

print('¿encontró?: ')
print(encontro)
print('pasos realizados: ')
print(t)

Ejemplo de respuesta con el algoritmo

 x arroz: 5
 y arroz: 3
 x hormiga: 4
 y hormiga: 2
¿encontró?: 
1
pasos realizados: 
34
>>> 

 x arroz: 8
 y arroz: 8
 x hormiga: 3
 y hormiga: 2
¿encontró?: 
0
pasos realizados: 
101

Algoritmo varios pasos por turno

En la solución con Python, se usarán las librerías básicas de aleatorios (random) y matemáticas (math).

Una alternativa a esta solución es usar la librería numérica NUMPY, que se descarga e instala como un módulo complementario.

Usando lazo Mientras-Repita:

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1ra Eval II Termino 2007. Tema 1. Hormiga y arroz
# Propuesta de solución. edelros@espol.edu.ec

import random as rnd
import math

xh = int(input('coordenada x hormiga: '))
yh = int(input('coordenada y hormiga: '))

# PROCEDIMIENTO

# posición del arroz fija
xa = 10
ya = 8

# distancia inicial
dmayor = math.sqrt((xh-xa)**2+(yh-ya)**2)

encontrado = 0
turno = 0
while (turno<100 and encontrado==0):
    
    direccion = int(rnd.random()*4)+1
    pasos = int(rnd.random()*3)+1

    if direccion==1:
        yh = yh + pasos
    if direccion==2:
        yh = yh - pasos
    if direccion==3:
        xh = xh + pasos
    if direccion==4:
        xh = xh - pasos
        
    if (xh==xa and yh==ya):
        encontrado = 1

    distancia = math.sqrt((xh-xa)**2+(yh-ya)**2)
    if distancia>dmayor:
        dmayor = distancia
        
    turno = turno + 1

# SALIDA
print('estado encontrado: ')
print(encontrado)
print('turnos simulados: ')
print(turno)
print('distancia más lejana: ')
print(dmayor)

Reaultado del algoritmo:

coordenada x hormiga: 2
coordenada y hormiga: 1
estado encontrado: 
1
turnos simulados: 
92
distancia más lejana: 
23.323807579381203
>>> 
coordenada x hormiga: 0
coordenada y hormiga: 0
estado encontrado: 
0
turnos simulados: 
100
distancia más lejana: 
38.2099463490856
>>> 

Usando lazo Repita-Hasta:

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1ra Eval II Termino 2007. Tema 1. Hormiga y arroz
# Propuesta de solución. edelros@espol.edu.ec

import random as rnd
import math

xh = int(input('coordenada x hormiga: '))
yh = int(input('coordenada y hormiga: '))

# PROCEDIMIENTO

# posición del arroz fija
xa = 10
ya = 8

# distancia inicial
dmayor = math.sqrt((xh-xa)**2+(yh-ya)**2)

encontrado = 0
turno = 0
while not(turno>=100 or encontrado!=0):
    
    direccion = int(rnd.random()*4)+1
    pasos = int(rnd.random()*3)+1
    
    if direccion==1:
        yh = yh + pasos
    if direccion==2:
        yh = yh - pasos
    if direccion==3:
        xh = xh + pasos
    if direccion==4:
        xh = xh - pasos
        
    if (xh==xa and yh==ya):
        encontrado = 1

    distancia = math.sqrt((xh-xa)**2+(yh-ya)**2)
    if distancia>dmayor:
        dmayor = distancia

    turno = turno+1

# SALIDA
print('estado encontrado: ')
print(encontrado)
print('turnos simulados: ')
print(turno)
print('distancia más lejana: ')
print(dmayor)

s1Eva_IIIT2003_T2 Números triangulares

Ejercicio: 1Eva_IIIT2003_T2 Números triangulares

Propuesta de solución en Python: python.pdf , y versión matlab.pdf

El problema planteado es semejante a construir una pirámide, en la que se disponen de solo t bloques y se requiere saber si el número de bloques es exacto para formar una pirámide.

El ejercicio se desarrolla suponiendo que se construirá una pirámide con bloques de varios «pisos».

Se observa que el número de bloques coincide con el número de piso a construir.

Ejemplo:

  • Piso 1 tiene 1 bloque,
  • piso 2 tiene 2 bloques,
  • etc.

Cada piso usa una cierta cantidad de bloques que se cuentan como «usados». La cantidad de bloques por piso es la misma que el número del piso.

El lazo acumula los bloques usados en cada piso.

Dado un número t de bloques ,se calcula la secuencia de números triangulares mientras los bloques usados sean menores que los t disponibles.

En caso que el número “usados” de la secuencia es igual a t, se considera al número t como un número triangular.

La respuesta es un valor de verdad, si es triangular 1, si no lo es 0.

Lazo mientras-repita

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIIT2003_T2 Números triangulares
# Propuesta de solución. edelros@espol.edu.ec

# INGRESO
t=int(input('Verificar si es triangular: '))

# PROCEDIMIENTO
piso = 1
usados = 0
while (usados<t):
    usados = usados+piso
    piso = piso+1

# verifica si es triangular
if usados==t:
    estriangular = 1
else:
    estriangular = 0

# SALIDA
print(estriangular )

Lazo Repita-hasta

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIIT2003_T2 Números triangulares
# Propuesta de solución. edelros@espol.edu.ec

# INGRESO
t = int(input('Verificar si es triangular: '))

# PROCEDIMIENTO
piso = 1
usados = 0
while not(usados>=t):
    usados = usados+piso
    piso = piso+1

# verifica si es triangular
if usados==t:
    estriangular = 1
else:
    estriangular = 0

# SALIDA
print(estriangular )

s1Eva_IT2001_T5 Verificar divisibilidad para 9

Ejercicio: 1Eva_IT2001_T5 Verificar divisibilidad para 9

Propuesta de solución en Python: python.pdf, también en versión matlab.pdf

Para la separación de los dígitos de un número entero se usa el residuo de la división para 10.

Por ejemplo:

para el número 15,
el residuo para 10 es 5
y el cociente es 1

Una respuesta simplificada es un valor de verdad 1 o 0 para verdadero y falso, que es la que se usa en éste ejemplo.

Lazo mientras-repita

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2001_T5 Verificar divisibilidad para 9
# Propuesta de solución. edelros@espol.edu.ec

# INGRESO
numero = int(input('Número a verificar divisibilidad 9: '))

# PROCEDIMIENTO
sumacifra = 0
# Extrae las cifras
while (numero>0):
    digito    = numero%10
    sumacifra = sumacifra+digito
    numero    = numero//10

if (sumacifra>9):
    numero = sumacifra
    sumacifra = 0
    while (numero>0):
        digito    = numero%10
        sumacifra = sumacifra+digito
        numero    = numero//10

if (sumacifra==9):
    respuesta = 1
else:
    respuesta = 0

# SALIDA
print(respuesta)

lazo repita-hasta

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2001_T5 Verificar divisibilidad para 9
# Propuesta de solución. edelros@espol.edu.ec

# INGRESO
numero=int(input('Numero a verificar divisibilidad 9: '))

# PROCEDIMIENTO
sumacifra=0
# Extrae las cifras
while not(numero==0):
    digito=numero%10
    sumacifra=sumacifra+digito
    numero=numero//10

if (sumacifra>9):
    numero=sumacifra
    sumacifra=0
    while not(numero==0):
        digito=numero%10
        sumacifra=sumacifra+digito
        numero=numero//10

if (sumacifra==9):
    respuesta=1
else:
    respuesta=0

# SALIDA
print(respuesta)

s1Eva_IIT2002_T4 cociente de Fibonacci

Ejercicio: 1Eva_IIT2002_T4 cociente de Fibonacci

Propuesta de solución en Python:

El ejercicio es una extensión del Algoritmo – Secuencia de Fibonacci, añadiendo la operación del cociente.

Se requiere guardar valores consecutivos del cociente para comparar su diferencia hasta cumplir con la precisión requerida.

Ejemplo de ejecución de algoritmo

>>> 
precision decimal: 0.001
cociente: 0.6181818181818182
con diferencia de:  0.0005347593582887278

Se añade al algoritmo de Fibonacci el cálculo del cociente.

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIT2002_T4 Cociente de fibonacci
# propuesta: edelros@espol.edu.ec

# INGRESO
precision = float(input('precision decimal: '))

# PROCEDIMIENTO
a = 1 # Primer cociente
b = 1
c = a+b
cociente1 = a/b

a = b # Segundo cociente
b = c
c = a+b
cociente2 = a/b

diferencia = abs(cociente2-cociente1)
while not(diferencia<=precision):
    cociente1 = cociente2
    a = b
    b = c
    c = a+b
    cociente2 = a/b
    diferencia = abs(cociente2-cociente1)

# SALIDA
print('cociente:', cociente2)
print('con diferencia de: ', diferencia)

s1Eva_IT2010_T1 Bono para televisores en Uruguay

Ejercicio: 1Eva_IT2010_T1 Bono para televisores en Uruguay

Propuesta de solución en Python:

Para el bloque de ingreso de piden la cantidad de modelos, con l que se puede crear la matriz con columnas cantidad y precio. Se usa una tercera columna para calcular el valor a devolver por cada modelo.

Se suman los valores a devolver para presentar el resultado.

>>> 
¿cuántos modelos?: 3
modelo num: 0
cantidad:250
precio: 400
modelo num: 1
cantidad:120
precio: 1000
modelo num: 2
cantidad:80
precio: 3000
[[   250    400  50000      0]
 [   120   1000  60000      0]
 [    80   3000 120000      0]]
total a devolver:  230000
>>>

Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2010_T1 Bono para televisores en Uruguay
# Tarea: convertir a listas
# Tarea: ingresar los nombres de los modelos

import numpy as np

# INGRESO
n = int(input('¿cuántos modelos?: '))

tabla  = np.zeros(shape=(n,3), dtype=int)
modelo = 0
while (modelo<n):
    print('modelo num:',modelo)
    tabla[modelo,0] = int(input('cantidad:' ))
    tabla[modelo,1] = int(input('precio: ' ))
    modelo = modelo + 1

# PROCEDIMIENTO
devolver = 0
modelo   = 0
while (modelo<n):
    tabla[modelo,2] = tabla[modelo,0]*tabla[modelo,1]/2
    devolver = devolver+tabla[modelo,2]
    modelo = modelo + 1

# SALIDA
print(tabla)
print('total a devolver: ',devolver)

s1Eva_IT2005_T3 Arreglo aleatorio binario a decimal

Ejercicio: 1Eva_IT2005_T3 Arreglo aleatorio binario a decimal

Propuesta de solución en Python

Use un vector de n casillas, las casillas pueden inciar en cero para luego llenarlas de números aleatorios una por una mientras realiza las operaciones requeridas en el enunciado.

De ser necesario repasar: Binario a Decimal – Algoritmo

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2005_T3 Arreglo aleatorio binario a decimal
# Tarea: contar los 1's, literal a)

import numpy as np
import random as rnd

# INGRESO
n = int(input('cuantos componentes n: '))

# PROCEDIMIENTO
B = np.zeros(n,dtype=int)
decimal = 0
i = 0
while (i<n):
    B[i] = int(rnd.random()*2)+0
    # orden de binarios es izquierda a derecha
    posicion = n-1-i  
    decimal  = decimal+B[i]*(2**posicion)
    i = i+1

# SALIDA
print('Arreglo de binarios B[i]:')
print(B)
print('equivale en decimal:',decimal)

Reaultados de algoritmo realizados para un byte (8 bits):

cuantos componentes n: 8
Arreglo de binarios B[i]:
[0 0 1 0 1 0 1 0]
equivale en decimal: 42
>>> 
cuantos componentes n: 8
Arreglo de binarios B[i]:
[1 1 1 1 1 1 1 1]
equivale en decimal: 255
>>> 
cuantos componentes n: 8
Arreglo de binarios B[i]:
[0 0 1 1 1 1 1 0]
equivale en decimal: 62
>>> 

s1Eva_IIT2003_T1 Cambiar Decimal a Octal

Ejercicio: 1Eva_IIT2003_T1 Cambiar Decimal a Octal

Propuesta de solución en Python

Empiece con los conceptos expuestos en el tema de Bases Numéricas Introducción, el ejercicio es una aplicación del tema.

Propuesta con elementos principales, quedan partes por desarrollar:

  • validar octal de 4 dígitos
  • validar en procedimiento,
  • que los dígitos sean octales [0,7]
# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIT2003_T1 Cambiar Decimal a Octal
# propuesta: edelros@espol.edu.ec

#INGRESO
octal = int(input('número octal: '))

# PROCEDIMIENTO
decimal = 0
i = 0
while (octal>0):
    digito  = octal%10 # residuo
    octal   = octal//10 # cociente
    decimal = decimal + digito*(8**i)
    i = i+1

# SALIDA
print('número en decimal: ', decimal)

s1Eva_IIT2014_T3 Parasailing sin sobrecarga, parejas

Ejercicios: 1Eva_IIT2014_T3 Parasailing sin sobrecarga, parejas

Propuesta de solución en Python, también el diagrama en pdf

El ejercicio consiste en una revisión ordenada del peso de cada persona a participar con una posible pareja.

Los pesos de cada persona se registran en un arreglo.

El algoritmo comienza revisando una persona i junto a otra persona j. Si la pareja no sobrecarga el paracaidas, se cuenta y registra la pareja posible de participar en un solo viaje de parasailing. Use un contador y una lista para el registro.

Instrucciones Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIT2014_T3 Parasailing sin sobrecarga, parejas
# propuesta solucion: edelros@espol.edu.ec

import numpy as np

# INGRESO
capacidad = int(input('capacidad de equipo: '))
n = int(input('personas en cola: '))

peso = np.zeros((n+1),dtype=int)
i = 1
while (i<=n):
    peso[i] = int(input("Peso[ "+str(i)+"]:"))
    i = i + 1

# PROCEDIMIENTO

# busca parejas
posibles = []
parejas = 0
i = 1
while (i<n):
    j = i + 1
    while (j<=n):
        s = peso[i] + peso[j]

        # revisa capacidad
        if (s<=capacidad):
            parejas = parejas + 1
            posibles.append([i,j])
        
        j = j + 1
    i = i + 1

# SALIDA
print('La cantidad de parejas encontradas es: ')
print(parejas)
print('Se puede combinar: ')
print(posibles)

resultado del algoritmo

capacidad de equipo: 350
personas en cola: 3
Peso[ 1]:120
Peso[ 2]:180
Peso[ 3]:165
La cantidad de parejas encontradas es: 
3
Se puede combinar: 
[[1, 2], [1, 3], [2, 3]]
>>> 
capacidad de equipo: 300
personas en cola: 3
Peso[ 1]:120
Peso[ 2]:180
Peso[ 3]:165
La cantidad de parejas encontradas es: 
2
Se puede combinar: 
[[1, 2], [1, 3]]
>>> 

s1Eva_IT2014_T1 Cuadrado de Cinco

Ejercicio: 1Eva_IT2014_T1 Cuadrado de Cinco

Propuesta de solución en Python

Operación decena decena+1 añadir resultado
252 2 3 6 625
852 8 9 72 7225

Para validar la operación con los múltiplos de 5 menores que 100, se usa un intervalo entre [5,m]. El intervalo inicia con el número 5

El siguiente número ascendente terminado en cinco es el anterior sumando 10.

La decena del número se obtiene como el cociente de la división para 10

El número por añadir a la izquierda de 25 es es la multiplicación de:
(decena)*](decena+1), que equivale a las centenas.

Para revisar que se cumpla la operación en todo el intervalo [5,m] se usa una bandera «funciona«.

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2014_T1 Cuadrado de Cinco
# Tarea: validar que la unidad del número sea 5

# INGRESO
m = int(input('rango [5,m]: '))

# PROCEDIMIENTO
numero = 5 # inicial
funciona = True # si funciona
while (numero<=m and funciona==True):
    
    # terminados en 5 desde el 15
    numero = numero+10

    # algoritmo cuadrado de 5
    unidad = numero%10    #residuo
    decena = numero//10   #cociente
    a = decena*(decena + 1)
    propuesto = a*100 + 25

    # calcula cuadrado
    calculado = numero*numero

    #compara resultado
    if (calculado!=propuesto):
        funciona = False

# SALIDA
print ('Algoritmo funciona:',funciona)
if (funciona==0):
    print(numero)

resultado del algoritmo dentro del intervalo.

rango [5,m]: 100
Algoritmo funciona: True
>>> 
rango [5,m]: 1000
Algoritmo funciona: True
>>> 

s1Eva_IIT2014_T2 Triángulos aleatorios en rectángulo

Ejercicios: 1Eva_IIT2014_T2 Triángulos aleatorios en rectángulo

Propuesta de solución en Python, también se adjunta el diagrama en pdf

Para iniciar el ejercicio, se requiere la cantidad n de triángulos a generar y los límites del plano donde se generan [maxa,maxb]

Para cada triángulo se generan las coordenadas de los vértices (xi,yi), usando números aleatorios ajustados a los límites del plano.

Lo más importante para este ejercicio es determinar las distancias entre los vértices, pues con ellas se determina el tipo de triángulo, siguiento las reglas básicas de la geometría.

Puede darse el caso que los puntos se encuentren en una sola línea en el plano, el caso se verifica al revisar si la suma de la longitud de dos lados es la longitud del tercer lado. Comprobar en todas las combinaciones ésta situación.

Instrucciones en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIT2014_T2 Triángulos aleatorios en rectángulo
# Propuesta de solución: edelros@espol.edu.ec

import numpy as np
import random as rnd
import matplotlib.pyplot as plt

# INGRESO
n = int(input(" cuántos triángulos: "))
maxa = int(input(" rango lado a: "))
maxb = int(input(" rango lado b: "))

# PROCEDIMIENTO
equilatero = 0
isosceles  = 0
escaleno   = 0
colineal   = 0

i = 1
while (i<=n):
    
    # puntos aleatorios
    x1 = int(rnd.random()*maxa) +0
    y1 = int(rnd.random()*maxb) +0
    
    x2 = int(rnd.random()*maxa) +0
    y2 = int(rnd.random()*maxb) +0

    x3 = int(rnd.random()*maxa) +0
    y3 = int(rnd.random()*maxb) +0

    # distancias entre puntos
    a = np.sqrt((x2-x1)**2 + (y2-y1)**2)
    b = np.sqrt((x3-x2)**2 + (y3-y2)**2)
    c = np.sqrt((x1-x3)**2 + (y1-y3)**2)

    # realiza la gráfica de cada triángulo
    plt.plot([x1, x2], [y1, y2])
    plt.plot([x2, x3], [y2, y3])
    plt.plot([x1, x3], [y1, y3])

    # clasifica triángulos
    s1 = a + b
    s2 = b + c
    s3 = c + a
    if (s1==c or s2==a or s3==b):
        colineal = colineal + 1
    else:
        if (a==b and b==c):
            equilatero = equilatero+1
        else:
            if (a!=b and b!=c and c!=a):
                escaleno = escaleno+1
            else:
                isosceles = isosceles+1
    i=i+1

# SALIDA
print("equilateros: ")
print(equilatero)
print("escalenos: ")
print(escaleno)
print("isosceles: ")
print(isosceles)
print("colineales: ")
print(colineal)

# muestra la gráfica
plt.show()

Resultado del algoritmo

 cuántos triángulos: 100
 rango lado a: 10
 rango lado b: 10
equilateros: 
0
escalenos: 
90
isosceles: 
4
colineales: 
6
>>>
 cuántos triángulos: 100
 rango lado a: 10
 rango lado b: 10
equilateros: 
0
escalenos: 
87
isosceles: 
6
colineales: 
7
>>>