{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "44c10fee",
   "metadata": {},
   "source": [
    "# Ejercicios propuestos"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bbfb54f0",
   "metadata": {},
   "source": [
    "# DCCorredor de Propiedades"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "38b78c90",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Casa N°1\n",
      "M2: 40\n",
      "Baños: 3\n",
      "Piezas: 2\n",
      "Pisos: 2\n",
      "Pariada: False\n",
      "------------------------\n",
      "Precio: 48000.0\n",
      "\n",
      "Depto N°1 Ubicado en el Piso 10\n",
      "M2: 20\n",
      "Baños: 2\n",
      "Piezas: 3\n",
      "Piso: 10\n",
      "Elevador: True\n",
      "------------------------\n",
      "Precio: 120000.0\n",
      "\n"
     ]
    }
   ],
   "source": [
    "#Añadir solución\n",
    "from abc import ABC, abstractmethod\n",
    "\n",
    "\n",
    "class Inmueble(ABC):\n",
    "    \n",
    "    def __init__(self,n,m,banios, habs) -> None:\n",
    "        self.numero = n\n",
    "        self.m2= m\n",
    "        self.banios = banios\n",
    "        self.habitaciones = habs\n",
    "\n",
    "    @property \n",
    "    @abstractmethod  \n",
    "    def precio(self):\n",
    "        pass\n",
    "\n",
    "    @abstractmethod\n",
    "    def describir(self):\n",
    "        pass\n",
    "\n",
    "\n",
    "class Casa(Inmueble):\n",
    "    \n",
    "    def __init__(self,n,m,banios, habs,par,niv) -> None:\n",
    "        super().__init__(n,m,banios, habs)\n",
    "        self.niveles = niv\n",
    "        self.par = par\n",
    "\n",
    "    @property\n",
    "    def precio(self):\n",
    "        return 1000*self.banios* self.habitaciones*self.niveles* self.m2/ \\\n",
    "    (10+10*int(self.par))\n",
    "\n",
    "    def describir(self):\n",
    "        print(f\"\"\"Casa N°{self.numero}\n",
    "M2: {self.m2}\n",
    "Baños: {self.banios}\n",
    "Piezas: {self.habitaciones}\n",
    "Pisos: {self.niveles}\n",
    "Pariada: {self.par}\n",
    "------------------------\n",
    "Precio: {self.precio}\n",
    "\"\"\")\n",
    "\n",
    "\n",
    "class Depto(Inmueble):\n",
    "\n",
    "\n",
    "    def __init__(self,n,m,banios, habs,elev,piso) -> None:\n",
    "        super().__init__(n,m,banios, habs)\n",
    "        self.elevador = elev\n",
    "        self.piso = piso\n",
    "\n",
    "\n",
    "    @property\n",
    "    def precio(self):\n",
    "        return 1000*self.banios* self.habitaciones* self.m2/ \\\n",
    "                            (20-10*int(self.elevador))*self.piso\n",
    "    \n",
    "    \n",
    "    def describir(self):\n",
    "        print(\n",
    "            f\"\"\"Depto N°{self.numero} Ubicado en el Piso {self.piso}\n",
    "            M2: {self.m2}\n",
    "            Baños: {self.banios}\n",
    "            Piezas: {self.habitaciones}\n",
    "            Piso: {self.piso}\n",
    "            Elevador: {self.elevador}\n",
    "            ------------------------\n",
    "            Precio: {self.precio}\n",
    "            \"\"\"\n",
    "        )\n",
    "    \n",
    "casa = Casa(1, 40, 3, 2, False, 2)\n",
    "casa.describir()\n",
    "casa.precio\n",
    "depto = Depto(1, 20, 2, 3, True, 10)\n",
    "depto.describir()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f16acef1",
   "metadata": {},
   "source": [
    "## DC(A)Cademia"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a5bd7012",
   "metadata": {},
   "outputs": [],
   "source": [
    "from abc import ABC, abstractmethod\n",
    "\n",
    "\n",
    "class EstudianteUc(ABC): \n",
    "    #Clase base\n",
    "\n",
    "    def __init__(self, nombre, numero_estudiante, semestre_actual):\n",
    "        self.nombre = nombre\n",
    "        self.numero_estudiante = numero_estudiante\n",
    "        self.semestre_actual = semestre_actual\n",
    "\n",
    "    def asistir_clase(self, clase):\n",
    "        print(f\"Asistiendo a la clase de {clase}\")\n",
    "\n",
    "    def procrastinar(self):\n",
    "        print(\"Zzzzzz...\")\n",
    "\n",
    "    @abstractmethod\n",
    "    def ir_a_la_universidad(self):\n",
    "        pass\n",
    "\n",
    "    @abstractmethod\n",
    "    def pasar_de_largo(self):\n",
    "        pass\n",
    "\n",
    "\n",
    "class EstudianteDCC(EstudianteUc): \n",
    "    # Heredamos de EstudianteUC\n",
    "\n",
    "    def __init__(self, sist_operativo, version_python, *args, **kwargs):\n",
    "        super().__init__(*args, **kwargs) \n",
    "        #Heredamos los atributos necesarios (lo mismo para las otras clases que heredan)\n",
    "        self.sist_operativo = sist_operativo\n",
    "        self.version_python = version_python\n",
    "\n",
    "    def programar(self):\n",
    "        print(f\"Programando en python versión {self.version_python}\")\n",
    "\n",
    "    def pasar_de_largo(self):\n",
    "        print(\"No entiendo la multiherencia...\")\n",
    "\n",
    "    def ir_a_la_universidad(self):\n",
    "        print(\"Yendo al DCC...\")\n",
    "\n",
    "\n",
    "class Seleccionado(EstudianteDCC): \n",
    "    # Heredamos de EstudianteDCC\n",
    "\n",
    "    def __init__(self, seleccion, *args, **kwargs):\n",
    "        super().__init__(*args, **kwargs)\n",
    "        self.seleccion = seleccion\n",
    "    \n",
    "    def juego(self, contrincante):\n",
    "        print(f\"Jugando contra {contrincante}\")\n",
    "\n",
    "    def ir_a_la_universidad(self):\n",
    "        print(\"Yendo a las canchas de deporte\")\n",
    "\n",
    "\n",
    "class SeleccionadoDCC(Seleccionado, EstudianteDCC): \n",
    "    # Hacemos multiherencia heredando tanto de seleccionado y de estudiante DCC\n",
    "\n",
    "    def __init__(self, *args, **kwargs):\n",
    "        super().__init__(*args, **kwargs)\n",
    "\n",
    "    def seleccionado(self):\n",
    "        print(f\"Llegue al top, estoy compitiendo profesionalmente en la seleccion {self.seleccion}!\")\n",
    "\n",
    "\n",
    "Juan = SeleccionadoDCC(nombre=\"Juan\",numero_estudiante=1232,\n",
    "semestre_actual=2,sist_operativo=\"python\",\n",
    "version_python=3.10,seleccion=\"Chilena\")\n",
    "Juan.seleccionado()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "c1ece347",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Animal():\n",
    "\n",
    "    def __init__(self, nombre, clasificacion):\n",
    "        self.nombre = nombre\n",
    "        self.clasificacion = clasificacion\n",
    "    \n",
    "    def exhibicion(self):\n",
    "        print(f\"El animal es un {self.nombre} y es un {self.clasificacion}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "11b48d71",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Carnivoro(Animal):\n",
    "\n",
    "    def __init__(self, carne_consumida, hambre, *args, **kwargs):\n",
    "        super().__init__(*args, **kwargs)\n",
    "        self.carne_consumida = carne_consumida\n",
    "        self.hambre = hambre\n",
    "        \n",
    "    def exhibicion(self):\n",
    "        super().exhibicion()\n",
    "        print(f'Ha comido {self.carne_consumida}kg de carne y quedó con {self.hambre} hambre.')\n",
    "\n",
    "class Herbivoro(Animal):\n",
    "\n",
    "    def __init__(self, verduras_consumidas, *args,  **kwargs):\n",
    "        super().__init__(*args, **kwargs)\n",
    "        self.verduras_consumidas = verduras_consumidas\n",
    "    \n",
    "    def exhibicion(self):\n",
    "        super().exhibicion()\n",
    "        print(f'Ha comido {self.verduras_consumidas} verduras hoy.')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "92647957",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Omnivoro(Carnivoro, Herbivoro):\n",
    "\n",
    "    def __init__(self, *args,  **kwargs):\n",
    "        super().__init__(*args, **kwargs)\n",
    "\n",
    "    def exhibicion(self):\n",
    "        super().exhibicion() \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "e21ef4a0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "El animal es un Chanchito y es un Mamífero\n",
      "Ha comido 5 verduras hoy.\n",
      "Ha comido 2kg de carne y quedó con mucha hambre.\n"
     ]
    }
   ],
   "source": [
    "Chanchito = Omnivoro(nombre=\"Chanchito\", clasificacion=\"Mamífero\", carne_consumida=2, \n",
    "                     hambre=\"mucha\", verduras_consumidas=5)\n",
    "\n",
    "Chanchito.exhibicion()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ffff526",
   "metadata": {},
   "source": [
    "### Listas 2: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e48ac0a6",
   "metadata": {},
   "outputs": [],
   "source": [
    "from random import randint\n",
    "\n",
    "\n",
    "class Lista2(list):\n",
    "\n",
    "    def repetidos(self):\n",
    "        aux = []\n",
    "        repetidos = []\n",
    "        for elemento in self:\n",
    "            if elemento not in aux:\n",
    "                aux.append(elemento)\n",
    "            else:\n",
    "                repetidos.append(elemento)\n",
    "        for elemento in repetidos:\n",
    "            self.remove(elemento)\n",
    "        # self = list(set(self))\n",
    "\n",
    "    def mediana(self):\n",
    "        tamano = len(self)\n",
    "        for elemento in self:\n",
    "            if not isinstance(elemento, int):\n",
    "                return\n",
    "        aux = sorted(self)\n",
    "        if not tamano % 2:\n",
    "            return (aux[int(tamano / 2)] + aux[int(tamano / 2 - 1)]) / 2\n",
    "        else:\n",
    "            return aux[int(tamano // 2)]\n",
    "\n",
    "    def aleatorizar(self):\n",
    "        aux = self.copy()\n",
    "        for _ in self:\n",
    "            self.pop(0)\n",
    "            self.append(aux.pop(randint(0, len(aux) - 1)))\n",
    "\n",
    "    def moda(self):\n",
    "        maxcount = 0\n",
    "        moda = None\n",
    "        for i in self:\n",
    "            n = self.count(i)\n",
    "            if n > maxcount:\n",
    "                maxcount = n\n",
    "                moda = i\n",
    "        return moda\n",
    "\n",
    "    def eliminar_pares(self):\n",
    "        pares = []\n",
    "        for elemento in self:\n",
    "            if isinstance(elemento, int) and not elemento % 2:\n",
    "                pares.append(elemento)\n",
    "        for elemento in pares:\n",
    "            self.remove(elemento)\n",
    "\n",
    "    def eliminar_impares(self):\n",
    "        impares = []\n",
    "        for elemento in self:\n",
    "            if isinstance(elemento, int) and elemento % 2:\n",
    "                impares.append(elemento)\n",
    "        for elemento in impares:\n",
    "            self.remove(elemento)\n",
    "\n",
    "\n",
    "lista = Lista2([\"hola\", \"mundo\", \"mundo\", 1, 1, 1, 2, 3, 7])\n",
    "print(f\"Lista original: {lista}\")\n",
    "print(f\"Moda: {lista.moda()}\")\n",
    "lista.repetidos()\n",
    "print(f\"Lista sin repetidos: {lista}\")\n",
    "print()\n",
    "\n",
    "lista = Lista2([1, 2, 3, 4, 5, 6, 7, 8, 9])\n",
    "print(f\"Lista original: {lista}\")\n",
    "lista.aleatorizar()\n",
    "print(f\"Lista aleatorizada: {lista}\")\n",
    "print(f\"Mediana: {lista.mediana()}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
