Curso Python
Curso Python
El área de un triángulo puede ser calculada cuando se conoce la longitud de sus lados.
Teniendo en cuenta que s1, s2 y s3 son las longitudes de los lados del triángulo, se puede
calcular el subperímetro s = (s1+s2+s3)/2, y, con este valor, se puede calcular el área del
triángulo de la siguiente manera: area = √( s * (s-s1) * (s-s2) * (s-s3) ).
Cree una función que recibe la medida de los lados del triángulo y retorna el área de este,
redondeada a una cifra decimal.
El módulo math puede serle de ayuda para calcular la raíz cuadrada.
Su solución debe tener una función de acuerdo con la siguiente especificación:
● Nombre de la función: area_triangulo
Si lo requiere, puede agregar funciones adicionales.
Descripción de parámetros:
Nombre Tipo Descripción
Codigo:
import math
# Calcular el área
area = calcular_area(s1, s2, s3, s)
return area_redondeada
# Ejemplo de uso
lado1 = 5
lado2 = 7
lado3 = 8
float Índice de masa corporal de la persona, el valor de retorno debe estar redondeado a
dos decimales.
Codigo:
def calcular_BMI(peso_lb, altura_inch):
# Convertir peso de libras a kilogramos
peso_kg = peso_lb * 0.45
# Calcular el BMI
bmi = peso_kg / (altura_m ** 2)
return bmi_redondeado
# Ejemplo de uso:
peso_en_libras = 150.0
altura_en_pulgadas = 70.0
resultado_BMI = calcular_BMI(peso_en_libras, altura_en_pulgadas)
print("El BMI es:", resultado_BMI)
str Cadena de caracteres que indica cuántas monedas de cada denominación se deben
entregarle al comprador (usando la menor cantidad de monedas posible).
Codigo:
def calcular_cambio(cambio):
monedas_500 = cambio // 500
cambio %= 500
monedas_50 = cambio // 50
# Ejemplo de uso
cambio_a_entregar = 1175 # Cambio a entregar al cliente
mensaje_cambio = calcular_cambio(cambio_a_entregar)
print("Cantidad de monedas a entregar:", mensaje_cambio)
Una agencia de viajes necesita informar a sus clientes la hora de llegada de sus vuelos. Se
conoce la hora de partida del vuelo (en horas, minutos y segundos) y la duración del vuelo
(en horas, minutos y segundos).
Cree una función que retorne la hora de llegada del vuelo en una cadena con el formato
“HH:mm:ss” donde HH es la hora, mm los minutos y ss los segundos de la hora de llegada
del vuelo.
La hora está dada en formato de 24 horas. Si alguno de los 3 números de la respuesta es
menor a 10, sólo se necesita un dígito ('7' en lugar de '07').
Su solución debe tener una función de acuerdo con la siguiente especificación:
● Nombre de la función: calcular_horario_llegada
Si lo requiere, puede agregar funciones adicionales.
Descripción de parámetros:
Nombre Tipo Descripción
return f"{hora_llegada_str}:{minutos_llegada_str}:{segundos_llegada_str}"
# Ejemplo de uso
hora_salida = 12
minuto_salida = 30
segundo_salida = 0
duracion_horas = 3
duracion_minutos = 45
duracion_segundos = 30
Examen 1:
MÓDULO 2:
Reto 1: Modularidad
Escriba una función que reciba dos números enteros n y d y determine si n es divisible por 2d, si
n es divisible por d, o si n no es divisible ni por d ni por 2d.
Recuerde que ningún número es divisible por 0.
Su solución debe tener una función de acuerdo con la siguiente especificación:
● Nombre de la función: es_divisible
Si lo requiere, puede agregar funciones adicionales.
Descripción de parámetros:
Nombre Tipo Descripción
int Si el número n es divisible por 2d, retorna 2. Si el número n es divisible entre d pero no
entre 2d, retorna 1. De lo contrario, retorna 0.
Codigo:
def es_divisible(n: int, d: int) -> int:
if d == 0:
return 0 # Ningún número es divisible por 0
if n % (2 * d) == 0:
return 2 # n es divisible por 2d
elif n % d == 0:
return 1 # n es divisible por d
else:
return 0 # n no es divisible ni por d ni por 2d
# Ejemplo de uso
numero = 15
divisor = 5
resultado = es_divisible(numero, divisor)
if resultado == 2:
print(f"{numero} es divisible por 2*{divisor}")
elif resultado == 1:
print(f"{numero} es divisible por {divisor} pero no por
2*{divisor}")
else:
print(f"{numero} no es divisible ni por {divisor} ni por
2*{divisor}")
Reto 2: Regalo de santa
En el taller de regalos de Santa Claus, el CTE (Chief Technology Elf) ha decidido implementar
un nuevo sistema de clasificación de regalos, para facilitar su organización. Cada paquete tiene
ahora un identificador numérico único. El identificador es un número entero entre 100 y 999 y
sirve para clasificar los regalos de la siguiente manera.
● Si el número es palíndromo e impar, el regalo corresponde a una niña.
● Si el número es palíndromo y par, el regalo corresponde a un niño.
● Si el número es par pero no es palíndromo, el regalo corresponde a un hombre.
● Si el número es impar pero no es palíndromo, el regalo corresponde a una mujer.
Escriba una función que ayude al CTE a calcular, dado un identificador único de regalo, a qué
tipo de persona corresponde dicho regalo.
Su solución debe tener una función de acuerdo con la siguiente especificación:
● Nombre de la función: clasificar_regalo
Si lo requiere, puede agregar funciones adicionales.
Descripción de parámetros:
Nombre Tipo Descripción
# Ejemplo de uso
identificador_regalo = 131
tipo_persona = clasificar_regalo(identificador_regalo)
print(f"El regalo con identificador {identificador_regalo} corresponde a: {tipo_persona}")
giro_1 str La acción por ejecutar a partir de la orientación inicial del robot.
Debe ser un valor de los siguientes: {"L","H","R","."}.
str La orientación final del robot. Debe ser uno de los siguientes valores: {"W","N","S","E"}.
Codigo:
def movimiento_robot(orientacion_actual: str, giro_1: str, giro_2: str, giro_3: str) -> str:
# Definir reglas de giro
reglas_giro = {
"L": {"N": "W", "W": "S", "S": "E", "E": "N"},
"R": {"N": "E", "E": "S", "S": "W", "W": "N"},
"H": {"N": "S", "S": "N", "E": "W", "W": "E"},
".": {}
}
return orientacion_final
# Ejemplo de uso
orientacion_inicial = "N"
giro_1 = "R"
giro_2 = "H"
giro_3 = "L"
Codigo:
def conteo_de_materias(nombre_materia_1: str, nombre_materia_2: str, nombre_materia_3:
str) -> int:
# Palabras clave que indican que a Pedro le gustan las materias
palabras_clave = ['programación', 'matemática', 'filosofía', 'literatura']
return contador
# Ejemplo de uso
nombre_materia_1 = "Introducción a la programación"
nombre_materia_2 = "Álgebra lineal"
nombre_materia_3 = "Filosofía contemporánea"
dict Diccionario con las llaves "PICAS" y "FIJAS" que describen el resultado del intento.
Codigo:
def picas_y_fijas(numero_secreto: int, intento: int) -> dict:
# Convertir el número adivinado y el intento en listas de dígitos
num_secreto_lista = [int(d) for d in str(numero_secreto)]
intento_lista = [int(d) for d in str(intento)]
# Ejemplo de uso
numero_secreto = 1234
intento = 1325
estudiante1 dict Diccionario con las notas y el nombre del primer estudiante.
estudiante2 dict Diccionario con las notas y el nombre del segundo estudiante.
estudiante3 dict Diccionario con las notas y el nombre del tercer estudiante.
estudiante4 dict Diccionario con las notas y el nombre del cuarto estudiante.
estudiante5 dict Diccionario con las notas y el nombre del quinto estudiante.
Codigo:
def calcular_promedio(notas):
return sum(notas.values()) / len(notas)
mejor_promedio = float('-inf')
mejor_estudiante = None
# Ejemplo de uso
estudiante1 = {'nombre': 'Juan', 'matematicas': 4.5, 'español': 3.8, 'ciencias': 4.2, 'literatura':
4.7, 'arte': 3.9}
estudiante2 = {'nombre': 'María', 'matematicas': 3.9, 'español': 4.2, 'ciencias': 4.8, 'literatura':
4.5, 'arte': 4.1}
estudiante3 = {'nombre': 'Pedro', 'matematicas': 4.7, 'español': 4.3, 'ciencias': 4.6, 'literatura':
4.9, 'arte': 4.0}
estudiante4 = {'nombre': 'Ana', 'matematicas': 4.8, 'español': 4.1, 'ciencias': 4.4, 'literatura':
4.8, 'arte': 4.2}
estudiante5 = {'nombre': 'Luis', 'matematicas': 4.4, 'español': 4.4, 'ciencias': 4.7, 'literatura':
4.5, 'arte': 4.3}
EXAMEN 2:
MODULO 3
str Cadena que contiene los números de la sucesión de Fibonacci hasta la cantidad que
indica el parámetro, separados por coma y sin espacios intermedios.
Codigo:
def sucesion_fibonacci(cantidad_numeros):
if cantidad_numeros <= 0:
return "Cantidad de números debe ser un entero positivo"
return fibonacci_str
# Ejemplo de uso
cantidad_numeros_1 = 1
resultado_1 = sucesion_fibonacci(cantidad_numeros_1)
print(f"Caso 1: {resultado_1}") # Salida: "0"
cantidad_numeros_2 = 18
resultado_2 = sucesion_fibonacci(cantidad_numeros_2)
print(f"Caso 2: {resultado_2}") # Salida:
"0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597"
Reto 2: Mismos dígitos
Escriba una función que determine si en dos números enteros aparecen los mismos dígitos. No
tenga en cuenta ni la frecuencia ni el orden de aparición de los dígitos en los números.
Los números no tienen necesariamente la misma cantidad de dígitos. Por ejemplo, si los
números son 998 y 89 la función debería retornar True.
Su solución debe tener una función de acuerdo con la siguiente especificación:
● Nombre de la función: mismos_digitos
Si lo requiere, puede agregar funciones adicionales.
Descripción de parámetros:
Nombre Tipo Descripción
bool True si los dígitos que aparecen en ambos números son los mismos, False de lo
contrario.
Codigo:
def mismos_digitos(a, b):
# Convierte los números a conjuntos de dígitos
set_a = set(str(a))
set_b = set(str(b))
# Ejemplos de uso
numero_1 = 998
numero_2 = 89
print(mismos_digitos(numero_1, numero_2)) # Salida: True
numero_3 = 123
numero_4 = 789
print(mismos_digitos(numero_3, numero_4)) # Salida: False
Codigo:
def contar_caracteres_repetidos(cadena):
# Diccionario para contar la frecuencia de cada caracter
frecuencia_caracteres = {}
return caracteres_repetidos_count
# Ejemplo de uso
cadena_ejemplo = "abcaabbccd"
resultado = contar_caracteres_repetidos(cadena_ejemplo)
print("Cantidad de caracteres diferentes que aparecen más de una vez:", resultado) #
Salida: 3
Descripción de retorno:
Tipo Descripción
Codigo:
def ordenar_cadena(cadena):
# Convierte la cadena a una lista de caracteres, ordena y luego une nuevamente
cadena_ordenada = ''.join(sorted(cadena))
return cadena_ordenada
# Ejemplo de uso
cadena_ejemplo = "bca"
resultado = ordenar_cadena(cadena_ejemplo)
print("Cadena ordenada alfabéticamente:", resultado) # Salida: "abc"
Descripción de retorno:
Tipo Descripción
# Ejemplo de uso
lista_ejemplo = [4, 2, 7, 1, 5, 2]
elemento_buscado = 2
resultado = buscar_elemento(lista_ejemplo, elemento_buscado)
print("Índice del elemento buscado:", resultado) # Salida: 1
Descripción de retorno:
Tipo Descripción
def encontrar_mayor(entrada):
if not entrada:
return -1
return mayor
# Ejemplo de uso
lista_ejemplo = [10, 5, 20, 15, 25]
resultado = encontrar_mayor(lista_ejemplo)
print("El mayor número en la lista es:", resultado) # Salida: 25
estudiantes list Lista de diccionarios que representan a los estudiantes que han
finalizado el curso con su nota final sin aproximar. Cada diccionario tiene
las siguientes llaves: "nombre": (str) el nombre del estudiante. "nota":
(float), un float que representa la nota sin aproximar del estudiante
Descripción de retorno:
Tipo Descripción
list Lista de diccionarios, con la misma cantidad que en la lista inicial, pero con sus notas
aproximadas. El orden de los diccionarios debe ser el mismo que en la lista de entrada.
Cada uno de los diccionarios retornados debe tener las llaves: "nombre" (str) y "nota"
(float).
def calcular_definitivas(estudiantes):
# Función para aproximar la nota según las reglas
def aproximar_nota(nota):
if nota >= 4.5:
return 5.0
elif nota >= 3.5:
return 4.0
elif nota >= 2.5:
return 3.0
else:
return 1.5
# Ejemplo de uso
estudiantes_ejemplo = [
{"nombre": "Alice", "nota": 4.7},
{"nombre": "Bob", "nota": 3.2},
{"nombre": "Charlie", "nota": 2.9}
]
notas_aproximadas_ejemplo = calcular_definitivas(estudiantes_ejemplo)
print(notas_aproximadas_ejemplo)
Cantidad int La cantidad de pokémones que usará cada entrenador en la batalla final.
Es un entero entre 3 y 6.
Lista_pkmn list Una lista compuesta de diccionarios. Los diccionarios representan cada
uno de los pokémon elegibles por Ash. Cada diccionario tiene las
siguientes llaves: "nombre": (str) el nombre del pokemon, se garantiza
que no hay nombres repetidos en los diccionarios de la lista; "vida": (int),
"ataque":(int), "defensa": (int),"ataque_especial":
(int),"defensa_especial": (int),"velocidad": (int). Cada uno de estos
valores enteros representa la estadística de combate respectiva del
pokémon.
Descripción de retorno:
Tipo Descripción
def calcular_puntaje(pokemon):
"""Calcula el puntaje total de un Pokémon."""
return sum(pokemon[stat] for stat in ["vida", "ataque", "defensa", "ataque_especial",
"defensa_especial", "velocidad"])
# Ejemplo de uso
pokemones = [
{"nombre": "Charizard", "vida": 78, "ataque": 84, "defensa": 78, "ataque_especial": 109,
"defensa_especial": 85, "velocidad": 100},
{"nombre": "Mewtwo", "vida": 106, "ataque": 110, "defensa": 90, "ataque_especial": 154,
"defensa_especial": 90, "velocidad": 130},
{"nombre": "Rayquaza", "vida": 105, "ataque": 150, "defensa": 90, "ataque_especial": 150,
"defensa_especial": 90, "velocidad": 95}
]
catalogo dict Diccionario que contiene los nombres de los productos como llaves y sus
respectivos precios como valores.
Descripción de retorno:
Tipo Descripción
str El nombre del artículo más barato en el catálogo. Si no hay ningún artículo que valga
menos de 10.000, retornará None. Si el catálogo está vacío, retornará la cadena "No
hay productos para escoger".
def producto_mas_barato(catalogo):
if not catalogo:
return "No hay productos para escoger"
min_price = float('inf')
cheapest_products = []
# Ejemplo de uso
print(producto_mas_barato({})) # No hay productos para escoger
print(producto_mas_barato({'pantuflas': 20000, 'chicle': 2000, 'coca cola': 2500, 'lenceria':
7000})) # Chicle
print(producto_mas_barato({'pantuflas': 2000, 'chicle': 2000, 'coca cola': 2500, 'lenceria':
7000})) # Chicle
print(producto_mas_barato({'pantuflas': 12000, 'chicle': 2000, 'coca cola': 2500, 'lenceria':
7000})) # None
carrito_compras dict Diccionario que contiene los nombres de los productos del carrito
de compras como llaves y sus respectivos precios como valores.
Todas las llaves están escritas únicamente con letras minúsculas.
Descripción de retorno:
Tipo Descripción
str El nombre del artículo más costoso en el carrito de compras. Si el carrito de compras
está vacío, retornará la cadena "No hay productos en el carrito".
def producto_mas_costoso(carrito_compras):
if not carrito_compras:
return "No hay productos en el carrito"
max_price = float('-inf')
most_expensive_products = []
# Ejemplo de uso
carrito = {'manzanas': 12000, 'bananos': 15000, 'chocolatinas': 12000, 'uvas': 15000}
print(producto_mas_costoso(carrito)) # Salida: "bananos"
carrito_compras dict Diccionario que contiene los nombres de los productos del carro de
compras como llaves y sus respectivos precios como valores.
Descripción de retorno:
Tipo Descripción
float Valor total del carro de compras. Si el carro de compras está vacío, retornará el valor
cero.
def valor_carrito_compras(carrito_compras):
total = 0.0
return total
# Ejemplo de uso
carrito = {'manzanas': 12000, 'bananos': 15000, 'chocolatinas': 5000, 'uvas': 8000}
print("Valor total del carrito de compras:", valor_carrito_compras(carrito)) # Salida: 40000.0
Descripción de retorno:
Tipo Descripción
str El nombre de la mejor aerolínea (la que tenga menor retraso promedio).
def mejor_aerolinea(vuelos):
# Creamos un diccionario para almacenar el retraso acumulado y la cantidad de vuelos
por aerolínea
retrasos_acumulados = defaultdict(int)
cantidad_vuelos = defaultdict(int)
# Iteramos sobre los vuelos para acumular los retrasos por aerolínea
for vuelo_info in vuelos.values():
aerolinea = vuelo_info['aerolinea']
retraso = vuelo_info['retraso']
retrasos_acumulados[aerolinea] += retraso
cantidad_vuelos[aerolinea] += 1
return mejor_aerolinea
# Ejemplo de uso
vuelos = {
'V1': {'aerolinea': 'Delta', 'retraso': 10},
'V2': {'aerolinea': 'American Airlines', 'retraso': 20},
'V3': {'aerolinea': 'Delta', 'retraso': 5},
'V4': {'aerolinea': 'United Airlines', 'retraso': 15}
}
dict Un diccionario con las llaves "mayor", "mejor", "menor", "peor", "promedio", "cantidad" y
"total" que representan: la mayor nota, el nombre del estudiante con la mejor nota, la
peor nota, el nombre del estudiante con la peor nota, el promedio, la cantidad de
estudiantes que hicieron la tarea y el valor total que resulta de sumar todas las notas
obtenidas en esa tarea.
def calcular_estadisticas_tarea(estudiantes_tareas, nombre_tarea):
# Inicializar variables para el cálculo de estadísticas
mayor_nota = float('-inf')
mejor_estudiante = ""
menor_nota = float('inf')
peor_estudiante = ""
suma_notas = 0
cantidad_estudiantes = 0
return estadisticas
# Ejemplo de uso
estudiantes_tareas = {
"Roberto": {"Tarea 1": 80, "Tarea 2": 90},
"Laura": {"Tarea 1": 70},
"Carlos": {"Tarea 2": 85}
}
salon list Matriz que representa el salón de estudiantes, los valores son enteros que
representan cuánto dinero aportarán.
vaca str Cadena que indica qué vaca se está realizando, esta puede ser 'botella' o
'pastel .
Descripción de retorno:
Tipo Descripción
list Lista cuya primera posición es un str de la forma 'Hay Vaca' si se alcanzó la vaca, y
'No Alcanza' de lo contrario. Las siguientes dos posiciones, son las coordenadas del
estudiante qué más dinero aportó.
def hacer_la_vaca(salon, vaca):
total_dinero = sum(sum(row) for row in salon)
# Ejemplo de uso
salon_ejemplo = [
[50000, 60000, 70000],
[80000, 100000, 90000],
[120000, 95000, 110000]
]
Descripción de retorno:
Tipo Descripción
return round(promedio, 2)
# Ejemplo de uso
salon_ejemplo = [
[85, 90, 0, 75],
[0, 0, 0, 0],
[70, 80, 85, 90]
]
operacion str Cadena con el símbolo de la operación a realizar. El símbolo puede ser '+',
'-', '*' o '/'.
Descripción de retorno:
Tipo Descripción
return matriz
# Ejemplo de uso
matriz_ejemplo = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
Examen 3
Modulo 4
Parámetros:
vector_1 (tuple): Primer vector tridimensional representado como una tupla (x1, y1, z1).
vector_2 (tuple): Segundo vector tridimensional representado como una tupla (x2, y2, z2).
Retorna:
tuple: El vector resultante de la suma como una tupla (x1 + x2, y1 + y2, z1 + z2).
"""
resultado = (vector_1[0] + vector_2[0], vector_1[1] + vector_2[1], vector_1[2] +
vector_2[2])
return resultado
# Ejemplo de uso
vector_1 = (1.0, 2.0, 3.0)
vector_2 = (4.0, 5.0, 6.0)
Reto 3: Binarizar
Este ejercicio consiste en llevar los valores de una matriz que representa una imagen a dos
colores: negro y blanco. En cada posición de la matriz que representa la imagen, hay una tupla
de 3 flotantes entre 0 y 1 que representan los valores R, G y B del píxel.
Para ello, se establece un umbral (valor entre 0 y 1) y los píxeles con promedio de color que son
iguales o mayores al umbral se cambian a blanco (todos los valores de la tupla en 1) y los que
están por debajo se cambian a negro (todos los valores de la tupla en 0).
Su solución debe tener una función de acuerdo con la siguiente especificación:
● Nombre de la función: binarizar_imagen
Si lo requiere, puede agregar funciones adicionales.
Descripción de argumentos:
Nombre Tipo Descripción
imagen_binarizada = []
imagen_binarizada.append(fila_binarizada)
return imagen_binarizada
# Ejemplo de uso
imagen_original = [
[[0.2, 0.4, 0.6], [0.7, 0.8, 0.1], [0.5, 0.5, 0.5]],
[[0.9, 0.2, 0.3], [0.1, 0.5, 0.9], [0.8, 0.7, 0.4]],
[[0.3, 0.3, 0.3], [0.6, 0.6, 0.6], [0.2, 0.2, 0.2]]
]
umbral = 0.5
def reflejar_imagen(imagen):
imagen_reflejada = []
# Ejemplo de uso
imagen_original = [
[[0.2, 0.4, 0.6], [0.7, 0.8, 0.1], [0.5, 0.5, 0.5]],
[[0.9, 0.2, 0.3], [0.1, 0.5, 0.9], [0.8, 0.7, 0.4]],
[[0.3, 0.3, 0.3], [0.6, 0.6, 0.6], [0.2, 0.2, 0.2]]
]
imagen_reflejada = reflejar_imagen(imagen_original)
print(imagen_reflejada)
def mejores_estudiantes(estudiantes):
# Calcula el promedio de cada estudiante y redondea a 2 decimales
estudiantes['promedio'] = estudiantes.mean(axis=1).round(2)
return mejores_estudiantes
# Ejemplo de uso
datos = {
'nombre': ['Estudiante1', 'Estudiante2', 'Estudiante3', 'Estudiante4', 'Estudiante5'],
'matematicas': [4.5, 3.7, 4.9, 4.8, 3.2],
'ingles': [3.9, 4.2, 4.5, 3.8, 4.7],
'ciencias': [4.8, 4.6, 4.9, 4.7, 4.5],
'literatura': [4.2, 4.1, 4.7, 3.9, 4.3],
'arte': [4.5, 4.6, 4.9, 4.7, 4.5]
}
import numpy as np
import pandas as pd
def depurar_partidos(partidos):
# Elimina los partidos en los que un equipo juega contra sí mismo
partidos = partidos[partidos['local'] != partidos['visitante']]
return partidos
# Ejemplo de uso
datos = {
'local': ['Equipo1', 'Equipo2', 'Equipo3', 'Equipo4'],
'visitante': ['Equipo2', 'Equipo3', 'Equipo1', 'Equipo3'],
'goles_local': [3, np.nan, 1, 2],
'goles_visitante': [np.nan, 2, 2, 1],
'resultado': ['Equipo1', np.nan, np.nan, np.nan]
}
import pandas as pd
return resultado
# Ejemplo de uso
datos_poblacion = {
'Pais': ['Australia', 'USA', 'UK'],
'Poblacion': [25000000, 330000000, 66000000],
'Edad_mediana': [37, 38, 40]
}
datos_universidades = {
'country': ['Australia', 'USA', 'UK', 'USA', 'Australia', 'UK'],
'university_name': ['Uni1', 'Uni2', 'Uni3', 'Uni4', 'Uni5', 'Uni6'],
'num_students': [200000, 300000, 400000, 100000, 240000, 300000]
}
df_poblacion = pd.DataFrame(datos_poblacion)
df_universidades = pd.DataFrame(datos_universidades)