From 14d272610ea4dd072321401956794f346e154b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rivero=20Juli=C3=A1n?= <86316267+juli-rivero@users.noreply.github.com> Date: Mon, 12 Aug 2024 10:15:14 -0300 Subject: [PATCH] Ya se muestran las materias con codigo alfanumerico (#20) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update materias.json con materias 2024 Ing. Informática Añadidos las materias que me aparecen a mi (mi carrera es Ingeniería en Informática) en https://guaraniautogestion.fi.uba.ar/g3w/oferta_comisiones. Añadir las de cada uno es facil, solamente hay que correr este script que hice en `inspeccionar -> consola`: const periodos = document.querySelectorAll("[periodo]"); const data = new Map() periodos.forEach(periodo => { const materias = periodo.querySelectorAll("[actividad]") materias.forEach(materia => { const indiceParentesis = materia.getAttribute("actividad").indexOf("("); const materiaId = materia.getAttribute("actividad").slice(indiceParentesis + 1, -1); const materiaName = materia.getAttribute("actividad").slice(0, indiceParentesis).trim(); data.set(materiaId, materiaName); }) }) console.log(Object.fromEntries(data)) Luego, solo hay que hacer click derecho -> "Copiar Objeto" * Aparecen los nombres de todas las materias (incluidas las de los codigos alfanumericos) en la lista de materias * cambiado reponames de tipo de dato Set a Array * Ahora se muestran los repositorios de las materias con codigo alfanumerico * formateo de codigo trabajado con prettier * correccion aparecían los repositorios de materias nuevas al estar el filtro fiubaOnly * Aparecen los nombres de todas las materias (incluidas las de los codigos alfanumericos) en la lista de materias * cambiado reponames de tipo de dato Set a Array * Ahora se muestran los repositorios de las materias con codigo alfanumerico * formateo de codigo trabajado con prettier * correccion aparecían los repositorios de materias nuevas al estar el filtro fiubaOnly * Añadida carpeta guia para subir materias 1. Se "capitalizaron" los palabras de los nombres de las materias (primera letra de cada palabra en mayúscula) 2. Cree una carpeta que tiene un README.md con los pasos a seguir para obtener las materias y actualizar el json (decime si esta bien o si está de más y lo saco) * formateo del json por separado * obtener-subir-materias afuera del src * actualizado README del obtener-subir-materias --- obtener-subir-materias/README.md | 31 +++++ obtener-subir-materias/actualizar_json.py | 22 ++++ obtener-subir-materias/formatear_json.py | 39 +++++++ obtener-subir-materias/materias-a-subir.json | 32 ++++++ .../obtenerMateriasdelSiuOfertaComisiones.js | 13 +++ src/components/MainApp.js | 53 ++++----- src/components/Materias.js | 4 +- src/components/Repos.js | 52 ++++----- src/data/materias.json | 106 +++++++++--------- 9 files changed, 239 insertions(+), 113 deletions(-) create mode 100644 obtener-subir-materias/README.md create mode 100644 obtener-subir-materias/actualizar_json.py create mode 100644 obtener-subir-materias/formatear_json.py create mode 100644 obtener-subir-materias/materias-a-subir.json create mode 100644 obtener-subir-materias/obtenerMateriasdelSiuOfertaComisiones.js diff --git a/obtener-subir-materias/README.md b/obtener-subir-materias/README.md new file mode 100644 index 0000000..48333d5 --- /dev/null +++ b/obtener-subir-materias/README.md @@ -0,0 +1,31 @@ +# Como puedo obtener y subir las materias de mi carrera + +> [!TIP] +> Si ya tenes las materias que queres subir anda a la seccion 2 + +> [!NOTE] +> Como el SIU Guaraní no permite obtener las materias con sus respectivos códigos públicamente, este proceso se tiene que hacer iniciando sesión en el SIU Guarani de FIUBA, ir a oferta de comisiones, agarrar todas las materias con sus códigos y subirlos manualmente. + +## Obtener códigos y materias de tu carrera + +1. Dirigirte a oferta_comisiones del SIU Guarani de FIUBA (https://guaraniautogestion.fi.uba.ar/g3w/oferta_comisiones) +2. Abrir la consola del inspeccionar (Ctrl + Mayus + i) +3. Copiar el contenido del script "obtenerMateriasdelSiuOfertaComisiones.js" (se encuentra en esta carpeta) +4. Pegarlo en la consola del inspeccionar y ejecutarlo (dependiendo del navegador es presionar Enter o hacer click en un boton) +5. Hacer click derecho sobre el arreglo mostrado -> "Copy Object" + +## Actualizar json + +1. Una vez que tenemos las materias como un objeto de estructura `{ : }`, sobreescribimos el archivo "materias-a-subir.json" (se encuentra en esta carpeta) +2. Ejecutar el archivo "actualizar_json.py" (una manera sencilla es con el boton de play si estas usando Visual Code) + +## Formatear json + +1. Ejecutar el archivo "formatear_json.js" (una manera sencilla es con el boton de play si estas usando Visual Code) + +## Guardar y subir cambios + +1. `git add src/data/materias.json` +2. `git commit -m "materias de la carrera añadidas"` +3. `git push origin master` +4. Hacer pull request (desde github) a [fDelMazo/FIUBA-Repos](https://github.com/FdelMazo/FIUBA-Repos) \ No newline at end of file diff --git a/obtener-subir-materias/actualizar_json.py b/obtener-subir-materias/actualizar_json.py new file mode 100644 index 0000000..5d15389 --- /dev/null +++ b/obtener-subir-materias/actualizar_json.py @@ -0,0 +1,22 @@ +import os + +# Obtener la ruta absoluta del directorio actual del script +script_dir = os.path.dirname(os.path.abspath(__file__)) + +# Construir las rutas absolutas +materias_a_subir_path = os.path.join(script_dir, "materias-a-subir.json") +materias_path = os.path.abspath(os.path.join(script_dir, "../src/data/materias.json")) + +import json + +with ( + open(materias_a_subir_path, "r", encoding='utf-8') as archivo_materias_a_subir, + open(materias_path, "r", encoding='utf-8') as archivo_materias +): + materias_a_subir = json.load(archivo_materias_a_subir) + materias = json.load(archivo_materias) + for key, value in materias_a_subir.items(): + materias[key] = value + +with open(materias_path, "w", encoding='utf-8') as archivo_materias: + json.dump(materias, archivo_materias, ensure_ascii=False, indent=2) \ No newline at end of file diff --git a/obtener-subir-materias/formatear_json.py b/obtener-subir-materias/formatear_json.py new file mode 100644 index 0000000..39755dc --- /dev/null +++ b/obtener-subir-materias/formatear_json.py @@ -0,0 +1,39 @@ +import os + +# Obtener la ruta absoluta del directorio actual del script +script_dir = os.path.dirname(os.path.abspath(__file__)) + +# Construir las rutas absolutas +materias_a_subir_path = os.path.join(script_dir, "materias-a-subir.json") +materias_path = os.path.abspath(os.path.join(script_dir, "../src/data/materias.json")) + +import json + +def format_name(texto: str): + words = texto.split() + palabras_vacias = ['y','para', 'de', 'del', 'el', 'los', 'la', 'las', 'al', 'su', 'sus', 'en', 'a', 'por', 'no', 'e', 'con'] + nivel = ['I','II','III','IV','V'] + variantes = ['A','B','C'] + excepciones = ['AT', 'SEP'] + + + for index, word in enumerate(words): + if not word in excepciones: + if index == len(words)-1 and word.upper() in variantes: + words[index] = word.upper() + elif word.upper() in nivel: + words[index] = word.upper() + elif word.lower() in palabras_vacias: + words[index] = word.lower() + else: + words[index] = word.capitalize() + + return ' '.join(words) + +with open(materias_path, "r", encoding='utf-8') as archivo_materias: + materias = json.load(archivo_materias) + for key, value in materias.items(): + materias[key] = format_name(value) + +with open(materias_path, "w", encoding='utf-8') as archivo_materias: + json.dump(materias, archivo_materias, ensure_ascii=False, indent=2) \ No newline at end of file diff --git a/obtener-subir-materias/materias-a-subir.json b/obtener-subir-materias/materias-a-subir.json new file mode 100644 index 0000000..c9a275a --- /dev/null +++ b/obtener-subir-materias/materias-a-subir.json @@ -0,0 +1,32 @@ +{ + "CB002": "ÁLGEBRA LINEAL", + "CB100": "ALGORITMOS Y ESTRUCTURAS DE DATOS", + "CB001": "ANÁLISIS MATEMÁTICO II", + "CB005": "ANÁLISIS MATEMÁTICO III", + "TA061": "APRENDIZAJE AUTOMÁTICO", + "TB034": "ARQUITECTURA DE SOFTWARE", + "TA044": "BASE DE DATOS", + "TA047": "CIENCIA DE DATOS", + "TB032": "COMPUTACIÓN CUÁNTICA", + "TC018": "EMPRESAS DE BASE TECNOLÓGICA I", + "TC019": "EMPRESAS DE BASE TECNOLÓGICA II", + "CB024": "FÍSICA PARA INFORMÁTICA", + "TB021": "FUNDAMENTOS DE PROGRAMACIÓN", + "TC017": "GESTIÓN DEL DESARROLLO DE SISTEMAS INFORMÁTICOS", + "TA046": "INGENIERÍA DE SOFTWARE I", + "TA049": "INGENIERÍA DE SOFTWARE II", + "TB022": "INTRODUCCIÓN AL DESARROLLO DE SOFTWARE", + "CB051": "MODELACIÓN NUMÉRICA", + "TB023": "ORGANIZACIÓN DEL COMPUTADOR", + "TB025": "PARADIGMAS DE PROGRAMACIÓN", + "CB003": "PROBABILIDAD Y ESTADÍSTICA", + "TB026": "PROGRAMACIÓN CONCURRENTE", + "TA048": "REDES", + "TB028": "SIMULACIÓN", + "TA050": "SISTEMAS DISTRIBUIDOS I", + "TA043": "SISTEMAS OPERATIVOS", + "TA045": "TALLER DE PROGRAMACIÓN", + "TB024": "TEORÍA DE ALGORITMOS", + "TA053": "TRABAJO PROFESIONAL DE INGENIERÍA INFORMÁTICA", + "TA062": "APRENDIZAJE PROFUNDO" +} \ No newline at end of file diff --git a/obtener-subir-materias/obtenerMateriasdelSiuOfertaComisiones.js b/obtener-subir-materias/obtenerMateriasdelSiuOfertaComisiones.js new file mode 100644 index 0000000..e785c7f --- /dev/null +++ b/obtener-subir-materias/obtenerMateriasdelSiuOfertaComisiones.js @@ -0,0 +1,13 @@ +const periodos = document.querySelectorAll("[periodo]"); +const data = new Map() + +periodos.forEach(periodo => { + const materias = periodo.querySelectorAll("[actividad]") + materias.forEach(materia => { + const indiceParentesis = materia.getAttribute("actividad").indexOf("("); + const materiaId = materia.getAttribute("actividad").slice(indiceParentesis + 1, -1); + const materiaName = materia.getAttribute("actividad").slice(0, indiceParentesis).trim(); + data.set(materiaId, materiaName); + }) +}) +console.log(Object.fromEntries(data)) \ No newline at end of file diff --git a/src/components/MainApp.js b/src/components/MainApp.js index f7d7fa5..e3d9016 100644 --- a/src/components/MainApp.js +++ b/src/components/MainApp.js @@ -19,42 +19,29 @@ const MainApp = () => { }, [data]); const materias = React.useMemo(() => { - const codigosMaterias = [ - ...new Set( - data.flatMap((r) => r.topics.filter((t) => t.match(/^\d\d\d\d$/))), - ), - ]; - - let allMaterias = Object.keys(ALIAS_MATERIAS).reduce((acc, c) => { - const nombre = ALIAS_MATERIAS[c]; - let m = acc.find((mx) => mx.nombre === nombre); - if (m) { - m.codigos.push(c); - } else { - acc.push({ - codigos: [c], - nombre, + const mapa = data.reduce((mapa, repo) => { + const codigosEnRepo = repo.topics + .map((t) => t.toUpperCase()) + .filter((t) => ALIAS_MATERIAS.hasOwnProperty(t)); + codigosEnRepo.forEach((codigoEnRepo) => { + const nombreMateria = ALIAS_MATERIAS[codigoEnRepo]; + const valuesAntes = mapa.get(nombreMateria); + const codigosAntes = valuesAntes ? valuesAntes.codigos : []; + const reposAntes = valuesAntes ? valuesAntes.reponames : []; + mapa.set(nombreMateria, { + codigos: [...new Set([...codigosAntes, codigoEnRepo])], + reponames: [...new Set([...reposAntes, repo.full_name])], }); - } - return acc; - }, []); + }); - codigosMaterias.forEach((c) => { - const materia = allMaterias.find((m) => m.codigos.includes(c)); - if (!materia) return; - if (materia.reponames) { - materia.reponames = new Set([ - ...materia.reponames, - ...data.filter((r) => r.topics.includes(c)).map((r) => r.full_name), - ]); - } else { - materia["reponames"] = new Set( - data.filter((r) => r.topics.includes(c)).map((r) => r.full_name), - ); - } - }); + return mapa; + }, new Map()); + const materias = Array.from(mapa, ([nombreMateria, objeto]) => ({ + nombre: nombreMateria, + ...objeto, + })); - return allMaterias.filter((m) => m.reponames?.size > 0); + return materias; }, [data]); const [codigoSelected, setCodigoSelected] = React.useState(() => { diff --git a/src/components/Materias.js b/src/components/Materias.js index f86de1c..6eb86a5 100644 --- a/src/components/Materias.js +++ b/src/components/Materias.js @@ -27,7 +27,7 @@ const Materias = ({ const [nombreFilter, setNombreFilter] = React.useState(""); const shownMaterias = React.useMemo(() => { return materias - .sort((a, b) => b.reponames.size - a.reponames.size) + .sort((a, b) => b.reponames.length - a.reponames.length) .filter((m) => { const nombreFilterNormalizado = nombreFilter .normalize("NFD") @@ -122,7 +122,7 @@ const Materias = ({ - {m.reponames.size} + {m.reponames.length} diff --git a/src/components/Repos.js b/src/components/Repos.js index d02c685..925d488 100644 --- a/src/components/Repos.js +++ b/src/components/Repos.js @@ -1,8 +1,4 @@ -import { - Search2Icon, - StarIcon, - TimeIcon, -} from "@chakra-ui/icons"; +import { Search2Icon, StarIcon, TimeIcon } from "@chakra-ui/icons"; import { Box, Button, @@ -27,31 +23,32 @@ const Repos = ({ materiaSelected, repos, materias }) => { const [nombreFilter, setNombreFilter] = React.useState(""); const shownRepos = React.useMemo(() => { - let reposToShow = repos + let reposToShow = repos; if (fiubaOnly) { - reposToShow = repos - .filter( - (r) => - !materias - .flatMap((m) => m.codigos) - .some((c) => r.repoData.topics.includes(c)), - ) + reposToShow = repos.filter( + (r) => + !materias + .flatMap((m) => m.codigos) + .some((c) => r.repoData.topics.includes(c.toLowerCase())), + ); } else if (materiaSelected) { - reposToShow = repos - .filter((r) => - materiaSelected.codigos.some((c) => r.repoData.topics.includes(c)), - ) + reposToShow = repos.filter((r) => + materiaSelected.codigos.some((c) => + r.repoData.topics.includes(c.toLowerCase()), + ), + ); } if (nombreFilter) { - reposToShow = reposToShow.filter((r) => - r.user.toLowerCase().includes(nombreFilter.toLowerCase()) || - r.description?.toLowerCase().includes(nombreFilter.toLowerCase()) || - r.repoName.toLowerCase().includes(nombreFilter.toLowerCase()) - ) + reposToShow = reposToShow.filter( + (r) => + r.user.toLowerCase().includes(nombreFilter.toLowerCase()) || + r.description?.toLowerCase().includes(nombreFilter.toLowerCase()) || + r.repoName.toLowerCase().includes(nombreFilter.toLowerCase()), + ); } - return reposToShow.sort(sortOption.sortFn) + return reposToShow.sort(sortOption.sortFn); }, [materiaSelected, repos, materias, fiubaOnly, sortOption, nombreFilter]); return ( @@ -112,7 +109,10 @@ const Repos = ({ materiaSelected, repos, materias }) => { > {repos.length ? (
- +
) : ( @@ -137,7 +137,9 @@ const SortFeature = ({ sortOption, setSortOption }) => { icon={sortOption.icon} onClick={() => { setSortOption( - sortOption.shortName === sortOptions[0].shortName ? sortOptions[1] : sortOptions[0] + sortOption.shortName === sortOptions[0].shortName + ? sortOptions[1] + : sortOptions[0], ); }} /> diff --git a/src/data/materias.json b/src/data/materias.json index 79e9c64..96f6b23 100644 --- a/src/data/materias.json +++ b/src/data/materias.json @@ -123,7 +123,7 @@ "7002": "Geometría Descriptiva", "7004": "Dibujo Topográfico", "7006": "Geografía Física y Geología", - "7007": "Calculo De Compensación", + "7007": "Calculo de Compensación", "7008": "Topografía I", "7009": "Topografía II", "7012": "Geodesia I", @@ -147,7 +147,7 @@ "7040": "Geología Aplicada", "7041": "Oceanografía Física", "7042": "Sistemas de Información Geográfica II", - "7043": "Topografía De Obra", + "7043": "Topografía de Obra", "7044": "Dibujo Topográfico II", "7099": "Trabajo Profesional de la Ingeniería en Agrimensura", "7101": "Introducción a la Economía y Organización de la Empresa", @@ -263,7 +263,7 @@ "7567": "Sistemas Automáticos de Diagnóstico y Detección Fallas I", "7568": "Sistemas de Soporte para Celdas Producción Flexible", "7569": "Sistemas Automáticos de Diagnóstico y Detección Fallas II", - "7570": "Sistemas de Programación no convencional de Robots", + "7570": "Sistemas de Programación no Convencional de Robots", "7571": "Seminario de Ingeniería de Informática I", "7572": "Seminario de Ingeniería de Informática II", "7573": "Arquitectura de Software", @@ -333,7 +333,7 @@ "7913": "Evaluación de Proyectos en Ingeniería en Petróleo", "7915": "Instalaciones de Producción", "7916": "Integridad y Mantenimiento de Instalaciones de Producción", - "7917": "Caracterización Y Modelado De Reservorios", + "7917": "Caracterización y Modelado de Reservorios", "7918": "Propiedades de la Roca y los Fluidos de Reservorios", "7919": "Ingeniería de Reservorios", "7920": "Ensayos de Pozo", @@ -341,7 +341,7 @@ "7922": "Simulación Numérica de Reservorios", "7923": "Industrialización del Petróleo y del Gas", "7924": "Tecnología y Sociedad", - "7926": "Energía Y Civilización", + "7926": "Energía y Civilización", "7999": "Trabajo Profesional de Ingeniería en Petróleo", "8101": "Análisis Matemático II", "8102": "Álgebra II", @@ -373,11 +373,11 @@ "8408": "Estabilidad IV", "8409": "Método de los Elementos Finitos", "8410": "Análisis Experimental de Tensiones", - "8411": "Seguridad estructural", - "8412": "Dinámica de las estructuras", - "8413": "Dinámica de las estructuras II", - "8414": "Análisis sísmico", - "8499": "Trabajo profesional de Ingeniería Civil", + "8411": "Seguridad Estructural", + "8412": "Dinámica de las Estructuras", + "8413": "Dinámica de las Estructuras II", + "8414": "Análisis Sísmico", + "8499": "Trabajo Profesional de Ingeniería Civil", "8500": "Tesis de Ingeniería Electricista", "8501": "Introducción a la Ingeniería Electricista", "8502": "Electrotecnia", @@ -419,7 +419,7 @@ "8538": "Electrotecnia General", "8539": "Electrotecnia P", "8540": "Máquinas e Instalaciones Eléctricas", - "8599": "Trabajo Profesional de Ingeniería Electricista ", + "8599": "Trabajo Profesional de Ingeniería Electricista", "8600": "Tesis de Ingeniería Electrónica", "8601": "Técnica Digital", "8602": "Introducción a la Ingeniería Electrónica", @@ -435,7 +435,7 @@ "8612": "Comunicación de Datos", "8614": "Introducción a Proyectos", "8615": "Robótica", - "8616": "Control Automático II", + "8616": "Control Automático II", "8617": "Control Automático III", "8618": "Control Industrial Distribuido", "8619": "Control Robusto", @@ -482,7 +482,7 @@ "8660": "Sistemas Biológicos", "8661": "Ingeniería Biomédica", "8662": "Equipamiento para Diagnóstico y Tratamiento Biomédico", - "8663": "Proc. y Análisis de Señales e Imágenes En Bioingeniería", + "8663": "Proc. y Análisis de Señales e Imágenes en Bioingeniería", "8664": "Compatibilidad Electromagnética", "8665": "Sistemas Embebidos", "8666": "Laboratorio de Microelectrónica", @@ -502,20 +502,20 @@ "8714": "Termodinámica", "8715": "Taller A", "8717": "Máquinas Térmicas", - "8801": "Construcción de carreteras", - "8802": "Diseño y operación de caminos", + "8801": "Construcción de Carreteras", + "8802": "Diseño y Operación de Caminos", "8803": "Puertos y Vías Navegables B", "8804": "Ferrocarriles B", "8805": "Aeropuertos B", "8806": "Planeamiento del Transporte", "8807": "Tránsito", "8808": "Ingeniería Territorial", - "8809": "Análisis de sistemas de transporte", + "8809": "Análisis de Sistemas de Transporte", "8810": "Caminos", "8811": "Aeropuertos A", "8812": "Ferrocarriles A", "8813": "Puertos y Vías Navegables A", - "8814": "Evaluación de proyectos", + "8814": "Evaluación de Proyectos", "8901": "Hidráulica General", "8903": "Centrales Hidráulicas", "8904": "Modelos Hidráulicos", @@ -524,7 +524,7 @@ "8907": "Construcciones Hidráulicas", "8908": "Gestión Ambiental de los Recursos Hídricos", "8909": "Hidráulica Aplicada", - "8910": "Aprovechamientos hidráulicos", + "8910": "Aprovechamientos Hidráulicos", "8911": "Ingeniería Sanitaria I", "8912": "Gestión Ambiental en Ingeniería Civil", "8913": "Hidráulica Fluvial", @@ -532,7 +532,7 @@ "8915": "Laboratorio de Hidráulica", "8916": "Ingeniería Sanitaria II", "8917": "Mecánica de Fluidos", - "8919": "Transporte De Fluidos Por Tuberías", + "8919": "Transporte de Fluidos por Tuberías", "9001": "Topografía y Geodesia", "9102": "Gerenciamiento y Organización de Obras Civiles", "9103": "Estadística Aplicada I", @@ -620,7 +620,7 @@ "9416": "Sistemas Estructurales", "9417": "Diseño Estructural", "9418": "Inspección y Ejecución de Estructuras de Hormigón", - "9419": "Materiales no tradicionales en la construcción", + "9419": "Materiales no Tradicionales en la Construcción", "9420": "Instalaciones en Obras Civiles II", "9501": "Computación", "9502": "Algoritmos y Programación III", @@ -631,7 +631,7 @@ "9507": "Teoría de Lenguajes de Programación", "9508": "Taller de Programación I", "9509": "Técnicas de Programación Concurrente I", - "9510": "Modelación numérica", + "9510": "Modelación Numérica", "9511": "Algoritmos y Programación I", "9512": "Algoritmos y Programación II", "9513": "Métodos Matemáticos y Numéricos", @@ -644,7 +644,7 @@ "9525": "Inteligencia Artificial", "9530": "Estándares de Calidad y Modelos de Referencia", "9535": "Evaluación e Implantación de Sistemas", - "9537": "Evaluación de Proyectos y Manejo de Riesgos", + "9537": "Evaluación de Proyectos y Manejo de Riesgos", "9548": "Lenguajes Formales", "9549": "Lenguajes de Programación", "9557": "Organización del Computador", @@ -668,34 +668,34 @@ "9704": "Seguridad Ambiental y del Trabajo", "9705": "Gestion Ambiental", "9708": "Gestión Ambiental para Ingeniería en Petróleo", - "CB002": "ÁLGEBRA LINEAL", - "CB100": "ALGORITMOS Y ESTRUCTURAS DE DATOS", - "CB001": "ANÁLISIS MATEMÁTICO II", - "CB005": "ANÁLISIS MATEMÁTICO III", - "TA061": "APRENDIZAJE AUTOMÁTICO", - "TB034": "ARQUITECTURA DE SOFTWARE", - "TA044": "BASE DE DATOS", - "TA047": "CIENCIA DE DATOS", - "TB032": "COMPUTACIÓN CUÁNTICA", - "TC018": "EMPRESAS DE BASE TECNOLÓGICA I", - "TC019": "EMPRESAS DE BASE TECNOLÓGICA II", - "CB024": "FÍSICA PARA INFORMÁTICA", - "TB021": "FUNDAMENTOS DE PROGRAMACIÓN", - "TC017": "GESTIÓN DEL DESARROLLO DE SISTEMAS INFORMÁTICOS", - "TA046": "INGENIERÍA DE SOFTWARE I", - "TA049": "INGENIERÍA DE SOFTWARE II", - "TB022": "INTRODUCCIÓN AL DESARROLLO DE SOFTWARE", - "CB051": "MODELACIÓN NUMÉRICA", - "TB023": "ORGANIZACIÓN DEL COMPUTADOR", - "TB025": "PARADIGMAS DE PROGRAMACIÓN", - "CB003": "PROBABILIDAD Y ESTADÍSTICA", - "TB026": "PROGRAMACIÓN CONCURRENTE", - "TA048": "REDES", - "TB028": "SIMULACIÓN", - "TA050": "SISTEMAS DISTRIBUIDOS I", - "TA043": "SISTEMAS OPERATIVOS", - "TA045": "TALLER DE PROGRAMACIÓN", - "TB024": "TEORÍA DE ALGORITMOS", - "TA053": "TRABAJO PROFESIONAL DE INGENIERÍA INFORMÁTICA", - "TA062": "APRENDIZAJE PROFUNDO" -} + "CB002": "Álgebra Lineal", + "CB100": "Algoritmos y Estructuras de Datos", + "CB001": "Análisis Matemático II", + "CB005": "Análisis Matemático III", + "TA061": "Aprendizaje Automático", + "TB034": "Arquitectura de Software", + "TA044": "Base de Datos", + "TA047": "Ciencia de Datos", + "TB032": "Computación Cuántica", + "TC018": "Empresas de Base Tecnológica I", + "TC019": "Empresas de Base Tecnológica II", + "CB024": "Física para Informática", + "TB021": "Fundamentos de Programación", + "TC017": "Gestión del Desarrollo de Sistemas Informáticos", + "TA046": "Ingeniería de Software I", + "TA049": "Ingeniería de Software II", + "TB022": "Introducción al Desarrollo de Software", + "CB051": "Modelación Numérica", + "TB023": "Organización del Computador", + "TB025": "Paradigmas de Programación", + "CB003": "Probabilidad y Estadística", + "TB026": "Programación Concurrente", + "TA048": "Redes", + "TB028": "Simulación", + "TA050": "Sistemas Distribuidos I", + "TA043": "Sistemas Operativos", + "TA045": "Taller de Programación", + "TB024": "Teoría de Algoritmos", + "TA053": "Trabajo Profesional de Ingeniería Informática", + "TA062": "Aprendizaje Profundo" +} \ No newline at end of file