From 288adcafcc643d0f721e10b643acb442c49e6c52 Mon Sep 17 00:00:00 2001 From: johnalexguerrero Date: Fri, 29 Nov 2024 17:44:45 -0500 Subject: [PATCH 001/104] Reto#47-Java --- .../java/JohnAlexGuerrero/.gitignore | 38 ++++++++ .../src/main/java/org/example/Main.java | 92 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/.gitignore create mode 100644 Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/src/main/java/org/example/Main.java diff --git a/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/.gitignore b/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/.gitignore new file mode 100644 index 0000000000..5ff6309b71 --- /dev/null +++ b/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/src/main/java/org/example/Main.java b/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/src/main/java/org/example/Main.java new file mode 100644 index 0000000000..c2918fc63b --- /dev/null +++ b/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/src/main/java/org/example/Main.java @@ -0,0 +1,92 @@ +package org.example; + +import java.util.Scanner; + +// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`, +// then press Enter. You can now see whitespace characters in your code. +public class Main { + // * - El calendario mostrará los días del 1 al 24 repartidos + // * en 6 columnas a modo de cuadrícula. + //- Cada cuadrícula correspondiente a un día tendrá un tamaño + // * de 4x3 caracteres, y sus bordes serán asteríscos. + //* Ejemplo de cuadrículas: + //* **** **** **** + //* *01* *02* *03* ... + //* **** **** **** + static int [][] calendar = { + {1,2,3,4,5,6}, {7,8,9,10,11,12}, {13,14,15,16,17,18}, {19,20,21,22,23,24} + }; + + public static void showCalendar(){ + for(int[] row: calendar){ + System.out.println("**** **** **** **** **** **** "); + for(int i: row){ + String day = (i < 10)? "0"+i : ""+i; + if(i == 0){ + day = "**"; + } + System.out.printf("*"+day+"* "); + } + System.out.println(); + } + System.out.println("**** **** **** **** **** **** "); + System.out.println(); + } + + public static boolean avalableDay(int d){ + for (int i = 0; i < calendar.length; i++){ + for (int j = 0; j < calendar[i].length; j++){ + if(calendar[i][j] == d){ + selectDayInCalendar(i,j); + return true; + } + } + } + return false; + } + + public static void selectDayInCalendar(int indexX, int indexY){ + // * cubierta de asteríscos (sin mostrar el día). + // * Ejemplo de selección del día 1 + // * **** **** **** + // * **** *02* *03* ... + // * **** **** **** + calendar[indexX][indexY] = 0; + } + + public static void main(String[] args) { + // Press Alt+Intro with your caret at the highlighted text to see how + Scanner scanner = new Scanner(System.in); + boolean flag = true; + + while(flag){ + showCalendar(); + //* - El usuario seleccioná qué día quiere descubrir. + System.out.println("select one day or exit: "); + String selectDay = scanner.nextLine(); + + if(selectDay.equals("exit")){ + flag = false; + } + + try{ + int selectedDay = Integer.parseInt(selectDay); + + //Si está sin descubrir, se le dirá que ha abierto ese día + if(avalableDay(selectedDay)){ + System.out.println("This day is avalable."); + }else{ + //* - Si se selecciona un número ya descubierto, se le notifica + // * al usuario. + System.out.println("Day is not avalable."); + } + + }catch(NumberFormatException ex){ + System.out.println("select on number."); + } + } + + // * y se mostrará de nuevo el calendario con esa cuadrícula + + } +} \ No newline at end of file From 72b44c9f5b45c9fd0bc11e0c328a55d551c0b763 Mon Sep 17 00:00:00 2001 From: johnalexguerrero Date: Mon, 2 Dec 2024 16:14:52 -0500 Subject: [PATCH 002/104] #46-Java --- .../java/JohnAlexGuerrero/.gitignore | 38 ++++++ .../src/main/java/org/example/Main.java | 113 ++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/.gitignore create mode 100644 Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/src/main/java/org/example/Main.java diff --git a/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/.gitignore b/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/.gitignore new file mode 100644 index 0000000000..5ff6309b71 --- /dev/null +++ b/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/src/main/java/org/example/Main.java b/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/src/main/java/org/example/Main.java new file mode 100644 index 0000000000..823c966d58 --- /dev/null +++ b/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/src/main/java/org/example/Main.java @@ -0,0 +1,113 @@ +package org.example; + +import java.util.HashSet; +import java.util.Objects; + +// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`, +// then press Enter. You can now see whitespace characters in your code. +public class Main { + public static void main(String[] args) { + SocialNetwork socialnetwork = new SocialNetwork(); + + //- Registrar un usuario por defecto con nombre e identificador único. + socialnetwork.registerUser("u123", "alexander guerrero"); + socialnetwork.registerUser("u456", "sandra estacio"); + socialnetwork.registerUser("u467", "carolina maigual"); + socialnetwork.registerUser("u897", "mileidy cruz"); + socialnetwork.registerUser("u230", "daniel botina"); + socialnetwork.registerUser("u239", "diego botina"); + socialnetwork.registerUser("u348", "gloria maigual"); + socialnetwork.registerUser("u438", "teresa maigual"); + socialnetwork.registerUser("u489", "alejandra rojas"); + + //- Seleccionar un usuario + User u1 = socialnetwork.getUser("u489"); + //- Un usuario puede seguir/dejar de seguir a otro. + u1.followUser("u348"); + u1.followUser("u467"); + u1.followUser("u897"); + + //- Mostrar usuarios + for (User user : socialnetwork.getUsers()) { + System.out.println(user.toString()); + } + } +} + +class SocialNetwork{ + private static HashSet users; + public SocialNetwork() { + users = new HashSet<>(); + } + public void registerUser(String id, String name){ + users.add(new User(id, name)); + } + public User getUser(String id){ + for(User user: users){ + if(user.getId().equals(id)){ + return user; + } + } + return null; + } + public void unfollowUser(){} + public HashSet getUsers() { + return users; + } +} + +class User{ + private String id; + private String name; + private HashSet followers; + private HashSet following; + public void followUser(String followIdUser){ + followers.add(followIdUser); + } + + public User(String id, String name) { + this.id = id; + this.name = name; + this.followers = new HashSet(); + this.following = new HashSet(); + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public HashSet getFollowers() { + return followers; + } + + public HashSet getFollowing() { + return following; + } + + @Override + public String toString() { + return "User{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + ", followers=" + followers + + ", following=" + following + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(followers, user.followers) && Objects.equals(following, user.following); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, followers, following); + } +} From c59e8886b1c02156ebaf08711ac0539712af26c5 Mon Sep 17 00:00:00 2001 From: johnalexguerrero Date: Fri, 6 Dec 2024 10:09:13 -0500 Subject: [PATCH 003/104] Reto#48-java --- .../java/JohnAlexGuerrero.java" | 237 ++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 "Roadmap/48 - \303\201RBOL DE NAVIDAD/java/JohnAlexGuerrero.java" diff --git "a/Roadmap/48 - \303\201RBOL DE NAVIDAD/java/JohnAlexGuerrero.java" "b/Roadmap/48 - \303\201RBOL DE NAVIDAD/java/JohnAlexGuerrero.java" new file mode 100644 index 0000000000..7685d4c5d9 --- /dev/null +++ "b/Roadmap/48 - \303\201RBOL DE NAVIDAD/java/JohnAlexGuerrero.java" @@ -0,0 +1,237 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + */ + +package com.mycompany.christmastree; + +import java.util.Scanner; + +/** + * + * @author JOHN + */ +public class ChristmasTree { + static class Tree{ + private String treeDraw; + private int column; + private int row; + private boolean star; + private boolean onLight; + private int balls; + private int lights; + + public Tree(int heigth, boolean star) { + this.setColumn(heigth); + this.setRow(heigth); + this.star = star; + this.balls = 0; + this.lights = 0; + this.treeDraw = ""; + } + + public void setRow(int h){ + this.row = h; + } + + public void setColumn(int h){ + for(int i=0; i 0 && (i+1)%2 == 0 ){ + tree += "o"; + amountBall -= 1; + }else if(amountLight > 0 && (i+1)%3 == 0 && this.isOnLight()){ + tree += "+"; + amountLight -= 1; + }else{ + tree += "*"; + } + } + } + } + } + + //base + for(int k=0; k Date: Fri, 6 Dec 2024 10:32:26 -0500 Subject: [PATCH 004/104] Reto#47-java --- .../java/JohnAlexGuerrero/.gitignore | 38 -------- .../src/main/java/org/example/Main.java | 92 ------------------- 2 files changed, 130 deletions(-) delete mode 100644 Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/.gitignore delete mode 100644 Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/src/main/java/org/example/Main.java diff --git a/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/.gitignore b/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/.gitignore deleted file mode 100644 index 5ff6309b71..0000000000 --- a/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### IntelliJ IDEA ### -.idea/modules.xml -.idea/jarRepositories.xml -.idea/compiler.xml -.idea/libraries/ -*.iws -*.iml -*.ipr - -### Eclipse ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ - -### Mac OS ### -.DS_Store \ No newline at end of file diff --git a/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/src/main/java/org/example/Main.java b/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/src/main/java/org/example/Main.java deleted file mode 100644 index c2918fc63b..0000000000 --- a/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero/src/main/java/org/example/Main.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.example; - -import java.util.Scanner; - -// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`, -// then press Enter. You can now see whitespace characters in your code. -public class Main { - // * - El calendario mostrará los días del 1 al 24 repartidos - // * en 6 columnas a modo de cuadrícula. - //- Cada cuadrícula correspondiente a un día tendrá un tamaño - // * de 4x3 caracteres, y sus bordes serán asteríscos. - //* Ejemplo de cuadrículas: - //* **** **** **** - //* *01* *02* *03* ... - //* **** **** **** - static int [][] calendar = { - {1,2,3,4,5,6}, {7,8,9,10,11,12}, {13,14,15,16,17,18}, {19,20,21,22,23,24} - }; - - public static void showCalendar(){ - for(int[] row: calendar){ - System.out.println("**** **** **** **** **** **** "); - for(int i: row){ - String day = (i < 10)? "0"+i : ""+i; - if(i == 0){ - day = "**"; - } - System.out.printf("*"+day+"* "); - } - System.out.println(); - } - System.out.println("**** **** **** **** **** **** "); - System.out.println(); - } - - public static boolean avalableDay(int d){ - for (int i = 0; i < calendar.length; i++){ - for (int j = 0; j < calendar[i].length; j++){ - if(calendar[i][j] == d){ - selectDayInCalendar(i,j); - return true; - } - } - } - return false; - } - - public static void selectDayInCalendar(int indexX, int indexY){ - // * cubierta de asteríscos (sin mostrar el día). - // * Ejemplo de selección del día 1 - // * **** **** **** - // * **** *02* *03* ... - // * **** **** **** - calendar[indexX][indexY] = 0; - } - - public static void main(String[] args) { - // Press Alt+Intro with your caret at the highlighted text to see how - Scanner scanner = new Scanner(System.in); - boolean flag = true; - - while(flag){ - showCalendar(); - //* - El usuario seleccioná qué día quiere descubrir. - System.out.println("select one day or exit: "); - String selectDay = scanner.nextLine(); - - if(selectDay.equals("exit")){ - flag = false; - } - - try{ - int selectedDay = Integer.parseInt(selectDay); - - //Si está sin descubrir, se le dirá que ha abierto ese día - if(avalableDay(selectedDay)){ - System.out.println("This day is avalable."); - }else{ - //* - Si se selecciona un número ya descubierto, se le notifica - // * al usuario. - System.out.println("Day is not avalable."); - } - - }catch(NumberFormatException ex){ - System.out.println("select on number."); - } - } - - // * y se mostrará de nuevo el calendario con esa cuadrícula - - } -} \ No newline at end of file From 4941085b4d0f76c44e7d436eb266466afa6acac8 Mon Sep 17 00:00:00 2001 From: johnalexguerrero Date: Fri, 6 Dec 2024 10:43:48 -0500 Subject: [PATCH 005/104] Reto#46-java --- .../java/JohnAlexGuerrero.java | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero.java diff --git a/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero.java b/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero.java new file mode 100644 index 0000000000..823c966d58 --- /dev/null +++ b/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero.java @@ -0,0 +1,113 @@ +package org.example; + +import java.util.HashSet; +import java.util.Objects; + +// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`, +// then press Enter. You can now see whitespace characters in your code. +public class Main { + public static void main(String[] args) { + SocialNetwork socialnetwork = new SocialNetwork(); + + //- Registrar un usuario por defecto con nombre e identificador único. + socialnetwork.registerUser("u123", "alexander guerrero"); + socialnetwork.registerUser("u456", "sandra estacio"); + socialnetwork.registerUser("u467", "carolina maigual"); + socialnetwork.registerUser("u897", "mileidy cruz"); + socialnetwork.registerUser("u230", "daniel botina"); + socialnetwork.registerUser("u239", "diego botina"); + socialnetwork.registerUser("u348", "gloria maigual"); + socialnetwork.registerUser("u438", "teresa maigual"); + socialnetwork.registerUser("u489", "alejandra rojas"); + + //- Seleccionar un usuario + User u1 = socialnetwork.getUser("u489"); + //- Un usuario puede seguir/dejar de seguir a otro. + u1.followUser("u348"); + u1.followUser("u467"); + u1.followUser("u897"); + + //- Mostrar usuarios + for (User user : socialnetwork.getUsers()) { + System.out.println(user.toString()); + } + } +} + +class SocialNetwork{ + private static HashSet users; + public SocialNetwork() { + users = new HashSet<>(); + } + public void registerUser(String id, String name){ + users.add(new User(id, name)); + } + public User getUser(String id){ + for(User user: users){ + if(user.getId().equals(id)){ + return user; + } + } + return null; + } + public void unfollowUser(){} + public HashSet getUsers() { + return users; + } +} + +class User{ + private String id; + private String name; + private HashSet followers; + private HashSet following; + public void followUser(String followIdUser){ + followers.add(followIdUser); + } + + public User(String id, String name) { + this.id = id; + this.name = name; + this.followers = new HashSet(); + this.following = new HashSet(); + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public HashSet getFollowers() { + return followers; + } + + public HashSet getFollowing() { + return following; + } + + @Override + public String toString() { + return "User{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + ", followers=" + followers + + ", following=" + following + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(followers, user.followers) && Objects.equals(following, user.following); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, followers, following); + } +} From b878df743156baf3952e15d6ef19def23122f2ed Mon Sep 17 00:00:00 2001 From: johnalexguerrero Date: Wed, 11 Dec 2024 21:20:07 -0500 Subject: [PATCH 006/104] Reto#49 - Java --- .../java/JohnAlexGuerrero.java" | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 "Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/java/JohnAlexGuerrero.java" diff --git "a/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/java/JohnAlexGuerrero.java" "b/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/java/JohnAlexGuerrero.java" new file mode 100644 index 0000000000..afa1f743ba --- /dev/null +++ "b/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/java/JohnAlexGuerrero.java" @@ -0,0 +1,142 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + */ + +package com.mycompany.codesecretchristmas; + +import java.util.HashSet; +import java.util.Scanner; +import java.util.Set; + +/** + * + * @author JOHN + * * EJERCICIO: + * Papá Noel tiene que comenzar a repartir los regalos... + * ¡Pero ha olvidado el código secreto de apertura del almacén! + * + * Crea un programa donde introducir códigos y obtener pistas. + * + * Código: + * x El código es una combinación de letras y números aleatorios + * de longitud 4. (Letras: de la A a la C, Números: del 1 al 3) + * x No hay repetidos. + * x Se genera de manera aleatoria al iniciar el programa. + * + * Usuario: + * x Dispone de 10 intentos para acertarlo. + * x En cada turno deberá escribir un código de 4 caracteres, y + * el programa le indicará para cada uno lo siguiente: + * - Correcto: Si el caracter está en la posición correcta. + * - Presente: Si el caracter existe, pero esa no es su posición. + * - Incorrecto: Si el caracter no existe en el código secreto. + * - Deben controlarse errores de longitud y caracteres soportados. + * + * Finalización: + * - Papa Noel gana si descrifra el código antes de 10 intentos. + * - Pierde si no lo logra, ya que no podría entregar los regalos. + + */ + +public class CodeSecretChristmas { + static int attemps = 10; + + public static String[] getLetters(){ + String[] letters = {"A","B","C","1","2","3"}; + + return letters; + } + + public static String generatedKey(){ + Set key = new HashSet<>(); + String[] ls = getLetters(); + + while(key.size() < 4){ + int number = (int) (Math.random()* ls.length); + key.add(ls[number]); + } + String s = String.join("", key); + + return s; + } + + + public static String validKey(String keyGenerated, char character, int index){ + String flap = ""; + if(keyGenerated.charAt(index) == character && keyGenerated.indexOf(""+character) == index){ + flap = "c"; + }else if(keyGenerated.contains(""+character)){ + flap = "p"; + }else{ + flap = "i"; + } + return flap; + } + + public static boolean isValid(String code){ + boolean f = false; + for(int x=0; x < getLetters().length; x++){ + if(code.contains(getLetters()[x])){ + f = true; + }else{ + f = false; + } + } + + return f; + } + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + String code; + String keyGenerated = generatedKey(); + + System.out.println("Almacen de Santa"); + + while(attemps < 11){ + + System.out.println("Ingresa codigo de seguridad: "); + code = scanner.nextLine().toUpperCase(); + + while(!isValid(code)){ + System.out.println("Ingresa codigo de seguridad (A,B,C y 1, 2, 3): "); + code = scanner.nextLine().toUpperCase(); + System.out.println("Hay uno o mas caracter(es) que no son permitidos"); + System.out.printf("son permitidos: "); + for(String k: getLetters()){ + System.out.printf(k+", "); + + } + System.out.println(""); + } + + + if(code.length() == 4){ + for(int i=0; i<4; i++){ + switch(validKey(keyGenerated,code.charAt(i), i)){ + case "c": + System.out.println("Correcto: "+code.charAt(i)); + break; + case "p": + System.out.println("Presente: "+code.charAt(i)); + break; + case "i": + System.out.println(code.charAt(i)+ " No concuerda con el codigo generado."); + break; + } + } + }else{ + System.out.println("el codigo debe contener solo 4 caracteres"); + System.out.println("codigo: "+code.toLowerCase()); + } + + if(keyGenerated.equals(""+code)){ + System.out.println("Acceso concedido clave: "+keyGenerated); + }else{ + attemps -= 1; + System.out.println("Te quedan #"+attemps+" intentos"); + } + } + + } +} From 3ca49974239fd60543ebd5a4a24ac98a52269b36 Mon Sep 17 00:00:00 2001 From: johnalexguerrero Date: Wed, 11 Dec 2024 21:28:19 -0500 Subject: [PATCH 007/104] Reto#47 -java --- .../java/JohnAlexGuerrero.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero.java diff --git a/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero.java b/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero.java new file mode 100644 index 0000000000..c2918fc63b --- /dev/null +++ b/Roadmap/47 - CALENDARIO DE ADVIENTO/java/JohnAlexGuerrero.java @@ -0,0 +1,92 @@ +package org.example; + +import java.util.Scanner; + +// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`, +// then press Enter. You can now see whitespace characters in your code. +public class Main { + // * - El calendario mostrará los días del 1 al 24 repartidos + // * en 6 columnas a modo de cuadrícula. + //- Cada cuadrícula correspondiente a un día tendrá un tamaño + // * de 4x3 caracteres, y sus bordes serán asteríscos. + //* Ejemplo de cuadrículas: + //* **** **** **** + //* *01* *02* *03* ... + //* **** **** **** + static int [][] calendar = { + {1,2,3,4,5,6}, {7,8,9,10,11,12}, {13,14,15,16,17,18}, {19,20,21,22,23,24} + }; + + public static void showCalendar(){ + for(int[] row: calendar){ + System.out.println("**** **** **** **** **** **** "); + for(int i: row){ + String day = (i < 10)? "0"+i : ""+i; + if(i == 0){ + day = "**"; + } + System.out.printf("*"+day+"* "); + } + System.out.println(); + } + System.out.println("**** **** **** **** **** **** "); + System.out.println(); + } + + public static boolean avalableDay(int d){ + for (int i = 0; i < calendar.length; i++){ + for (int j = 0; j < calendar[i].length; j++){ + if(calendar[i][j] == d){ + selectDayInCalendar(i,j); + return true; + } + } + } + return false; + } + + public static void selectDayInCalendar(int indexX, int indexY){ + // * cubierta de asteríscos (sin mostrar el día). + // * Ejemplo de selección del día 1 + // * **** **** **** + // * **** *02* *03* ... + // * **** **** **** + calendar[indexX][indexY] = 0; + } + + public static void main(String[] args) { + // Press Alt+Intro with your caret at the highlighted text to see how + Scanner scanner = new Scanner(System.in); + boolean flag = true; + + while(flag){ + showCalendar(); + //* - El usuario seleccioná qué día quiere descubrir. + System.out.println("select one day or exit: "); + String selectDay = scanner.nextLine(); + + if(selectDay.equals("exit")){ + flag = false; + } + + try{ + int selectedDay = Integer.parseInt(selectDay); + + //Si está sin descubrir, se le dirá que ha abierto ese día + if(avalableDay(selectedDay)){ + System.out.println("This day is avalable."); + }else{ + //* - Si se selecciona un número ya descubierto, se le notifica + // * al usuario. + System.out.println("Day is not avalable."); + } + + }catch(NumberFormatException ex){ + System.out.println("select on number."); + } + } + + // * y se mostrará de nuevo el calendario con esa cuadrícula + + } +} \ No newline at end of file From 1cb3e586c8f23ed67dad11fb1b05b14541203bf2 Mon Sep 17 00:00:00 2001 From: Miguel Portillo Date: Wed, 18 Dec 2024 09:30:51 -0500 Subject: [PATCH 008/104] -Go --- Roadmap/10 - EXCEPCIONES/go/MiguelP-Dev.go | 199 +++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 Roadmap/10 - EXCEPCIONES/go/MiguelP-Dev.go diff --git a/Roadmap/10 - EXCEPCIONES/go/MiguelP-Dev.go b/Roadmap/10 - EXCEPCIONES/go/MiguelP-Dev.go new file mode 100644 index 0000000000..3d88ed686e --- /dev/null +++ b/Roadmap/10 - EXCEPCIONES/go/MiguelP-Dev.go @@ -0,0 +1,199 @@ +package main + +import ( + "errors" + "fmt" + "strconv" +) + +/* +En golang no existen las excepciones, pero si existen las funciones de manejo de errores. + +Los errores son parte importante de golang porque se decidió desde su diseño inicial, tabajar con ellos +en vez de excepciones porque estas en la mayoria de los casos no son controladas por el desarrollador + +La idea es que los errores sean controlados apenas se presenten, esta es la razón de que las funciones +devuelvan multiples valores. Usualmente las funciones como ultimo argumento devuelven un error, para que +podamos validar si la función ejecutada genera un error y lo podamos controlar. + +Controlar los errores e golang es muy cómodo, además saves siempre de donde viene el error si lo haces +correctamente. Para controlar los errores y darle más personalización existe el paquete "errors" o +la función 'errorf' del paquete "fmt", además go, cuenta con funciones como "panic y recover". + +En golang usamos el ok para comprobar errores (Usamos el operador unario con el ok). +Ok es una variable booleana usada comunmente para verificar si una operación se realizó con éxito, +premitiendo un manejo más preciso y seguro de los errores y condiciones. +*/ + +// val Variable para guardar el valor obtenido de la conversión en la función +var val = strToInt("24") + +// found Variable que se redefinirá su valor durate los ejercicios y ejemplos +var found string + +// stringToInt Ejemplo 1 de manejo de errores(Simple) +func strToInt(s string) int { + num, err := strconv.Atoi(s) + if err != nil { + fmt.Println("Error: informacion no válida.", err) + return -1 + } + return num +} + +// errNotFound es una variable que almacena un mensaje personalizado para controlar un error. +var errNotFound = errors.New("Not Found.") + +// fastFood mapa de comida rápida +var fastFood = map[int]string{ + 24: "Hamburguesa", 22: "Perro Caliente", 23: "Arroz Chino", 25: "Pizza", +} + +// search funcion de busqueda por un mapa. +func search(key string) (string, error) { + num, err := strconv.Atoi(key) + if err != nil { + return "", fmt.Errorf("strconv.Atoi: %w", err) + } + + value, err := okVariable(num) + if err != nil { + return "", err + } + return value, nil +} + +// okVariable Usando el ok y el operador unario y se llama desde search() +func okVariable(num int) (string, error) { + value, ok := fastFood[num] + if !ok { + return "", fmt.Errorf("OkVariable(): Valor inexistente") + } + return value, nil +} + +// animals mapa de animales +var animals = map[int]string{ + 1: "Gato", 2: "Perro", 3: "León", +} + +// search funcion de busqueda por un mapa. +func searchAnimals(key string) (string, error) { + number, err := strconv.Atoi(key) + if err != nil { + return "", fmt.Errorf("strconv.Atoi(): %w", err) + } + value, err := findAnimal(number) + if err != nil { + return "", fmt.Errorf("findAnimal(): %w", err) + } + return value, nil +} + +func findAnimal(num int) (string, error) { + number, ok := animals[num] + if !ok { + return "", errNotFound + } + return number, nil +} + +/* +En estos ejercicios simple no se alcanza a ver la complejidad, por tanto es simple controlarlos así, pero para casos más complejos +hay que llevar un correcto seguimineto de estos errores,sobretodo cuando hay un anidamiento de procedimientos, +para eso es muy util el paquete format(fmt) con su función errorf, donde aparte +de poner texto de error personalizado puedo entregar específicamente desde que funcion o método viene el error. +*/ + +var number1 = 12 +var number2 = 0 + +// division Funcion de division por cero +func division(n1, n2 int) (int, error) { + if n2 == 0 { + return -1, errNotFound + } + result := n1 / n2 + return result, nil + +} + +// Otra opcion que tiene golang para manejar errores sin se que se detenga la aplicación es con panic y recover +// Panic se usa para generar un panico tras un error y recover para recuperarse de su error y continuar +// con las operaciones dejando un mensaje de error. + +// extraFunction: Es la función creada para el ejercicio extra de la roadmap +func extraFunction(n string, n2 int) (int, error) { + // Con una funcion anónima en una cola de ejecucion con difer, verificamos si se produce un panic y nos recuperamos de él + defer func() { + if r := recover(); r != nil { + fmt.Println("Me recuperé del panic.") + } + }() + + str, err := strconv.Atoi(n) + if err != nil { + return 0, fmt.Errorf("strconv.Atoi(): El parámetro no es válido para operar: %w", err) + } + // Validamos si el divisor es igual a cero + validateZero(n2) + + fmt.Printf("No hubo errores, Resultado de dividir %v entre %v: ", str, n2) + return str / n2, nil +} + +func validateZero(n int) { + if n == 0 { + panic("No es posible dividir por cero") + } +} + +func main() { + // Primer ejemplo: simple + fmt.Printf("Value: %d Tipo de datos: %T\n", val, val) + + // Segúndo ejemplo: manejo con paquete errors (Personalizado.) + found, err := search("22") + if err != nil { + fmt.Println("search(): ", err) + return + } + fmt.Println(found) + + // Tercer ejemplo: comprobación ok con unario. (Uso sin search para buscar el valor directamente) + found, err = okVariable(val) + if err != nil { + fmt.Println("okVariable():", err) + return + } + fmt.Println(found) + + // Conprobación espesífica de errores + found, err = searchAnimals("4") + if errors.Is(err, errNotFound) { + fmt.Println("Pudimos controlar el error.") + return + } + if err != nil { + fmt.Println("searchAnimals(): ", err) + return + } + fmt.Println(found) + + // Divición por cero + div, err := division(number1, number2) + if err == errNotFound { + fmt.Println("No es posible dividir por 0") + return + } + fmt.Printf("Resultado de dividir %d entre %d, es: %d\n", number1, number2, div) + + // Extra + divisionExtra, err := extraFunction("12", 2) + if err != nil { + fmt.Printf("Mensaje de error: %s, Tipo: %T\n", err, err) + return + } + fmt.Println(divisionExtra) + fmt.Println("La Ejecución finalizó.") +} From 5dd406066f25b28c0e6e10e587817a8f07c0d8ba Mon Sep 17 00:00:00 2001 From: kenysdev Date: Wed, 18 Dec 2024 12:15:34 -0600 Subject: [PATCH 009/104] 00 - js - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO --- .../javascript/kenysdev.js | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/javascript/kenysdev.js diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/javascript/kenysdev.js b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/javascript/kenysdev.js new file mode 100644 index 0000000000..de309dd47e --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/javascript/kenysdev.js @@ -0,0 +1,43 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +___________________________________________________ +00 SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO +--------------------------------------------------- + * - Crea un comentario en el código y coloca la URL del sitio web oficial del + * lenguaje de programación que has seleccionado. + * - Representa las diferentes sintaxis que existen de crear comentarios + * en el lenguaje (en una línea, varias...). + * - Crea una variable (y una constante si el lenguaje lo soporta). + * - Crea variables representando todos los tipos de datos primitivos + * del lenguaje (cadenas de texto, enteros, booleanos...). + * - Imprime por terminal el texto: "¡Hola, [y el nombre de tu lenguaje]!" +*/ + +// https://www.ecma-international.org/publications-and-standards/standards/ecma-262/ +// https://developer.mozilla.org/es/docs/Web/JavaScript + +/** + * Documentación + * @param {string} name - Usuario + * @returns {string} Un saludo. + */ +function hello(name) { + return `Hola, ${name}!`; +} + +let x = 5 // Variable numérica. +const PI = 3.14159; // una constante. + +// Tipos de datos primitivos (https://developer.mozilla.org/es/docs/Web/JavaScript/Data_structures#valores_primitivos). +let isAdult = true; // Tipo Boolean +let emptyValue = null; // Tipo Null +let undefinedVariable; // Tipo Undefined +let price = 9.99; // Tipo Number +let name = "Kenys"; // Tipo String +let hugeNumber = 9007199254740991n; // Tipo BigInt +let sym = Symbol("id"); // Tipo Symbol + +console.log(typeof price); +console.log("¡Hola, JavaScript!"); From 042ab4581deb696d0df796bdf2941e13c66d0987 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Wed, 18 Dec 2024 12:16:32 -0600 Subject: [PATCH 010/104] 01 - js - OPERADORES Y ESTRUCTURAS DE CONTROL --- .../javascript/kenysdev.js | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/kenysdev.js diff --git a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/kenysdev.js b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/kenysdev.js new file mode 100644 index 0000000000..57b67ada89 --- /dev/null +++ b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/kenysdev.js @@ -0,0 +1,186 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +01 OPERADORES Y ESTRUCTURAS DE CONTROL +--------------------------------------- + * - Crea ejemplos utilizando todos los tipos de operadores de tu lenguaje: + * Aritméticos, lógicos, de comparación, asignación, identidad, pertenencia, bits... + * (Ten en cuenta que cada lenguaje puede poseer unos diferentes) + * - Utilizando las operaciones con operadores que tú quieras, crea ejemplos + * que representen todos los tipos de estructuras de control que existan + * en tu lenguaje: + * Condicionales, iterativas, excepciones... + * - Debes hacer print por consola del resultado de todos los ejemplos. +*/ + +// Tipos de operadores +// https://developer.mozilla.org/es/docs/Learn/Getting_started_with_the_web/JavaScript_basics#operadores + +// concatena +let greeting = "Hola " + "mundo!"; +console.log(greeting) // "Hola mundo!" + +// _______________________ +// Operadores aritmeticos: +let sumResult = 6 + 9; +console.log(sumResult); // 15 + +let subtractResult = 9 - 3; +console.log(subtractResult); // 6 + +let multiplicationResult = 8 * 2; +console.log(multiplicationResult); // 16 + +let divisionResult = 9 / 3; +console.log(divisionResult); // 3 + +let remainder = 20 % 7; +console.log(remainder); // 6 + +let power = 2 ** 3; +console.log(power); // 8 + +// _______________________ +// Operador de asignación: +let myString = 'Ken'; +console.log(myString); // "Bob" + +let b = 3; +b += 2; // Aplicable a todos los operadores aritméticos. +console.log(b) // 5 + +// _______________________ +// Operadores de Comparación: +let equal = 5 == 5; // Igual a +console.log(`5 == 5 -> ${equal}`); // true + +let notEqual = 5 != 5; // Diferente de +console.log(`5 != 5 -> ${notEqual}`); // false + +let lessThan = 4 < 5; // Menor que +console.log(`4 < 5 -> ${lessThan}`); // true + +let greaterThan = 4 > 5; // Mayor que +console.log(`4 > 5 -> ${greaterThan}`); // false + +let lessThanOrEqual = 4 <= 5; // Menor o igual +console.log(`4 <= 5 -> ${lessThanOrEqual}`); // true + +let greaterThanOrEqual = 4 >= 5; // Mayor o igual +console.log(`4 >= 5 -> ${greaterThanOrEqual}`); // false + +// Estructuras de control +// _______________________ +// condicinal: +// https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/conditionals + +if (5 == 5) { // Aplicable a todos los operadores de Comparación. + console.log("si lo es."); +} else { + console.log("No lo es."); +} + +// Con operadores lógicos: +if (5 == 5 && 7 < 10) { // Equivalente a 'and' + console.log("si lo son."); +} + +if (5 == 5 || 7 < 10) { // Equivalente a 'or' + console.log("Uno de los dos es 'true'."); +} + +if (!(5 == 6)) { // Equivalente a 'not' + console.log("No lo es."); +} + +// Declaraciones con switch +let day = 1; +switch (day) { + case 1: + console.log("Lunes"); + break; + case 2: + console.log("Martes"); + break; + + default: + console.log("Día no válido"); +} + +// Operador Ternario +let age = 17; +let msg = (age >= 18) ? "Eres mayor de edad" : "Eres menor de edad"; +console.log(msg); + +// _______________________ +// Bucles +// https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/Looping_code + +// For Loop +for (let i = 1; i <= 5; i++) { + console.log(i); // 1, 2, 3, 4, 5 +} + +// For...of Loop +const fruits = ["Apple", "Banana", "Cherry"]; +for (const fruit of fruits) { + console.log(fruit); // Apple, Banana, Cherry +} + +// Acceder mediante el índice. +const colors = ["Red", "Green", "Blue"]; +for (let i = 0; i < colors.length; i++) { + console.log(colors[i]); // Red, Green, Blue +} + +// While Loop +let count = 1; +while (count <= 3) { + console.log(count); // 1, 2, 3 + count++; +} + +// Do...While Loop +let num = 1; +do { + console.log(num); // 1, 2, 3 + num++; +} while (num <= 3); + +// Break Statement +for (let i = 1; i <= 5; i++) { + if (i === 3) break; // detenerse + console.log(i); // 1, 2 +} + +// Continue Statement +for (let i = 1; i <= 5; i++) { + if (i === 3) continue; // omitir + console.log(i); // 1, 2, 4, 5 + } + +// _______________________ +// Manejo de excepciones +// https://developer.mozilla.org/es/docs/Web/JavaScript/Guide/Control_flow_and_error_handling#expresiones_de_manejo_de_excepciones + +try { + throw "Error"; // Lanza una excepción + } catch (e) { + console.error(e); // Maneja la excepción + } finally { + console.log("Este bloque siempre se ejecuta."); +} + +/* +EJERCICIO: +* Crea un programa que imprima por consola todos los números comprendidos +* entre 10 y 55 (incluidos), pares, y que no son ni el 16 ni múltiplos de 3. +*/ + +for (let num = 10; num < 56; num++) { + if (num % 2 === 0 && num !== 16 && num % 3 !== 0) { + console.log(num); + } +} From 5413b4e757d5676f681c422abc129d12a012bd23 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Wed, 18 Dec 2024 12:17:11 -0600 Subject: [PATCH 011/104] 02 - js - FUNCIONES Y ALCANCE --- .../javascript/kenysdev.js | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 Roadmap/02 - FUNCIONES Y ALCANCE/javascript/kenysdev.js diff --git a/Roadmap/02 - FUNCIONES Y ALCANCE/javascript/kenysdev.js b/Roadmap/02 - FUNCIONES Y ALCANCE/javascript/kenysdev.js new file mode 100644 index 0000000000..4d392049f0 --- /dev/null +++ b/Roadmap/02 - FUNCIONES Y ALCANCE/javascript/kenysdev.js @@ -0,0 +1,115 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +02 FUNCIONES Y ALCANCE +--------------------------------------- +* - Crea ejemplos de funciones básicas que representen las diferentes + * posibilidades del lenguaje: + * Sin parámetros ni retorno, con uno o varios parámetros, con retorno... + * - Comprueba si puedes crear funciones dentro de funciones. + * - Utiliza algún ejemplo de funciones ya creadas en el lenguaje. + * - Pon a prueba el concepto de variable LOCAL y GLOBAL. + * - Debes hacer print por consola del resultado de todos los ejemplos. + * (y tener en cuenta que cada lenguaje puede poseer más o menos posibilidades) +*/ + +// ________________________ +// Funciones +// https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Functions + +// Función Básica +function aMessage() { + console.log("Texto"); +} + +aMessage(); // Llamar + +// Función con Parámetro +function displayMessage(msgText) { + console.log(msgText); +} + +displayMessage("¡Hola mundo!"); + +// Función con Parámetros Opcionales +function sumNums(a, b=5) { + console.log(a + b) +} + +sumNums(2) +sumNums(2, 2) + +// ________________________ +// Función con retorno +// https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/Return_values + +function squared(num) { + return num * num; +} + +let result = squared(4); +console.log(result); // 16 + +// Retorna múltiples datos +function calculateRectangleProperties(width, height) { + return { + area: width * height, + perimeter: 2 * (width + height) + }; +} + +const rectangle = calculateRectangleProperties(5, 10); +console.log(`Área: ${rectangle.area}`); // Área: 50 +console.log(`Perímetro: ${rectangle.perimeter}`); // Perímetro: 30 + +// ________________________ +// Funciones anidadas +function sumOfSquares(a, b) { + function square(x) { + return x * x; + } + return square(a) + square(b); +} + + console.log(sumOfSquares(2, 3)); // 13 + +// ________________________ +// ejmp de funcion incorporada +const maxNumber = Math.max(10, 20, 5, 30); +console.log(maxNumber); // 30 + +/* +EJERCICIO: +* Crea una función que reciba dos parámetros de tipo cadena de texto y retorne un número. + * - La función imprime todos los números del 1 al 100. Teniendo en cuenta que: + * - Si el número es múltiplo de 3, muestra la cadena de texto del primer parámetro. + * - Si el número es múltiplo de 5, muestra la cadena de texto del segundo parámetro. + * - Si el número es múltiplo de 3 y de 5, muestra las dos cadenas de texto concatenadas. + * - La función retorna el número de veces que se ha impreso el número en lugar de los textos. + * + * Presta especial atención a la sintaxis que debes utilizar en cada uno de los casos. + * Cada lenguaje sigue una convenciones que debes de respetar para que el código se entienda. +*/ + +function exs(str1, str2) { + nPrintsNums = 0; + + for (let num = 1; num <= 100; num++) { + if (num % 3 === 0 && num % 5 === 0) { + console.log(str1 + str2); + } else if (num % 3 === 0) { + console.log(str1); + } else if (num % 5 === 0) { + console.log(str2); + } else { + nPrintsNums += 1; + console.log(num); + } + } + return nPrintsNums; +} + +pNums = exs(" múltiplo de 3", " múltiplo de 5") +console.log("Número de veces que se imprimió un número: " + pNums); From b522a6ac882dfd1784a947d04252f781018b3374 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Wed, 18 Dec 2024 12:17:54 -0600 Subject: [PATCH 012/104] 03 - js - ESTRUCTURAS DE DATOS --- .../javascript/kenysdev.js | 275 ++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 Roadmap/03 - ESTRUCTURAS DE DATOS/javascript/kenysdev.js diff --git a/Roadmap/03 - ESTRUCTURAS DE DATOS/javascript/kenysdev.js b/Roadmap/03 - ESTRUCTURAS DE DATOS/javascript/kenysdev.js new file mode 100644 index 0000000000..d18cb24abd --- /dev/null +++ b/Roadmap/03 - ESTRUCTURAS DE DATOS/javascript/kenysdev.js @@ -0,0 +1,275 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +03 ESTRUCTURAS DE DATOS +--------------------------------------- + * EJERCICIO: + * - Muestra ejemplos de creación de todas las estructuras soportadas por defecto en tu lenguaje. + * - Utiliza operaciones de inserción, borrado, actualización y ordenación. + * + * DIFICULTAD EXTRA (opcional): + * Crea una agenda de contactos por terminal. + * - Debes implementar funcionalidades de búsqueda, inserción, actualización y eliminación de contactos. + * - Cada contacto debe tener un nombre y un número de teléfono. + * - El programa solicita en primer lugar cuál es la operación que se quiere realizar, y a continuación + * los datos necesarios para llevarla a cabo. + * - El programa no puede dejar introducir números de teléfono no númericos y con más de 11 dígitos. + * (o el número de dígitos que quieras) + * - También se debe proponer una operación de finalización del programa. +*/ + +// ________________________________________________________ +// 1. Arrays(Listas Ordenadas y Flexibles) +console.log("Arreglos"); + +let numeros = [3, 2, 1]; +let palabras = ["Hola", "Mundo"]; + +// Acceder: +console.log(numeros[0]); // 3 + +// Modificar: +palabras[1] = "Ben"; + +// Ordenación: +numeros.sort((a, b) => a - b); // Ordenar de menor a mayor + +// Iteración: +for (let i = 0; i < numeros.length; i++) { + console.log(`Índice ${i}: ${numeros[i]}`); +} + +// ________________________________________________________ +// 2. Sets(Colecciones de Valores Únicos) +console.log("\nConjuntos"); + +let miConjunto = new Set(); +let otroConjunto = new Set([2, 3, 4]); + +// Inserción: +miConjunto.add(1); +miConjunto.add(2); + +// Buscar: +console.log(otroConjunto.has(3)); // true + +// Eliminación: +miConjunto.delete(2); + +// Verificación: +console.log(miConjunto.has(1)); // true + +// Operaciones: +miConjunto = new Set([...miConjunto, ...otroConjunto]); // Unión + +// Iteración: +otroConjunto.forEach(elemento => { + console.log(elemento); +}); + +// ________________________________________________________ +// 3. Maps(Pares Clave-Valor con Claves de Cualquier Tipo) +console.log("\nMaps"); + +let map = new Map(); + +// Agregar pares clave-valor: +map.set("nombre", "Zoe"); +map.set("edad", 27); +map.set("activo", true); + +// Acceder +console.log(map.get("nombre")); // "Zoe" +console.log(map.get("edad")); // 27 + +// Verificar +console.log(map.has("activo")); // true + +// Obtener el tamaño del Map: +console.log(map.size); // 3 + +// Modificar +map.set("edad", 28); +console.log(map.get("edad")); // 28 + +// Comprobar +console.log(map.has("activo")); // false + +// Iteración +map.forEach((valor, clave) => { + console.log(`Clave: ${clave}, Valor: ${valor}`); +}); + +for (let [clave, valor] of map) { + console.log(`Clave: ${clave}, Valor: ${valor}`); +} + +// Eliminar un par clave-valor: +map.delete("activo"); + +// Eliminar todos los elementos del Map: +map.clear(); + +// ________________________________________________________ +// 4. Objects(Pares Clave-Valor para Estructuras Complejas) +console.log("Objetos"); + +let persona = { + nombre: "Zoe", + edad: 27, + activo: true +}; + +// Acceder +console.log(persona.nombre); // "Zoe" +console.log(persona["edad"]); // 27 + +// Modificar +persona.edad = 28; +console.log(persona.edad); // 28 + +// Agregar +persona.pais = "España"; +console.log(persona.pais); // "España" + +// ________________________________________________________ +// DIFICULTAD EXTRA + +const readline = require('readline'); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +let myAgenda = new Map(); + +const msg_home = ` +Agenda de contactos +╔═══════════════════════════╗ +║ 1. Nuevo 4. Editar ║ +║ 2. Buscar 5. Eliminar ║ +║ 3. Lista 6. Salir ║ +╚═══════════════════════════╝ +`; + +const Create = () => { + rl.question("Escribe el nombre: ", (name) => { + if (name.length < 1) { + Create(); + } else if (name === "6") { + console.log("Cancelado"); + Agenda(); + } else if (myAgenda.has(name)) { + console.log("El nombre ya existe."); + Create(); + } else { + rl.question("Escribe el número: ", (number) => { + if (isNaN(number) || number.length === 0 || number.length > 11) { + console.log("Número no válido."); + Create(); + } else { + myAgenda.set(name, number); + console.log("Guardado"); + Agenda(); + } + }); + } + }); +}; + +const Search = () => { + rl.question("Escribe el nombre: ", (name) => { + if (name === "6") { + console.log("Cancelado"); + Agenda(); + } else if (myAgenda.has(name)) { + console.log(myAgenda.get(name)); + Agenda(); + } else { + console.log("Contacto no encontrado."); + Agenda(); + } + }); +}; + +const List = () => { + console.log("Lista de contactos:"); + const sortedAgenda = new Map([...myAgenda].sort()); + for (const [key, value] of sortedAgenda) { + console.log(`${key}: ${value}`); + } + Agenda(); +}; + +const Edit = () => { + rl.question("Escribe el nombre: ", (name) => { + if (name === "6") { + console.log("Cancelado"); + Agenda(); + } else if (myAgenda.has(name)) { + rl.question("Escribe el nuevo número: ", (newNumber) => { + if (isNaN(newNumber) || newNumber.length === 0 || newNumber.length > 11) { + console.log("Número no válido."); + Edit(); + } else { + myAgenda.set(name, newNumber); + console.log("Contacto editado"); + Agenda(); + } + }); + } else { + console.log("Contacto no encontrado."); + Agenda(); + } + }); +}; + +const Delete = () => { + rl.question("Escribe el nombre: ", (name) => { + if (name === "6") { + console.log("Cancelado"); + Agenda(); + } else if (myAgenda.has(name)) { + myAgenda.delete(name); + console.log("Contacto eliminado"); + Agenda(); + } else { + console.log("Contacto no encontrado."); + Agenda(); + } + }); +}; + +const Agenda = () => { + rl.question("Número de opción: ", (option) => { + switch (option) { + case "1": + Create(); + break; + case "2": + Search(); + break; + case "3": + List(); + break; + case "4": + Edit(); + break; + case "5": + Delete(); + break; + case "6": + console.log("Adiós"); + rl.close(); + break; + default: + console.log("Elija una opción entre 1 y 6."); + Agenda(); + break; + } + }); +}; + +Agenda(); From 6f81bc1924a6b245d9a0560b894d192f9368500b Mon Sep 17 00:00:00 2001 From: kenysdev Date: Wed, 18 Dec 2024 12:18:27 -0600 Subject: [PATCH 013/104] 04 - js - CADENAS DE CARACTERES --- .../javascript/kenysdev.js | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 Roadmap/04 - CADENAS DE CARACTERES/javascript/kenysdev.js diff --git a/Roadmap/04 - CADENAS DE CARACTERES/javascript/kenysdev.js b/Roadmap/04 - CADENAS DE CARACTERES/javascript/kenysdev.js new file mode 100644 index 0000000000..cd1b199da6 --- /dev/null +++ b/Roadmap/04 - CADENAS DE CARACTERES/javascript/kenysdev.js @@ -0,0 +1,123 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#04 CADENAS DE CARACTERES +--------------------------------------- + * EJERCICIO: + * Muestra ejemplos de todas las operaciones que puedes realizar con cadenas de caracteres + * en tu lenguaje. Algunas de esas operaciones podrían ser (busca todas las que puedas): + * - Acceso a caracteres específicos, subcadenas, longitud, concatenación, repetición, + * recorrido, conversión a mayúsculas y minúsculas, reemplazo, división, unión, + * interpolación, verificación... + * + * DIFICULTAD EXTRA (opcional): + * Crea un programa que analice dos palabras diferentes y realice comprobaciones + * para descubrir si son: + * - Palíndromos + * - Anagramas + * - Isogramas +*/ + +// ________________________________________________________ +// Declaraciones de cadenas +const str1 = "Esto es una cadena"; // Comillas dobles +const str2 = 'Esto es una cadena'; // Comillas simples +console.log(typeof str2); // "string" + +// Salto de línea: \n +const str4 = "Primer linea\nSegunda linea"; +console.log(str4); + +// ASCII y Unicode +console.log("\u00F1"); // Unicode para 'ñ' + +// Texto multilínea +console.log(`Primer linea +Segunda linea +Tercer linea`); + +// Longitud de la cadena +const s = "abcdef"; +console.log(s.length); // 6 + +// Acceso a caracteres individuales +console.log(s[1]); // "b" + +// Obtener porciones específicas de una cadena +console.log(s.slice(1, 4)); // "bcd" +console.log(s.slice(3)); // "def" + +// Revertir una cadena +console.log("abcd".split('').reverse().join('')); + +// ________________________________________________________ +// Formateo de cadenas: + +// Concatenación +const s1 = "hola"; +const s2 = "javascript"; +console.log(`${s1}, ${s2}`); + +// Interpolación +const a = 5, b = 10; +console.log(`Los números son ${a} y ${b}`); + +// Replicación o repetición de cadenas +const greeting = "Hola "; +console.log(greeting.repeat(3)); + +// Valor numérico que representa un carácter y viceversa +console.log(String.fromCharCode(241)); // "ñ" +console.log("ñ".charCodeAt(0)); // 241 + +// Ordenar caracteres de una cadena +console.log("cdba".split('').sort().join('')); + +// ________________________________________________________ +// Métodos: + +const txt = "Hello, javascript!"; +console.log(txt.includes("javascript")); // true +console.log(txt.indexOf("javascript")); // 7 +console.log(txt.replace("javascript", "world")); +console.log("mi cadena".charAt(0).toUpperCase() + "mi cadena".slice(1)); +console.log("MI CADENA".toLowerCase()); +console.log("mI cAdEnA".split('').map(c => c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase()).join('')); +console.log("mi cadena".toUpperCase()); +console.log("mi cadena".split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ')); + +const txt2 = "Cantando y llorando."; +console.log((txt2.match(/ando/g) || []).length); // 2 +console.log("aeiou1234".match(/^[a-z0-9]+$/i) !== null); // true +console.log("abcdefg".match(/^[a-z]+$/i) !== null); // true +console.log("12345".match(/^[0-9]+$/) !== null); // true +console.log("abc".toLowerCase() === "abc"); // true +console.log("ABC".toUpperCase() === "ABC"); // true +console.log(/^\s+$/.test(" ")); // true +console.log(" abc ".trim()); // "abc" +console.log("123".padStart(5, '0')); // "00123" +console.log(["1", "2", "3"].join(" y ")); // "1 y 2 y 3" +console.log("a,b,c".split(",")); // ["a", "b", "c"] + +// ________________________________________________________ +// DIFICULTAD EXTRA + +function analyze(str1, str2) { + const esPalindromo = str => str === str.split('').reverse().join(''); + const esAnagrama = (str1, str2) => str1.split('').sort().join('') === str2.split('').sort().join(''); + const esIsograma = str => new Set(str).size === str.length; + + console.log(`\n "${str1}" es un palíndromo?: ${esPalindromo(str1)} + "${str2}" es un palíndromo?: ${esPalindromo(str2)} + + "${str1}" es un anagrama de "${str2}"?: ${esAnagrama(str1, str2)} + + "${str1}" es un isograma?: ${esIsograma(str1)} + "${str2}" es un isograma?: ${esIsograma(str2)}\n`); +} + +analyze("reconocer", "vida"); +analyze("notas", "santo"); +analyze("héroe", "radar"); From 6f0f0e061344edfd3e030ee5dc43599b2704e541 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Wed, 18 Dec 2024 12:19:00 -0600 Subject: [PATCH 014/104] 05 - js - VALOR Y REFERENCIA --- .../javascript/kenysdev.js | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 Roadmap/05 - VALOR Y REFERENCIA/javascript/kenysdev.js diff --git a/Roadmap/05 - VALOR Y REFERENCIA/javascript/kenysdev.js b/Roadmap/05 - VALOR Y REFERENCIA/javascript/kenysdev.js new file mode 100644 index 0000000000..71878cf2ee --- /dev/null +++ b/Roadmap/05 - VALOR Y REFERENCIA/javascript/kenysdev.js @@ -0,0 +1,125 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#05 VALOR Y REFERENCIA +--------------------------------------- + * EJERCICIO: + * - Muestra ejemplos de asignación de variables "por valor" y "por referencia", según + * su tipo de dato. + * - Muestra ejemplos de funciones con variables que se les pasan "por valor" y + * "por referencia", y cómo se comportan en cada caso en el momento de ser modificadas. + * (Entender estos conceptos es algo esencial en la gran mayoría de lenguajes) + * + * DIFICULTAD EXTRA (opcional): + * Crea dos programas que reciban dos parámetros (cada uno) definidos como variables anteriormente. + * - Cada programa recibe, en un caso, dos parámetros por valor, y en otro caso, por referencia. + * Estos parámetros los intercambia entre ellos en su interior, los retorna, y su retorno + * se asigna a dos variables diferentes a las originales. A continuación, imprime el valor de las + * variables originales y las nuevas, comprobando que se ha invertido su valor en las segundas. + * Comprueba también que se ha conservado el valor original en las primeras. +*/ + +// ________________________________________________________ +// 1. Asignación de variables "por valor": + +// Inicialización: +let int1 = 111; +let boo1 = false; +let str1 = "Ben"; + +// Asignación: +let int2 = int1; +let boo2 = boo1; +let str2 = str1; + +// Cambio: +int1 = 777; +boo1 = true; +str1 = "Bob"; + +// Las segundas variables no fueron afectadas. +console.log(int2, boo2, str2); // 111 false "Ben" + +// Ejemplo en una función: +function fun_v(en_int, en_boo, en_str) { + // Cambio: + en_int = 333; + en_boo = false; + en_str = "Ken"; +} + +// Paso por valor +fun_v(int1, boo1, str1); + +// No afectadas por los cambios en la función. +console.log(int1, boo1, str1); // 777 true "Bob" + +// ________________________________________________________ +// 2. Asignación de variables "por referencia": + +// Inicialización: +let lis1 = [444, true, "Dan"]; +let set1 = new Set([444, true, "Dan"]); +let dic1 = { name: "Dan" }; + +// Asignación: +let lis2 = lis1; +let set2 = set1; +let dic2 = dic1; + +// Cambio: +lis1.splice(0, 3, 888, false, "Zoe"); +set1.delete(444); +set1.delete("Dan"); +dic1.name = "Zoe"; + +// Las variables fueron afectadas por el cambio. +console.log(lis2); +console.log([...set2]); +console.log(dic2); + +// Ejemplo en una función: +function fun_r(en_lis, en_set, en_dic) { + // Cambio: + en_lis.splice(0, 3, 333, true, "Jay"); + en_set.add(333); + en_set.add("Jay"); + en_dic.name = "Jay"; +} + +// Paso por referencia +fun_r(lis2, set2, dic2); + +// Fueron afectadas por los cambios en la función. +console.log(lis2); +console.log([...set2]); +console.log(dic2); + +// ________________________________________________________ +// 3. DIFICULTAD EXTRA + +let s1 = "Ben"; +let s2 = "Zoe"; +let l1 = [12, 21]; +let l2 = ["Ben", "Zoe"]; + +console.log(`Pre-Intercambio:\n${s1} - ${s2}\n${l1} - ${l2}`); + +function by_value(str1, str2) { + let temp = str1; + str1 = str2; + str2 = temp; + return [str1, str2]; +} + +function by_reference(list1, list2) { + return [list2.slice(), list1.slice()]; +} + +const [new_s1, new_s2] = by_value(s1, s2); +const [new_l1, new_l2] = by_reference(l1, l2); + +console.log(`Originales:\n${s1} - ${s2}\n${l1} - ${l2}`); +console.log(`Nuevas:\n${new_s1} - ${new_s2}\n${new_l1} - ${new_l2}`); From efb5d052aaa4ed01c838b15fc1247e8c20b110bb Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 19 Dec 2024 10:22:06 -0600 Subject: [PATCH 015/104] 06 - js - RECURSIVIDAD --- .../06 - RECURSIVIDAD/javascript/kenysdev.js | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Roadmap/06 - RECURSIVIDAD/javascript/kenysdev.js diff --git a/Roadmap/06 - RECURSIVIDAD/javascript/kenysdev.js b/Roadmap/06 - RECURSIVIDAD/javascript/kenysdev.js new file mode 100644 index 0000000000..4af5426208 --- /dev/null +++ b/Roadmap/06 - RECURSIVIDAD/javascript/kenysdev.js @@ -0,0 +1,75 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#06 RECURSIVIDAD +--------------------------------------- + * EJERCICIO: + * Entiende el concepto de recursividad creando una función recursiva que imprima + * números del 100 al 0. + * + * DIFICULTAD EXTRA (opcional): + * Utiliza el concepto de recursividad para: + * - Calcular el factorial de un número concreto (la función recibe ese número). + * - Calcular el valor de un elemento concreto (según su posición) en la + * sucesión de Fibonacci (la función recibe la posición). +*/ + +// ________________________________________________________ +function num(n) { + console.log(n); + // Base case + if (n > 0) { + num(n - 1); + } +} +num(100); + +// ________________________________________________________ +// DIFICULTAD EXTRA + +// Calcular el factorial de un número concreto +// 4! = 4 * 3 * 2 * 1 = 24 +function factorial(n) { + if (n !== 0) { + return n * factorial(n - 1); + } else { + return 1; + } + /* explicación: + factorial(4) + | = 24 + return 4 * factorial(3) -> (4 * 6) + | = 6 + return 3 * factorial(2) -> (3 * 2) + | = 2 + return 2 * factorial(1) -> (2 * 1) + | = 1 + return 1 * factorial(0) -> (1 * 1) + | = return 1 -> base case + */ +} + +// Calcular el valor de un elemento concreto (según su posición) en la sucesión de Fibonacci. +// n : |0|1|2|3|4|5|6|.. +// fb: |0|1|1|2|3|5|8|.. +// |+|=^ |+|=^ .. +function fibonacci(n) { + if (n <= 1) { + return n; + } else { + return fibonacci(n - 1) + fibonacci(n - 2); + /* explicación: + return 3 + fibonacci(3) / \ fibonacci(2) + / \ =2 + / \ =1 + fibonacci(2) + fibonacci(1) fibonacci(1) + fibonacci(0) -> base case + / \ =1 + fibonacci(1) + fibonacci(0) -> base case + */ + } +} + +console.log(`Factorial de 4: \n${factorial(4)}`); +console.log(`Valor según posición 4 en Fibonacci:\n${fibonacci(4)}`); From f15335905d719e0ddf7cd8184174a27e758c88e1 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 19 Dec 2024 10:22:57 -0600 Subject: [PATCH 016/104] 07 - js - PILAS Y COLAS --- .../07 - PILAS Y COLAS/javascript/kenysdev.js | 311 ++++++++++++++++++ 1 file changed, 311 insertions(+) create mode 100644 Roadmap/07 - PILAS Y COLAS/javascript/kenysdev.js diff --git a/Roadmap/07 - PILAS Y COLAS/javascript/kenysdev.js b/Roadmap/07 - PILAS Y COLAS/javascript/kenysdev.js new file mode 100644 index 0000000000..07c822c54e --- /dev/null +++ b/Roadmap/07 - PILAS Y COLAS/javascript/kenysdev.js @@ -0,0 +1,311 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#07 PILAS Y COLAS +--------------------------------------- + * EJERCICIO: + * Implementa los mecanismos de introducción y recuperación de elementos propios de las + * pilas (stacks - LIFO) y las colas (queue - FIFO) utilizando una estructura de array + * o lista (dependiendo de las posibilidades de tu lenguaje). + * + * DIFICULTAD EXTRA (opcional): + * - Utilizando la implementación de pila y cadenas de texto, simula el mecanismo Forward/atrás + * de un navegador web. Crea un programa en el que puedas navegar a una página o indicarle + * que te quieres desplazar Forward o atrás, mostrando en cada caso el nombre de la web. + * Las palabras "Forward", "atrás" desencadenan esta acción, el resto se interpreta como + * el nombre de una nueva web. + * - Utilizando la implementación de cola y cadenas de texto, simula el mecanismo de una + * impresora compartida que recibe documentos y los imprime cuando así se le indica. + * La palabra "imprimir" imprime un elemento de la cola, el resto de palabras se + * interpretan como nombres de documentos. +*/ + +// ________________________________________________________ +// Pilas (Stack - LIFO): +// - Estructura de datos que sigue el principio LIFO (Last In, First Out). +// - El último elemento agregado es el primero en ser retirado. + +class Stack { + constructor() { + this.elements = []; + } + + // Total de elementos + get length() { + return this.elements.length; + } + + // Verificar si la pila está vacía + isEmpty() { + return this.length === 0; + } + + // Agregar un elemento + push(item) { + this.elements.push(item); + } + + // Agregar múltiples elementos + pushBatch(items) { + this.elements.push(...items); + } + + // Eliminar y obtener el elemento superior + pop() { + return this.isEmpty() ? null : this.elements.pop(); + } + + // Obtener el elemento superior sin eliminarlo + peek() { + return this.isEmpty() ? null : this.elements[this.elements.length - 1]; + } + + // Obtener la pila como tupla + toArray() { + return [...this.elements].reverse(); + } + + // Vaciar la pila + clear() { + this.elements = []; + } +} + +// ________________________________________________________ +// Ejercicio: Historial de navegación + +const MsgNav = ` + Historial de navegación: + ------------------------------------------------- + Usar: "<" para página anterior. + ">" para página Forward. + "h" Ver historial completo. + "x" para salir. + Escribir web para agregar: + -------------------------------------------------`; + +function NavHistory() { + const BackHistory = new Stack(); + const forwardHistory = new Stack(); + const history = new Stack(); + history.push("Inicio"); + + const ShowHistory = () => { + console.log(MsgNav); + ShowStatus(history.peek()); + SelectAction(); + }; + + const ShowStatus = (url) => { + console.log(`(${BackHistory.length}) <- Atrás <- [Actual: ${url}] -> Forward -> (${forwardHistory.length})`); + }; + + const Back = () => { + if (!BackHistory.isEmpty()) { + forwardHistory.push(history.pop()); + history.push(BackHistory.pop()); + ShowStatus(history.peek()); + } else { + console.log("No hay página previa."); + } + SelectAction(); + }; + + const Forward = () => { + if (!forwardHistory.isEmpty()) { + BackHistory.push(history.pop()); + history.push(forwardHistory.pop()); + ShowStatus(history.peek()); + } else { + console.log("No hay página siguiente."); + } + SelectAction(); + }; + + const NewWeb = (url) => { + BackHistory.push(history.peek()); + forwardHistory.clear(); + history.push(url); + ShowStatus(history.peek()); + SelectAction(); + }; + + const PrintHistory = () => { + const historial = history.toArray(); + console.log(historial.length ? historial.join(" -> ") : "Historial vacío."); + SelectAction(); + }; + + const SelectAction = () => { + console.log("____________"); + rl.question("Acción: ", (option) => { + switch (option) { + case "<": + Back(); + break; + case ">": + Forward(); + break; + case "h": + PrintHistory(); + break; + case "x": + rl.close; + main(); + return; + default: + NewWeb(option); + } + }); + }; + + ShowHistory(); +} + +// ________________________________________________________ +// Colas (Queue - FIFO): +// - Estructura de datos que sigue el principio FIFO (First In, First Out). +// - El primer elemento agregado es el primero en ser retirado. +class Queue { + constructor() { + this.elements = []; + } + + // Total de elementos + get length() { + return this.elements.length; + } + + // Verificar si la cola está vacía + isEmpty() { + return this.length === 0; + } + + // Agregar un elemento + enqueue(item) { + this.elements.push(item); + } + + // Agregar múltiples elementos + enqueueAll(items) { + this.elements.push(...items); + } + + // Eliminar y devolver el primer elemento + dequeue() { + return this.isEmpty() ? null : this.elements.shift(); + } + + // Obtener el primer elemento sin eliminarlo + peek() { + return this.isEmpty() ? null : this.elements[0]; + } + + // Obtener la cola como tupla + toArray() { + return [...this.elements]; + } + + // Vaciar la cola + clear() { + this.elements = []; + } +} + +// ________________________________________________________ +// Ejercicio: Simulador de impresora + +const mensajeImpresora = ` + ------------------------------------------------ + Usar: "p" Imprimir. + "l" Ver documentos pendientes. + "x" para salir. + Escribir nombre de documento para enviar a cola: + ------------------------------------------------`; + +function QueuePrinter() { + const docQueue = new Queue(); + docQueue.enqueueAll(["a.pdf", "b.txt", "c.docx"]); + + const PrintDoc = () => { + if (!docQueue.isEmpty()) { + console.log(`${docQueue.dequeue()} -> ha sido impreso.`); + console.log(`${docQueue.length} -> archivos faltantes.`); + } else { + console.log("No hay archivos."); + } + SelectAction(); + }; + + const DocPending = () => { + const documentos = docQueue.toArray(); + console.log(documentos.length ? documentos.join(", ") : "No hay archivos."); + SelectAction(); + }; + + const AddDoc = (doc) => { + docQueue.enqueue(doc); + console.log("Archivo agregado a la cola de impresión."); + SelectAction(); + }; + + const SelectAction = () => { + console.log("____________"); + rl.question("Acción: ", (option) => { + switch (option) { + case "p": + PrintDoc(); + break; + case "l": + DocPending(); + break; + case "x": + rl.close; + main(); + return + default: + AddDoc(option); + } + }); + }; + + console.log(mensajeImpresora); + SelectAction(); +} + +// ________________________________________________________ +const readline = require('readline'); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +const MenuHome = ` + ---------------------------------- + Usar: "1" para simulador de navegador. + "2" para simulador de impresora. + "Otra tecla" para salir. + ----------------------------------`; + +function main() { + console.log(MenuHome); + rl.question("Seleccionar: ", (option) => { + switch (option) { + case "1": + NavHistory(); + break; + case "2": + QueuePrinter(); + break; + default: + console.log("Adiós"); + rl.close(); + process.exit(); + } + }); +} + +main(); From 44cfade6ede9af5d845452e04f5746e6a7077d3e Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 19 Dec 2024 10:23:38 -0600 Subject: [PATCH 017/104] 08 - js - CLASES --- Roadmap/08 - CLASES/javascript/kenysdev.js | 166 +++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 Roadmap/08 - CLASES/javascript/kenysdev.js diff --git a/Roadmap/08 - CLASES/javascript/kenysdev.js b/Roadmap/08 - CLASES/javascript/kenysdev.js new file mode 100644 index 0000000000..4411d7f4d5 --- /dev/null +++ b/Roadmap/08 - CLASES/javascript/kenysdev.js @@ -0,0 +1,166 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#08 CLASES +--------------------------------------- +* EJERCICIO: + * Explora el concepto de clase y crea un ejemplo que implemente un inicializador, + * atributos y una función que los imprima (teniendo en cuenta las posibilidades + * de tu lenguaje). + * Una vez implementada, créala, establece sus parámetros, modifícalos e imprímelos + * utilizando su función. + * + * DIFICULTAD EXTRA (opcional): + * Implementa dos clases que representen las estructuras de Pila y Cola (estudiadas + * en el ejercicio número 7 de la ruta de estudio) + * - Deben poder inicializarse y disponer de operaciones para añadir, eliminar, + * retornar el número de elementos e imprimir todo su contenido. +*/ + +// ________________________________________________________ +class Employee { + // Atributos de clase + static baseSalary = 25000; + static vacationDays = 15; + + // Constructor + constructor(name, hireDate) { + this.name = name; + this.hireDate = hireDate; + } + + // Métodos de instancia + edit(name, hireDate) { + this.name = name; + this.hireDate = hireDate; + } + + println() { + console.log(`Name: ${this.name} - Hire date: ${this.hireDate}`); + } +} + +// Crear objeto +const employeeInstance = new Employee("Ben", "2024-02-01"); + +// Acceder a los atributos +console.log(` +Name: ${employeeInstance.name} +Hire date: ${employeeInstance.hireDate} +Base salary: ${Employee.baseSalary} +Vacation days: ${Employee.vacationDays} +`); + +// Utilizar métodos +employeeInstance.edit("Ben edit", "2024-03-01"); +employeeInstance.println(); + +// ________________________________________________________ +// DIFICULTAD EXTRA +// __________________________ +// Clase Stack (Pila - LIFO): +class Stack { + constructor() { + this.elements = []; + } + + get length() { // Total elementos + return this.elements.length; + } + + isEmpty() { // Es vacía + return this.length === 0; + } + + push(item) { // Agregar elemento + this.elements.push(item); + } + + pushBatch(items) { // Agregar múltiples + this.elements.push(...items); + } + + popGet() { // Eliminar y obtener + return this.isEmpty() ? null : this.elements.pop(); + } + + getTop() { // Obtener sin eliminar + return this.isEmpty() ? null : this.elements[this.elements.length - 1]; + } + + toArray() { // Retornar pila como tupla + return [...this.elements].reverse(); + } + + clear() { // Vaciar pila + this.elements = []; + } +} + +// __________________________ +// Clase Queue (Cola - FIFO): +class Queue { + constructor() { + this.elements = []; + } + + get length() { // Total elementos + return this.elements.length; + } + + isEmpty() { // Es vacía + return this.length === 0; + } + + enqueue(item) { // Agregar elemento + this.elements.push(item); + } + + enqueueAll(items) { // Agregar múltiples + this.elements.push(...items); + } + + dequeue() { // Eliminar y devolver + return this.isEmpty() ? null : this.elements.shift(); + } + + peek() { // Obtener sin eliminar + return this.isEmpty() ? null : this.elements[0]; + } + + toArray() { // Retornar cola como tupla + return [...this.elements]; + } + + clear() { // Vaciar cola + this.elements = []; + } +} + +// __________________________ +console.log("\nUso de pila:"); +const mystack = new Stack(); +mystack.push("Zoe"); +mystack.pushBatch(["Ben", "Dan"]); +if (!mystack.isEmpty()) { + console.log(mystack.popGet()); +} +console.log(`Número de elementos: ${mystack.length}`); +for (const name of mystack.toArray()) { + console.log(name); +} + +// __________________________ +console.log("\nUso de cola:"); +const myqueue = new Queue(); +myqueue.enqueue("Zoe"); +myqueue.enqueueAll(["Ben", "Dan"]); +if (!myqueue.isEmpty()) { + console.log(myqueue.dequeue()); +} +console.log(`Número de elementos: ${myqueue.length}`); +for (const name of myqueue.toArray()) { + console.log(name); +} From 5b791400bb99bb5a014ed9405b74168646db2712 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 19 Dec 2024 10:25:01 -0600 Subject: [PATCH 018/104] 09 - js - HERENCIA --- Roadmap/09 - HERENCIA/javascript/kenysdev.js | 126 +++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 Roadmap/09 - HERENCIA/javascript/kenysdev.js diff --git a/Roadmap/09 - HERENCIA/javascript/kenysdev.js b/Roadmap/09 - HERENCIA/javascript/kenysdev.js new file mode 100644 index 0000000000..bc582eb6f7 --- /dev/null +++ b/Roadmap/09 - HERENCIA/javascript/kenysdev.js @@ -0,0 +1,126 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#9 HERENCIA Y POLIMORFISMO +--------------------------------------- + * EJERCICIO: + * Explora el concepto de herencia según tu lenguaje. Crea un ejemplo que + * implemente una superclase Animal y un par de subclases Perro y Gato, + * junto con una función que sirva para imprimir el sonido que emite cada Animal. + * + * DIFICULTAD EXTRA (opcional): + * Implementa la jerarquía de una empresa de desarrollo formada por Empleados que + * pueden ser Gerentes, Gerentes de Proyectos o Programadores. + * Cada empleado tiene un identificador y un nombre. + * Dependiendo de su labor, tienen propiedades y funciones exclusivas de su + * actividad, y almacenan los empleados a su cargo. +*/ + +// ________________________________________________________ +// Clase base Animal +class Animal { + constructor(name, sound) { + this.name = name; + this.sound = sound; + } + + makeSound() { + console.log(`${this.name} hace: ${this.sound}`); + } +} + +// Subclases +class Dog extends Animal { + constructor(name) { + super(name, "Woof"); + } +} + +class Cat extends Animal { + constructor(name) { + super(name, "Meow"); + } +} + +// Crear instancias y llamar a sus métodos +const dog = new Dog("Max"); +const cat = new Cat("Milo"); +dog.makeSound(); +cat.makeSound(); + +// ________________________________________________________ +// DIFICULTAD EXTRA + +// Jerarquía de empleados +class Employee { + static employees = []; + + constructor(identifier, tasks, staff = new Set()) { + this.identifier = identifier; + this.tasks = tasks; + this.staff = staff; + } + + add(names) { + names.forEach(name => Employee.employees.push({ identifier: this.identifier, name })); + } + + println() { + Employee.employees + .filter(employee => employee.identifier === this.identifier) + .forEach(employee => console.log(`${employee.name} -> ${this.identifier}`)); + } + + functions() { + console.log(`\nFunciones de ${this.identifier}`); + this.tasks.forEach(task => console.log(task)); + console.log("--------------------"); + } + + subordinates() { + console.log(`\nSubordinados de un ${this.identifier}`); + Employee.employees + .filter(employee => this.staff.has(employee.identifier)) + .forEach(employee => console.log(`${employee.name} -> ${employee.identifier}`)); + console.log("--------------------"); + } +} + +class Manager extends Employee { + constructor() { + super("Gerente", ["- Supervisión", "- Toma de decisiones"], new Set(["Gerente de Proyecto", "Programador"])); + } +} + +class ProjectManager extends Employee { + constructor() { + super("Gerente de Proyecto", ["- Planificación", "- Coordinación de proyectos"], new Set(["Programador"])); + } +} + +class Programmer extends Employee { + constructor() { + super("Programador", ["- Desarrollo", "- Mantenimiento de código"], new Set()); + } +} + +// __________________________ +const manager = new Manager(); +const projectManager = new ProjectManager(); +const programmer = new Programmer(); + +manager.add(["Ben", "Dan"]); +projectManager.add(["Ray", "Joe"]); +programmer.add(["Leo", "Sam", "Zoe", "Ana"]); + +manager.functions(); +projectManager.functions(); +programmer.functions(); + +manager.subordinates(); +projectManager.subordinates(); + +manager.println(); +projectManager.println(); From 9f2f38cf464de5864db3bab2036c2a777446375e Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 19 Dec 2024 10:25:49 -0600 Subject: [PATCH 019/104] 10 - js - EXCEPCIONES --- .../10 - EXCEPCIONES/javascript/kenysdev.js | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 Roadmap/10 - EXCEPCIONES/javascript/kenysdev.js diff --git a/Roadmap/10 - EXCEPCIONES/javascript/kenysdev.js b/Roadmap/10 - EXCEPCIONES/javascript/kenysdev.js new file mode 100644 index 0000000000..f883e79756 --- /dev/null +++ b/Roadmap/10 - EXCEPCIONES/javascript/kenysdev.js @@ -0,0 +1,166 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#10 EXCEPCIONES +--------------------------------------- + * EJERCICIO: + * Explora el concepto de manejo de excepciones según tu lenguaje. + * Fuerza un error en tu código, captura el error, imprime dicho error + * y evita que el programa se detenga de manera inesperada. + * Prueba a dividir "10/0" o acceder a un índice no existente + * de un listado para intentar provocar un error. + * + * DIFICULTAD EXTRA (opcional): + * Crea una función que sea capaz de procesar parámetros, pero que también + * pueda lanzar 3 tipos diferentes de excepciones (una de ellas tiene que + * corresponderse con un tipo de excepción creada por nosotros de manera + * personalizada, y debe ser lanzada de manera manual) en caso de error. + * - Captura todas las excepciones desde el lugar donde llamas a la función. + * - Imprime el tipo de error. + * - Imprime si no se ha producido ningún error. + * - Imprime que la ejecución ha finalizado. +*/ + +// ________________________________________________________ +// 1: Capturar excepción por división entre 0 (personalizada) +try { + const a = 7; + const b = 0; + if (b === 0) { + throw new Error("No se puede dividir entre cero."); + } + const r = a / b; + console.log("Resultado: ", r); +} catch (error) { + console.error("Error capturado: ", error.message); +} + +// 2: Capturar errores de conversión o concatenación +try { + // Genera un error al intentar sumar un número con una cadena + const r = parseInt("uno") + 2; // Aquí "uno" no puede convertirse + if (isNaN(r)) { + throw new TypeError("Conversión fallida: el resultado no es un número."); + } +} catch (error) { + console.error("Error capturado: ", error.message); +} + +// 3: Capturar múltiples tipos de excepciones +try { + // Lanza manualmente un error de tipo o rango + const value = -1; + if (value < 0) { + throw new RangeError("El valor no puede ser negativo."); + } +} catch (error) { + if (error instanceof RangeError) { + console.error("Error de rango: ", error.message); + } else if (error instanceof TypeError) { + console.error("Error de tipos: ", error.message); + } else { + console.error("Error desconocido: ", error.message); + } +} + +//4: Capturar una excepción genérica +try { + // Intentar acceder a un índice fuera de rango en un arreglo + const myArray = [1, 2, 3]; + console.log(myArray[10]); // No genera error automáticamente + throw new Error("Índice fuera de rango."); // Lanzamos un error manualmente +} catch (error) { + console.error("Error capturado: ", error.message); +} + +// 5: Capturar y mostrar el tipo de excepción +try { + // Genera un error lanzando un número en lugar de un mensaje (caso extraño) + throw 42; +} catch (error) { + console.error("Tipo de error: ", typeof error, " | Valor: ", error); +} + +// 6: Bloque finally (ejecutar siempre) +try { + // Simula un error de división + const a = 5; + const b = 0; + if (b === 0) { + throw new Error("No se puede dividir entre cero."); + } +} catch (error) { + console.error("Error capturado: ", error.message); +} finally { + console.log("Bloque finally ejecutado."); +} + +// 7: Lanzar una excepción personalizada +class CustomException extends Error { + constructor(message) { + super(message); + this.name = "CustomException"; + } +} + +try { + throw new CustomException("Este es un error personalizado."); +} catch (error) { + if (error instanceof CustomException) { + console.error("Error personalizado capturado: ", error.message); + } else { + console.error("Error desconocido: ", error.message); + } +} + +// 8: Pasar un objeto a la excepción +class DictionaryException extends Error { + constructor(data) { + super("Excepción con datos adicionales"); + this.data = data; + } +} + +try { + throw new DictionaryException({ msg: "Mensaje", info: "Información adicional" }); +} catch (error) { + if (error instanceof DictionaryException) { + console.error("Datos de la excepción: ", error.data); + } +} + + +// ________________________________________________________ +// DIFICULTAD EXTRA + +class OddNumberError extends Error { + constructor(msg = "No dividir entre impares") { + super(msg); + this.name = "OddNumberError"; + } +} + +function division(a, b) { + if (b % 2 !== 0) { + throw new OddNumberError(); + } + return a / b; +} + +function operation(a, b) { + try { + console.log("Resultado: ", division(a, b)); + } catch (error) { + console.error("Error: ", error.constructor.name, error.message); + } finally { + console.log("Operación terminada."); + } +} + +console.log("\n___________\nEjercicio:"); +operation(10, "uno"); +operation(10, 0); +operation(10, 5); +operation(10, 2); From 9dbc44117ac18b4c2a00bec9d6e6a1adb7925c14 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Fri, 20 Dec 2024 19:00:11 -0600 Subject: [PATCH 020/104] 11 - js - MANEJO DE FICHEROS --- .../javascript/kenysdev.js | 253 ++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 Roadmap/11 - MANEJO DE FICHEROS/javascript/kenysdev.js diff --git a/Roadmap/11 - MANEJO DE FICHEROS/javascript/kenysdev.js b/Roadmap/11 - MANEJO DE FICHEROS/javascript/kenysdev.js new file mode 100644 index 0000000000..f79e9591bb --- /dev/null +++ b/Roadmap/11 - MANEJO DE FICHEROS/javascript/kenysdev.js @@ -0,0 +1,253 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#11 MANEJO DE FICHEROS +--------------------------------------- + * IMPORTANTE: Sólo debes subir el fichero de código como parte del ejercicio. + * + * EJERCICIO: + * Desarrolla un programa capaz de crear un archivo que se llame como + * tu usuario de GitHub y tenga la extensión .txt. + * Añade varias líneas en ese fichero: + * - Tu nombre. + * - Edad. + * - Lenguaje de programación favorito. + * Imprime el contenido. + * Borra el fichero. + * + * DIFICULTAD EXTRA (opcional): + * Desarrolla un programa de gestión de ventas que almacena sus datos en un + * archivo .txt. + * - Cada producto se guarda en una línea del arhivo de la siguiente manera: + *   [nombre_producto], [cantidad_vendida], [precio]. + * - Siguiendo ese formato, y mediante terminal, debe permitir añadir, consultar, + *   actualizar, eliminar productos y salir. + * - También debe poseer opciones para calcular la venta total y por producto. + * - La opción salir borra el .txt. +*/ + +// ________________________________________________________ +const fs = require("fs/promises"); +const path = require("path"); + +class File { + constructor(filePath) { + this._path = filePath; + } + + async writeLine(line) { + try { + await fs.appendFile(this._path, line + "\n"); + } catch (error) { + console.error("Error -> writeLine ->", error.message); + } + } + + async writeLines(lines) { + try { + await fs.writeFile(this._path, lines.join("\n")); + } catch (error) { + console.error("Error -> writeLines ->", error.message); + } + } + + async readLine() { + try { + const data = await fs.readFile(this._path, "utf-8"); + const lines = data.split("\n").filter(Boolean); + return lines[lines.length - 1] || null; + } catch (error) { + console.error("Error -> readLine ->", error.message); + return null; + } + } + + async readLines() { + try { + const data = await fs.readFile(this._path, "utf-8"); + return [...data.split("\n").filter(Boolean)]; + } catch (error) { + console.error("Error -> readLines ->", error.message); + return []; + } + } + + async deleteFile() { + try { + await fs.unlink(this._path); + console.log(`${this._path} -> eliminado.`); + } catch (error) { + console.error("Error -> deleteFile ->", error.message); + } + } + + async printAll() { + try { + const data = await fs.readFile(this._path, "utf-8"); + console.log(data); + } catch (error) { + console.error("Error -> printAll ->", error.message); + } + } + + async queryFile(query) { + try { + const lines = await this.readLines(); + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const productName = line.split(",")[0].trim(); + if (productName === `[${query}]`) { + console.log(line); + return i; + } + } + console.log("No existe."); + return null; + } catch (error) { + console.error("Error -> queryFile ->", error.message); + return null; + } + } +} + +// __________________________ +async function ejmp() { + const user = new File(path.resolve("kenysdev.txt")); + await user.writeLine("Name: ken"); + await user.writeLine("Age: 121"); + await user.writeLine("PL: JS"); + await user.printAll(); + const name = await user.readLine() + console.log(name); + await user.deleteFile(); +} + +// ________________________________________________________ +// DIFICULTAD EXTRA + +const sale = new File(path.resolve("sale_mgt.txt")); + +async function addProduct(product = null, qty = null, price = null) { + while (true) { + if (!product || !/^[a-zA-Z]+$/.test(product)) { + console.log("Debe ingresar un nombre de producto válido."); + product = await Input("Producto: "); + } else if (!qty || !/^[0-9]+$/.test(qty)) { + console.log("Debe ingresar una cantidad válida."); + qty = await Input("Cantidad: "); + } else if (!price || isNaN(parseFloat(price))) { + console.log("Debe ingresar un precio válido."); + price = await Input("Precio: "); + } else { + const line = `[${product}], [${qty}], [${price}]`; + await sale.writeLine(line); + console.log("\nGuardado."); + return; + } + } +} + +async function queryProduct(query = "") { + if (!query) { + query = await Input("\nConsultar Producto.\nNombre: "); + } + await sale.queryFile(query); +} + +async function deleteProduct(query = "") { + if (!query) { + query = await Input("\nEliminar Producto.\nNombre: "); + } + const lineIndex = await sale.queryFile(query); + if (lineIndex !== null) { + const lines = await sale.readLines(); + lines.splice(lineIndex, 1); + lines.push('') + await sale.writeLines(lines); + console.log("Producto eliminado"); + } +} + +async function updateProduct(query = "") { + if (!query) { + query = await Input("\nEditar Producto.\nNombre: "); + } + const lineIndex = await sale.queryFile(query); + if (lineIndex !== null) { + const lines = await sale.readLines(); + console.log("Ingrese los nuevos datos del producto:"); + await addProduct(); + lines[lineIndex] = await sale.readLine(); + lines.push('') + await sale.writeLines(lines); + } +} + +async function invoice() { + console.log("\nFactura\n-------------------------"); + const lines = await sale.readLines(); + let totalAmount = 0; + + for (const line of lines) { + const [product, qty, price] = line.split(",").map(item => item.trim().replace(/\[|\]/g, "")); + const subTotal = parseInt(qty) * parseFloat(price); + console.log(`${line} -> $${subTotal.toFixed(2)}`); + totalAmount += subTotal; + } + + console.log("\nMonto Total -> $" + totalAmount.toFixed(2)); +} + +// __________________________ +const menu = (` + Gestión de Ventas: +╔═════════════════════════════════╗ +║ 1. Agregar 4. Editar ║ +║ 2. Consultar 5. Facturar ║ +║ 3. Eliminar 6. Salir ║ +╚═════════════════════════════════╝ +`); + +const readline = require("readline"); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +function Input(query) { + return new Promise(resolve => rl.question(query, resolve)); +} + +(async () => { + await ejmp(); + while (true) { + console.log(menu) + const option = await Input("\nOpción: "); + switch (option) { + case "1": + await addProduct(); + break; + case "2": + await queryProduct(); + break; + case "3": + await deleteProduct(); + break; + case "4": + await updateProduct(); + break; + case "5": + await invoice(); + break; + case "6": + console.log("Adiós"); + await sale.deleteFile(); + rl.close(); + return; + default: + console.log("Seleccione una opción entre 1 y 6."); + } + } +})(); From 39e47edcdcb61904b8a8c3f394df6d60bb3f4ef9 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Fri, 20 Dec 2024 19:00:52 -0600 Subject: [PATCH 021/104] 12 - js - JSON Y XML --- .../12 - JSON Y XML/javascript/kenysdev.js | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 Roadmap/12 - JSON Y XML/javascript/kenysdev.js diff --git a/Roadmap/12 - JSON Y XML/javascript/kenysdev.js b/Roadmap/12 - JSON Y XML/javascript/kenysdev.js new file mode 100644 index 0000000000..1767fd4e83 --- /dev/null +++ b/Roadmap/12 - JSON Y XML/javascript/kenysdev.js @@ -0,0 +1,124 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#12 JSON Y XML +--------------------------------------- + * IMPORTANTE: Sólo debes subir el fichero de código como parte del ejercicio. + * + * EJERCICIO: + * Desarrolla un programa capaz de crear un archivo XML y JSON que guarde los + * siguientes datos (haciendo uso de la sintaxis correcta en cada caso): + * - Nombre + * - Edad + * - Fecha de nacimiento + * - Listado de lenguajes de programación + * Muestra el contenido de los archivos. + * Borra los archivos. + * + * DIFICULTAD EXTRA (opcional): + * Utilizando la lógica de creación de los archivos anteriores, crea un + * programa capaz de leer y transformar en una misma clase custom de tu + * lenguaje los datos almacenados en el XML y el JSON. + * Borra los archivos. +*/ + +// ________________________________________________________ +import { writeFile, readFile, unlink } from "fs/promises"; +import { extname } from "path"; +import { parseStringPromise, Builder } from "xml2js"; + +// Datos iniciales +const dictUser = { + name: "Ken", + age: 121, + dob: "1903-03-19", + prog_langs: ["cs", "py", "vb", "rs", "js"], +}; + +(async () => { + try {`` + //____________________________________ + // * JSON + + // Serialización: Convertir objeto a JSON + const jsonUser = JSON.stringify(dictUser, null, 4); + + // Crear archivo JSON + await writeFile("user.json", jsonUser, "utf8"); + console.log("Archivo JSON creado."); + + // Deserialización: Leer y convertir JSON a objeto + const jsonData = await readFile("user.json", "utf8"); + const parsedJson = JSON.parse(jsonData); + console.log("Objeto cargado desde JSON:", parsedJson); + + //____________________________________ + // * XML + + // Serialización: Crear XML a partir de objeto + const builder = new Builder(); + const xmlUser = builder.buildObject({ user: dictUser }); + + // Crear archivo XML + await writeFile("user.xml", xmlUser, "utf8"); + console.log("Archivo XML creado."); + + // Deserialización: Leer y convertir XML a objeto + const xmlData = await readFile("user.xml", "utf8"); + const parsedXml = await parseStringPromise(xmlData); + console.log("Objeto cargado desde XML:", parsedXml.user); + + //____________________________________ + // DIFICULTAD EXTRA + + class XmlOrJson { + constructor(filePath) { + this.filePath = filePath; + this.extension = extname(filePath).toLowerCase(); + this.data = {}; + } + + async asDict() { + try { + if (this.extension === ".json") { + const jsonContent = await readFile(this.filePath, "utf8"); + this.data = JSON.parse(jsonContent); + console.log("Archivo JSON cargado correctamente."); + } else if (this.extension === ".xml") { + const xmlContent = await readFile(this.filePath, "utf8"); + const parsedXml = await parseStringPromise(xmlContent); + this.data = parsedXml.user; + console.log("Archivo XML cargado correctamente."); + } else { + throw new Error("Extensión de archivo no soportada."); + } + return this.data; + } catch (error) { + console.error("Error al cargar archivo:", error.message); + } + } + } + + //____________________________________ + console.log("\nDIFICULTAD EXTRA\n"); + + // Leer JSON + const jsonFile = new XmlOrJson("user.json"); + const jsonDict = await jsonFile.asDict(); + console.log("Datos desde JSON:", jsonDict); + + // Leer XML + const xmlFile = new XmlOrJson("user.xml"); + const xmlDict = await xmlFile.asDict(); + console.log("Datos desde XML:", xmlDict); + + // Eliminar archivos + await unlink("user.json"); + await unlink("user.xml"); + console.log("Archivos eliminados."); + } catch (error) { + console.error("Error general:", error.message); + } +})(); From 052865e6a806a99f7b4393b62ede51b9a279dc2d Mon Sep 17 00:00:00 2001 From: kenysdev Date: Fri, 20 Dec 2024 19:01:28 -0600 Subject: [PATCH 022/104] 13 - js - PRUEBAS UNITARIAS --- .../javascript/kenysdev.js | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 Roadmap/13 - PRUEBAS UNITARIAS/javascript/kenysdev.js diff --git a/Roadmap/13 - PRUEBAS UNITARIAS/javascript/kenysdev.js b/Roadmap/13 - PRUEBAS UNITARIAS/javascript/kenysdev.js new file mode 100644 index 0000000000..aa6f8f682e --- /dev/null +++ b/Roadmap/13 - PRUEBAS UNITARIAS/javascript/kenysdev.js @@ -0,0 +1,121 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#13 PRUEBAS UNITARIAS +--------------------------------------- + * EJERCICIO: + * Crea una función que se encargue de sumar dos números y retornar + * su resultado. + * Crea un test, utilizando las herramientas de tu lenguaje, que sea + * capaz de determinar si esa función se ejecuta correctamente. + * + * DIFICULTAD EXTRA (opcional): + * Crea un diccionario con las siguientes claves y valores: + * "name": "Tu nombre" + * "age": "Tu edad" + * "birth_date": "Tu fecha de nacimiento" + * "programming_languages": ["Listado de lenguajes de programación"] + * Crea dos test: + * - Un primero que determine que existen todos los campos. + * - Un segundo que determine que los datos introducidos son correctos. + +________________________________________________________ +// Instala Jest en tu proyecto +npm install --save-dev jest + +// package.json +{ + "scripts": { + "test": "jest" + } +} + +// Ejecuta las pruebas: +npm test +npm test -- --verbose +________________________________________________________ +*/ + +// src/sum.js +function sum(a, b) { + if (arguments.length < 2) { + throw new TypeError("Se requieren dos argumentos"); + } + + if (typeof a === "number" && typeof b === "number") { + return a + b; + } else { + return null; + } +} + +// module.exports = sum; + +// _____________________________ +// Pruebas unitarias +// tests/sum.test.js +// const sum = require("../src/sum"); +describe("Test para función suma", () => { + test("Debe devolver la suma correcta", () => { + expect(sum(5, 2)).toBe(7); + expect(sum(2.5, 1.25)).toBe(3.75); + expect(sum(-2, 1)).toBe(-1); + expect(sum(0, 0)).toBe(0); + }); + + test("Debería devolver nulo para entradas no válidas", () => { + expect(sum(1, "2")).toBeNull(); + expect(sum("a", "b")).toBeNull(); + }); + + test("No debería devolver sumas incorrectas", () => { + expect(sum(1, 3)).not.toBe(5); + }); + + test("Debería lanzar TypeError si faltan argumentos", () => { + expect(() => sum(10)).toThrow(TypeError); + }); +}); + +// ________________________________________________________ +// DIFICULTAD EXTRA + +// src/dictUser.js +const dictUser = { + name: "Ken", + age: 121, + birth_date: "1903-03-19", + prog_langs: ["cs", "py", "vb", "rs", "js"], +}; + +// module.exports = dictUser; + +// _____________________________ +// Pruebas unitarias +// tests/dictUser.test.js + +// const dictUser = require("../src/dictUser"); +describe("Pruebas para dictUser", () => { + test("Verificar la existencia de las claves en dictUser", () => { + expect(dictUser).toHaveProperty("name"); + expect(dictUser).toHaveProperty("age"); + expect(dictUser).toHaveProperty("birth_date"); + expect(dictUser).toHaveProperty("prog_langs"); + }); + + test("Verificar los tipos de los valores en dictUser", () => { + expect(typeof dictUser.name).toBe("string"); + expect(typeof dictUser.age).toBe("number"); + expect(typeof dictUser.birth_date).toBe("string"); + expect(Array.isArray(dictUser.prog_langs)).toBe(true); + }); + + test("Verificar el contenido de los valores en dictUser", () => { + expect(dictUser.name).toBe("Ken"); + expect(dictUser.age).toBe(121); + expect(dictUser.birth_date).toBe("1903-03-19"); + expect(dictUser.prog_langs).toEqual(["cs", "py", "vb", "rs", "js"]); + }); +}); From b5e74c2c0ca5caa577d2d1110a26ae7379b0015b Mon Sep 17 00:00:00 2001 From: kenysdev Date: Fri, 20 Dec 2024 19:02:22 -0600 Subject: [PATCH 023/104] 14 - js - FECHAS --- Roadmap/14 - FECHAS/javascript/kenysdev.js | 54 ++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Roadmap/14 - FECHAS/javascript/kenysdev.js diff --git a/Roadmap/14 - FECHAS/javascript/kenysdev.js b/Roadmap/14 - FECHAS/javascript/kenysdev.js new file mode 100644 index 0000000000..93854af136 --- /dev/null +++ b/Roadmap/14 - FECHAS/javascript/kenysdev.js @@ -0,0 +1,54 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#14 FECHAS +--------------------------------------- +* EJERCICIO: + * Crea dos variables utilizando los objetos fecha (date, o semejante) de tu lenguaje: + * - Una primera que represente la fecha (día, mes, año, hora, minuto, segundo) actual. + * - Una segunda que represente tu fecha de nacimiento (te puedes inventar la hora). + * Calcula cuántos años han transcurrido entre ambas fechas. + * + * DIFICULTAD EXTRA (opcional): + * Utilizando la fecha de tu cumpleaños, formatéala y muestra su resultado de + * 10 maneras diferentes. Por ejemplo: + * - Día, mes y año. + * - Hora, minuto y segundo. + * - Día de año. + * - Día de la semana. + * - Nombre del mes. + * (lo que se te ocurra...) +*/ +// ________________________________________________________ +const { DateTime } = require("luxon"); + +const birthDate = DateTime.fromISO("1995-10-20T02:30:00"); +const currentDate = DateTime.now(); + +// Diferencia precisa +const diff = currentDate.diff(birthDate, ["years", "months", "days"]); + +console.log(` +Juanito tiene: +${Math.floor(diff.years)} años, +${Math.floor(diff.months)} meses y +${Math.floor(diff.days)} días. +`); + +// ________________________________________________________ +// DIFICULTAD EXTRA + +console.log(` + 1. Predeterminado -> ${birthDate.toString()} + 2. dd/mm/yyyy -> ${birthDate.toFormat("dd/MM/yyyy")} + 3. dd-mm-yyyy -> ${birthDate.toFormat("dd-MM-yyyy")} + 4. Nombre del mes -> ${birthDate.toFormat("MMMM")} + 5. Mes abreviado -> ${birthDate.toFormat("MMM")} + 6. Nombre dia -> ${birthDate.toFormat("cccc")} + 7. Dia abreviado -> ${birthDate.toFormat("ccc")} + 8. Hora(12 horas) -> ${birthDate.toFormat("hh:mm:ss a")} + 9. Hora(24 horas) -> ${birthDate.toFormat("HH:mm:ss")} + 0. personalizado -> Born on ${birthDate.toFormat("cccc, dd 'of' MMMM yyyy at hh:mm:ss a")} +`); From 934e9f5cfa514bc77065766830873065aa281a35 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Fri, 20 Dec 2024 19:04:16 -0600 Subject: [PATCH 024/104] =?UTF-8?q?15=20-=20js=20-=20ASINCRON=C3=8DA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javascript/kenysdev.js" | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 "Roadmap/15 - ASINCRON\303\215A/javascript/kenysdev.js" diff --git "a/Roadmap/15 - ASINCRON\303\215A/javascript/kenysdev.js" "b/Roadmap/15 - ASINCRON\303\215A/javascript/kenysdev.js" new file mode 100644 index 0000000000..d0e5d76fab --- /dev/null +++ "b/Roadmap/15 - ASINCRON\303\215A/javascript/kenysdev.js" @@ -0,0 +1,58 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#15 ASINCRONÍA +--------------------------------------- + * EJERCICIO: + * Utilizando tu lenguaje, crea un programa capaz de ejecutar de manera + * asíncrona una función que tardará en finalizar un número concreto de + * segundos parametrizables. También debes poder asignarle un nombre. + * La función imprime su nombre, cuándo empieza, el tiempo que durará + * su ejecución y cuando finaliza. + * + * DIFICULTAD EXTRA (opcional): + * Utilizando el concepto de asincronía y la función anterior, crea + * el siguiente programa que ejecuta en este orden: + * - Una función C que dura 3 segundos. + * - Una función B que dura 2 segundos. + * - Una función A que dura 1 segundo. + * - Una función D que dura 1 segundo. + * - Las funciones C, B y A se ejecutan en paralelo. + * - La función D comienza su ejecución cuando las 3 anteriores han + *   finalizado. +*/ +// ________________________________________________________ + +async function process(name, time) { + console.log(`- Iniciar función: ${name} -> Duración: ${time}s`); + await new Promise(resolve => setTimeout(resolve, time * 1000)); + console.log(`* Función ${name} finaliza.`); +} + +async function test() { + await Promise.all([ + process("Test 2", 4), + process("Test 1", 2) + ]); +} + +// ________________________________________________________ +// DIFICULTAD EXTRA + +async function in_parallel() { + await Promise.all([ + process("C", 3), + process("B", 2), + process("A", 1) + ]); +} + +async function main() { + await test(); + await in_parallel(); + await process("D", 1); +} + +main(); From 62d3bfb2d073378dd8a103c39bbd6f86edd6fa95 Mon Sep 17 00:00:00 2001 From: Edison Mondragon Date: Fri, 20 Dec 2024 21:18:29 -0500 Subject: [PATCH 025/104] =?UTF-8?q?Se=20realizo=20el=20ejercicio:=20genera?= =?UTF-8?q?cion=20de=20clave=20aleatoria=20y=20verificacion=20de=20clave?= =?UTF-8?q?=20ingresada.=20Falta=20comprobaci=C3=B3n=20de=20errores.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../python/edisonlmg.py" | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 "Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" diff --git "a/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" "b/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" new file mode 100644 index 0000000000..0a76d91ebd --- /dev/null +++ "b/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" @@ -0,0 +1,87 @@ +#============================ +# 49 El almacen de Papá Noel +#============================ + +import random +import sys + +# Funcion que comprueba errores + +def errores(psw_in): + + + +# Funcion que comprueba la contraseña ingresada + +def comprobar_psw(psw_in, psw): + + for x, y in zip(psw_in, psw): + + if x == y: + + print(f'\n{x}: Correcto') + + elif x in psw: + + print(f'\n{x}: Presente') + + else: + + print(f'\n{x}: Incorrecto') + +# Generar una cadena aleatoria de 4 caracteres + +psw = ''.join(random.sample('ABC123', k=4)) + +# Inicio de juego + +print(''' + \n¡Bienvenido Papá Noel, es hora de repartir regalos! + \nPara abrir al almacén de juguetes digita la clave de ingreso +(tienes 10 intentos). + \nPista: La clave son 4 dígitos alfanuméricos con letras de la A la C +y números del 1 al 3, en mayúsculas y sin repeticiones. + ''') + +# Inicio de bucle + +intento = 0 + +while intento < 10: + + intento += 1 + + print(f'\nIntento n.° {intento}:') + + while True: + + psw_in = input('\nIngresa contraseña: ') + + if errores(psw_in): + + print(''' + \nLos caracteres ingresados no son correctos. + \nInténtalo de nuevo... + ''') + + if psw_in == psw: + + print(''' + \n La contraseña es correcta. + \n¡Felicidades, a repartir juguetes! + ''') + + exit() + + else: + + print(f''' + \nLa contraseña es incorrecta. Pero descuida, te doy unas pistas: + \n{comprobar_psw(psw_in, psw)} + ''') + +print(''' + \n¡Oh, no. Papá Noel has olvidado la contraseña! +Ya no te quedan más intentos. + ''') + From 37e48da5779fd2c9192e70288afb97153c76eca1 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Sat, 21 Dec 2024 17:46:41 -0600 Subject: [PATCH 026/104] 16 - js - EXPRESIONES REGULARES --- .../javascript/kenysdev.js | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Roadmap/16 - EXPRESIONES REGULARES/javascript/kenysdev.js diff --git a/Roadmap/16 - EXPRESIONES REGULARES/javascript/kenysdev.js b/Roadmap/16 - EXPRESIONES REGULARES/javascript/kenysdev.js new file mode 100644 index 0000000000..3f9afa0ecb --- /dev/null +++ b/Roadmap/16 - EXPRESIONES REGULARES/javascript/kenysdev.js @@ -0,0 +1,66 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#16 EXPRESIONES REGULARES +--------------------------------------- + * EJERCICIO: + * Utilizando tu lenguaje, explora el concepto de expresiones regulares, + * creando una que sea capaz de encontrar y extraer todos los números + * de un texto. + * + * DIFICULTAD EXTRA (opcional): + * Crea 3 expresiones regulares (a tu criterio) capaces de: + * - Validar un email. + * - Validar un número de teléfono. + * - Validar una url. +*/ +// ________________________________________________________ + +function toNumbers(text) { + const numberPattern = /\d+/g; + return text.match(numberPattern) || []; +} + +const string = "abcdsfs1s(*&#}2. a3// 45sdf67"; +const listNumbers = toNumbers(string); +console.log(listNumbers); // ['1', '2', '3', '45', '67'] + +// ________________________________________________________ +// DIFICULTAD EXTRA + +function isEmail(text) { + const pattern = /^[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}$/; + return pattern.test(text); +} + +function isPhoneNumber(text) { + const pattern = /^(\d{3}-\d{3}-\d{4}|\d{10})$/; + return pattern.test(text); +} + +function isUrl(text) { + const pattern = /^(https?:\/\/)?(www\.)?([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(\/\S*)?$/; + return pattern.test(text); +} + +// Pruebas +console.log("\nisEmail"); +console.log(isEmail("ejm@dmn.com")); // true +console.log(isEmail("e_jm-2+b@dmn.co.hn")); // true +console.log(isEmail("ejm@dmn.com_")); // false +console.log(isEmail("ejm@dmn")); // false + +console.log("\nisPhoneNumber"); +console.log(isPhoneNumber("123-456-7890")); // true +console.log(isPhoneNumber("1234567890")); // true +console.log(isPhoneNumber("123456-7890")); // false +console.log(isPhoneNumber("uno234567890")); // false + +console.log("\nisUrl"); +console.log(isUrl("http://www.ejm.com")); // true +console.log(isUrl("google.com")); // true +console.log(isUrl("ejm.com/a/b/c")); // true +console.log(isUrl("https://.ejm.com")); // false +console.log(isUrl("https://.ejm.com/a b")); // false From b1810a9cc23cd6c7b1ed39a3fcf98bad386383fb Mon Sep 17 00:00:00 2001 From: kenysdev Date: Sat, 21 Dec 2024 17:48:10 -0600 Subject: [PATCH 027/104] 17 - js - ITERACIONES --- .../17 - ITERACIONES/javascript/kenysdev.js | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 Roadmap/17 - ITERACIONES/javascript/kenysdev.js diff --git a/Roadmap/17 - ITERACIONES/javascript/kenysdev.js b/Roadmap/17 - ITERACIONES/javascript/kenysdev.js new file mode 100644 index 0000000000..61192b7b91 --- /dev/null +++ b/Roadmap/17 - ITERACIONES/javascript/kenysdev.js @@ -0,0 +1,73 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#17 ITERACIONES +--------------------------------------- + * EJERCICIO: + * Utilizando tu lenguaje, emplea 3 mecanismos diferentes para imprimir + * números del 1 al 10 mediante iteración. + * + * DIFICULTAD EXTRA (opcional): + * Escribe el mayor número de mecanismos que posea tu lenguaje + * para iterar valores. ¿Eres capaz de utilizar 5? ¿Y 10? +*/ +// ________________________________________________________ + +console.log("bucle 'for'") +for (let i = 1; i <= 10; i++) { + console.log(i); +} + +console.log("\nbucle 'while'") +let i = 1; +while (i <= 10) { + console.log(i); + i++; +} + +console.log("\nbucle 'do...while'") +let n = 1; +do { + console.log(n); + n++; +} while (n <= 10); + +// ________________________________________________________ +// DIFICULTAD EXTRA + +console.log("\nfor...of con Array.from()") +for (const num of Array.from({ length: 5 }, (_, i) => i + 1)) { + console.log(num); +} + +console.log("\nArray.from() con .forEach()") +Array.from({ length: 5 }, (_, i) => i + 1).forEach(num => console.log(num)); + +console.log("\nUsando 'map()'") +Array.from({ length: 5 }, (_, i) => i + 1).map(num => console.log(num)); + +console.log("\nUsando 'reduce'") +Array.from({ length: 5 }, (_, i) => i + 1).reduce((_, num) => { + console.log(num); + return num; +}, 0); + +console.log("\nUsando 'every'") +const result = [1, 2, 3, 4].every(num => { + console.log(num); + return num < 4; +}); + +console.log("\nUsando 'some'") +const result2 = [1, 2, 3, 4].some(num => { + console.log(num); + return num === 3; +}); + +console.log("\nUsando 'for...in'") +const numbers = [1, 2, 3 , 4, 5] +for (const n in numbers) { + console.log(n); +} From f7d3e65ae989804e5adad0f59d388c7adffa3b1e Mon Sep 17 00:00:00 2001 From: kenysdev Date: Sat, 21 Dec 2024 17:49:33 -0600 Subject: [PATCH 028/104] 18 - js - CONJUNTOS --- Roadmap/18 - CONJUNTOS/javascript/kenysdev.js | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 Roadmap/18 - CONJUNTOS/javascript/kenysdev.js diff --git a/Roadmap/18 - CONJUNTOS/javascript/kenysdev.js b/Roadmap/18 - CONJUNTOS/javascript/kenysdev.js new file mode 100644 index 0000000000..84214e1e94 --- /dev/null +++ b/Roadmap/18 - CONJUNTOS/javascript/kenysdev.js @@ -0,0 +1,90 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#18 CONJUNTOS +--------------------------------------- + * EJERCICIO: + * Utilizando tu lenguaje crea un conjunto de datos y realiza las siguientes + * operaciones (debes utilizar una estructura que las soporte): + * - Añade un elemento al final. + * - Añade un elemento al principio. + * - Añade varios elementos en bloque al final. + * - Añade varios elementos en bloque en una posición concreta. + * - Elimina un elemento en una posición concreta. + * - Actualiza el valor de un elemento en una posición concreta. + * - Comprueba si un elemento está en un conjunto. + * - Elimina todo el contenido del conjunto. + * + * DIFICULTAD EXTRA (opcional): + * Muestra ejemplos de las siguientes operaciones con conjuntos: + * - Unión. + * - Intersección. + * - Diferencia. + * - Diferencia simétrica. +*/ +// ________________________________________________________ + +// Crear una lista +let myList = ["a", "b", "c"]; + +// Añade un elemento al final. +myList.push("d"); + +// Añade un elemento al principio. +myList.unshift("-"); + +// Añade varios elementos en bloque al final. +myList.push("e", "f"); + +// Añade varios elementos en bloque en una posición concreta. +myList.splice(4, 0, "-", ">"); + +// Elimina en una posición concreta. +myList.splice(5, 1); + +// Actualiza en una posición concreta. +myList[2] = "-b"; + +// Mostrar +console.log(myList); + +// Comprobar +console.log(`"c" en lista: ${myList.includes("c")}`); +console.log(`"g" en lista: ${myList.includes("g")}`); + +// Elimina todo el contenido. +myList.length = 0; +console.log(myList); + +// ________________________________________________________ +// DIFICULTAD EXTRA + +// Crear conjuntos +let set1 = new Set(["a", "b", "c", "d"]); +let set2 = new Set(["c", "d", "e", "f"]); +console.log(`set1: ${[...set1]} - set2: ${[...set2]}`) + +// Unión +let union = new Set([...set1, ...set2]); +console.log(`Unión: ${[...union]}`); + +// Intersección +let intersection = new Set([...set1].filter(x => set2.has(x))); +console.log(`Intersección: ${[...intersection]}`); + +// Diferencia (set1 - set2) +let difference1 = new Set([...set1].filter(x => !set2.has(x))); +console.log(`Diferencia: ${[...difference1]}`); + +// Diferencia (set2 - set1) +let difference2 = new Set([...set2].filter(x => !set1.has(x))); +console.log(`Diferencia: ${[...difference2]}`); + +// Diferencia simétrica +let symmetricDifference = new Set([ + ...[...set1].filter(x => !set2.has(x)), + ...[...set2].filter(x => !set1.has(x)) +]); +console.log(`Diferencia simétrica: ${[...symmetricDifference]}`); From 269db0d370c14a35ff0f55849cc4f0462de7fed3 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Sat, 21 Dec 2024 17:50:45 -0600 Subject: [PATCH 029/104] 19 - js - ENUMERACIONES --- .../19 - ENUMERACIONES/javascript/kenysdev.js | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 Roadmap/19 - ENUMERACIONES/javascript/kenysdev.js diff --git a/Roadmap/19 - ENUMERACIONES/javascript/kenysdev.js b/Roadmap/19 - ENUMERACIONES/javascript/kenysdev.js new file mode 100644 index 0000000000..0cb96cc6ab --- /dev/null +++ b/Roadmap/19 - ENUMERACIONES/javascript/kenysdev.js @@ -0,0 +1,131 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#19 ENUMERACIONES +--------------------------------------- + * EJERCICIO: + * Empleando tu lenguaje, explora la definición del tipo de dato + * que sirva para definir enumeraciones (Enum). + * Crea un Enum que represente los días de la semana del lunes + * al domingo, en ese orden. Con ese enumerado, crea una operación + * que muestre el nombre del día de la semana dependiendo del número entero + * utilizado (del 1 al 7). + * + * DIFICULTAD EXTRA (opcional): + * Crea un pequeño sistema de gestión del estado de pedidos. + * Implementa una clase que defina un pedido con las siguientes características: + * - El pedido tiene un identificador y un estado. + * - El estado es un Enum con estos valores: PENDIENTE, ENVIADO, ENTREGADO y CANCELADO. + * - Implementa las funciones que sirvan para modificar el estado: + *   - Pedido enviado + *   - Pedido cancelado + *   - Pedido entregado + *   (Establece una lógica, por ejemplo, no se puede entregar si no se ha enviado, etc...) + * - Implementa una función para mostrar un texto descriptivo según el estado actual. + * - Crea diferentes pedidos y muestra cómo se interactúa con ellos. +*/ +// ________________________________________________________ + +const Weekday = Object.freeze({ + MONDAY: 1, + TUESDAY: 2, + WEDNESDAY: 3, + THURSDAY: 4, + FRIDAY: 5, + SATURDAY: 6, + SUNDAY: 7, +}); + +function getDay(num) { + for (const [key, value] of Object.entries(Weekday)) { + if (value === num) { + return key; + } + } + return "'o'"; +} + +function getNumDay(day) { + return Weekday[day] || 0; +} + +console.log(getDay(7)); // SUNDAY +console.log(getDay(3)); // WEDNESDAY +console.log(getDay(8)); // 'o' + +console.log(getNumDay("TUESDAY")); // 2 +console.log(getNumDay("FRIDAY")); // 5 +console.log(getNumDay("abc")); // 0 + +// ________________________________________________________ +// DIFICULTAD EXTRA + +console.log("\nEJERCICIO 2:"); + +// Enum para el estado de pedidos +const Status = Object.freeze({ + PENDING: 1, + SHIPPED: 2, + DELIVERED: 3, + CANCELED: 4, +}); + +class Order { + constructor(identifier) { + this.identifier = identifier; + this._status = Status.PENDING; + } + + send() { + console.log("\nEnviar:"); + if (this._status === Status.PENDING) { + this._status = Status.SHIPPED; + console.log(this.info()); + } else { + console.log(`Operación inválida:`, this.info()); + } + } + + cancel() { + console.log("\nCancelar:"); + if (this._status === Status.PENDING) { + this._status = Status.CANCELED; + console.log(this.info()); + } else { + console.log(`Operación inválida:`, this.info()); + } + } + + deliver() { + console.log("\nEntregar:"); + if (this._status === Status.SHIPPED) { + this._status = Status.DELIVERED; + console.log(this.info()); + } else { + console.log(`Operación inválida:`, this.info()); + } + } + + info() { + const statusName = Object.keys(Status).find( + key => Status[key] === this._status + ); + return `${this.identifier} -> ${statusName}`; + } +} + +const libro1 = new Order("libro1"); +const libro2 = new Order("libro2"); +const libro3 = new Order("libro3"); + +console.log("\n-----\nOperaciones exitosas:\n-----"); +libro1.send(); +libro1.deliver(); +libro2.cancel(); + +console.log("\n-----\nOperaciones inválidas:\n-----"); +libro3.deliver(); +libro2.cancel(); +libro1.send(); From c907f0d8e7ee412d777b0999a7c111d84e4b6a17 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Sat, 21 Dec 2024 17:52:52 -0600 Subject: [PATCH 030/104] 20 - js - PETICIONES HTTP --- .../javascript/kenysdev.js | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 Roadmap/20 - PETICIONES HTTP/javascript/kenysdev.js diff --git a/Roadmap/20 - PETICIONES HTTP/javascript/kenysdev.js b/Roadmap/20 - PETICIONES HTTP/javascript/kenysdev.js new file mode 100644 index 0000000000..9c1a829ec3 --- /dev/null +++ b/Roadmap/20 - PETICIONES HTTP/javascript/kenysdev.js @@ -0,0 +1,175 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#20 PETICIONES HTTP +--------------------------------------- + * EJERCICIO: + * Utilizando un mecanismo de peticiones HTTP de tu lenguaje, realiza + * una petición a la web que tú quieras, verifica que dicha petición + * fue exitosa y muestra por consola el contenido de la web. + * + * DIFICULTAD EXTRA (opcional): + * Utilizando la PokéAPI (https://pokeapi.co), crea un programa por + * terminal al que le puedas solicitar información de un Pokémon concreto + * utilizando su nombre o número. + * - Muestra el nombre, id, peso, altura y tipo(s) del Pokémon + * - Muestra el nombre de su cadena de evoluciones + * - Muestra los juegos en los que aparece + * - Controla posibles errores +*/ +// ________________________________________________________ + +import fetch from "node-fetch"; + +async function getUser(userId) { + try { + const url = `https://jsonplaceholder.typicode.com/users/${userId}`; + const response = await fetch(url); + + if (response.ok) { + return await response.json(); + } else { + console.log(`Id: ${userId} no encontrado`); + console.log("status_code: ", response.status); + return {}; + } + } catch (error) { + console.error("Error de conexión:", error.message); + return {}; + } +} + +function printUser(userData) { + if (Object.keys(userData).length > 0) { + console.log(`\nUsuario con id: '${userData.id}':\n` + + `Nombre: ${userData.name}\n` + + `Usuario: ${userData.username}\n` + + `Email: ${userData.email}\n` + + `Teléfono: ${userData.phone}`); + } +} + +// ________________________________________________________ +// DIFICULTAD EXTRA + +class GetPokemon { + constructor() { + this.baseUrl = "https://pokeapi.co/api/v2/pokemon/"; + this.pokemon = null; + } + + async load(id) { + try { + const url = `${this.baseUrl}${id}`; + const response = await fetch(url); + + if (!response.ok) { + throw new Error(`Pokémon '${id}' no encontrado (status: ${response.status})`); + } + + this.pokemon = await response.json(); + console.log(`\nPokémon '${id}' ha sido cargado.`); + } catch (error) { + GetPokemon.handleExceptions(error); + } + } + + info() { + if (!this.pokemon) { + console.log("El Pokémon aún no ha sido cargado."); + return; + } + + console.log(`Información Básica \n` + + `* Id: ${this.pokemon.id} \n` + + `* Nombre: ${this.pokemon.name} \n` + + `* Peso: ${this.pokemon.weight} kg \n` + + `* Altura: ${this.pokemon.height} m \n` + + `* Tipo(s):` + ); + + this.pokemon.types.forEach((typeInfo) => { + console.log(` - ${typeInfo.type.name}`);; + }); + } + + async evolutionChain() { + if (!this.pokemon) { + console.log("El Pokémon aún no ha sido cargado."); + return; + } + + try { + const speciesUrl = this.pokemon.species.url; + const speciesData = await fetch(speciesUrl).then((res) => res.json()); + const evolutionChainUrl = speciesData.evolution_chain.url; + const evolutionChainData = await fetch(evolutionChainUrl).then((res) => res.json()); + + console.log("\nCadena de evoluciones:"); + let currentEvolution = evolutionChainData.chain; + + while (currentEvolution) { + console.log(`- ${currentEvolution.species.name}`); + currentEvolution = currentEvolution.evolves_to[0] || null; + } + } catch (error) { + GetPokemon.handleExceptions(error); + } + } + + showGames() { + if (!this.pokemon) { + console.log("El Pokémon aún no ha sido cargado."); + return; + } + + console.log("\nJuegos en los que aparece:"); + if (this.pokemon.game_indices.length > 0) { + this.pokemon.game_indices.forEach((gameInfo) => { + console.log(`- ${gameInfo.version.name}`); + }); + } else { + console.log("No aparece en ninguno."); + } + } + + static handleExceptions(error) { + if (error.name === "FetchError") { + console.log("Error de conexión:", error.message); + } else { + console.log("Error inesperado:", error.message); + } + } +} + +// ________________________________________________________ +(async () => { + const u1 = await getUser(1); + printUser(u1); + + const u2 = await getUser(2); + printUser(u2); + + const u3 = await getUser(777); // No existente. + printUser(u3); + + console.log("\nDIFICULTAD EXTRA:"); + + try { + const p1 = new GetPokemon(); + await p1.load(1); + p1.info(); + await p1.evolutionChain(); + p1.showGames(); + + const p2 = new GetPokemon(); + await p2.load("ivysaur"); + p2.info(); + await p2.evolutionChain(); + p2.showGames(); + } catch (error) { + GetPokemon.handleExceptions(error); + } +})(); From 739199d898cb3d196084f32597ae324cd3685514 Mon Sep 17 00:00:00 2001 From: Edison Mondragon Date: Sat, 21 Dec 2024 21:56:38 -0500 Subject: [PATCH 031/104] =?UTF-8?q?Se=20complet=C3=B3=20el=20ejercicio.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../python/edisonlmg.py" | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git "a/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" "b/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" index 0a76d91ebd..0ba813b09b 100644 --- "a/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" +++ "b/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" @@ -7,9 +7,24 @@ # Funcion que comprueba errores -def errores(psw_in): +def validar_cadena(cadena): + if len(cadena) != 4: + return "Error: La cadena debe tener exactamente 4 caracteres." + errores = [] + + for char in cadena: + if char not in "ABC123": + errores.append(f"'{char}'") + + if len(set(cadena)) != len(cadena): + errores.append("Los caracteres no deben repetirse") + + if errores: + return f"Error: {', '.join(errores)}. Solo se permiten A, B, C, 1, 2, y 3, y sin repeticiones." + + return "La cadena es válida." # Funcion que comprueba la contraseña ingresada @@ -18,15 +33,10 @@ def comprobar_psw(psw_in, psw): for x, y in zip(psw_in, psw): if x == y: - print(f'\n{x}: Correcto') - elif x in psw: - print(f'\n{x}: Presente') - else: - print(f'\n{x}: Incorrecto') # Generar una cadena aleatoria de 4 caracteres @@ -50,35 +60,28 @@ def comprobar_psw(psw_in, psw): while intento < 10: intento += 1 - print(f'\nIntento n.° {intento}:') - while True: - - psw_in = input('\nIngresa contraseña: ') + psw_in = input('\nIngresa contraseña: ') + resultado = validar_cadena(psw_in) - if errores(psw_in): - - print(''' - \nLos caracteres ingresados no son correctos. - \nInténtalo de nuevo... - ''') + if resultado == "La cadena es válida.": + pass + else: + print(resultado) + continue if psw_in == psw: - print(''' \n La contraseña es correcta. \n¡Felicidades, a repartir juguetes! ''') - - exit() - + sys.exit() else: - print(f''' \nLa contraseña es incorrecta. Pero descuida, te doy unas pistas: - \n{comprobar_psw(psw_in, psw)} ''') + comprobar_psw(psw_in, psw) print(''' \n¡Oh, no. Papá Noel has olvidado la contraseña! From ed2ec033c875adf95518e4a3c9bcf4a209ec0e7d Mon Sep 17 00:00:00 2001 From: kenysdev Date: Sun, 22 Dec 2024 16:24:26 -0600 Subject: [PATCH 032/104] 21 - js - CALLBACKS --- Roadmap/21 - CALLBACKS/javascript/kenysdev.js | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 Roadmap/21 - CALLBACKS/javascript/kenysdev.js diff --git a/Roadmap/21 - CALLBACKS/javascript/kenysdev.js b/Roadmap/21 - CALLBACKS/javascript/kenysdev.js new file mode 100644 index 0000000000..79336679e4 --- /dev/null +++ b/Roadmap/21 - CALLBACKS/javascript/kenysdev.js @@ -0,0 +1,94 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#21 CALLBACKS +--------------------------------------- + * EJERCICIO: + * Explora el concepto de callback en tu lenguaje creando un ejemplo + * simple (a tu elección) que muestre su funcionamiento. + * + * DIFICULTAD EXTRA (opcional): + * Crea un simulador de pedidos de un restaurante utilizando callbacks. + * Estará formado por una función que procesa pedidos. + * Debe aceptar el nombre del plato, una callback de confirmación, una + * de listo y otra de entrega. + * - Debe imprimir un confirmación cuando empiece el procesamiento. + * - Debe simular un tiempo aleatorio entre 1 a 10 segundos entre + *   procesos. + * - Debe invocar a cada callback siguiendo un orden de procesado. + * - Debe notificar que el plato está listo o ha sido entregado. +*/ +// ________________________________________________________ +function sumNumbers(a, b, callback) { + if (typeof a === "number" && typeof b === "number") { + const result = a + b; + callback(`${a} + ${b}`, result); + } + } + + function myCallback(summands, result) { + if (typeof summands === "string" && typeof result === "number") { + console.log(`La suma de ${summands} es: ${result}`); + } + } + + sumNumbers(6, 6, myCallback); + sumNumbers(5, 2, myCallback); + + // ________________________________________________________ + console.log("\nDIFICULTAD EXTRA"); + + function timeRandom() { + return Math.floor(Math.random() * 10) + 1; + } + + function confirmOrder(name) { + return new Promise((resolve) => { + const time = timeRandom(); + console.log(`* Confirmando ${name}, espere ${time} segundos.`); + setTimeout(() => { + console.log(`- '${name}', ha sido confirmado.\n`); + resolve(); + }, time * 1000); + }); + } + + function prepareOrder(name) { + return new Promise((resolve) => { + const time = timeRandom(); + console.log(`* Preparando ${name}, espere ${time} segundos.`); + setTimeout(() => { + console.log(`- '${name}', está listo.\n`); + resolve(); + }, time * 1000); + }); + } + + function servingOrder(name) { + return new Promise((resolve) => { + const time = timeRandom(); + console.log(`* Sirviendo ${name}, espere ${time} segundos.`); + setTimeout(() => { + console.log(`- '${name}', ha sido entregado.\n`); + resolve(); + }, time * 1000); + }); + } + + async function processOrder(name) { + console.log(`-----\n* Procesando: '${name}' \n-----\n`); + await confirmOrder(name); + await prepareOrder(name); + await servingOrder(name); + } + + async function ordersList() { + await processOrder("Baleadas"); + await processOrder("Tamales"); + await processOrder("Enchiladas"); + } + + ordersList(); + \ No newline at end of file From f94afeafc2fb18014b1db349309ee99517c7eb26 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Sun, 22 Dec 2024 16:25:02 -0600 Subject: [PATCH 033/104] 22 - js - FUNCIONES DE ORDEN SUPERIOR --- .../javascript/kenysdev.js | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 Roadmap/22 - FUNCIONES DE ORDEN SUPERIOR/javascript/kenysdev.js diff --git a/Roadmap/22 - FUNCIONES DE ORDEN SUPERIOR/javascript/kenysdev.js b/Roadmap/22 - FUNCIONES DE ORDEN SUPERIOR/javascript/kenysdev.js new file mode 100644 index 0000000000..2564ec247b --- /dev/null +++ b/Roadmap/22 - FUNCIONES DE ORDEN SUPERIOR/javascript/kenysdev.js @@ -0,0 +1,107 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#22 FUNCIONES DE ORDEN SUPERIOR +--------------------------------------- + * EJERCICIO: + * Explora el concepto de funciones de orden superior en tu lenguaje + * creando ejemplos simples (a tu elección) que muestren su funcionamiento. + * + * DIFICULTAD EXTRA (opcional): + * Dada una lista de estudiantes (con sus nombres, fecha de nacimiento y + * lista de calificaciones), utiliza funciones de orden superior para + * realizar las siguientes operaciones de procesamiento y análisis: + * - Promedio calificaciones: Obtiene una lista de estudiantes por nombre + *   y promedio de sus calificaciones. + * - Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes + *   que tienen calificaciones con un 9 o más de promedio. + * - Nacimiento: Obtiene una lista de estudiantes ordenada desde el más joven. + * - Mayor calificación: Obtiene la calificación más alta de entre todas las + *   de los alumnos. + * - Una calificación debe estar comprendida entre 0 y 10 (admite decimales). +*/ +// ________________________________________________________ +function arithmeticOp(func) { + return function (x, y) { + return func(x, y); + }; +} + +function add(x, y) { + return x + y; +} + +function subtract(x, y) { + return x - y; +} + +function multiply(x, y) { + return x * y; +} + +const addition = arithmeticOp(add); +const subtraction = arithmeticOp(subtract); +const multiplication = arithmeticOp(multiply); + +const rAddition = addition(2, 3); +const rSubtraction = subtraction(10, 5); +const rMultiplication = multiplication(2, 5); + +console.log(`\n` + + `Resultado de la suma: ${rAddition} \n` + + `Resultado de la resta: ${rSubtraction} \n` + + `Resultado de la multip.: ${rMultiplication}`); + +// ________________________________________________________ +console.log("\n----\nDIFICULTAD EXTRA\n"); + +const studentsList = [ + { name: "Ken", dob: "2012-04-21", grades: [9.5, 9.4, 9.3, 9.2] }, + { name: "Ben", dob: "2012-03-20", grades: [8.5, 8.4, 8.3, 8.2] }, + { name: "Ada", dob: "2012-02-19", grades: [7.5, 7.4, 7.3, 7.2] }, + { name: "Zoe", dob: "2012-01-18", grades: [9.0, 9.1, 9.0, 9.1] }, +]; + +// Función de orden superior +function higherOrderFun(msg, printFn) { + return function (students) { + console.log(`\n----\n${msg}`); + students.forEach((student) => printFn(student)); + }; +} + +function printGPA(student) { + const grades = student.grades; + const averageGrade = grades.reduce((sum, grade) => sum + grade, 0) / grades.length; + console.log(`${student.name}: ${averageGrade.toFixed(2)}`); +} + +function printTop(student) { + const grades = student.grades; + const average = grades.reduce((sum, grade) => sum + grade, 0) / grades.length; + if (average >= 9) console.log(student.name); +} + +function printBirth(student) { + console.log(`${student.name}: ${student.dob}`); +} + +function printHighestGrade(student) { + const maxGrade = Math.max(...student.grades); + console.log(`${student.name}: ${maxGrade}`); +} + +const gradePointAverage = higherOrderFun("Promedio de calificaciones:", printGPA); +const topStudents = higherOrderFun("Mejores estudiantes:", printTop); +const birthOrder = higherOrderFun("Orden de nacimiento:", printBirth); +const highestGrade = higherOrderFun("Mayor calificación:", printHighestGrade); + +gradePointAverage(studentsList); +topStudents(studentsList); +birthOrder( + [...studentsList].sort((a, b) => new Date(a.dob) - new Date(b.dob)) +); + +highestGrade(studentsList); From 6b8b4736f89d3ed34e4156c2ef6693205aceef3f Mon Sep 17 00:00:00 2001 From: kenysdev Date: Sun, 22 Dec 2024 16:26:02 -0600 Subject: [PATCH 034/104] 23 - js - SINGLETON --- Roadmap/23 - SINGLETON/javascript/kenysdev.js | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 Roadmap/23 - SINGLETON/javascript/kenysdev.js diff --git a/Roadmap/23 - SINGLETON/javascript/kenysdev.js b/Roadmap/23 - SINGLETON/javascript/kenysdev.js new file mode 100644 index 0000000000..fcf9b7a029 --- /dev/null +++ b/Roadmap/23 - SINGLETON/javascript/kenysdev.js @@ -0,0 +1,72 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#23 PATRONES DE DISEÑO: SINGLETON +--------------------------------------- +* EJERCICIO: + * Explora el patrón de diseño "singleton" y muestra cómo crearlo + * con un ejemplo genérico. + * + * DIFICULTAD EXTRA (opcional): + * Utiliza el patrón de diseño "singleton" para representar una clase que + * haga referencia a la sesión de usuario de una aplicación ficticia. + * La sesión debe permitir asignar un usuario (id, username, nombre y email), + * recuperar los datos del usuario y borrar los datos de la sesión. +*/ +// ________________________________________________________ + +class Singleton { + constructor() { + if (Singleton.instance) { + return Singleton.instance; + } + Singleton.instance = this; + } +} + +const singleton1 = new Singleton(); +const singleton2 = new Singleton(); + +console.log(singleton1 === singleton2); // true + +// ________________________________________________________ +console.log("\nDIFICULTAD EXTRA\n"); + +class UserSession { + constructor() { + if (UserSession.instance) { + return UserSession.instance; + } + this.user = null; + UserSession.instance = this; + } + + setUser(userId, username, name, email) { + this.user = { + id: userId, + username, + name, + email, + }; + } + + getUser() { + return this.user; + } + + logout() { + this.user = null; + } +} + +const session1 = new UserSession(); +session1.setUser(1, "Zoe_1", "Zoe", "Zoe@gm.com"); +console.log(session1.getUser()); +session1.logout(); + +const session2 = new UserSession(); +session2.setUser(2, "Ben_1", "Ben", "Ben@gm.com"); +console.log(session2.getUser()); +session2.logout(); From 3ed2f9d8581f52b27c727b1450e60edd9d53addc Mon Sep 17 00:00:00 2001 From: kenysdev Date: Sun, 22 Dec 2024 16:26:43 -0600 Subject: [PATCH 035/104] 24 - js - DECORADORES --- .../24 - DECORADORES/javascript/kenysdev.js | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Roadmap/24 - DECORADORES/javascript/kenysdev.js diff --git a/Roadmap/24 - DECORADORES/javascript/kenysdev.js b/Roadmap/24 - DECORADORES/javascript/kenysdev.js new file mode 100644 index 0000000000..f53641e055 --- /dev/null +++ b/Roadmap/24 - DECORADORES/javascript/kenysdev.js @@ -0,0 +1,70 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#24 DECORADORES +--------------------------------------- + * EJERCICIO: + * Explora el concepto de "decorador" y muestra cómo crearlo + * con un ejemplo genérico. + * + * DIFICULTAD EXTRA (opcional): + * Crea un decorador que sea capaz de contabilizar cuántas veces + * se ha llamado a una función y aplícalo a una función de tu elección. +*/ +// ________________________________________________________ +function myDecorator(func) { + return function (...args) { + console.log("\nAntes de que se llame a la función."); + func(...args); + console.log("Después de llamarla."); + }; + } + + function sayHello(firstName, lastName) { + console.log(`Hola, ${firstName} ${lastName}!`); + } + + const decoratedSayHello = myDecorator(sayHello); + decoratedSayHello("Zoe", "Roy"); + + console.log("\n______________________"); + function classDecorator(Class) { + return class extends Class { + greet() { + console.log("\nAntes de llamar al método"); + super.greet(); + console.log("Después de llamar al método"); + } + }; + } + + // ________________________________________________________ + console.log("DIFICULTAD EXTRA"); + + function countCalls(func) { + const wrapper = function (...args) { + wrapper.calls++; + func(...args); + console.log(`Ha sido llamada ${wrapper.calls} veces.`); + }; + wrapper.calls = 0; + return wrapper; + } + + const functionA = countCalls(function (funcName) { + console.log(`\nLa función '${funcName}':`); + }); + + const functionB = countCalls(function (funcName, example) { + console.log(`\nLa función ${funcName} - ${example}:`); + }); + + functionA("A"); + functionA("A"); + functionA("A"); + + functionB("B", "args"); + functionB("B", "args"); + \ No newline at end of file From 53aef0d88eefd397c72158c67b2f4fb3cd34c5ea Mon Sep 17 00:00:00 2001 From: kenysdev Date: Sun, 22 Dec 2024 16:27:37 -0600 Subject: [PATCH 036/104] 25 - js - LOGS --- Roadmap/25 - LOGS/javascript/kenysdev.js | 99 ++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 Roadmap/25 - LOGS/javascript/kenysdev.js diff --git a/Roadmap/25 - LOGS/javascript/kenysdev.js b/Roadmap/25 - LOGS/javascript/kenysdev.js new file mode 100644 index 0000000000..de02be45dd --- /dev/null +++ b/Roadmap/25 - LOGS/javascript/kenysdev.js @@ -0,0 +1,99 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________ +#25 LOGS +--------------------------------------- +* EJERCICIO: + * Explora el concepto de "logging" en tu lenguaje. Configúralo y muestra + * un ejemplo con cada nivel de "severidad" disponible. + * + * DIFICULTAD EXTRA (opcional): + * Crea un programa ficticio de gestión de tareas que permita añadir, eliminar + * y listar dichas tareas. + * - Añadir: recibe nombre y descripción. + * - Eliminar: por nombre de la tarea. + * Implementa diferentes mensajes de log que muestren información según la + * tarea ejecutada (a tu elección). + * Utiliza el log para visualizar el tiempo de ejecución de cada tarea. +*/ +// ________________________________________________________ + +import { createLogger, transports, format } from 'winston'; + +const logger = createLogger({ + level: 'debug', + format: format.combine( + format.timestamp(), + format.printf(({ timestamp, level, message }) => { + return `${timestamp} - ${level} - ${message}`; + }) + ), + transports: [ + new transports.Console() + ] +}); + +logger.debug('Depuración'); + +logger.info('Informativo'); + +logger.warn('Advertencia'); + +logger.error('Error'); +logger.error('Error crítico'); + +// ________________________________________________________ +console.log("\nDIFICULTAD EXTRA"); + +function showTime(func) { + return async function (...args) { + const startTime = Date.now(); + await func.apply(this, args); + const endTime = Date.now(); + const executionTime = (endTime - startTime) / 1000; + logger.debug(`Tiempo de ejecución de ${func.name}: ${executionTime.toFixed(21)} segundos.`); + }; +} + +class Program { + constructor() { + this.tasks = {}; + logger.debug('Se inició instancia de la clase.'); + } + + add = showTime(async function (name, description) { + this.tasks[name] = description; + logger.info('Se agregó una tarea.'); + }); + + delete = showTime(async function (name) { + if (name in this.tasks) { + delete this.tasks[name]; + logger.info(`Tarea '${name}' eliminada.`); + } else { + logger.warn(`No se encontró la tarea '${name}'.`); + } + }); + + showList = showTime(async function () { + logger.info('Lista de tareas'); + for (const [task, des] of Object.entries(this.tasks)) { + console.log(`${task} -- ${des}`); + } + }); +} + +const tasks = new Program(); + +(async () => { + await tasks.add("a", ".1"); + await tasks.add("b", "2"); + await tasks.add("c", "3"); + + await tasks.delete("a"); + await tasks.showList(); + + await tasks.delete("a"); +})(); From 101a3fa82cd393ac6be6a49cb2ec254032f2e484 Mon Sep 17 00:00:00 2001 From: Kenys Alvarado Date: Mon, 23 Dec 2024 13:14:42 -0600 Subject: [PATCH 037/104] 26 - js - SOLID SRP --- Roadmap/26 - SOLID SRP/javascript/kenysdev.js | 269 ++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 Roadmap/26 - SOLID SRP/javascript/kenysdev.js diff --git a/Roadmap/26 - SOLID SRP/javascript/kenysdev.js b/Roadmap/26 - SOLID SRP/javascript/kenysdev.js new file mode 100644 index 0000000000..b1d79f38ca --- /dev/null +++ b/Roadmap/26 - SOLID SRP/javascript/kenysdev.js @@ -0,0 +1,269 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +___________________________________________________ +#26 SOLID: PRINCIPIO DE RESPONSABILIDAD ÚNICA (SRP) +--------------------------------------------------- +* EJERCICIO: + * Explora el "Principio SOLID de Responsabilidad Única (Single Responsibility + * Principle, SRP)" y crea un ejemplo simple donde se muestre su funcionamiento + * de forma correcta e incorrecta. + * + * DIFICULTAD EXTRA (opcional): + * Desarrolla un sistema de gestión para una biblioteca. El sistema necesit + * manejar diferentes aspectos como el registro de libros, la gestión de usuarios + * y el procesamiento de préstamos de libros. + * Requisitos: + * 1. Registrar libros: El sistema debe permitir agregar nuevos libros con + * información básica como título, autor y número de copias disponibles. + * 2. Registrar usuarios: El sistema debe permitir agregar nuevos usuarios con + * información básica como nombre, número de identificación y correo electrónico. + * 3. Procesar préstamos de libros: El sistema debe permitir a los usuarios + * tomar prestados y devolver libros. + * Instrucciones: + * 1. Diseña una clase que no cumple el SRP: Crea una clase Library que maneje + * los tres aspectos mencionados anteriormente (registro de libros, registro de + * usuarios y procesamiento de préstamos). + * 2. Refactoriza el código: Separa las responsabilidades en diferentes clases + * siguiendo el Principio de Responsabilidad Única. +*/ +// ________________________________________________________ +// SIN APLICAR SRP +// --------------- +class Program { + constructor() { + this.customers = []; + this.suppliers = []; + } + + addCustomer(name) { + this.customers.push(name); + } + + removeCustomer(name) { + this.customers = this.customers.filter((customer) => customer !== name); + } + + addSupplier(name) { + this.suppliers.push(name); + } + + removeSupplier(name) { + this.suppliers = this.suppliers.filter((supplier) => supplier !== name); + } + + printData() { + console.log("Clientes:", this.customers); + console.log("Proveedores:", this.suppliers); + } + } + +// ________________________________________________________ +// APLICANDO SRP +// --------------- + +class Customers { + constructor() { + this.customers = []; + } + + add(name) { + this.customers.push(name); + } + + remove(name) { + this.customers = this.customers.filter((customer) => customer !== name); + } + + print() { + console.log("Clientes:", this.customers); + } + } + + class Suppliers { + constructor() { + this.suppliers = []; + } + + add(name) { + this.suppliers.push(name); + } + + remove(name) { + this.suppliers = this.suppliers.filter((supplier) => supplier !== name); + } + + print() { + console.log("Proveedores:", this.suppliers); + } + } + + const customers = new Customers(); + const suppliers = new Suppliers(); + + customers.add("Cliente A"); + customers.add("Cliente B"); + suppliers.add("Proveedor X"); + + customers.print(); + suppliers.print(); + + customers.remove("Cliente A"); + suppliers.remove("Proveedor X"); + + customers.print(); + suppliers.print(); + + +// ________________________________________________________ +// DIFICULTAD EXTRA +// --------------- +// SIN APLICAR SRP +// --------------- +class Library { + constructor() { + this.books = {}; + this.users = {}; + this.borrowed = {}; + } + + addBook(id, title, author, stock) { + if (this.books[id]) { + this.books[id].stock += stock; + this.books[id].available += stock; + console.log("El libro ya existe, se actualizó el inventario."); + } else { + this.books[id] = { title, author, stock, available: stock }; + console.log(`Libro '${title}' agregado.`); + } + } + + addUser(id, name, email) { + if (this.users[id]) { + console.log("El usuario ya existe."); + } else { + this.users[id] = { name, email }; + console.log(`Usuario '${name}' agregado.`); + } + } + + lendBook(borrowId, userId, bookId) { + if (!this.books[bookId]) return console.log("El libro no existe."); + if (!this.users[userId]) return console.log("El usuario no existe."); + if (this.books[bookId].available <= 0) + return console.log("El libro no está disponible."); + + this.borrowed[borrowId] = { userId, bookId }; + this.books[bookId].available -= 1; + console.log(`Libro '${bookId}' prestado.`); + } + + returnBook(borrowId) { + if (!this.borrowed[borrowId]) return console.log("No existe el préstamo."); + + const { bookId } = this.borrowed[borrowId]; + this.books[bookId].available += 1; + delete this.borrowed[borrowId]; + console.log(`Libro '${bookId}' devuelto.`); + } +} + +// ________________________________________________________ +// Aplicando SRP: +// --------------- + +// Singleton +class LibraryData { + constructor() { + if (!LibraryData.instance) { + this.books = {}; + this.users = {}; + this.borrowed = {}; + LibraryData.instance = this; + } + return LibraryData.instance; + } +} + +const data = new LibraryData(); + +class Books { + add(id, title, author, stock) { + if (data.books[id]) { + data.books[id].stock += stock; + data.books[id].available += stock; + console.log("El libro ya existe, se actualizó el inventario."); + } else { + data.books[id] = { title, author, stock, available: stock }; + console.log(`Libro '${title}' agregado.`); + } + } + + print() { + console.log("Libros:", data.books); + } +} + +class Users { + add(id, name, email) { + if (data.users[id]) { + console.log("El usuario ya existe."); + } else { + data.users[id] = { name, email }; + console.log(`Usuario '${name}' agregado.`); + } + } + + print() { + console.log("Usuarios:", data.users); + } +} + +class BorrowedBooks { + lend(borrowId, userId, bookId) { + if (!data.books[bookId]) return console.log("El libro no existe."); + if (!data.users[userId]) return console.log("El usuario no existe."); + if (data.books[bookId].available <= 0) + return console.log("El libro no está disponible."); + + data.borrowed[borrowId] = { userId, bookId }; + data.books[bookId].available -= 1; + console.log(`Libro '${bookId}' prestado.`); + } + + returnBook(borrowId) { + if (!data.borrowed[borrowId]) return console.log("No existe el préstamo."); + + const { bookId } = data.borrowed[borrowId]; + data.books[bookId].available += 1; + delete data.borrowed[borrowId]; + console.log(`Libro '${bookId}' devuelto.`); + } + + print() { + console.log("Préstamos:", data.borrowed); + } +} + +// --------------- +const books = new Books(); +const users = new Users(); +const borrowed = new BorrowedBooks(); +console.log("\nDIFICULTAD EXTRA\n") +books.add(1, "Libro A", "Autor A", 2); +books.add(2, "Libro B", "Autor B", 3); + +users.add(101, "Usuario 1", "user1@example.com"); +users.add(102, "Usuario 2", "user2@example.com"); + +borrowed.lend(201, 101, 1); +borrowed.lend(202, 102, 2); + +books.print(); +users.print(); +borrowed.print(); + +borrowed.returnBook(201); +books.print(); +borrowed.print(); From ad2f04351cffc26d753730ea1a7fe948ba948cb6 Mon Sep 17 00:00:00 2001 From: Kenys Alvarado Date: Mon, 23 Dec 2024 13:32:22 -0600 Subject: [PATCH 038/104] 27 - js - SOLID OCP --- Roadmap/27 - SOLID OCP/javascript/kenysdev.js | 181 ++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 Roadmap/27 - SOLID OCP/javascript/kenysdev.js diff --git a/Roadmap/27 - SOLID OCP/javascript/kenysdev.js b/Roadmap/27 - SOLID OCP/javascript/kenysdev.js new file mode 100644 index 0000000000..edf9f9ce93 --- /dev/null +++ b/Roadmap/27 - SOLID OCP/javascript/kenysdev.js @@ -0,0 +1,181 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +__________________________________________ +#27 SOLID: PRINCIPIO ABIERTO-CERRADO (OCP) +------------------------------------------ + * EJERCICIO: + * Explora el "Principio SOLID Abierto-Cerrado (Open-Close Principle, OCP)" + * y crea un ejemplo simple donde se muestre su funcionamiento + * de forma correcta e incorrecta. + * + * DIFICULTAD EXTRA (opcional): + * Desarrolla una calculadora que necesita realizar diversas operaciones matemáticas. + * Requisitos: + * - Debes diseñar un sistema que permita agregar nuevas operaciones utilizando el OCP. + * Instrucciones: + * 1. Implementa las operaciones de suma, resta, multiplicación y división. + * 2. Comprueba que el sistema funciona. + * 3. Agrega una quinta operación para calcular potencias. + * 4. Comprueba que se cumple el OCP. +*/ + +// ________________________________________________________ +// SIN APLICAR OCP +// --------------- +class Product_ { + constructor(name, price, type) { + this.name = name; + this.price = price; + this.type = type; + } + + finalPrice() { + let discount = 0; + + if (this.type === "electronics") { + discount = this.price * 0.05; + } else if (this.type === "clothing") { + discount = this.price > 50 ? 10 : 0; + } + // Si se necesita un nuevo tipo, habría que añadir más condicionales aquí + + return this.price - discount; + } +} + +function processProduct_(product) { + console.log(`Producto: ${product.name}, Precio final: ${product.finalPrice()}`); +} + + +// ________________________________________________________ +// APLICANDO OCP +// --------------- +class Product { + constructor(name, price) { + if (new.target === Product) { + throw new Error("Cannot instantiate an abstract class."); + } + this.name = name; + this.price = price; + } + + applyDiscount() { + throw new Error("Method 'applyDiscount()' must be implemented."); + } + + finalPrice() { + return this.price - this.applyDiscount(); + } +} + +// Clase concreta +class ElectronicsProduct extends Product { + applyDiscount() { + return this.price * 0.05; // Descuento del 5% + } +} + +// Clase concreta +class ClothingProduct extends Product { + applyDiscount() { + return this.price > 50 ? 10 : 0; // Descuento basado en la condición + } +} + +function processProduct(product) { + console.log(`Producto: ${product.name}, Precio final: ${product.finalPrice()}`); +} + +// Pruebas +const laptop = new ElectronicsProduct("Laptop", 700); +const pants = new ClothingProduct("Pants", 55); + +processProduct(laptop); // Producto: Laptop, Precio final: 665 +processProduct(pants); // Producto: Pants, Precio final: 45 + +// ________________________________________________________ +// DIFICULTAD EXTRA +// --------------- + +// Clase base +class Calculator { + constructor(a, b) { + if (typeof a === "number" && typeof b === "number") { + this.a = a; + this.b = b; + } else { + this.a = null; + this.b = null; + console.error("Operación inválida."); + } + } + + // Método abstracto simulado + mathOperation() { + throw new Error("El método 'mathOperation()' debe ser implementado."); + } + + printResult() { + if (this.a !== null && this.b !== null) { + console.log(`Es: ${this.mathOperation()}`); + } else { + console.error("Campos incorrectos."); + } + } +} + +// Clases concretas +class Sum extends Calculator { + mathOperation() { + console.log(`\nSuma de ${this.a} + ${this.b}:`); + return this.a + this.b; + } +} + +class Subtraction extends Calculator { + mathOperation() { + console.log(`\nResta de ${this.a} - ${this.b}:`); + return this.a - this.b; + } +} + +class Multiplication extends Calculator { + mathOperation() { + console.log(`\nMultiplicación de ${this.a} * ${this.b}:`); + return this.a * this.b; + } +} + +class Division extends Calculator { + mathOperation() { + console.log(`\nDivisión de ${this.a} / ${this.b}:`); + return this.a / this.b; + } +} + +class Pow extends Calculator { + mathOperation() { + console.log(`\nPotencia de ${this.a} ^ ${this.b}:`); + return this.a ** this.b; + } +} + +// Pruebas +const sum = new Sum(2, 2); +sum.printResult(); + +const subtraction = new Subtraction(2, 2); +subtraction.printResult(); + +const multiplication = new Multiplication(2, 2); +multiplication.printResult(); + +const division = new Division(2, 2); +division.printResult(); + +const power = new Pow(2, 2); +power.printResult(); + From 7d07781fda21d3407f1d45f21760943832f59592 Mon Sep 17 00:00:00 2001 From: Kenys Alvarado Date: Mon, 23 Dec 2024 13:32:39 -0600 Subject: [PATCH 039/104] 28 - js - SOLID LSP --- Roadmap/28 - SOLID LSP/javascript/kenysdev.js | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 Roadmap/28 - SOLID LSP/javascript/kenysdev.js diff --git a/Roadmap/28 - SOLID LSP/javascript/kenysdev.js b/Roadmap/28 - SOLID LSP/javascript/kenysdev.js new file mode 100644 index 0000000000..0a4fca6ab3 --- /dev/null +++ b/Roadmap/28 - SOLID LSP/javascript/kenysdev.js @@ -0,0 +1,137 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +___________________________________________________ +#28 SOLID: PRINCIPIO DE SUSTITUCIÓN DE LISKOV (LSP) +--------------------------------------------------- + * EJERCICIO: + * Explora el "Principio SOLID de Sustitución de Liskov (Liskov Substitution Principle, LSP)" + * y crea un ejemplo simple donde se muestre su funcionamiento + * de forma correcta e incorrecta. + * + * DIFICULTAD EXTRA (opcional): + * Crea una jerarquía de vehículos. Todos ellos deben poder acelerar y frenar, así como + * cumplir el LSP. + * Instrucciones: + * 1. Crea la clase Vehículo. + * 2. Añade tres subclases de Vehículo. + * 3. Implementa las operaciones "acelerar" y "frenar" como corresponda. + * 4. Desarrolla un código que compruebe que se cumple el LSP. +*/ +// ________________________________________________________ +// Base +class Animal { + constructor(name) { + if (new.target === Animal) { + throw new Error("No se puede instanciar una clase abstracta."); + } + this.name = name; + } + + makeSound() { + throw new Error("El método 'makeSound' debe ser implementado."); + } +} + +// Clases derivadas +class Dog extends Animal { + makeSound() { + return `${this.name} hace Woof`; + } +} + +class Cat extends Animal { + makeSound() { + return `${this.name} hace Meow`; + } +} + +// _____________________ +// Pruebas +const dog = new Dog("Max"); +console.log(dog.makeSound()); // Max hace Woof + +const cat = new Cat("Milo"); +console.log(cat.makeSound()); // Milo hace Meow + +// ________________________________________________________ +// DIFICULTAD EXTRA +// ---------------- +// Clase base +class Vehicle { + constructor(brand, model) { + if (this.constructor === Vehicle) { + throw new Error("No se puede instanciar la clase abstracta 'Vehicle'"); + } + this._brand = brand; + this._model = model; + } + + get brand() { + return this._brand; + } + + get model() { + return this._model; + } + + accelerate() { + throw new Error("Método 'accelerate' no implementado"); + } + + brake() { + throw new Error("Método 'brake' no implementado"); + } +} + +// Clases derivadas +class Car extends Vehicle { + accelerate() { + return `Acelerando auto: ${this.brand} - ${this.model}`; + } + + brake() { + return `Frenando auto: ${this.brand} - ${this.model}`; + } +} + +class Motorcycle extends Vehicle { + accelerate() { + return `Acelerando Motocicleta: ${this.brand} - ${this.model}`; + } + + brake() { + return `Frenando Motocicleta: ${this.brand} - ${this.model}`; + } +} + +class Truck extends Vehicle { + accelerate() { + return `Acelerando Camión: ${this.brand} - ${this.model}`; + } + + brake() { + return `Frenando Camión: ${this.brand} - ${this.model}`; + } +} + +// Verificar cumplimiento de LSP +function testSubClass(subClass) { + console.log("\nPropiedades:"); + console.log(`${subClass.brand} - ${subClass.model}`); + + console.log("\nMétodos:"); + console.log(subClass.accelerate()); + console.log(subClass.brake()); +} + +// Instanciando +const car = new Car("Honda", "Civic"); +testSubClass(car); + +const motorcycle = new Motorcycle("Kawasaki", "Ninja"); +testSubClass(motorcycle); + +const truck = new Truck("Ford", "Raptor"); +testSubClass(truck); From beefd0faf56e2825391015787d896806172a0d4b Mon Sep 17 00:00:00 2001 From: Kenys Alvarado Date: Mon, 23 Dec 2024 13:32:56 -0600 Subject: [PATCH 040/104] 29 - js - SOLID ISP --- Roadmap/29 - SOLID ISP/javascript/kenysdev.js | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 Roadmap/29 - SOLID ISP/javascript/kenysdev.js diff --git a/Roadmap/29 - SOLID ISP/javascript/kenysdev.js b/Roadmap/29 - SOLID ISP/javascript/kenysdev.js new file mode 100644 index 0000000000..3af0c38257 --- /dev/null +++ b/Roadmap/29 - SOLID ISP/javascript/kenysdev.js @@ -0,0 +1,149 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +___________________________________________________ +#29 SOLID: PRINCIPIO DE SEGREGACIÓN DE INTERFACES (ISP) +--------------------------------------------------- + * EJERCICIO: + * Explora el "Principio SOLID de Segregación de Interfaces (Interface Segregation Principle, ISP)" + * y crea un ejemplo simple donde se muestre su funcionamiento de forma correcta e incorrecta. + * + * DIFICULTAD EXTRA (opcional): + * Crea un gestor de impresoras. + * Requisitos: + * 1. Algunas impresoras sólo imprimen en blanco y negro. + * 2. Otras sólo a color. + * 3. Otras son multifunción, pueden imprimir, escanear y enviar fax. + * Instrucciones: + * 1. Implementa el sistema, con los diferentes tipos de impresoras y funciones. + * 2. Aplica el ISP a la implementación. + * 3. Desarrolla un código que compruebe que se cumple el principio. +*/ +// ________________________________________________________ +// Abstracciones +class AbsPlayable { + play() { + throw new Error("El método 'play' debe ser implementado."); + } +} + +class AbsDisplayable { + display() { + throw new Error("El método 'display' debe ser implementado."); + } +} + +//__________________________ +// Implementar abstracciones + +class Speaker extends AbsPlayable { + play() { + console.log("El altavoz está reproduciendo música."); + } +} + +class Phone extends AbsPlayable { + play() { + console.log("El teléfono está reproduciendo música."); + } +} + +Object.assign(Phone.prototype, AbsDisplayable.prototype); + +Phone.prototype.display = function() { + console.log("El teléfono está mostrando la pantalla de reproducción."); +}; + +//__________________________ +// Utilización +const speaker = new Speaker(); +speaker.play(); + +const phone = new Phone(); +phone.play(); +phone.display(); + +// ________________________________________________________ +// DIFICULTAD EXTRA +// ---------------- + +// Abstracciones +class AbsPrinter { + printFile(file) { + throw new Error("El método 'printFile' debe ser implementado."); + } +} + +class AbsScanner { + toScan(pathSave) { + throw new Error("El método 'toScan' debe ser implementado."); + } +} + +class AbsFax { + sendFile(file, phoneNumber) { + throw new Error("El método 'sendFile' debe ser implementado."); + } +} + +//__________________________ +// Implementar abstracciones +class MonoPrinter extends AbsPrinter { + printFile(file) { + console.log("\nImpresora blanco y negro:"); + console.log(`${file} se imprimió.`); + } +} + +class ColorPrinter extends AbsPrinter { + printFile(file) { + console.log("\nImpresora a color:"); + console.log(`${file} se imprimió.`); + } +} + +class Scanner extends AbsScanner { + toScan(pathSave) { + console.log("\nEscaneo realizado, Guardado en:", pathSave); + } +} + +class Fax extends AbsFax { + sendFile(file, phoneNumber) { + console.log(`\n- ${file} fue enviado a: ${phoneNumber}`); + } +} + +class MultiFunctionPrinter { + constructor() { + this.monoPrinter = new MonoPrinter(); + this.colorPrinter = new ColorPrinter(); + this.scanner = new Scanner(); + this.fax = new Fax(); + } +} + +//__________________________ +// Utilización +console.log("\nDIFICULTAD EXTRA"); + +const monoPrinter = new MonoPrinter(); +monoPrinter.printFile("filex.pdf"); + +const colorPrinter = new ColorPrinter(); +colorPrinter.printFile("filex.pdf"); + +const scanner = new Scanner(); +scanner.toScan("c:\\docs"); + +const fax = new Fax(); +fax.sendFile("filex.pdf", 12345678); + +console.log("\n___________\nMultifunción:"); +const multifunction = new MultiFunctionPrinter(); + +multifunction.monoPrinter.printFile("filex.pdf"); +multifunction.colorPrinter.printFile("filex.pdf"); +multifunction.scanner.toScan("c:\\docs"); +multifunction.fax.sendFile("filex.pdf", 12345678); From 4f4cb1d4b06a2a1aa13a794a40d5d416fa4fabe0 Mon Sep 17 00:00:00 2001 From: Kenys Alvarado Date: Mon, 23 Dec 2024 13:33:14 -0600 Subject: [PATCH 041/104] 30 - js - SOLID DIP --- Roadmap/30 - SOLID DIP/javascript/kenysdev.js | 159 ++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 Roadmap/30 - SOLID DIP/javascript/kenysdev.js diff --git a/Roadmap/30 - SOLID DIP/javascript/kenysdev.js b/Roadmap/30 - SOLID DIP/javascript/kenysdev.js new file mode 100644 index 0000000000..1e48b0428f --- /dev/null +++ b/Roadmap/30 - SOLID DIP/javascript/kenysdev.js @@ -0,0 +1,159 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#30 SOLID: PRINCIPIO DE INVERSIÓN DE DEPENDENCIAS (DIP) +------------------------------------------------------- +* EJERCICIO: + * Explora el "Principio SOLID de Inversión de Dependencias (Dependency Inversion + * Principle, DIP)" y crea un ejemplo simple donde se muestre su funcionamiento + * de forma correcta e incorrecta. + * + * DIFICULTAD EXTRA (opcional): + * Crea un sistema de notificaciones. + * Requisitos: + * 1. El sistema puede enviar Email, PUSH y SMS (implementaciones específicas). + * 2. El sistema de notificaciones no puede depender de las implementaciones específicas. + * Instrucciones: + * 1. Crea la interfaz o clase abstracta. + * 2. Desarrolla las implementaciones específicas. + * 3. Crea el sistema de notificaciones usando el DIP. + * 4. Desarrolla un código que compruebe que se cumple el principio. +*/ +// ________________________________________________________ +// SIN APLICAR DIP +// --------------- +// Clase concreta +class FileStorage_ { + save(data) { + console.log(`Datos guardados en archivo: ${data}`); + } +} + +// Clase de alto nivel +class DataManager_ { + constructor() { + // Dependencia directa de la clase concreta. + this.fileStorage = new FileStorage_(); + } + + storeData(data) { + this.fileStorage.save(data); + } +} + +// ________________________________________________________ +// APLICANDO DIP +// --------------- +// Abstracción +class AbcStorage { + save(data) { + throw new Error("El método 'save' debe ser implementado."); + } +} + +// Implementación concreta +class FileStorage extends AbcStorage { + save(data) { + console.log(`Guardado en archivo: ${data}`); + } +} + +// Implementación concreta +class DatabaseStorage extends AbcStorage { + save(data) { + console.log(`Guardado en base de datos: ${data}`); + } +} + +// Clase de alto nivel +class DataManager { + constructor(storage) { + // Dependencia de la abstracción + if (!(storage instanceof AbcStorage)) { + throw new Error("La dependencia debe implementar AbcStorage"); + } + this.storage = storage; + } + + storeData(data) { + this.storage.save(data); + } +} + +// Uso +const dataToStore = "Ejemplo de datos x"; +const fileStorage = new FileStorage(); +const dataManagerFile = new DataManager(fileStorage); +dataManagerFile.storeData(dataToStore); +const databaseStorage = new DatabaseStorage(); +const dataManagerDatabase = new DataManager(databaseStorage); +dataManagerDatabase.storeData(dataToStore); + +// ________________________________________________________ +// DIFICULTAD EXTRA +// ---------------- + +// Abstracción +class AbcMessageService { + send(to, message) { + throw new Error("El método 'send' debe ser implementado."); + } +} + +// Implementación: Email +class EmailService extends AbcMessageService { + send(to, message) { + console.log("Correo enviado a:", to); + console.log("Mensaje:", message); + } +} + +// Implementación: PUSH +class PUSHService extends AbcMessageService { + send(to, message) { + console.log("Notificación PUSH enviada a:", to); + console.log("Mensaje:", message); + } +} + +// Implementación: SMS +class SMSService extends AbcMessageService { + send(to, message) { + console.log("Mensaje SMS enviado a:", to); + console.log("Mensaje:", message); + } +} + +// Módulo de alto nivel +class NotificationSystem { + constructor(service) { + if (!(service instanceof AbcMessageService)) { + throw new Error("La dependencia debe implementar AbcMessageService"); + } + this.service = service; + } + + notify(to, message) { + this.service.send(to, message); + } +} + +// Inyección de dependencias +function testNotificationSystem(to, message, service) { + const serviceNotifier = new NotificationSystem(service); + serviceNotifier.notify(to, message); +} + +console.log("\nDIFICULTAD EXTRA"); + +// Asignación +const emailService = new EmailService(); +const pushService = new PUSHService(); +const smsService = new SMSService(); + +// Comprobación: +testNotificationSystem("ejm@gg.com", "abcdsf", emailService); +testNotificationSystem("user01", "123456", pushService); +testNotificationSystem(123456789, "aeiou", smsService); From 1e5d3aae338ee6d3eb50e56c22dba4973b7c7e26 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Tue, 24 Dec 2024 11:32:16 -0600 Subject: [PATCH 042/104] =?UTF-8?q?31=20-=20js=20-=20SIMULADOR=20JUEGOS=20?= =?UTF-8?q?OL=C3=8DMPICOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javascript/kenysdev.js" | 199 ++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 "Roadmap/31 - SIMULADOR JUEGOS OL\303\215MPICOS/javascript/kenysdev.js" diff --git "a/Roadmap/31 - SIMULADOR JUEGOS OL\303\215MPICOS/javascript/kenysdev.js" "b/Roadmap/31 - SIMULADOR JUEGOS OL\303\215MPICOS/javascript/kenysdev.js" new file mode 100644 index 0000000000..2ec358eb30 --- /dev/null +++ "b/Roadmap/31 - SIMULADOR JUEGOS OL\303\215MPICOS/javascript/kenysdev.js" @@ -0,0 +1,199 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#31 * SIMULADOR JUEGOS OLÍMPICOS +------------------------------------------------------- +* EJERCICIO: +* ¡Los JJOO de París 2024 han comenzado! +* Crea un programa que simule la celebración de los juegos. +* El programa debe permitir al usuario registrar eventos y participantes, +* realizar la simulación de los eventos asignando posiciones de manera aleatoria +* y generar un informe final. Todo ello por terminal. + * Requisitos: + * 1. Registrar eventos deportivos. + * 2. Registrar participantes por nombre y país. + * 3. Simular eventos de manera aleatoria en base a los participantes (mínimo 3). + * 4. Asignar medallas (oro, plata y bronce) basándose en el resultado del evento. + * 5. Mostrar los ganadores por cada evento. + * 6. Mostrar el ranking de países según el número de medallas. + * Acciones: + * 1. Registro de eventos. + * 2. Registro de participantes. + * 3. Simulación de eventos. + * 4. Creación de informes. + * 5. Salir del programa. +*/ +// ________________________________________________________ + +const readline = require('readline'); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +const GlobalConstants = { + MEDALS: ['🥇 Oro', '🥈 Plata', '🥉 Bronce'], + MENU: ` +SIMULADOR JUEGOS OLÍMPICOS: +-------------------------------------------------- +| 1. Registrar evento | 4. Crear informes | +| 2. Registrar participante | 5. Salir | +| 3. Simulación de eventos | | +--------------------------------------------------` +}; + +const data = { + events: [], + participants: [], + simulations: [] +}; + +function getInput(promptText, callback, type = "string") { + rl.question(promptText, function processInput(input) { + if (!input || input.trim() === "") { + rl.question("La entrada no puede estar vacía. Intente de nuevo: ", processInput); + return; + } + + if (type === "number") { + const numValue = Number(input.trim()); + if (isNaN(numValue)) { + rl.question("Por favor ingresa un número válido: ", processInput); + return; + } + callback(numValue); + return; + } + + callback(input.trim()); + }); +} + +function closeInput() { + rl.close(); +} + +const Events = { + addEvent(onComplete) { + getInput("Deporte: ", (sport) => { + data.events.push(sport); + console.log(`${sport} fue agregado`); + onComplete(); + }); + } +}; + +const Participants = { + addParticipant(onComplete) { + if (data.events.length === 0) { + console.log("No existe evento en cuál participar. Agrega un evento primero."); + onComplete(); + return; + } + + console.log("Selecciona el evento donde participará:"); + data.events.forEach((event, i) => console.log(`${i}. ${event}`)); + + getInput("Id del evento: ", (eventId) => { + if (eventId < 0 || eventId >= data.events.length) { + console.log("Id no encontrado."); + onComplete(); + return; + } + + getInput("Nombre del participante: ", (name) => { + getInput("País del participante: ", (country) => { + data.participants.push({ name, country, eventId }); + console.log(`${name} fue agregado`); + onComplete(); + }); + }); + }, "number"); + } +}; + +const Simulation = { + startSimulation() { + if (data.events.length === 0) { + console.log("Debe haber al menos un evento."); + return; + } + + if (data.participants.length < 3) { + console.log("Debe haber al menos tres participantes."); + return; + } + + const results = data.events.map((event, eventId) => { + const participantsInEvent = data.participants.filter(p => p.eventId === eventId); + if (participantsInEvent.length < 3) { + return { event, winners: null }; + } + + participantsInEvent.forEach(p => (p.score = Math.floor(Math.random() * 100))); + participantsInEvent.sort((a, b) => b.score - a.score); + participantsInEvent.slice(0, 3).forEach((p, i) => (p.medal = GlobalConstants.MEDALS[i])); + return { event, winners: participantsInEvent.slice(0, 3) }; + }); + + data.simulations.push(results); + console.log(`Simulación #${data.simulations.length} creada.`); + } +}; + +const Reports = { + generateReport() { + if (data.simulations.length === 0) { + console.log("Aún no hay simulaciones creadas."); + return; + } + + data.simulations.forEach((simulation, index) => { + console.log(`\nSimulación #${index + 1}`); + simulation.forEach(({ event, winners }) => { + console.log(`\nEvento: ${event}`); + if (!winners) { + console.log("Cancelado por falta de participantes."); + return; + } + + winners.forEach(({ name, country, score, medal }, i) => { + console.log(`${i + 1}. ${name} (${country}) -> Puntos: ${score}, Medalla: ${medal}`); + }); + }); + }); + } +}; + +function showMenu() { + console.log(GlobalConstants.MENU); + getInput("Opción: ", (option) => { + switch (option) { + case "1": + Events.addEvent(() => showMenu()); + break; + case "2": + Participants.addParticipant(() => showMenu()); + break; + case "3": + Simulation.startSimulation(); + showMenu(); + break; + case "4": + Reports.generateReport(); + showMenu(); + break; + case "5": + console.log("Adiós."); + closeInput(); + break; + default: + console.log("Selecciona una opción válida (1-5)."); + showMenu(); + } + }); +} + +showMenu() From d3010f94870dd8e140d98ce66aff46873fdb8acb Mon Sep 17 00:00:00 2001 From: kenysdev Date: Tue, 24 Dec 2024 11:32:33 -0600 Subject: [PATCH 043/104] 32 - js - BATALLA DEADPOOL Y WOLVERINE --- .../javascript/kenysdev.js | 252 ++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 Roadmap/32 - BATALLA DEADPOOL Y WOLVERINE/javascript/kenysdev.js diff --git a/Roadmap/32 - BATALLA DEADPOOL Y WOLVERINE/javascript/kenysdev.js b/Roadmap/32 - BATALLA DEADPOOL Y WOLVERINE/javascript/kenysdev.js new file mode 100644 index 0000000000..c1f98dd717 --- /dev/null +++ b/Roadmap/32 - BATALLA DEADPOOL Y WOLVERINE/javascript/kenysdev.js @@ -0,0 +1,252 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#32 * BATALLA DEADPOOL Y WOLVERINE +------------------------------------------------------- + * EJERCICIO: + * ¡Deadpool y Wolverine se enfrentan en una batalla épica! + * Crea un programa que simule la pelea y determine un ganador. + * El programa simula un combate por turnos, donde cada protagonista posee unos + * puntos de vida iniciales, un daño de ataque variable y diferentes cualidades + * de regeneración y evasión de ataques. + * Requisitos: + * 1. El usuario debe determinar la vida inicial de cada protagonista. + * 2. Cada personaje puede impartir un daño aleatorio: + * - Deadpool: Entre 10 y 100. + * - Wolverine: Entre 10 y 120. + * 3. Si el daño es el máximo, el personaje que lo recibe no ataca en el + * siguiente turno, ya que tiene que regenerarse (pero no aumenta vida). + * 4. Cada personaje puede evitar el ataque contrario: + * - Deadpool: 25% de posibilidades. + * - Wolverine: 20% de posibilidades. + * 5. Un personaje pierde si sus puntos de vida llegan a cero o menos. + * Acciones: + * 1. Simula una batalla. + * 2. Muestra el número del turno (pausa de 1 segundo entre turnos). + * 3. Muestra qué pasa en cada turno. + * 4. Muestra la vida en cada turno. + * 5. Muestra el resultado final. +*/ +// ________________________________________________________ +const readline = require('readline'); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +function getInput(promptText, callback, type = "string") { + rl.question(promptText, function processInput(input) { + if (!input || input.trim() === "") { + rl.question("The input cannot be empty. Please try again: ", processInput); + return; + } + + if (type === "number") { + const numValue = Number(input.trim()); + if (isNaN(numValue)) { + rl.question("Please enter a valid number: ", processInput); + return; + } + callback(numValue); + return; + } + + callback(input.trim()); + }); +} + +function getInputAsync(promptText, type = "string") { + return new Promise((resolve) => { + getInput(promptText, resolve, type); + }); +} + +class GlobalConfig { + static TIME = 2; + static MINIMUM_HP = 200; + static CHARACTERS = { + "Deadpool": { + attacks: ["With weapon", "Hand to hand", "With reckless attack"], + damageRange: [10, 100], + defenseChance: 0.25 + }, + "Wolverine": { + attacks: ["With adamantium claws", "With weapon", "Hand to hand"], + damageRange: [10, 120], + defenseChance: 0.20 + } + }; + + static MENU = ` +BATTLE SIMULATOR: +------------------------------------------ +| 1. Simulate a battle | 2. Exit | +------------------------------------------`; +} + +class Character { + constructor(name, hp, attributes) { + this.name = name; + this.hp = hp; + this.attacks = attributes.attacks; + this.damageRange = attributes.damageRange; + this.defenseChance = attributes.defenseChance; + this.canAttack = true; + } + + attack() { + if (this.canAttack) { + const selectedAttack = this.attacks[Math.floor(Math.random() * this.attacks.length)]; + const damage = Math.floor(Math.random() * (this.damageRange[1] - this.damageRange[0] + 1)) + this.damageRange[0]; + console.log(`|'${this.name}' attacks '${selectedAttack}' Causing: '-${damage}' 👊|`); + return damage; + } else { + console.log(`|'${this.name}' is regenerating and cannot attack. 😴|`); + return 0; + } + } + + defend() { + if (Math.random() < this.defenseChance) { + console.log(`|'${this.name}' managed to defend. 🛡️|`); + return true; + } else { + console.log(`|'${this.name}' couldn't block the attack. 🤕|`); + return false; + } + } +} + +class BattleStrategy { + execute(attacker, defender) { + const damage = attacker.attack(); + + if (damage === attacker.damageRange[1]) { + console.log(`|'${defender.name}' 🚨received a critical hit and won't be able to attack.🚨|`); + defender.canAttack = false; + } + + if (attacker.canAttack) { + if (!defender.defend()) { + defender.hp -= damage; + } + } else { + attacker.canAttack = true; + } + + if (defender.hp <= 0) { + console.log("\n____________________________"); + console.log(`|'${attacker.name}' 🏆 wins the battle. 🏆|`); + return false; + } + + return true; + } +} + +class BattleFeatures { + constructor() { + this.battleStrategy = new BattleStrategy(); + this.character1 = null; + this.character2 = null; + } + + async getCharacter(msg) { + while (true) { + console.log("\nAvailable characters:"); + Object.keys(GlobalConfig.CHARACTERS).forEach((name, i) => { + console.log(`${i}. ${name}`); + }); + + const index = await getInputAsync(msg, "number"); + const keys = Object.keys(GlobalConfig.CHARACTERS); + + if (!(index >= 0 && index < keys.length)) { + console.log("Incorrect character number."); + continue; + } + + if (this.character1 && keys[index] === this.character1.name) { + console.log("Character already used."); + continue; + } + + const hp = await getInputAsync(`Set HP >= than '${GlobalConfig.MINIMUM_HP}': `, "number"); + if (hp < GlobalConfig.MINIMUM_HP) { + console.log(`HP must be greater than '${GlobalConfig.MINIMUM_HP}'.`); + continue; + } + + const name = keys[index]; + const attributes = GlobalConfig.CHARACTERS[name]; + return { name, hp, attributes }; + } + } + + showHP() { + console.log("____________________________"); + console.log(`|${this.character1.name}: ❤️ ${this.character1.hp}| |${this.character2.name}: ❤️ ${this.character2.hp}|`); + } + + async battle() { + let turn = 1; + while (true) { + console.log(`\n----------------------------\nTurn #${turn}\n----------------------------`); + + this.showHP(); + if (!this.battleStrategy.execute(this.character1, this.character2)) break; + + this.showHP(); + if (!this.battleStrategy.execute(this.character2, this.character1)) break; + + turn++; + await new Promise(resolve => setTimeout(resolve, GlobalConfig.TIME * 1000)); + } + + this.showHP(); + } + + async startSimulation() { + const char1Data = await this.getCharacter("'First' character: "); + this.character1 = new Character(char1Data.name, char1Data.hp, char1Data.attributes); + + const char2Data = await this.getCharacter("'Second' character: "); + this.character2 = new Character(char2Data.name, char2Data.hp, char2Data.attributes); + + await this.battle(); + + this.character1 = null; + this.character2 = null; + console.log(GlobalConfig.MENU); + } +} + +class Program { + constructor() { + this.features = new BattleFeatures(); + } + + async run() { + console.log(GlobalConfig.MENU); + while (true) { + const option = await getInputAsync("\nOption: ", "number"); + switch (option) { + case 1: + await this.features.startSimulation(); + break; + case 2: + console.log("Goodbye"); + rl.close(); + return; + default: + console.log("Select from '1 to 2'"); + } + } + } +} + +const program = new Program(); +program.run().catch(console.error); From ba0bb1d076a14c3a357af3790831b63b72c48c82 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Tue, 24 Dec 2024 11:32:54 -0600 Subject: [PATCH 044/104] 33 - js - RESCATANDO A MICKEY --- .../javascript/kenysdev.js | 243 ++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 Roadmap/33 - RESCATANDO A MICKEY/javascript/kenysdev.js diff --git a/Roadmap/33 - RESCATANDO A MICKEY/javascript/kenysdev.js b/Roadmap/33 - RESCATANDO A MICKEY/javascript/kenysdev.js new file mode 100644 index 0000000000..6cfb7792fe --- /dev/null +++ b/Roadmap/33 - RESCATANDO A MICKEY/javascript/kenysdev.js @@ -0,0 +1,243 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#33 * RESCATANDO A MICKEY +------------------------------------------------------- +* EJERCICIO: + * ¡Disney ha presentado un montón de novedades en su D23! + * Pero... ¿Dónde está Mickey? + * Mickey Mouse ha quedado atrapado en un laberinto mágico + * creado por Maléfica. + * Desarrolla un programa para ayudarlo a escapar. + * Requisitos: + * 1. El laberinto está formado por un cuadrado de 6x6 celdas. + * 2. Los valores de las celdas serán: + * - ⬜️ Vacío + * - ⬛️ Obstáculo + * - 🐭 Mickey + * - 🚪 Salida + * Acciones: + * 1. Crea una matriz que represente el laberinto (no hace falta + * que se genere de manera automática). + * 2. Interactúa con el usuario por consola para preguntarle hacia + * donde se tiene que desplazar (arriba, abajo, izquierda o derecha). + * 3. Muestra la actualización del laberinto tras cada desplazamiento. + * 4. Valida todos los movimientos, teniendo en cuenta los límites + * del laberinto y los obtáculos. Notifica al usuario. + * 5. Finaliza el programa cuando Mickey llegue a la salida. +*/ +// ________________________________________________________ + +const readline = require('readline'); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +const getInput = async (prompt) => { + return new Promise((resolve) => { + rl.question(prompt, (input) => { + resolve(input.toLowerCase()); + }); + }); +}; + +class Data { + constructor(config) { + this._config = config; + this._maze = []; + this._position = [0, 0]; + this._exit = [0, 0]; + } + + printMaze() { + console.log("--------------------------------------"); + this._maze.forEach(row => { + console.log(row.join('')); + }); + console.log("--------------------------------------"); + } +} + +class Moves extends Data { + constructor(config) { + super(config); + } + + _canMove(y, x) { + const size = this._maze.length; + if (y < 0 || x < 0 || y >= size || x >= size) { + console.log("🚨I can't jump over the edges.🚨"); + return false; + } + + if (this._maze[y][x] === this._config.obstacle) { + console.log("🚨You pushed me against the wall.🚨"); + return false; + } + + this._position = [y, x]; + console.log("✅Correct move.✅"); + this._maze[y][x] = this._config.mouse; + return true; + } + + up() { + const [y, x] = this._position; + if (!this._canMove(y - 1, x)) return; + this._maze[y][x] = this._config.empty; + } + + down() { + const [y, x] = this._position; + if (!this._canMove(y + 1, x)) return; + this._maze[y][x] = this._config.empty; + } + + right() { + const [y, x] = this._position; + if (!this._canMove(y, x + 1)) return; + this._maze[y][x] = this._config.empty; + } + + left() { + const [y, x] = this._position; + if (!this._canMove(y, x - 1)) return; + this._maze[y][x] = this._config.empty; + } +} + +class Maze extends Moves { + constructor(config) { + super(config); + } + + _createPaths(x, y, width, height) { + const maze = this._maze; + const { obstacle, empty } = this._config; + + maze[y][x] = empty; + const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]; + this._shuffleArray(directions); + + directions.forEach(([dx, dy]) => { + const nx = x + dx * 2; + const ny = y + dy * 2; + if (0 < nx && nx < width - 1 && 0 < ny && ny < height - 1 && maze[ny][nx] === obstacle) { + maze[y + dy][x + dx] = empty; + this._createPaths(nx, ny, width, height); + } + }); + } + + _shuffleArray(array) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + } + + create() { + let [width, height] = this._config.size; + const { obstacle, mouse, exit } = this._config; + + if (width % 2 === 0) width += 1; + if (height % 2 === 0) height += 1; + + this._maze = Array(height).fill().map(() => Array(width).fill(obstacle)); + + const initialX = 1 + 2 * Math.floor(Math.random() * ((width - 1) / 2)); + const initialY = 1 + 2 * Math.floor(Math.random() * ((height - 1) / 2)); + this._createPaths(initialX, initialY, width, height); + + this._maze[0][1] = mouse; + this._maze[height - 1][width - 2] = exit; + this._position = [0, 1]; + this._exit = [height - 1, width - 2]; + } + + verifyWin() { + const [y, x] = this._exit; + return this._maze[y][x] === this._config.mouse; + } +} + +class Game { + constructor(config, instanceMaze) { + this._config = config; + this._maze = instanceMaze; + } + + async _restartOrExit() { + while (true) { + const option = await getInput("Y/N: "); + switch (option) { + case 'y': return true; + case 'n': return false; + default: console.log("❌Invalid key.❌"); + } + } + } + + async play() { + Object.entries(this._config).forEach(([k, v]) => { + console.log(`${k}: ${v}`); + }); + + this._maze.create(); + while (true) { + this._maze.printMaze(); + console.log("Use the keys: (W, S, A, D).\nTo restart: R. To exit: 9."); + const option = await getInput("\nKey: "); + + switch (option) { + case 'w': this._maze.up(); break; + case 's': this._maze.down(); break; + case 'd': this._maze.right(); break; + case 'a': this._maze.left(); break; + case 'r': + console.log("😮Do you want to restart?😮"); + if (await this._restartOrExit()) { + this._maze.create(); + } + break; + case '9': + console.log("😮Do you want to exit?😮"); + if (await this._restartOrExit()) { + rl.close(); + return; + } + break; + default: console.log("❌Invalid key.❌"); + } + + if (this._maze.verifyWin()) { + console.log("🏆Congratulations, you managed to get me out.🏆"); + console.log("🤔Do you want to play again?🤔"); + if (await this._restartOrExit()) { + this._maze.create(); + } else { + console.log("Bye"); + rl.close(); + return; + } + } + } + } +} + +const config = { + title: "RESCUING MICKEY", + size: [6, 6], + empty: "⬜️", + obstacle: "⬛️", + mouse: "🐭", + exit: "🚪" +}; + +const maze = new Maze(config); +const game = new Game(config, maze); +game.play().catch(console.error); From c9ba6067a63272cec59faf413db5e2a98a4dd862 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Tue, 24 Dec 2024 11:33:25 -0600 Subject: [PATCH 045/104] =?UTF-8?q?34=20-=20js=20-=20A=CC=81RBOL=20GENEALO?= =?UTF-8?q?=CC=81GICO=20DE=20LA=20CASA=20DEL=20DRAGO=CC=81N?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javascript/kenysdev.js" | 680 ++++++++++++++++++ 1 file changed, 680 insertions(+) create mode 100644 "Roadmap/34 - \303\201RBOL GENEAL\303\223GICO LA CASA DEL DRAG\303\223N/javascript/kenysdev.js" diff --git "a/Roadmap/34 - \303\201RBOL GENEAL\303\223GICO LA CASA DEL DRAG\303\223N/javascript/kenysdev.js" "b/Roadmap/34 - \303\201RBOL GENEAL\303\223GICO LA CASA DEL DRAG\303\223N/javascript/kenysdev.js" new file mode 100644 index 0000000000..aa8b95db17 --- /dev/null +++ "b/Roadmap/34 - \303\201RBOL GENEAL\303\223GICO LA CASA DEL DRAG\303\223N/javascript/kenysdev.js" @@ -0,0 +1,680 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#34 ÁRBOL GENEALÓGICO DE LA CASA DEL DRAGÓN +------------------------------------------------------- +# * ¡La Casa del Dragón ha finalizado y no volverá hasta 2026! +# * ¿Alguien se entera de todas las relaciones de parentesco +# * entre personajes que aparecen en la saga? +# * Desarrolla un árbol genealógico para relacionarlos (o invéntalo). +# * Requisitos: +# * 1. Estará formado por personas con las siguientes propiedades: +# * - id_entificador único (obligatorio) +# * - Nombre (obligatorio) +# * - Pareja (opcional) +# * - Hijos (opcional) +# * 2. Una persona sólo puede tener una pareja (para simplificarlo). +# * 3. Las relaciones deben valid_arse dentro de lo posible. +# * Ejemplo: Un hijo no puede tener tres padres. +# * Acciones: +# * 1. Crea un programa que permita crear y modificar el árbol. +# * - Añadir y eliminar personas +# * - Modificar pareja e hijos +# * 2. Podrás imprimir el árbol (de la manera que consid_eres). +# * +# * NOTA: Ten en cuenta que la complejidad puede ser alta si +# * se implementan todas las posibles relaciones. Intenta marcar +# * tus propias reglas y límites para que te resulte asumible. + +*/ +// ________________________________________________________ +// NOTE: Here is the 'people.json' file with the data if you want to test it: +// https://pastebin.com/29kWWgPU +// Just paste it into the base folder where file.py is located. + +const readline = require('readline'); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +class Input { + async inputStr(msg) { + while (true) { + const txt = await new Promise((resolve) => { + rl.question(msg, (answer) => { + resolve(answer.trim()); + }); + }); + + if (txt.length > 0) { + return txt; + } + console.log("\n❌ This field cannot be empty."); + } + } + + async inputInt(msg) { + while (true) { + const txt = await this.inputStr(msg); + if (/^\d+$/.test(txt)) { + return parseInt(txt); + } + console.log("\n❌ Enter an integer."); + } + } +} + +class Person { + constructor(id, name) { + this.id = id; + this.name = name; + this.parents = []; + this.partners = []; + this.children = {}; + this.deleted = false; + } + + toJSON() { + return { + id: this.id, + name: this.name, + parents: this.parents, + partners: this.partners, + children: this.children, + deleted: this.deleted + }; + } + + static fromJSON(data) { + const person = new Person(data.id, data.name); + person.parents = data.parents || []; + person.partners = data.partners || []; + person.children = Object.fromEntries( + Object.entries(data.children || {}).map(([k, v]) => [parseInt(k), v]) + ); + person.deleted = data.deleted || false; + return person; + } + + toString() { + return `Person(id=${this.id}, name='${this.name}')`; + } +} + +class People extends Input { + constructor(filename = "people.json") { + super(); + this._people = []; + this._filename = filename; + this.loadFromJSON(); + } + + getPeople() { + return this._people; + } + + async loadFromJSON() { + try { + const fs = require('fs'); + const data = JSON.parse(fs.readFileSync(this._filename, 'utf8')); + this._people = data.map(personData => Person.fromJSON(personData)); + console.log(`✅ The file '${this._filename}' has been successfully loaded.`); + } catch (error) { + console.log(`⚠️ The file '${this._filename}' not found. Starting with an empty list.`); + this._people = [new Person(0, "unknown")]; + } + } + + async saveToJSON() { + try { + const fs = require('fs'); + const data = this._people.map(person => person.toJSON()); + fs.writeFileSync(this._filename, JSON.stringify(data, null, 2)); + console.log(`✅ Data saved successfully to ${this._filename}`); + } catch (error) { + console.log(`❌ An error occurred while saving to '${this._filename}': ${error}. Data may not have been saved.`); + } + } + + printPeople() { + console.log("_".repeat(32)); + console.log(`|${this.centerText("id", 4)}|${this.centerText("Name", 25)}|`); + console.log("_".repeat(32)); + + this._people.forEach(person => { + if (!person.deleted) { + console.log(`|${this.centerText(String(person.id), 4)}|${this.centerText(person.name, 25)}|`); + } + }); + + console.log("_".repeat(32)); + } + + centerText(text, width) { + const padding = width - text.length; + const leftPad = Math.floor(padding / 2); + const rightPad = padding - leftPad; + return " ".repeat(leftPad) + text + " ".repeat(rightPad); + } + + getPersonById(id) { + if (id >= 0 && id < this._people.length) { + return this._people[id]; + } + console.log("❌ id not found."); + return null; + } + + async addPerson() { + console.log("Add Person or 'x' to Exit"); + const name = await this.inputStr("Name: "); + if (name.toLowerCase() === "x") { + console.log("Exit"); + return; + } + + const newId = Math.max(-1, ...this._people.map(p => p.id)) + 1; + const newPerson = new Person(newId, name); + this._people.push(newPerson); + console.log(`✅ Added: ${newPerson}`); + await this.saveToJSON(); + } + + async removePerson() { + this.printPeople(); + console.log("\nPerson ID to mark as deleted or a letter to exit."); + const idStr = await this.inputStr("ID: "); + if (!/^\d+$/.test(idStr)) { + console.log("Exit"); + return; + } + + const person = this.getPersonById(parseInt(idStr)); + if (!person) return; + + if (person.partners.length || person.parents.length) { + console.log("❌ You cannot delete a person who is linked to parents or partners."); + return; + } + + person.deleted = true; + console.log(`✅ '${person.name}' is marked as deleted.`); + await this.saveToJSON(); + } + + get length() { + return this._people.length; + } +} + +class Partners extends People { + async #add(partners, idPerson) { + console.log("Select Partner ID"); + const idPartner = await this.inputInt("ID: "); + const partner = this.getPersonById(idPartner); + if (!partner || partner.deleted) { + console.log("❌ ID not found or the person is deleted."); + return; + } + + if (partners.includes(idPartner)) { + console.log("❌ This partner is already added."); + return; + } + + partners.push(idPartner); + partner.partners.push(idPerson); + + console.log("✅ Partner successfully added."); + await this.saveToJSON(); + } + + async #remove(partners, idPerson) { + console.log("Select Partner ID to Delete"); + const id = await this.inputInt("ID: "); + if (!partners.includes(id)) { + console.log("❌ ID not found."); + return; + } + + const partner = this.getPersonById(id); + if (!partner) { + console.log("❌ Partner not found."); + return; + } + + if (Object.keys(partner.children).length > 0) { + console.log("❌ Cannot delete a partner who has children."); + return; + } + + partners.splice(partners.indexOf(id), 1); + partner.partners.splice(partner.partners.indexOf(idPerson), 1); + + console.log("✅ Partner deleted"); + await this.saveToJSON(); + } + + async #options(partners, idPerson) { + console.log("\n1. Add partner | 2. Remove partner | 3. Exit"); + const option = await this.inputInt("\nOption: "); + + switch (option) { + case 1: + await this.#add(partners, idPerson); + break; + case 2: + await this.#remove(partners, idPerson); + break; + case 3: + return; + default: + console.log("❌ Invalid option."); + } + } + + async editPartners() { + this.printPeople(); + console.log("\nPerson ID to edit partners or a letter to exit."); + const idStr = await this.inputStr("ID: "); + if (!/^\d+$/.test(idStr)) { + console.log("Exit"); + return; + } + + const id = parseInt(idStr); + const person = this.getPersonById(id); + if (!person || person.deleted) { + console.log("❌ ID not found or the person is deleted."); + return; + } + + console.log(`You selected '${person.name}'`); + const partners = person.partners; + + if (partners.length > 0) { + console.log("Partners:"); + partners.forEach(idP => { + const partner = this.getPersonById(idP); + if (partner) { + console.log(`ID: ${partner.id} -> ${partner.name}`); + } + }); + } else { + console.log("🚫 This person has no partners."); + } + + await this.#options(partners, id); + } +} + +class Children extends Partners { + constructor(filename = "people.json") { + super(filename); + this._idParent = null; + this._children = {}; + this._idChild = null; + this._parents = null; + this._idPartner = null; + } + + async #selectPartner(partners) { + console.log("Partners:"); + partners.forEach(idP => { + const partner = this.getPersonById(idP); + if (partner) { + console.log(`ID: ${partner.id} -> ${partner.name}`); + } + }); + + console.log("Select the ID of the partner with whom you have the child."); + const idPartner = await this.inputInt("ID: "); + const partner = this.getPersonById(idPartner); + if (!partners.includes(idPartner) || !partner || partner.deleted) { + console.log("❌ ID not found or the person is deleted."); + return null; + } + + return idPartner; + } + + async #updateChildParent() { + console.log("Select Child ID"); + const idChild = await this.inputInt("ID: "); + const child = this.getPersonById(idChild); + if (!child) { + console.log("❌ ID not found."); + return null; + } + + if (child.parents.length) { + console.log("❌ This person already has parents."); + return null; + } + + const idPartner = this._idPartner; + if (this._children[idPartner]) { + if (!this._children[idPartner].includes(idChild)) { + this._children[idPartner].push(idChild); + } + } else { + this._children[idPartner] = [idChild]; + } + + const parent = this.getPersonById(this._idParent); + if (parent) { + parent.children = this._children; + } + + child.parents = [this._idParent, idPartner]; + + return idChild; + } + + #updateChildPartner(partner) { + if (this._idParent in partner.children) { + if (!partner.children[this._idParent].includes(this._idChild)) { + partner.children[this._idParent].push(this._idChild); + } + } else { + partner.children[this._idParent] = [this._idChild]; + } + } + + async #add() { + const parent = this.getPersonById(this._idParent); + if (!parent) { + console.log("❌ Parent not found."); + return; + } + + const partners = parent.partners; + if (!partners.length) { + console.log("❌ This person does not have a partner with whom to have children."); + return; + } + + const idPartner = await this.#selectPartner(partners); + if (!idPartner) return; + + const partner = this.getPersonById(idPartner); + if (!partner) { + console.log("❌ Partner not found."); + return; + } + + this._idPartner = idPartner; + const idChild = await this.#updateChildParent(); + if (idChild === null) return; + + this._idChild = idChild; + this.#updateChildPartner(partner); + + console.log("✅ Child successfully added."); + await this.saveToJSON(); + } + + async #removeAndUpdate(idParent, idPartner) { + const parent = this.getPersonById(idParent); + if (!parent) { + console.log("❌ Parent not found."); + return; + } + + const childrenWithPartner = parent.children[idPartner] || []; + if (childrenWithPartner.includes(this._idChild)) { + const index = childrenWithPartner.indexOf(this._idChild); + childrenWithPartner.splice(index, 1); + if (childrenWithPartner.length === 0) { + delete parent.children[idPartner]; + } else { + parent.children[idPartner] = childrenWithPartner; + } + } + + const child = this.getPersonById(this._idChild); + if (child) { + const index = child.parents.indexOf(idParent); + if (index !== -1) { + child.parents.splice(index, 1); + } + } + } + + async #remove() { + console.log("Select Child ID to Delete"); + const idChild = await this.inputInt("ID: "); + const child = this.getPersonById(idChild); + if (!child) { + console.log("❌ Child not found."); + return; + } + + const parents = child.parents; + if (parents.length !== 2) { + console.log("❌ Child does not have two parents."); + return; + } + + this._idChild = idChild; + this._parents = parents; + const [idP1, idP2] = parents; + await this.#removeAndUpdate(idP1, idP2); + await this.#removeAndUpdate(idP2, idP1); + + console.log("✅ Child deleted"); + await this.saveToJSON(); + } + + async #options() { + console.log("\n1. Add child | 2. Remove child | 3. Exit"); + const option = await this.inputInt("\nOption: "); + + switch (option) { + case 1: + await this.#add(); + break; + case 2: + await this.#remove(); + break; + case 3: + return; + default: + console.log("❌ Invalid option."); + } + } + + async editChildren() { + this.printPeople(); + console.log("\nPerson ID to edit Children or a letter to exit."); + const idStr = await this.inputStr("ID: "); + if (!/^\d+$/.test(idStr)) { + console.log("Exit"); + return; + } + + const id = parseInt(idStr); + const parent = this.getPersonById(id); + if (!parent || parent.deleted) { + console.log("❌ ID not found or the person is deleted."); + return; + } + + console.log(`You selected '${parent.name}'`); + const children = parent.children; + if (Object.keys(children).length > 0) { + console.log("Children:"); + for (const [partnerId, childIds] of Object.entries(children)) { + const partner = this.getPersonById(parseInt(partnerId)); + const partnerName = partner ? partner.name : "Unknown"; + console.log(`With ID: ${partnerId} -> '${partnerName}':`); + childIds.forEach(childId => { + const child = this.getPersonById(childId); + const childName = child ? child.name : "Unknown"; + console.log(` ID: ${childId} -> '${childName}'`); + }); + } + } else { + console.log("🚫 This person has no children."); + } + + this._idParent = id; + this._children = children; + await this.#options(); + } +} + +class Tree extends Children { + #filteredGrandparents() { + const grandparents = []; + const noPartner = []; + + for (const person of this.getPeople()) { + if ( + !person.parents.length && + !person.deleted && + person.name !== "unknown" + ) { + const partners = person.partners; + if (!partners.length) { + noPartner.push(person); + continue; + } + + let hasGrandparentPartner = false; + for (const partnerId of partners) { + const partner = this.getPersonById(partnerId); + if (partner && grandparents.includes(partner)) { + hasGrandparentPartner = true; + break; + } + } + + if (!hasGrandparentPartner) { + grandparents.push(person); + } + } + } + + return [grandparents, noPartner]; + } + + #printChild(children, px, isLast, isRoot) { + children.forEach((childId, j) => { + const isLastChild = j === children.length - 1; + let newPrefix = px; + if (!isRoot) { + newPrefix = px.slice(0, -4) + (isLast ? " " : "│ "); + } + + this.#printFamily( + childId, + newPrefix + (isLastChild ? "└── " : "├── "), + isLastChild, + false + ); + }); + } + + #printParents(id, partners, px, isLast, isRoot) { + partners.forEach(partnerId => { + const partner = this.getPersonById(partnerId); + if (partner) { + console.log(`${px}💑 With: ${partner.name} (ID: ${partner.id})`); + const children = partner.children[id] || []; + if (children.length) { + this.#printChild(children, px, isLast, isRoot); + } else { + console.log(`${px}└── 🚫 Without children`); + } + } + }); + } + + #printFamily(id, px = "", isLast = false, isRoot = true) { + const person = this.getPersonById(id); + if (!person) return; + + console.log(`${px}🙂 ${person.name} (ID: ${person.id})`); + + const partners = person.partners; + if (Array.isArray(partners) && partners.length) { + if (!isRoot) { + px = px.slice(0, -4) + (isLast ? " " : "│ "); + } + + this.#printParents(id, partners, px, isLast, isRoot); + if (!isLast) { + console.log(px); + } + } + } + + printTree() { + const [grandparents, noPartner] = this.#filteredGrandparents(); + + if (!grandparents.length && !noPartner.length) { + console.log("⚠️ No users are registered."); + return; + } + + if (noPartner.length) { + console.log("__________\nParents unknown, without descendants and without a partner:"); + noPartner.forEach(p => { + console.log(`😐 ${p.name}`); + }); + } + + console.log(); + grandparents.forEach((person, i) => { + console.log(`__________\nFamily #${i + 1}`); + this.#printFamily(person.id); + }); + } +} + +class Program extends Tree { + static MENU = ` + --------------------------------------------- + | 1. Add person | 4. Edit children | + | 2. Remove person | 5. Print tree | + | 3. Edit partners | 6. Exit | + ---------------------------------------------`; + + async run() { + while (true) { + console.log(Program.MENU); + const option = await this.inputInt("\nOption: "); + + switch (option) { + case 1: + await this.addPerson(); + break; + case 2: + await this.removePerson(); + break; + case 3: + await this.editPartners(); + break; + case 4: + await this.editChildren(); + break; + case 5: + this.printTree(); + break; + case 6: + console.log("Bye"); + rl.close(); + return; + default: + console.log("❌ Invalid option."); + } + } + } +} + +const program = new Program(); +program.run().catch(console.error); From 76ee887456cc16392141bcabce031af8ccfa90b2 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Tue, 24 Dec 2024 11:33:49 -0600 Subject: [PATCH 046/104] 35 - js - REPARTIENDO LOS ANILLOS DE PODER --- .../javascript/kenysdev.js | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 Roadmap/35 - REPARTIENDO LOS ANILLOS DE PODER/javascript/kenysdev.js diff --git a/Roadmap/35 - REPARTIENDO LOS ANILLOS DE PODER/javascript/kenysdev.js b/Roadmap/35 - REPARTIENDO LOS ANILLOS DE PODER/javascript/kenysdev.js new file mode 100644 index 0000000000..4876314dc4 --- /dev/null +++ b/Roadmap/35 - REPARTIENDO LOS ANILLOS DE PODER/javascript/kenysdev.js @@ -0,0 +1,120 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#35 REPARTIENDO LOS ANILLOS DE PODER +------------------------------------------------------- + * EJERCICIO: + * ¡La temporada 2 de "Los Anillos de Poder" está a punto de estrenarse! + * ¿Qué pasaría si tuvieras que encargarte de repartir los anillos + * entre las razas de la Tierra Media? + * Desarrolla un programa que se encargue de distribuirlos. + * Requisitos: + * 1. Los Elfos recibirán un número impar. + * 2. Los Enanos un número primo. + * 3. Los Hombres un número par. + * 4. Sauron siempre uno. + * Acciones: + * 1. Crea un programa que reciba el número total de anillos + * y busque una posible combinación para repartirlos. + * 2. Muestra el reparto final o el error al realizarlo. +*/ +// ________________________________________________________ + +const readline = require("readline"); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +const getInput = async (prompt) => { + return new Promise((resolve) => { + rl.question(prompt, (input) => { + resolve(input.trim()); + }); + }); +}; + +const getTotalRings = async () => { + while (true) { + const input_ = await getInput("Cantidad de anillos: "); + const total = parseInt(input_, 10); + if (!isNaN(total) && total >= 1) { + return total; + } + console.log("Debe ser un valor entero '>= 1'."); + } +}; + +const isPrime = (n) => { + if (n < 2) return false; + for (let i = 2; i <= Math.sqrt(n); i++) { + if (n % i === 0) return false; + } + return true; +}; + +const distribute = (total) => { + const combinations = []; + for (let elves = 1; elves < total; elves += 2) { + for (let men = 2; men < total; men += 2) { + const dwarves = total - (men + elves); + if (dwarves > 0 && isPrime(dwarves)) { + combinations.push([elves, men, dwarves]); + } + } + } + return combinations; +}; + +const standardDeviation = (tuple) => { + const mean = tuple.reduce((sum, val) => sum + val, 0) / tuple.length; + const variance = + tuple.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / + tuple.length; + return Math.sqrt(variance); +}; + +const theMostBalanced = (combinations) => { + const deviations = combinations.map(standardDeviation); + const indexOfLeastDeviation = deviations.indexOf(Math.min(...deviations)); + return combinations[indexOfLeastDeviation]; +}; + +const printResult = (distribution, sauron) => { + if (!distribution) { + console.log("Error en la selección equitativa."); + return; + } + + const [elves, men, dwarves] = distribution; + console.log("_________________________"); + console.log(`Elfos -> ${elves} : # Impar`); + console.log(`Enanos -> ${dwarves} : # Primo`); + console.log(`Hombres -> ${men} : # Par`); + console.log(`Sauron -> ${sauron} : # Fijo`); + console.log("-------------------------"); +}; + +const main = async () => { + console.log("REPARTIENDO LOS ANILLOS DE PODER"); + let total = await getTotalRings(); + const sauron = 1; + total -= sauron; + + const combinations = distribute(total); + + if (combinations.length === 0) { + console.log("No existe una combinación posible."); + rl.close(); + return; + } + + const distribution = theMostBalanced(combinations); + printResult(distribution, sauron); + + rl.close(); +}; + +main(); From 529d8bb9b791f437f65a4ff7e2574617ad6702a6 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Wed, 25 Dec 2024 19:25:40 -0600 Subject: [PATCH 047/104] 36 - js - EL SOMBRERO SELECCIONADOR --- .../javascript/kenysdev.js | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/kenysdev.js diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/kenysdev.js b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/kenysdev.js new file mode 100644 index 0000000000..93263faab6 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/kenysdev.js @@ -0,0 +1,127 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +# 36 EL SOMBRERO SELECCIONADOR +------------------------------------------------------- +* EJERCICIO: + * Cada 1 de septiembre, el Hogwarts Express parte hacia la escuela + * de programación de Hogwarts para magos y brujas del código. + * En ella, su famoso sombrero seleccionador ayuda a los programadores + * a encontrar su camino... + * Desarrolla un programa que simule el comportamiento del sombrero. + * Requisitos: + * 1. El sombrero realizará 10 preguntas para determinar la casa del alumno. + * 2. Deben existir 4 casas. Por ejemplo: Frontend, Backend, Mobile y Data. + * (Puedes elegir las que quieras) + * Acciones: + * 1. Crea un programa que solicite el nombre del alumno y realice 10 + * preguntas, con cuatro posibles respuestas cada una. + * 2. Cada respuesta asigna puntos a cada una de las casas (a tu elección). + * 3. Una vez finalizado, el sombrero indica el nombre del alumno + * y a qué casa pertenecerá (resuelve el posible empate de manera aleatoria, + * pero indicándole al alumno que la decisión ha sido complicada). +*/ +// ________________________________________________________ + +const readline = require("readline"); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +const getInput = (prompt) => { + return new Promise((resolve) => { + rl.question(prompt, (input) => { + resolve(input.trim()); + }); + }); +}; + +const HOUSES = ["Frontend", "Backend", "Mobile", "Data"]; + +const QUESTIONS = [ + "¿Qué te atrae más?", + "¿Qué superhéroe de la programación te gustaría ser?", + "En un proyecto de software, ¿qué rol te emociona más?", + "Si tu código fuera una obra de arte, ¿qué estilo tendría?", + "¿Qué animal de programación serías?", + "En una hackathon, ¿qué tipo de proyecto propondrías?", + "Si tu carrera en tech fuera una película, ¿de qué género sería?", + "¿Qué herramienta de programación no puede faltar en tu caja de herramientas digital?", + "Si pudieras resolver un gran problema en tech, ¿cuál elegirías?", + "¿Qué tipo de equipo prefieres?", +]; + +const ANSWERS = [ + ["Crear experiencias visuales.", "Solucionar problemas de funcionamiento.", "Innovar en dispositivos portátiles.", "Descubrir tendencias ocultas."], + ["Diseñador de Interfaces, creando experiencias asombrosas", "Arquitecto de Sistemas, construyendo estructuras robustas", "Mago de Apps, conjurando soluciones móviles", "Explorador de Datos, descubriendo tesoros ocultos"], + ["Director de UX, orquestando la sinfonía visual", "Ingeniero de Backend, dominando la lógica del servidor", "Desarrollador de Apps, llevando la potencia al bolsillo", "Científico de Datos, descifrando los secretos de la información"], + ["Minimalismo elegante, como una landing page perfecta", "Arquitectura compleja, como un sistema distribuido", "Diseño adaptativo, fluyendo en diferentes dispositivos", "Visualización de datos, pintando historias con números"], + ["Un camaleón, adaptándome a diferentes frameworks", "Un pulpo, manejando múltiples servicios a la vez", "Un colibrí, ágil y siempre en movimiento", "Una lechuza, analizando datos con sabiduría"], + ["Una web app que revolucione la experiencia del usuario", "Un sistema de IA que optimice procesos backend", "Una app móvil que cambie la forma de interactuar con el mundo", "Un proyecto de big data que prediga tendencias futuras"], + ["Comedia romántica con JavaScript y CSS", "Thriller de ciencia ficción con microservicios", "Aventura de acción en el mundo de las apps", "Documental profundo sobre el universo de los datos"], + ["Un editor de código con plugins para diseño visual", "Una robusta suite de testing y depuración", "Un emulador multi-dispositivo de última generación", "Una plataforma de análisis de datos en tiempo real"], + ["Hacer que la accesibilidad web sea universal", "Crear una arquitectura de software autorreparable", "Desarrollar una plataforma de AR/VR para educación móvil", "Construir un modelo de IA ético y transparente"], + ["Creativos enfocados en diseño.", "Técnicos que construyen sistemas.", "Especialistas en aplicaciones móviles.", "Expertos en datos y análisis."], +]; + +class SortingHat { + constructor(name) { + this.name = name; + this.scores = HOUSES.reduce((acc, house) => { + acc[house] = 0; + return acc; + }, {}); + } + + async askQuestion(qNum, question, answers) { + console.log(`\n#${qNum}: ${question}`); + answers.forEach((answer, index) => { + console.log(`${index + 1}) ${answer}`); + }); + + while (true) { + const input = await getInput("Elige tu respuesta (1-4): "); + const choice = parseInt(input, 10) - 1; + + if (!isNaN(choice) && choice >= 0 && choice < HOUSES.length) { + this.scores[HOUSES[choice]] += 1; + break; + } else { + console.log("Por favor, elige un número entre 1 y 4."); + } + } + } + + selectHouse() { + const maxScore = Math.max(...Object.values(this.scores)); + const topHouses = Object.keys(this.scores).filter( + (house) => this.scores[house] === maxScore + ); + + if (topHouses.length > 1) { + console.log("\nLa decisión ha sido complicada."); + return topHouses[Math.floor(Math.random() * topHouses.length)]; + } + + return topHouses[0]; + } +} + +const main = async () => { + console.log("EL SOMBRERO SELECCIONADOR"); + const name = await getInput("¿Cuál es tu nombre? : "); + const hat = new SortingHat(name); + + for (let i = 0; i < QUESTIONS.length; i++) { + await hat.askQuestion(i + 1, QUESTIONS[i], ANSWERS[i]); + } + + const selectedHouse = hat.selectHouse(); + console.log(`\n'${name}' pertenecerá a la casa '${selectedHouse}'\n`); + rl.close(); +}; + +main(); From 40a0f2f973a885da91dcdb6ac17caec5ce6e4a5f Mon Sep 17 00:00:00 2001 From: kenysdev Date: Wed, 25 Dec 2024 19:26:18 -0600 Subject: [PATCH 048/104] 37 - js - OASIS VS LINKIN PARK --- .../javascript/kenysdev.js | 230 ++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 Roadmap/37 - OASIS VS LINKIN PARK/javascript/kenysdev.js diff --git a/Roadmap/37 - OASIS VS LINKIN PARK/javascript/kenysdev.js b/Roadmap/37 - OASIS VS LINKIN PARK/javascript/kenysdev.js new file mode 100644 index 0000000000..fac193cc68 --- /dev/null +++ b/Roadmap/37 - OASIS VS LINKIN PARK/javascript/kenysdev.js @@ -0,0 +1,230 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#37 OASIS VS LINKIN PARK +------------------------------------------------------- +* ¡Dos de las bandas más grandes de la historia están de vuelta! +* Oasis y Linkin Park han anunciado nueva gira, pero, ¿quién es más popular? +* Desarrolla un programa que se conecte al API de Spotify y los compare. +* Requisitos: +* 1. Crea una cuenta de desarrollo en https://developer.spotify.com. +* 2. Conéctate al API utilizando tu lenguaje de programación. +* 3. Recupera datos de los endpoint que tú quieras. +* Acciones: +* 1. Accede a las estadísticas de las dos bandas. +* Por ejemplo: número total de seguidores, escuchas mensuales, +* canción con más reproducciones... +* 2. Compara los resultados de, por lo menos, 3 endpoint. +* 3. Muestra todos los resultados por consola para notificar al usuario. +* 4. Desarrolla un criterio para seleccionar qué banda es más popular. +*/ +// ________________________________________________________ +require('dotenv').config(); +const https = require('https'); + +const SPOTIFY_CLIENT_ID = process.env.SPOTIFY_CLIENT_ID; +const SPOTIFY_CLIENT_SECRET = process.env.SPOTIFY_CLIENT_SECRET; + +const getSpotifyAccessToken = async () => { + const options = { + hostname: "accounts.spotify.com", + path: "/api/token", + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Authorization: `Basic ${Buffer.from( + `${SPOTIFY_CLIENT_ID}:${SPOTIFY_CLIENT_SECRET}` + ).toString("base64")}`, + }, + }; + + return new Promise((resolve, reject) => { + const req = https.request(options, (res) => { + let data = ""; + + res.on("data", (chunk) => { + data += chunk; + }); + + res.on("end", () => { + const response = JSON.parse(data); + resolve(response.access_token); + }); + }); + + req.on("error", (e) => { + reject(e); + }); + + req.write("grant_type=client_credentials"); + req.end(); + }); +}; + +const spotifyAPIRequest = async (endpoint, accessToken) => { + const options = { + hostname: "api.spotify.com", + path: endpoint, + method: "GET", + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }; + + return new Promise((resolve, reject) => { + const req = https.request(options, (res) => { + let data = ""; + + res.on("data", (chunk) => { + data += chunk; + }); + + res.on("end", () => { + resolve(JSON.parse(data)); + }); + }); + + req.on("error", (e) => { + reject(e); + }); + + req.end(); + }); +}; + +class Spotify { + constructor() { + this.accessToken = null; + } + + async authenticate() { + this.accessToken = await getSpotifyAccessToken(); + } + + async getArtists(name) { + const results = await spotifyAPIRequest( + `/v1/search?q=artist:${encodeURIComponent(name)}&type=artist&limit=3`, + this.accessToken + ); + return results.artists ? results.artists.items : []; + } + + async getMostPopularArtist(name) { + const artists = await this.getArtists(name); + if (artists.length === 0) return null; + + return artists.sort((a, b) => b.popularity - a.popularity)[0]; + } + + async artistTopTracks(artistId) { + const results = await spotifyAPIRequest( + `/v1/artists/${artistId}/top-tracks?market=US`, + this.accessToken + ); + return results.tracks || []; + } + + async artistAlbums(artistId) { + const results = await spotifyAPIRequest( + `/v1/artists/${artistId}/albums?album_type=album`, + this.accessToken + ); + return results.items || []; + } +} + +// Clase Versus +class Versus { + constructor(artist1, artist2, spotifyInstance) { + this.a1 = artist1; + this.a2 = artist2; + this.sp = spotifyInstance; + this.a1Score = 0; + this.a2Score = 0; + } + + popularity() { + console.log(`Popularidad: ${this.a1.popularity} vs ${this.a2.popularity}`); + if (this.a1.popularity > this.a2.popularity) this.a1Score++; + else if (this.a2.popularity > this.a1.popularity) this.a2Score++; + } + + followers() { + console.log( + `Seguidores: ${this.a1.followers.total} vs ${this.a2.followers.total}` + ); + if (this.a1.followers.total > this.a2.followers.total) this.a1Score++; + else if (this.a2.followers.total > this.a1.followers.total) this.a2Score++; + } + + async top3Tracks() { + const a1Tracks = await this.sp.artistTopTracks(this.a1.id); + const a2Tracks = await this.sp.artistTopTracks(this.a2.id); + + const a1Popularity = a1Tracks.slice(0, 3).reduce((sum, track) => sum + track.popularity, 0); + const a2Popularity = a2Tracks.slice(0, 3).reduce((sum, track) => sum + track.popularity, 0); + + console.log(`Popularidad Top 3 canciones: ${a1Popularity} vs ${a2Popularity}`); + if (a1Popularity > a2Popularity) this.a1Score++; + else if (a2Popularity > a1Popularity) this.a2Score++; + } + + async albumsAndActiveYears() { + const a1Albums = await this.sp.artistAlbums(this.a1.id); + const a2Albums = await this.sp.artistAlbums(this.a2.id); + + console.log(`Número de álbumes: ${a1Albums.length} vs ${a2Albums.length}`); + if (a1Albums.length > a2Albums.length) this.a1Score++; + else if (a2Albums.length > a1Albums.length) this.a2Score++; + + const a1Years = new Set(a1Albums.map((album) => album.release_date.slice(0, 4))); + const a2Years = new Set(a2Albums.map((album) => album.release_date.slice(0, 4))); + + console.log(`Años activos: ${a1Years.size} vs ${a2Years.size}`); + if (a1Years.size > a2Years.size) this.a1Score++; + else if (a2Years.size > a1Years.size) this.a2Score++; + } + + finalResult() { + console.log("\nRESULTADO FINAL:"); + console.log(`${this.a1.name}: ${this.a1Score} puntos`); + console.log(`${this.a2.name}: ${this.a2Score} puntos`); + + if (this.a1Score > this.a2Score) { + console.log(`\n¡'${this.a1.name}' gana el versus!`); + } else if (this.a2Score > this.a1Score) { + console.log(`\n¡'${this.a2.name}' gana el versus!`); + } else { + console.log("\n¡Es un empate!"); + } + } + + async start() { + console.log(`${this.a1.name} vs ${this.a2.name}`); + this.popularity(); + this.followers(); + await this.top3Tracks(); + await this.albumsAndActiveYears(); + this.finalResult(); + } +} + +const main = async () => { + const spotify = new Spotify(); + await spotify.authenticate(); + + const artist1 = await spotify.getMostPopularArtist("Oasis"); + const artist2 = await spotify.getMostPopularArtist("Linkin Park"); + + if (!artist1 || !artist2) { + console.log("Artistas no encontrados"); + return; + } + + const versus = new Versus(artist1, artist2, spotify); + await versus.start(); +}; + +main(); From 71037952a5f5fbf3f6e4e8926fbbb073ebcd857b Mon Sep 17 00:00:00 2001 From: kenysdev Date: Wed, 25 Dec 2024 19:26:37 -0600 Subject: [PATCH 049/104] 38 - js - MOUREDEV PRO --- .../38 - MOUREDEV PRO/javascript/kenysdev.js | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 Roadmap/38 - MOUREDEV PRO/javascript/kenysdev.js diff --git a/Roadmap/38 - MOUREDEV PRO/javascript/kenysdev.js b/Roadmap/38 - MOUREDEV PRO/javascript/kenysdev.js new file mode 100644 index 0000000000..e4af706d3d --- /dev/null +++ b/Roadmap/38 - MOUREDEV PRO/javascript/kenysdev.js @@ -0,0 +1,106 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#38 MOUREDEV PRO +------------------------------------------------------- + * He presentado mi proyecto más importante del año: mouredev pro. + * Un campus para la comunidad, que lanzaré en octubre, donde estudiar + * programación de una manera diferente. + * Cualquier persona suscrita a la newsletter de https://mouredev.pro + * accederá a sorteos mensuales de suscripciones, regalos y descuentos. + * + * Desarrolla un programa que lea los registros de un fichero .csv y + * seleccione de manera aleatoria diferentes ganadores. + * Requisitos: + * 1. Crea un .csv con 3 columnas: id, email y status con valor "activo" + * o "inactivo" (y datos ficticios). + * Ejemplo: 1 | test@test.com | activo + * 2 | test2@test.com | inactivo + * (El .csv no debe subirse como parte de la corrección) + * 2. Recupera los datos desde el programa y selecciona email aleatorios. + * Acciones: + * 1. Accede al fichero .csv y selecciona de manera aleatoria un email + * ganador de una suscripción, otro ganador de un descuento y un último + * ganador de un libro (sólo si tiene status "activo" y no está repetido). + * 2. Muestra los emails ganadores y su id. + * 3. Ten en cuenta que la primera fila (con el nombre de las columnas) + * no debe tenerse en cuenta. +*/ +// ________________________________________________________ +// users.csv +/* +id,email,status +1,john.doe1@example.com,active +2,jane.smith2@example.com,active +3,michael.johnson3@example.com,active +4,emily.davis4@example.com,active +5,daniel.brown5@example.com,active +6,sarah.miller6@example.com,active +7,william.moore7@example.com,active +8,olivia.jones8@example.com,active +9,james.wilson9@example.com,active +10,lisa.taylor10@example.com,active +*/ + +const fs = require('fs'); + +const readCsv = (filePath) => { + try { + const data = fs.readFileSync(filePath, 'utf8'); + const lines = data.split('\n').map(line => line.trim()); + const headers = lines[0].split(','); + const rows = lines.slice(1).filter(line => line).map(line => { + const values = line.split(','); + const entry = {}; + headers.forEach((header, index) => { + entry[header.trim()] = values[index].trim(); + }); + return entry; + }); + return rows; + } catch (error) { + console.error(`Error reading '${filePath}': ${error.message}`); + return null; + } +}; + +const getActiveEntries = (entries) => { + return entries.filter(entry => entry.status.toLowerCase() === 'active') + .map(({ id, email, status }) => ({ id, email, status })); +}; + +const selectWinners = (activeEntries, numWinners) => { + const shuffled = [...activeEntries].sort(() => Math.random() - 0.5); + return shuffled.slice(0, Math.min(numWinners, activeEntries.length)); +}; + +const distributePrizes = (winners, prizes) => { + const shuffledPrizes = [...prizes].sort(() => Math.random() - 0.5); + winners.forEach((winner, index) => { + const prize = shuffledPrizes[index]; + console.log(`${prize.padEnd(11)} -> Id(${winner.id}): ${winner.email}`); + }); +}; + +const main = () => { + console.log("Usuarios ganadores de 'MOUREDEV PRO:'"); + const csvFile = 'users.csv'; + const prizes = ["Suscripción", "Descuento", "Libro"]; + + const entries = readCsv(csvFile); + if (entries) { + const activeEntries = getActiveEntries(entries); + const winners = selectWinners(activeEntries, 3); + if (winners.length > 0) { + distributePrizes(winners, prizes); + } else { + console.log("No se encontraron entradas activas."); + } + } else { + console.log("No se pudieron leer los datos del archivo CSV."); + } +}; + +main(); From f931c312ecadf0fbc2a6d88edcfe571cfa57dc1e Mon Sep 17 00:00:00 2001 From: kenysdev Date: Wed, 25 Dec 2024 19:26:54 -0600 Subject: [PATCH 050/104] 39 - js - BATMAN DAY --- .../39 - BATMAN DAY/javascript/kenysdev.js | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 Roadmap/39 - BATMAN DAY/javascript/kenysdev.js diff --git a/Roadmap/39 - BATMAN DAY/javascript/kenysdev.js b/Roadmap/39 - BATMAN DAY/javascript/kenysdev.js new file mode 100644 index 0000000000..dd1de9b3bd --- /dev/null +++ b/Roadmap/39 - BATMAN DAY/javascript/kenysdev.js @@ -0,0 +1,138 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#39 BATMAN DAY +------------------------------------------------------- +* EJERCICIO: + * Cada año se celebra el Batman Day durante la tercera semana de septiembre... + * ¡Y este año cumple 85 años! Te propongo un reto doble: + * + * RETO 1: + * Crea un programa que calcule cuándo se va a celebrar el Batman Day hasta + * su 100 aniversario. + * + * RETO 2: + * Crea un programa que implemente el sistema de seguridad de la Batcueva. + * Este sistema está diseñado para monitorear múltiples sensores distribuidos + * por Gotham, detectar intrusos y activar respuestas automatizadas. + * Cada sensor reporta su estado en tiempo real, y Batman necesita un programa + * que procese estos datos para tomar decisiones estratégicas. + * Requisitos: + * - El mapa de Gotham y los sensores se representa con una cuadrícula 20x20. + * - Cada sensor se identifica con una coordenada (x, y) y un nivel + * de amenaza entre 0 a 10 (número entero). + * - Batman debe concentrar recursos en el área más crítica de Gotham. + * - El programa recibe un listado de tuplas representando coordenadas de los + * sensores y su nivel de amenaza. El umbral de activación del protocolo de + * seguridad es 20 (sumatorio de amenazas en una cuadrícula 3x3). + * Acciones: + * - Identifica el área con mayor concentración de amenazas + * (sumatorio de amenazas en una cuadrícula 3x3). + * - Si el sumatorio de amenazas es mayor al umbral, activa el + * protocolo de seguridad. + * - Calcula la distancia desde la Batcueva, situada en (0, 0). La distancia es + * la suma absoluta de las coordenadas al centro de la cuadrícula amenazada. + * - Muestra la coordenada al centro de la cuadrícula más amenazada, la suma de + * sus amenazas, la distancia a la Batcueva y si se debe activar el + * protocolo de seguridad. + */ +// ________________________________________________________ +// Reto #1 +const getThirdSaturdayOfSeptember = (year) => { + const date = new Date(year, 8, 15); // Septiembre es el mes 8 (0-indexed) + const day = date.getDay(); + const offset = (6 - day + 7) % 7; // Calcula el sábado más cercano + date.setDate(date.getDate() + offset); + return date.toISOString().slice(0, 10); // YYYY-MM-DD +}; + +const anniversaryDates = (totalAnniversaries) => { + const batmanDayStart = 2014; + const currentYear = new Date().getFullYear(); + if (currentYear < batmanDayStart) { + console.log("Batman Day aún no ha comenzado."); + return; + } + + const pastAnniversaries = currentYear - batmanDayStart; + console.log(`Aniversarios que ya han pasado: ${pastAnniversaries}`); + + for (let i = pastAnniversaries; i < totalAnniversaries; i++) { + const num = i + 1; + const date = getThirdSaturdayOfSeptember(currentYear + (i - pastAnniversaries)); + console.log(`- Aniversario #${num}: ${date}`); + } +}; + +console.log("Batman Day"); +anniversaryDates(100); + + +// ________________________________________________________ +// Reto $2 +const createMap = (size, batcave, sensors, threats) => { + const gotham = Array.from({ length: size[0] }, () => Array(size[1]).fill('| ')); + gotham[batcave[0]][batcave[1]] = '|B'; + + sensors.forEach(([x, y]) => { + gotham[x][y] = '|S'; + }); + + threats.forEach(([x, y]) => { + gotham[x][y] = '|T'; + }); + + return gotham; +}; + +const printMap = (gotham) => { + console.log("\nMapa de Gotham:"); + gotham.forEach(row => console.log(row.join(''))); +}; + +const scanMap = (gotham, sensors) => { + const dangerList = sensors.map(([x, y, threat]) => { + let dangerCounter = 0; + for (let i = Math.max(0, x - 1); i <= Math.min(gotham.length - 1, x + 1); i++) { + for (let j = Math.max(0, y - 1); j <= Math.min(gotham[0].length - 1, y + 1); j++) { + if (gotham[i][j] === '|T') { + dangerCounter += threat; + } + } + } + return { location: [x, y], danger: dangerCounter }; + }); + + const maxDanger = dangerList.reduce((max, current) => (current.danger > max.danger ? current : max), { danger: 0 }); + + console.log("\nInforme:"); + console.log(`Cuadrícula más amenazada: '${maxDanger.location[0]}, ${maxDanger.location[1]}'`); + console.log(`Máximo nivel de alerta: '${maxDanger.danger}'`); + if (maxDanger.danger >= 20) { + console.log("Protocolo de seguridad activado."); + console.log(`Distancia: '${Math.abs(maxDanger.location[0]) + Math.abs(maxDanger.location[1])}'`); + } else { + console.log("No hay amenazas relevantes."); + } +}; + +const batcave = [0, 0]; +const sensors = [ + [2, 2, 10], + [6, 8, 9], + [10, 12, 8], + [17, 15, 7] +]; +const threats = [ + [2, 3], + [2, 1], + [6, 9], + [17, 16], + [15, 4] +]; + +const gotham = createMap([20, 20], batcave, sensors, threats); +printMap(gotham); +scanMap(gotham, sensors); From ae8f8d4e3800f1c8575d52e08e270d01d2a98c7d Mon Sep 17 00:00:00 2001 From: kenysdev Date: Wed, 25 Dec 2024 19:27:15 -0600 Subject: [PATCH 051/104] 40 - js - FORTNITE RUBIUS CUP --- .../javascript/kenysdev.js | 172 ++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 Roadmap/40 - FORTNITE RUBIUS CUP/javascript/kenysdev.js diff --git a/Roadmap/40 - FORTNITE RUBIUS CUP/javascript/kenysdev.js b/Roadmap/40 - FORTNITE RUBIUS CUP/javascript/kenysdev.js new file mode 100644 index 0000000000..9356285a64 --- /dev/null +++ b/Roadmap/40 - FORTNITE RUBIUS CUP/javascript/kenysdev.js @@ -0,0 +1,172 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#40 FORTNITE RUBIUS CUP +------------------------------------------------------- +* EJERCICIO: + * ¡Rubius tiene su propia skin en Fortnite! + * Y va a organizar una competición para celebrarlo. + * Esta es la lista de participantes: + * https://x.com/Rubiu5/status/1840161450154692876 + * + * Desarrolla un programa que obtenga el número de seguidores en + * Twitch de cada participante, la fecha de creación de la cuenta + * y ordene los resultados en dos listados. + * - Usa el API de Twitch: https://dev.twitch.tv/docs/api/reference + * (NO subas las credenciales de autenticación) + * - Crea un ranking por número de seguidores y por antigüedad. + * - Si algún participante no tiene usuario en Twitch, debe reflejarlo. + */ +// ________________________________________________________ +const axios = require('axios'); +const dotenv = require('dotenv'); +const { DateTime } = require('luxon'); + +class Twitch { + constructor(clientId, clientSecret) { + this.clientId = clientId; + this.clientSecret = clientSecret; + this.accessToken = null; + } + + async ensureAccessToken() { + if (!this.accessToken) { + const params = new URLSearchParams({ + client_id: this.clientId, + client_secret: this.clientSecret, + grant_type: 'client_credentials' + }); + + try { + const response = await axios.post('https://id.twitch.tv/oauth2/token', params); + this.accessToken = response.data.access_token; + } catch (error) { + throw new Error(`Error obtaining token: ${error.message}`); + } + } + } + + getHeaders() { + return { + 'Client-Id': this.clientId, + 'Authorization': `Bearer ${this.accessToken}` + }; + } + + async getFollowers(userId) { + const url = `https://api.twitch.tv/helix/channels/followers?broadcaster_id=${userId}`; + + try { + const response = await axios.get(url, { headers: this.getHeaders() }); + return response.data.total || 0; + } catch (error) { + throw new Error(`Error getting followers: ${error.message}`); + } + } + + async getUserData(userName) { + await this.ensureAccessToken(); + const url = `https://api.twitch.tv/helix/users?login=${userName}`; + + try { + const response = await axios.get(url, { headers: this.getHeaders() }); + const userData = response.data.data[0]; + + if (!userData) { + return null; + } + + const followers = await this.getFollowers(userData.id); + + return { + username: userName, + createdAt: DateTime.fromISO(userData.created_at), + followers + }; + } catch (error) { + throw new Error(`Error getting user data: ${error.message}`); + } + } +} + +function printRankings(usersData) { + const byFollowers = [...usersData].sort((a, b) => b.followers - a.followers); + const byDate = [...usersData].sort((a, b) => a.createdAt.toMillis() - b.createdAt.toMillis()); + + console.log('\nRanking por número de seguidores:'); + byFollowers.forEach((user, i) => { + console.log(`${i + 1} - ${user.username}: ${user.followers} seguidores`); + }); + + console.log('\nRanking por antigüedad:'); + byDate.forEach((user, i) => { + console.log(`${i + 1} - ${user.username}: Creado el ${user.createdAt.toFormat('dd/MM/yyyy')}`); + }); +} + +async function processUsers(users, tw) { + const usersData = []; + const notFoundUsers = []; + console.log('Obteniendo datos...'); + + for (const name of users) { + try { + const userData = await tw.getUserData(name); + if (userData) { + usersData.push(userData); + } else { + notFoundUsers.push(name); + } + } catch (error) { + notFoundUsers.push(name); + } + } + + printRankings(usersData); + + if (notFoundUsers.length > 0) { + console.log('\nUsuarios no encontrados:'); + notFoundUsers.forEach(user => console.log(user)); + } +} + +async function main() { + dotenv.config(); + const clientId = process.env.TWITCH_CLIENT_ID; + const clientSecret = process.env.TWITCH_CLIENT_SECRET; + + if (!clientId || !clientSecret) { + console.error('CLIENT_ID o CLIENT_SECRET no encontrados en .env'); + process.exit(1); + } + + const twitch = new Twitch(clientId, clientSecret); + + const users = [ + "abby", "ache", "adricontreras", "agustin", "alexby", "ampeter", "ander", + "arigameplays", "arigeli", "auronplay", "axozer", "beniju", "bycalitos", + "byviruzz", "carrera", "celopan", "cheeto", "crystalmolly", "darioemehache", + "dheyo", "djmario", "doble", "elvisa", "elyas360", "folagor", "grefg", + "guanyar", "hika", "hiper", "ibai", "ibelky", "illojuan", "imantado", + "irinaisasia", "jesskiu", "jopa", "jordiwild", "kenaisouza", "keroro", + "kiddkeo", "kikorivera", "knekro", "koko", "kronnozomber", "leviathan", + "litkillah", "lolalolita", "lolito", "luh", "luzu", "mangel", "mayichi", + "melo", "missasinonia", "mixwell", "mrjagger", "nategentile", "nexxuz", + "nia", "nilojeda", "nissaxter", "ollie", "orslok", "outconsumer", "papigavi", + "paracetamor", "patica", "paulagonu", "pausenpaii", "perxitaa", "plex", + "polispol", "quackity", "recuerdop", "reven", "rivers", "robertpg", "roier", + "rojuu", "rubius", "shadoune", "silithur", "spoksponha", "spreen", "spursito", + "staxx", "suzyroxx", "vicens", "vituber", "werlyb", "xavi", "xcry", "xokas", + "zarcort", "zeling", "zorman" + ]; + + try { + await processUsers(users, twitch); + } catch (error) { + console.error('Error:', error.message); + } +} + +main(); From 8ebf7d162e103978a1446c3cdc5fbcaf72951370 Mon Sep 17 00:00:00 2001 From: Edison Mondragon Date: Thu, 26 Dec 2024 12:31:47 -0500 Subject: [PATCH 052/104] =?UTF-8?q?Se=20optimiz=C3=B3=20la=20resoluci?= =?UTF-8?q?=C3=B3n=20del=20ejercicio=20con=20un=20c=C3=B3digo=20m=C3=A1s?= =?UTF-8?q?=20simple=20y=20limpio.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../python/edisonlmg.py" | 94 ++++++++----------- 1 file changed, 39 insertions(+), 55 deletions(-) diff --git "a/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" "b/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" index 0ba813b09b..054dd83f7a 100644 --- "a/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" +++ "b/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" @@ -1,90 +1,74 @@ -#============================ +#======================================================================================================================= # 49 El almacen de Papá Noel -#============================ +#======================================================================================================================= +# Importar librerias import random -import sys +import re -# Funcion que comprueba errores - -def validar_cadena(cadena): - - if len(cadena) != 4: - return "Error: La cadena debe tener exactamente 4 caracteres." - - errores = [] - - for char in cadena: - if char not in "ABC123": - errores.append(f"'{char}'") - - if len(set(cadena)) != len(cadena): - errores.append("Los caracteres no deben repetirse") - - if errores: - return f"Error: {', '.join(errores)}. Solo se permiten A, B, C, 1, 2, y 3, y sin repeticiones." - - return "La cadena es válida." - -# Funcion que comprueba la contraseña ingresada - -def comprobar_psw(psw_in, psw): - - for x, y in zip(psw_in, psw): - - if x == y: - print(f'\n{x}: Correcto') - elif x in psw: - print(f'\n{x}: Presente') - else: - print(f'\n{x}: Incorrecto') - -# Generar una cadena aleatoria de 4 caracteres +# Expresion regular para password +pattern = r'^(?!.*(.).*\1)[ABC123]{4}$' +# Generar password aleatorio psw = ''.join(random.sample('ABC123', k=4)) # Inicio de juego - print(''' \n¡Bienvenido Papá Noel, es hora de repartir regalos! \nPara abrir al almacén de juguetes digita la clave de ingreso (tienes 10 intentos). - \nPista: La clave son 4 dígitos alfanuméricos con letras de la A la C -y números del 1 al 3, en mayúsculas y sin repeticiones. + \nPista: La contraseña debe contener 4 caracteres sin repeticiones y solo acepta +los valores A,B,C,1,2 y 3. ''') # Inicio de bucle intento = 0 -while intento < 10: +while intento <= 10: + # Iniciar contador intento += 1 - print(f'\nIntento n.° {intento}:') - psw_in = input('\nIngresa contraseña: ') - resultado = validar_cadena(psw_in) + # Si se excedio de 10 intentos terminar el juego + if intento > 10: + print(''' + \n¡Oh, no. Papá Noel has olvidado la contraseña! + Ya no te quedan más intentos. + ''') + break + + # Solicitar el ingreso de un password + print(f'\nIntento n.° {intento}:') + psw_in = input('\nIngresa contraseña: ').upper() - if resultado == "La cadena es válida.": + # Comprobar si el passwor ingresado es valido + if bool(re.match(pattern, psw_in)): pass else: - print(resultado) + print(''' + \nLa contarseña ingresada no es válida. La contraseña debe contener 4 +caracteres sin repeticiones y solo acepta los valores A,B,C,1,2 y 3. + ''') continue + # Si el password fue valido comprobar si es el correcto if psw_in == psw: print(''' \n La contraseña es correcta. \n¡Felicidades, a repartir juguetes! ''') - sys.exit() - else: + break + else: # Si el password es incorrecto dar las pistas por cada caracter print(f''' \nLa contraseña es incorrecta. Pero descuida, te doy unas pistas: ''') - comprobar_psw(psw_in, psw) - -print(''' - \n¡Oh, no. Papá Noel has olvidado la contraseña! -Ya no te quedan más intentos. - ''') + for x, y in zip(psw_in, psw): + if x == y: + print(f'\n{x}: Correcto') + elif x in psw: + print(f'\n{x}: Presente') + else: + print(f'\n{x}: Incorrecto') + print('\n¡Vuelve a intentarlo, Papá Noel!') From 89c641bd3275539c17fa16c128573f8a4a44612e Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 26 Dec 2024 12:20:55 -0600 Subject: [PATCH 053/104] 41 - js - CAMISETA RAR --- .../41 - CAMISETA RAR/javascript/kenysdev.js | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Roadmap/41 - CAMISETA RAR/javascript/kenysdev.js diff --git a/Roadmap/41 - CAMISETA RAR/javascript/kenysdev.js b/Roadmap/41 - CAMISETA RAR/javascript/kenysdev.js new file mode 100644 index 0000000000..df4a292352 --- /dev/null +++ b/Roadmap/41 - CAMISETA RAR/javascript/kenysdev.js @@ -0,0 +1,59 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#41 CAMISETA RAR +------------------------------------------------------- +* EJERCICIO: + * ¿Has visto la camiseta.rar? + * https://x.com/MoureDev/status/1841531938961592740 + * + * Crea un programa capaz de comprimir un archivo + * en formato .zip (o el que tú quieras). + * - No subas el archivo o el zip. + */ +// ________________________________________________________ +const fs = require('fs'); +const path = require('path'); +const archiver = require('archiver'); + +function compressFile(sourceFile, zipFile) { + if (!fs.existsSync(sourceFile)) { + throw new Error(`El archivo fuente '${sourceFile}' no existe.`); + } + + const zipDir = path.dirname(zipFile) || '.'; + if (!fs.existsSync(zipDir)) { + throw new Error(`El directorio '${zipDir}' no existe.`); + } + + if (fs.existsSync(zipFile)) { + throw new Error(`El archivo zip '${zipFile}' ya existe.`); + } + + const output = fs.createWriteStream(zipFile); + const archive = archiver('zip', { + zlib: { level: 9 } // Nivel de compresión (máximo) + }); + + return new Promise((resolve, reject) => { + output.on('close', () => { + console.log(`Comprimido exitosamente '${sourceFile}' a '${zipFile}'`); + resolve(); + }); + + archive.on('error', (err) => { + reject(new Error(`Se produjo un error al comprimir el archivo: ${err.message}`)); + }); + + archive.pipe(output); + archive.file(sourceFile, { name: path.basename(sourceFile) }); + archive.finalize(); + }); +} + +// Ejemplo de uso +compressFile('people.json', 'file.zip') + .then(() => console.log('Operación completada.')) + .catch(err => console.error(err.message)); From 546f1dc868f059c424ebdcdcba80adb7770ffc77 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 26 Dec 2024 12:21:13 -0600 Subject: [PATCH 054/104] 42 - js - TORNEO DRAGON BALL --- .../javascript/kenysdev.js | 187 ++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 Roadmap/42 - TORNEO DRAGON BALL/javascript/kenysdev.js diff --git a/Roadmap/42 - TORNEO DRAGON BALL/javascript/kenysdev.js b/Roadmap/42 - TORNEO DRAGON BALL/javascript/kenysdev.js new file mode 100644 index 0000000000..dc1258b0c5 --- /dev/null +++ b/Roadmap/42 - TORNEO DRAGON BALL/javascript/kenysdev.js @@ -0,0 +1,187 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#42 TORNEO DRAGON BALL +------------------------------------------------------- +* EJERCICIO: + * ¡El último videojuego de Dragon Ball ya está aquí! + * Se llama Dragon Ball: Sparking! ZERO. + * + * Simula un Torneo de Artes Marciales, al más puro estilo + * de la saga, donde participarán diferentes luchadores, y el + * sistema decidirá quién es el ganador. + * + * Luchadores: + * - Nombre. + * - Tres atributos: velocidad, ataque y defensa + * (con valores entre 0 a 100 que tú decidirás). + * - Comienza cada batalla con 100 de salud. + * Batalla: + * - En cada batalla se enfrentan 2 luchadores. + * - El luchador con más velocidad comienza atacando. + * - El daño se calcula restando el daño de ataque del + * atacante menos la defensa del oponente. + * - El oponente siempre tiene un 20% de posibilidad de + * esquivar el ataque. + * - Si la defensa es mayor que el ataque, recibe un 10% + * del daño de ataque. + * - Después de cada turno y ataque, el oponente pierde salud. + * - La batalla finaliza cuando un luchador pierde toda su salud. + * Torneo: + * - Un torneo sólo es válido con un número de luchadores + * potencia de 2. + * - El torneo debe crear parejas al azar en cada ronda. + * - Los luchadores se enfrentan en rondas eliminatorias. + * - El ganador avanza a la siguiente ronda hasta que sólo + * quede uno. + * - Debes mostrar por consola todo lo que sucede en el torneo, + * así como el ganador. + */ +// ________________________________________________________ +const Fighter = class { + constructor(name, speed, attack, defense) { + this._name = name; + this._speed = speed; + this._attack = attack; + this._defense = defense; + this._health = 100; + } + + executeAttack(opponent) { + console.log(`'${this._name}' ataca a '${opponent._name}'`); + + let damage = 0; + if (opponent._defense >= this._attack) { + damage = this._attack * 0.1; // 10% + } else { + damage = this._attack - opponent._defense; + } + + if (!opponent.activateDefense()) { + opponent._health -= damage; + console.log(`'${opponent._name}' ha recibido '${damage}' de daño`); + console.log(`Salud restante '${opponent._health}'\n`); + } else { + console.log(`'${opponent._name}' ha esquivado el ataque.\n`); + } + } + + activateDefense() { + return Math.random() <= 0.2; // 20% + } +} + +class Battle { + constructor(fighter1, fighter2) { + this._fighter1 = fighter1; + this._fighter2 = fighter2; + console.log(`__'${this._fighter1._name} VS '${this._fighter2._name}'__\n`); + } + + _combat(fighterA, fighterB) { + while (true) { + fighterA.executeAttack(fighterB); + if (fighterB._health <= 0) { + console.log(`--> '${fighterA._name}' gana la batalla.__\n`); + return fighterA; + } + + fighterB.executeAttack(fighterA); + if (fighterA._health <= 0) { + console.log(`--> '${fighterB._name}' gana la batalla.\n`); + return fighterB; + } + } + } + + start() { + if (this._fighter1._speed > this._fighter2._speed) { + return this._combat(this._fighter1, this._fighter2); + } else { + return this._combat(this._fighter2, this._fighter1); + } + } +} + +class Tournament { + constructor(fighter, battle, fighters) { + this._fighter = fighter; + this._battle = battle; + this._fighters = fighters; + this._isValidTournament = this._isPowerOf2(); + } + + _isPowerOf2() { + const n = Object.keys(this._fighters).length; + if (n <= 1) return false; + return Number.isInteger(Math.log2(n)); + } + + _getRandomPairs() { + const fightersArray = Object.entries(this._fighters); + const randomIndexes = Array.from({ length: 2 }, () => + Math.floor(Math.random() * fightersArray.length) + ); + + const [name1, data1] = fightersArray[randomIndexes[0]]; + const [name2, data2] = fightersArray[randomIndexes[1]]; + + const fighter1 = new this._fighter(name1, data1.speed, data1.attack, data1.defense); + const fighter2 = new this._fighter(name2, data2.speed, data2.attack, data2.defense); + + delete this._fighters[name1]; + delete this._fighters[name2]; + + return [fighter1, fighter2]; + } + + startRounds(roundNum = 1) { + if (roundNum === 1 && !this._isValidTournament) { + console.log("El número de luchadores debe ser una potencia de 2."); + return; + } + + console.log(`\n__Ronda #${roundNum}__`); + const nextRound = {}; + + while (true) { + const [fighter1, fighter2] = this._getRandomPairs(); + const battle = new this._battle(fighter1, fighter2); + const winner = battle.start(); + + nextRound[winner._name] = { + speed: winner._speed, + attack: winner._attack, + defense: winner._defense + }; + + if (Object.keys(this._fighters).length === 0 && Object.keys(nextRound).length > 1) { + this._fighters = nextRound; + this.startRounds(roundNum + 1); + break; + } + + if (Object.keys(this._fighters).length === 0 && Object.keys(nextRound).length === 1) { + console.log(`\n--> El vencedor del torneo es '${winner._name}'.`); + break; + } + } + } +} + +const FIGHTERS = { + "Goku": { speed: 100, attack: 95, defense: 85 }, + "Vegeta": { speed: 95, attack: 90, defense: 90 }, + "Gohan": { speed: 85, attack: 95, defense: 85 }, + "Freezer": { speed: 90, attack: 90, defense: 90 }, + "Piccolo": { speed: 90, attack: 85, defense: 90 }, + "Krillin": { speed: 85, attack: 75, defense: 75 }, + "Cell": { speed: 90, attack: 95, defense: 85 }, + "Majin Buu": { speed: 80, attack: 85, defense: 95 } +}; + +console.log("Simulación del Torneo de Artes Marciales"); +const tournament = new Tournament(Fighter, Battle, { ...FIGHTERS }); +tournament.startRounds(); From d84025b8c6ba705600fbc96cbbbc356d1ad081d3 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 26 Dec 2024 12:21:28 -0600 Subject: [PATCH 055/104] 43 - js - GIT GITHUB CLI --- .../javascript/kenysdev.js | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 Roadmap/43 - GIT GITHUB CLI/javascript/kenysdev.js diff --git a/Roadmap/43 - GIT GITHUB CLI/javascript/kenysdev.js b/Roadmap/43 - GIT GITHUB CLI/javascript/kenysdev.js new file mode 100644 index 0000000000..64f9af6315 --- /dev/null +++ b/Roadmap/43 - GIT GITHUB CLI/javascript/kenysdev.js @@ -0,0 +1,161 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#43 GIT GITHUB CLI +------------------------------------------------------- +* EJERCICIO: + * ¡Me voy de viaje al GitHub Universe 2024 de San Francisco! + * + * Desarrolla un CLI (Command Line Interface) que permita + * interactuar con Git y GitHub de manera real desde terminal. + * + * El programa debe permitir las siguientes opciones: + * 1. Establecer el directorio de trabajo + * 2. Crear un nuevo repositorio + * 3. Crear una nueva rama + * 4. Cambiar de rama + * 5. Mostrar ficheros pendientes de hacer commit + * 6. Hacer commit (junto con un add de todos los ficheros) + * 7. Mostrar el historial de commits + * 8. Eliminar rama + * 9. Establecer repositorio remoto + * 10. Hacer pull + * 11. Hacer push + * 12. Salir + * + * Puedes intentar controlar los diferentes errores. + */ +// ________________________________________________________ +const { exec } = require('child_process'); +const readline = require('readline'); +const path = require('path'); +const fs = require('fs'); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +const question = (query) => new Promise((resolve) => rl.question(query, resolve)); + +function runCommand(command, msg = "") { + return new Promise((resolve) => { + if (msg) console.log(msg); + + exec(command, { encoding: 'utf8' }, (error, stdout, stderr) => { + if (error) { + console.log(`❌: ${stderr.trim()}`); + } else { + console.log(`✅: ${stdout.trim()}`); + } + resolve(); + }); + }); +} + +async function setDirectory() { + console.log("Establecer directorio de trabajo:"); + const dirPath = await question("Ruta: "); + + if (fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) { + process.chdir(dirPath); + } else { + console.log("Esta ruta no existe."); + } +} + +async function setRemoteRepository() { + const remoteUrl = await question("URL del repositorio: "); + await runCommand(`git remote add origin ${remoteUrl}`); + await runCommand("git push -u origin main"); +} + +const MENU = ` +Interactuar con Git y GitHub: +------------------------------------------------------------ +| 1. Establecer directorio | 7. Historial de commits | +| 2. Crear repositorio | 8. Eliminar rama | +| 3. Crear rama | 9. Configurar remoto | +| 4. Cambiar rama | 10. pull | +| 5. Mostrar cambios pendientes | 11. push | +| 6. 'add' + 'commit' | 12. Salir | +------------------------------------------------------------ +Directorio actual:`; + +async function main() { + while (true) { + console.log(MENU); + await runCommand(process.platform === "win32" ? "cd" : "pwd"); + + const option = await question("\nOpción: "); + + switch (option) { + case "1": + await setDirectory(); + break; + + case "2": + await runCommand("git init && git branch -M main", "Crear repositorio"); + break; + + case "3": + console.log("Crear nueva rama:"); + const newBranch = await question("Nombre: "); + await runCommand(`git branch -c ${newBranch}`); + break; + + case "4": + console.log("Cambiar de rama:"); + const switchBranch = await question("Nombre: "); + await runCommand(`git switch ${switchBranch}`); + break; + + case "5": + await runCommand("git status -s", "Mostrar cambios"); + break; + + case "6": + console.log("Nuevo commit:"); + const commitMsg = await question("Mensaje: "); + await runCommand(`git add . && git commit -m '${commitMsg}'`); + break; + + case "7": + await runCommand("git log --oneline", "Historial de commits"); + break; + + case "8": + console.log("Eliminar rama"); + const deleteBranch = await question("Nombre: "); + await runCommand(`git branch -d ${deleteBranch}`); + break; + + case "9": + await setRemoteRepository(); + break; + + case "10": + const pullBranch = await question("rama: "); + await runCommand(`git pull origin ${pullBranch}`); + break; + + case "11": + const pushBranch = await question("rama: "); + await runCommand(`git push origin ${pushBranch}`); + break; + + case "12": + console.log("Bye."); + rl.close(); + return; + + default: + console.log("Opción no válida."); + } + } +} + +rl.on('close', () => process.exit(0)); +main().catch(console.error); From e9d3c17f4d158db16ee04d0046813af7f8f2ff9b Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 26 Dec 2024 12:21:45 -0600 Subject: [PATCH 056/104] =?UTF-8?q?44=20-=20js=20-=20CUENTA=20ATR=C3=81S?= =?UTF-8?q?=20MOUREDEV=20PRO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javascript/kenysdev.js" | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 "Roadmap/44 - CUENTA ATR\303\201S MOUREDEV PRO/javascript/kenysdev.js" diff --git "a/Roadmap/44 - CUENTA ATR\303\201S MOUREDEV PRO/javascript/kenysdev.js" "b/Roadmap/44 - CUENTA ATR\303\201S MOUREDEV PRO/javascript/kenysdev.js" new file mode 100644 index 0000000000..0eec6e7364 --- /dev/null +++ "b/Roadmap/44 - CUENTA ATR\303\201S MOUREDEV PRO/javascript/kenysdev.js" @@ -0,0 +1,76 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#44 CUENTA ATRÁS MOUREDEV PRO +------------------------------------------------------- +* EJERCICIO: + * ¡El 12 de noviembre lanzo mouredev pro! + * El campus de la comunidad para estudiar programación de + * una manera diferente: https://mouredev.pro + * + * Crea un programa que funcione como una cuenta atrás. + * + * - Al iniciarlo tendrás que indicarle el día, mes, año, + * hora, minuto y segundo en el que quieres que finalice. + * - Deberás transformar esa fecha local a UTC. + * - La cuenta atrás comenzará y mostrará los días, horas, + * minutos y segundos que faltan. + * - Se actualizará cada segundo y borrará la terminal en + * cada nueva representación del tiempo restante. + * - Una vez finalice, mostrará un mensaje. + * - Realiza la ejecución, si el lenguaje lo soporta, en + * un hilo independiente. + */ +// ________________________________________________________ +const readline = require('readline'); + +class ReverseTimer { + constructor(endDate) { + this.endDate = new Date(endDate); + if (isNaN(this.endDate)) { + throw new Error("La fecha de finalización no es válida."); + } + } + + timeRemaining() { + const now = new Date(); + const delta = this.endDate - now; + return Math.max(delta, 0); + } + + hasFinished() { + return this.timeRemaining() === 0; + } + + toString() { + const delta = this.timeRemaining(); + const days = Math.floor(delta / (1000 * 60 * 60 * 24)); + const hours = Math.floor((delta % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + const minutes = Math.floor((delta % (1000 * 60 * 60)) / (1000 * 60)); + const seconds = Math.floor((delta % (1000 * 60)) / 1000); + return `${days} días, ${hours} horas, ${minutes} minutos, ${seconds} segundos.`; + } + + printRemaining() { + const interval = setInterval(() => { + // Limpiar la consola + readline.cursorTo(process.stdout, 0, 0); + readline.clearScreenDown(process.stdout); + + console.log("Tiempo restante:"); + console.log(this.toString()); + + if (this.hasFinished()) { + console.log("¡Cuenta atrás finalizada!"); + clearInterval(interval); + } + }, 1000); + } +} + +// Uso del temporizador +const endDate = "2024-12-31T23:59:59.999Z"; // UTC explícito +const timer = new ReverseTimer(endDate); +timer.printRemaining(); From ec5cf7b45e5f27a02221d6ae55a96b94f89b0d69 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 26 Dec 2024 12:22:10 -0600 Subject: [PATCH 057/104] 45 - js - GITHUB OCTOVERSE --- .../javascript/kenysdev.js | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 Roadmap/45 - GITHUB OCTOVERSE/javascript/kenysdev.js diff --git a/Roadmap/45 - GITHUB OCTOVERSE/javascript/kenysdev.js b/Roadmap/45 - GITHUB OCTOVERSE/javascript/kenysdev.js new file mode 100644 index 0000000000..8f97fcf056 --- /dev/null +++ b/Roadmap/45 - GITHUB OCTOVERSE/javascript/kenysdev.js @@ -0,0 +1,154 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#45 GITHUB OCTOVERSE +------------------------------------------------------- +* EJERCICIO: + * GitHub ha publicado el Octoverse 2024, el informe + * anual del estado de la plataforma: + * https://octoverse.github.com + * + * Utilizando el API de GitHub, crea un informe asociado + * a un usuario concreto. + * + * - Se debe poder definir el nombre del usuario + * sobre el que se va a generar el informe. + * + * - Crea un informe de usuario basándote en las 5 métricas + * que tú quieras, utilizando la informración que te + * proporciona GitHub. Por ejemplo: + * - Lenguaje más utilizado + * - Cantidad de repositorios + * - Seguidores/Seguidos + * - Stars/forks + * - Contribuciones + * (lo que se te ocurra) + */ +// ________________________________________________________ +import fetch from 'node-fetch'; +import readlineSync from 'readline-sync'; + +class GitHubApi { + constructor(userName) { + this.userName = userName; + this.userData = null; + } + + async getJson(url) { + try { + const response = await fetch(url); + + if (!response.ok) { + console.error(`Error: ${response.status} - ${response.statusText}`); + return {}; + } + + const text = await response.text(); + if (text.trim() === "") { + console.error("Error: Respuesta vacía de la API."); + return {}; + } + + try { + return JSON.parse(text); + } catch (jsonError) { + console.error(`Error al parsear JSON: ${jsonError.message}`); + return {}; + } + + } catch (error) { + console.error(`Error de red: ${error.message}`); + return {}; + } + } + + async verifyStatus() { + if (!this.userData) { + console.error(`Usuario '${this.userName}' no encontrado.`); + return false; + } + return true; + } + + getRepoInfo(repo) { + return ` + Lang: ${repo.full_name || "Desconocido"} + Repo: ${repo.language || "Desconocido"} + Stars: ${repo.stargazers_count || 0} + Forks: ${repo.forks_count || 0} + `.replace(/^\s+/gm, '').trim(); + } + + async printBasicInfo() { + if (!await this.verifyStatus()) return; + + const { name, created_at, public_repos, public_gists, followers, following } = this.userData; + console.log(''); + console.log(` + ------------------------------------------- + Nombre: ${name || "Desconocido"} + Creación: ${created_at || "Desconocido"} + Repos: ${public_repos || 0} + Gists: ${public_gists || 0} + Seguidores: ${followers || 0} + Seguidos: ${following || 0} + ------------------------------------------- + `.replace(/^\s+/gm, '').trim()); + } + + async printReposInfo() { + if (!await this.verifyStatus()) return; + + const reposUrl = this.userData.repos_url || null; + if (!reposUrl) { + console.error("No se encontró la URL de los repositorios."); + return; + } + + const reposData = await this.getJson(reposUrl); + const languages = new Map(); + + console.log("Repositorios públicos:"); + for (const repo of reposData) { + const language = repo.language; + console.log('') + console.log(this.getRepoInfo(repo)); + + if (language) { + languages.set(language, (languages.get(language) || 0) + 1); + } + } + + // Encuentra el lenguaje más utilizado + let mostUsedLanguage = null; + let maxCount = 0; + for (const [language, count] of languages) { + if (count > maxCount) { + mostUsedLanguage = language; + maxCount = count; + } + } + + console.log("________"); + console.log(`Total de repositorios: ${reposData.length}`); + console.log(`El lenguaje más utilizado: ${mostUsedLanguage} (${maxCount})`); + } + + async init() { + const url = `https://api.github.com/users/${this.userName}`; + this.userData = await this.getJson(url); + } +} + +// Ejecución principal +(async () => { + console.log("Informe sobre los datos del usuario en GitHub"); + const userName = readlineSync.question("Usuario: "); + const github = new GitHubApi(userName); + + await github.init(); + await github.printBasicInfo(); + await github.printReposInfo(); +})(); From a78ac2b55f75e8f25df6be051724ce98f0c63236 Mon Sep 17 00:00:00 2001 From: hozlucas28 Date: Thu, 26 Dec 2024 16:00:50 -0300 Subject: [PATCH 058/104] Solution 50 - Python --- .../python/hozlucas28.py" | 369 ++++++++++++++++++ 1 file changed, 369 insertions(+) create mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/hozlucas28.py" diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/hozlucas28.py" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/hozlucas28.py" new file mode 100644 index 0000000000..3a9d83d562 --- /dev/null +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/hozlucas28.py" @@ -0,0 +1,369 @@ +# pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring,consider-using-dict-items,line-too-long + +from datetime import datetime +from pathlib import Path +from typing import TypedDict, Union, TypeVar, Iterable, Callable +from uuid import UUID, uuid4 + +# ---------------------------------------------------------------------------- # +# TYPES # +# ---------------------------------------------------------------------------- # + +YearPlan = TypedDict( + "YearPlan", + { + "january": list[list[Union["Goal", int]]], + "february": list[list[Union["Goal", int]]], + "march": list[list[Union["Goal", int]]], + "april": list[list[Union["Goal", int]]], + "may": list[list[Union["Goal", int]]], + "june": list[list[Union["Goal", int]]], + "july": list[list[Union["Goal", int]]], + "august": list[list[Union["Goal", int]]], + "september": list[list[Union["Goal", int]]], + "october": list[list[Union["Goal", int]]], + "november": list[list[Union["Goal", int]]], + "december": list[list[Union["Goal", int]]], + }, +) + +# ---------------------------------------------------------------------------- # +# EXCEPTIONS # +# ---------------------------------------------------------------------------- # + + +class MonthsOutOfRangeException(Exception): + def __init__(self) -> None: + super().__init__("Months out of range") + + +# ---------------------------------------------------------------------------- # +# CLASSES # +# ---------------------------------------------------------------------------- # + + +# ----------------------------------- Goal ----------------------------------- # + + +class Goal: + __amount: int + __description: str + __uid: UUID + __months_limit: int + __units: str + + def __init__( + self, *, _amount: int, _description: str, _months_limit: int, _units: str + ) -> None: + self.__amount = _amount + self.__description = _description + self.__uid = uuid4() + self.__units = _units + + if _months_limit < 1 or _months_limit > Goal.max_months_limit(): + raise MonthsOutOfRangeException() + + self.__months_limit = _months_limit + + @staticmethod + def max_months_limit() -> int: + return 12 + + @property + def amount(self) -> int: + return self.__amount + + @property + def description(self) -> str: + return self.__description + + @property + def uid(self) -> UUID: + return self.__uid + + @property + def months_limit(self) -> int: + return self.__months_limit + + @property + def units(self) -> str: + return self.__units + + def to_year_plan(self) -> YearPlan: + year_plan: YearPlan = { + "january": [], + "february": [], + "march": [], + "april": [], + "may": [], + "june": [], + "july": [], + "august": [], + "september": [], + "october": [], + "november": [], + "december": [], + } + + counter: int = self.__amount + while counter: + month_counter: int = self.__months_limit + for _key in year_plan: + if not counter or not month_counter: + break + + try: + year_plan[_key][0][1] += 1 + except IndexError: + year_plan[_key].append([self, 1]) + + month_counter -= 1 + counter -= 1 + + return year_plan + + +# --------------------------------- YearGoals -------------------------------- # + + +class YearGoals: + __goals: list[Goal] + __plan: YearPlan + + def __init__(self) -> None: + self.__goals = [] + + self.__plan = { + "january": [], + "february": [], + "march": [], + "april": [], + "may": [], + "june": [], + "july": [], + "august": [], + "september": [], + "october": [], + "november": [], + "december": [], + } + + @staticmethod + def max_goals() -> int: + return 10 + + @property + def goals(self) -> list[Goal]: + return self.__goals + + @property + def plan(self) -> YearPlan: + return self.__plan + + def __append_goal_to_plan(self, *, _goal: Goal) -> None: + goal_year_plan: YearPlan = _goal.to_year_plan() + + aux: YearPlan = self.plan + + for _key in goal_year_plan: + if goal_year_plan[_key]: + aux[_key].append(*goal_year_plan[_key]) + continue + break + + self.__plan = aux + + def __remove_goal_from_plan(self, *, uid: UUID) -> None: + def __fn(element: list[Union[Goal, int]]) -> bool: + return element[0].uid == uid # type: ignore + + aux: YearPlan = self.plan + + for _key in self.__plan: + goal_i: int = index_fn(iterable=aux[_key], fn=__fn) + if goal_i == -1: + break + + aux[_key] = [*aux[_key][:goal_i], aux[_key][goal_i + 1 :]] + + def add_goal(self, *, new_goal: Goal) -> bool: + if len(self.__goals) == YearGoals.max_goals(): + return False + + new_goal_uid: UUID = new_goal.uid + + goal_i: int = index_fn( + iterable=self.__goals, fn=lambda value: value.uid == new_goal_uid + ) + if goal_i != -1: + return False + + self.__goals.append(new_goal) + self.__append_goal_to_plan(_goal=new_goal) + + return True + + def remove_goal(self, *, uid: UUID) -> bool: + goal_i: int = index_fn(iterable=self.__goals, fn=lambda goal: goal.uid == uid) + if goal_i == -1: + return False + + self.__goals = [*self.__goals[:goal_i], *self.__goals[goal_i + 1 :]] + self.__remove_goal_from_plan(uid=uid) + + return True + + def save_plan( + self, + *, + _path: str, + row: Callable[[Goal, int, int], str], + month_title: Callable[[str], str] = lambda month: month.capitalize(), + ) -> None: + data: list[str] = [] + + for _key in self.__plan: + goals_month: list[list[Union[Goal, int]]] = self.__plan[_key] + + rows: list[str] = [month_title(_key)] + for _i, [_goal, _amount] in enumerate(iterable=goals_month): + rows.append(row(_goal, _amount, _i)) # type: ignore + + data.append("\n".join(rows)) + data.append("\n\n") + + with open(file=_path, mode="wt", encoding="utf-8") as file: + file.writelines(data) + file.close() + + +# ---------------------------------------------------------------------------- # +# UTILITIES # +# ---------------------------------------------------------------------------- # + +T = TypeVar("T") + + +def index_fn(*, iterable: Iterable[T], fn: Callable[[T], bool]) -> int: + for _i, element in enumerate(iterable=iterable): + if fn(element): + return _i + return -1 + + +def goal_to_row(_goal: Goal, _amount: int, index: int) -> str: + _desc: str = _goal.description + _units: str = _goal.units + _total_amount: int = _goal.amount + return f"[ ] {index + 1}. {_desc} ({_amount} {_units}/mes). Total: {_total_amount}." + + +# ---------------------------------------------------------------------------- # +# MAIN # +# ---------------------------------------------------------------------------- # + +year_goals: YearGoals = YearGoals() + + +print( + "> Available operations:\n\n" + + " 1 - Add goal.\n" + + " 2 - Remove goal.\n" + + " 3 - Show goals.\n" + + " 4 - Show plan.\n" + + " 5 - Save plan.\n" + + " 0 - Exit." +) + +user_input: str = input("\n> Select an operation: ").strip() + +while user_input != "0": + match (user_input): + case "1": + print("\n> Complete the following goal data...") + units: str = input("\n> Units: ").strip() + amount: int = int(input("\n> Amount (as a number): ").strip()) + description: str = input("\n> Description: ").strip() + + months_limit: int = int(input("\n> Months limit (as a number): ").strip()) + while months_limit < 1 or months_limit > Goal.max_months_limit(): + print( + "\n> Error! Months limit must be between 1 and 12 (both included). Try again..." + ) + months_limit = int(input("\n> Months limit (as a number): ").strip()) + + goal: Goal = Goal( + _amount=amount, + _description=description, + _months_limit=months_limit, + _units=units, + ) + + if year_goals.add_goal(new_goal=goal): + print("\n> Goal added!") + else: + print("\n> An error occurred! The goal was not added.") + + case "2": + goal_uid: UUID = UUID(input("\n> Goal id to remove: ").strip()) + + if year_goals.remove_goal(uid=goal_uid): + print(f'\n> Goal "{goal_uid}" removed!') + else: + print("\n> An error occurred! The goal was not removed.") + + case "3": + goals_rows: list[str] = [] + for _goal in year_goals.goals: + goals_rows.append( + f'\n• Goal "{_goal.uid}"...' + + f'\n\n - ID: "{_goal.uid}".' + + f'\n - Description: "{_goal.description}".' + + f"\n - Months limit: {_goal.months_limit}." + + f"\n - Amount: {_goal.amount}." + + f'\n - Units: "{_goal.units}".' + ) + + if goals_rows: + print("\n".join(goals_rows)) + + case "4": + plan: YearPlan = year_goals.plan + + plan_rows: list[str] = [] + for key in plan: + goals: list[list[Union[Goal, int]]] = plan[key] + + plan_row: str = f"\n{key.capitalize()}:" + for i, [goal, amount] in enumerate(iterable=goals): # type: ignore + desc: str = goal.description + units: str = goal.units + total_amount: int = goal.amount + plan_row += f"\n[ ] {i + 1}. {desc} ({amount} {units}/mes). Total: {total_amount}." + + plan_rows.append(plan_row) + + if plan_rows: + print("\n".join(plan_rows)) + + case "5": + current_date: datetime = datetime.now() + path: str = f"{Path().absolute()}\\plan-{current_date.year}.txt" + year_goals.save_plan(_path=path, row=goal_to_row) + + print(f'\n> Plan saved in "{path}" path.') + + case "_": + print("\n> Invalid operation! Try again...") + + print( + "\n> Available operations:\n\n" + + " 1 - Add goal.\n" + + " 2 - Remove goal.\n" + + " 3 - Show goals.\n" + + " 4 - Show plan.\n" + + " 5 - Save plan.\n" + + " 0 - Exit." + ) + + user_input = input("\n> Select an operation: ").strip() From 136b56e10bf058d2507055c10966e3b59f14fa10 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 26 Dec 2024 13:02:31 -0600 Subject: [PATCH 059/104] 46 - js - X VS BLUESKY --- .../46 - X VS BLUESKY/javascript/kenysdev.js | 222 ++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 Roadmap/46 - X VS BLUESKY/javascript/kenysdev.js diff --git a/Roadmap/46 - X VS BLUESKY/javascript/kenysdev.js b/Roadmap/46 - X VS BLUESKY/javascript/kenysdev.js new file mode 100644 index 0000000000..186b600721 --- /dev/null +++ b/Roadmap/46 - X VS BLUESKY/javascript/kenysdev.js @@ -0,0 +1,222 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#46 X VS BLUESKY +------------------------------------------------------- +* EJERCICIO: + * La alternativa descentralizada a X, Bluesky, comienza a atraer + * a nuevos usuarios. ¿Cómo funciona una red de este estilo? + * + * Implementa un sistema que simule el comportamiento de estas + * redes sociales. + * + * Debes crear las siguientes operaciones: + * - Registrar un usuario por nombre e identificador único. + * - Un usuario puede seguir/dejar de seguir a otro. + * - Creación de post asociado a un usuario. Debe poseer + * texto (200 caracteres máximo), fecha de creación + * e identificador único. + * - Eliminación de un post. + * - Posibilidad de hacer like (y eliminarlo) en un post. + * - Visualización del feed de un usuario con sus 10 publicaciones + * más actuales ordenadas desde la más reciente. + * - Visualización del feed de un usuario con las 10 publicaciones + * más actuales de los usuarios que sigue ordenadas + * desde la más reciente. + * + * Cuando se visualiza un post, debe mostrarse: + * ID de usuario, nombre de usuario, texto del post, + * fecha de creación y número total de likes. + * + * Controla errores en duplicados o acciones no permitidas. + */ +// ________________________________________________________ +const { format } = require('util'); + +const log = { + info: (message, ...args) => console.log(`[INFO] ${format(message, ...args)}`), + warning: (message, ...args) => console.warn(`[WARN] ${format(message, ...args)}`), + error: (message, ...args) => console.error(`[ERROR] ${format(message, ...args)}`), +}; + +class Posts { + constructor() { + this.__post_dt = {}; + } + + __verifyPost(idUser, idPost, nameFunc) { + if (!(idUser in this.__post_dt)) { + log.error("'%s': El ID %s no tiene posts.", nameFunc, idUser); + return false; + } + + if (!(idPost in this.__post_dt[idUser])) { + log.error("'%s': El Post (%s) no existe.", nameFunc, idPost); + return false; + } + + return true; + } + + createPost(idUser, content) { + if (content.length > 200) { + log.error("'createPost': content > 200 caracteres."); + return; + } + + if (!(idUser in this.__post_dt)) { + this.__post_dt[idUser] = {}; + } + + const idPost = Object.keys(this.__post_dt[idUser]).length + 1; + this.__post_dt[idUser][idPost] = { + content, + timestamp: new Date(), + likes: new Set(), + }; + + log.info("El ID %s creó un post(ID: %s).", idUser, idPost); + } + + deletePost(idUser, idPost) { + if (this.__verifyPost(idUser, idPost, "deletePost")) { + delete this.__post_dt[idUser][idPost]; + log.info("El post: %s de usuario: %s ha sido eliminado.", idPost, idUser); + } + } + + likePost(idUser, idAuthor, idPost) { + if (this.__verifyPost(idAuthor, idPost, "likePost")) { + this.__post_dt[idAuthor][idPost].likes.add(idUser); + log.info("El usuario %s dio like al post %s de usuario %s.", idUser, idPost, idAuthor); + } + } + + removeLike(idUser, idAuthor, idPost) { + if (this.__verifyPost(idAuthor, idPost, "removeLike")) { + this.__post_dt[idAuthor][idPost].likes.delete(idUser); + log.info("El usuario %s anuló el like al post %s de usuario %s.", idUser, idPost, idAuthor); + } + } + + getRecentPosts(idUser, limit = 10) { + if (idUser in this.__post_dt) { + const sortedPosts = Object.values(this.__post_dt[idUser]) + .sort((a, b) => b.timestamp - a.timestamp); + + return sortedPosts.slice(0, limit); + } + + return []; + } +} + +class Users { + constructor() { + this.__users_dt = {}; + } + + __idExists(id, nameFunc = "") { + if (id in this.__users_dt) { + return true; + } + + log.warning("'%s': ID: %s no encontrada.", nameFunc, id); + return false; + } + + addUser(name) { + const id = Object.keys(this.__users_dt).length + 1; + this.__users_dt[id] = { + name, + following: new Set(), + followers: new Set(), + }; + + log.info("Usuario %s-%s registrado.", id, name); + } + + followUser(id, toId) { + if (this.__idExists(id, "followUser") && this.__idExists(toId, "followUser")) { + this.__users_dt[id].following.add(toId); + this.__users_dt[toId].followers.add(id); + log.info("ID: %s está siguiendo a ID: %s.", id, toId); + } + } + + unfollowUser(id, toId) { + if (this.__idExists(id, "unfollowUser") && this.__idExists(toId, "unfollowUser")) { + this.__users_dt[id].following.delete(toId); + this.__users_dt[toId].followers.delete(id); + log.info("El ID: %s dejó de seguir al ID: %s.", id, toId); + } + } + + getName(idUser) { + if (this.__idExists(idUser, "getName")) { + return this.__users_dt[idUser].name; + } + + return ""; + } +} + +// ________________________________________________________ +class Program { + constructor(posts, users) { + this.__posts = new posts(); + this.__users = new users(); + } + + __printFeed(idUser) { + const name = this.__users.getName(idUser); + if (!name) { + console.log(`Usuario ID: ${idUser} no encontrado.`); + return; + } + + const last10 = this.__posts.getRecentPosts(idUser, 10); + console.log(`\nFeed\n_______\nID: '${idUser}' - Nombre: '${name}'`); + if (last10.length === 0) { + console.log("No tiene publicaciones."); + return; + } + + last10.forEach(post => { + console.log(`_______\n${post.content}`); + console.log(`Creado: '${post.timestamp}'`); + console.log(`Likes: '${post.likes.size}'`); + }); + } + + run() { + // CLI + } + + tests() { + this.__users.addUser("Ken"); // id=1 + this.__users.addUser("Zoe"); // id=2 + + this.__users.followUser(1, 2); + this.__users.followUser(2, 1); + this.__users.unfollowUser(2, 1); + + this.__posts.createPost(2, "Primer post."); // id=1 + this.__posts.createPost(2, "Segundo post."); // id=2 + this.__posts.deletePost(2, 2); + this.__posts.createPost(2, "Otro post."); // id=2 + this.__posts.likePost(1, 2, 1); + this.__posts.removeLike(1, 2, 1); + this.__posts.likePost(1, 2, 2); + + this.__printFeed(2); + this.__printFeed(1); + } +} + +// _______________________________________ +const program = new Program(Posts, Users); +program.tests(); +// program.run(); From 4d04e184364c299c12d78625992171480eab345f Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 26 Dec 2024 13:02:58 -0600 Subject: [PATCH 060/104] 47 - js - CALENDARIO DE ADVIENTO --- .../javascript/kenysdev.js | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 Roadmap/47 - CALENDARIO DE ADVIENTO/javascript/kenysdev.js diff --git a/Roadmap/47 - CALENDARIO DE ADVIENTO/javascript/kenysdev.js b/Roadmap/47 - CALENDARIO DE ADVIENTO/javascript/kenysdev.js new file mode 100644 index 0000000000..bfe41873bd --- /dev/null +++ b/Roadmap/47 - CALENDARIO DE ADVIENTO/javascript/kenysdev.js @@ -0,0 +1,78 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#47 CALENDARIO DE ADVIENTO +------------------------------------------------------- +* EJERCICIO: + * ¡Cada año celebramos el aDEViento! 24 días, 24 regalos para + * developers. Del 1 al 24 de diciembre: https://adviento.dev + * + * Dibuja un calendario por terminal e implementa una + * funcionalidad para seleccionar días y mostrar regalos. + * - El calendario mostrará los días del 1 al 24 repartidos + * en 6 columnas a modo de cuadrícula. + * - Cada cuadrícula correspondiente a un día tendrá un tamaño + * de 4x3 caracteres, y sus bordes serán asteríscos. + * - Las cuadrículas dejarán un espacio entre ellas. + * - En el medio de cada cuadrícula aparecerá el día entre el + * 01 y el 24. + * + * Ejemplo de cuadrículas: + * **** **** **** + * *01* *02* *03* ... + * **** **** **** + * + * - El usuario seleccioná qué día quiere descubrir. + * - Si está sin descubrir, se le dirá que ha abierto ese día + * y se mostrará de nuevo el calendario con esa cuadrícula + * cubierta de asteríscos (sin mostrar el día). + * + * Ejemplo de selección del día 1 + * **** **** **** + * **** *02* *03* ... + * **** **** **** + * + * - Si se selecciona un número ya descubierto, se le notifica + * al usuario. + */ +// ________________________________________________________ + +const readlineSync = require('readline-sync'); + +let mtx = []; +for (let i = 0; i < 4; i++) { + let row = []; + for (let j = 0; j < 6; j++) { + row.push(`*${(i * 6 + j + 1).toString().padStart(2, '0')}*`); + } + mtx.push(row); +} + +const ln = "**** ".repeat(6) + "\n"; + +function printMatrix() { + mtx.forEach(row => { + console.log(ln + row.join(" ") + "\n" + ln); + }); +} + +while (true) { + printMatrix(); + + let day = readlineSync.question("A descubrir: "); + + if (day.match(/^\d+$/) && parseInt(day) > 0 && parseInt(day) <= 24) { + let r = Math.floor((parseInt(day) - 1) / 6); + let c = (parseInt(day) - 1) % 6; + + if (mtx[r][c] === "****") { + console.log(`El día ${day} ya está descubierto.`); + } else { + mtx[r][c] = "****"; + } + } else { + console.log("Día inválido, debe ser entre 1 y 24."); + } +} From 0638ae759550f3d26c6bdcb7499096f9857d8abb Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 26 Dec 2024 13:03:12 -0600 Subject: [PATCH 061/104] =?UTF-8?q?48=20-=20js=20-=20=C3=81RBOL=20DE=20NAV?= =?UTF-8?q?IDAD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javascript/kenysdev.js" | 214 ++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 "Roadmap/48 - \303\201RBOL DE NAVIDAD/javascript/kenysdev.js" diff --git "a/Roadmap/48 - \303\201RBOL DE NAVIDAD/javascript/kenysdev.js" "b/Roadmap/48 - \303\201RBOL DE NAVIDAD/javascript/kenysdev.js" new file mode 100644 index 0000000000..4f5c3447ca --- /dev/null +++ "b/Roadmap/48 - \303\201RBOL DE NAVIDAD/javascript/kenysdev.js" @@ -0,0 +1,214 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#48 ÁRBOL DE NAVIDAD +------------------------------------------------------- +* EJERCICIO: + * ¡Ha comenzado diciembre! Es hora de montar nuestro + * árbol de Navidad... + * + * Desarrolla un programa que cree un árbol de Navidad + * con una altura dinámica definida por el usuario por terminal. + * + * Ejemplo de árbol de altura 5 (el tronco siempre será igual): + * + * * + * *** + * ***** + * ******* + * ********* + * ||| + * ||| + * + * El usuario podrá seleccionar las siguientes acciones: + * + * - Añadir o eliminar la estrella en la copa del árbol (@) + * - Añadir o eliminar bolas de dos en dos (o) aleatoriamente + * - Añadir o eliminar luces de tres en tres (+) aleatoriamente + * - Apagar (*) o encender (+) las luces (conservando su posición) + * - Una luz y una bola no pueden estar en el mismo sitio + * + * Sólo puedes añadir una estrella, y tantas luces o bolas + * como tengan cabida en el árbol. El programa debe notificar + * cada una de las acciones (o por el contrario, cuando no + * se pueda realizar alguna). + */ +// ________________________________________________________ +const readlineSync = require('readline-sync'); +const clear = require('clear'); +const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); + +class ChristmasTree { + constructor(size) { + this.size = size; + this.mtx = Array.from({ length: size }, () => Array(size * 2 - 1).fill(" ")); + this.star = [0, size - 1]; + this.treeTop = []; + this.balls = []; + this.lights = []; + } + + printTree() { + console.log(); + this.mtx.forEach(row => console.log(row.join(''))); + let spaces = Math.floor((this.size * 2 - 4) / 2); + console.log(" ".repeat(spaces) + "|||"); + console.log(" ".repeat(spaces) + "|||"); + } + + createTree() { + let center = this.size - 1; + for (let i = 0; i < this.size; i++) { + let ast = "*".repeat(i * 2 + 1); + for (let j = 0; j < ast.length; j++) { + let col = center - i + j; + this.mtx[i][col] = ast[j]; + this.treeTop.push([i, col]); + } + } + this.treeTop.shift(); + } + + addRemoveStar() { + let [r, c] = this.star; + if (this.mtx[r][c] === "*") { + this.mtx[r][c] = "@"; + } else { + this.mtx[r][c] = "*"; + } + } + + addBalls() { + if (this.treeTop.length < 2) { + console.log("Ya no hay espacio para poner bolas."); + return; + } + + let randomLocations = this.randomSample(this.treeTop, 2); + randomLocations.forEach(([r, c]) => { + this.balls.push([r, c]); + this.treeTop = this.treeTop.filter(pos => pos[0] !== r || pos[1] !== c); + this.mtx[r][c] = "o"; + }); + } + + removeBalls() { + if (this.balls.length === 0) { + console.log("No hay bolas que eliminar."); + return; + } + + let randomLocations = this.randomSample(this.balls, 2); + randomLocations.forEach(([r, c]) => { + this.balls = this.balls.filter(pos => pos[0] !== r || pos[1] !== c); + this.treeTop.push([r, c]); + this.mtx[r][c] = "*"; + }); + } + + addLights() { + if (this.treeTop.length < 3) { + console.log("Ya no hay espacio para poner luces."); + return; + } + + let randomLocations = this.randomSample(this.treeTop, 3); + randomLocations.forEach(([r, c]) => { + this.lights.push([r, c]); + this.treeTop = this.treeTop.filter(pos => pos[0] !== r || pos[1] !== c); + this.mtx[r][c] = "+"; + }); + } + + removeLights() { + if (this.lights.length === 0) { + console.log("Ya no hay luces que eliminar."); + return; + } + + let randomLocations = this.randomSample(this.lights, 3); + randomLocations.forEach(([r, c]) => { + this.lights = this.lights.filter(pos => pos[0] !== r || pos[1] !== c); + this.treeTop.push([r, c]); + this.mtx[r][c] = "*"; + }); + } + + onOffLights() { + if (this.lights.length === 0) { + console.log("No hay luces."); + return; + } + + this.lights.forEach(([r, c]) => { + this.mtx[r][c] = this.mtx[r][c] === "*" ? "+" : "*"; + }); + } + + async automaticLights() { + while (true) { + clear(); + this.lights.forEach(([r, c]) => { + this.mtx[r][c] = this.mtx[r][c] === "*" ? "+" : "*"; + }); + this.printTree(); + await sleep(1000); + } + } + + randomSample(arr, size) { + const sampled = []; + while (sampled.length < size) { + let randIndex = Math.floor(Math.random() * arr.length); + sampled.push(arr.splice(randIndex, 1)[0]); + } + return sampled; + } +} + +async function menu(menu, tree) { + while (true) { + tree.printTree(); + console.log(menu); + let option = readlineSync.question("Option: "); + + switch (option) { + case '1': tree.addRemoveStar(); break; + case '2': tree.addBalls(); break; + case '3': tree.removeBalls(); break; + case '4': tree.addLights(); break; + case '5': tree.removeLights(); break; + case '6': tree.onOffLights(); break; + case '7': await tree.automaticLights(); break; + case '8': return; + default: console.log("Opción inválida."); + } + } +} + +function getSize() { + while (true) { + let size = readlineSync.question("Size: "); + if (size.match(/^\d+$/) && parseInt(size) % 2 !== 0 && parseInt(size) >= 3) { + return parseInt(size); + } + console.log("Debe ser un número impar >= 3."); + } +} + +const MENU = ` +1 - Agregar/Remover estrella. +2 - Agregar bolas. | 3 - Quitar bolas. +4 - Agregar luces. | 5 - Quitar luces. +6 - Encender/Apagar luces. +7 - Luces automáticas.| 8 - Salir +`; + +(async () => { + let size = getSize(); + let christmasTree = new ChristmasTree(size); + christmasTree.createTree(); + await menu(MENU, christmasTree); +})(); From 164bfa04e41d770f43ab63a53e9aa196b0051fb0 Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 26 Dec 2024 13:03:26 -0600 Subject: [PATCH 062/104] =?UTF-8?q?49=20-=20js=20-=20EL=20ALMAC=C3=89N=20D?= =?UTF-8?q?E=20PAP=C3=81=20NOEL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javascript/kenysdev.js" | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 "Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/javascript/kenysdev.js" diff --git "a/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/javascript/kenysdev.js" "b/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/javascript/kenysdev.js" new file mode 100644 index 0000000000..9c56ec897c --- /dev/null +++ "b/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/javascript/kenysdev.js" @@ -0,0 +1,114 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#49 EL ALMACÉN DE PAPÁ NOEL +------------------------------------------------------- +* EJERCICIO: + * Papá Noel tiene que comenzar a repartir los regalos... + * ¡Pero ha olvidado el código secreto de apertura del almacén! + * + * Crea un programa donde introducir códigos y obtener pistas. + * + * Código: + * - El código es una combinación de letras y números aleatorios + * de longitud 4. (Letras: de la A a la C, Números: del 1 al 3) + * - No hay repetidos. + * - Se genera de manera aleatoria al iniciar el programa. + * + * Usuario: + * - Dispone de 10 intentos para acertarlo. + * - En cada turno deberá escribir un código de 4 caracteres, y + * el programa le indicará para cada uno lo siguiente: + * - Correcto: Si el caracter está en la posición correcta. + * - Presente: Si el caracter existe, pero esa no es su posición. + * - Incorrecto: Si el caracter no existe en el código secreto. + * - Deben controlarse errores de longitud y caracteres soportados. + * + * Finalización: + * - Papa Noel gana si descrifra el código antes de 10 intentos. + * - Pierde si no lo logra, ya que no podría entregar los regalos. + */ +// ________________________________________________________ +const readlineSync = require('readline-sync'); + +function verifyAllowedChar(codeEntry) { + for (let ch of codeEntry) { + if (!'abc123'.includes(ch)) { + console.log("Uno de los caracteres no está entre los permitidos.\n"); + return false; + } + } + return true; +} + +function getEntry() { + while (true) { + const codeEntry = readlineSync.question("Código: "); + + if (codeEntry.length !== 4) { + console.log("El código debe ser de 4 dígitos.\n"); + continue; + } + + if (verifyAllowedChar(codeEntry)) { + return codeEntry; + } + } +} + +function isOpen(code) { + const codeEntry = getEntry(); + if (codeEntry === code) { + return true; + } + console.log("Código inválido.\n"); + + for (let i = 0; i < codeEntry.length; i++) { + if (codeEntry[i] === code[i]) { + console.log(`'${codeEntry[i]}' está en la posición correcta.`); + } else if (code.includes(codeEntry[i])) { + console.log(`'${codeEntry[i]}' está en el código, pero en otra posición.`); + } else { + console.log(`'${codeEntry[i]}' no está presente en el código.`); + } + } + + return false; +} + +// ____________________________________________________________________________ +console.log(` +* Papá Noel tiene que comenzar a repartir los regalos... +* ¡Pero ha olvidado el código secreto de apertura del almacén! + +- Tienes 10 intentos para adivinar el código que abre el almacén. +- Código de 4 caracteres. Permitidos: a, b, c, 1, 2, 3. +- Nota: No hay dígitos repetidos.`); + +const code = shuffle("abc123").slice(0, 4); + +for (let attempts = 0; attempts < 10; attempts++) { + console.log(`\n___________\nIntento #${attempts + 1}`); + + if (isOpen(code)) { + console.log("Código correcto, almacén abierto."); + console.log("Papá Noel ahora podrá entregar los regalos."); + break; + } + + if (attempts === 9) { + console.log("\n___________\nHas perdido."); + console.log("Papá Noel ya no podrá entregar los regalos."); + } +} + +function shuffle(str) { + const arr = str.split(''); + for (let i = arr.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [arr[i], arr[j]] = [arr[j], arr[i]]; + } + return arr.join(''); +} From d67fb8c56f0fc1777a1e11db95933bc5374ac31e Mon Sep 17 00:00:00 2001 From: kenysdev Date: Thu, 26 Dec 2024 13:03:41 -0600 Subject: [PATCH 063/104] =?UTF-8?q?50=20-=20js=20-=20PLANIFICADOR=20DE=20O?= =?UTF-8?q?BJETIVOS=20DE=20AN=CC=83O=20NUEVO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javascript/kenysdev.js" | 225 ++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/kenysdev.js" diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/kenysdev.js" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/kenysdev.js" new file mode 100644 index 0000000000..2fa8dd79c5 --- /dev/null +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/kenysdev.js" @@ -0,0 +1,225 @@ +/* +_____________________________________ +https://github.com/kenysdev +2024 - JavaScript +_______________________________________________________ +#50 PLANIFICADOR DE OBJETIVOS DE AÑO NUEVO +------------------------------------------------------- +* EJERCICIO: + * El nuevo año está a punto de comenzar... + * ¡Voy a ayudarte a planificar tus propósitos de nuevo año! + * + * Programa un gestor de objetivos con las siguientes características: + * - Permite añadir objetivos (máximo 10) + * - Calcular el plan detallado + * - Guardar la planificación + * + * Cada entrada de un objetivo está formado por (con un ejemplo): + * - Meta: Leer libros + * - Cantidad: 12 + * - Unidades: libros + * - Plazo (en meses): 12 (máximo 12) + * + * El cálculo del plan detallado generará la siguiente salida: + * - Un apartado para cada mes + * - Un listado de objetivos calculados a cumplir en cada mes + * (ejemplo: si quiero leer 12 libros, dará como resultado + * uno al mes) + * - Cada objetivo debe poseer su nombre, la cantidad de + * unidades a completar en cada mes y su total. Por ejemplo: + * + * Enero: + * [ ] 1. Leer libros (1 libro/mes). Total: 12. + * [ ] 2. Estudiar Git (1 curso/mes). Total: 1. + * Febrero: + * [ ] 1. Leer libros (1 libro/mes). Total: 12. + * ... + * Diciembre: + * [ ] 1. Leer libros (1 libro/mes). Total: 12. + * + * - Si la duración es menor a un año, finalizará en el mes + * correspondiente. + * + * Por último, el cálculo detallado debe poder exportarse a .txt + * (No subir el fichero) + */ +// ________________________________________________________ + +import { createInterface } from 'node:readline/promises'; +import { stdin as input, stdout as output } from 'node:process'; +import { writeFile } from 'node:fs/promises'; + +class ObjectivePlanner { + #goals = []; + #months = [ + 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', + 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre' + ]; + #pendingMonthly = new Map(); + #rl; + + constructor() { + this.#rl = createInterface({ input, output }); + } + + async #add() { + if (this.#goals.length >= 10) { + console.log('\nMáximo de 10 objetivos alcanzado.'); + return; + } + + try { + const name = (await this.#rl.question('Meta: ')).trim(); + const quantity = parseInt(await this.#rl.question('Cantidad: '), 10); + const units = (await this.#rl.question('Unidades: ')).trim(); + const months = Math.min( + parseInt(await this.#rl.question('Plazo (en meses): '), 10), + 12 + ); + + if (name && quantity > 0 && units && months > 0) { + const goal = { name, quantity, units }; + const goalId = this.#goals.length; + + const monthly = Math.floor(quantity / months); + const extra = quantity % months; + + const monthlyQuantities = Array.from( + { length: months }, + (_, m) => monthly + (m < extra ? 1 : 0) + ); + + this.#pendingMonthly.set(goalId, monthlyQuantities); + this.#goals.push(goal); + console.log('\nObjetivo añadido exitosamente.'); + } else { + console.log('\nDatos inválidos.'); + } + } catch (error) { + console.log('\nError: Ingrese valores numéricos válidos.'); + } + } + + #calculatePlan() { + if (this.#goals.length === 0) return null; + + const plan = new Map(); + + for (let goalId = 0; goalId < this.#goals.length; goalId++) { + const monthlyQuantities = this.#pendingMonthly.get(goalId); + const goal = this.#goals[goalId]; + + if (monthlyQuantities) { + for (let month = 0; month < monthlyQuantities.length; month++) { + const quantity = monthlyQuantities[month]; + if (quantity > 0) { + const monthName = this.#months[month]; + const task = `[ ] ${goal.name} (${quantity} ${goal.units}/mes). Total: ${goal.quantity}.`; + + if (!plan.has(monthName)) { + plan.set(monthName, []); + } + plan.get(monthName).push(task); + } + } + } + } + + return plan.size > 0 ? plan : null; + } + + async #savePlan() { + const plan = this.#calculatePlan(); + if (!plan) { + console.log('\nNo hay planificación para guardar.'); + return; + } + + const filename = `plan_${new Date().toISOString() + .replace(/[:.]/g, '') + .slice(0, 15)}.txt`; + + try { + let content = ''; + for (const month of this.#months) { + const tasks = plan.get(month); + if (tasks) { + content += `${month}:\n`; + content += tasks.map(task => ` ${task}`).join('\n'); + content += '\n\n'; + } + } + + await writeFile(filename, content, 'utf-8'); + console.log(`\nPlan guardado en ${filename}.`); + } catch (error) { + console.log('\nError al guardar el archivo.'); + } + } + + #displayPlan() { + const plan = this.#calculatePlan(); + if (!plan) { + console.log('\nNo hay objetivos planificados.'); + return; + } + + for (const month of this.#months) { + const tasks = plan.get(month); + if (tasks) { + console.log(`\n${month}:`); + for (const task of tasks) { + console.log(` ${task}`); + } + } + } + } + + #clearScreen() { + if (process.platform === 'win32') { + process.stdout.write('\x1Bc'); + } else { + process.stdout.write('\x1B[2J\x1B[0f'); + } + } + + async run() { + this.#clearScreen(); + + while (true) { + console.log('\nGestor de Objetivos:'); + console.log('1. Añadir objetivo'); + console.log('2. Calcular plan detallado'); + console.log('3. Guardar planificación'); + console.log('4. Salir'); + + const option = (await this.#rl.question('\nSeleccione una opción: ')).trim(); + + switch (option) { + case '1': + await this.#add(); + break; + case '2': + this.#displayPlan(); + break; + case '3': + await this.#savePlan(); + break; + case '4': + console.log('\n¡Adiós!'); + this.#rl.close(); + return; + default: + console.log('\nOpción inválida.'); + } + } + } +} + +try { + const planner = new ObjectivePlanner(); + await planner.run(); +} catch (error) { + console.error('Error en la aplicación:', error); + process.exit(1); +} From 50a14480a471643678124184f791c134980c9e4d Mon Sep 17 00:00:00 2001 From: Edison Mondragon Date: Thu, 26 Dec 2024 18:04:49 -0500 Subject: [PATCH 064/104] =?UTF-8?q?Se=20resolvi=C3=B3=20el=20reto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../python/edisonlmg.py" | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/edisonlmg.py" diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/edisonlmg.py" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/edisonlmg.py" new file mode 100644 index 0000000000..931714fcb9 --- /dev/null +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/edisonlmg.py" @@ -0,0 +1,85 @@ +import pandas as pd + +print('''\n +#======================================================================================================================= +# 50 - Planificador de objetivos de año nuevo +#======================================================================================================================= +''') + +print(''' +Te ayudaré a planificar tus objetivo para el nuevo año. + +Tus objetivos deben seguir el siguiente modelo: +- Meta: Leer libros +- Cantidad: 12 +- Unidades: libros +- Plazo (en meses): 12 (máximo 12) + +Por favor ingresa la información necesaria y sigue las indicaciones: +''') + +objectives = pd.DataFrame() +count = 0 + +while count <= 10: + + count += 1 + + if count > 10: + print('Has ingresado el numero maximo de objetivos.') + break + + print(f''' +Ingresa informacion del objetivo {count}: + ''') + + objective = {} + + objective['Meta'] = [input('Nombre de la meta: ')] + objective['Cantidad'] = [int(input('Cantidad: '))] + objective['Unidad'] = [input('Unidad de medida: ')] + objective['Plazo'] = [int(input('Plazo: '))] + + objectives = pd.concat([objectives, pd.DataFrame(objective)], ignore_index=True) + + action = int(input(''' +Para ingresar el siguiente objetivo digita 0. +Para terminar digita 1. + ''')) + + if action > 0: + break + +objectives['Frecuencia'] = objectives['Cantidad'] / objectives['Plazo'] + +mounths = ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Setiembre','Octubre','Noviembre','Diciembre'] + +mounth_num = 0 + +text = '' + +for mounth in mounths[:objectives['Plazo'].max()]: + + mounth_num += 1 + + text += f'\n{mounth}:' + + for index, row in objectives.iterrows(): + if mounth_num <= row['Plazo']: + text += f'\n{index+1}. {objectives['Meta'][index]} ({objectives['Frecuencia'][index]} {objectives['Unidad'][index]}/mes): Total: {objectives["Cantidad"][index]}' + else: + pass + +print(f'\nFelicidades, aquí tienes tu planificación de objetivos:\n{text}') + +save = input('\n¿Desea exportar su planificación (SI/NO)?: ').upper() + +if save == 'SI': + with open("planificacion_2025.txt", "w") as archivo: + archivo.write(text) + + print('Archivo exporta exitosamente ¡Adios!') + +else: + print('\nNo hay problema ¡Adios!') + From 151f89cc0c91c01ab5d72be2bd9ff3ac5577a4ef Mon Sep 17 00:00:00 2001 From: HodginsOhannigan <62486573+devcherry1@users.noreply.github.com> Date: Thu, 26 Dec 2024 19:12:26 -0500 Subject: [PATCH 065/104] #09 - C# HERENCIA Y POLIMORFISMO --- Roadmap/09 - HERENCIA/c#/devcherry1.cs | 124 +++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 Roadmap/09 - HERENCIA/c#/devcherry1.cs diff --git a/Roadmap/09 - HERENCIA/c#/devcherry1.cs b/Roadmap/09 - HERENCIA/c#/devcherry1.cs new file mode 100644 index 0000000000..f0bc173ca1 --- /dev/null +++ b/Roadmap/09 - HERENCIA/c#/devcherry1.cs @@ -0,0 +1,124 @@ +using System; +class Program +{ + static void Main() + { + Perro miPerro = new Perro(); + miPerro.Nombre = "Firulais"; + miPerro.Comer(); // Método heredado de la clase Animal + miPerro.Ladrar(); + Gato miGato = new Gato(); + miGato.Nombre = "Michin"; + miGato.Comer(); + miGato.Maullar(); + + Developer dev1 = new Developer { Nombre = "Luis", ID = 7 }; + Developer dev2 = new Developer { Nombre = "Camila", ID = 2 }; + Developer dev3 = new Developer { Nombre = "Alexandra", ID = 3 }; + Developer dev4 = new Developer { Nombre = "Carlos", ID = 4 }; + Developer dev5 = new Developer { Nombre = "Sofia", ID = 8 }; + + ProjectManager pm1 = new ProjectManager { Nombre = "Gerald", ID = 5 }; + ProjectManager pm2 = new ProjectManager { Nombre = "Edgar", ID = 6 }; + + Manager boss = new Manager { Nombre = "Ernesto", ID = 1 }; + + dev1.Funcion(); + pm1.Funcion(); + boss.Funcion(); + + // Asignar Developers a cada ProjectManager + pm1.AsignarDeveloper(dev1); + pm1.AsignarDeveloper(dev2); + + pm2.AsignarDeveloper(dev3); + pm2.AsignarDeveloper(dev4); + pm2.AsignarDeveloper(dev5); + + // Asignar ProjectManagers al Manager + boss.AsignarProjectManager(pm1); + boss.AsignarProjectManager(pm2); + + // Mostrar la jerarquía + Console.WriteLine($"\n**Jerarquía del Manager:**"); + boss.MostrarJerarquia(); + } +} +public class Animal +{ + public string Nombre { get; set; } + + public void Comer() + { + Console.WriteLine($"{Nombre} está comiendo."); + } +} +public class Perro : Animal +{ + public void Ladrar() + { + Console.WriteLine($"{Nombre} está ladrando."); + } +} +public class Gato : Animal +{ + public void Maullar() + { + Console.WriteLine($"{Nombre} está maullando."); + } +} +public class Empleado +{ + public string Nombre { get; set; } + public int ID { get; set; } +} +public class Developer : Empleado +{ + public void Funcion() + { + Console.WriteLine($"{Nombre} convierte el cafe en codigo."); + } +} +public class ProjectManager : Empleado +{ + public List Developers { get; private set; } = new List(); + public void Funcion() + { + Console.WriteLine($"{Nombre} se encarga de que todos planifica y coordina."); + } + public void AsignarDeveloper(Developer developer) + { + Developers.Add(developer); + } + + public void MostrarDevelopers() + { + Console.WriteLine($" {Nombre} tiene asignados los siguientes Developers: ({Developers.Count})"); + foreach (var dev in Developers) + { + Console.WriteLine($" - {dev.Nombre} (ID: {dev.ID})"); + } + } +} +public class Manager : Empleado +{ + public List ProjectManagers { get; private set; } = new List(); + + public void Funcion() + { + Console.WriteLine($"{Nombre} asigna responsabilidades y supervisa operaciones."); + } + public void AsignarProjectManager(ProjectManager projectManager) + { + ProjectManagers.Add(projectManager); + } + public void MostrarJerarquia() + { + Console.WriteLine($"\n{Nombre} supervisa a los siguientes ProjectManagers: ({ProjectManagers.Count})"); + foreach (var pm in ProjectManagers) + { + Console.WriteLine($"- {pm.Nombre} (ID: {pm.ID})"); + pm.MostrarDevelopers(); + } + } +} From 337a00ff034113ff132a7c7124352f89a274ee12 Mon Sep 17 00:00:00 2001 From: Leandro Date: Thu, 26 Dec 2024 20:39:47 -0500 Subject: [PATCH 066/104] #08 - Fortran --- Roadmap/08 - CLASES/fortran/LeandroCFD.f90 | 164 +++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 Roadmap/08 - CLASES/fortran/LeandroCFD.f90 diff --git a/Roadmap/08 - CLASES/fortran/LeandroCFD.f90 b/Roadmap/08 - CLASES/fortran/LeandroCFD.f90 new file mode 100644 index 0000000000..929f38eb32 --- /dev/null +++ b/Roadmap/08 - CLASES/fortran/LeandroCFD.f90 @@ -0,0 +1,164 @@ +!Fortran propiamente no tiene clases, pero se pueden simular con variables de tipo derivado y modulos + +module Modulo_Clase !Se define un modulo que contiene la definición de las clases Alumno, Pila y Cola + implicit none + + type :: Alumno !Se define el tipo derivado Alumno + real :: nota !Atributos de la clase + integer :: edad + character(len=20) :: nombre + contains + procedure :: MostrarDatos !Método de la clase + end type Alumno + + type :: Pila + integer :: tope + integer, dimension(100) :: elementos + contains + procedure :: Apilar + procedure :: Desapilar + procedure, nopass :: MostrarElementos + procedure, nopass :: NumeroElementos + end type Pila + + type :: Cola + integer :: frente + integer :: final + integer, dimension(100) :: elementos + contains + procedure :: Encolar + procedure :: Desencolar + procedure, nopass :: MostrarElementos + procedure, nopass :: NumeroElementos + end type Cola + +contains + subroutine MostrarDatos(this) !Implementación del método MostrarDatos + class(Alumno), intent(in) :: this !Se pasa la instancia de la clase como argumento + print *, 'Nombre: ', this%nombre + print *, 'Edad: ', this%edad + print *, 'Nota: ', this%nota + end subroutine MostrarDatos + + subroutine Apilar(this, elemento) !Implementación del método Apilar + class(Pila), intent(inout) :: this + integer, intent(in) :: elemento + this%tope = this%tope + 1 !Se incrementa el tope de la pila + this%elementos(this%tope) = elemento !Se añade el elemento a la pila + end subroutine Apilar + + subroutine Desapilar(this) !Implementación del método Desapilar + class(Pila), intent(inout) :: this + if ( this%tope <0 ) then !Se verifica que haya elementos en la pila + print *, "No hay elementos para desapilar" + return + end if + this%elementos(this%tope)=0 !Se elimina el elemento + this%tope = this%tope - 1 !Se decrementa el tope + end subroutine Desapilar + + subroutine Encolar(this, elemento) !Implementación del método Encolar + class(Cola), intent(inout) :: this + integer, intent(in) :: elemento + this%final = this%final + 1 !Se incrementa el final de la cola + this%elementos(this%final) = elemento !Se añade el elemento a la cola + end subroutine Encolar + + subroutine Desencolar(this) !Implementación del método Desencolar + class(Cola), intent(inout) :: this + if ( this%final-this%frente <0 ) then !Se verifica que haya elementos en la cola + print *, "No hay elementos para desencolar" + return + end if + this%elementos(this%frente)=0 !Se elimina el elemento + this%frente = this%frente + 1 !Se incrementa el frente + end subroutine Desencolar + + subroutine MostrarElementos(this) !Implementación del método MostrarElementos + class(*), intent(in) :: this + integer :: i + select type(this) !Se selecciona el tipo de la instancia + type is (Pila) !Si es de tipo Pila + print *,"Lista de elementos (Pila):" + do i = 0, this%tope-1 + print *, this%elementos(this%tope-i) + end do + type is (Cola) !Si es de tipo Cola + print*,"Lista de elementos (Cola):" + do i = this%frente, this%final + print *, this%elementos(i) + end do + end select + end subroutine MostrarElementos + + subroutine NumeroElementos(this) !Implementación del método NumeroElementos + class(*), intent(in) :: this + select type(this) + type is (Pila) + print *,"Numero de elementos (Pila):", this%tope + type is (Cola) + print*,"Numero de elementos (Cola):", this%final-this%frente+1 + end select + end subroutine NumeroElementos + +end module Modulo_Clase + +program CLASES + use Modulo_Clase !Se importa el modulo que contiene la definición de la clase + + implicit none + + type(Alumno) :: Alumno1, Alumno2 !Se definen dos instancias "Variables" de la clase Alumno + type(Pila) :: Mipila !Se define una instancia de la clase Pila + type(Cola) :: Micola !Se define una instancia de la clase Cola + + Alumno1%nota = 10.0 !Inicialización de los datos de Alumno1 + Alumno1%edad = 20 + Alumno1%nombre = 'Juan' + + Alumno2%nota = 8.0 !Inicialización de los datos de Alumno2 + Alumno2%edad = 21 + Alumno2%nombre = 'Pedro' + + call Alumno1%MostrarDatos() ! Llamada a los métodos MostrarDatos + call Alumno2%MostrarDatos() + + Alumno1%nombre='Carlos' + Alumno1%edad=22 + Alumno1%nota=6.5 + + call Alumno1%MostrarDatos() + + !DIFICULTAD EXTRA + Mipila%tope = 0 + call Mipila%Apilar(5) !Se apilan elementos + call Mipila%Apilar(2) + call Mipila%Apilar(10) + call Mipila%Apilar(22) + call Mipila%Apilar(50) + + call Mipila%MostrarElementos(Mipila) !Se muestran los elementos de la pila + call Mipila%NumeroElementos(Mipila) !Se muestra el número de elementos de la pila + call Mipila%Desapilar() !Se desapila un elemento + call Mipila%MostrarElementos(Mipila) + call Mipila%NumeroElementos(Mipila) + + Micola%frente = 1 + Micola%final = 0 + + call Micola%Encolar(1) !Se encolan elementos + call Micola%Encolar(3) + call Micola%Encolar(10) + call Micola%Encolar(50) + call Micola%Encolar(98) + + call Micola%MostrarElementos(Micola) !Se muestran los elementos de la cola + call Micola%NumeroElementos(Micola) !Se muestra el número de elementos de la cola + call Micola%Desencolar() !Se desencola un elemento + call Micola%Desencolar() + call Micola%Desencolar() + call Micola%Desencolar() + call Micola%MostrarElementos(Micola) !Se muestran los elementos de la cola + call Micola%NumeroElementos(Micola) !Se muestra el número de elementos de la cola + +end program CLASES \ No newline at end of file From 0d5b0885c9e2e088e0cbeb41f1a9c6db0d797c17 Mon Sep 17 00:00:00 2001 From: Edison Mondragon Date: Thu, 26 Dec 2024 20:40:20 -0500 Subject: [PATCH 067/104] =?UTF-8?q?Se=20elimin=C3=B3=20reto=20que=20no=20c?= =?UTF-8?q?orresponde=20a=20la=20rama?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../python/edisonlmg.py" | 85 ------------------- 1 file changed, 85 deletions(-) delete mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/edisonlmg.py" diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/edisonlmg.py" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/edisonlmg.py" deleted file mode 100644 index 931714fcb9..0000000000 --- "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/edisonlmg.py" +++ /dev/null @@ -1,85 +0,0 @@ -import pandas as pd - -print('''\n -#======================================================================================================================= -# 50 - Planificador de objetivos de año nuevo -#======================================================================================================================= -''') - -print(''' -Te ayudaré a planificar tus objetivo para el nuevo año. - -Tus objetivos deben seguir el siguiente modelo: -- Meta: Leer libros -- Cantidad: 12 -- Unidades: libros -- Plazo (en meses): 12 (máximo 12) - -Por favor ingresa la información necesaria y sigue las indicaciones: -''') - -objectives = pd.DataFrame() -count = 0 - -while count <= 10: - - count += 1 - - if count > 10: - print('Has ingresado el numero maximo de objetivos.') - break - - print(f''' -Ingresa informacion del objetivo {count}: - ''') - - objective = {} - - objective['Meta'] = [input('Nombre de la meta: ')] - objective['Cantidad'] = [int(input('Cantidad: '))] - objective['Unidad'] = [input('Unidad de medida: ')] - objective['Plazo'] = [int(input('Plazo: '))] - - objectives = pd.concat([objectives, pd.DataFrame(objective)], ignore_index=True) - - action = int(input(''' -Para ingresar el siguiente objetivo digita 0. -Para terminar digita 1. - ''')) - - if action > 0: - break - -objectives['Frecuencia'] = objectives['Cantidad'] / objectives['Plazo'] - -mounths = ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Setiembre','Octubre','Noviembre','Diciembre'] - -mounth_num = 0 - -text = '' - -for mounth in mounths[:objectives['Plazo'].max()]: - - mounth_num += 1 - - text += f'\n{mounth}:' - - for index, row in objectives.iterrows(): - if mounth_num <= row['Plazo']: - text += f'\n{index+1}. {objectives['Meta'][index]} ({objectives['Frecuencia'][index]} {objectives['Unidad'][index]}/mes): Total: {objectives["Cantidad"][index]}' - else: - pass - -print(f'\nFelicidades, aquí tienes tu planificación de objetivos:\n{text}') - -save = input('\n¿Desea exportar su planificación (SI/NO)?: ').upper() - -if save == 'SI': - with open("planificacion_2025.txt", "w") as archivo: - archivo.write(text) - - print('Archivo exporta exitosamente ¡Adios!') - -else: - print('\nNo hay problema ¡Adios!') - From 940ab43809cebe1557e0be280445aed2e9466819 Mon Sep 17 00:00:00 2001 From: Edison Mondragon Date: Thu, 26 Dec 2024 20:41:42 -0500 Subject: [PATCH 068/104] =?UTF-8?q?Se=20elimin=C3=B3=20reto=20que=20no=20c?= =?UTF-8?q?orresponde=20a=20la=20rama?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../python/edisonlmg.py" | 74 ------------------- 1 file changed, 74 deletions(-) delete mode 100644 "Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" diff --git "a/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" "b/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" deleted file mode 100644 index 054dd83f7a..0000000000 --- "a/Roadmap/49 - EL ALMAC\303\211N DE PAP\303\201 NOEL/python/edisonlmg.py" +++ /dev/null @@ -1,74 +0,0 @@ -#======================================================================================================================= -# 49 El almacen de Papá Noel -#======================================================================================================================= - -# Importar librerias -import random -import re - -# Expresion regular para password -pattern = r'^(?!.*(.).*\1)[ABC123]{4}$' - -# Generar password aleatorio -psw = ''.join(random.sample('ABC123', k=4)) - -# Inicio de juego -print(''' - \n¡Bienvenido Papá Noel, es hora de repartir regalos! - \nPara abrir al almacén de juguetes digita la clave de ingreso -(tienes 10 intentos). - \nPista: La contraseña debe contener 4 caracteres sin repeticiones y solo acepta -los valores A,B,C,1,2 y 3. - ''') - -# Inicio de bucle - -intento = 0 - -while intento <= 10: - - # Iniciar contador - intento += 1 - - # Si se excedio de 10 intentos terminar el juego - if intento > 10: - print(''' - \n¡Oh, no. Papá Noel has olvidado la contraseña! - Ya no te quedan más intentos. - ''') - break - - # Solicitar el ingreso de un password - print(f'\nIntento n.° {intento}:') - psw_in = input('\nIngresa contraseña: ').upper() - - # Comprobar si el passwor ingresado es valido - if bool(re.match(pattern, psw_in)): - pass - else: - print(''' - \nLa contarseña ingresada no es válida. La contraseña debe contener 4 -caracteres sin repeticiones y solo acepta los valores A,B,C,1,2 y 3. - ''') - continue - - # Si el password fue valido comprobar si es el correcto - if psw_in == psw: - print(''' - \n La contraseña es correcta. - \n¡Felicidades, a repartir juguetes! - ''') - break - else: # Si el password es incorrecto dar las pistas por cada caracter - print(f''' - \nLa contraseña es incorrecta. Pero descuida, te doy unas pistas: - ''') - for x, y in zip(psw_in, psw): - if x == y: - print(f'\n{x}: Correcto') - elif x in psw: - print(f'\n{x}: Presente') - else: - print(f'\n{x}: Incorrecto') - print('\n¡Vuelve a intentarlo, Papá Noel!') - From 792bb8bd800b4bf8d623a372de6792070aeef0c1 Mon Sep 17 00:00:00 2001 From: Giulianovfz Date: Thu, 26 Dec 2024 23:10:48 -0300 Subject: [PATCH 069/104] =?UTF-8?q?#=2002=20-=20Python=20soluci=C3=B3n=20g?= =?UTF-8?q?iulianovfz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../python/giulianovfz.py | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 Roadmap/02 - FUNCIONES Y ALCANCE/python/giulianovfz.py diff --git a/Roadmap/02 - FUNCIONES Y ALCANCE/python/giulianovfz.py b/Roadmap/02 - FUNCIONES Y ALCANCE/python/giulianovfz.py new file mode 100644 index 0000000000..8385324be9 --- /dev/null +++ b/Roadmap/02 - FUNCIONES Y ALCANCE/python/giulianovfz.py @@ -0,0 +1,136 @@ +""" + * EJERCICIO: + * - Crea ejemplos de funciones básicas que representen las diferentes + * posibilidades del lenguaje: + * Sin parámetros ni retorno, con uno o varios parámetros, con retorno... + * - Comprueba si puedes crear funciones dentro de funciones. + * - Utiliza algún ejemplo de funciones ya creadas en el lenguaje. + * - Pon a prueba el concepto de variable LOCAL y GLOBAL. + * - Debes hacer print por consola del resultado de todos los ejemplos. + * (y tener en cuenta que cada lenguaje puede poseer más o menos posibilidades) + * + * DIFICULTAD EXTRA (opcional): + * Crea una función que reciba dos parámetros de tipo cadena de texto y retorne un número. + * - La función imprime todos los números del 1 al 100. Teniendo en cuenta que: + * - Si el número es múltiplo de 3, muestra la cadena de texto del primer parámetro. + * - Si el número es múltiplo de 5, muestra la cadena de texto del segundo parámetro. + * - Si el número es múltiplo de 3 y de 5, muestra las dos cadenas de texto concatenadas. + * - La función retorna el número de veces que se ha impreso el número en lugar de los textos. + * + * Presta especial atención a la sintaxis que debes utilizar en cada uno de los casos. + * Cada lenguaje sigue una convenciones que debes de respetar para que el código se entienda. +""" + + +# función sin parámetro +def mensaje(): + print('\nBienvenidos y Bienvenidas a la resolución de retos de programación') + + +mensaje() + + +# función con un solo parámetro sin retorno +def bienvenida(nombre: str): + print(f'\nHola, {nombre}, ánimo con los retos de programación') + + +bienvenida('giulianovfz') + + +# función con un solo parámetro y valor por defecto, sin retorno +def saludo(nombre="compañeros y compañeras"): + print(f'\nHola, {nombre}, ánimo con los retos de programación') + + +saludo() + +valor1 = 8 +valor2 = 5 + + +# función con parámetros sin retorno +def suma(a, b): + print(f'valor de la suma a+b: {a+b}') + + +suma(valor1, valor2) + + +# función con parámetros y retorno +def resta(a, b): + return a-b + + +resultado_resta = resta(valor1, valor2) +print(resultado_resta) + +""" +Funciones del lenguaje +""" + +lista = list(("Pala", "Picota", "Rastrilo")) +print(lista) +print(len(lista)) +print(list((enumerate(lista)))) + + +""" +Variables locales y globales +""" + +variable_global = "Planeta Tierra" + + +def continente(): + variable_local = "Continente Americano" + print(f"""Variable global:{ + variable_global}, Variable local:{variable_local}""") + + +# crear una función dentro de otra +def modulo(numero: int): + + print(f'valor número: {numero}') + + def duplicar(aduplicar): + return aduplicar*2 + + if numero % 2 == 0: + resultado = duplicar(numero) + print(f'el valor duplicado es: {resultado} y es multiplo de 2') + else: + print(f'El valor ingresado: {numero} no es multiplo de 2') + + +modulo(5) + + +# dificultad extra +def imprimir(parametro1: str, parametro2: str): + + contador = 0 + + # imprimir todos los números del 1 al 100 + for numero in range(1, 101): + + if numero % 3 == 0 and numero % 5 == 0: + print(f'cadena de texto concatenadas parametro 1 y 2: { + parametro1}{parametro2}') + elif numero % 5 == 0: + print(f'cadena de texto segundo parametro: {parametro2}') + elif numero % 3 == 0: + print(f'cadena de texto primer parametro: {parametro1}') + else: + contador += 1 + print(f'número:{numero}') + + return contador + + +entrada1 = input('\ningresa el primer texto: ') +entrada2 = input('\ningresa el segundo texto: ') + +respuesta = imprimir(entrada1, entrada2) + +print(f'\n número de veces que se imprimio solo números:{respuesta}') From d2627875c6081e26a2cf1ad688db7a11dccb00d8 Mon Sep 17 00:00:00 2001 From: manuelgomezg Date: Thu, 26 Dec 2024 22:03:10 -0500 Subject: [PATCH 070/104] 0-php --- .../php/manuelgomezg.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/php/manuelgomezg.php diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/php/manuelgomezg.php b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/php/manuelgomezg.php new file mode 100644 index 0000000000..5d181d539a --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/php/manuelgomezg.php @@ -0,0 +1,16 @@ +// https://www.php.net/manual/es/index.php +// comentario de una linea +# Esto es un comentario al estilo de consola de una sola línea + + \ No newline at end of file From 8874c1fe0c0b2ad00301dd16ac05394957e0b89c Mon Sep 17 00:00:00 2001 From: jorgeadamowicz Date: Fri, 27 Dec 2024 12:44:53 -0300 Subject: [PATCH 071/104] #08-python --- Roadmap/08 - CLASES/python/jorgeadamowicz.py | 146 +++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 Roadmap/08 - CLASES/python/jorgeadamowicz.py diff --git a/Roadmap/08 - CLASES/python/jorgeadamowicz.py b/Roadmap/08 - CLASES/python/jorgeadamowicz.py new file mode 100644 index 0000000000..90f3f18587 --- /dev/null +++ b/Roadmap/08 - CLASES/python/jorgeadamowicz.py @@ -0,0 +1,146 @@ +""" +EJERCICIO: + * Explora el concepto de clase y crea un ejemplo que implemente un inicializador, + * atributos y una función que los imprima (teniendo en cuenta las posibilidades + * de tu lenguaje). + * Una vez implementada, créala, establece sus parámetros, modifícalos e imprímelos + * utilizando su función. + * + * DIFICULTAD EXTRA (opcional): + * Implementa dos clases que representen las estructuras de Pila y Cola (estudiadas + * en el ejercicio número 7 de la ruta de estudio) + * - Deben poder inicializarse y disponer de operaciones para añadir, eliminar, + * retornar el número de elementos e imprimir todo su contenido. + """ + +### EJERCICIO: ### +class Persona: + #metodo inicializador + def __init__(self, nombre, edad, actividad): + self.nombre = nombre + self.edad = edad + self.actividad = actividad + + #metodo para imprimir atributos de clase a traves del metodo __str__ + def __str__(self): + return f"Nombre: {self.nombre} \nEdad: {self.edad} \nActividad: {self.actividad} \n" + + #metodo que muestra los atributos de clase + def mostrar_atributos(self): + print(f"Nombre: {self.nombre}\nEdad: {self.edad} \nActividad: {self.actividad}\n") + +#instancia de clases +persona1 = Persona("juank", 25 , "Programador") + +#llamo al método mostrar_atributos +persona1.mostrar_atributos() + +#modifico atributo de clase +persona1.nombre = "Juan Gabriel" + +#llamo al método __str__ +print(persona1) + +### DIFICULTAD EXTRA: ### + +## Pila (LIFO)## +class Pila: + #metodo inicializador + def __init__(self): + self.pila = [] + + #metodo 'Push' que añade un elemento a la pila + def añadir_elemento(self, elemento): + self.pila.append(elemento) + + #metodo 'Pop' que elimina un elemento de la pila + def eliminar_elemento(self): + #verifica que la pila no este vacia + if self.contar_elementos() == 0: + #retorna None si la pila esta vacia + return None + return self.pila.pop() + + + #metodo 'Count' que retorna el numero de elementos de la pila + def contar_elementos(self): + return len(self.pila) + + #metodo 'Print' que imprime el contenido de la pila + def imprimir_elementos(self): + #recorre la lista de manera inversa + for elemento in reversed(self.pila): #reverse() invierte los valores de la secuencia dada + print(elemento) + +#creo una instacia de la clase Pila +mi_pila = Pila() +#añado elementos a la pila +mi_pila.añadir_elemento("elemento 1") +mi_pila.añadir_elemento("elemento 2") +mi_pila.añadir_elemento("elemento 3") +mi_pila.añadir_elemento("elemento 4") +#muestro la lista de elementos +mi_pila.imprimir_elementos() +#muestro la cantidad de elementos +print(f"la cantidad de elementos es: {mi_pila.contar_elementos()}\n") + +#elimino un elemento de la pila +mi_pila.eliminar_elemento() +#muestro la lista de elementos +mi_pila.imprimir_elementos() +#muestro la cantidad de elementos +print(f"la cantidad de elementos es: {mi_pila.contar_elementos()}\n") + + +## Cola (FIFO)## + +class Cola: + #metodo inicializador + def __init__(self): + self.cola = [] + + #metodo 'enqueue' que añade un elemento a la cola + def añadir_elemento(self, elemento): + self.cola.append(elemento) + + #metodo 'dequeue' que elimina un elemento de la cola + def eliminar_elemento(self): + #verifica que la cola no este vacia + if self.contar_elementos() == 0: + #retorna None si la cola esta vacia + return None + #se elimina el primer elemento de la cola indicando el indice '0' + return self.cola.pop(0) + + #metodo 'Count' que retorna el numero de elemntos de la cola + def contar_elementos(self): + return len(self.cola) + + #metodo 'Print' que imprime el contenido de la cola + def imprimir_elementos(self): + for elemntos in self.cola: + print(elemntos) + +#creo una instancia de la clase Cola +mi_cola = Cola() +#añado elementos a la cola +mi_cola.añadir_elemento("elemento 1") +mi_cola.añadir_elemento("elemento 2") +mi_cola.añadir_elemento("elemento 3") +mi_cola.añadir_elemento("elemento 4") + +#muestro la lista de elementos +mi_cola.imprimir_elementos() +#muestro la cantidad de elementos +print(f"la cantidad de elementos es: {mi_cola.contar_elementos()}\n") + +#elimino un elemento de la pila +mi_cola.eliminar_elemento() +#muestro la lista de elementos +mi_cola.imprimir_elementos() +#muestro la cantidad de elementos +print(f"la cantidad de elementos es: {mi_cola.contar_elementos()}\n") + + + + \ No newline at end of file From a116c9fde28116a12ba53d79b8c9f846b7decc06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20D=C3=B3ezon?= Date: Fri, 27 Dec 2024 12:04:09 -0600 Subject: [PATCH 072/104] #50 - JavaScript --- .../javascript/RaulDoezon.js" | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/RaulDoezon.js" diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/RaulDoezon.js" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/RaulDoezon.js" new file mode 100644 index 0000000000..579c41fdf7 --- /dev/null +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/RaulDoezon.js" @@ -0,0 +1,104 @@ +/* + * EJERCICIO: + * El nuevo año está a punto de comenzar... + * ¡Voy a ayudarte a planificar tus propósitos de nuevo año! + * + * Programa un gestor de objetivos con las siguientes características: + * - Permite añadir objetivos (máximo 10) + * - Calcular el plan detallado + * - Guardar la planificación + * + * Cada entrada de un objetivo está formado por (con un ejemplo): + * - Meta: Leer libros + * - Cantidad: 12 + * - Unidades: libros + * - Plazo (en meses): 12 (máximo 12) + * + * El cálculo del plan detallado generará la siguiente salida: + * - Un apartado para cada mes + * - Un listado de objetivos calculados a cumplir en cada mes + * (ejemplo: si quiero leer 12 libros, dará como resultado + * uno al mes) + * - Cada objetivo debe poseer su nombre, la cantidad de + * unidades a completar en cada mes y su total. Por ejemplo: + * + * Enero: + * [ ] 1. Leer libros (1 libro/mes). Total: 12. + * [ ] 2. Estudiar Git (1 curso/mes). Total: 1. + * Febrero: + * [ ] 1. Leer libros (1 libro/mes). Total: 12. + * ... + * Diciembre: + * [ ] 1. Leer libros (1 libro/mes). Total: 12. + * + * - Si la duración es menor a un año, finalizará en el mes + * correspondiente. + * + * Por último, el cálculo detallado debe poder exportarse a .txt + * (No subir el fichero) +*/ + +const readlinePromises = require("readline/promises"); +const fs = require('fs'); +const rl = readlinePromises.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +const inputs = ["Meta", "Cantidad", "Unidades", "Plazo"]; +const months = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]; +let purposes = []; +let monthCounter = 1; +let results = 'Planificación de objetivos - 2025\n'; + +(async () => { + for (let objectiveIndex = 0; objectiveIndex < 2; objectiveIndex++) { + let objectiveNumber = objectiveIndex + 1; + + purposes.push({}); + + console.log(`\nObjetivo #${objectiveNumber}\n`); + + for (let index = 0; index < inputs.length; index++) { + const input = await rl.question(`${inputs[index]}: `); + + purposes[objectiveIndex][inputs[index]] = input; + } + } + + purposes.forEach(function(key) { + key["Cantidad"] = parseInt(key["Cantidad"]); + key["Plazo"] = parseInt(key["Plazo"]); + }); + + for (let month = 0; month < months.length; month++) { + results = results + `\n${months[month]}:\n`; + + purposes.forEach((purpose, index) => { + let goalNumber = index + 1; + let goal = purpose["Meta"]; + let units = purpose["Unidades"]; + let total = purpose["Cantidad"]; + let deadLine = purpose["Plazo"]; + let unitsPerMonth = purpose["Cantidad"] / purpose["Plazo"]; + + if (monthCounter <= deadLine) { + results = results + `[] ${goalNumber}. ${goal} (${unitsPerMonth} ${units}/mes). Total: ${total}.\n`; + } + }); + + monthCounter++; + } + + fs.writeFile('objetivos-2025.txt', results, 'utf8', (error) => { + if (error) { + console.error('Ocurrió un error al intentar exportar el archivo: ', error); + + return; + } + + console.log('El archivo fue creado exitosamente.'); + }); + + rl.close(); +})(); From fed2b411ae379bc59b6bef8a731755b86ffed03a Mon Sep 17 00:00:00 2001 From: Emilio Date: Fri, 27 Dec 2024 12:29:31 -0600 Subject: [PATCH 073/104] 46-C# --- Roadmap/46 - X VS BLUESKY/c#/hequebo.cs | 417 ++++++++++++++++++++++++ 1 file changed, 417 insertions(+) create mode 100644 Roadmap/46 - X VS BLUESKY/c#/hequebo.cs diff --git a/Roadmap/46 - X VS BLUESKY/c#/hequebo.cs b/Roadmap/46 - X VS BLUESKY/c#/hequebo.cs new file mode 100644 index 0000000000..b6e386403e --- /dev/null +++ b/Roadmap/46 - X VS BLUESKY/c#/hequebo.cs @@ -0,0 +1,417 @@ +class User +{ + private int _id; + private string? _userName; + private List _following; + private List _followers; + + public int Id { get { return _id; } } + public string? UserName { get { return _userName; } } + public List Following { get { return _following; } } + public List Followers { get { return _followers; } } + + public User(int id, string? userName) + { + _id = id; + _userName = userName; + _following = new List(); + _followers = new List(); + } + + public void FollowUser(User user) => _following.Add(user); + public void UnFollowUser(User user) => _following.Remove(user); + public void AddFollower(User user) => _followers.Add(user); + public void RemoveFollower(User user) => _followers.Remove(user); +} +class Post +{ + private int _id; + private User _user; + private string _content; + private DateTime _creationDate; + private List _likes; + + public int Id { get { return _id; } } + public User User { get { return _user; } } + public string Content { get { return _content; } } + public DateTime CreationDate { get { return _creationDate; } } + public List Likes { get { return _likes; } } + + public Post(int id, User user, string content) + { + _id = id; + _user = user; + _content = content; + _creationDate = DateTime.Now; + _likes = new List(); + } + + public void AddLike(User user) => _likes.Add(user); + public void RemoveLike(User user) => _likes.Remove(user); +} +class SocialNetwork +{ + private List _users; + private List _posts; + private int _userId = 1; + private int _postId = 1; + + public SocialNetwork() + { + _users = new List(); + _posts = new List(); + } + public void RegisterUser(string? userName) + { + if (string.IsNullOrEmpty(userName)) + { + Console.WriteLine("No se ha ingresado ningún nombre de usuario..."); + return; + } + if (_users.Where(u => u.UserName == userName).Any()) + { + Console.WriteLine($"El nombre de usuario {userName} ya existe..."); + return; + } + var user = new User(_userId, userName); + _users.Add(user); + Console.WriteLine("El usuario ha sido registrado correctamente"); + Console.WriteLine($"Id: {user.Id}, Nombre de Usuario: {user.UserName}"); + _userId++; + } + public void FollowUser(string? userName1, string? userName2) + { + if (string.IsNullOrEmpty(userName1) || string.IsNullOrEmpty(userName2)) + { + Console.WriteLine("Uno de los usuarios no se ha ingresado correctamente..."); + return; + } + var user1 = SearchUser(userName1); + var user2 = SearchUser(userName2); + if (user1 == null || user2 == null) + return; + if (user1.Following.Contains(user2)) + { + Console.WriteLine($"{user1.UserName} ya sigue a {user2.UserName}..."); + return; + } + if (user1 == user2) + { + Console.WriteLine($"{user1.UserName} no puede seguirse a si mismo..."); + return; + } + user1.FollowUser(user2); + user2.AddFollower(user1); + Console.WriteLine($"{user1.UserName} ahora sigue a {user2.UserName}"); + } + public void UnfollowUser(string? userName1, string? userName2) + { + if (string.IsNullOrEmpty(userName1) || string.IsNullOrEmpty(userName2)) + { + Console.WriteLine("Uno de los usuarios no se ha ingresado correctamente..."); + return; + } + var user1 = SearchUser(userName1); + var user2 = SearchUser(userName2); + if (user1 == null || user2 == null) + return; + if (!user1.Following.Contains(user2)) + { + Console.WriteLine($"{user1.UserName} no seguía a {user2.UserName}..."); + return; + } + user1.UnFollowUser(user2); + user2.RemoveFollower(user1); + Console.WriteLine($"{user1.UserName} dejó de seguir a {user2.UserName}"); + } + public void CreatePost(string? userName, string? content) + { + if (string.IsNullOrEmpty(userName)) + { + Console.WriteLine("No se ingresó ningún usuario..."); + return; + } + var user = SearchUser(userName); + if (user == null) + return; + if (string.IsNullOrEmpty(content)) + { + Console.WriteLine("La publicación está vacía..."); + return; + } + if (content.Length > 200) + { + Console.WriteLine("La publicación no puede contener más de 200 carácteres..."); + return; + } + var post = new Post(_postId, user, content); + _posts.Add(post); + Console.WriteLine("La publicación se ha creado correctamente..."); + _postId++; + } + public void DeletePost(string? userName) + { + if (string.IsNullOrEmpty(userName)) + { + Console.WriteLine("No se ingresó ningún usuario..."); + return; + } + var user = SearchUser(userName); + if (user == null) + return; + var userPosts = _posts.Where(p => p.User == user).ToList(); + if (userPosts.Count == 0) + { + Console.WriteLine($"El usuario {user.UserName} no tiene publicaciones..."); + return; + } + Console.WriteLine($"------------Publicaciones de {user.UserName}------------"); + foreach (var post in userPosts) + ShowPost(post); + + Console.WriteLine(); + Console.WriteLine("Ingresa el id de la publicación a eliminar"); + var postToDelete = SearchPost(); + + if (postToDelete == null) + return; + _posts.Remove(postToDelete); + Console.WriteLine("Se ha eliminado la publicación correctamente"); + } + private void ShowPost(Post post) + { + Console.WriteLine("-------------------------------------------------"); + Console.WriteLine($"Post ID: {post.Id}\tUsuario: {post.User.UserName}" + + $"\n{post.Content}\n{post.Likes.Count} likes\t\t{post.CreationDate}"); + } + private bool SearchPosts() + { + if (_posts.Count == 0) + { + Console.WriteLine("No hay publicaciones disponibles..."); + return false; + } + Console.WriteLine($"------------Publicaciones disponibles------------"); + foreach (var post in _posts) + ShowPost(post); + Console.WriteLine(); + return true; + } + private Post? SearchPost() + { + int id = 0; + int.TryParse(Console.ReadLine(), out id); + var post = _posts.Where(p => p.Id == id).FirstOrDefault(); + if (post == null) + Console.WriteLine("La publicación no existe..."); + return post; + } + public void LikePost(string? userName) + { + if (string.IsNullOrEmpty (userName)) + { + Console.WriteLine("El usuario no se ingresó correctamente..."); + return; + } + var user = SearchUser(userName); + if (user == null) + return; + if (!SearchPosts()) + return; + + Console.WriteLine("Ingresa el id de la publicación a dar like"); + var postToLike = SearchPost(); + + if (postToLike == null) + return; + + postToLike.AddLike(user); + Console.WriteLine($"{user.UserName} ha dado like a la publicación de {postToLike.User.UserName}"); + ShowPost(postToLike); + } + public void DislikePost(string? userName) + { + if (string.IsNullOrEmpty(userName)) + { + Console.WriteLine("El usuario no se ingresó correctamente..."); + return; + } + var user = SearchUser(userName); + if (user == null) + return; + + if (!SearchPosts()) + return; + + Console.WriteLine("Ingresa el id de la publicación a quitar like"); + var postToDislike = SearchPost(); + if (postToDislike == null) + return; + + if (!postToDislike.Likes.Contains(user)) + { + Console.WriteLine($"{user.UserName} no había dado like a la publicación de {postToDislike.User.UserName}"); + return; + } + Console.WriteLine($"{user.UserName} ha eliminado su like de la publicación de {postToDislike.User.UserName}"); + postToDislike.RemoveLike(user); + } + public void ShowFeed(string? userName) + { + if (string.IsNullOrEmpty(userName)) + { + Console.WriteLine("No se ingresó ningún usuario..."); + return; + } + var feed = _posts.Where(p => p.User.UserName == userName).ToList(); + + if (feed.Count == 0) + { + Console.WriteLine($"El usuario {userName} no tiene publicaciones..."); + return; + } + feed = feed.OrderByDescending(f => f.CreationDate) + .ToList(); + if (feed.Count > 10) + feed = feed.Slice(0, 10); + Console.WriteLine($"------------Últimas 10 publicaciones de {userName}------------"); + foreach (var post in feed) + ShowPost(post); + } + public void ShowFollowingFeed(string? userName) + { + if (string.IsNullOrEmpty(userName)) + { + Console.WriteLine("No se ingresó ningún usuairo..."); + return; + } + var user = SearchUser(userName); + if (user == null) + return; + + if (user.Following.Count == 0) + { + Console.WriteLine($"El usuario {user.UserName} no sigue a ninguna cuenta..."); + return; + } + + var feed = _posts.Where(p => user.Following.Contains(p.User)) + .OrderByDescending(p => p.CreationDate) + .ToList(); + if (feed.Count > 10) + feed = feed.Slice(0, 10); + Console.WriteLine($"------------Feed cuentas seguidas por {user.UserName}------------"); + foreach(var post in feed) + ShowPost(post); + + } + public User? SearchUser(string userName) + { + var user = _users.Where(u => u.UserName == userName).FirstOrDefault(); + if (user == null) + Console.WriteLine($"El usuario {userName} no existe..."); + return user; + } +} +class Program +{ + static void Main(string[] args) + { + var sn = new SocialNetwork(); + bool exit = false; + + do + { + Menu(); + int option = 0; + int.TryParse(Console.ReadLine(), out option); + switch (option) + { + case 1: + Console.Clear(); + Console.WriteLine("Ingresa el nombre de usuario"); + string? userName = Console.ReadLine(); + sn.RegisterUser(userName); + break; + case 2: + Console.Clear(); + Console.WriteLine("Ingresa el nombre del usuario"); + string? userName1 = Console.ReadLine(); + Console.WriteLine("Ingresa el nombre del usuario a seguir"); + string? userName2 = Console.ReadLine(); + sn.FollowUser(userName1, userName2); + break; + case 3: + Console.Clear(); + Console.WriteLine("Ingresa el nombre del usuario"); + userName1 = Console.ReadLine(); + Console.WriteLine("Ingresa el nombre del usuario a dejar de seguir"); + userName2 = Console.ReadLine(); + sn.UnfollowUser(userName1, userName2); + break; + case 4: + Console.Clear(); + Console.WriteLine("Ingresa el nombre del usuario"); + userName = Console.ReadLine(); + Console.WriteLine("Ingresa el contenido de la publicación"); + string? content = Console.ReadLine(); + sn.CreatePost(userName, content); + break; + case 5: + Console.Clear(); + Console.WriteLine("Ingresa el nombre del usuario"); + userName = Console.ReadLine(); + sn.DeletePost(userName); + break; + case 6: + Console.Clear(); + Console.WriteLine("Ingresa el nombre del usuario"); + userName = Console.ReadLine(); + sn.LikePost(userName); + break; + case 7: + Console.Clear(); + Console.WriteLine("Ingresa el nombre del usuario"); + userName = Console.ReadLine(); + sn.DislikePost(userName); + break; + case 8: + Console.Clear(); + Console.WriteLine("Ingresa el nombre del usuario"); + userName = Console.ReadLine(); + sn.ShowFeed(userName); + break; + case 9: + Console.Clear(); + Console.WriteLine("Ingresa el nombre del usuario"); + userName = Console.ReadLine(); + sn.ShowFollowingFeed(userName); + break; + case 10: + Console.Clear(); + exit = true; + Console.WriteLine("Hasta la próxima..."); + Thread.Sleep(1000); + break; + default: + Console.WriteLine("Opción no válida..."); + break; + } + } while (!exit); + } + static void Menu() + { + Console.WriteLine("------------MENU------------"); + Console.WriteLine("1.- Registrar usuario nuevo."); + Console.WriteLine("2.- Seguir a un usuario."); + Console.WriteLine("3.- Dejar de seguir a un usuario"); + Console.WriteLine("4.- Crear una publicación."); + Console.WriteLine("5.- Eliminar una publicación."); + Console.WriteLine("6.- Dar Like."); + Console.WriteLine("7.- Quitar Like"); + Console.WriteLine("8.- Mostrar Feed de usuario"); + Console.WriteLine("9.- Mostrar Feed de usuarios seguidos"); + Console.WriteLine("10.- Salir."); + Console.WriteLine("Ingrese la opción deseada..."); + } +} \ No newline at end of file From 48a2d49b7869fb313d71274aa573fce3c9317e1a Mon Sep 17 00:00:00 2001 From: Santiago Bailleres Date: Fri, 27 Dec 2024 17:19:32 -0300 Subject: [PATCH 074/104] #11 - Python --- .../python/santiagobailleres.py | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 Roadmap/11 - MANEJO DE FICHEROS/python/santiagobailleres.py diff --git a/Roadmap/11 - MANEJO DE FICHEROS/python/santiagobailleres.py b/Roadmap/11 - MANEJO DE FICHEROS/python/santiagobailleres.py new file mode 100644 index 0000000000..1e718141d9 --- /dev/null +++ b/Roadmap/11 - MANEJO DE FICHEROS/python/santiagobailleres.py @@ -0,0 +1,103 @@ +'''EJERCICIO: +Desarrolla un programa capaz de crear un archivo que se llame como +tu usuario de GitHub y tenga la extensión .txt. +Añade varias líneas en ese fichero: +- Tu nombre. +- Edad. +- Lenguaje de programación favorito. +Imprime el contenido. +Borra el fichero. +DIFICULTAD EXTRA (opcional): +Desarrolla un programa de gestión de ventas que almacena sus datos en un +archivo .txt. +- Cada producto se guarda en una línea del archivo de la siguiente manera: + [nombre_producto], [cantidad_vendida], [precio]. +- Siguiendo ese formato, y mediante terminal, debe permitir añadir, consultar, + actualizar, eliminar productos y salir. +- También debe poseer opciones para calcular la venta total y por producto. +- La opción salir borra el .txt.''' + +# Solución: +import os +filename = 'santiagobailleres.txt' +with open(filename, 'w') as file: + file.write('Santiago Bailleres\n') + file.write('25\n') + file.write('Python\n') + +with open(filename, 'r') as file: + print(file.read()) + +os.remove(filename) + +# EXTRA +filename = 'ventas.txt' +open(filename, 'a') # 'a' para añadir al final del archivo + +while True: + print("1. Añadir producto") + print("2. Consultar producto") + print("3. Actualizar producto") + print("4. Eliminar producto") + print("5. Mostrar productos") + print("6. Calcular venta total") + print("7. Calcular venta por producto") + print("8. Salir") + + option = input("Selecciona una opción: ") + if option == "1": # Añadir producto + name = input("Nombre del producto: ") + quantity = input("Cantidad vendida: ") + price = input("Precio: ") + with open(filename, 'a') as file: + file.write(f'{name}, {quantity}, {price}\n') + elif option == "2": # Consultar producto + name = input("Nombre del producto: ") + with open(filename, 'r') as file: + for line in file.readlines(): # Lee todas las lineas + if line.split(', ')[0] == name: + print(line) + break + elif option == "3": # Actualizar producto + name = input("Nombre del producto: ") + quantity = input("Cantidad vendida: ") + price = input("Precio: ") + with open(filename, 'r') as file: + lines = file.readlines() + with open(filename, 'w') as file: + for line in lines: + if line.split(', ')[0] == name: + file.write(f'{name}, {quantity}, {price}\n') + else: + file.write(line) + elif option == "4": # Eliminar producto + name = input("Nombre del producto: ") + with open(filename, 'r') as file: + lines = file.readlines() + with open(filename, 'w') as file: + for line in lines: + if line.split(', ')[0] != name: # este if es para no escribir la linea que se quiere eliminar + file.write(line) # Escribe todas las lineas menos la que se quiere eliminar + elif option == "5": # Mostrar productos + with open(filename, 'r') as file: + print(file.read()) + elif option == "6": # Calcular venta total + tot = 0 + with open(filename, 'r') as file: + for line in file.readlines(): + tot += int(line.split(', ')[1]) * float(line.split(', ')[2]) + print(f'Venta total: {tot}') + elif option == "7": # Calcular venta por producto + name = input("Nombre del producto: ") + tot = 0 + with open(filename, 'r') as file: + for line in file.readlines(): + if line.split(', ')[0] == name: + tot += int(line.split(', ')[1]) * float(line.split(', ')[2]) + break + print(f'Venta de {name}: {tot}') + elif option == "8": # Salir + os.remove(filename) + break + else: + print("Opción no válida") \ No newline at end of file From 97a55c4ebba52d946e7beab2e75bd90d950bc20f Mon Sep 17 00:00:00 2001 From: Jaen Date: Fri, 27 Dec 2024 14:58:42 -0600 Subject: [PATCH 075/104] #001 - Kotlin --- .../kotlin/jaennova.kt | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/kotlin/jaennova.kt diff --git a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/kotlin/jaennova.kt b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/kotlin/jaennova.kt new file mode 100644 index 0000000000..84ac96cf48 --- /dev/null +++ b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/kotlin/jaennova.kt @@ -0,0 +1,91 @@ +/* + * EJERCICIO: + * - Crea ejemplos utilizando todos los tipos de operadores de tu lenguaje: + * Aritméticos, lógicos, de comparación, asignación, identidad, pertenencia, bits... + * (Ten en cuenta que cada lenguaje puede poseer unos diferentes) + * - Utilizando las operaciones con operadores que tú quieras, crea ejemplos + * que representen todos los tipos de estructuras de control que existan + * en tu lenguaje: + * Condicionales, iterativas, excepciones... + * - Debes hacer print por consola del resultado de todos los ejemplos. + * + * DIFICULTAD EXTRA (opcional): + * Crea un programa que imprima por consola todos los números comprendidos + * entre 10 y 55 (incluidos), pares, y que no son ni el 16 ni múltiplos de 3. + * + * Seguro que al revisar detenidamente las posibilidades has descubierto algo nuevo. + */ + + + fun operadoresAritmeticos(){ + val a1: Int = 4 + val a2: Int = 42 + println("Operadores Aritmeticos") + println("a1 = $a1, a2 = $a2\n") + println("$a1 - $a2 = ${a1 - a2}") + println("$a1 * $a2 = ${a1 * a2}") + println("$a1 / $a2 = ${a1 / a2}") + println("$a1 % $a2 = ${a1 % a2}") +} + + +fun operadoresLogicos(){ + val o1: Int = 23 + val o2: Int = 41 + println("\nOperadores Logicos") + println("o1 = $o1, o2 = $o2\n") + println("$o1 == $o2 = ${o1 == o2}") + println("$o1 != $o2 = ${o1 != o2}") +} + +fun operadoresRelacionCompuesta(){ + val a = 5 + val b = 3 + val c = 1 + println("/nOperadores de relacion compuesta") + println("a = $a, b = $b, c = $c") + println("a > b && b > c = ${a > b && b > c}") // imprime true, ya que a > b y b > c son ambas verdaderas + println("a < b || b > c = ${a < b || b > c}") // imprime true, ya que al menos una de las expresiones es verdadera (b > c) +} + +fun operadoresRelacionales(){ + val a = 5 + val b = 3 + val c = 5 + println(a == b) // imprime false + println(a != b) // imprime true + println(a > b) // imprime true + println(a < b) // imprime false + println(a >= b) // imprime true + println(a <= b) // imprime false + println(a == c) // imprime true +} + +fun condicionales(){ + val a = 5 + val b = 3 + val c = 5 + if(a != b) println("a es diferente de b") else println("a no es diferente de b") + if(b && c > a){ + println("$a y $c son mayores que $a") + } else{ + println("$a y $c no son mayores que $a") + } +} +// * DIFICULTAD EXTRA (opcional): +// * Crea un programa que imprima por consola todos los números comprendidos +// * entre 10 y 55 (incluidos), pares, y que no son ni el 16 ni múltiplos de 3. +fun ejercicio(){ + for(i in 10..5){ + if(i % 2 == 0 && i != 16 && i % 3 != 0){ + println(i) + } + } +} +fun main(){ + operadoresAritmeticos() + operadoresLogicos() + operadoresRelacionCompuesta() + condicionales() + ejercicio() +} \ No newline at end of file From 0875d4abd450b6f1cb4814de0915d9ac621c5100 Mon Sep 17 00:00:00 2001 From: HodginsOhannigan <62486573+devcherry1@users.noreply.github.com> Date: Fri, 27 Dec 2024 17:06:33 -0500 Subject: [PATCH 076/104] #10 - C# EXCEPCIONES --- Roadmap/10 - EXCEPCIONES/c#/devcherry.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Roadmap/10 - EXCEPCIONES/c#/devcherry.py diff --git a/Roadmap/10 - EXCEPCIONES/c#/devcherry.py b/Roadmap/10 - EXCEPCIONES/c#/devcherry.py new file mode 100644 index 0000000000..07aac219cb --- /dev/null +++ b/Roadmap/10 - EXCEPCIONES/c#/devcherry.py @@ -0,0 +1,17 @@ +using System; +class Program +{ + static void Main() + { + List nombres = new List() { "Anna", "Carlos" }; + try + { + Console.WriteLine(nombres[2]); + } + catch (Exception ex) + { + // Manejo genérico para cualquier excepción. + Console.WriteLine($"Ocurrió un error: {ex.Message}"); + } + } +} From 25d23f84d13cf508508e59230e556dbe76187b16 Mon Sep 17 00:00:00 2001 From: mouredev Date: Sat, 28 Dec 2024 00:15:50 +0000 Subject: [PATCH 077/104] Update stats --- Roadmap/stats.json | 2248 ++++++++++++++++++++++---------------------- 1 file changed, 1130 insertions(+), 1118 deletions(-) diff --git a/Roadmap/stats.json b/Roadmap/stats.json index b984fd8a1c..35b65b44c4 100644 --- a/Roadmap/stats.json +++ b/Roadmap/stats.json @@ -1,18 +1,18 @@ { "challenges_total": 51, "languages_total": 52, - "files_total": 8796, - "users_total": 1390, + "files_total": 8812, + "users_total": 1392, "challenges_ranking": [ { "order": 1, "name": "00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO", - "count": 1499 + "count": 1504 }, { "order": 2, "name": "01 - OPERADORES Y ESTRUCTURAS DE CONTROL", - "count": 907 + "count": 910 }, { "order": 3, @@ -22,7 +22,7 @@ { "order": 4, "name": "03 - ESTRUCTURAS DE DATOS", - "count": 480 + "count": 481 }, { "order": 5, @@ -32,7 +32,7 @@ { "order": 6, "name": "06 - RECURSIVIDAD", - "count": 366 + "count": 367 }, { "order": 7, @@ -157,7 +157,7 @@ { "order": 31, "name": "32 - BATALLA DEADPOOL Y WOLVERINE", - "count": 64 + "count": 65 }, { "order": 32, @@ -167,7 +167,7 @@ { "order": 33, "name": "33 - RESCATANDO A MICKEY", - "count": 56 + "count": 57 }, { "order": 34, @@ -236,17 +236,17 @@ }, { "order": 47, - "name": "46 - X VS BLUESKY", - "count": 33 + "name": "49 - EL ALMAC\u00c9N DE PAP\u00c1 NOEL", + "count": 34 }, { "order": 48, - "name": "45 - GITHUB OCTOVERSE", + "name": "46 - X VS BLUESKY", "count": 33 }, { "order": 49, - "name": "49 - EL ALMAC\u00c9N DE PAP\u00c1 NOEL", + "name": "45 - GITHUB OCTOVERSE", "count": 33 }, { @@ -257,44 +257,44 @@ { "order": 51, "name": "50 - PLANIFICADOR DE OBJETIVOS DE A\u00d1O NUEVO", - "count": 9 + "count": 12 } ], "languages_ranking": [ { "order": 1, "name": "python", - "count": 3667, - "percentage": 41.69 + "count": 3672, + "percentage": 41.67 }, { "order": 2, "name": "javascript", - "count": 1750, - "percentage": 19.9 + "count": 1755, + "percentage": 19.92 }, { "order": 3, "name": "java", - "count": 908, - "percentage": 10.32 + "count": 910, + "percentage": 10.33 }, { "order": 4, "name": "typescript", "count": 477, - "percentage": 5.42 + "percentage": 5.41 }, { "order": 5, "name": "c#", - "count": 339, - "percentage": 3.85 + "count": 340, + "percentage": 3.86 }, { "order": 6, "name": "go", - "count": 247, + "count": 248, "percentage": 2.81 }, { @@ -306,14 +306,14 @@ { "order": 8, "name": "php", - "count": 215, - "percentage": 2.44 + "count": 216, + "percentage": 2.45 }, { "order": 9, "name": "swift", - "count": 170, - "percentage": 1.93 + "count": 171, + "percentage": 1.94 }, { "order": 10, @@ -325,7 +325,7 @@ "order": 11, "name": "rust", "count": 128, - "percentage": 1.46 + "percentage": 1.45 }, { "order": 12, @@ -403,13 +403,13 @@ "order": 24, "name": "nasm", "count": 11, - "percentage": 0.13 + "percentage": 0.12 }, { "order": 25, "name": "fortran", "count": 11, - "percentage": 0.13 + "percentage": 0.12 }, { "order": 26, @@ -602,7 +602,7 @@ { "order": 5, "name": "hozlucas28", - "count": 139, + "count": 140, "languages": 3 }, { @@ -727,19 +727,19 @@ }, { "order": 26, - "name": "josegs95", + "name": "asjordi", "count": 51, "languages": 1 }, { "order": 27, - "name": "mouredev", - "count": 50, + "name": "josegs95", + "count": 51, "languages": 1 }, { "order": 28, - "name": "asjordi", + "name": "mouredev", "count": 50, "languages": 1 }, @@ -763,13 +763,13 @@ }, { "order": 32, - "name": "martinbohorquez", - "count": 47, + "name": "victor-casta", + "count": 48, "languages": 3 }, { "order": 33, - "name": "victor-casta", + "name": "martinbohorquez", "count": 47, "languages": 3 }, @@ -895,21 +895,21 @@ }, { "order": 54, - "name": "zetared92", - "count": 33, - "languages": 3 + "name": "mrodara", + "count": 34, + "languages": 1 }, { "order": 55, - "name": "worlion", + "name": "zetared92", "count": 33, - "languages": 2 + "languages": 3 }, { "order": 56, - "name": "mrodara", + "name": "worlion", "count": 33, - "languages": 1 + "languages": 2 }, { "order": 57, @@ -2107,649 +2107,649 @@ }, { "order": 256, - "name": "danielbelenguer", + "name": "davstudy", "count": 7, "languages": 2 }, { "order": 257, + "name": "danielbelenguer", + "count": 7, + "languages": 2 + }, + { + "order": 258, "name": "pwrxman", "count": 7, "languages": 1 }, { - "order": 258, + "order": 259, "name": "albertomorilla", "count": 7, "languages": 1 }, { - "order": 259, + "order": 260, "name": "jorgeadamowicz", "count": 7, "languages": 1 }, { - "order": 260, + "order": 261, "name": "hectordbh", "count": 7, "languages": 1 }, { - "order": 261, + "order": 262, "name": "ldre3", "count": 7, "languages": 1 }, { - "order": 262, + "order": 263, "name": "jose-larss", "count": 7, "languages": 1 }, { - "order": 263, + "order": 264, "name": "dgrex", "count": 7, "languages": 1 }, { - "order": 264, + "order": 265, "name": "ruhlmirko", "count": 7, "languages": 1 }, { - "order": 265, + "order": 266, "name": "maxirica", "count": 7, "languages": 1 }, { - "order": 266, + "order": 267, "name": "franvozzi", "count": 7, "languages": 1 }, { - "order": 267, + "order": 268, "name": "marinaortells", "count": 7, "languages": 1 }, { - "order": 268, + "order": 269, "name": "mtirador", "count": 7, "languages": 1 }, { - "order": 269, + "order": 270, "name": "alextc35", "count": 7, "languages": 1 }, { - "order": 270, + "order": 271, "name": "18miguelgalarza", "count": 7, "languages": 1 }, { - "order": 271, + "order": 272, "name": "abrahamraies", "count": 7, "languages": 1 }, { - "order": 272, + "order": 273, "name": "ocandodev", "count": 7, "languages": 1 }, { - "order": 273, + "order": 274, "name": "markc1234", "count": 7, "languages": 1 }, { - "order": 274, + "order": 275, "name": "shevotool", "count": 7, "languages": 1 }, { - "order": 275, + "order": 276, "name": "aarxnmendez", "count": 7, "languages": 1 }, { - "order": 276, + "order": 277, "name": "leandrocfd", "count": 7, "languages": 1 }, { - "order": 277, + "order": 278, "name": "abel-ade", "count": 6, "languages": 3 }, { - "order": 278, + "order": 279, "name": "fidelysla", "count": 6, "languages": 3 }, { - "order": 279, + "order": 280, "name": "curtobrull", "count": 6, "languages": 3 }, { - "order": 280, + "order": 281, "name": "rserradev", "count": 6, "languages": 2 }, { - "order": 281, + "order": 282, "name": "troleomotor10", "count": 6, "languages": 2 }, { - "order": 282, + "order": 283, "name": "roswer13", "count": 6, "languages": 2 }, { - "order": 283, + "order": 284, "name": "devknn", "count": 6, "languages": 2 }, { - "order": 284, + "order": 285, "name": "misterdan100", "count": 6, "languages": 2 }, { - "order": 285, + "order": 286, "name": "luisk0706", "count": 6, "languages": 2 }, { - "order": 286, + "order": 287, "name": "danilo0203", "count": 6, "languages": 2 }, { - "order": 287, + "order": 288, "name": "eberstr", "count": 6, "languages": 2 }, { - "order": 288, + "order": 289, "name": "luterfloyd", "count": 6, "languages": 2 }, { - "order": 289, + "order": 290, "name": "adrs1166ma", "count": 6, "languages": 2 }, { - "order": 290, + "order": 291, "name": "oixild", "count": 6, "languages": 2 }, { - "order": 291, + "order": 292, "name": "kronstadt-lambda", "count": 6, "languages": 2 }, { - "order": 292, + "order": 293, "name": "isaias-alt", "count": 6, "languages": 2 }, { - "order": 293, + "order": 294, "name": "douglasdiazr", "count": 6, "languages": 2 }, { - "order": 294, + "order": 295, "name": "elbarbero", "count": 6, "languages": 1 }, { - "order": 295, + "order": 296, "name": "eduhumanes91", "count": 6, "languages": 1 }, { - "order": 296, + "order": 297, "name": "yeisonagm", "count": 6, "languages": 1 }, { - "order": 297, + "order": 298, "name": "dafi02", "count": 6, "languages": 1 }, { - "order": 298, + "order": 299, "name": "eamartin96", "count": 6, "languages": 1 }, { - "order": 299, + "order": 300, "name": "gliadev", "count": 6, "languages": 1 }, { - "order": 300, + "order": 301, "name": "wolffcode", "count": 6, "languages": 1 }, { - "order": 301, + "order": 302, + "name": "miguelangelmtz000414", + "count": 6, + "languages": 1 + }, + { + "order": 303, "name": "abascal92", "count": 6, "languages": 1 }, { - "order": 302, + "order": 304, "name": "lazar171717ech", "count": 6, "languages": 1 }, { - "order": 303, + "order": 305, "name": "mikelroset", "count": 6, "languages": 1 }, { - "order": 304, + "order": 306, "name": "guillemduno", "count": 6, "languages": 1 }, { - "order": 305, + "order": 307, "name": "mxtrar23", "count": 6, "languages": 1 }, { - "order": 306, + "order": 308, "name": "facundo-muoio", "count": 6, "languages": 1 }, { - "order": 307, + "order": 309, "name": "ssanjua", "count": 6, "languages": 1 }, { - "order": 308, + "order": 310, "name": "dannymarperone", "count": 6, "languages": 1 }, { - "order": 309, + "order": 311, "name": "alabacw74", "count": 5, "languages": 3 }, { - "order": 310, + "order": 312, "name": "bryan112094", "count": 5, "languages": 3 }, { - "order": 311, + "order": 313, "name": "tizog", "count": 5, "languages": 2 }, { - "order": 312, + "order": 314, "name": "andresmendozaf", "count": 5, "languages": 2 }, { - "order": 313, + "order": 315, "name": "icedrek", "count": 5, "languages": 2 }, { - "order": 314, + "order": 316, "name": "vmatmarco", "count": 5, "languages": 2 }, { - "order": 315, + "order": 317, "name": "espinoleandroo", "count": 5, "languages": 2 }, { - "order": 316, + "order": 318, "name": "alejandrodave", "count": 5, "languages": 2 }, { - "order": 317, + "order": 319, "name": "jalivur", "count": 5, "languages": 2 }, { - "order": 318, + "order": 320, "name": "eloychavezdev", "count": 5, "languages": 1 }, { - "order": 319, + "order": 321, "name": "w00k", "count": 5, "languages": 1 }, { - "order": 320, + "order": 322, "name": "thaishdz", "count": 5, "languages": 1 }, { - "order": 321, + "order": 323, "name": "boterop", "count": 5, "languages": 1 }, { - "order": 322, + "order": 324, "name": "d0ubt0", "count": 5, "languages": 1 }, { - "order": 323, + "order": 325, "name": "micromantic", "count": 5, "languages": 1 }, { - "order": 324, + "order": 326, "name": "javitron100", "count": 5, "languages": 1 }, { - "order": 325, + "order": 327, "name": "njaimev", "count": 5, "languages": 1 }, { - "order": 326, + "order": 328, "name": "craphaelam", "count": 5, "languages": 1 }, { - "order": 327, + "order": 329, "name": "yharyarias", "count": 5, "languages": 1 }, { - "order": 328, + "order": 330, "name": "thezhizn", "count": 5, "languages": 1 }, { - "order": 329, + "order": 331, "name": "rusanov16", "count": 5, "languages": 1 }, { - "order": 330, + "order": 332, "name": "gmbarrios", "count": 5, "languages": 1 }, { - "order": 331, + "order": 333, "name": "franz-arzapalo", "count": 5, "languages": 1 }, { - "order": 332, + "order": 334, "name": "santiago434c", "count": 5, "languages": 1 }, { - "order": 333, + "order": 335, "name": "jose-luis-lanza", "count": 5, "languages": 1 }, { - "order": 334, + "order": 336, "name": "zakkdrte", "count": 5, "languages": 1 }, { - "order": 335, + "order": 337, "name": "alberba", "count": 5, "languages": 1 }, { - "order": 336, + "order": 338, "name": "iban99", "count": 5, "languages": 1 }, { - "order": 337, - "name": "davstudy", - "count": 5, - "languages": 1 - }, - { - "order": 338, + "order": 339, "name": "gabrielramos02", "count": 5, "languages": 1 }, { - "order": 339, + "order": 340, "name": "nomellamodante", "count": 5, "languages": 1 }, { - "order": 340, + "order": 341, "name": "augustdev2003", "count": 5, "languages": 1 }, { - "order": 341, + "order": 342, "name": "drvito1977", "count": 5, "languages": 1 }, { - "order": 342, + "order": 343, "name": "lucasag01", "count": 5, "languages": 1 }, { - "order": 343, + "order": 344, "name": "karolle", "count": 5, "languages": 1 }, { - "order": 344, + "order": 345, "name": "jcrodmir", "count": 5, "languages": 1 }, { - "order": 345, + "order": 346, "name": "kilianhc", "count": 5, "languages": 1 }, { - "order": 346, + "order": 347, "name": "alvarofernandezavalos", "count": 5, "languages": 1 }, { - "order": 347, + "order": 348, "name": "vasilealexandru02", "count": 5, "languages": 1 }, { - "order": 348, + "order": 349, "name": "esaens12", "count": 5, "languages": 1 }, { - "order": 349, + "order": 350, "name": "victormugo", "count": 5, "languages": 1 }, { - "order": 350, + "order": 351, "name": "adridoce", "count": 5, "languages": 1 }, { - "order": 351, + "order": 352, "name": "luis-vb", "count": 5, "languages": 1 }, { - "order": 352, + "order": 353, "name": "rubenplazavi", "count": 5, "languages": 1 }, { - "order": 353, + "order": 354, "name": "dobledj", "count": 5, "languages": 1 }, { - "order": 354, + "order": 355, "name": "robmxz", "count": 5, "languages": 1 }, { - "order": 355, + "order": 356, "name": "lauracastrillonmp", "count": 5, "languages": 1 }, { - "order": 356, + "order": 357, "name": "danielbustos342", "count": 5, "languages": 1 }, { - "order": 357, + "order": 358, "name": "yesidl12", "count": 5, "languages": 1 }, { - "order": 358, + "order": 359, "name": "d4-n1", "count": 5, "languages": 1 }, - { - "order": 359, - "name": "joanfv-git", - "count": 5, - "languages": 1 - }, { "order": 360, - "name": "vixito", + "name": "joanfv-git", "count": 5, "languages": 1 }, { "order": 361, - "name": "n1sek", + "name": "vixito", "count": 5, "languages": 1 }, { "order": 362, - "name": "bastianalq", + "name": "n1sek", "count": 5, "languages": 1 }, { "order": 363, - "name": "miguelangelmtz000414", + "name": "bastianalq", "count": 5, "languages": 1 }, @@ -2851,871 +2851,871 @@ }, { "order": 380, + "name": "siderio2", + "count": 4, + "languages": 2 + }, + { + "order": 381, "name": "davidvilem", "count": 4, "languages": 1 }, { - "order": 381, + "order": 382, "name": "johnalexguerrero", "count": 4, "languages": 1 }, { - "order": 382, + "order": 383, "name": "quejuan52", "count": 4, "languages": 1 }, { - "order": 383, + "order": 384, "name": "ramxv", "count": 4, "languages": 1 }, { - "order": 384, + "order": 385, "name": "inkhemi", "count": 4, "languages": 1 }, { - "order": 385, + "order": 386, "name": "santiago-munoz-garcia", "count": 4, "languages": 1 }, { - "order": 386, + "order": 387, "name": "elhacedordecosas", "count": 4, "languages": 1 }, { - "order": 387, + "order": 388, "name": "guillermo-k", "count": 4, "languages": 1 }, { - "order": 388, + "order": 389, "name": "anvildestroyer", "count": 4, "languages": 1 }, { - "order": 389, + "order": 390, "name": "sunjamer", "count": 4, "languages": 1 }, { - "order": 390, + "order": 391, "name": "txuky", "count": 4, "languages": 1 }, { - "order": 391, + "order": 392, "name": "luissssoto", "count": 4, "languages": 1 }, { - "order": 392, + "order": 393, "name": "rodrigoghr", "count": 4, "languages": 1 }, { - "order": 393, + "order": 394, "name": "mercedesdf", "count": 4, "languages": 1 }, { - "order": 394, + "order": 395, "name": "dlgai12", "count": 4, "languages": 1 }, { - "order": 395, + "order": 396, "name": "tobibordino", "count": 4, "languages": 1 }, { - "order": 396, + "order": 397, "name": "carrenoalexander", "count": 4, "languages": 1 }, { - "order": 397, + "order": 398, "name": "albertorevel", "count": 4, "languages": 1 }, { - "order": 398, + "order": 399, "name": "zerek247", "count": 4, "languages": 1 }, { - "order": 399, + "order": 400, "name": "jadraz", "count": 4, "languages": 1 }, { - "order": 400, + "order": 401, "name": "buriticasara", "count": 4, "languages": 1 }, { - "order": 401, + "order": 402, "name": "javirub", "count": 4, "languages": 1 }, { - "order": 402, + "order": 403, "name": "andres54-coder", "count": 4, "languages": 1 }, { - "order": 403, + "order": 404, "name": "angell4s", "count": 4, "languages": 1 }, { - "order": 404, + "order": 405, "name": "mplatab", "count": 4, "languages": 1 }, { - "order": 405, + "order": 406, "name": "axelprz", "count": 4, "languages": 1 }, { - "order": 406, + "order": 407, "name": "vicman-182", "count": 4, "languages": 1 }, { - "order": 407, + "order": 408, "name": "jfdacovich", "count": 4, "languages": 1 }, { - "order": 408, + "order": 409, "name": "cdbiancotti", "count": 4, "languages": 1 }, { - "order": 409, + "order": 410, + "name": "yorjanvarela", + "count": 4, + "languages": 1 + }, + { + "order": 411, "name": "mallcca", "count": 4, "languages": 1 }, { - "order": 410, + "order": 412, "name": "nox456", "count": 4, "languages": 1 }, { - "order": 411, + "order": 413, "name": "mayerga", "count": 4, "languages": 1 }, { - "order": 412, + "order": 414, "name": "hugovrc", "count": 4, "languages": 1 }, { - "order": 413, + "order": 415, "name": "jeyker-dev", "count": 4, "languages": 1 }, { - "order": 414, + "order": 416, "name": "carzep09", "count": 4, "languages": 1 }, { - "order": 415, + "order": 417, "name": "blasbarragan", "count": 4, "languages": 1 }, { - "order": 416, + "order": 418, "name": "jerrysantana", "count": 4, "languages": 1 }, { - "order": 417, + "order": 419, "name": "marianoemir", "count": 4, "languages": 1 }, { - "order": 418, + "order": 420, "name": "password1989", "count": 4, "languages": 1 }, { - "order": 419, + "order": 421, "name": "dredux2", "count": 4, "languages": 1 }, { - "order": 420, + "order": 422, "name": "bladi23", "count": 4, "languages": 1 }, { - "order": 421, + "order": 423, "name": "juanca2805", "count": 4, "languages": 1 }, { - "order": 422, + "order": 424, "name": "davidsorroche", "count": 4, "languages": 1 }, { - "order": 423, + "order": 425, "name": "somaxb", "count": 4, "languages": 1 }, { - "order": 424, + "order": 426, "name": "confley", "count": 4, "languages": 1 }, { - "order": 425, + "order": 427, "name": "jcubero12", "count": 4, "languages": 1 }, { - "order": 426, + "order": 428, "name": "sbs24", "count": 4, "languages": 1 }, { - "order": 427, + "order": 429, "name": "traver79", "count": 4, "languages": 1 }, { - "order": 428, + "order": 430, "name": "andeveling", "count": 4, "languages": 1 }, { - "order": 429, + "order": 431, "name": "joaquinlopez14", "count": 4, "languages": 1 }, { - "order": 430, + "order": 432, "name": "marcoslombardo", "count": 4, "languages": 1 }, { - "order": 431, + "order": 433, "name": "angelurrutdev", "count": 4, "languages": 1 }, { - "order": 432, + "order": 434, "name": "socramwd", "count": 4, "languages": 1 }, { - "order": 433, + "order": 435, "name": "juperdev", "count": 4, "languages": 1 }, { - "order": 434, + "order": 436, "name": "cristophher087", "count": 4, "languages": 1 }, { - "order": 435, + "order": 437, "name": "dieswae", "count": 4, "languages": 1 }, { - "order": 436, + "order": 438, "name": "fernandog25", "count": 4, "languages": 1 }, { - "order": 437, + "order": 439, "name": "mateo423", "count": 4, "languages": 1 }, { - "order": 438, + "order": 440, "name": "eloyparga", "count": 4, "languages": 1 }, { - "order": 439, + "order": 441, "name": "elianisdev", "count": 4, "languages": 1 }, { - "order": 440, + "order": 442, "name": "omegatroy", "count": 4, "languages": 1 }, { - "order": 441, + "order": 443, "name": "joshbaez", "count": 4, "languages": 1 }, { - "order": 442, + "order": 444, "name": "andyfg0289", "count": 4, "languages": 1 }, { - "order": 443, + "order": 445, "name": "fdcorreadev", "count": 4, "languages": 1 }, { - "order": 444, + "order": 446, "name": "lrpeset", "count": 4, "languages": 1 }, { - "order": 445, + "order": 447, "name": "jairo-alejandro", "count": 4, "languages": 1 }, { - "order": 446, + "order": 448, "name": "deivitdev", "count": 4, "languages": 1 }, { - "order": 447, + "order": 449, "name": "joselorentelopez", "count": 4, "languages": 1 }, { - "order": 448, + "order": 450, "name": "owen-ian", "count": 3, "languages": 3 }, { - "order": 449, + "order": 451, "name": "angelo-eyama", "count": 3, "languages": 3 }, { - "order": 450, + "order": 452, "name": "akaisombra", "count": 3, "languages": 3 }, { - "order": 451, + "order": 453, "name": "abelsrzz", "count": 3, "languages": 3 }, { - "order": 452, + "order": 454, "name": "jehiselruth", "count": 3, "languages": 3 }, { - "order": 453, + "order": 455, "name": "oskarcali", "count": 3, "languages": 3 }, { - "order": 454, + "order": 456, "name": "didix16", "count": 3, "languages": 3 }, { - "order": 455, + "order": 457, "name": "augustosdev", "count": 3, "languages": 2 }, { - "order": 456, + "order": 458, "name": "diegopc-dev", "count": 3, "languages": 2 }, { - "order": 457, + "order": 459, "name": "dimasb69", "count": 3, "languages": 2 }, { - "order": 458, + "order": 460, "name": "eloitr", "count": 3, "languages": 2 }, { - "order": 459, + "order": 461, "name": "seba9906", "count": 3, "languages": 2 }, { - "order": 460, + "order": 462, "name": "pablotaber", "count": 3, "languages": 2 }, { - "order": 461, + "order": 463, "name": "skala2301", "count": 3, "languages": 2 }, { - "order": 462, + "order": 464, "name": "alfarog507", "count": 3, "languages": 2 }, { - "order": 463, + "order": 465, "name": "allanoscoding", "count": 3, "languages": 2 }, { - "order": 464, + "order": 466, "name": "clotrack", "count": 3, "languages": 2 }, { - "order": 465, + "order": 467, "name": "arliumdev", "count": 3, "languages": 2 }, { - "order": 466, + "order": 468, "name": "robindev1812", "count": 3, "languages": 2 }, { - "order": 467, - "name": "siderio2", - "count": 3, - "languages": 2 - }, - { - "order": 468, + "order": 469, "name": "n-skot", "count": 3, "languages": 2 }, { - "order": 469, + "order": 470, "name": "ikeragi05", "count": 3, "languages": 1 }, { - "order": 470, + "order": 471, "name": "beonzj", "count": 3, "languages": 1 }, { - "order": 471, + "order": 472, "name": "frangarmez21", "count": 3, "languages": 1 }, { - "order": 472, + "order": 473, "name": "juanmjimenezs", "count": 3, "languages": 1 }, { - "order": 473, + "order": 474, "name": "juxxon23", "count": 3, "languages": 1 }, { - "order": 474, + "order": 475, "name": "mantaras96", "count": 3, "languages": 1 }, { - "order": 475, + "order": 476, "name": "lesterdavid31", "count": 3, "languages": 1 }, { - "order": 476, + "order": 477, "name": "mellamoomar", "count": 3, "languages": 1 }, { - "order": 477, + "order": 478, "name": "coshiloco", "count": 3, "languages": 1 }, { - "order": 478, + "order": 479, "name": "javiearth", "count": 3, "languages": 1 }, { - "order": 479, + "order": 480, "name": "atienzar", "count": 3, "languages": 1 }, { - "order": 480, + "order": 481, "name": "14davidnkt", "count": 3, "languages": 1 }, { - "order": 481, + "order": 482, "name": "macova96", "count": 3, "languages": 1 }, { - "order": 482, + "order": 483, "name": "estelacode", "count": 3, "languages": 1 }, { - "order": 483, + "order": 484, "name": "yeam-10", "count": 3, "languages": 1 }, { - "order": 484, + "order": 485, "name": "elkin-dev", "count": 3, "languages": 1 }, { - "order": 485, + "order": 486, "name": "elder202", "count": 3, "languages": 1 }, { - "order": 486, + "order": 487, "name": "bryanalzate007", "count": 3, "languages": 1 }, { - "order": 487, + "order": 488, "name": "giulianovfz", "count": 3, "languages": 1 }, { - "order": 488, + "order": 489, "name": "exanderguitar", "count": 3, "languages": 1 }, { - "order": 489, + "order": 490, "name": "mmacalli", "count": 3, "languages": 1 }, { - "order": 490, + "order": 491, "name": "eliskopun", "count": 3, "languages": 1 }, { - "order": 491, + "order": 492, "name": "camilo-zuluaga", "count": 3, "languages": 1 }, { - "order": 492, + "order": 493, "name": "suescun845", "count": 3, "languages": 1 }, { - "order": 493, + "order": 494, "name": "emilianohoyos", "count": 3, "languages": 1 }, - { - "order": 494, - "name": "tonywarcode", - "count": 3, - "languages": 1 - }, { "order": 495, - "name": "tekatoki", + "name": "tonywarcode", "count": 3, "languages": 1 }, { "order": 496, - "name": "dchevesich", + "name": "tekatoki", "count": 3, "languages": 1 }, { "order": 497, - "name": "guillesese", + "name": "dchevesich", "count": 3, "languages": 1 }, { "order": 498, - "name": "strooplab", + "name": "guillesese", "count": 3, "languages": 1 }, { "order": 499, - "name": "frostbitepy", + "name": "strooplab", "count": 3, "languages": 1 }, { "order": 500, - "name": "minn09", + "name": "frostbitepy", "count": 3, "languages": 1 }, { "order": 501, - "name": "bertolini-victor", + "name": "minn09", "count": 3, "languages": 1 }, { "order": 502, - "name": "notj0s3", + "name": "bertolini-victor", "count": 3, "languages": 1 }, { "order": 503, - "name": "joandevpy", + "name": "notj0s3", "count": 3, "languages": 1 }, { "order": 504, - "name": "jackziel-sumoza", + "name": "joandevpy", "count": 3, "languages": 1 }, { "order": 505, - "name": "danielperezrubio", + "name": "jackziel-sumoza", "count": 3, "languages": 1 }, { "order": 506, - "name": "artdugarte", + "name": "danielperezrubio", "count": 3, "languages": 1 }, { "order": 507, - "name": "oscarhub90", + "name": "artdugarte", "count": 3, "languages": 1 }, { "order": 508, - "name": "sandrogmz", + "name": "oscarhub90", "count": 3, "languages": 1 }, { "order": 509, - "name": "rgeditv1", + "name": "sandrogmz", "count": 3, "languages": 1 }, { "order": 510, - "name": "zzepu", + "name": "rgeditv1", "count": 3, "languages": 1 }, { "order": 511, - "name": "cevicheconaji", + "name": "zzepu", "count": 3, "languages": 1 }, { "order": 512, - "name": "ramon-almeida", + "name": "cevicheconaji", "count": 3, "languages": 1 }, { "order": 513, - "name": "monikgbar", + "name": "ramon-almeida", "count": 3, "languages": 1 }, { "order": 514, - "name": "jorgegarcia-dev", + "name": "monikgbar", "count": 3, "languages": 1 }, { "order": 515, - "name": "betzadev", + "name": "jorgegarcia-dev", "count": 3, "languages": 1 }, { "order": 516, - "name": "carlosalberto05", + "name": "betzadev", "count": 3, "languages": 1 }, { "order": 517, - "name": "dandrusco", + "name": "carlosalberto05", "count": 3, "languages": 1 }, { "order": 518, - "name": "13sauca13", + "name": "dandrusco", "count": 3, "languages": 1 }, { "order": 519, - "name": "mizadlogcia", + "name": "13sauca13", "count": 3, "languages": 1 }, { "order": 520, - "name": "mstaz4", + "name": "mizadlogcia", "count": 3, "languages": 1 }, { "order": 521, - "name": "antii16", + "name": "mstaz4", "count": 3, "languages": 1 }, { "order": 522, - "name": "jofedev", + "name": "antii16", "count": 3, "languages": 1 }, { "order": 523, - "name": "jhonmarin12", + "name": "jofedev", "count": 3, "languages": 1 }, { "order": 524, - "name": "yorjanvarela", + "name": "jhonmarin12", "count": 3, "languages": 1 }, @@ -4243,4674 +4243,4686 @@ }, { "order": 612, - "name": "rickmij", + "name": "rcellas", "count": 2, "languages": 2 }, { "order": 613, - "name": "angel-alvarez-dev", + "name": "rickmij", "count": 2, "languages": 2 }, { "order": 614, - "name": "elsanty08", + "name": "angel-alvarez-dev", "count": 2, "languages": 2 }, { "order": 615, - "name": "camiloforero1997", + "name": "elsanty08", "count": 2, "languages": 2 }, { "order": 616, - "name": "raul-progr", + "name": "camiloforero1997", "count": 2, "languages": 2 }, { "order": 617, - "name": "lemito66", + "name": "raul-progr", "count": 2, "languages": 2 }, { "order": 618, - "name": "jorgesilencio", + "name": "lemito66", "count": 2, "languages": 2 }, { "order": 619, - "name": "jmofuture", + "name": "jorgesilencio", "count": 2, "languages": 2 }, { "order": 620, - "name": "tecfer", + "name": "jmofuture", "count": 2, "languages": 2 }, { "order": 621, - "name": "lilberick", + "name": "tecfer", "count": 2, "languages": 2 }, { "order": 622, - "name": "chuanmi", + "name": "lilberick", "count": 2, "languages": 2 }, { "order": 623, - "name": "carresoft", + "name": "chuanmi", "count": 2, "languages": 2 }, { "order": 624, - "name": "felipedev303", + "name": "jaennova", "count": 2, "languages": 2 }, { "order": 625, - "name": "alejosor", + "name": "carresoft", "count": 2, "languages": 2 }, { "order": 626, - "name": "raghnus", + "name": "felipedev303", "count": 2, "languages": 2 }, { "order": 627, - "name": "berentolkien", + "name": "inmortalnight", "count": 2, "languages": 2 }, { "order": 628, - "name": "lydaf", + "name": "alejosor", "count": 2, "languages": 2 }, { "order": 629, - "name": "jrvdev", + "name": "raghnus", "count": 2, "languages": 2 }, { "order": 630, - "name": "jovany-java", + "name": "berentolkien", "count": 2, "languages": 2 }, { "order": 631, - "name": "alexsamboy", + "name": "lydaf", "count": 2, "languages": 2 }, { "order": 632, - "name": "nievesyonathan", + "name": "jrvdev", "count": 2, "languages": 2 }, { "order": 633, - "name": "akaidmaru", + "name": "jovany-java", "count": 2, "languages": 2 }, { "order": 634, - "name": "enrgarvic", + "name": "alexsamboy", "count": 2, "languages": 2 }, { "order": 635, - "name": "ismaelmatiz", + "name": "nievesyonathan", "count": 2, "languages": 2 }, { "order": 636, - "name": "devvdroid01", + "name": "akaidmaru", "count": 2, "languages": 2 }, { "order": 637, - "name": "sgb004", + "name": "enrgarvic", "count": 2, "languages": 2 }, { "order": 638, - "name": "jlcareglio", + "name": "ismaelmatiz", "count": 2, "languages": 2 }, { "order": 639, - "name": "jurgen-alfaro", + "name": "devvdroid01", "count": 2, "languages": 2 }, { "order": 640, - "name": "ddanone", + "name": "sgb004", "count": 2, "languages": 2 }, { "order": 641, - "name": "lordzzz777", + "name": "jlcareglio", "count": 2, - "languages": 1 + "languages": 2 }, { "order": 642, - "name": "armentaangel", + "name": "jurgen-alfaro", "count": 2, - "languages": 1 + "languages": 2 }, { "order": 643, - "name": "jmichael39", + "name": "ddanone", "count": 2, - "languages": 1 + "languages": 2 }, { "order": 644, - "name": "zonnen69", + "name": "lordzzz777", "count": 2, "languages": 1 }, { "order": 645, - "name": "roilhi", + "name": "armentaangel", "count": 2, "languages": 1 }, { "order": 646, - "name": "soyjosep", + "name": "jmichael39", "count": 2, "languages": 1 }, { "order": 647, - "name": "fernandoatello", + "name": "zonnen69", "count": 2, "languages": 1 }, { "order": 648, - "name": "jmontoyac", + "name": "roilhi", "count": 2, "languages": 1 }, { "order": 649, - "name": "fabianpa505", + "name": "soyjosep", "count": 2, "languages": 1 }, { "order": 650, - "name": "e-techgod", + "name": "fernandoatello", "count": 2, "languages": 1 }, { "order": 651, - "name": "christiancoc", + "name": "jmontoyac", "count": 2, "languages": 1 }, { "order": 652, - "name": "adogdev", + "name": "fabianpa505", "count": 2, "languages": 1 }, { "order": 653, - "name": "rojasricoo", + "name": "e-techgod", "count": 2, "languages": 1 }, { "order": 654, - "name": "dokeys28", + "name": "christiancoc", "count": 2, "languages": 1 }, { "order": 655, - "name": "aboredllama", + "name": "adogdev", "count": 2, "languages": 1 }, { "order": 656, - "name": "soydaviddev", + "name": "rojasricoo", "count": 2, "languages": 1 }, { "order": 657, - "name": "sofia-d-p", + "name": "dokeys28", "count": 2, "languages": 1 }, { "order": 658, - "name": "miguelberrio0810", + "name": "aboredllama", "count": 2, "languages": 1 }, { "order": 659, - "name": "nach012", + "name": "soydaviddev", "count": 2, "languages": 1 }, { "order": 660, - "name": "pablosalme", + "name": "sofia-d-p", "count": 2, "languages": 1 }, { "order": 661, - "name": "gregfc95", + "name": "miguelberrio0810", "count": 2, "languages": 1 }, { "order": 662, - "name": "adridlth", + "name": "nach012", "count": 2, "languages": 1 }, { "order": 663, - "name": "santiagodc8", + "name": "pablosalme", "count": 2, "languages": 1 }, { "order": 664, - "name": "alejandrovelasquezr", + "name": "gregfc95", "count": 2, "languages": 1 }, { "order": 665, - "name": "dariangl", + "name": "adridlth", "count": 2, "languages": 1 }, { "order": 666, - "name": "cipollalucas", + "name": "santiagodc8", "count": 2, "languages": 1 }, { "order": 667, - "name": "zeti1231", + "name": "alejandrovelasquezr", "count": 2, "languages": 1 }, { "order": 668, - "name": "gmigues", + "name": "dariangl", "count": 2, "languages": 1 }, { "order": 669, - "name": "victore16", + "name": "cipollalucas", "count": 2, "languages": 1 }, { "order": 670, - "name": "print-alan", + "name": "zeti1231", "count": 2, "languages": 1 }, { "order": 671, - "name": "noaregui", + "name": "gmigues", "count": 2, "languages": 1 }, { "order": 672, - "name": "dans182", + "name": "victore16", "count": 2, "languages": 1 }, { "order": 673, - "name": "vesubius", + "name": "print-alan", "count": 2, "languages": 1 }, { "order": 674, - "name": "freyfonseca", + "name": "noaregui", "count": 2, "languages": 1 }, { "order": 675, - "name": "ziellucio01", + "name": "dans182", "count": 2, "languages": 1 }, { "order": 676, - "name": "inf015", + "name": "vesubius", "count": 2, "languages": 1 }, { "order": 677, - "name": "juanseevn", + "name": "freyfonseca", "count": 2, "languages": 1 }, { "order": 678, - "name": "csaraugusto2", + "name": "ziellucio01", "count": 2, "languages": 1 }, { "order": 679, - "name": "pakomor", + "name": "inf015", "count": 2, "languages": 1 }, { "order": 680, - "name": "josephfaster", + "name": "juanseevn", "count": 2, "languages": 1 }, { "order": 681, - "name": "culebropalido", + "name": "csaraugusto2", "count": 2, "languages": 1 }, { "order": 682, - "name": "lauradiazm29", + "name": "pakomor", "count": 2, "languages": 1 }, { "order": 683, - "name": "lordaguakate", + "name": "josephfaster", "count": 2, "languages": 1 }, { "order": 684, - "name": "julind0", + "name": "culebropalido", "count": 2, "languages": 1 }, { "order": 685, - "name": "tashidian", + "name": "lauradiazm29", "count": 2, "languages": 1 }, { "order": 686, - "name": "tic4", + "name": "lordaguakate", "count": 2, "languages": 1 }, { "order": 687, - "name": "ignaciogm1973", + "name": "julind0", "count": 2, "languages": 1 }, { "order": 688, - "name": "s384", + "name": "tashidian", "count": 2, "languages": 1 }, { "order": 689, - "name": "varoblanco", + "name": "tic4", "count": 2, "languages": 1 }, { "order": 690, - "name": "josue-py", + "name": "ignaciogm1973", "count": 2, "languages": 1 }, { "order": 691, - "name": "pedrojog", + "name": "s384", "count": 2, "languages": 1 }, { "order": 692, - "name": "oscardrd", + "name": "varoblanco", "count": 2, "languages": 1 }, { "order": 693, - "name": "baauus", + "name": "josue-py", "count": 2, "languages": 1 }, { "order": 694, - "name": "zalazarmartin", + "name": "pedrojog", "count": 2, "languages": 1 }, { "order": 695, - "name": "fjsubero", + "name": "oscardrd", "count": 2, "languages": 1 }, { "order": 696, - "name": "eriickm", + "name": "baauus", "count": 2, "languages": 1 }, { "order": 697, - "name": "dota43ver", + "name": "zalazarmartin", "count": 2, "languages": 1 }, { "order": 698, - "name": "nevaito", + "name": "fjsubero", "count": 2, "languages": 1 }, { "order": 699, - "name": "carlosmarte23", + "name": "eriickm", "count": 2, "languages": 1 }, { "order": 700, - "name": "aegpgrafologo", + "name": "dota43ver", "count": 2, "languages": 1 }, { "order": 701, - "name": "alejandro-mantilla", + "name": "nevaito", "count": 2, "languages": 1 }, { "order": 702, - "name": "kcx46", + "name": "carlosmarte23", "count": 2, "languages": 1 }, { "order": 703, - "name": "slaughtbear", + "name": "aegpgrafologo", "count": 2, "languages": 1 }, { "order": 704, - "name": "jsacristanbeltri", + "name": "alejandro-mantilla", "count": 2, "languages": 1 }, { "order": 705, - "name": "nachodev7", + "name": "kcx46", "count": 2, "languages": 1 }, { "order": 706, - "name": "soydianaibarra", + "name": "slaughtbear", "count": 2, "languages": 1 }, { "order": 707, - "name": "anblackter", + "name": "jsacristanbeltri", "count": 2, "languages": 1 }, { "order": 708, - "name": "josegago27", + "name": "nachodev7", "count": 2, "languages": 1 }, { "order": 709, - "name": "steven9708m", + "name": "soydianaibarra", "count": 2, "languages": 1 }, { "order": 710, - "name": "cristiansystem", + "name": "anblackter", "count": 2, "languages": 1 }, { "order": 711, - "name": "evelynnobile", + "name": "josegago27", "count": 2, "languages": 1 }, { "order": 712, - "name": "johannhsdev", + "name": "steven9708m", "count": 2, "languages": 1 }, { "order": 713, - "name": "samuel20-dev", + "name": "cristiansystem", "count": 2, "languages": 1 }, { "order": 714, - "name": "jago86", + "name": "evelynnobile", "count": 2, "languages": 1 }, { "order": 715, - "name": "maussho", + "name": "johannhsdev", "count": 2, "languages": 1 }, { "order": 716, - "name": "lorenamesa", + "name": "samuel20-dev", "count": 2, "languages": 1 }, { "order": 717, - "name": "reanthonyh", + "name": "jago86", "count": 2, "languages": 1 }, { "order": 718, - "name": "porto1090", + "name": "maussho", "count": 2, "languages": 1 }, { "order": 719, - "name": "whiterunjarl", + "name": "lorenamesa", "count": 2, "languages": 1 }, { "order": 720, - "name": "0pio", + "name": "reanthonyh", "count": 2, "languages": 1 }, { "order": 721, - "name": "dotero-dciencia", + "name": "porto1090", "count": 2, "languages": 1 }, { "order": 722, - "name": "peeanoot", + "name": "whiterunjarl", "count": 2, "languages": 1 }, { "order": 723, - "name": "marioyellowy", + "name": "0pio", "count": 2, "languages": 1 }, { "order": 724, - "name": "yowcloud", + "name": "dotero-dciencia", "count": 2, "languages": 1 }, { "order": 725, - "name": "hersac", + "name": "peeanoot", "count": 2, "languages": 1 }, { "order": 726, - "name": "julianjra", + "name": "marioyellowy", "count": 2, "languages": 1 }, { "order": 727, - "name": "ariaslopez", + "name": "yowcloud", "count": 2, "languages": 1 }, { "order": 728, - "name": "victorpolo28", + "name": "hersac", "count": 2, "languages": 1 }, { "order": 729, - "name": "rumacar05", + "name": "julianjra", "count": 2, "languages": 1 }, { "order": 730, - "name": "zemanue", + "name": "ariaslopez", "count": 2, "languages": 1 }, { "order": 731, - "name": "arhl2023", + "name": "victorpolo28", "count": 2, "languages": 1 }, { "order": 732, - "name": "isidrojng", + "name": "rumacar05", "count": 2, "languages": 1 }, { "order": 733, - "name": "coronelsam", + "name": "zemanue", "count": 2, "languages": 1 }, { "order": 734, - "name": "jcknot", + "name": "arhl2023", "count": 2, "languages": 1 }, { "order": 735, - "name": "anaroncero", + "name": "isidrojng", "count": 2, "languages": 1 }, { "order": 736, - "name": "nahuelborromeo", + "name": "coronelsam", "count": 2, "languages": 1 }, { "order": 737, - "name": "peibolstrike", + "name": "jcknot", "count": 2, "languages": 1 }, { "order": 738, - "name": "fsfigueroa77", + "name": "anaroncero", "count": 2, "languages": 1 }, { "order": 739, - "name": "fefestuve", + "name": "nahuelborromeo", "count": 2, "languages": 1 }, { "order": 740, - "name": "protpus98", + "name": "peibolstrike", "count": 2, "languages": 1 }, { "order": 741, - "name": "freddyasierraj", + "name": "fsfigueroa77", "count": 2, "languages": 1 }, { "order": 742, - "name": "nicolastapiasanz", + "name": "fefestuve", "count": 2, "languages": 1 }, { "order": 743, - "name": "gomezcamilo9701", + "name": "protpus98", "count": 2, "languages": 1 }, { "order": 744, - "name": "lordibzn", + "name": "freddyasierraj", "count": 2, "languages": 1 }, { "order": 745, - "name": "vicgallego", + "name": "nicolastapiasanz", "count": 2, "languages": 1 }, { "order": 746, - "name": "lestaat", + "name": "hazartd", "count": 2, "languages": 1 }, { "order": 747, - "name": "diegokarabin", + "name": "gomezcamilo9701", "count": 2, "languages": 1 }, { "order": 748, - "name": "gugliio", + "name": "lordibzn", "count": 2, "languages": 1 }, { "order": 749, - "name": "elpeque29", + "name": "vicgallego", "count": 2, "languages": 1 }, { "order": 750, - "name": "juaruibr", + "name": "lestaat", "count": 2, "languages": 1 }, { "order": 751, - "name": "vikkanh", + "name": "diegokarabin", "count": 2, "languages": 1 }, { "order": 752, - "name": "crisdev3", + "name": "gugliio", "count": 2, "languages": 1 }, { "order": 753, - "name": "saracorraless", + "name": "elpeque29", "count": 2, "languages": 1 }, { "order": 754, - "name": "frealexandro", + "name": "juaruibr", "count": 2, "languages": 1 }, { "order": 755, - "name": "gamitocu", + "name": "vikkanh", "count": 2, "languages": 1 }, { "order": 756, - "name": "barbarasg92", + "name": "crisdev3", "count": 2, "languages": 1 }, { "order": 757, - "name": "dararod", + "name": "saracorraless", "count": 2, "languages": 1 }, { "order": 758, - "name": "navarroemiliano", + "name": "frealexandro", "count": 2, "languages": 1 }, { "order": 759, - "name": "waldid32", + "name": "gamitocu", "count": 2, "languages": 1 }, { "order": 760, - "name": "jeisonredondo", + "name": "barbarasg92", "count": 2, "languages": 1 }, { "order": 761, - "name": "rolo27s", + "name": "dararod", "count": 2, "languages": 1 }, { "order": 762, - "name": "murquisdev", + "name": "navarroemiliano", "count": 2, "languages": 1 }, { "order": 763, - "name": "jhonf1992", + "name": "waldid32", "count": 2, "languages": 1 }, { "order": 764, - "name": "haryblanco20", + "name": "jeisonredondo", "count": 2, "languages": 1 }, { "order": 765, - "name": "valeriatorrealba", + "name": "rolo27s", "count": 2, "languages": 1 }, { "order": 766, - "name": "alanox1", + "name": "murquisdev", "count": 2, "languages": 1 }, { "order": 767, - "name": "juangomezn", + "name": "jhonf1992", "count": 2, "languages": 1 }, { "order": 768, - "name": "memogv", + "name": "haryblanco20", "count": 2, "languages": 1 }, { "order": 769, - "name": "akzorla", + "name": "valeriatorrealba", "count": 2, "languages": 1 }, { "order": 770, - "name": "doblea74", + "name": "alanox1", "count": 2, "languages": 1 }, { "order": 771, - "name": "miguelrejon96", + "name": "juangomezn", "count": 2, "languages": 1 }, { "order": 772, - "name": "leonardo291024", + "name": "memogv", "count": 2, "languages": 1 }, { "order": 773, - "name": "mickel-arroz", + "name": "akzorla", "count": 2, "languages": 1 }, { "order": 774, - "name": "ovjohn", + "name": "doblea74", "count": 2, "languages": 1 }, { "order": 775, - "name": "jaimemunozdev", + "name": "miguelrejon96", "count": 2, "languages": 1 }, { "order": 776, - "name": "christianumb", + "name": "leonardo291024", "count": 2, "languages": 1 }, { "order": 777, - "name": "franciscocuminilondero", + "name": "mickel-arroz", "count": 2, "languages": 1 }, { "order": 778, - "name": "davhage", + "name": "ovjohn", "count": 2, "languages": 1 }, { "order": 779, - "name": "gianbordon", + "name": "jaimemunozdev", "count": 2, "languages": 1 }, { "order": 780, - "name": "k4rv3r", + "name": "christianumb", "count": 2, "languages": 1 }, { "order": 781, - "name": "esdras-josue", + "name": "franciscocuminilondero", "count": 2, "languages": 1 }, { "order": 782, - "name": "tomasmarquez81", + "name": "davhage", "count": 2, "languages": 1 }, { "order": 783, - "name": "christianhernandezb", + "name": "gianbordon", "count": 2, "languages": 1 }, { "order": 784, - "name": "cesarocbu", + "name": "k4rv3r", "count": 2, "languages": 1 }, { "order": 785, - "name": "cpcarlosprieto", + "name": "rlores-edison", "count": 2, "languages": 1 }, { "order": 786, - "name": "dhbellini", + "name": "esdras-josue", "count": 2, "languages": 1 }, { "order": 787, - "name": "soldochris", + "name": "tomasmarquez81", "count": 2, "languages": 1 }, { "order": 788, - "name": "wesborland-github", + "name": "christianhernandezb", "count": 2, "languages": 1 }, { "order": 789, - "name": "erikayeah", + "name": "cesarocbu", "count": 2, "languages": 1 }, { "order": 790, - "name": "angelvelasco1", + "name": "cpcarlosprieto", "count": 2, "languages": 1 }, { "order": 791, - "name": "aleoe01", + "name": "dhbellini", "count": 2, "languages": 1 }, { "order": 792, - "name": "pogo182028", + "name": "soldochris", "count": 2, "languages": 1 }, { "order": 793, - "name": "rikar2o", + "name": "wesborland-github", "count": 2, "languages": 1 }, { "order": 794, - "name": "mbbellini", + "name": "erikayeah", "count": 2, "languages": 1 }, { "order": 795, - "name": "farthaz", + "name": "angelvelasco1", "count": 2, "languages": 1 }, { "order": 796, - "name": "matiasfarfan89", + "name": "aleoe01", "count": 2, "languages": 1 }, { "order": 797, - "name": "jorge186414", + "name": "pogo182028", "count": 2, "languages": 1 }, { "order": 798, - "name": "santiagocuevas2003", + "name": "rikar2o", "count": 2, "languages": 1 }, { "order": 799, - "name": "andnikdev", + "name": "mbbellini", "count": 2, "languages": 1 }, { "order": 800, - "name": "glaboryp", + "name": "farthaz", "count": 2, "languages": 1 }, { "order": 801, - "name": "nxl22", + "name": "matiasfarfan89", "count": 2, "languages": 1 }, { "order": 802, - "name": "lmedina96", + "name": "jorge186414", "count": 2, "languages": 1 }, { "order": 803, - "name": "rrcoder", + "name": "santiagocuevas2003", "count": 2, "languages": 1 }, { "order": 804, - "name": "raulallue", + "name": "andnikdev", "count": 2, "languages": 1 }, { "order": 805, - "name": "frannmv", + "name": "glaboryp", "count": 2, "languages": 1 }, { "order": 806, - "name": "sdm29gh", + "name": "nxl22", "count": 2, "languages": 1 }, { "order": 807, - "name": "nandaalf", + "name": "lmedina96", "count": 2, "languages": 1 }, { "order": 808, - "name": "bereverte", + "name": "rrcoder", "count": 2, "languages": 1 }, { "order": 809, - "name": "deivisaherreraj", + "name": "raulallue", "count": 2, "languages": 1 }, { "order": 810, - "name": "angelargumedo", + "name": "frannmv", "count": 2, "languages": 1 }, { "order": 811, - "name": "vdroiid", + "name": "sdm29gh", "count": 2, "languages": 1 }, { "order": 812, - "name": "luciarf", + "name": "nandaalf", "count": 2, "languages": 1 }, { "order": 813, - "name": "aserranot", + "name": "bereverte", "count": 2, "languages": 1 }, { "order": 814, - "name": "elmarqueli", + "name": "deivisaherreraj", "count": 2, "languages": 1 }, { "order": 815, - "name": "hawkbott", + "name": "angelargumedo", "count": 2, "languages": 1 }, { "order": 816, - "name": "tiaguiito3", + "name": "vdroiid", "count": 2, "languages": 1 }, { "order": 817, - "name": "rikar20", + "name": "luciarf", "count": 2, "languages": 1 }, { "order": 818, - "name": "poetry0354", + "name": "aserranot", "count": 2, "languages": 1 }, { "order": 819, - "name": "reaien", + "name": "elmarqueli", "count": 2, "languages": 1 }, { "order": 820, - "name": "vecinacoo", + "name": "hawkbott", "count": 2, "languages": 1 }, { "order": 821, - "name": "lioarce01", + "name": "tiaguiito3", "count": 2, "languages": 1 }, { "order": 822, - "name": "diegosilval", + "name": "rikar20", "count": 2, "languages": 1 }, { "order": 823, - "name": "emersonxinay", - "count": 1, + "name": "poetry0354", + "count": 2, "languages": 1 }, { "order": 824, - "name": "davidbastosg", - "count": 1, + "name": "reaien", + "count": 2, "languages": 1 }, { "order": 825, - "name": "matinbohorquez", - "count": 1, + "name": "vecinacoo", + "count": 2, "languages": 1 }, { "order": 826, - "name": "franespina", - "count": 1, + "name": "lioarce01", + "count": 2, "languages": 1 }, { "order": 827, - "name": "lesclaz", - "count": 1, + "name": "diegosilval", + "count": 2, "languages": 1 }, { "order": 828, - "name": "giovannipeirone", + "name": "emersonxinay", "count": 1, "languages": 1 }, { "order": 829, - "name": "angelramirez02", + "name": "davidbastosg", "count": 1, "languages": 1 }, { "order": 830, - "name": "whiterbb", + "name": "matinbohorquez", "count": 1, "languages": 1 }, { "order": 831, - "name": "adridiazz", + "name": "franespina", "count": 1, "languages": 1 }, { "order": 832, - "name": "jesus2421", + "name": "lesclaz", "count": 1, "languages": 1 }, { "order": 833, - "name": "euu92", + "name": "giovannipeirone", "count": 1, "languages": 1 }, { "order": 834, - "name": "dfc201692", + "name": "angelramirez02", "count": 1, "languages": 1 }, { "order": 835, - "name": "astrarothdlcxvi", + "name": "whiterbb", "count": 1, "languages": 1 }, { "order": 836, - "name": "melonconyogurt", + "name": "adridiazz", "count": 1, "languages": 1 }, { "order": 837, - "name": "h4cker54n", + "name": "jesus2421", "count": 1, "languages": 1 }, { "order": 838, - "name": "batmarc91", + "name": "euu92", "count": 1, "languages": 1 }, { "order": 839, - "name": "joancharles07", + "name": "dfc201692", "count": 1, "languages": 1 }, { "order": 840, - "name": "angel-agis", + "name": "astrarothdlcxvi", "count": 1, "languages": 1 }, { "order": 841, - "name": "cuervo23alpha", + "name": "melonconyogurt", "count": 1, "languages": 1 }, { "order": 842, - "name": "mauricioobgo", + "name": "h4cker54n", "count": 1, "languages": 1 }, { "order": 843, - "name": "ingjavierpinilla", + "name": "batmarc91", "count": 1, "languages": 1 }, { "order": 844, - "name": "derobpe", + "name": "joancharles07", "count": 1, "languages": 1 }, { "order": 845, - "name": "lordzzz", + "name": "angel-agis", "count": 1, "languages": 1 }, { "order": 846, - "name": "alinares94", + "name": "cuervo23alpha", "count": 1, "languages": 1 }, { "order": 847, - "name": "jferchotorres", + "name": "mauricioobgo", "count": 1, "languages": 1 }, { "order": 848, - "name": "713avo", + "name": "ingjavierpinilla", "count": 1, "languages": 1 }, { "order": 849, - "name": "micendev", + "name": "derobpe", "count": 1, "languages": 1 }, { "order": 850, - "name": "rusian69", + "name": "lordzzz", "count": 1, "languages": 1 }, { "order": 851, - "name": "riukac", + "name": "alinares94", "count": 1, "languages": 1 }, { "order": 852, - "name": "rafapg93", + "name": "jferchotorres", "count": 1, "languages": 1 }, { "order": 853, - "name": "wijimenezz", + "name": "713avo", "count": 1, "languages": 1 }, { "order": 854, - "name": "vickalc", + "name": "micendev", "count": 1, "languages": 1 }, { "order": 855, - "name": "nicoloboo02", + "name": "rusian69", "count": 1, "languages": 1 }, { "order": 856, - "name": "righelch", + "name": "riukac", "count": 1, "languages": 1 }, { "order": 857, - "name": "deathbat00", + "name": "rafapg93", "count": 1, "languages": 1 }, { "order": 858, - "name": "angeloro", + "name": "wijimenezz", "count": 1, "languages": 1 }, { "order": 859, - "name": "jony-english22", + "name": "vickalc", "count": 1, "languages": 1 }, { "order": 860, - "name": "markayala13", + "name": "nicoloboo02", "count": 1, "languages": 1 }, { "order": 861, - "name": "albertovf", + "name": "righelch", "count": 1, "languages": 1 }, { "order": 862, - "name": "sergiopq", + "name": "deathbat00", "count": 1, "languages": 1 }, { "order": 863, - "name": "rocha30", + "name": "angeloro", "count": 1, "languages": 1 }, { "order": 864, - "name": "marcosalvarezcalabria", + "name": "jony-english22", "count": 1, "languages": 1 }, { "order": 865, - "name": "orzefox", + "name": "markayala13", "count": 1, "languages": 1 }, { "order": 866, - "name": "acirdeveloper", + "name": "albertovf", "count": 1, "languages": 1 }, { "order": 867, - "name": "miguelangelmtz", + "name": "sergiopq", "count": 1, "languages": 1 }, { "order": 868, - "name": "emiliordev", + "name": "rocha30", "count": 1, "languages": 1 }, { "order": 869, - "name": "edgarmedranoa", + "name": "marcosalvarezcalabria", "count": 1, "languages": 1 }, { "order": 870, - "name": "sve-nnn", + "name": "orzefox", "count": 1, "languages": 1 }, { "order": 871, - "name": "alecraft8", + "name": "acirdeveloper", "count": 1, "languages": 1 }, { "order": 872, - "name": "arperezinf", + "name": "miguelangelmtz", "count": 1, "languages": 1 }, { "order": 873, - "name": "ddaniel27", + "name": "emiliordev", "count": 1, "languages": 1 }, { "order": 874, - "name": "jjaljuria", + "name": "edgarmedranoa", "count": 1, "languages": 1 }, { "order": 875, - "name": "girngoma", + "name": "sve-nnn", "count": 1, "languages": 1 }, { "order": 876, - "name": "juampaweb", + "name": "alecraft8", "count": 1, "languages": 1 }, { "order": 877, - "name": "qwik-zghieb", + "name": "arperezinf", "count": 1, "languages": 1 }, { "order": 878, - "name": "willypaz243", + "name": "ddaniel27", "count": 1, "languages": 1 }, { "order": 879, - "name": "ouendinga", + "name": "jjaljuria", "count": 1, "languages": 1 }, { "order": 880, - "name": "jetiradoro", + "name": "girngoma", "count": 1, "languages": 1 }, { "order": 881, - "name": "bellodeveloper", + "name": "juampaweb", "count": 1, "languages": 1 }, { "order": 882, - "name": "nachitoe", + "name": "qwik-zghieb", "count": 1, "languages": 1 }, { "order": 883, - "name": "greenalpak", + "name": "willypaz243", "count": 1, "languages": 1 }, { "order": 884, - "name": "alfaroo1", + "name": "ouendinga", "count": 1, "languages": 1 }, { "order": 885, - "name": "kerunaru", + "name": "jetiradoro", "count": 1, "languages": 1 }, { "order": 886, - "name": "rcellas", + "name": "bellodeveloper", + "count": 1, + "languages": 1 + }, + { + "order": 887, + "name": "nachitoe", + "count": 1, + "languages": 1 + }, + { + "order": 888, + "name": "greenalpak", + "count": 1, + "languages": 1 + }, + { + "order": 889, + "name": "alfaroo1", + "count": 1, + "languages": 1 + }, + { + "order": 890, + "name": "kerunaru", "count": 1, "languages": 1 }, { - "order": 887, + "order": 891, "name": "anitandil", "count": 1, "languages": 1 }, { - "order": 888, + "order": 892, "name": "miguel2rar", "count": 1, "languages": 1 }, { - "order": 889, + "order": 893, "name": "miquelrr", "count": 1, "languages": 1 }, { - "order": 890, + "order": 894, "name": "francomyburg", "count": 1, "languages": 1 }, { - "order": 891, + "order": 895, "name": "agustinfccll", "count": 1, "languages": 1 }, { - "order": 892, + "order": 896, "name": "gabriel-dangelo", "count": 1, "languages": 1 }, { - "order": 893, + "order": 897, "name": "neicervb", "count": 1, "languages": 1 }, { - "order": 894, + "order": 898, "name": "eamartin", "count": 1, "languages": 1 }, { - "order": 895, + "order": 899, "name": "evilpodato04", "count": 1, "languages": 1 }, { - "order": 896, + "order": 900, "name": "josephinoo", "count": 1, "languages": 1 }, { - "order": 897, + "order": 901, "name": "antroc", "count": 1, "languages": 1 }, { - "order": 898, + "order": 902, "name": "almartinez", "count": 1, "languages": 1 }, { - "order": 899, + "order": 903, "name": "vorosdev", "count": 1, "languages": 1 }, { - "order": 900, + "order": 904, "name": "luisgarm", "count": 1, "languages": 1 }, { - "order": 901, + "order": 905, "name": "santiagomac", "count": 1, "languages": 1 }, { - "order": 902, + "order": 906, "name": "pipeyz21", "count": 1, "languages": 1 }, { - "order": 903, + "order": 907, "name": "tetotille", "count": 1, "languages": 1 }, { - "order": 904, + "order": 908, "name": "armm77", "count": 1, "languages": 1 }, { - "order": 905, + "order": 909, "name": "bjchavez", "count": 1, "languages": 1 }, { - "order": 906, + "order": 910, "name": "jandresalvar", "count": 1, "languages": 1 }, { - "order": 907, + "order": 911, "name": "joferpg", "count": 1, "languages": 1 }, { - "order": 908, + "order": 912, "name": "xtinarita", "count": 1, "languages": 1 }, { - "order": 909, + "order": 913, "name": "luisfglondono", "count": 1, "languages": 1 }, { - "order": 910, + "order": 914, "name": "erickcis", "count": 1, "languages": 1 }, { - "order": 911, + "order": 915, "name": "nico70012", "count": 1, "languages": 1 }, { - "order": 912, + "order": 916, "name": "miguelmancebo", "count": 1, "languages": 1 }, { - "order": 913, + "order": 917, "name": "adcarret", "count": 1, "languages": 1 }, { - "order": 914, + "order": 918, "name": "pepitoladino", "count": 1, "languages": 1 }, { - "order": 915, + "order": 919, "name": "wallsified", "count": 1, "languages": 1 }, { - "order": 916, + "order": 920, "name": "betulioo", "count": 1, "languages": 1 }, { - "order": 917, + "order": 921, "name": "neyan52", "count": 1, "languages": 1 }, { - "order": 918, + "order": 922, "name": "pedroomar23 2", "count": 1, "languages": 1 }, { - "order": 919, + "order": 923, "name": "dimanu-py", "count": 1, "languages": 1 }, { - "order": 920, + "order": 924, "name": "snowcardenas", "count": 1, "languages": 1 }, { - "order": 921, + "order": 925, "name": "fergz1988", "count": 1, "languages": 1 }, { - "order": 922, + "order": 926, "name": "perla-zg", "count": 1, "languages": 1 }, { - "order": 923, + "order": 927, "name": "xhinto", "count": 1, "languages": 1 }, { - "order": 924, + "order": 928, "name": "e-xtian", "count": 1, "languages": 1 }, { - "order": 925, + "order": 929, "name": "ambrociojrdelacruz", "count": 1, "languages": 1 }, { - "order": 926, + "order": 930, "name": "marcelinoarias369", "count": 1, "languages": 1 }, { - "order": 927, + "order": 931, "name": "ndepaul82", "count": 1, "languages": 1 }, { - "order": 928, + "order": 932, "name": "devjerez", "count": 1, "languages": 1 }, { - "order": 929, + "order": 933, "name": "franmux01", "count": 1, "languages": 1 }, { - "order": 930, + "order": 934, "name": "mjordanaam", "count": 1, "languages": 1 }, { - "order": 931, + "order": 935, "name": "sergiomhernandez", "count": 1, "languages": 1 }, { - "order": 932, + "order": 936, "name": "eddyelx", "count": 1, "languages": 1 }, { - "order": 933, + "order": 937, "name": "ale_cervi", "count": 1, "languages": 1 }, { - "order": 934, + "order": 938, "name": "idiegorojas", "count": 1, "languages": 1 }, { - "order": 935, + "order": 939, "name": "danidan1214", "count": 1, "languages": 1 }, { - "order": 936, + "order": 940, "name": "luisangeles20", "count": 1, "languages": 1 }, { - "order": 937, + "order": 941, "name": "trosky-wolf", "count": 1, "languages": 1 }, { - "order": 938, + "order": 942, "name": "xcortes", "count": 1, "languages": 1 }, { - "order": 939, + "order": 943, "name": "francgci", "count": 1, "languages": 1 }, { - "order": 940, + "order": 944, "name": "arturodlapaz17", "count": 1, "languages": 1 }, { - "order": 941, + "order": 945, "name": "adamtormer", "count": 1, "languages": 1 }, { - "order": 942, + "order": 946, "name": "sherkla12e", "count": 1, "languages": 1 }, { - "order": 943, + "order": 947, "name": "neftalyr", "count": 1, "languages": 1 }, { - "order": 944, + "order": 948, "name": "johannmanrique", "count": 1, "languages": 1 }, { - "order": 945, + "order": 949, "name": "obed-tc", "count": 1, "languages": 1 }, { - "order": 946, + "order": 950, "name": "chrispro-afk", "count": 1, "languages": 1 }, { - "order": 947, + "order": 951, "name": "gl-informatica", "count": 1, "languages": 1 }, { - "order": 948, + "order": 952, "name": "gersonoroz", "count": 1, "languages": 1 }, { - "order": 949, + "order": 953, "name": "demegorash", "count": 1, "languages": 1 }, { - "order": 950, + "order": 954, "name": "lioomx", "count": 1, "languages": 1 }, { - "order": 951, + "order": 955, "name": "chema-dw", "count": 1, "languages": 1 }, { - "order": 952, + "order": 956, "name": "vicvilla30", "count": 1, "languages": 1 }, { - "order": 953, + "order": 957, "name": "omar8102", "count": 1, "languages": 1 }, { - "order": 954, + "order": 958, "name": "anexo01", "count": 1, "languages": 1 }, { - "order": 955, + "order": 959, "name": "sbngl", "count": 1, "languages": 1 }, { - "order": 956, + "order": 960, "name": "vickalck", "count": 1, "languages": 1 }, { - "order": 957, + "order": 961, "name": "osneidert", "count": 1, "languages": 1 }, { - "order": 958, + "order": 962, "name": "andres-54-coder", "count": 1, "languages": 1 }, { - "order": 959, + "order": 963, "name": "testiman-78", "count": 1, "languages": 1 }, { - "order": 960, + "order": 964, "name": "diegogomezcor4", "count": 1, "languages": 1 }, { - "order": 961, + "order": 965, "name": "carlostoledoe", "count": 1, "languages": 1 }, { - "order": 962, + "order": 966, "name": "adry2024salt", "count": 1, "languages": 1 }, { - "order": 963, + "order": 967, "name": "lisandroarnodo", "count": 1, "languages": 1 }, { - "order": 964, + "order": 968, "name": "isaacdci", "count": 1, "languages": 1 }, { - "order": 965, + "order": 969, "name": "juanalbornoz32", "count": 1, "languages": 1 }, { - "order": 966, + "order": 970, "name": "cris10026", "count": 1, "languages": 1 }, { - "order": 967, + "order": 971, "name": "devkenn", "count": 1, "languages": 1 }, { - "order": 968, + "order": 972, "name": "henrydavidprimera", "count": 1, "languages": 1 }, { - "order": 969, + "order": 973, "name": "luceldasilva", "count": 1, "languages": 1 }, { - "order": 970, + "order": 974, "name": "mamartinez14", "count": 1, "languages": 1 }, { - "order": 971, + "order": 975, "name": "javirr4", "count": 1, "languages": 1 }, { - "order": 972, + "order": 976, "name": "copamire", "count": 1, "languages": 1 }, { - "order": 973, + "order": 977, "name": "krisipo", "count": 1, "languages": 1 }, { - "order": 974, + "order": 978, "name": "theewiick", "count": 1, "languages": 1 }, { - "order": 975, + "order": 979, "name": "miguelangel861", "count": 1, "languages": 1 }, { - "order": 976, + "order": 980, "name": "geridage", "count": 1, "languages": 1 }, { - "order": 977, + "order": 981, "name": "kshields51", "count": 1, "languages": 1 }, { - "order": 978, + "order": 982, "name": "m4xxdev", "count": 1, "languages": 1 }, { - "order": 979, + "order": 983, "name": "snowale", "count": 1, "languages": 1 }, { - "order": 980, + "order": 984, "name": "cristianvergaraf", "count": 1, "languages": 1 }, { - "order": 981, + "order": 985, "name": "jansua", "count": 1, "languages": 1 }, { - "order": 982, + "order": 986, "name": "hnaranjog", "count": 1, "languages": 1 }, { - "order": 983, + "order": 987, "name": "sergiovelayos", "count": 1, "languages": 1 }, { - "order": 984, + "order": 988, "name": "pepemn23", "count": 1, "languages": 1 }, { - "order": 985, + "order": 989, "name": "giovanni-schmaily", "count": 1, "languages": 1 }, { - "order": 986, + "order": 990, "name": "cd1974", "count": 1, "languages": 1 }, { - "order": 987, + "order": 991, "name": "turudev1979", "count": 1, "languages": 1 }, { - "order": 988, + "order": 992, "name": "kkstrofico", "count": 1, "languages": 1 }, { - "order": 989, + "order": 993, "name": "jrgranadosb", "count": 1, "languages": 1 }, { - "order": 990, + "order": 994, "name": "leo18q", "count": 1, "languages": 1 }, { - "order": 991, + "order": 995, + "name": "santifer26", + "count": 1, + "languages": 1 + }, + { + "order": 996, "name": "xalejandrow", "count": 1, "languages": 1 }, { - "order": 992, + "order": 997, "name": "kronoscba", "count": 1, "languages": 1 }, { - "order": 993, + "order": 998, "name": "latorredev", "count": 1, "languages": 1 }, { - "order": 994, + "order": 999, "name": "and-y21", "count": 1, "languages": 1 }, { - "order": 995, + "order": 1000, "name": "johao23", "count": 1, "languages": 1 }, { - "order": 996, + "order": 1001, "name": "jalonso76", "count": 1, "languages": 1 }, { - "order": 997, + "order": 1002, "name": "bassalex27", "count": 1, "languages": 1 }, { - "order": 998, + "order": 1003, "name": "v0l0v", "count": 1, "languages": 1 }, { - "order": 999, + "order": 1004, "name": "cesar-rosado", "count": 1, "languages": 1 }, { - "order": 1000, + "order": 1005, "name": "rodrigolopez25", "count": 1, "languages": 1 }, { - "order": 1001, + "order": 1006, "name": "carlosbb70", "count": 1, "languages": 1 }, { - "order": 1002, + "order": 1007, "name": "marcos0803", "count": 1, "languages": 1 }, { - "order": 1003, + "order": 1008, "name": "eatsangels", "count": 1, "languages": 1 }, { - "order": 1004, + "order": 1009, "name": "luiscalle17", "count": 1, "languages": 1 }, { - "order": 1005, + "order": 1010, "name": "leanaren", "count": 1, "languages": 1 }, { - "order": 1006, + "order": 1011, "name": "neusier101", "count": 1, "languages": 1 }, { - "order": 1007, + "order": 1012, "name": "manuu42", "count": 1, "languages": 1 }, { - "order": 1008, + "order": 1013, "name": "ingothik", "count": 1, "languages": 1 }, { - "order": 1009, + "order": 1014, "name": "dacaldev", "count": 1, "languages": 1 }, { - "order": 1010, + "order": 1015, "name": "90dread", "count": 1, "languages": 1 }, { - "order": 1011, + "order": 1016, "name": "wilsonbarrera", "count": 1, "languages": 1 }, { - "order": 1012, + "order": 1017, "name": "deivimiller", "count": 1, "languages": 1 }, { - "order": 1013, + "order": 1018, "name": "jereaguilar", "count": 1, "languages": 1 }, { - "order": 1014, + "order": 1019, "name": "aritapia19", "count": 1, "languages": 1 }, { - "order": 1015, + "order": 1020, "name": "manueldes27", "count": 1, "languages": 1 }, { - "order": 1016, + "order": 1021, "name": "g4nd4lf", "count": 1, "languages": 1 }, { - "order": 1017, + "order": 1022, "name": "joamgreen", "count": 1, "languages": 1 }, { - "order": 1018, + "order": 1023, "name": "mrf1989", "count": 1, "languages": 1 }, { - "order": 1019, + "order": 1024, "name": "javidp01", "count": 1, "languages": 1 }, { - "order": 1020, + "order": 1025, "name": "josuelopez5", "count": 1, "languages": 1 }, { - "order": 1021, + "order": 1026, "name": "lizzymaken", "count": 1, "languages": 1 }, { - "order": 1022, + "order": 1027, "name": "amitchellg", "count": 1, "languages": 1 }, { - "order": 1023, + "order": 1028, "name": "gmedinat911", "count": 1, "languages": 1 }, { - "order": 1024, + "order": 1029, "name": "emmanuelmmontesinos ", "count": 1, "languages": 1 }, { - "order": 1025, + "order": 1030, "name": "facundorsabia", "count": 1, "languages": 1 }, { - "order": 1026, + "order": 1031, "name": "judithernandez", "count": 1, "languages": 1 }, { - "order": 1027, + "order": 1032, "name": "oxtornado", "count": 1, "languages": 1 }, { - "order": 1028, + "order": 1033, "name": "alejandro000", "count": 1, "languages": 1 }, { - "order": 1029, + "order": 1034, "name": "gilbertho502", "count": 1, "languages": 1 }, { - "order": 1030, + "order": 1035, "name": "salas89", "count": 1, "languages": 1 }, { - "order": 1031, + "order": 1036, "name": "jgregoris", "count": 1, "languages": 1 }, { - "order": 1032, + "order": 1037, "name": "jandortiz", "count": 1, "languages": 1 }, { - "order": 1033, + "order": 1038, "name": "natanaelzubiri", "count": 1, "languages": 1 }, { - "order": 1034, + "order": 1039, "name": "jchernandez87", "count": 1, "languages": 1 }, { - "order": 1035, + "order": 1040, "name": "cisneros2404", "count": 1, "languages": 1 }, { - "order": 1036, + "order": 1041, "name": "vmarialuzm", "count": 1, "languages": 1 }, { - "order": 1037, + "order": 1042, "name": "lilitr09", "count": 1, "languages": 1 }, { - "order": 1038, + "order": 1043, "name": "vsxr", "count": 1, "languages": 1 }, { - "order": 1039, + "order": 1044, "name": "pushodev", "count": 1, "languages": 1 }, { - "order": 1040, + "order": 1045, "name": "pablom-2015", "count": 1, "languages": 1 }, { - "order": 1041, + "order": 1046, "name": "josem17-cyber", "count": 1, "languages": 1 }, { - "order": 1042, + "order": 1047, "name": "yetlanezils", "count": 1, "languages": 1 }, { - "order": 1043, + "order": 1048, "name": "experthacker444", "count": 1, "languages": 1 }, { - "order": 1044, + "order": 1049, "name": "luxilith", "count": 1, "languages": 1 }, { - "order": 1045, + "order": 1050, "name": "decinx1", "count": 1, "languages": 1 }, { - "order": 1046, + "order": 1051, "name": "neshurtado", "count": 1, "languages": 1 }, { - "order": 1047, + "order": 1052, "name": "ferngpv", "count": 1, "languages": 1 }, { - "order": 1048, + "order": 1053, "name": "randy7394", "count": 1, "languages": 1 }, { - "order": 1049, + "order": 1054, "name": "pr1de-23", "count": 1, "languages": 1 }, { - "order": 1050, + "order": 1055, "name": "claudios1980", "count": 1, "languages": 1 }, { - "order": 1051, + "order": 1056, "name": "manueldenisdev", "count": 1, "languages": 1 }, { - "order": 1052, + "order": 1057, "name": "lluistech", "count": 1, "languages": 1 }, { - "order": 1053, + "order": 1058, "name": "walyfigueroa", "count": 1, "languages": 1 }, { - "order": 1054, + "order": 1059, "name": "jordanurzua", "count": 1, "languages": 1 }, { - "order": 1055, + "order": 1060, "name": "yamiyugi25", "count": 1, "languages": 1 }, { - "order": 1056, + "order": 1061, "name": "julioorozco05", "count": 1, "languages": 1 }, { - "order": 1057, + "order": 1062, "name": "jgarteag", "count": 1, "languages": 1 }, { - "order": 1058, + "order": 1063, "name": "juan-cruz01", "count": 1, "languages": 1 }, { - "order": 1059, + "order": 1064, "name": "jgcmurcia", "count": 1, "languages": 1 }, { - "order": 1060, + "order": 1065, "name": "acobo3", "count": 1, "languages": 1 }, { - "order": 1061, + "order": 1066, "name": "alejarandro", "count": 1, "languages": 1 }, { - "order": 1062, + "order": 1067, "name": "davidgramiro", "count": 1, "languages": 1 }, { - "order": 1063, + "order": 1068, "name": "dakkaj", "count": 1, "languages": 1 }, { - "order": 1064, + "order": 1069, "name": "sofiamfernandez", "count": 1, "languages": 1 }, { - "order": 1065, + "order": 1070, "name": "yeisongil", "count": 1, "languages": 1 }, { - "order": 1066, + "order": 1071, "name": "jafuma0320", "count": 1, "languages": 1 }, { - "order": 1067, + "order": 1072, "name": "howlett9999", "count": 1, "languages": 1 }, { - "order": 1068, + "order": 1073, "name": "ignacioskm", "count": 1, "languages": 1 }, { - "order": 1069, + "order": 1074, "name": "dgjuancho", "count": 1, "languages": 1 }, { - "order": 1070, + "order": 1075, "name": "eljavi0", "count": 1, "languages": 1 }, { - "order": 1071, + "order": 1076, "name": "charly024", "count": 1, "languages": 1 }, { - "order": 1072, + "order": 1077, "name": "rastaxico", "count": 1, "languages": 1 }, { - "order": 1073, + "order": 1078, "name": "pandawangt", "count": 1, "languages": 1 }, { - "order": 1074, + "order": 1079, "name": "zyodev1", "count": 1, "languages": 1 }, { - "order": 1075, + "order": 1080, "name": "juli-m4", "count": 1, "languages": 1 }, { - "order": 1076, + "order": 1081, "name": "masenace", "count": 1, "languages": 1 }, { - "order": 1077, + "order": 1082, "name": "zeraven09", "count": 1, "languages": 1 }, { - "order": 1078, + "order": 1083, "name": "kata-lg", "count": 1, "languages": 1 }, { - "order": 1079, + "order": 1084, "name": "van-02", "count": 1, "languages": 1 }, { - "order": 1080, + "order": 1085, "name": "x3mboy", "count": 1, "languages": 1 }, { - "order": 1081, + "order": 1086, "name": "ca2puntosv", "count": 1, "languages": 1 }, { - "order": 1082, + "order": 1087, "name": "franciscokarriere", "count": 1, "languages": 1 }, { - "order": 1083, + "order": 1088, "name": "franckdot", "count": 1, "languages": 1 }, { - "order": 1084, + "order": 1089, "name": "brunom-93", "count": 1, "languages": 1 }, { - "order": 1085, + "order": 1090, "name": "maurspi", "count": 1, "languages": 1 }, { - "order": 1086, + "order": 1091, "name": "trollface77", "count": 1, "languages": 1 }, { - "order": 1087, + "order": 1092, "name": "jhonnfl", "count": 1, "languages": 1 }, { - "order": 1088, + "order": 1093, "name": "zakeyo", "count": 1, "languages": 1 }, { - "order": 1089, + "order": 1094, "name": "jarzatedev", "count": 1, "languages": 1 }, { - "order": 1090, + "order": 1095, "name": "luisfcaro", "count": 1, "languages": 1 }, { - "order": 1091, + "order": 1096, "name": "edm1ya", "count": 1, "languages": 1 }, { - "order": 1092, + "order": 1097, "name": "alejandroruiz23", "count": 1, "languages": 1 }, { - "order": 1093, + "order": 1098, "name": "jaimesoftdev", "count": 1, "languages": 1 }, { - "order": 1094, + "order": 1099, "name": "alexvasquez199914", "count": 1, "languages": 1 }, { - "order": 1095, + "order": 1100, "name": "deimoshall", "count": 1, "languages": 1 }, { - "order": 1096, + "order": 1101, "name": "over-kr", "count": 1, "languages": 1 }, { - "order": 1097, + "order": 1102, "name": "fede6299", "count": 1, "languages": 1 }, { - "order": 1098, + "order": 1103, "name": "kevin05m", "count": 1, "languages": 1 }, { - "order": 1099, + "order": 1104, "name": "diegomm27", "count": 1, "languages": 1 }, { - "order": 1100, + "order": 1105, "name": "pablo-lnx", "count": 1, "languages": 1 }, { - "order": 1101, + "order": 1106, "name": "darkohokage", "count": 1, "languages": 1 }, { - "order": 1102, + "order": 1107, "name": "chrystiancalderon", "count": 1, "languages": 1 }, { - "order": 1103, + "order": 1108, "name": "gianellannie", "count": 1, "languages": 1 }, { - "order": 1104, + "order": 1109, "name": "serg_pq", "count": 1, "languages": 1 }, { - "order": 1105, + "order": 1110, "name": "jose-zga", "count": 1, "languages": 1 }, { - "order": 1106, + "order": 1111, "name": "zyn7e", "count": 1, "languages": 1 }, { - "order": 1107, + "order": 1112, "name": "xhaloidx", "count": 1, "languages": 1 }, { - "order": 1108, + "order": 1113, "name": "frankmon03", "count": 1, "languages": 1 }, { - "order": 1109, + "order": 1114, "name": "martinaq", "count": 1, "languages": 1 }, { - "order": 1110, + "order": 1115, "name": "lewisoneil", "count": 1, "languages": 1 }, { - "order": 1111, + "order": 1116, "name": "cristobalbelcor", "count": 1, "languages": 1 }, { - "order": 1112, + "order": 1117, "name": "cristian-encalada", "count": 1, "languages": 1 }, { - "order": 1113, + "order": 1118, "name": "chalaito88", "count": 1, "languages": 1 }, { - "order": 1114, + "order": 1119, "name": "angeldevsarrollo", "count": 1, "languages": 1 }, { - "order": 1115, + "order": 1120, "name": "hanzd07", "count": 1, "languages": 1 }, { - "order": 1116, + "order": 1121, "name": "vikinghost", "count": 1, "languages": 1 }, { - "order": 1117, + "order": 1122, "name": "det3992", "count": 1, "languages": 1 }, { - "order": 1118, + "order": 1123, "name": "alvaropg15", "count": 1, "languages": 1 }, { - "order": 1119, + "order": 1124, "name": "danisaurio94", "count": 1, "languages": 1 }, { - "order": 1120, + "order": 1125, "name": "iguerrerov", "count": 1, "languages": 1 }, { - "order": 1121, + "order": 1126, "name": "bycris13", "count": 1, "languages": 1 }, { - "order": 1122, + "order": 1127, "name": "albert-29", "count": 1, "languages": 1 }, { - "order": 1123, + "order": 1128, "name": "nolemoon", "count": 1, "languages": 1 }, { - "order": 1124, + "order": 1129, "name": "ignaciiodev", "count": 1, "languages": 1 }, { - "order": 1125, + "order": 1130, "name": "jrgim", "count": 1, "languages": 1 }, { - "order": 1126, + "order": 1131, "name": "clespinosa2024", "count": 1, "languages": 1 }, { - "order": 1127, + "order": 1132, "name": "cybersutro", "count": 1, "languages": 1 }, { - "order": 1128, + "order": 1133, "name": "reneguzman7", "count": 1, "languages": 1 }, { - "order": 1129, + "order": 1134, "name": "nazhiravila", "count": 1, "languages": 1 }, { - "order": 1130, + "order": 1135, "name": "dsmhp0", "count": 1, "languages": 1 }, { - "order": 1131, + "order": 1136, "name": "algeloro", "count": 1, "languages": 1 }, { - "order": 1132, + "order": 1137, "name": "adriansaint07", "count": 1, "languages": 1 }, { - "order": 1133, + "order": 1138, "name": "v1k770r", "count": 1, "languages": 1 }, { - "order": 1134, + "order": 1139, "name": "jaquelinetorres", "count": 1, "languages": 1 }, { - "order": 1135, + "order": 1140, "name": "jlrojano", "count": 1, "languages": 1 }, { - "order": 1136, + "order": 1141, "name": "maynor06", "count": 1, "languages": 1 }, { - "order": 1137, + "order": 1142, "name": "dovinhoyos", "count": 1, "languages": 1 }, { - "order": 1138, + "order": 1143, "name": "alefine", "count": 1, "languages": 1 }, { - "order": 1139, + "order": 1144, "name": "ivanserran", "count": 1, "languages": 1 }, { - "order": 1140, + "order": 1145, "name": "alexeigio", "count": 1, "languages": 1 }, { - "order": 1141, + "order": 1146, "name": "fredylopez01", "count": 1, "languages": 1 }, { - "order": 1142, + "order": 1147, "name": "santiagopereiraviroga", "count": 1, "languages": 1 }, { - "order": 1143, + "order": 1148, "name": "deathbato", "count": 1, "languages": 1 }, { - "order": 1144, + "order": 1149, "name": "jony_english22", "count": 1, "languages": 1 }, { - "order": 1145, + "order": 1150, "name": "mathiur", "count": 1, "languages": 1 }, { - "order": 1146, + "order": 1151, "name": "derkopath", "count": 1, "languages": 1 }, { - "order": 1147, + "order": 1152, "name": "robermejia", "count": 1, "languages": 1 }, { - "order": 1148, + "order": 1153, "name": "lautimorales", "count": 1, "languages": 1 }, { - "order": 1149, + "order": 1154, "name": "diegopardomontero", "count": 1, "languages": 1 }, { - "order": 1150, + "order": 1155, "name": "adriangonzalezroble", "count": 1, "languages": 1 }, { - "order": 1151, + "order": 1156, "name": "dariel800xd", "count": 1, "languages": 1 }, { - "order": 1152, + "order": 1157, "name": "sxxnzdev", "count": 1, "languages": 1 }, { - "order": 1153, + "order": 1158, "name": "pguillo", "count": 1, "languages": 1 }, { - "order": 1154, + "order": 1159, "name": "dany3gs", "count": 1, "languages": 1 }, { - "order": 1155, + "order": 1160, "name": "durwian", "count": 1, "languages": 1 }, { - "order": 1156, + "order": 1161, "name": "antoniojzp86", "count": 1, "languages": 1 }, { - "order": 1157, + "order": 1162, "name": "jaimenar", "count": 1, "languages": 1 }, { - "order": 1158, + "order": 1163, "name": "rreyes0424", "count": 1, "languages": 1 }, { - "order": 1159, + "order": 1164, "name": "javiir", "count": 1, "languages": 1 }, { - "order": 1160, + "order": 1165, "name": "queralesdev", "count": 1, "languages": 1 }, { - "order": 1161, + "order": 1166, "name": "cristianmr87", "count": 1, "languages": 1 }, { - "order": 1162, + "order": 1167, "name": "kgrc05", "count": 1, "languages": 1 }, { - "order": 1163, + "order": 1168, "name": "sanuka78", "count": 1, "languages": 1 }, { - "order": 1164, + "order": 1169, "name": "pvigo10", "count": 1, "languages": 1 }, { - "order": 1165, + "order": 1170, "name": "lizandev", "count": 1, "languages": 1 }, { - "order": 1166, + "order": 1171, "name": "danielcastillo1112", "count": 1, "languages": 1 }, { - "order": 1167, + "order": 1172, "name": "devm0nk3y", "count": 1, "languages": 1 }, { - "order": 1168, + "order": 1173, "name": "corvo-99", "count": 1, "languages": 1 }, { - "order": 1169, + "order": 1174, "name": "sirvega83", "count": 1, "languages": 1 }, { - "order": 1170, + "order": 1175, "name": "malkarmah", "count": 1, "languages": 1 }, { - "order": 1171, + "order": 1176, "name": "franpua", "count": 1, "languages": 1 }, { - "order": 1172, + "order": 1177, "name": "vinyoles", "count": 1, "languages": 1 }, { - "order": 1173, + "order": 1178, "name": "omarroman29", "count": 1, "languages": 1 }, { - "order": 1174, + "order": 1179, "name": "theposi", "count": 1, "languages": 1 }, { - "order": 1175, + "order": 1180, "name": "1cel4nc3", "count": 1, "languages": 1 }, { - "order": 1176, + "order": 1181, "name": "marianofernandezs", "count": 1, "languages": 1 }, { - "order": 1177, + "order": 1182, "name": "paluzz", "count": 1, "languages": 1 }, { - "order": 1178, + "order": 1183, "name": "sergio-strazzacappa", "count": 1, "languages": 1 }, { - "order": 1179, + "order": 1184, "name": "arathhh8", "count": 1, "languages": 1 }, { - "order": 1180, + "order": 1185, "name": "juandevian", "count": 1, "languages": 1 }, { - "order": 1181, + "order": 1186, "name": "gabrielcharibpolls", "count": 1, "languages": 1 }, { - "order": 1182, + "order": 1187, "name": "jatomas", "count": 1, "languages": 1 }, { - "order": 1183, + "order": 1188, "name": "astriebeck", "count": 1, "languages": 1 }, { - "order": 1184, + "order": 1189, "name": "rocadev2714", "count": 1, "languages": 1 }, { - "order": 1185, + "order": 1190, "name": "afacorroloscos", "count": 1, "languages": 1 }, { - "order": 1186, + "order": 1191, "name": "chrisfelixgil", "count": 1, "languages": 1 }, { - "order": 1187, + "order": 1192, "name": "marvinagui", "count": 1, "languages": 1 }, { - "order": 1188, + "order": 1193, "name": "ledyam", "count": 1, "languages": 1 }, { - "order": 1189, - "name": "hazartd", - "count": 1, - "languages": 1 - }, - { - "order": 1190, + "order": 1194, "name": "jcrobles99", "count": 1, "languages": 1 }, { - "order": 1191, + "order": 1195, "name": "angel-tineo", "count": 1, "languages": 1 }, { - "order": 1192, + "order": 1196, "name": "marqitos", "count": 1, "languages": 1 }, { - "order": 1193, + "order": 1197, "name": "wilibac", "count": 1, "languages": 1 }, { - "order": 1194, + "order": 1198, "name": "ishimaku", "count": 1, "languages": 1 }, { - "order": 1195, + "order": 1199, "name": "nunezlagos", "count": 1, "languages": 1 }, { - "order": 1196, + "order": 1200, "name": "sandrarg85", "count": 1, "languages": 1 }, { - "order": 1197, + "order": 1201, "name": "pkmaventura", "count": 1, "languages": 1 }, { - "order": 1198, + "order": 1202, "name": "miguelgargallo", "count": 1, "languages": 1 }, { - "order": 1199, + "order": 1203, "name": "lobogeekmx", "count": 1, "languages": 1 }, { - "order": 1200, + "order": 1204, "name": "rootqui", "count": 1, "languages": 1 }, { - "order": 1201, + "order": 1205, "name": "palons29", "count": 1, "languages": 1 }, { - "order": 1202, + "order": 1206, "name": "implevacui", "count": 1, "languages": 1 }, { - "order": 1203, + "order": 1207, "name": "mickysoft", "count": 1, "languages": 1 }, { - "order": 1204, + "order": 1208, "name": "alexisbarradev", "count": 1, "languages": 1 }, { - "order": 1205, + "order": 1209, "name": "tartabullroberto", "count": 1, "languages": 1 }, { - "order": 1206, + "order": 1210, "name": "kelvincb", "count": 1, "languages": 1 }, { - "order": 1207, + "order": 1211, "name": "lara-vel-dev", "count": 1, "languages": 1 }, { - "order": 1208, + "order": 1212, "name": "serg-pq", "count": 1, "languages": 1 }, { - "order": 1209, + "order": 1213, "name": "acirdevelper", "count": 1, "languages": 1 }, { - "order": 1210, + "order": 1214, "name": "francisleble", "count": 1, "languages": 1 }, { - "order": 1211, + "order": 1215, "name": "jhordanluyo", "count": 1, "languages": 1 }, { - "order": 1212, + "order": 1216, "name": "bokysherlo", "count": 1, "languages": 1 }, { - "order": 1213, + "order": 1217, "name": "daniel-cas", "count": 1, "languages": 1 }, { - "order": 1214, + "order": 1218, "name": "borjadelgadodev", "count": 1, "languages": 1 }, { - "order": 1215, + "order": 1219, "name": "alvarominarro", "count": 1, "languages": 1 }, { - "order": 1216, + "order": 1220, "name": "mbmaeso", "count": 1, "languages": 1 }, { - "order": 1217, - "name": "jaennova", - "count": 1, - "languages": 1 - }, - { - "order": 1218, + "order": 1221, "name": "deiiviitdev", "count": 1, "languages": 1 }, { - "order": 1219, + "order": 1222, "name": "braiso-22", "count": 1, "languages": 1 }, { - "order": 1220, + "order": 1223, "name": "davidcv-dev", "count": 1, "languages": 1 }, { - "order": 1221, + "order": 1224, "name": "luisalberto22", "count": 1, "languages": 1 }, { - "order": 1222, + "order": 1225, "name": "mauricioyair", "count": 1, "languages": 1 }, { - "order": 1223, + "order": 1226, "name": "rulo77", "count": 1, "languages": 1 }, { - "order": 1224, + "order": 1227, "name": "serg032", "count": 1, "languages": 1 }, { - "order": 1225, + "order": 1228, "name": "jancalos", "count": 1, "languages": 1 }, { - "order": 1226, + "order": 1229, "name": "manuhssj", "count": 1, "languages": 1 }, { - "order": 1227, + "order": 1230, "name": "feliaguirre7", "count": 1, "languages": 1 }, { - "order": 1228, + "order": 1231, "name": "manugonzalito", "count": 1, "languages": 1 }, { - "order": 1229, + "order": 1232, "name": "cibacoa", "count": 1, "languages": 1 }, { - "order": 1230, + "order": 1233, "name": "lucc4sz", "count": 1, "languages": 1 }, { - "order": 1231, + "order": 1234, "name": "gizelads", "count": 1, "languages": 1 }, { - "order": 1232, + "order": 1235, "name": "deaconst", "count": 1, "languages": 1 }, { - "order": 1233, + "order": 1236, "name": "marcosapodaca", "count": 1, "languages": 1 }, { - "order": 1234, + "order": 1237, "name": "coletonosh", "count": 1, "languages": 1 }, { - "order": 1235, + "order": 1238, "name": "axelwestman", "count": 1, "languages": 1 }, { - "order": 1236, + "order": 1239, "name": "is2095", "count": 1, "languages": 1 }, { - "order": 1237, + "order": 1240, "name": "seigigim", "count": 1, "languages": 1 }, { - "order": 1238, + "order": 1241, "name": "javodevon", "count": 1, "languages": 1 }, { - "order": 1239, + "order": 1242, "name": "marcosjarrin", "count": 1, "languages": 1 }, { - "order": 1240, + "order": 1243, "name": "angelcruzg23", "count": 1, "languages": 1 }, { - "order": 1241, + "order": 1244, "name": "fernandofl", "count": 1, "languages": 1 }, { - "order": 1242, + "order": 1245, "name": "quirogapau", "count": 1, "languages": 1 }, { - "order": 1243, + "order": 1246, "name": "brayancordova1", "count": 1, "languages": 1 }, { - "order": 1244, + "order": 1247, "name": "yaojema", "count": 1, "languages": 1 }, { - "order": 1245, + "order": 1248, "name": "gerespinosa", "count": 1, "languages": 1 }, { - "order": 1246, + "order": 1249, "name": "flarien", "count": 1, "languages": 1 }, { - "order": 1247, + "order": 1250, "name": "lopesteban", "count": 1, "languages": 1 }, { - "order": 1248, + "order": 1251, "name": "gc796", "count": 1, "languages": 1 }, { - "order": 1249, + "order": 1252, "name": "nixoo657", "count": 1, "languages": 1 }, { - "order": 1250, + "order": 1253, "name": "miguelsarm", "count": 1, "languages": 1 }, { - "order": 1251, + "order": 1254, "name": "diego-santana23", "count": 1, "languages": 1 }, { - "order": 1252, + "order": 1255, "name": "edperez07", "count": 1, "languages": 1 }, { - "order": 1253, + "order": 1256, "name": "siuldev", "count": 1, "languages": 1 }, { - "order": 1254, + "order": 1257, "name": "alvarommedia", "count": 1, "languages": 1 }, { - "order": 1255, + "order": 1258, "name": "johanrv", "count": 1, "languages": 1 }, { - "order": 1256, + "order": 1259, "name": "mekanicas", "count": 1, "languages": 1 }, { - "order": 1257, + "order": 1260, "name": "cristiantorres53", "count": 1, "languages": 1 }, { - "order": 1258, + "order": 1261, "name": "rojasvargas", "count": 1, "languages": 1 }, { - "order": 1259, + "order": 1262, "name": "nicorey89", "count": 1, "languages": 1 }, { - "order": 1260, + "order": 1263, "name": "estefrac", "count": 1, "languages": 1 }, { - "order": 1261, + "order": 1264, "name": "rotsenn", "count": 1, "languages": 1 }, { - "order": 1262, + "order": 1265, "name": "pointfs", "count": 1, "languages": 1 }, { - "order": 1263, + "order": 1266, "name": "royhuamanavila", "count": 1, "languages": 1 }, { - "order": 1264, + "order": 1267, "name": "sixtodev", "count": 1, "languages": 1 }, { - "order": 1265, + "order": 1268, "name": "jd-gm", "count": 1, "languages": 1 }, { - "order": 1266, + "order": 1269, "name": "pierre-ol", "count": 1, "languages": 1 }, { - "order": 1267, + "order": 1270, "name": "jpiacaruso", "count": 1, "languages": 1 }, { - "order": 1268, + "order": 1271, "name": "kouski", "count": 1, "languages": 1 }, { - "order": 1269, + "order": 1272, "name": "dianelis1", "count": 1, "languages": 1 }, { - "order": 1270, + "order": 1273, "name": "kinrgdev", "count": 1, "languages": 1 }, { - "order": 1271, + "order": 1274, "name": "rodmiggithub", "count": 1, "languages": 1 }, { - "order": 1272, + "order": 1275, "name": "augustbs", "count": 1, "languages": 1 }, { - "order": 1273, + "order": 1276, "name": "aleclto7", "count": 1, "languages": 1 }, { - "order": 1274, + "order": 1277, "name": "alemar16", "count": 1, "languages": 1 }, { - "order": 1275, + "order": 1278, "name": "vmga09", "count": 1, "languages": 1 }, { - "order": 1276, + "order": 1279, "name": "cgomezadolfo", "count": 1, "languages": 1 }, { - "order": 1277, + "order": 1280, "name": "nnunezmedina", "count": 1, "languages": 1 }, { - "order": 1278, + "order": 1281, "name": "luchof5", "count": 1, "languages": 1 }, { - "order": 1279, + "order": 1282, "name": "edgonzz", "count": 1, "languages": 1 }, { - "order": 1280, + "order": 1283, "name": "ronnieruuz", "count": 1, "languages": 1 }, { - "order": 1281, + "order": 1284, "name": "ercky1980", "count": 1, "languages": 1 }, { - "order": 1282, + "order": 1285, "name": "maximotoro", "count": 1, "languages": 1 }, { - "order": 1283, + "order": 1286, "name": "kenzambrano", "count": 1, "languages": 1 }, { - "order": 1284, + "order": 1287, "name": "lfam200", "count": 1, "languages": 1 }, { - "order": 1285, + "order": 1288, "name": "antonioverdugo", "count": 1, "languages": 1 }, { - "order": 1286, + "order": 1289, "name": "madelefonb", "count": 1, "languages": 1 }, { - "order": 1287, + "order": 1290, "name": "dacronik", "count": 1, "languages": 1 }, { - "order": 1288, + "order": 1291, "name": "kronomio", "count": 1, "languages": 1 }, { - "order": 1289, + "order": 1292, "name": "1978acb", "count": 1, "languages": 1 }, { - "order": 1290, + "order": 1293, "name": "xnomada", "count": 1, "languages": 1 }, { - "order": 1291, + "order": 1294, "name": "imista", "count": 1, "languages": 1 }, { - "order": 1292, + "order": 1295, "name": "dmhenaopa", "count": 1, "languages": 1 }, { - "order": 1293, + "order": 1296, "name": "lugryssd3v", "count": 1, "languages": 1 }, { - "order": 1294, + "order": 1297, "name": "gustavoguerrero", "count": 1, "languages": 1 }, { - "order": 1295, + "order": 1298, "name": "datrujillog", "count": 1, "languages": 1 }, { - "order": 1296, + "order": 1299, "name": "romanocoder", "count": 1, "languages": 1 }, { - "order": 1297, + "order": 1300, "name": "hfvaronb", "count": 1, "languages": 1 }, { - "order": 1298, + "order": 1301, "name": "kocho03", "count": 1, "languages": 1 }, { - "order": 1299, + "order": 1302, "name": "johnniew81", "count": 1, "languages": 1 }, { - "order": 1300, + "order": 1303, "name": "vainsito1", "count": 1, "languages": 1 }, { - "order": 1301, + "order": 1304, "name": "s9code", "count": 1, "languages": 1 }, { - "order": 1302, + "order": 1305, "name": "albabp", "count": 1, "languages": 1 }, { - "order": 1303, - "name": "rlores-edison", - "count": 1, - "languages": 1 - }, - { - "order": 1304, + "order": 1306, "name": "joseperesini", "count": 1, "languages": 1 }, { - "order": 1305, + "order": 1307, "name": "chriszaldana", "count": 1, "languages": 1 }, { - "order": 1306, + "order": 1308, "name": "diegoxxd", "count": 1, "languages": 1 }, { - "order": 1307, + "order": 1309, "name": "aidicoop", "count": 1, "languages": 1 }, { - "order": 1308, + "order": 1310, "name": "krrattoss5", "count": 1, "languages": 1 }, { - "order": 1309, + "order": 1311, "name": "javieradev", "count": 1, "languages": 1 }, { - "order": 1310, + "order": 1312, "name": "lfwzk", "count": 1, "languages": 1 }, { - "order": 1311, + "order": 1313, "name": "fullstackarlo", "count": 1, "languages": 1 }, { - "order": 1312, + "order": 1314, "name": "leydimadrid", "count": 1, "languages": 1 }, { - "order": 1313, + "order": 1315, "name": "joshua0730-star", "count": 1, "languages": 1 }, { - "order": 1314, + "order": 1316, "name": "afl0r3s", "count": 1, "languages": 1 }, { - "order": 1315, + "order": 1317, "name": "sejotaz", "count": 1, "languages": 1 }, { - "order": 1316, + "order": 1318, "name": "alexxawada", "count": 1, "languages": 1 }, { - "order": 1317, + "order": 1319, "name": "juanserdev", "count": 1, "languages": 1 }, { - "order": 1318, + "order": 1320, "name": "chrissr0", "count": 1, "languages": 1 }, { - "order": 1319, + "order": 1321, "name": "yessikamichelle", "count": 1, "languages": 1 }, { - "order": 1320, + "order": 1322, "name": "l3v1xx", "count": 1, "languages": 1 }, { - "order": 1321, + "order": 1323, "name": "juanpablo-a", "count": 1, "languages": 1 }, { - "order": 1322, + "order": 1324, "name": "nozodev", "count": 1, "languages": 1 }, { - "order": 1323, + "order": 1325, "name": "isnatthy", "count": 1, "languages": 1 }, { - "order": 1324, + "order": 1326, "name": "frannm29", "count": 1, "languages": 1 }, { - "order": 1325, + "order": 1327, "name": "peticas", "count": 1, "languages": 1 }, { - "order": 1326, + "order": 1328, "name": "francomoreira", "count": 1, "languages": 1 }, { - "order": 1327, + "order": 1329, "name": "jsruedatorres", "count": 1, "languages": 1 }, { - "order": 1328, + "order": 1330, "name": "mdemena", "count": 1, "languages": 1 }, { - "order": 1329, + "order": 1331, "name": "saintsluis", "count": 1, "languages": 1 }, { - "order": 1330, + "order": 1332, "name": "oscarletelier", "count": 1, "languages": 1 }, { - "order": 1331, + "order": 1333, "name": "nfom24", "count": 1, "languages": 1 }, { - "order": 1332, + "order": 1334, "name": "patricioguerra30", "count": 1, "languages": 1 }, { - "order": 1333, + "order": 1335, "name": "walkerlyna", "count": 1, "languages": 1 }, { - "order": 1334, + "order": 1336, "name": "mvillegas18", "count": 1, "languages": 1 }, { - "order": 1335, + "order": 1337, "name": "alexis0717", "count": 1, "languages": 1 }, { - "order": 1336, + "order": 1338, "name": "abengl", "count": 1, "languages": 1 }, { - "order": 1337, + "order": 1339, "name": "santaravena", "count": 1, "languages": 1 }, { - "order": 1338, + "order": 1340, "name": "cliverjimny123", "count": 1, "languages": 1 }, { - "order": 1339, + "order": 1341, "name": "kevinramirez28", "count": 1, "languages": 1 }, { - "order": 1340, + "order": 1342, "name": "francescoalterio", "count": 1, "languages": 1 }, { - "order": 1341, + "order": 1343, "name": "diegoasebey", "count": 1, "languages": 1 }, { - "order": 1342, + "order": 1344, "name": "victormdev24", "count": 1, "languages": 1 }, { - "order": 1343, + "order": 1345, "name": "frankqv", "count": 1, "languages": 1 }, { - "order": 1344, + "order": 1346, "name": "denisortega", "count": 1, "languages": 1 }, { - "order": 1345, + "order": 1347, "name": "m4xisil", "count": 1, "languages": 1 }, { - "order": 1346, + "order": 1348, "name": "jose-miguel1", "count": 1, "languages": 1 }, { - "order": 1347, + "order": 1349, "name": "conrado85", "count": 1, "languages": 1 }, { - "order": 1348, + "order": 1350, "name": "lucianogriffa", "count": 1, "languages": 1 }, { - "order": 1349, + "order": 1351, "name": "sergioab7", "count": 1, "languages": 1 }, { - "order": 1350, + "order": 1352, "name": "jacobrwx", "count": 1, "languages": 1 }, { - "order": 1351, + "order": 1353, "name": "abraham9804", "count": 1, "languages": 1 }, { - "order": 1352, + "order": 1354, "name": "agus-ig", "count": 1, "languages": 1 }, { - "order": 1353, + "order": 1355, "name": "lytsar", "count": 1, "languages": 1 }, { - "order": 1354, + "order": 1356, "name": "frcan89", "count": 1, "languages": 1 }, { - "order": 1355, + "order": 1357, "name": "mhrosariom", "count": 1, "languages": 1 }, { - "order": 1356, + "order": 1358, "name": "ja-bell", "count": 1, "languages": 1 }, { - "order": 1357, + "order": 1359, "name": "carlosdiaz-dev", "count": 1, "languages": 1 }, { - "order": 1358, + "order": 1360, "name": "codejoss", "count": 1, "languages": 1 }, { - "order": 1359, + "order": 1361, "name": "ricarsur", "count": 1, "languages": 1 }, { - "order": 1360, + "order": 1362, "name": "fzcarlitos", "count": 1, "languages": 1 }, { - "order": 1361, + "order": 1363, "name": "javosss", "count": 1, "languages": 1 }, { - "order": 1362, + "order": 1364, "name": "dgquintero", "count": 1, "languages": 1 }, { - "order": 1363, + "order": 1365, "name": "torvicv", "count": 1, "languages": 1 }, { - "order": 1364, + "order": 1366, "name": "cyberingeniero", "count": 1, "languages": 1 }, { - "order": 1365, + "order": 1367, "name": "markbus-ai", "count": 1, "languages": 1 }, { - "order": 1366, + "order": 1368, "name": "opahostil", "count": 1, "languages": 1 }, { - "order": 1367, + "order": 1369, "name": "gonzalinuz18", "count": 1, "languages": 1 }, { - "order": 1368, + "order": 1370, "name": "mmariob", "count": 1, "languages": 1 }, { - "order": 1369, + "order": 1371, "name": "daichiko", "count": 1, "languages": 1 }, { - "order": 1370, + "order": 1372, "name": "emanuelgauler", "count": 1, "languages": 1 }, { - "order": 1371, + "order": 1373, "name": "albmartinez", "count": 1, "languages": 1 }, { - "order": 1372, + "order": 1374, "name": "eduardo282", "count": 1, "languages": 1 }, { - "order": 1373, + "order": 1375, "name": "nightmare79", "count": 1, "languages": 1 }, { - "order": 1374, + "order": 1376, "name": "vikernes27666", "count": 1, "languages": 1 }, { - "order": 1375, + "order": 1377, "name": "cub-tor", "count": 1, "languages": 1 }, { - "order": 1376, + "order": 1378, "name": "carlosmperezm", "count": 1, "languages": 1 }, { - "order": 1377, + "order": 1379, "name": " maxirica", "count": 1, "languages": 1 }, { - "order": 1378, + "order": 1380, "name": "carlosmares", "count": 1, "languages": 1 }, { - "order": 1379, + "order": 1381, "name": "jstr14", "count": 1, "languages": 1 }, { - "order": 1380, + "order": 1382, "name": "snaisel", "count": 1, "languages": 1 }, { - "order": 1381, + "order": 1383, "name": "thompson6626", "count": 1, "languages": 1 }, { - "order": 1382, + "order": 1384, "name": "leonardo-henao", "count": 1, "languages": 1 }, { - "order": 1383, + "order": 1385, "name": "juancamilofvx", "count": 1, "languages": 1 }, { - "order": 1384, + "order": 1386, "name": "c-blskv", "count": 1, "languages": 1 }, { - "order": 1385, + "order": 1387, "name": "emaerniquez", "count": 1, "languages": 1 }, { - "order": 1386, + "order": 1388, "name": "carolhs92", "count": 1, "languages": 1 }, { - "order": 1387, + "order": 1389, "name": "tilordqwerty", "count": 1, "languages": 1 }, { - "order": 1388, + "order": 1390, "name": "rawc1nnamon", "count": 1, "languages": 1 }, { - "order": 1389, + "order": 1391, "name": "luism95", "count": 1, "languages": 1 }, { - "order": 1390, + "order": 1392, "name": "santyjl44", "count": 1, "languages": 1 From 166ebc62b51720ff3cb62356fbe5b4e5dd962a91 Mon Sep 17 00:00:00 2001 From: Santiago Bailleres Date: Fri, 27 Dec 2024 21:39:34 -0300 Subject: [PATCH 078/104] #12 - Python --- .../python/santiagobailleres.py | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 Roadmap/12 - JSON Y XML/python/santiagobailleres.py diff --git a/Roadmap/12 - JSON Y XML/python/santiagobailleres.py b/Roadmap/12 - JSON Y XML/python/santiagobailleres.py new file mode 100644 index 0000000000..60ce7848f0 --- /dev/null +++ b/Roadmap/12 - JSON Y XML/python/santiagobailleres.py @@ -0,0 +1,92 @@ +'''EJERCICIO: +Desarrolla un programa capaz de crear un archivo XML y JSON que guarde los +siguientes datos (haciendo uso de la sintaxis correcta en cada caso): +- Nombre +- Edad +- Fecha de nacimiento +- Listado de lenguajes de programación +Muestra el contenido de los archivos. +Borra los archivos. +DIFICULTAD EXTRA (opcional): +Utilizando la lógica de creación de los archivos anteriores, crea un +programa capaz de leer y transformar en una misma clase custom de tu +lenguaje los datos almacenados en el XML y el JSON. +Borra los archivos.''' + +import json +import xml.etree.ElementTree as xml +import os + +data = { + 'name': 'Santiago Bailleres', + 'age': 25, + 'birth_date': '25-06-1999', + 'programming_languages': ['Python', 'JavaScript', 'Java'] +} + +xml_file = 'santiagobailleres.xml' +json_file = 'santiagobailleres.json' + +# Crear archivo XML +def create_xml(): + root = xml.Element('data') # Crear elemento raíz + + for key, value in data.items(): # Recorrer diccionario + child = xml.SubElement(root, key) # Crear elemento hijo para cada par clave-valor + if isinstance(value, list): # isinstance() devuelve True si el objeto es una instancia de la clase especificada + for item in value: # Si el valor es una lista, recorrerla + xml.SubElement(child, 'item').text = item # Crear un elemento hijo para cada item de la lista + else: + child.text = str(value) # Si no es una lista, asignar el valor como texto del elemento hijo + tree = xml.ElementTree(root) # Crear árbol XML. un arbol XML es un objeto que representa la estructura de un documento XML + tree.write(xml_file) # Escribir árbol XML en archivo + +create_xml() + +with open(xml_file, 'r') as xml_data: + print(xml_data.read()) + +os.remove(xml_file) + +# Crear archivo JSON +def create_json(): + with open(json_file, 'w') as json_data: + json.dump(data, json_data) # json.dump() escribe un objeto JSON en un archivo + +create_json() + +with open(json_file, 'r') as json_data: + print(json_data.read()) + +os.remove(json_file) + +# la libreria os permite interactuar con el sistema operativo, en este caso se utiliza para borrar los archivos creados + +# EXTRA + +create_json() +create_xml() + +class Data: + def __init__(self, name, age, birth_date, programming_languages): + self.name = name + self.age = age + self.birth_date = birth_date + self.programming_languages = programming_languages + +with open(xml_file, 'r') as xml_data: + root = xml.fromstring(xml_data.read()) # fromstring() convierte una cadena XML en un objeto Element + name = root.find('name').text + age = int(root.find('age').text) + birth_date = root.find('birth_date').text + programming_languages = [item.text for item in root.find('programming_languages')] # Recorrer los elementos hijos de la lista y guardar su texto en una lista + + xml_class = Data(name, age, birth_date, programming_languages) + print(xml_class.__dict__) # __dict__ devuelve un diccionario que contiene los atributos de la clase + +with open(json_file, 'r') as json_data: + json_class = Data(**json.load(json_data)) # **kwargs desempaqueta el diccionario y pasa sus elementos como argumentos a la clase + print(json_class.__dict__) + +os.remove(xml_file) +os.remove(json_file) \ No newline at end of file From eed4dcfc4db449a36cd6e11598f45d1afe17851b Mon Sep 17 00:00:00 2001 From: russanov Date: Fri, 27 Dec 2024 21:27:47 -0400 Subject: [PATCH 079/104] #05 - Python --- .../python/Rusanov16.py | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 Roadmap/05 - VALOR Y REFERENCIA/python/Rusanov16.py diff --git a/Roadmap/05 - VALOR Y REFERENCIA/python/Rusanov16.py b/Roadmap/05 - VALOR Y REFERENCIA/python/Rusanov16.py new file mode 100644 index 0000000000..2e0a8eca0c --- /dev/null +++ b/Roadmap/05 - VALOR Y REFERENCIA/python/Rusanov16.py @@ -0,0 +1,98 @@ +""" +EJERCICIO: +- Muestra ejemplos de asignación de variables "por valor" y "por referencia", según + su tipo de dato. +- Muestra ejemplos de funciones con variables que se les pasan "por valor" y + "por referencia", y cómo se comportan en cada caso en el momento de ser modificadas. +(Entender estos conceptos es algo esencial en la gran mayoría de lenguajes) + +DIFICULTAD EXTRA (opcional): +Crea dos programas que reciban dos parámetros (cada uno) definidos como variables anteriormente. +- Cada programa recibe, en un caso, dos parámetros por valor, y en otro caso, por referencia. + Estos parámetros los intercambia entre ellos en su interior, los retorna, y su retorno + se asigna a dos variables diferentes a las originales. A continuación, imprime el valor de las + variables originales y las nuevas, comprobando que se ha invertido su valor en las segundas. + Comprueba también que se ha conservado el valor original en las primeras. +""" + +#*-------------------------------------------------------------------------------------------------------------# +print("-----------------------------------------------------------------------------------------------------") +print("Variables por valor:\n") +inicio = 156 +print(f"La variable inicio tiene el siguiente valor: {inicio}") +fin = inicio +print(f"La variable fin tendrá el mismo valor que incio: {fin}") +fin = 456 +print(f"La variable fin se ha modificado ya hora tiene el siguiente valor: {fin}") + +print("Funciones con variables por valor:\n") +def modificar_valor(ini_nuevo): + ini_nuevo = 3864 + print(ini_nuevo) + +ini = 45 +modificar_valor(ini) +print(ini) + +#*-------------------------------------------------------------------------------------------------------------# + +print("-----------------------------------------------------------------------------------------------------") +print("Variables por Referencia:\n") + +notas = [3.5,4.6,7.8,9] +print(f"Esta es una lista con las notas de una materia: {notas}") +not_final = notas +print(f"La nueva lista tendrá el mismo valor que la lista notas: {not_final}") +not_final.append(5.6) +print(f"La lista not_final se modificó y estos son sus valores: {not_final}") + +print("Funciones con variables por referencia:\n") +def modificar_lista(nota_lista): + nota_lista.append(6.8) + print(nota_lista) + +nueva_notas = [3.4,5.6,8.2,3.2] +modificar_lista(nueva_notas) +print(nueva_notas) + +#*-------------------------------------------------------------------------------------------------------------# +""" +DIFICULTAD EXTRA (opcional): +Crea dos programas que reciban dos parámetros (cada uno) definidos como variables anteriormente. +- Cada programa recibe, en un caso, dos parámetros por valor, y en otro caso, por referencia. + Estos parámetros los intercambia entre ellos en su interior, los retorna, y su retorno + se asigna a dos variables diferentes a las originales. A continuación, imprime el valor de las + variables originales y las nuevas, comprobando que se ha invertido su valor en las segundas. + Comprueba también que se ha conservado el valor original en las primeras. +""" + +print("-----------------------------------------------------------------------------------------------------") + +#Para Valor +print("Funciones para Valor con dos parametros:\n") +def valor(u,w): + u = w * 15 + w = 25 - u + return u,w + +x = 350 +y = 456 +nuevo_x , nuevo_y = valor(x,y) +print(f"Los valores definidos anteriormente son: {x,y}") +print(f"Los nuevos valores son: {nuevo_x,nuevo_y}") + +print("-----------------------------------------------------------------------------------------------------") + +#Para Referencia +print("Funciones para Referencia con dos parametros:\n") +def referencia(list_a,list_b): + list_a = [list_b,list_a] + list_b = list_a + return list_a, list_b + +list_u = [3.4,5,7,8,9] +list_w = [4,8,1.2,4.3,7.6] + +nueva_lista_u , nueva_lista_w = referencia(list_u,list_w) +print(f"Los valores definidos anteriormente son: {list_u,list_w}") +print(f"Los nuevos valores son: {nueva_lista_u,nueva_lista_w}") \ No newline at end of file From 299c5eb777d35961091f6248aba0ff4c43af8c9a Mon Sep 17 00:00:00 2001 From: santyjL Date: Sat, 28 Dec 2024 12:08:13 -0600 Subject: [PATCH 080/104] #37 - python --- .../python/santyjl.py | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 Roadmap/37 - OASIS VS LINKIN PARK/python/santyjl.py diff --git a/Roadmap/37 - OASIS VS LINKIN PARK/python/santyjl.py b/Roadmap/37 - OASIS VS LINKIN PARK/python/santyjl.py new file mode 100644 index 0000000000..5c2e70ec8a --- /dev/null +++ b/Roadmap/37 - OASIS VS LINKIN PARK/python/santyjl.py @@ -0,0 +1,84 @@ +#37 OASIS VS LINKIN PARK +#### Dificultad: Media | Publicación: 09/09/24 | Corrección: 16/09/24 + +## Ejercicio +""" +/* + * EJERCICIO: + * ¡Dos de las bandas más grandes de la historia están de vuelta! + * Oasis y Linkin Park han anunciado nueva gira, pero, ¿quién es más popular? + * Desarrolla un programa que se conecte al API de Spotify y los compare. + * Requisitos: + * 1. Crea una cuenta de desarrollo en https://developer.spotify.com. + * 2. Conéctate al API utilizando tu lenguaje de programación. + * 3. Recupera datos de los endpoint que tú quieras. + * Acciones: + * 1. Accede a las estadísticas de las dos bandas. + * Por ejemplo: número total de seguidores, escuchas mensuales, + * canción con más reproducciones... + * 2. Compara los resultados de, por lo menos, 3 endpoint. + * 3. Muestra todos los resultados por consola para notificar al usuario. + * 4. Desarrolla un criterio para seleccionar qué banda es más popular. + */ +""" +import base64 + +import requests + +# Credenciales de Spotify +client_id = '' +client_secret = '' + +# Obtener el token de acceso +def get_access_token(client_id, client_secret): + auth_url = 'https://accounts.spotify.com/api/token' + auth_header = base64.b64encode(f"{client_id}:{client_secret}".encode()).decode() + headers = { + 'Authorization': f'Basic {auth_header}', + 'Content-Type': 'application/x-www-form-urlencoded' + } + data = { + 'grant_type': 'client_credentials' + } + response = requests.post(auth_url, headers=headers, data=data) + response_data = response.json() + return response_data['access_token'] + +# Obtener datos del artista +def get_artist_data(artist_name, access_token): + search_url = 'https://api.spotify.com/v1/search' + headers = { + 'Authorization': f'Bearer {access_token}' + } + params = { + 'q': artist_name, + 'type': 'artist' + } + response = requests.get(search_url, headers=headers, params=params) + artist_data = response.json()['artists']['items'][0] + return artist_data + +# Comparar estadísticas de las bandas +def compare_bands(artist1, artist2): + access_token = get_access_token(client_id, client_secret) + artist1_data = get_artist_data(artist1, access_token) + artist2_data = get_artist_data(artist2, access_token) + + print(f"""{artist1}: + Followers: {artist1_data['followers']['total']} de seguidores en total + Popularity: {artist1_data['popularity']} puntos de popularidad + Generos: {artist1_data['genres']} + """) + print(f"""{artist2}: + Followers: {artist2_data['followers']['total']} de seguidores en total + Popularity: {artist2_data['popularity']} puntos de popularidad + Generos: {artist2_data['genres']} + """) + + if artist1_data['followers']['total'] > artist2_data['followers']['total']: + print(f"{artist1} es más popular que {artist2}.") + else: + print(f"{artist2} es más popular que {artist1}.") + +# Uso del programa +compare_bands('soda stereo', 'Los enanitos verdes') \ No newline at end of file From e41b0b902617053571d54d681a00129b9b284ac0 Mon Sep 17 00:00:00 2001 From: luistecnocode Date: Sat, 28 Dec 2024 20:34:50 +0100 Subject: [PATCH 081/104] luistecnocode solucion al 00 en python --- .../python/luistecnocode.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/luistecnocode.py diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/luistecnocode.py b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/luistecnocode.py new file mode 100644 index 0000000000..6cb9446c8b --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/luistecnocode.py @@ -0,0 +1,59 @@ +''' + /* + * ¿Preparad@ para aprender o repasar el lenguaje de programación que tú quieras? + * - Recuerda que todas las instrucciones de participación están en el + * repositorio de GitHub. + * + * Lo primero... ¿Ya has elegido un lenguaje? + * - No todos son iguales, pero sus fundamentos suelen ser comunes. + * - Este primer reto te servirá para familiarizarte con la forma de participar + * enviando tus propias soluciones. + * + * EJERCICIO: + * - Crea un comentario en el código y coloca la URL del sitio web oficial del + * lenguaje de programación que has seleccionado. + * - Representa las diferentes sintaxis que existen de crear comentarios + * en el lenguaje (en una línea, varias...). + * - Crea una variable (y una constante si el lenguaje lo soporta). + * - Crea variables representando todos los tipos de datos primitivos + * del lenguaje (cadenas de texto, enteros, booleanos...). + * - Imprime por terminal el texto: "¡Hola, [y el nombre de tu lenguaje]!" + * + * ¿Fácil? No te preocupes, recuerda que esta es una ruta de estudio y + * debemos comenzar por el principio. + */ +''' +###### COMENTARIOS ###### + +# https://www.python.org/ + +# Una línea + +# Varias +# Lineas + +''' +Multilinea +''' + +""" +Otra multilinea +""" + +###### VARIABLES ####### +my_variable = 5 +MY_CONSTANT = "mi constante" # No lo es, pero por convencion MAYUSCULAS + +my_int = 1 +my_float = 1.2 +my_bool = True +my_string = "eso es un texto" +my_other_string = 'esto es otro texto' + +print("Hola, Python!") + +print(type(my_int)) +print(type(my_float)) +print(type(my_bool)) +print(type(my_string)) +print(type(my_other_string)) \ No newline at end of file From b6ece4af3dae90504e1d4460dd641a2f0faade0e Mon Sep 17 00:00:00 2001 From: neslarra <31991788+neslarra@users.noreply.github.com> Date: Sat, 28 Dec 2024 18:15:24 -0300 Subject: [PATCH 082/104] Reto# 50 - python --- .../python/neslarra.py" | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/neslarra.py" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/neslarra.py" index 415b1ac854..4c693e9ba8 100644 --- "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/neslarra.py" +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/neslarra.py" @@ -88,7 +88,7 @@ def show_monthy_targets(self): 7: "Julio", 8: "Agosto", 9: "Septiembre", 10: "Octubre", 11: "Noviembre", 12: "Diciembre"} print("\nObjetivos para este año ----------------") for target in self.target_list: - print(f"\tObjetivo: {target.get_target()}: {target.get_amount()} {target.get_target_unit()} por mes durante {target.get_period()} meses") + print(f"\tObjetivo: {target.get_target()}: {target.get_amount()} {target.get_target_unit()} durante {target.get_period()} meses") for month in range(1, 13): print(f"\nObjetivos {months[month]}\n{'#' * 30}") for target in self.target_list: @@ -107,13 +107,12 @@ def show_monthy_targets(self): objetivo1 = Target("Leer", "libros", 7, 12) objetivo2 = Target("Ver", "videos", 12, 12) -objetivo3 = Target("Escribir", "Artículos", 17, 8) +objetivo3 = Target("Escribir", "Artículos", 17, 9) gestor = TargetManager(Target.target_list) gestor.show_monthy_targets() -# Agrego un objcetivo nuevo -objetivo4 = Target("Practicar", "Tenis", 24, 6) +objetivo4 = Target("Tomar", "Clases de tenis", 24, 6) gestor.show_monthy_targets() From 231e3bc4a5725338e23155572fbabddb9369bd20 Mon Sep 17 00:00:00 2001 From: mouredev Date: Sun, 29 Dec 2024 00:18:01 +0000 Subject: [PATCH 083/104] Update stats --- Roadmap/stats.json | 170 +++++++++++++++++++++++---------------------- 1 file changed, 88 insertions(+), 82 deletions(-) diff --git a/Roadmap/stats.json b/Roadmap/stats.json index 35b65b44c4..3ba71b461d 100644 --- a/Roadmap/stats.json +++ b/Roadmap/stats.json @@ -1,337 +1,337 @@ { "challenges_total": 51, "languages_total": 52, - "files_total": 8812, - "users_total": 1392, + "files_total": 8866, + "users_total": 1393, "challenges_ranking": [ { "order": 1, "name": "00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO", - "count": 1504 + "count": 1505 }, { "order": 2, "name": "01 - OPERADORES Y ESTRUCTURAS DE CONTROL", - "count": 910 + "count": 911 }, { "order": 3, "name": "02 - FUNCIONES Y ALCANCE", - "count": 675 + "count": 676 }, { "order": 4, "name": "03 - ESTRUCTURAS DE DATOS", - "count": 481 + "count": 482 }, { "order": 5, "name": "04 - CADENAS DE CARACTERES", - "count": 398 + "count": 399 }, { "order": 6, "name": "06 - RECURSIVIDAD", - "count": 367 + "count": 368 }, { "order": 7, "name": "05 - VALOR Y REFERENCIA", - "count": 338 + "count": 339 }, { "order": 8, "name": "07 - PILAS Y COLAS", - "count": 282 + "count": 283 }, { "order": 9, "name": "08 - CLASES", - "count": 263 + "count": 264 }, { "order": 10, "name": "09 - HERENCIA", - "count": 251 + "count": 252 }, { "order": 11, "name": "10 - EXCEPCIONES", - "count": 215 + "count": 216 }, { "order": 12, "name": "11 - MANEJO DE FICHEROS", - "count": 184 + "count": 185 }, { "order": 13, "name": "13 - PRUEBAS UNITARIAS", - "count": 153 + "count": 154 }, { "order": 14, "name": "14 - FECHAS", - "count": 153 + "count": 154 }, { "order": 15, "name": "12 - JSON Y XML", - "count": 152 + "count": 153 }, { "order": 16, "name": "16 - EXPRESIONES REGULARES", - "count": 148 + "count": 149 }, { "order": 17, "name": "15 - ASINCRON\u00cdA", - "count": 146 + "count": 147 }, { "order": 18, "name": "17 - ITERACIONES", - "count": 138 + "count": 139 }, { "order": 19, "name": "18 - CONJUNTOS", - "count": 136 + "count": 137 }, { "order": 20, "name": "19 - ENUMERACIONES", - "count": 122 + "count": 123 }, { "order": 21, "name": "20 - PETICIONES HTTP", - "count": 118 + "count": 119 }, { "order": 22, "name": "21 - CALLBACKS", - "count": 108 + "count": 109 }, { "order": 23, "name": "22 - FUNCIONES DE ORDEN SUPERIOR", - "count": 101 + "count": 102 }, { "order": 24, "name": "23 - SINGLETON", - "count": 96 + "count": 97 }, { "order": 25, "name": "24 - DECORADORES", - "count": 87 + "count": 88 }, { "order": 26, "name": "25 - LOGS", - "count": 83 + "count": 84 }, { "order": 27, "name": "26 - SOLID SRP", - "count": 81 + "count": 82 }, { "order": 28, "name": "27 - SOLID OCP", - "count": 76 + "count": 77 }, { "order": 29, "name": "28 - SOLID LSP", - "count": 69 + "count": 70 }, { "order": 30, "name": "29 - SOLID ISP", - "count": 67 + "count": 68 }, { "order": 31, "name": "32 - BATALLA DEADPOOL Y WOLVERINE", - "count": 65 + "count": 66 }, { "order": 32, "name": "30 - SOLID DIP", - "count": 61 + "count": 62 }, { "order": 33, "name": "33 - RESCATANDO A MICKEY", - "count": 57 + "count": 58 }, { "order": 34, "name": "35 - REPARTIENDO LOS ANILLOS DE PODER", - "count": 55 + "count": 56 }, { "order": 35, "name": "31 - SIMULADOR JUEGOS OL\u00cdMPICOS", - "count": 55 + "count": 56 }, { "order": 36, "name": "36 - EL SOMBRERO SELECCIONADOR", - "count": 54 + "count": 55 }, { "order": 37, "name": "38 - MOUREDEV PRO", - "count": 54 + "count": 55 }, { "order": 38, "name": "42 - TORNEO DRAGON BALL", - "count": 49 + "count": 50 }, { "order": 39, "name": "37 - OASIS VS LINKIN PARK", - "count": 48 + "count": 49 }, { "order": 40, "name": "34 - \u00c1RBOL GENEAL\u00d3GICO LA CASA DEL DRAG\u00d3N", - "count": 47 + "count": 48 }, { "order": 41, "name": "41 - CAMISETA RAR", - "count": 47 + "count": 48 }, { "order": 42, "name": "39 - BATMAN DAY", - "count": 38 + "count": 39 }, { "order": 43, "name": "47 - CALENDARIO DE ADVIENTO", - "count": 36 + "count": 37 }, { "order": 44, "name": "40 - FORTNITE RUBIUS CUP", - "count": 35 + "count": 36 }, { "order": 45, "name": "48 - \u00c1RBOL DE NAVIDAD", - "count": 34 + "count": 35 }, { "order": 46, "name": "43 - GIT GITHUB CLI", - "count": 34 + "count": 35 }, { "order": 47, "name": "49 - EL ALMAC\u00c9N DE PAP\u00c1 NOEL", - "count": 34 + "count": 35 }, { "order": 48, "name": "46 - X VS BLUESKY", - "count": 33 + "count": 34 }, { "order": 49, "name": "45 - GITHUB OCTOVERSE", - "count": 33 + "count": 34 }, { "order": 50, "name": "44 - CUENTA ATR\u00c1S MOUREDEV PRO", - "count": 29 + "count": 30 }, { "order": 51, "name": "50 - PLANIFICADOR DE OBJETIVOS DE A\u00d1O NUEVO", - "count": 12 + "count": 16 } ], "languages_ranking": [ { "order": 1, "name": "python", - "count": 3672, - "percentage": 41.67 + "count": 3674, + "percentage": 41.44 }, { "order": 2, "name": "javascript", - "count": 1755, - "percentage": 19.92 + "count": 1807, + "percentage": 20.38 }, { "order": 3, "name": "java", "count": 910, - "percentage": 10.33 + "percentage": 10.26 }, { "order": 4, "name": "typescript", "count": 477, - "percentage": 5.41 + "percentage": 5.38 }, { "order": 5, "name": "c#", "count": 340, - "percentage": 3.86 + "percentage": 3.83 }, { "order": 6, "name": "go", "count": 248, - "percentage": 2.81 + "percentage": 2.8 }, { "order": 7, "name": "kotlin", "count": 243, - "percentage": 2.76 + "percentage": 2.74 }, { "order": 8, "name": "php", "count": 216, - "percentage": 2.45 + "percentage": 2.44 }, { "order": 9, "name": "swift", "count": 171, - "percentage": 1.94 + "percentage": 1.93 }, { "order": 10, "name": "c++", "count": 148, - "percentage": 1.68 + "percentage": 1.67 }, { "order": 11, "name": "rust", "count": 128, - "percentage": 1.45 + "percentage": 1.44 }, { "order": 12, "name": "c", "count": 78, - "percentage": 0.89 + "percentage": 0.88 }, { "order": 13, @@ -349,7 +349,7 @@ "order": 15, "name": "bash", "count": 49, - "percentage": 0.56 + "percentage": 0.55 }, { "order": 16, @@ -361,7 +361,7 @@ "order": 17, "name": "ocaml", "count": 34, - "percentage": 0.39 + "percentage": 0.38 }, { "order": 18, @@ -577,15 +577,15 @@ "users_ranking": [ { "order": 1, - "name": "miguelex", - "count": 221, - "languages": 15 + "name": "kenysdev", + "count": 255, + "languages": 5 }, { "order": 2, - "name": "kenysdev", - "count": 204, - "languages": 4 + "name": "miguelex", + "count": 221, + "languages": 15 }, { "order": 3, @@ -602,7 +602,7 @@ { "order": 5, "name": "hozlucas28", - "count": 140, + "count": 141, "languages": 3 }, { @@ -739,13 +739,13 @@ }, { "order": 28, - "name": "mouredev", - "count": 50, + "name": "rauldoezon", + "count": 51, "languages": 1 }, { "order": 29, - "name": "rauldoezon", + "name": "mouredev", "count": 50, "languages": 1 }, @@ -8905,24 +8905,30 @@ }, { "order": 1389, - "name": "tilordqwerty", + "name": "edisonlmg", "count": 1, "languages": 1 }, { "order": 1390, - "name": "rawc1nnamon", + "name": "tilordqwerty", "count": 1, "languages": 1 }, { "order": 1391, - "name": "luism95", + "name": "rawc1nnamon", "count": 1, "languages": 1 }, { "order": 1392, + "name": "luism95", + "count": 1, + "languages": 1 + }, + { + "order": 1393, "name": "santyjl44", "count": 1, "languages": 1 From a6b137ed9c66620f0d360f08749f2819f2aa2ed6 Mon Sep 17 00:00:00 2001 From: Hyromy Date: Sat, 28 Dec 2024 19:28:41 -0600 Subject: [PATCH 084/104] #20 - Python --- Roadmap/20 - PETICIONES HTTP/python/Hyromy.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Roadmap/20 - PETICIONES HTTP/python/Hyromy.py diff --git a/Roadmap/20 - PETICIONES HTTP/python/Hyromy.py b/Roadmap/20 - PETICIONES HTTP/python/Hyromy.py new file mode 100644 index 0000000000..186aadf22a --- /dev/null +++ b/Roadmap/20 - PETICIONES HTTP/python/Hyromy.py @@ -0,0 +1,51 @@ +import requests # pip install requests + +YT_URL = "https://www.youtube.com" + +try: + response = requests.get(YT_URL) + if response.status_code == 200: # 200 -> OK + print("Petición exitosa!") + print(response.text[:128]) # Imprimir los primeros 128 caracteres de la pagina + +except requests.exceptions.RequestException as e: + print(e) +print("\n") + +# ---- DIFICULTAD EXTRA ---- + +pokeAPI = "https://pokeapi.co/api/v2/pokemon/" + +busqueda = input("Ingrese el nombre o id de un pokemon => ") + +try: + response = requests.get(pokeAPI + busqueda) + response.raise_for_status() + data = response.json() + +except Exception as e: + print(e) + +else: + print("Nombre: " + data["name"]) + print("ID: " + str(data["id"])) + print("Peso: " + str(data["weight"])) + print("Altura: " + str(data["height"])) + print("Tipos: " + ", ".join([tipo["type"]["name"] for tipo in data["types"]])) + + print("\n") + + especies_data = requests.get(data["species"]["url"]).json() + cadena_evolucion_data = requests.get(especies_data["evolution_chain"]["url"]).json() + + evoluciones = [cadena_evolucion_data["chain"]["species"]["name"]] + ev = cadena_evolucion_data["chain"]["evolves_to"] + is_evolve = ev != [] + + while is_evolve: + evoluciones.append(ev[0]["species"]["name"]) + ev = ev[0]["evolves_to"] + is_evolve = ev != [] + + print("Cadena de evolución: " + " -> ".join(evoluciones)) + print("Aparicion en juegos: " + ", ".join([i["version"]["name"] for i in data["game_indices"]])) \ No newline at end of file From c9b288b84e60356e757893c9a4f889783935c855 Mon Sep 17 00:00:00 2001 From: Jocelyn Flores <96458025+jossfullstack@users.noreply.github.com> Date: Sat, 28 Dec 2024 22:56:57 -0600 Subject: [PATCH 085/104] Create jossfullstack.java EJERCICIO #00 - JAVA --- .../java/00/python/jossfullstack.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/00/python/jossfullstack.java diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/00/python/jossfullstack.java b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/00/python/jossfullstack.java new file mode 100644 index 0000000000..69ea609b88 --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/00/python/jossfullstack.java @@ -0,0 +1,57 @@ + +public class cero_Cero { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + //Sitio web oficial: + // https://www.java.com/es/ + + /* + * https://www.java.com/es/ + */ + + //Variable + //Tipo --->> + Nombre de la variable ´; + String tazo; + + // Constante::::::: + double pi = 3.14; + + //Variables con los tipos de datos primitivos::::::: + + byte ochobites; + short dieciseisbites; + int treintaydosbites; + long sesentaycuatrobites; + float treintaydosbotes_flotantecondobleprecisionde64bites; + boolean trueorfalse; + char caracterunidoce; + + //CONSTANTES RESPRESENTACION + + byte ochobites; + short dieciseisbites; + int treintaydosbites; + long sesentaycuatrobites; + float treintaydosbotes_flotantecondobleprecisionde64bites; + boolean trueorfalse; + char caracterunidoce; + + byte numeroMuyPequeño = 120; // Entero entre -128 e 127 + short numeroPequeño = 31465; // Entero entre -32768 y 32767 + int numero = 1000000; // Entero entre -2.147.483.648 y 2.147.483.647 + long numeroMasGrande = 2000000000L; // Entero entre -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807 + float decimalPequeño = 14.3333F; // Decimal de 4 bytes + boolean datoLogico = false; // Almacena valores true o false + char caracter = '@'; // Caracteres unicode de 2 bytes + double decimal = 12.1234657; // Decimal de 8 bytes + + + System.out.println("¡Hola, Java!!"); + + + + } + +} From a92d9a35a62d7f6a8c89c82fc82006e769b6a148 Mon Sep 17 00:00:00 2001 From: Nonamed Date: Sun, 29 Dec 2024 16:13:43 +1100 Subject: [PATCH 086/104] #00 - javascript --- .../javascript/1Nonamed.js | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/javascript/1Nonamed.js diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/javascript/1Nonamed.js b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/javascript/1Nonamed.js new file mode 100644 index 0000000000..1ea8a74ca7 --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/javascript/1Nonamed.js @@ -0,0 +1,25 @@ +// Documentación oficial de JavaScript : https://developer.mozilla.org/en-US/docs/Web/JavaScript + +// Diferentes sintaxis para crear comentarios en JS + +// Una línea: Comienza con '//' y sólo comenta la linea actual desde donde se escribe. + +/* Múltiples líneas: Comentarios extensos. +Comienzan por "/*" y comentará todo el texto que escribamos hasta que cerremos el comentario con un */ + +// Variables y Constantes +let name = 'Juan' +const ten = 10 + +// Datos primitivos +let lastname = 'López' // String +let age = 25 // Number +let isMale = true // Boolean +let address // Undefined +let stockAvailble = null // null +let myBigInt = 2343n // BigInt + +let mySymbol = Symbol('unique') // Symbol +// Se utilizan para añadir llaves de propiedades únicas a un objeto que no sean iguales a las claves que cualquier otro código pueda añadir al objeto, y que están ocultas de otro código utilice normalmente para acceder al objeto. + +console.log("Hola, JavaScript") \ No newline at end of file From c9b0ad50ff0e6071849df656268c6408f839e694 Mon Sep 17 00:00:00 2001 From: Nonamed Date: Sun, 29 Dec 2024 19:05:54 +1100 Subject: [PATCH 087/104] add assigment, arithmetic and comparison operators --- .../javascript/1Nonamed.js | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js diff --git a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js new file mode 100644 index 0000000000..07061194f2 --- /dev/null +++ b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js @@ -0,0 +1,69 @@ +// OPERADORES + +console.log(`------------------ Asignación ------------------`); +let num = 10; +console.log(`num: ${num}\n`); + +// Asignación suma +console.log(`num: ${num} || num += 2 => ${(num += 2)}`); +// Asignación resta +console.log(`num: ${num} || num -= 1 => ${(num -= 1)}`); +// Asignación multiplicación +console.log(`num: ${num} || num *= 2 => ${(num *= 2)}`); +// Asignación exponencial +console.log(`num: ${num} || num **= 2 => ${(num **= 2)}`); +// Asignación división +console.log(`num: ${num} || num /= 2 => ${(num /= 2)}`); +// Asignación residuo +console.log(`num: ${num} || num %= 2 => ${(num %= 2)}\n`); + +console.log(`------------------ Comparación ------------------`); +let num1 = 20; +let num2 = 27; +console.log(`num1: ${num1} num2: ${num2}\n`); + +// Igual +console.log(`num1 == num2? => ${num1 == num2}`); +console.log( + `'27' == num2? => ${"27" == num2} | Convierte tipos, comparación débil` +); +// No igual +console.log(`num1 != num2? => ${num1 != num2}`); +console.log( + `'27' != num2? => ${"27" != num2} | Convierte tipos, comparación débil` +); +// Estricta +console.log(`num1 === num2? => ${num1 === num2}`); +console.log( + `'27' === num2? => ${"27" === num2} | No convierte tipos, comparación fuerte` +); +// No igual estricto +console.log(`num1 !== num2? => ${num1 !== num2}`); +console.log( + `'27' !== num2? => ${"27" !== num2} | No convierte tipos, comparación fuerte` +); +// Mayor que +console.log(`num1 > num2? => ${num1 > num2}`); +// Mayor o igual que +console.log(`num1 >= num2? => ${num1 >= num2}`); +// Menor que +console.log(`num1 < num2? => ${num1 < num2}`); +// Menor o igual que +console.log(`num1 <= num2? => ${num1 <= num2}`); + +console.log(`------------------ Aritméticos ------------------`); +let x = 2; +let y; +console.log(`x: ${x} y: ${y}\n`); +// Adicional a las operaciones +, -, *, **, / y %, JavaScript también tiene las siguientes operaciones: + +// Incrementar +console.log(`++x => x = ${x}; y = ${++x}`); +// Decrementar +console.log(`--x => x = ${x}; y = ${--x}`); +// Unary negation => Regresa la negación del operando +console.log(`x => -x || x = ${x} => -x = ${-x}`); +// Unary plus => Intenta convertir el operando en número +console.log(`+x => x || x = ${-x} => +x = ${+x}`); +console.log(`+'x' => x || x = '27' => +x = ${+'27'}`); +// Lógicos ------------------ From d3d08a4aaffa7d32477637e66ca91e0a091b094e Mon Sep 17 00:00:00 2001 From: Nonamed Date: Sun, 29 Dec 2024 22:47:42 +1100 Subject: [PATCH 088/104] add conditionals and loops --- .../javascript/1Nonamed.js | 99 ++++++++++++++++++- 1 file changed, 96 insertions(+), 3 deletions(-) diff --git a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js index 07061194f2..036cb0476f 100644 --- a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js +++ b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js @@ -52,10 +52,10 @@ console.log(`num1 < num2? => ${num1 < num2}`); console.log(`num1 <= num2? => ${num1 <= num2}`); console.log(`------------------ Aritméticos ------------------`); +// Adicional a las operaciones +, -, *, **, / y %, JavaScript también tiene las siguientes operaciones: let x = 2; let y; console.log(`x: ${x} y: ${y}\n`); -// Adicional a las operaciones +, -, *, **, / y %, JavaScript también tiene las siguientes operaciones: // Incrementar console.log(`++x => x = ${x}; y = ${++x}`); @@ -65,5 +65,98 @@ console.log(`--x => x = ${x}; y = ${--x}`); console.log(`x => -x || x = ${x} => -x = ${-x}`); // Unary plus => Intenta convertir el operando en número console.log(`+x => x || x = ${-x} => +x = ${+x}`); -console.log(`+'x' => x || x = '27' => +x = ${+'27'}`); -// Lógicos ------------------ +console.log(`+'x' => x || x = '27' => +x = ${+"27"}\n`); + +console.log(`------------------ Lógicos ------------------`); +const a = 10; +const b = 15; +console.log(`a: ${a} b: ${b}\n`); + +// Y (and -- &&) +console.log(`a < b && b >= 15 => ${a < b && b >= 15}`); +// O (Or -- ||) +console.log(`a < b || b > 15 => ${a < b || b > 15}`); +// No (Not -- !) +console.log(`!(a < b && b >= 15) => ${!(a < b && b >= 15)}`); +console.log(`!!(a < b && b >= 15) => ${!!(a < b && b >= 15)}`); // Negación doble +// Nullish coalescing operator (??) => Devuelve el valor de la derecha sí el de la izquierda es null o undefined +console.log(`null ?? a => ${null && a}`); +console.log(`10 ?? a => ${10 && a}`); +console.log(`10 ?? undefined => ${10 && undefined}`); + +console.log(`------------------ Strings ------------------`); +let msj = "Hello,"; +msj += " World!"; + +console.log(msj); + +console.log(`\n------------------ Ternary ------------------`); +let age = 28; +console.log(`age: ${age}\n`); + +console.log(`${age > 20 ? "Allowed to enter" : "Not allowed to enter"}`); + +// ESTRUCTURAS DE CONTROL + +console.log(`\n------------------ Condicionales: If Else ------------------`); +let grade = 3; +let color = "red"; +console.log(`grade: ${grade} color: ${color}\n`); + +if (grade >= 3) console.log("Aprobaste"); + +if (color === "yellow") { + console.log("El color es el mismo"); +} else { + console.log("El color no es el mismo"); +} + +console.log(`\n------------------ Condicionales: Switch ------------------`); +let grade2 = 2; +console.log(`grade: ${grade2}\n`); + +switch (grade2) { + case 5: + finalGrade = "Excelente"; + break; + case 4: + finalGrade = "Sobresaliente"; + break; + case 3: + finalGrade = "Suficiente"; + break; + case 2: + case 1: + case 0: + finalGrade = "Insuficiente"; + break; + + default: + finalGrade = "Nota erronea"; + break; +} +console.log(`Mi nota final es ${finalGrade}\n`); + +console.log(`------------------ Bucles: While ------------------`); +let i = 0; + +while (i <= 3) { + console.log(`While => i: ${i}`); + i = i + 1; +} + +console.log("\ndo While from here:"); +// do while se ejecuta al menos UNA vez +do { + console.log(`do While => i: ${i}`); + i = i + 1; +} while (i < 8); + +console.log(`------------------ Bucles: For ------------------`); +for (let j = 0; j < 3; j++) { + console.log(`Log #${j} from loop for (Incremental)\n`) +} + +for (let k = 5; k > 2; k--){ + console.log(`Log #${k} from loop for (Decremental)`) +} \ No newline at end of file From 8bf5a7274f9a8495a3b6a3b5112918740130f8ae Mon Sep 17 00:00:00 2001 From: Nonamed Date: Sun, 29 Dec 2024 23:37:39 +1100 Subject: [PATCH 089/104] solve extra exercise --- .../javascript/1Nonamed.js | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js index 036cb0476f..d96bff967c 100644 --- a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js +++ b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js @@ -154,9 +154,33 @@ do { console.log(`------------------ Bucles: For ------------------`); for (let j = 0; j < 3; j++) { - console.log(`Log #${j} from loop for (Incremental)\n`) + console.log(`Log #${j} from loop for (Incremental)\n`); } -for (let k = 5; k > 2; k--){ - console.log(`Log #${k} from loop for (Decremental)`) -} \ No newline at end of file +for (let k = 5; k > 2; k--) { + console.log(`Log #${k} from loop for (Decremental)`); +} + +console.log(`\n------------------ Extra ------------------`); +// Crea un programa que imprima por consola todos los números comprendidos entre 10 y 55 (incluidos), pares, y que no son ni el 16 ni múltiplos de 3. + +const arr = []; +const arrMultiplesOf3 = []; + +for (let i = 10; i <= 55; i++) { + if (i % 3 === 0) { + arrMultiplesOf3.push(i); + } +} +console.log("Multiples of 3:"); +console.log(arrMultiplesOf3); + +for (let i = 10; i <= 55; i++) { + if (i % 2 === 0 && i !== 16 && i % 3 !== 0) { + arr.push(i); + } +} + + +console.log('\nFinal Array:') +console.log(arr); From 51d452f9071e861a32a24de718ed5d56d37ec456 Mon Sep 17 00:00:00 2001 From: Nonamed Date: Mon, 30 Dec 2024 00:00:42 +1100 Subject: [PATCH 090/104] #01 - JavaScript --- .../javascript/1Nonamed.js | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js diff --git a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js new file mode 100644 index 0000000000..d96bff967c --- /dev/null +++ b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/1Nonamed.js @@ -0,0 +1,186 @@ +// OPERADORES + +console.log(`------------------ Asignación ------------------`); +let num = 10; +console.log(`num: ${num}\n`); + +// Asignación suma +console.log(`num: ${num} || num += 2 => ${(num += 2)}`); +// Asignación resta +console.log(`num: ${num} || num -= 1 => ${(num -= 1)}`); +// Asignación multiplicación +console.log(`num: ${num} || num *= 2 => ${(num *= 2)}`); +// Asignación exponencial +console.log(`num: ${num} || num **= 2 => ${(num **= 2)}`); +// Asignación división +console.log(`num: ${num} || num /= 2 => ${(num /= 2)}`); +// Asignación residuo +console.log(`num: ${num} || num %= 2 => ${(num %= 2)}\n`); + +console.log(`------------------ Comparación ------------------`); +let num1 = 20; +let num2 = 27; +console.log(`num1: ${num1} num2: ${num2}\n`); + +// Igual +console.log(`num1 == num2? => ${num1 == num2}`); +console.log( + `'27' == num2? => ${"27" == num2} | Convierte tipos, comparación débil` +); +// No igual +console.log(`num1 != num2? => ${num1 != num2}`); +console.log( + `'27' != num2? => ${"27" != num2} | Convierte tipos, comparación débil` +); +// Estricta +console.log(`num1 === num2? => ${num1 === num2}`); +console.log( + `'27' === num2? => ${"27" === num2} | No convierte tipos, comparación fuerte` +); +// No igual estricto +console.log(`num1 !== num2? => ${num1 !== num2}`); +console.log( + `'27' !== num2? => ${"27" !== num2} | No convierte tipos, comparación fuerte` +); +// Mayor que +console.log(`num1 > num2? => ${num1 > num2}`); +// Mayor o igual que +console.log(`num1 >= num2? => ${num1 >= num2}`); +// Menor que +console.log(`num1 < num2? => ${num1 < num2}`); +// Menor o igual que +console.log(`num1 <= num2? => ${num1 <= num2}`); + +console.log(`------------------ Aritméticos ------------------`); +// Adicional a las operaciones +, -, *, **, / y %, JavaScript también tiene las siguientes operaciones: +let x = 2; +let y; +console.log(`x: ${x} y: ${y}\n`); + +// Incrementar +console.log(`++x => x = ${x}; y = ${++x}`); +// Decrementar +console.log(`--x => x = ${x}; y = ${--x}`); +// Unary negation => Regresa la negación del operando +console.log(`x => -x || x = ${x} => -x = ${-x}`); +// Unary plus => Intenta convertir el operando en número +console.log(`+x => x || x = ${-x} => +x = ${+x}`); +console.log(`+'x' => x || x = '27' => +x = ${+"27"}\n`); + +console.log(`------------------ Lógicos ------------------`); +const a = 10; +const b = 15; +console.log(`a: ${a} b: ${b}\n`); + +// Y (and -- &&) +console.log(`a < b && b >= 15 => ${a < b && b >= 15}`); +// O (Or -- ||) +console.log(`a < b || b > 15 => ${a < b || b > 15}`); +// No (Not -- !) +console.log(`!(a < b && b >= 15) => ${!(a < b && b >= 15)}`); +console.log(`!!(a < b && b >= 15) => ${!!(a < b && b >= 15)}`); // Negación doble +// Nullish coalescing operator (??) => Devuelve el valor de la derecha sí el de la izquierda es null o undefined +console.log(`null ?? a => ${null && a}`); +console.log(`10 ?? a => ${10 && a}`); +console.log(`10 ?? undefined => ${10 && undefined}`); + +console.log(`------------------ Strings ------------------`); +let msj = "Hello,"; +msj += " World!"; + +console.log(msj); + +console.log(`\n------------------ Ternary ------------------`); +let age = 28; +console.log(`age: ${age}\n`); + +console.log(`${age > 20 ? "Allowed to enter" : "Not allowed to enter"}`); + +// ESTRUCTURAS DE CONTROL + +console.log(`\n------------------ Condicionales: If Else ------------------`); +let grade = 3; +let color = "red"; +console.log(`grade: ${grade} color: ${color}\n`); + +if (grade >= 3) console.log("Aprobaste"); + +if (color === "yellow") { + console.log("El color es el mismo"); +} else { + console.log("El color no es el mismo"); +} + +console.log(`\n------------------ Condicionales: Switch ------------------`); +let grade2 = 2; +console.log(`grade: ${grade2}\n`); + +switch (grade2) { + case 5: + finalGrade = "Excelente"; + break; + case 4: + finalGrade = "Sobresaliente"; + break; + case 3: + finalGrade = "Suficiente"; + break; + case 2: + case 1: + case 0: + finalGrade = "Insuficiente"; + break; + + default: + finalGrade = "Nota erronea"; + break; +} +console.log(`Mi nota final es ${finalGrade}\n`); + +console.log(`------------------ Bucles: While ------------------`); +let i = 0; + +while (i <= 3) { + console.log(`While => i: ${i}`); + i = i + 1; +} + +console.log("\ndo While from here:"); +// do while se ejecuta al menos UNA vez +do { + console.log(`do While => i: ${i}`); + i = i + 1; +} while (i < 8); + +console.log(`------------------ Bucles: For ------------------`); +for (let j = 0; j < 3; j++) { + console.log(`Log #${j} from loop for (Incremental)\n`); +} + +for (let k = 5; k > 2; k--) { + console.log(`Log #${k} from loop for (Decremental)`); +} + +console.log(`\n------------------ Extra ------------------`); +// Crea un programa que imprima por consola todos los números comprendidos entre 10 y 55 (incluidos), pares, y que no son ni el 16 ni múltiplos de 3. + +const arr = []; +const arrMultiplesOf3 = []; + +for (let i = 10; i <= 55; i++) { + if (i % 3 === 0) { + arrMultiplesOf3.push(i); + } +} +console.log("Multiples of 3:"); +console.log(arrMultiplesOf3); + +for (let i = 10; i <= 55; i++) { + if (i % 2 === 0 && i !== 16 && i % 3 !== 0) { + arr.push(i); + } +} + + +console.log('\nFinal Array:') +console.log(arr); From 66ef692f4b851cb5f79979d685048684c6e1a6c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Gallego?= <75795616+kontroldev@users.noreply.github.com> Date: Sun, 29 Dec 2024 18:34:36 +0100 Subject: [PATCH 091/104] Rename devcherry.py to devcherry1.py --- Roadmap/10 - EXCEPCIONES/c#/{devcherry.py => devcherry1.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Roadmap/10 - EXCEPCIONES/c#/{devcherry.py => devcherry1.py} (100%) diff --git a/Roadmap/10 - EXCEPCIONES/c#/devcherry.py b/Roadmap/10 - EXCEPCIONES/c#/devcherry1.py similarity index 100% rename from Roadmap/10 - EXCEPCIONES/c#/devcherry.py rename to Roadmap/10 - EXCEPCIONES/c#/devcherry1.py From aba2ea7db1603abeae3d72e57253412670108a0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ad=C3=A1n?= Date: Sun, 29 Dec 2024 13:04:28 -0600 Subject: [PATCH 092/104] #50 - C++ --- .../c++/hectorio23.cpp" | 222 +++++++++++++++++ .../javascript/hectorio23.js" | 224 ++++++++++++++++++ .../python/hectorio23.py" | 189 +++++++++++++++ 3 files changed, 635 insertions(+) create mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/c++/hectorio23.cpp" create mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/hectorio23.js" create mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/hectorio23.py" diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/c++/hectorio23.cpp" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/c++/hectorio23.cpp" new file mode 100644 index 0000000000..9265ac4dc2 --- /dev/null +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/c++/hectorio23.cpp" @@ -0,0 +1,222 @@ +// Autor: Héctor Adán +// GitHub: https://github.com/hectorio23 + +#include +#include +#include +#include +#include +#include +#include +#include + +// NOTE: COMPILE the program useing the following instruction: +// g++ -o run hectorio23.cpp -luuid + + +// Goal class represents a single goal with all necessary attributes. +class Goal { +private: + std::string id; + std::string description; + int amount; + int monthsLimit; + std::string units; + + std::string generateUUID() { + uuid_t uuid; + char uuidStr[37]; + uuid_generate(uuid); + uuid_unparse(uuid, uuidStr); + return std::string(uuidStr); + } + +public: + Goal(const std::string& desc, int amt, int months, const std::string& unit) + : description(desc), amount(amt), monthsLimit(months), units(unit), id(generateUUID()) { + if (monthsLimit < 1 || monthsLimit > 12) { + throw std::out_of_range("Months limit must be between 1 and 12."); + } + } + + const std::string& getId() const { return id; } + const std::string& getDescription() const { return description; } + int getAmount() const { return amount; } + int getMonthsLimit() const { return monthsLimit; } + const std::string& getUnits() const { return units; } +}; + +// YearGoals manages a collection of goals and their monthly plans. +class YearGoals { +private: + std::vector> goals; + std::map, int>>> plan; + + const std::vector months = { + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December"}; + + void initializePlan() { + for (const auto& month : months) { + plan[month] = {}; + } + } + +public: + YearGoals() { + initializePlan(); + } + + bool addGoal(const std::shared_ptr& goal) { + if (goals.size() >= 10) { + std::cerr << "Maximum number of goals reached." << std::endl; + return false; + } + + goals.push_back(goal); + distributeGoalAcrossMonths(goal); + return true; + } + + void distributeGoalAcrossMonths(const std::shared_ptr& goal) { + int remainingAmount = goal->getAmount(); + int monthsLimit = goal->getMonthsLimit(); + for (size_t i = 0; i < months.size() && remainingAmount > 0 && monthsLimit > 0; ++i, --monthsLimit) { + int monthlyAmount = std::min(remainingAmount, 1); + plan[months[i]].emplace_back(goal, monthlyAmount); + remainingAmount -= monthlyAmount; + } + } + + void displayGoals() const { + if (goals.empty()) { + std::cout << "No goals added yet.\n"; + return; + } + + for (const auto& goal : goals) { + std::cout << "ID: " << goal->getId() << "\n" + << "Description: " << goal->getDescription() << "\n" + << "Amount: " << goal->getAmount() << "\n" + << "Units: " << goal->getUnits() << "\n" + << "Months Limit: " << goal->getMonthsLimit() << "\n\n"; + } + } + + void displayPlan() const { + for (const auto& month : months) { + std::cout << month << ":\n"; + const auto& goalsForMonth = plan.at(month); + for (size_t i = 0; i < goalsForMonth.size(); ++i) { + const auto& [goal, amount] = goalsForMonth[i]; + std::cout << " [ ] " << i + 1 << ". " << goal->getDescription() + << " (" << amount << " " << goal->getUnits() << "/month). Total: " + << goal->getAmount() << ".\n"; + } + std::cout << "\n"; + } + } + + void savePlanToFile(const std::string& filePath) const { + std::ofstream file(filePath); + if (!file.is_open()) { + std::cerr << "Failed to open file: " << filePath << std::endl; + return; + } + + for (const auto& month : months) { + file << month << ":\n"; + const auto& goalsForMonth = plan.at(month); + for (size_t i = 0; i < goalsForMonth.size(); ++i) { + const auto& [goal, amount] = goalsForMonth[i]; + file << " [ ] " << i + 1 << ". " << goal->getDescription() + << " (" << amount << " " << goal->getUnits() << "/month). Total: " + << goal->getAmount() << ".\n"; + } + file << "\n"; + } + + file.close(); + std::cout << "Plan saved to " << filePath << "\n"; + } +}; + +void displayMenu() { + std::cout << "\nNew Year Goals Manager\n" + << "========================\n" + << "1. Add a Goal\n" + << "2. View Goals\n" + << "3. View Detailed Plan\n" + << "4. Save Plan to File\n" + << "0. Exit\n" + << "Select an option: "; +} + +int main() { + YearGoals yearGoals; + int option; + + do { + displayMenu(); + std::cin >> option; + std::cin.ignore(); + + switch (option) { + case 1: { + std::string description, units; + int amount, monthsLimit; + + std::cout << "Enter description: "; + std::getline(std::cin, description); + + std::cout << "Enter amount: "; + std::cin >> amount; + + std::cout << "Enter months limit (1-12): "; + std::cin >> monthsLimit; + while (monthsLimit < 1 || monthsLimit > 12) { + std::cout << "Invalid input. Enter months limit (1-12): "; + std::cin >> monthsLimit; + } + + std::cout << "Enter units: "; + std::cin.ignore(); + std::getline(std::cin, units); + + try { + auto goal = std::make_shared(description, amount, monthsLimit, units); + if (yearGoals.addGoal(goal)) { + std::cout << "Goal added successfully.\n"; + } else { + std::cout << "Failed to add goal. Maximum limit reached.\n"; + } + } catch (const std::exception& e) { + std::cerr << e.what() << "\n"; + } + + break; + } + case 2: + yearGoals.displayGoals(); + break; + case 3: + yearGoals.displayPlan(); + break; + case 4: { + std::string filePath; + std::cout << "Enter file path to save plan: "; + std::cin.ignore(); + std::getline(std::cin, filePath); + yearGoals.savePlanToFile(filePath); + break; + } + case 0: + std::cout << "Exiting program. Goodbye!\n"; + break; + default: + std::cout << "Invalid option. Please try again.\n"; + } + } while (option != 0); + + return 0; +} diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/hectorio23.js" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/hectorio23.js" new file mode 100644 index 0000000000..40ab44e3da --- /dev/null +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/hectorio23.js" @@ -0,0 +1,224 @@ +// Autor: Héctor Adán +// GitHub: https://github.com/hectorio23 + +const { v4: uuidv4 } = require('uuid'); +const fs = require('fs').promises; + + +/** + * Represents a goal with a specific amount, description, unit, and time limit. + */ +class Goal { + static MAX_MONTHS_LIMIT = 12; + + constructor({ amount, description, monthsLimit, units }) { + if (monthsLimit < 1 || monthsLimit > Goal.MAX_MONTHS_LIMIT) { + throw new Error(`Months limit must be between 1 and ${Goal.MAX_MONTHS_LIMIT}.`); + } + + this.id = uuidv4(); + this.amount = amount; + this.description = description; + this.monthsLimit = monthsLimit; + this.units = units; + } + + /** + * Generates a year plan based on the goal's properties. + * @returns {Object} The year plan for the goal. + */ + toYearPlan() { + const yearPlan = Goal.initializeYearPlan(); + let remainingAmount = this.amount; + let monthsAvailable = this.monthsLimit; + + for (const month of Object.keys(yearPlan)) { + if (remainingAmount === 0 || monthsAvailable === 0) break; + + const monthlyAmount = Math.min(remainingAmount, 1); // Distribute one unit per month + yearPlan[month].push({ goal: this, amount: monthlyAmount }); + + remainingAmount -= monthlyAmount; + monthsAvailable--; + } + + return yearPlan; + } + + static initializeYearPlan() { + return { + january: [], + february: [], + march: [], + april: [], + may: [], + june: [], + july: [], + august: [], + september: [], + october: [], + november: [], + december: [] + }; + } +} + +/** + * Manages a collection of goals and their yearly plans. + */ +class YearGoals { + static MAX_GOALS = 10; + + constructor() { + this.goals = []; + this.plan = Goal.initializeYearPlan(); + } + + /** + * Adds a new goal to the collection and updates the yearly plan. + * @param {Goal} goal - The goal to be added. + * @returns {boolean} True if the goal was added, false otherwise. + */ + addGoal(goal) { + if (this.goals.length >= YearGoals.MAX_GOALS) return false; + + if (this.goals.some(g => g.id === goal.id)) return false; + + this.goals.push(goal); + this.updatePlan(goal.toYearPlan()); + return true; + } + + /** + * Removes a goal from the collection and updates the yearly plan. + * @param {string} goalId - The ID of the goal to remove. + * @returns {boolean} True if the goal was removed, false otherwise. + */ + removeGoal(goalId) { + const goalIndex = this.goals.findIndex(goal => goal.id === goalId); + if (goalIndex === -1) return false; + + this.goals.splice(goalIndex, 1); + this.rebuildPlan(); + return true; + } + + /** + * Saves the yearly plan to a file. + * @param {string} filePath - The path to save the plan. + * @returns {Promise} + */ + async savePlan(filePath) { + const data = Object.entries(this.plan) + .map(([month, goals]) => { + const goalsText = goals + .map(({ goal, amount }, index) => `${index + 1}. ${goal.description} (${amount} ${goal.units}/month)`) + .join('\n'); + + return `${month.toUpperCase()}\n${goalsText}\n`; + }) + .join('\n'); + + await fs.writeFile(filePath, data, 'utf-8'); + } + + /** + * Updates the yearly plan with a new goal's plan. + * @param {Object} goalPlan - The plan of the goal to add. + */ + updatePlan(goalPlan) { + for (const [month, goals] of Object.entries(goalPlan)) { + this.plan[month].push(...goals); + } + } + + /** + * Rebuilds the yearly plan based on current goals. + */ + rebuildPlan() { + this.plan = Goal.initializeYearPlan(); + this.goals.forEach(goal => this.updatePlan(goal.toYearPlan())); + } +} + + +const yearGoals = new YearGoals(); + +const operations = ` +Available Operations: +1 - Add a new goal +2 - Remove a goal +3 - Show all goals +4 - Show yearly plan +5 - Save plan to file +0 - Exit +`; + +const promptUser = async () => { + console.log(operations); + + const userInput = (await import('readline/promises')).createInterface({ + input: process.stdin, + output: process.stdout + }); + + const choice = await userInput.question('Select an operation: '); + switch (choice) { + case '1': { + const amount = parseInt(await userInput.question('Enter goal amount: '), 10); + const description = await userInput.question('Enter goal description: '); + const monthsLimit = parseInt(await userInput.question('Enter months limit (1-12): '), 10); + const units = await userInput.question('Enter goal units: '); + + const goal = new Goal({ amount, description, monthsLimit, units }); + if (yearGoals.addGoal(goal)) { + console.log('Goal added successfully.'); + } else { + console.log('Failed to add goal. Maximum limit reached or duplicate goal.'); + } + break; + } + case '2': { + const goalId = await userInput.question('Enter the goal ID to remove: '); + if (yearGoals.removeGoal(goalId)) { + console.log('Goal removed successfully.'); + } else { + console.log('Goal not found.'); + } + break; + } + case '3': { + yearGoals.goals.forEach((goal, index) => { + console.log(`${index + 1}. ${goal.description} - ${goal.amount} ${goal.units} (ID: ${goal.id})`); + }); + break; + } + case '4': { + Object.entries(yearGoals.plan).forEach(([month, goals]) => { + console.log(`${month.toUpperCase()}:`); + goals.forEach(({ goal, amount }, index) => { + console.log(`${index + 1}. ${goal.description} (${amount} ${goal.units}/month)`); + }); + }); + break; + } + case '5': { + const filePath = await userInput.question('Enter file path to save the plan: '); + await yearGoals.savePlan(filePath); + console.log(`Plan saved to ${filePath}`); + break; + } + case '0': { + console.log('Exiting...'); + process.exit(0); + } + default: + console.log('Invalid choice.'); + } + + userInput.close(); + promptUser(); +}; + +// Start the CLI application +promptUser(); diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/hectorio23.py" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/hectorio23.py" new file mode 100644 index 0000000000..eb1b23a797 --- /dev/null +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/hectorio23.py" @@ -0,0 +1,189 @@ +# Autor: Héctor Adán +# GitHub: https://github.com/hectorio23 + +from datetime import datetime +from pathlib import Path +from typing import TypedDict, Union, TypeVar, Iterable, Callable +from uuid import UUID, uuid4 + +################################## +########## Data Types ############ +################################## + +class YearPlan(TypedDict): + """Represents a detailed plan for goals across the months of a year.""" + january: list[list[Union["Goal", int]]] + february: list[list[Union["Goal", int]]] + march: list[list[Union["Goal", int]]] + april: list[list[Union["Goal", int]]] + may: list[list[Union["Goal", int]]] + june: list[list[Union["Goal", int]]] + july: list[list[Union["Goal", int]]] + august: list[list[Union["Goal", int]]] + september: list[list[Union["Goal", int]]] + october: list[list[Union["Goal", int]]] + november: list[list[Union["Goal", int]]] + december: list[list[Union["Goal", int]]] + +################################### +######## Custom Exceptions ######## +################################### + +class MonthsOutOfRangeException(Exception): + """Exception raised when the month limit for a goal is out of valid range.""" + def __init__(self) -> None: + super().__init__("Months out of range. Valid range is 1 to 12.") + +################################### +########### Core Classes ########## +################################### + +class Goal: + """Represents an individual goal with its details and constraints.""" + + def __init__(self, *, amount: int, description: str, months_limit: int, units: str) -> None: + self.amount = amount + self.description = description + self.uid = uuid4() + self.units = units + + if months_limit < 1 or months_limit > self.max_months_limit(): + raise MonthsOutOfRangeException() + + self.months_limit = months_limit + + @staticmethod + def max_months_limit() -> int: + """Returns the maximum allowed months for a goal.""" + return 12 + + def to_monthly_plan(self) -> YearPlan: + """Generates a yearly plan for the goal based on its amount and months limit.""" + year_plan: YearPlan = {month: [] for month in YearPlan.__annotations__.keys()} + remaining_amount = self.amount + + for month in year_plan: + if remaining_amount <= 0: + break + + month_amount = min(remaining_amount, self.months_limit) + year_plan[month].append([self, month_amount]) + remaining_amount -= month_amount + + return year_plan + + +class YearGoals: + """Manages a collection of goals and their aggregated yearly plan.""" + + def __init__(self) -> None: + self.goals = [] + self.plan = {month: [] for month in YearPlan.__annotations__.keys()} + + @staticmethod + def max_goals() -> int: + """Returns the maximum number of goals allowed.""" + return 10 + + def add_goal(self, goal: Goal) -> None: + """Adds a new goal to the collection and updates the yearly plan.""" + if len(self.goals) >= self.max_goals(): + raise ValueError("Maximum number of goals reached.") + + self.goals.append(goal) + self._update_plan_with_goal(goal) + + def _update_plan_with_goal(self, goal: Goal) -> None: + """Incorporates a new goal into the existing yearly plan.""" + goal_plan = goal.to_monthly_plan() + + for month, tasks in goal_plan.items(): + self.plan[month].extend(tasks) + + def save_plan(self, file_path: str) -> None: + """Saves the yearly plan to a text file.""" + with open(file_path, "w", encoding="utf-8") as file: + for month, tasks in self.plan.items(): + file.write(f"{month.capitalize()}:\n") + for idx, (goal, amount) in enumerate(tasks): + file.write(f"[ ] {idx + 1}. {goal.description} ({amount} {goal.units}/month). Total: {goal.amount}.\n") + file.write("\n") + +#################################### +######## Utility Functions ######### +#################################### + +def get_user_input(prompt: str, validate: Callable[[str], bool] = lambda x: True) -> str: + """Prompts the user for input and validates the response.""" + while True: + response = input(prompt).strip() + if validate(response): + return response + print("Invalid input. Please try again.") + +#################################### +########## Main Program Loop ####### +#################################### + +def main() -> None: + """Main entry point for the Goal Management application.""" + year_goals = YearGoals() + + menu = ( + "\nGoal Management System\n" + "------------------------\n" + "1. Add a new goal\n" + "2. Remove an existing goal\n" + "3. Display all goals\n" + "4. Show detailed plan\n" + "5. Save plan to file\n" + "0. Exit\n" + ) + + while True: + print(menu) + choice = get_user_input("Select an option: ", lambda x: x.isdigit() and 0 <= int(x) <= 5) + + if choice == "0": + print("Goodbye!") + break + + if choice == "1": + description = get_user_input("Enter goal description: ") + units = get_user_input("Enter units (e.g., books, hours): ") + amount = int(get_user_input("Enter amount: ", lambda x: x.isdigit())) + months_limit = int(get_user_input("Enter months limit (1-12): ", lambda x: x.isdigit() and 1 <= int(x) <= 12)) + + try: + goal = Goal(amount=amount, description=description, months_limit=months_limit, units=units) + year_goals.add_goal(goal) + print("Goal added successfully.") + except Exception as e: + print(f"Error: {e}") + + elif choice == "2": + goal_uid = get_user_input("Enter the ID of the goal to remove: ") + year_goals.goals = [g for g in year_goals.goals if str(g.uid) != goal_uid] + print("Goal removed, if it existed.") + + elif choice == "3": + if not year_goals.goals: + print("No goals available.") + else: + for goal in year_goals.goals: + print(f"- {goal.description} ({goal.amount} {goal.units} over {goal.months_limit} months)") + + elif choice == "4": + for month, tasks in year_goals.plan.items(): + print(f"{month.capitalize()}:\n") + for idx, (goal, amount) in enumerate(tasks): + print(f" [ ] {idx + 1}. {goal.description} ({amount} {goal.units}/month). Total: {goal.amount}.") + print() + + elif choice == "5": + file_path = f"plan_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt" + year_goals.save_plan(file_path) + print(f"Plan saved to {file_path}") + +if __name__ == "__main__": + main() From 051ea027a06bbe83156f240399f74e1eb4035a14 Mon Sep 17 00:00:00 2001 From: santyjL Date: Sun, 29 Dec 2024 13:12:51 -0600 Subject: [PATCH 093/104] #50 - Python --- .../python/santyjl.py" | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/santyjl.py" diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/santyjl.py" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/santyjl.py" new file mode 100644 index 0000000000..b2d0f63413 --- /dev/null +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/santyjl.py" @@ -0,0 +1,123 @@ +""" +/* + * EJERCICIO: + * El nuevo año está a punto de comenzar... + * ¡Voy a ayudarte a planificar tus propósitos de nuevo año! + * + * Programa un gestor de objetivos con las siguientes características: + * - Permite añadir objetivos (máximo 10) + * - Calcular el plan detallado + * - Guardar la planificación + * + * Cada entrada de un objetivo está formado por (con un ejemplo): + * - Meta: Leer libros + * - Cantidad: 12 + * - Unidades: libros + * - Plazo (en meses): 12 (máximo 12) + * + * El cálculo del plan detallado generará la siguiente salida: + * - Un apartado para cada mes + * - Un listado de objetivos calculados a cumplir en cada mes + * (ejemplo: si quiero leer 12 libros, dará como resultado + * uno al mes) + * - Cada objetivo debe poseer su nombre, la cantidad de + * unidades a completar en cada mes y su total. Por ejemplo: + * + * Enero: + * [ ] 1. Leer libros (1 libro/mes). Total: 12. + * [ ] 2. Estudiar Git (1 curso/mes). Total: 1. + * Febrero: + * [ ] 1. Leer libros (1 libro/mes). Total: 12. + * ... + * Diciembre: + * [ ] 1. Leer libros (1 libro/mes). Total: 12. + * + * - Si la duración es menor a un año, finalizará en el mes + * correspondiente. + * + * Por último, el cálculo detallado debe poder exportarse a .txt + * (No subir el fichero) + */ +""" +import os + +MAX_OBJETIVOS: int = 10 +OBJETIVOS: list = [] +MESES_DEL_AÑO: list = [ + 'Enero', 'Febrero', 'Marzo', 'Abril', + 'Mayo', 'Junio', 'Julio', 'Agosto', + 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre' +] + +def crear_objetivo(): + objetivo = {} + objetivo['meta'] = input('Introduce la meta: ') + objetivo['cantidad'] = int(input('Introduce la cantidad: ')) + objetivo['unidades'] = input('Introduce las unidades: ') + objetivo['plazo'] = int(input('Introduce el plazo (en meses): ')) + return objetivo + +def objetivos_calculados(objetivo: dict) -> list: + cantidad_total = objetivo['cantidad'] + plazo = objetivo['plazo'] + + cantidad_mensual = cantidad_total // plazo + resto = cantidad_total % plazo + + cantidades = [cantidad_mensual] * plazo + + for i in range(resto): + cantidades[i] += 1 + + return cantidades + +def crear_txt(objetivos: list): + with open("objetivos_de_año_nuevo.txt", "w") as fichero: + for objetivo in objetivos: + cantidades = objetivos_calculados(objetivo) + fichero.write(f"Meta: {objetivo['meta']}\n") + fichero.write(f"Cantidad total: {objetivo['cantidad']} {objetivo['unidades']}\n") + fichero.write(f"Plazo: {objetivo['plazo']} meses\n") + fichero.write("Distribucion mensual:\n") + for i, cantidad in enumerate(cantidades): + fichero.write(f"{MESES_DEL_AÑO[i]}: {cantidad} {objetivo['unidades']}\n") + fichero.write("\n") + +def mostrar_objetivos(): + for mes in MESES_DEL_AÑO: + print(f"-----------{mes}-----------") + for objetivo in OBJETIVOS: + cantidades = objetivos_calculados(objetivo) + for i in range(objetivo['plazo']): + if i < len(MESES_DEL_AÑO): + if MESES_DEL_AÑO[i] == mes: + print(f"[ ] {objetivo['meta']} ({cantidades[i]} {objetivo['unidades']}/mes). Total: {objetivo['cantidad']}.") + +# Ejemplo de uso +while True: + opcion = input("Elige una opción:\n0. Mostrar objetivos\n1. Crear objetivo\n2. Mostrar objetivos por mes\n3. Exportar a txt\n4. Salir\nIntroduce el número de la opción: ") + + if opcion == '0': + mostrar_objetivos() + + elif opcion == '1': + if not len(OBJETIVOS) >= MAX_OBJETIVOS: + OBJETIVOS.append(crear_objetivo()) + else: + print("Has alcanzado el límite de objetivos.") + + elif opcion == '2': + for mes in MESES_DEL_AÑO: + print(f"-----------{mes}-----------") + for objetivo in OBJETIVOS: + cantidades = objetivos_calculados(objetivo) + for i in range(objetivo['plazo']): + if i < len(MESES_DEL_AÑO): + if MESES_DEL_AÑO[i] == mes: + print(f"[ ] {objetivo['meta']} ({cantidades[i]} {objetivo['unidades']}/mes). Total: {objetivo['cantidad']}.") + + elif opcion == '3': + crear_txt(OBJETIVOS) + + elif opcion == '4': + break \ No newline at end of file From 8ae4940258a8881d9415650fe7074ab6596d9ab0 Mon Sep 17 00:00:00 2001 From: mouredev Date: Mon, 30 Dec 2024 00:16:59 +0000 Subject: [PATCH 094/104] Update stats --- Roadmap/stats.json | 1410 ++++++++++++++++++++++---------------------- 1 file changed, 705 insertions(+), 705 deletions(-) diff --git a/Roadmap/stats.json b/Roadmap/stats.json index 3ba71b461d..d2ba50a158 100644 --- a/Roadmap/stats.json +++ b/Roadmap/stats.json @@ -1,23 +1,23 @@ { "challenges_total": 51, "languages_total": 52, - "files_total": 8866, + "files_total": 8876, "users_total": 1393, "challenges_ranking": [ { "order": 1, "name": "00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO", - "count": 1505 + "count": 1506 }, { "order": 2, "name": "01 - OPERADORES Y ESTRUCTURAS DE CONTROL", - "count": 911 + "count": 912 }, { "order": 3, "name": "02 - FUNCIONES Y ALCANCE", - "count": 676 + "count": 677 }, { "order": 4, @@ -37,7 +37,7 @@ { "order": 7, "name": "05 - VALOR Y REFERENCIA", - "count": 339 + "count": 340 }, { "order": 8, @@ -47,22 +47,22 @@ { "order": 9, "name": "08 - CLASES", - "count": 264 + "count": 266 }, { "order": 10, "name": "09 - HERENCIA", - "count": 252 + "count": 253 }, { "order": 11, "name": "10 - EXCEPCIONES", - "count": 216 + "count": 217 }, { "order": 12, "name": "11 - MANEJO DE FICHEROS", - "count": 185 + "count": 186 }, { "order": 13, @@ -77,7 +77,7 @@ { "order": 15, "name": "12 - JSON Y XML", - "count": 153 + "count": 154 }, { "order": 16, @@ -236,13 +236,13 @@ }, { "order": 47, - "name": "49 - EL ALMAC\u00c9N DE PAP\u00c1 NOEL", + "name": "46 - X VS BLUESKY", "count": 35 }, { "order": 48, - "name": "46 - X VS BLUESKY", - "count": 34 + "name": "49 - EL ALMAC\u00c9N DE PAP\u00c1 NOEL", + "count": 35 }, { "order": 49, @@ -257,56 +257,56 @@ { "order": 51, "name": "50 - PLANIFICADOR DE OBJETIVOS DE A\u00d1O NUEVO", - "count": 16 + "count": 15 } ], "languages_ranking": [ { "order": 1, "name": "python", - "count": 3674, + "count": 3678, "percentage": 41.44 }, { "order": 2, "name": "javascript", "count": 1807, - "percentage": 20.38 + "percentage": 20.36 }, { "order": 3, "name": "java", "count": 910, - "percentage": 10.26 + "percentage": 10.25 }, { "order": 4, "name": "typescript", "count": 477, - "percentage": 5.38 + "percentage": 5.37 }, { "order": 5, "name": "c#", - "count": 340, - "percentage": 3.83 + "count": 343, + "percentage": 3.86 }, { "order": 6, "name": "go", "count": 248, - "percentage": 2.8 + "percentage": 2.79 }, { "order": 7, "name": "kotlin", - "count": 243, - "percentage": 2.74 + "count": 244, + "percentage": 2.75 }, { "order": 8, "name": "php", - "count": 216, + "count": 217, "percentage": 2.44 }, { @@ -401,13 +401,13 @@ }, { "order": 24, - "name": "nasm", - "count": 11, - "percentage": 0.12 + "name": "fortran", + "count": 12, + "percentage": 0.14 }, { "order": 25, - "name": "fortran", + "name": "nasm", "count": 11, "percentage": 0.12 }, @@ -787,15 +787,15 @@ }, { "order": 36, - "name": "garos01", - "count": 44, - "languages": 2 + "name": "hequebo", + "count": 45, + "languages": 1 }, { "order": 37, - "name": "hequebo", + "name": "garos01", "count": 44, - "languages": 1 + "languages": 2 }, { "order": 38, @@ -1435,253 +1435,253 @@ }, { "order": 144, - "name": "juserdev", + "name": "devcherry1", "count": 13, "languages": 2 }, { "order": 145, - "name": "d1d4cum", + "name": "juserdev", "count": 13, "languages": 2 }, { "order": 146, - "name": "a-mayans", + "name": "d1d4cum", "count": 13, "languages": 2 }, { "order": 147, + "name": "a-mayans", + "count": 13, + "languages": 2 + }, + { + "order": 148, "name": "jav-mol", "count": 13, "languages": 1 }, { - "order": 148, + "order": 149, "name": "neosv", "count": 13, "languages": 1 }, { - "order": 149, + "order": 150, + "name": "santiagobailleres", + "count": 13, + "languages": 1 + }, + { + "order": 151, "name": "c-gabs", "count": 13, "languages": 1 }, { - "order": 150, + "order": 152, "name": "tomu98", "count": 13, "languages": 1 }, { - "order": 151, + "order": 153, "name": "julian98789", "count": 13, "languages": 1 }, { - "order": 152, + "order": 154, "name": "dan-corbo", "count": 13, "languages": 1 }, { - "order": 153, + "order": 155, "name": "ocram1304", "count": 13, "languages": 1 }, { - "order": 154, + "order": 156, "name": "m-doce", "count": 12, "languages": 3 }, { - "order": 155, + "order": 157, "name": "keltoi-dev", "count": 12, "languages": 2 }, { - "order": 156, + "order": 158, "name": "juanrcoder", "count": 12, "languages": 2 }, { - "order": 157, + "order": 159, "name": "rafacv23", "count": 12, "languages": 2 }, { - "order": 158, + "order": 160, "name": "andresmcardenas", "count": 12, "languages": 2 }, { - "order": 159, + "order": 161, "name": "cdryampi", "count": 12, "languages": 1 }, { - "order": 160, + "order": 162, "name": "ipfabio", "count": 12, "languages": 1 }, { - "order": 161, + "order": 163, "name": "nicoheguaburu", "count": 12, "languages": 1 }, { - "order": 162, + "order": 164, "name": "evilpotato04", "count": 12, "languages": 1 }, { - "order": 163, + "order": 165, "name": "dataciriano", "count": 12, "languages": 1 }, { - "order": 164, + "order": 166, "name": "javierjoyera", "count": 12, "languages": 1 }, { - "order": 165, + "order": 167, "name": "jheisonquiroga", "count": 12, "languages": 1 }, { - "order": 166, + "order": 168, "name": "clmiranda", "count": 12, "languages": 1 }, { - "order": 167, + "order": 169, "name": "josealberto13", "count": 12, "languages": 1 }, { - "order": 168, + "order": 170, "name": "andrewcodev", "count": 12, "languages": 1 }, { - "order": 169, + "order": 171, "name": "jeronimocardu", "count": 12, "languages": 1 }, { - "order": 170, + "order": 172, "name": "pancratzia", "count": 12, "languages": 1 }, { - "order": 171, + "order": 173, "name": "pipe281", "count": 12, "languages": 1 }, { - "order": 172, + "order": 174, "name": "llonardo798", "count": 11, "languages": 6 }, { - "order": 173, + "order": 175, "name": "switchdays", "count": 11, "languages": 2 }, { - "order": 174, + "order": 176, "name": "jchavescaceres", "count": 11, "languages": 2 }, { - "order": 175, - "name": "devcherry1", - "count": 11, - "languages": 2 - }, - { - "order": 176, + "order": 177, "name": "arkmiguel379", "count": 11, "languages": 2 }, { - "order": 177, + "order": 178, "name": "djsurgeon", "count": 11, "languages": 2 }, { - "order": 178, + "order": 179, "name": "teren91", "count": 11, "languages": 2 }, - { - "order": 179, - "name": "evanz2608", - "count": 11, - "languages": 1 - }, { "order": 180, - "name": "mirandayuber", + "name": "evanz2608", "count": 11, "languages": 1 }, { "order": 181, - "name": "59822", + "name": "mirandayuber", "count": 11, "languages": 1 }, { "order": 182, - "name": "m1l0j05", + "name": "59822", "count": 11, "languages": 1 }, { "order": 183, - "name": "alainmartz", + "name": "m1l0j05", "count": 11, "languages": 1 }, { "order": 184, - "name": "k-90", + "name": "alainmartz", "count": 11, "languages": 1 }, { "order": 185, - "name": "santiagobailleres", + "name": "k-90", "count": 11, "languages": 1 }, @@ -2005,235 +2005,235 @@ }, { "order": 239, - "name": "linerlander", + "name": "jorgeadamowicz", "count": 8, "languages": 1 }, { "order": 240, - "name": "abelperezcollado", + "name": "linerlander", "count": 8, "languages": 1 }, { "order": 241, - "name": "sarismejiasanchez", + "name": "abelperezcollado", "count": 8, "languages": 1 }, { "order": 242, - "name": "glossypath", + "name": "sarismejiasanchez", "count": 8, "languages": 1 }, { "order": 243, - "name": "srvariable", + "name": "glossypath", "count": 8, "languages": 1 }, { "order": 244, - "name": "isj-code", + "name": "srvariable", "count": 8, "languages": 1 }, { "order": 245, - "name": "westwbn", + "name": "isj-code", "count": 8, "languages": 1 }, { "order": 246, - "name": "matitc", + "name": "westwbn", "count": 8, "languages": 1 }, { "order": 247, - "name": "jaxi86", + "name": "matitc", "count": 8, "languages": 1 }, { "order": 248, - "name": "yisusocanto", + "name": "jaxi86", "count": 8, "languages": 1 }, { "order": 249, - "name": "zequy40", + "name": "yisusocanto", "count": 8, "languages": 1 }, { "order": 250, - "name": "cyberdidac", + "name": "zequy40", "count": 8, "languages": 1 }, { "order": 251, - "name": "bytecodesky", + "name": "leandrocfd", "count": 8, "languages": 1 }, { "order": 252, - "name": "darubiano", - "count": 7, - "languages": 7 + "name": "cyberdidac", + "count": 8, + "languages": 1 }, { "order": 253, - "name": "nwpablodeveloper", - "count": 7, - "languages": 3 + "name": "bytecodesky", + "count": 8, + "languages": 1 }, { "order": 254, - "name": "cubandeveloper89", + "name": "darubiano", "count": 7, - "languages": 3 + "languages": 7 }, { "order": 255, - "name": "younes0-0", + "name": "nwpablodeveloper", "count": 7, - "languages": 2 + "languages": 3 }, { "order": 256, - "name": "davstudy", + "name": "cubandeveloper89", "count": 7, - "languages": 2 + "languages": 3 }, { "order": 257, - "name": "danielbelenguer", + "name": "younes0-0", "count": 7, "languages": 2 }, { "order": 258, - "name": "pwrxman", + "name": "davstudy", "count": 7, - "languages": 1 + "languages": 2 }, { "order": 259, - "name": "albertomorilla", + "name": "danielbelenguer", "count": 7, - "languages": 1 + "languages": 2 }, { "order": 260, - "name": "jorgeadamowicz", + "name": "pwrxman", "count": 7, "languages": 1 }, { "order": 261, - "name": "hectordbh", + "name": "albertomorilla", "count": 7, "languages": 1 }, { "order": 262, - "name": "ldre3", + "name": "hectordbh", "count": 7, "languages": 1 }, { "order": 263, - "name": "jose-larss", + "name": "ldre3", "count": 7, "languages": 1 }, { "order": 264, - "name": "dgrex", + "name": "jose-larss", "count": 7, "languages": 1 }, { "order": 265, - "name": "ruhlmirko", + "name": "dgrex", "count": 7, "languages": 1 }, { "order": 266, - "name": "maxirica", + "name": "ruhlmirko", "count": 7, "languages": 1 }, { "order": 267, - "name": "franvozzi", + "name": "maxirica", "count": 7, "languages": 1 }, { "order": 268, - "name": "marinaortells", + "name": "franvozzi", "count": 7, "languages": 1 }, { "order": 269, - "name": "mtirador", + "name": "marinaortells", "count": 7, "languages": 1 }, { "order": 270, - "name": "alextc35", + "name": "mtirador", "count": 7, "languages": 1 }, { "order": 271, - "name": "18miguelgalarza", + "name": "alextc35", "count": 7, "languages": 1 }, { "order": 272, - "name": "abrahamraies", + "name": "18miguelgalarza", "count": 7, "languages": 1 }, { "order": 273, - "name": "ocandodev", + "name": "abrahamraies", "count": 7, "languages": 1 }, { "order": 274, - "name": "markc1234", + "name": "ocandodev", "count": 7, "languages": 1 }, { "order": 275, - "name": "shevotool", + "name": "markc1234", "count": 7, "languages": 1 }, { "order": 276, - "name": "aarxnmendez", + "name": "shevotool", "count": 7, "languages": 1 }, { "order": 277, - "name": "leandrocfd", + "name": "aarxnmendez", "count": 7, "languages": 1 }, @@ -2389,175 +2389,175 @@ }, { "order": 303, - "name": "abascal92", + "name": "rusanov16", "count": 6, "languages": 1 }, { "order": 304, - "name": "lazar171717ech", + "name": "abascal92", "count": 6, "languages": 1 }, { "order": 305, - "name": "mikelroset", + "name": "lazar171717ech", "count": 6, "languages": 1 }, { "order": 306, - "name": "guillemduno", + "name": "mikelroset", "count": 6, "languages": 1 }, { "order": 307, - "name": "mxtrar23", + "name": "guillemduno", "count": 6, "languages": 1 }, { "order": 308, - "name": "facundo-muoio", + "name": "mxtrar23", "count": 6, "languages": 1 }, { "order": 309, - "name": "ssanjua", + "name": "facundo-muoio", "count": 6, "languages": 1 }, { "order": 310, - "name": "dannymarperone", + "name": "ssanjua", "count": 6, "languages": 1 }, { "order": 311, + "name": "dannymarperone", + "count": 6, + "languages": 1 + }, + { + "order": 312, "name": "alabacw74", "count": 5, "languages": 3 }, { - "order": 312, + "order": 313, "name": "bryan112094", "count": 5, "languages": 3 }, { - "order": 313, + "order": 314, "name": "tizog", "count": 5, "languages": 2 }, { - "order": 314, + "order": 315, "name": "andresmendozaf", "count": 5, "languages": 2 }, { - "order": 315, + "order": 316, "name": "icedrek", "count": 5, "languages": 2 }, { - "order": 316, + "order": 317, "name": "vmatmarco", "count": 5, "languages": 2 }, { - "order": 317, + "order": 318, "name": "espinoleandroo", "count": 5, "languages": 2 }, { - "order": 318, + "order": 319, "name": "alejandrodave", "count": 5, "languages": 2 }, { - "order": 319, + "order": 320, "name": "jalivur", "count": 5, "languages": 2 }, - { - "order": 320, - "name": "eloychavezdev", - "count": 5, - "languages": 1 - }, { "order": 321, - "name": "w00k", + "name": "eloychavezdev", "count": 5, "languages": 1 }, { "order": 322, - "name": "thaishdz", + "name": "w00k", "count": 5, "languages": 1 }, { "order": 323, - "name": "boterop", + "name": "thaishdz", "count": 5, "languages": 1 }, { "order": 324, - "name": "d0ubt0", + "name": "boterop", "count": 5, "languages": 1 }, { "order": 325, - "name": "micromantic", + "name": "d0ubt0", "count": 5, "languages": 1 }, { "order": 326, - "name": "javitron100", + "name": "micromantic", "count": 5, "languages": 1 }, { "order": 327, - "name": "njaimev", + "name": "javitron100", "count": 5, "languages": 1 }, { "order": 328, - "name": "craphaelam", + "name": "njaimev", "count": 5, "languages": 1 }, { "order": 329, - "name": "yharyarias", + "name": "craphaelam", "count": 5, "languages": 1 }, { "order": 330, - "name": "thezhizn", + "name": "yharyarias", "count": 5, "languages": 1 }, { "order": 331, - "name": "rusanov16", + "name": "thezhizn", "count": 5, "languages": 1 }, @@ -2899,1423 +2899,1423 @@ }, { "order": 388, - "name": "guillermo-k", + "name": "giulianovfz", "count": 4, "languages": 1 }, { "order": 389, - "name": "anvildestroyer", + "name": "guillermo-k", "count": 4, "languages": 1 }, { "order": 390, - "name": "sunjamer", + "name": "anvildestroyer", "count": 4, "languages": 1 }, { "order": 391, - "name": "txuky", + "name": "sunjamer", "count": 4, "languages": 1 }, { "order": 392, - "name": "luissssoto", + "name": "txuky", "count": 4, "languages": 1 }, { "order": 393, - "name": "rodrigoghr", + "name": "luissssoto", "count": 4, "languages": 1 }, { "order": 394, - "name": "mercedesdf", + "name": "rodrigoghr", "count": 4, "languages": 1 }, { "order": 395, - "name": "dlgai12", + "name": "mercedesdf", "count": 4, "languages": 1 }, { "order": 396, - "name": "tobibordino", + "name": "dlgai12", "count": 4, "languages": 1 }, { "order": 397, - "name": "carrenoalexander", + "name": "tobibordino", "count": 4, "languages": 1 }, { "order": 398, - "name": "albertorevel", + "name": "carrenoalexander", "count": 4, "languages": 1 }, { "order": 399, - "name": "zerek247", + "name": "albertorevel", "count": 4, "languages": 1 }, { "order": 400, - "name": "jadraz", + "name": "zerek247", "count": 4, "languages": 1 }, { "order": 401, - "name": "buriticasara", + "name": "jadraz", "count": 4, "languages": 1 }, { "order": 402, - "name": "javirub", + "name": "buriticasara", "count": 4, "languages": 1 }, { "order": 403, - "name": "andres54-coder", + "name": "javirub", "count": 4, "languages": 1 }, { "order": 404, - "name": "angell4s", + "name": "andres54-coder", "count": 4, "languages": 1 }, { "order": 405, - "name": "mplatab", + "name": "angell4s", "count": 4, "languages": 1 }, { "order": 406, - "name": "axelprz", + "name": "mplatab", "count": 4, "languages": 1 }, { "order": 407, - "name": "vicman-182", + "name": "axelprz", "count": 4, "languages": 1 }, { "order": 408, - "name": "jfdacovich", + "name": "vicman-182", "count": 4, "languages": 1 }, { "order": 409, - "name": "cdbiancotti", + "name": "jfdacovich", "count": 4, "languages": 1 }, { "order": 410, - "name": "yorjanvarela", + "name": "cdbiancotti", "count": 4, "languages": 1 }, { "order": 411, - "name": "mallcca", + "name": "yorjanvarela", "count": 4, "languages": 1 }, { "order": 412, - "name": "nox456", + "name": "mallcca", "count": 4, "languages": 1 }, { "order": 413, - "name": "mayerga", + "name": "nox456", "count": 4, "languages": 1 }, { "order": 414, - "name": "hugovrc", + "name": "mayerga", "count": 4, "languages": 1 }, { "order": 415, - "name": "jeyker-dev", + "name": "hugovrc", "count": 4, "languages": 1 }, { "order": 416, - "name": "carzep09", + "name": "jeyker-dev", "count": 4, "languages": 1 }, { "order": 417, - "name": "blasbarragan", + "name": "carzep09", "count": 4, "languages": 1 }, { "order": 418, - "name": "jerrysantana", + "name": "blasbarragan", "count": 4, "languages": 1 }, { "order": 419, - "name": "marianoemir", + "name": "jerrysantana", "count": 4, "languages": 1 }, { "order": 420, - "name": "password1989", + "name": "marianoemir", "count": 4, "languages": 1 }, { "order": 421, - "name": "dredux2", + "name": "password1989", "count": 4, "languages": 1 }, { "order": 422, - "name": "bladi23", + "name": "dredux2", "count": 4, "languages": 1 }, { "order": 423, - "name": "juanca2805", + "name": "bladi23", "count": 4, "languages": 1 }, { "order": 424, - "name": "davidsorroche", + "name": "juanca2805", "count": 4, "languages": 1 }, { "order": 425, - "name": "somaxb", + "name": "davidsorroche", "count": 4, "languages": 1 }, { "order": 426, - "name": "confley", + "name": "somaxb", "count": 4, "languages": 1 }, { "order": 427, - "name": "jcubero12", + "name": "confley", "count": 4, "languages": 1 }, { "order": 428, - "name": "sbs24", + "name": "jcubero12", "count": 4, "languages": 1 }, { "order": 429, - "name": "traver79", + "name": "sbs24", "count": 4, "languages": 1 }, { "order": 430, - "name": "andeveling", + "name": "traver79", "count": 4, "languages": 1 }, { "order": 431, - "name": "joaquinlopez14", + "name": "andeveling", "count": 4, "languages": 1 }, { "order": 432, - "name": "marcoslombardo", + "name": "joaquinlopez14", "count": 4, "languages": 1 }, { "order": 433, - "name": "angelurrutdev", + "name": "marcoslombardo", "count": 4, "languages": 1 }, { "order": 434, - "name": "socramwd", + "name": "angelurrutdev", "count": 4, "languages": 1 }, { "order": 435, - "name": "juperdev", + "name": "socramwd", "count": 4, "languages": 1 }, { "order": 436, - "name": "cristophher087", + "name": "juperdev", "count": 4, "languages": 1 }, { "order": 437, - "name": "dieswae", + "name": "cristophher087", "count": 4, "languages": 1 }, { "order": 438, - "name": "fernandog25", + "name": "dieswae", "count": 4, "languages": 1 }, { "order": 439, - "name": "mateo423", + "name": "fernandog25", "count": 4, "languages": 1 }, { "order": 440, - "name": "eloyparga", + "name": "mateo423", "count": 4, "languages": 1 }, { "order": 441, - "name": "elianisdev", + "name": "eloyparga", "count": 4, "languages": 1 }, { "order": 442, - "name": "omegatroy", + "name": "elianisdev", "count": 4, "languages": 1 }, { "order": 443, - "name": "joshbaez", + "name": "omegatroy", "count": 4, "languages": 1 }, { "order": 444, - "name": "andyfg0289", + "name": "joshbaez", "count": 4, "languages": 1 }, { "order": 445, - "name": "fdcorreadev", + "name": "andyfg0289", "count": 4, "languages": 1 }, { "order": 446, - "name": "lrpeset", + "name": "fdcorreadev", "count": 4, "languages": 1 }, { "order": 447, - "name": "jairo-alejandro", + "name": "lrpeset", "count": 4, "languages": 1 }, { "order": 448, - "name": "deivitdev", + "name": "jairo-alejandro", "count": 4, "languages": 1 }, { "order": 449, - "name": "joselorentelopez", + "name": "deivitdev", "count": 4, "languages": 1 }, { "order": 450, - "name": "owen-ian", - "count": 3, - "languages": 3 + "name": "joselorentelopez", + "count": 4, + "languages": 1 }, { "order": 451, - "name": "angelo-eyama", + "name": "owen-ian", "count": 3, "languages": 3 }, { "order": 452, - "name": "akaisombra", + "name": "angelo-eyama", "count": 3, "languages": 3 }, { "order": 453, - "name": "abelsrzz", + "name": "akaisombra", "count": 3, "languages": 3 }, { "order": 454, - "name": "jehiselruth", + "name": "abelsrzz", "count": 3, "languages": 3 }, { "order": 455, - "name": "oskarcali", + "name": "jehiselruth", "count": 3, "languages": 3 }, { "order": 456, - "name": "didix16", + "name": "oskarcali", "count": 3, "languages": 3 }, { "order": 457, - "name": "augustosdev", + "name": "didix16", "count": 3, - "languages": 2 + "languages": 3 }, { "order": 458, - "name": "diegopc-dev", + "name": "augustosdev", "count": 3, "languages": 2 }, { "order": 459, - "name": "dimasb69", + "name": "diegopc-dev", "count": 3, "languages": 2 }, { "order": 460, - "name": "eloitr", + "name": "dimasb69", "count": 3, "languages": 2 }, { "order": 461, - "name": "seba9906", + "name": "eloitr", "count": 3, "languages": 2 }, { "order": 462, - "name": "pablotaber", + "name": "seba9906", "count": 3, "languages": 2 }, { "order": 463, - "name": "skala2301", + "name": "pablotaber", "count": 3, "languages": 2 }, { "order": 464, - "name": "alfarog507", + "name": "skala2301", "count": 3, "languages": 2 }, { "order": 465, - "name": "allanoscoding", + "name": "alfarog507", "count": 3, "languages": 2 }, { "order": 466, - "name": "clotrack", + "name": "allanoscoding", "count": 3, "languages": 2 }, { "order": 467, - "name": "arliumdev", + "name": "clotrack", "count": 3, "languages": 2 }, { "order": 468, - "name": "robindev1812", + "name": "jaennova", "count": 3, "languages": 2 }, { "order": 469, - "name": "n-skot", + "name": "arliumdev", "count": 3, "languages": 2 }, { "order": 470, - "name": "ikeragi05", + "name": "robindev1812", "count": 3, - "languages": 1 + "languages": 2 }, { "order": 471, - "name": "beonzj", + "name": "n-skot", "count": 3, - "languages": 1 + "languages": 2 }, { "order": 472, - "name": "frangarmez21", + "name": "ikeragi05", "count": 3, "languages": 1 }, { "order": 473, - "name": "juanmjimenezs", + "name": "beonzj", "count": 3, "languages": 1 }, { "order": 474, - "name": "juxxon23", + "name": "frangarmez21", "count": 3, "languages": 1 }, { "order": 475, - "name": "mantaras96", + "name": "juanmjimenezs", "count": 3, "languages": 1 }, { "order": 476, - "name": "lesterdavid31", + "name": "juxxon23", "count": 3, "languages": 1 }, { "order": 477, - "name": "mellamoomar", + "name": "mantaras96", "count": 3, "languages": 1 }, { "order": 478, - "name": "coshiloco", + "name": "lesterdavid31", "count": 3, "languages": 1 }, { "order": 479, - "name": "javiearth", + "name": "mellamoomar", "count": 3, "languages": 1 }, { "order": 480, - "name": "atienzar", + "name": "coshiloco", "count": 3, "languages": 1 }, { "order": 481, - "name": "14davidnkt", + "name": "javiearth", "count": 3, "languages": 1 }, { "order": 482, - "name": "macova96", + "name": "atienzar", "count": 3, "languages": 1 }, { "order": 483, - "name": "estelacode", + "name": "14davidnkt", "count": 3, "languages": 1 }, { "order": 484, - "name": "yeam-10", + "name": "macova96", "count": 3, "languages": 1 }, { "order": 485, - "name": "elkin-dev", + "name": "estelacode", "count": 3, "languages": 1 }, { "order": 486, - "name": "elder202", + "name": "yeam-10", "count": 3, "languages": 1 }, { "order": 487, - "name": "bryanalzate007", + "name": "elkin-dev", "count": 3, "languages": 1 }, { "order": 488, - "name": "giulianovfz", + "name": "elder202", "count": 3, "languages": 1 }, { "order": 489, - "name": "exanderguitar", + "name": "bryanalzate007", "count": 3, "languages": 1 }, { "order": 490, - "name": "mmacalli", + "name": "exanderguitar", "count": 3, "languages": 1 }, { "order": 491, - "name": "eliskopun", + "name": "mmacalli", "count": 3, "languages": 1 }, { "order": 492, - "name": "camilo-zuluaga", + "name": "eliskopun", "count": 3, "languages": 1 }, { "order": 493, - "name": "suescun845", + "name": "camilo-zuluaga", "count": 3, "languages": 1 }, { "order": 494, - "name": "emilianohoyos", + "name": "suescun845", "count": 3, "languages": 1 }, { "order": 495, - "name": "tonywarcode", + "name": "emilianohoyos", "count": 3, "languages": 1 }, { "order": 496, - "name": "tekatoki", + "name": "tonywarcode", "count": 3, "languages": 1 }, { "order": 497, - "name": "dchevesich", + "name": "tekatoki", "count": 3, "languages": 1 }, { "order": 498, - "name": "guillesese", + "name": "dchevesich", "count": 3, "languages": 1 }, { "order": 499, - "name": "strooplab", + "name": "guillesese", "count": 3, "languages": 1 }, { "order": 500, - "name": "frostbitepy", + "name": "strooplab", "count": 3, "languages": 1 }, { "order": 501, - "name": "minn09", + "name": "frostbitepy", "count": 3, "languages": 1 }, { "order": 502, - "name": "bertolini-victor", + "name": "minn09", "count": 3, "languages": 1 }, { "order": 503, - "name": "notj0s3", + "name": "bertolini-victor", "count": 3, "languages": 1 }, { "order": 504, - "name": "joandevpy", + "name": "notj0s3", "count": 3, "languages": 1 }, { "order": 505, - "name": "jackziel-sumoza", + "name": "joandevpy", "count": 3, "languages": 1 }, { "order": 506, - "name": "danielperezrubio", + "name": "jackziel-sumoza", "count": 3, "languages": 1 }, { "order": 507, - "name": "artdugarte", + "name": "danielperezrubio", "count": 3, "languages": 1 }, { "order": 508, - "name": "oscarhub90", + "name": "artdugarte", "count": 3, "languages": 1 }, { "order": 509, - "name": "sandrogmz", + "name": "oscarhub90", "count": 3, "languages": 1 }, { "order": 510, - "name": "rgeditv1", + "name": "sandrogmz", "count": 3, "languages": 1 }, { "order": 511, - "name": "zzepu", + "name": "rgeditv1", "count": 3, "languages": 1 }, { "order": 512, - "name": "cevicheconaji", + "name": "zzepu", "count": 3, "languages": 1 }, { "order": 513, - "name": "ramon-almeida", + "name": "cevicheconaji", "count": 3, "languages": 1 }, { "order": 514, - "name": "monikgbar", + "name": "ramon-almeida", "count": 3, "languages": 1 }, { "order": 515, - "name": "jorgegarcia-dev", + "name": "monikgbar", "count": 3, "languages": 1 }, { "order": 516, - "name": "betzadev", + "name": "jorgegarcia-dev", "count": 3, "languages": 1 }, { "order": 517, - "name": "carlosalberto05", + "name": "betzadev", "count": 3, "languages": 1 }, { "order": 518, - "name": "dandrusco", + "name": "carlosalberto05", "count": 3, "languages": 1 }, { "order": 519, - "name": "13sauca13", + "name": "dandrusco", "count": 3, "languages": 1 }, { "order": 520, - "name": "mizadlogcia", + "name": "13sauca13", "count": 3, "languages": 1 }, { "order": 521, - "name": "mstaz4", + "name": "mizadlogcia", "count": 3, "languages": 1 }, { "order": 522, - "name": "antii16", + "name": "mstaz4", "count": 3, "languages": 1 }, { "order": 523, - "name": "jofedev", + "name": "antii16", "count": 3, "languages": 1 }, { "order": 524, - "name": "jhonmarin12", + "name": "jofedev", "count": 3, "languages": 1 }, { "order": 525, - "name": "oscargeovannyrincon", + "name": "jhonmarin12", "count": 3, "languages": 1 }, { "order": 526, - "name": "juliand89", + "name": "oscargeovannyrincon", "count": 3, "languages": 1 }, { "order": 527, - "name": "marcoh2325", + "name": "juliand89", "count": 3, "languages": 1 }, { "order": 528, - "name": "misaelbentperez", + "name": "marcoh2325", "count": 3, "languages": 1 }, { "order": 529, - "name": "sitnestic", + "name": "misaelbentperez", "count": 3, "languages": 1 }, { "order": 530, - "name": "guido2288", + "name": "sitnestic", "count": 3, "languages": 1 }, { "order": 531, - "name": "rocallejas", + "name": "guido2288", "count": 3, "languages": 1 }, { "order": 532, - "name": "githjuan", + "name": "rocallejas", "count": 3, "languages": 1 }, { "order": 533, - "name": "tomytsa", + "name": "githjuan", "count": 3, "languages": 1 }, { "order": 534, - "name": "crisvigas", + "name": "tomytsa", "count": 3, "languages": 1 }, { "order": 535, - "name": "carlosguariglia", + "name": "crisvigas", "count": 3, "languages": 1 }, { "order": 536, - "name": "fluna29", + "name": "carlosguariglia", "count": 3, "languages": 1 }, { "order": 537, - "name": "david-quinones", + "name": "fluna29", "count": 3, "languages": 1 }, { "order": 538, - "name": "kine-jdf", + "name": "david-quinones", "count": 3, "languages": 1 }, { "order": 539, - "name": "marce1084", + "name": "kine-jdf", "count": 3, "languages": 1 }, { "order": 540, - "name": "chakerr", + "name": "marce1084", "count": 3, "languages": 1 }, { "order": 541, - "name": "freedainew", + "name": "chakerr", "count": 3, "languages": 1 }, { "order": 542, - "name": "yaretzyrb", + "name": "freedainew", "count": 3, "languages": 1 }, { "order": 543, - "name": "kingsaul22", + "name": "yaretzyrb", "count": 3, "languages": 1 }, { "order": 544, - "name": "natalinacn", + "name": "kingsaul22", "count": 3, "languages": 1 }, { "order": 545, - "name": "rubioj17", + "name": "natalinacn", "count": 3, "languages": 1 }, { "order": 546, - "name": "xurxogz", + "name": "rubioj17", "count": 3, "languages": 1 }, { "order": 547, - "name": "francofmv", + "name": "xurxogz", "count": 3, "languages": 1 }, { "order": 548, - "name": "swifty0705", + "name": "francofmv", "count": 3, "languages": 1 }, { "order": 549, - "name": "ainoaran", + "name": "swifty0705", "count": 3, "languages": 1 }, { "order": 550, - "name": "paola-itzel-martinez", + "name": "ainoaran", "count": 3, "languages": 1 }, { "order": 551, - "name": "aggranadoss", + "name": "paola-itzel-martinez", "count": 3, "languages": 1 }, { "order": 552, - "name": "heliercamejo", + "name": "aggranadoss", "count": 3, "languages": 1 }, { "order": 553, - "name": "barbafebles", + "name": "heliercamejo", "count": 3, "languages": 1 }, { "order": 554, - "name": "tebaah", + "name": "barbafebles", "count": 3, "languages": 1 }, { "order": 555, - "name": "matteozhao98", + "name": "tebaah", "count": 3, "languages": 1 }, { "order": 556, - "name": "sebasgrdev", + "name": "matteozhao98", "count": 3, "languages": 1 }, { "order": 557, - "name": "jaimerocel96", + "name": "sebasgrdev", "count": 3, "languages": 1 }, { "order": 558, - "name": "dannyvera1234", + "name": "jaimerocel96", "count": 3, "languages": 1 }, { "order": 559, - "name": "gitperalta", + "name": "dannyvera1234", "count": 3, "languages": 1 }, { "order": 560, - "name": "axelsparta", + "name": "gitperalta", "count": 3, "languages": 1 }, { "order": 561, - "name": "samuelarandia", + "name": "axelsparta", "count": 3, "languages": 1 }, { "order": 562, - "name": "blfuentes", + "name": "samuelarandia", "count": 3, "languages": 1 }, { "order": 563, - "name": "sans6114", + "name": "blfuentes", "count": 3, "languages": 1 }, { "order": 564, - "name": "r4kso", + "name": "sans6114", "count": 3, "languages": 1 }, { "order": 565, - "name": "orlas135", + "name": "r4kso", "count": 3, "languages": 1 }, { "order": 566, - "name": "emaenriquez", + "name": "orlas135", "count": 3, "languages": 1 }, { "order": 567, - "name": "uyarra73", + "name": "emaenriquez", "count": 3, "languages": 1 }, { "order": 568, - "name": "sandracalatayud", + "name": "uyarra73", "count": 3, "languages": 1 }, { "order": 569, - "name": "hectoriglesias", + "name": "sandracalatayud", "count": 3, "languages": 1 }, { "order": 570, - "name": "jacarrillob", + "name": "hectoriglesias", "count": 3, "languages": 1 }, { "order": 571, - "name": "gpinedaoviedo", + "name": "jacarrillob", "count": 3, "languages": 1 }, { "order": 572, - "name": "josueeeee", + "name": "gpinedaoviedo", "count": 3, "languages": 1 }, { "order": 573, - "name": "victorsschz", + "name": "josueeeee", "count": 3, "languages": 1 }, { "order": 574, - "name": "nathaliamf", + "name": "victorsschz", "count": 3, "languages": 1 }, { "order": 575, - "name": "sebascmb", + "name": "nathaliamf", "count": 3, "languages": 1 }, { "order": 576, - "name": "faga01", + "name": "sebascmb", "count": 3, "languages": 1 }, { "order": 577, - "name": "davidb313", + "name": "faga01", "count": 3, "languages": 1 }, { "order": 578, - "name": "zuluangel", + "name": "davidb313", "count": 3, "languages": 1 }, { "order": 579, - "name": "jelozanov", + "name": "zuluangel", "count": 3, "languages": 1 }, { "order": 580, - "name": "hatorob", + "name": "jelozanov", "count": 3, "languages": 1 }, { "order": 581, - "name": "ahinar", + "name": "hatorob", "count": 3, "languages": 1 }, { "order": 582, - "name": "arbenisacosta", + "name": "ahinar", "count": 3, "languages": 1 }, { "order": 583, - "name": "agusbelp", + "name": "arbenisacosta", "count": 3, "languages": 1 }, { "order": 584, - "name": "migueltfangche", + "name": "agusbelp", "count": 3, "languages": 1 }, { "order": 585, - "name": "magupe09", + "name": "migueltfangche", "count": 3, "languages": 1 }, { "order": 586, - "name": "legs30011", + "name": "magupe09", "count": 3, "languages": 1 }, { "order": 587, - "name": "andresargote", + "name": "legs30011", "count": 3, "languages": 1 }, { "order": 588, - "name": "matiascba27", + "name": "andresargote", "count": 3, "languages": 1 }, { "order": 589, - "name": "erysnell", + "name": "matiascba27", "count": 3, "languages": 1 }, { "order": 590, - "name": "asaelz", + "name": "erysnell", "count": 3, "languages": 1 }, { "order": 591, - "name": "dariorfm", + "name": "asaelz", "count": 3, "languages": 1 }, { "order": 592, - "name": "daniback95", + "name": "dariorfm", "count": 3, "languages": 1 }, { "order": 593, - "name": "yedixdev", + "name": "daniback95", "count": 3, "languages": 1 }, { "order": 594, - "name": "matrix-miguel", + "name": "yedixdev", "count": 3, "languages": 1 }, { "order": 595, - "name": "singularpigeon", + "name": "matrix-miguel", "count": 3, "languages": 1 }, { "order": 596, - "name": "ggtorca", + "name": "singularpigeon", "count": 3, "languages": 1 }, { "order": 597, - "name": "vandresca", + "name": "ggtorca", "count": 3, "languages": 1 }, { "order": 598, - "name": "nikorasu-d", + "name": "vandresca", "count": 3, "languages": 1 }, { "order": 599, - "name": "marlonleon2023", + "name": "nikorasu-d", "count": 3, "languages": 1 }, { "order": 600, - "name": "dylanb55", + "name": "marlonleon2023", "count": 3, "languages": 1 }, { "order": 601, - "name": "edaagapu", + "name": "dylanb55", "count": 3, "languages": 1 }, { "order": 602, - "name": "alejomazov", + "name": "edaagapu", "count": 3, "languages": 1 }, { "order": 603, - "name": "ivanpelu7", + "name": "alejomazov", "count": 3, "languages": 1 }, { "order": 604, - "name": "davidr1594", + "name": "ivanpelu7", "count": 3, "languages": 1 }, { "order": 605, - "name": "dmauricio4", + "name": "davidr1594", "count": 3, "languages": 1 }, { "order": 606, - "name": "oscar503sv", + "name": "dmauricio4", "count": 3, "languages": 1 }, { "order": 607, - "name": "lurtur", - "count": 2, - "languages": 2 + "name": "oscar503sv", + "count": 3, + "languages": 1 }, { "order": 608, - "name": "jhonatanmustiolacas", + "name": "lurtur", "count": 2, "languages": 2 }, { "order": 609, - "name": "andreessj", + "name": "jhonatanmustiolacas", "count": 2, "languages": 2 }, { "order": 610, - "name": "juan-wills", + "name": "andreessj", "count": 2, "languages": 2 }, { "order": 611, - "name": "ct-zodiako", + "name": "juan-wills", "count": 2, "languages": 2 }, { "order": 612, - "name": "rcellas", + "name": "ct-zodiako", "count": 2, "languages": 2 }, { "order": 613, - "name": "rickmij", + "name": "rcellas", "count": 2, "languages": 2 }, { "order": 614, - "name": "angel-alvarez-dev", + "name": "rickmij", "count": 2, "languages": 2 }, { "order": 615, - "name": "elsanty08", + "name": "angel-alvarez-dev", "count": 2, "languages": 2 }, { "order": 616, - "name": "camiloforero1997", + "name": "elsanty08", "count": 2, "languages": 2 }, { "order": 617, - "name": "raul-progr", + "name": "camiloforero1997", "count": 2, "languages": 2 }, { "order": 618, - "name": "lemito66", + "name": "raul-progr", "count": 2, "languages": 2 }, { "order": 619, - "name": "jorgesilencio", + "name": "lemito66", "count": 2, "languages": 2 }, { "order": 620, - "name": "jmofuture", + "name": "jorgesilencio", "count": 2, "languages": 2 }, { "order": 621, - "name": "tecfer", + "name": "jmofuture", "count": 2, "languages": 2 }, { "order": 622, - "name": "lilberick", + "name": "tecfer", "count": 2, "languages": 2 }, { "order": 623, - "name": "chuanmi", + "name": "lilberick", "count": 2, "languages": 2 }, { "order": 624, - "name": "jaennova", + "name": "chuanmi", "count": 2, "languages": 2 }, @@ -7135,1777 +7135,1777 @@ }, { "order": 1094, - "name": "jarzatedev", + "name": "manuelgomezg", "count": 1, "languages": 1 }, { "order": 1095, - "name": "luisfcaro", + "name": "jarzatedev", "count": 1, "languages": 1 }, { "order": 1096, - "name": "edm1ya", + "name": "luisfcaro", "count": 1, "languages": 1 }, { "order": 1097, - "name": "alejandroruiz23", + "name": "edm1ya", "count": 1, "languages": 1 }, { "order": 1098, - "name": "jaimesoftdev", + "name": "alejandroruiz23", "count": 1, "languages": 1 }, { "order": 1099, - "name": "alexvasquez199914", + "name": "jaimesoftdev", "count": 1, "languages": 1 }, { "order": 1100, - "name": "deimoshall", + "name": "alexvasquez199914", "count": 1, "languages": 1 }, { "order": 1101, - "name": "over-kr", + "name": "deimoshall", "count": 1, "languages": 1 }, { "order": 1102, - "name": "fede6299", + "name": "over-kr", "count": 1, "languages": 1 }, { "order": 1103, - "name": "kevin05m", + "name": "fede6299", "count": 1, "languages": 1 }, { "order": 1104, - "name": "diegomm27", + "name": "kevin05m", "count": 1, "languages": 1 }, { "order": 1105, - "name": "pablo-lnx", + "name": "diegomm27", "count": 1, "languages": 1 }, { "order": 1106, - "name": "darkohokage", + "name": "pablo-lnx", "count": 1, "languages": 1 }, { "order": 1107, - "name": "chrystiancalderon", + "name": "darkohokage", "count": 1, "languages": 1 }, { "order": 1108, - "name": "gianellannie", + "name": "chrystiancalderon", "count": 1, "languages": 1 }, { "order": 1109, - "name": "serg_pq", + "name": "gianellannie", "count": 1, "languages": 1 }, { "order": 1110, - "name": "jose-zga", + "name": "serg_pq", "count": 1, "languages": 1 }, { "order": 1111, - "name": "zyn7e", + "name": "jose-zga", "count": 1, "languages": 1 }, { "order": 1112, - "name": "xhaloidx", + "name": "zyn7e", "count": 1, "languages": 1 }, { "order": 1113, - "name": "frankmon03", + "name": "xhaloidx", "count": 1, "languages": 1 }, { "order": 1114, - "name": "martinaq", + "name": "frankmon03", "count": 1, "languages": 1 }, { "order": 1115, - "name": "lewisoneil", + "name": "martinaq", "count": 1, "languages": 1 }, { "order": 1116, - "name": "cristobalbelcor", + "name": "lewisoneil", "count": 1, "languages": 1 }, { "order": 1117, - "name": "cristian-encalada", + "name": "cristobalbelcor", "count": 1, "languages": 1 }, { "order": 1118, - "name": "chalaito88", + "name": "cristian-encalada", "count": 1, "languages": 1 }, { "order": 1119, - "name": "angeldevsarrollo", + "name": "chalaito88", "count": 1, "languages": 1 }, { "order": 1120, - "name": "hanzd07", + "name": "angeldevsarrollo", "count": 1, "languages": 1 }, { "order": 1121, - "name": "vikinghost", + "name": "hanzd07", "count": 1, "languages": 1 }, { "order": 1122, - "name": "det3992", + "name": "vikinghost", "count": 1, "languages": 1 }, { "order": 1123, - "name": "alvaropg15", + "name": "det3992", "count": 1, "languages": 1 }, { "order": 1124, - "name": "danisaurio94", + "name": "alvaropg15", "count": 1, "languages": 1 }, { "order": 1125, - "name": "iguerrerov", + "name": "danisaurio94", "count": 1, "languages": 1 }, { "order": 1126, - "name": "bycris13", + "name": "iguerrerov", "count": 1, "languages": 1 }, { "order": 1127, - "name": "albert-29", + "name": "bycris13", "count": 1, "languages": 1 }, { "order": 1128, - "name": "nolemoon", + "name": "albert-29", "count": 1, "languages": 1 }, { "order": 1129, - "name": "ignaciiodev", + "name": "nolemoon", "count": 1, "languages": 1 }, { "order": 1130, - "name": "jrgim", + "name": "ignaciiodev", "count": 1, "languages": 1 }, { "order": 1131, - "name": "clespinosa2024", + "name": "jrgim", "count": 1, "languages": 1 }, { "order": 1132, - "name": "cybersutro", + "name": "clespinosa2024", "count": 1, "languages": 1 }, { "order": 1133, - "name": "reneguzman7", + "name": "cybersutro", "count": 1, "languages": 1 }, { "order": 1134, - "name": "nazhiravila", + "name": "reneguzman7", "count": 1, "languages": 1 }, { "order": 1135, - "name": "dsmhp0", + "name": "nazhiravila", "count": 1, "languages": 1 }, { "order": 1136, - "name": "algeloro", + "name": "dsmhp0", "count": 1, "languages": 1 }, { "order": 1137, - "name": "adriansaint07", + "name": "algeloro", "count": 1, "languages": 1 }, { "order": 1138, - "name": "v1k770r", + "name": "adriansaint07", "count": 1, "languages": 1 }, { "order": 1139, - "name": "jaquelinetorres", + "name": "v1k770r", "count": 1, "languages": 1 }, { "order": 1140, - "name": "jlrojano", + "name": "jaquelinetorres", "count": 1, "languages": 1 }, { "order": 1141, - "name": "maynor06", + "name": "jlrojano", "count": 1, "languages": 1 }, { "order": 1142, - "name": "dovinhoyos", + "name": "maynor06", "count": 1, "languages": 1 }, { "order": 1143, - "name": "alefine", + "name": "dovinhoyos", "count": 1, "languages": 1 }, { "order": 1144, - "name": "ivanserran", + "name": "alefine", "count": 1, "languages": 1 }, { "order": 1145, - "name": "alexeigio", + "name": "ivanserran", "count": 1, "languages": 1 }, { "order": 1146, - "name": "fredylopez01", + "name": "alexeigio", "count": 1, "languages": 1 }, { "order": 1147, - "name": "santiagopereiraviroga", + "name": "fredylopez01", "count": 1, "languages": 1 }, { "order": 1148, - "name": "deathbato", + "name": "santiagopereiraviroga", "count": 1, "languages": 1 }, { "order": 1149, - "name": "jony_english22", + "name": "deathbato", "count": 1, "languages": 1 }, { "order": 1150, - "name": "mathiur", + "name": "jony_english22", "count": 1, "languages": 1 }, { "order": 1151, - "name": "derkopath", + "name": "mathiur", "count": 1, "languages": 1 }, { "order": 1152, - "name": "robermejia", + "name": "derkopath", "count": 1, "languages": 1 }, { "order": 1153, - "name": "lautimorales", + "name": "robermejia", "count": 1, "languages": 1 }, { "order": 1154, - "name": "diegopardomontero", + "name": "lautimorales", "count": 1, "languages": 1 }, { "order": 1155, - "name": "adriangonzalezroble", + "name": "diegopardomontero", "count": 1, "languages": 1 }, { "order": 1156, - "name": "dariel800xd", + "name": "adriangonzalezroble", "count": 1, "languages": 1 }, { "order": 1157, - "name": "sxxnzdev", + "name": "dariel800xd", "count": 1, "languages": 1 }, { "order": 1158, - "name": "pguillo", + "name": "sxxnzdev", "count": 1, "languages": 1 }, { "order": 1159, - "name": "dany3gs", + "name": "pguillo", "count": 1, "languages": 1 }, { "order": 1160, - "name": "durwian", + "name": "dany3gs", "count": 1, "languages": 1 }, { "order": 1161, - "name": "antoniojzp86", + "name": "durwian", "count": 1, "languages": 1 }, { "order": 1162, - "name": "jaimenar", + "name": "antoniojzp86", "count": 1, "languages": 1 }, { "order": 1163, - "name": "rreyes0424", + "name": "jaimenar", "count": 1, "languages": 1 }, { "order": 1164, - "name": "javiir", + "name": "rreyes0424", "count": 1, "languages": 1 }, { "order": 1165, - "name": "queralesdev", + "name": "javiir", "count": 1, "languages": 1 }, { "order": 1166, - "name": "cristianmr87", + "name": "queralesdev", "count": 1, "languages": 1 }, { "order": 1167, - "name": "kgrc05", + "name": "cristianmr87", "count": 1, "languages": 1 }, { "order": 1168, - "name": "sanuka78", + "name": "kgrc05", "count": 1, "languages": 1 }, { "order": 1169, - "name": "pvigo10", + "name": "sanuka78", "count": 1, "languages": 1 }, { "order": 1170, - "name": "lizandev", + "name": "pvigo10", "count": 1, "languages": 1 }, { "order": 1171, - "name": "danielcastillo1112", + "name": "lizandev", "count": 1, "languages": 1 }, { "order": 1172, - "name": "devm0nk3y", + "name": "danielcastillo1112", "count": 1, "languages": 1 }, { "order": 1173, - "name": "corvo-99", + "name": "devm0nk3y", "count": 1, "languages": 1 }, { "order": 1174, - "name": "sirvega83", + "name": "corvo-99", "count": 1, "languages": 1 }, { "order": 1175, - "name": "malkarmah", + "name": "sirvega83", "count": 1, "languages": 1 }, { "order": 1176, - "name": "franpua", + "name": "malkarmah", "count": 1, "languages": 1 }, { "order": 1177, - "name": "vinyoles", + "name": "franpua", "count": 1, "languages": 1 }, { "order": 1178, - "name": "omarroman29", + "name": "vinyoles", "count": 1, "languages": 1 }, { "order": 1179, - "name": "theposi", + "name": "omarroman29", "count": 1, "languages": 1 }, { "order": 1180, - "name": "1cel4nc3", + "name": "theposi", "count": 1, "languages": 1 }, { "order": 1181, - "name": "marianofernandezs", + "name": "1cel4nc3", "count": 1, "languages": 1 }, { "order": 1182, - "name": "paluzz", + "name": "marianofernandezs", "count": 1, "languages": 1 }, { "order": 1183, - "name": "sergio-strazzacappa", + "name": "paluzz", "count": 1, "languages": 1 }, { "order": 1184, - "name": "arathhh8", + "name": "sergio-strazzacappa", "count": 1, "languages": 1 }, { "order": 1185, - "name": "juandevian", + "name": "arathhh8", "count": 1, "languages": 1 }, { "order": 1186, - "name": "gabrielcharibpolls", + "name": "juandevian", "count": 1, "languages": 1 }, { "order": 1187, - "name": "jatomas", + "name": "gabrielcharibpolls", "count": 1, "languages": 1 }, { "order": 1188, - "name": "astriebeck", + "name": "jatomas", "count": 1, "languages": 1 }, { "order": 1189, - "name": "rocadev2714", + "name": "astriebeck", "count": 1, "languages": 1 }, { "order": 1190, - "name": "afacorroloscos", + "name": "rocadev2714", "count": 1, "languages": 1 }, { "order": 1191, - "name": "chrisfelixgil", + "name": "afacorroloscos", "count": 1, "languages": 1 }, { "order": 1192, - "name": "marvinagui", + "name": "chrisfelixgil", "count": 1, "languages": 1 }, { "order": 1193, - "name": "ledyam", + "name": "marvinagui", "count": 1, "languages": 1 }, { "order": 1194, - "name": "jcrobles99", + "name": "ledyam", "count": 1, "languages": 1 }, { "order": 1195, - "name": "angel-tineo", + "name": "jcrobles99", "count": 1, "languages": 1 }, { "order": 1196, - "name": "marqitos", + "name": "angel-tineo", "count": 1, "languages": 1 }, { "order": 1197, - "name": "wilibac", + "name": "marqitos", "count": 1, "languages": 1 }, { "order": 1198, - "name": "ishimaku", + "name": "wilibac", "count": 1, "languages": 1 }, { "order": 1199, - "name": "nunezlagos", + "name": "ishimaku", "count": 1, "languages": 1 }, { "order": 1200, - "name": "sandrarg85", + "name": "nunezlagos", "count": 1, "languages": 1 }, { "order": 1201, - "name": "pkmaventura", + "name": "sandrarg85", "count": 1, "languages": 1 }, { "order": 1202, - "name": "miguelgargallo", + "name": "pkmaventura", "count": 1, "languages": 1 }, { "order": 1203, - "name": "lobogeekmx", + "name": "miguelgargallo", "count": 1, "languages": 1 }, { "order": 1204, - "name": "rootqui", + "name": "lobogeekmx", "count": 1, "languages": 1 }, { "order": 1205, - "name": "palons29", + "name": "rootqui", "count": 1, "languages": 1 }, { "order": 1206, - "name": "implevacui", + "name": "palons29", "count": 1, "languages": 1 }, { "order": 1207, - "name": "mickysoft", + "name": "implevacui", "count": 1, "languages": 1 }, { "order": 1208, - "name": "alexisbarradev", + "name": "mickysoft", "count": 1, "languages": 1 }, { "order": 1209, - "name": "tartabullroberto", + "name": "alexisbarradev", "count": 1, "languages": 1 }, { "order": 1210, - "name": "kelvincb", + "name": "tartabullroberto", "count": 1, "languages": 1 }, { "order": 1211, - "name": "lara-vel-dev", + "name": "kelvincb", "count": 1, "languages": 1 }, { "order": 1212, - "name": "serg-pq", + "name": "lara-vel-dev", "count": 1, "languages": 1 }, { "order": 1213, - "name": "acirdevelper", + "name": "serg-pq", "count": 1, "languages": 1 }, { "order": 1214, - "name": "francisleble", + "name": "acirdevelper", "count": 1, "languages": 1 }, { "order": 1215, - "name": "jhordanluyo", + "name": "francisleble", "count": 1, "languages": 1 }, { "order": 1216, - "name": "bokysherlo", + "name": "jhordanluyo", "count": 1, "languages": 1 }, { "order": 1217, - "name": "daniel-cas", + "name": "bokysherlo", "count": 1, "languages": 1 }, { "order": 1218, - "name": "borjadelgadodev", + "name": "daniel-cas", "count": 1, "languages": 1 }, { "order": 1219, - "name": "alvarominarro", + "name": "borjadelgadodev", "count": 1, "languages": 1 }, { "order": 1220, - "name": "mbmaeso", + "name": "alvarominarro", "count": 1, "languages": 1 }, { "order": 1221, - "name": "deiiviitdev", + "name": "mbmaeso", "count": 1, "languages": 1 }, { "order": 1222, - "name": "braiso-22", + "name": "deiiviitdev", "count": 1, "languages": 1 }, { "order": 1223, - "name": "davidcv-dev", + "name": "braiso-22", "count": 1, "languages": 1 }, { "order": 1224, - "name": "luisalberto22", + "name": "davidcv-dev", "count": 1, "languages": 1 }, { "order": 1225, - "name": "mauricioyair", + "name": "luisalberto22", "count": 1, "languages": 1 }, { "order": 1226, - "name": "rulo77", + "name": "mauricioyair", "count": 1, "languages": 1 }, { "order": 1227, - "name": "serg032", + "name": "rulo77", "count": 1, "languages": 1 }, { "order": 1228, - "name": "jancalos", + "name": "serg032", "count": 1, "languages": 1 }, { "order": 1229, - "name": "manuhssj", + "name": "jancalos", "count": 1, "languages": 1 }, { "order": 1230, - "name": "feliaguirre7", + "name": "manuhssj", "count": 1, "languages": 1 }, { "order": 1231, - "name": "manugonzalito", + "name": "feliaguirre7", "count": 1, "languages": 1 }, { "order": 1232, - "name": "cibacoa", + "name": "manugonzalito", "count": 1, "languages": 1 }, { "order": 1233, - "name": "lucc4sz", + "name": "cibacoa", "count": 1, "languages": 1 }, { "order": 1234, - "name": "gizelads", + "name": "lucc4sz", "count": 1, "languages": 1 }, { "order": 1235, - "name": "deaconst", + "name": "gizelads", "count": 1, "languages": 1 }, { "order": 1236, - "name": "marcosapodaca", + "name": "deaconst", "count": 1, "languages": 1 }, { "order": 1237, - "name": "coletonosh", + "name": "marcosapodaca", "count": 1, "languages": 1 }, { "order": 1238, - "name": "axelwestman", + "name": "coletonosh", "count": 1, "languages": 1 }, { "order": 1239, - "name": "is2095", + "name": "axelwestman", "count": 1, "languages": 1 }, { "order": 1240, - "name": "seigigim", + "name": "is2095", "count": 1, "languages": 1 }, { "order": 1241, - "name": "javodevon", + "name": "seigigim", "count": 1, "languages": 1 }, { "order": 1242, - "name": "marcosjarrin", + "name": "javodevon", "count": 1, "languages": 1 }, { "order": 1243, - "name": "angelcruzg23", + "name": "marcosjarrin", "count": 1, "languages": 1 }, { "order": 1244, - "name": "fernandofl", + "name": "angelcruzg23", "count": 1, "languages": 1 }, { "order": 1245, - "name": "quirogapau", + "name": "fernandofl", "count": 1, "languages": 1 }, { "order": 1246, - "name": "brayancordova1", + "name": "quirogapau", "count": 1, "languages": 1 }, { "order": 1247, - "name": "yaojema", + "name": "brayancordova1", "count": 1, "languages": 1 }, { "order": 1248, - "name": "gerespinosa", + "name": "yaojema", "count": 1, "languages": 1 }, { "order": 1249, - "name": "flarien", + "name": "gerespinosa", "count": 1, "languages": 1 }, { "order": 1250, - "name": "lopesteban", + "name": "flarien", "count": 1, "languages": 1 }, { "order": 1251, - "name": "gc796", + "name": "lopesteban", "count": 1, "languages": 1 }, { "order": 1252, - "name": "nixoo657", + "name": "gc796", "count": 1, "languages": 1 }, { "order": 1253, - "name": "miguelsarm", + "name": "nixoo657", "count": 1, "languages": 1 }, { "order": 1254, - "name": "diego-santana23", + "name": "miguelsarm", "count": 1, "languages": 1 }, { "order": 1255, - "name": "edperez07", + "name": "diego-santana23", "count": 1, "languages": 1 }, { "order": 1256, - "name": "siuldev", + "name": "edperez07", "count": 1, "languages": 1 }, { "order": 1257, - "name": "alvarommedia", + "name": "siuldev", "count": 1, "languages": 1 }, { "order": 1258, - "name": "johanrv", + "name": "alvarommedia", "count": 1, "languages": 1 }, { "order": 1259, - "name": "mekanicas", + "name": "johanrv", "count": 1, "languages": 1 }, { "order": 1260, - "name": "cristiantorres53", + "name": "mekanicas", "count": 1, "languages": 1 }, { "order": 1261, - "name": "rojasvargas", + "name": "cristiantorres53", "count": 1, "languages": 1 }, { "order": 1262, - "name": "nicorey89", + "name": "rojasvargas", "count": 1, "languages": 1 }, { "order": 1263, - "name": "estefrac", + "name": "nicorey89", "count": 1, "languages": 1 }, { "order": 1264, - "name": "rotsenn", + "name": "estefrac", "count": 1, "languages": 1 }, { "order": 1265, - "name": "pointfs", + "name": "rotsenn", "count": 1, "languages": 1 }, { "order": 1266, - "name": "royhuamanavila", + "name": "pointfs", "count": 1, "languages": 1 }, { "order": 1267, - "name": "sixtodev", + "name": "royhuamanavila", "count": 1, "languages": 1 }, { "order": 1268, - "name": "jd-gm", + "name": "sixtodev", "count": 1, "languages": 1 }, { "order": 1269, - "name": "pierre-ol", + "name": "jd-gm", "count": 1, "languages": 1 }, { "order": 1270, - "name": "jpiacaruso", + "name": "pierre-ol", "count": 1, "languages": 1 }, { "order": 1271, - "name": "kouski", + "name": "jpiacaruso", "count": 1, "languages": 1 }, { "order": 1272, - "name": "dianelis1", + "name": "kouski", "count": 1, "languages": 1 }, { "order": 1273, - "name": "kinrgdev", + "name": "dianelis1", "count": 1, "languages": 1 }, { "order": 1274, - "name": "rodmiggithub", + "name": "kinrgdev", "count": 1, "languages": 1 }, { "order": 1275, - "name": "augustbs", + "name": "rodmiggithub", "count": 1, "languages": 1 }, { "order": 1276, - "name": "aleclto7", + "name": "augustbs", "count": 1, "languages": 1 }, { "order": 1277, - "name": "alemar16", + "name": "aleclto7", "count": 1, "languages": 1 }, { "order": 1278, - "name": "vmga09", + "name": "alemar16", "count": 1, "languages": 1 }, { "order": 1279, - "name": "cgomezadolfo", + "name": "vmga09", "count": 1, "languages": 1 }, { "order": 1280, - "name": "nnunezmedina", + "name": "cgomezadolfo", "count": 1, "languages": 1 }, { "order": 1281, - "name": "luchof5", + "name": "nnunezmedina", "count": 1, "languages": 1 }, { "order": 1282, - "name": "edgonzz", + "name": "luchof5", "count": 1, "languages": 1 }, { "order": 1283, - "name": "ronnieruuz", + "name": "edgonzz", "count": 1, "languages": 1 }, { "order": 1284, - "name": "ercky1980", + "name": "ronnieruuz", "count": 1, "languages": 1 }, { "order": 1285, - "name": "maximotoro", + "name": "ercky1980", "count": 1, "languages": 1 }, { "order": 1286, - "name": "kenzambrano", + "name": "maximotoro", "count": 1, "languages": 1 }, { "order": 1287, - "name": "lfam200", + "name": "kenzambrano", "count": 1, "languages": 1 }, { "order": 1288, - "name": "antonioverdugo", + "name": "lfam200", "count": 1, "languages": 1 }, { "order": 1289, - "name": "madelefonb", + "name": "antonioverdugo", "count": 1, "languages": 1 }, { "order": 1290, - "name": "dacronik", + "name": "madelefonb", "count": 1, "languages": 1 }, { "order": 1291, - "name": "kronomio", + "name": "dacronik", "count": 1, "languages": 1 }, { "order": 1292, - "name": "1978acb", + "name": "kronomio", "count": 1, "languages": 1 }, { "order": 1293, - "name": "xnomada", + "name": "1978acb", "count": 1, "languages": 1 }, { "order": 1294, - "name": "imista", + "name": "xnomada", "count": 1, "languages": 1 }, { "order": 1295, - "name": "dmhenaopa", + "name": "imista", "count": 1, "languages": 1 }, { "order": 1296, - "name": "lugryssd3v", + "name": "dmhenaopa", "count": 1, "languages": 1 }, { "order": 1297, - "name": "gustavoguerrero", + "name": "lugryssd3v", "count": 1, "languages": 1 }, { "order": 1298, - "name": "datrujillog", + "name": "gustavoguerrero", "count": 1, "languages": 1 }, { "order": 1299, - "name": "romanocoder", + "name": "datrujillog", "count": 1, "languages": 1 }, { "order": 1300, - "name": "hfvaronb", + "name": "romanocoder", "count": 1, "languages": 1 }, { "order": 1301, - "name": "kocho03", + "name": "hfvaronb", "count": 1, "languages": 1 }, { "order": 1302, - "name": "johnniew81", + "name": "kocho03", "count": 1, "languages": 1 }, { "order": 1303, - "name": "vainsito1", + "name": "johnniew81", "count": 1, "languages": 1 }, { "order": 1304, - "name": "s9code", + "name": "vainsito1", "count": 1, "languages": 1 }, { "order": 1305, - "name": "albabp", + "name": "s9code", "count": 1, "languages": 1 }, { "order": 1306, - "name": "joseperesini", + "name": "albabp", "count": 1, "languages": 1 }, { "order": 1307, - "name": "chriszaldana", + "name": "joseperesini", "count": 1, "languages": 1 }, { "order": 1308, - "name": "diegoxxd", + "name": "chriszaldana", "count": 1, "languages": 1 }, { "order": 1309, - "name": "aidicoop", + "name": "diegoxxd", "count": 1, "languages": 1 }, { "order": 1310, - "name": "krrattoss5", + "name": "aidicoop", "count": 1, "languages": 1 }, { "order": 1311, - "name": "javieradev", + "name": "krrattoss5", "count": 1, "languages": 1 }, { "order": 1312, - "name": "lfwzk", + "name": "javieradev", "count": 1, "languages": 1 }, { "order": 1313, - "name": "fullstackarlo", + "name": "lfwzk", "count": 1, "languages": 1 }, { "order": 1314, - "name": "leydimadrid", + "name": "fullstackarlo", "count": 1, "languages": 1 }, { "order": 1315, - "name": "joshua0730-star", + "name": "leydimadrid", "count": 1, "languages": 1 }, { "order": 1316, - "name": "afl0r3s", + "name": "joshua0730-star", "count": 1, "languages": 1 }, { "order": 1317, - "name": "sejotaz", + "name": "afl0r3s", "count": 1, "languages": 1 }, { "order": 1318, - "name": "alexxawada", + "name": "sejotaz", "count": 1, "languages": 1 }, { "order": 1319, - "name": "juanserdev", + "name": "alexxawada", "count": 1, "languages": 1 }, { "order": 1320, - "name": "chrissr0", + "name": "juanserdev", "count": 1, "languages": 1 }, { "order": 1321, - "name": "yessikamichelle", + "name": "chrissr0", "count": 1, "languages": 1 }, { "order": 1322, - "name": "l3v1xx", + "name": "yessikamichelle", "count": 1, "languages": 1 }, { "order": 1323, - "name": "juanpablo-a", + "name": "l3v1xx", "count": 1, "languages": 1 }, { "order": 1324, - "name": "nozodev", + "name": "juanpablo-a", "count": 1, "languages": 1 }, { "order": 1325, - "name": "isnatthy", + "name": "nozodev", "count": 1, "languages": 1 }, { "order": 1326, - "name": "frannm29", + "name": "isnatthy", "count": 1, "languages": 1 }, { "order": 1327, - "name": "peticas", + "name": "frannm29", "count": 1, "languages": 1 }, { "order": 1328, - "name": "francomoreira", + "name": "peticas", "count": 1, "languages": 1 }, { "order": 1329, - "name": "jsruedatorres", + "name": "francomoreira", "count": 1, "languages": 1 }, { "order": 1330, - "name": "mdemena", + "name": "jsruedatorres", "count": 1, "languages": 1 }, { "order": 1331, - "name": "saintsluis", + "name": "mdemena", "count": 1, "languages": 1 }, { "order": 1332, - "name": "oscarletelier", + "name": "saintsluis", "count": 1, "languages": 1 }, { "order": 1333, - "name": "nfom24", + "name": "oscarletelier", "count": 1, "languages": 1 }, { "order": 1334, - "name": "patricioguerra30", + "name": "nfom24", "count": 1, "languages": 1 }, { "order": 1335, - "name": "walkerlyna", + "name": "patricioguerra30", "count": 1, "languages": 1 }, { "order": 1336, - "name": "mvillegas18", + "name": "walkerlyna", "count": 1, "languages": 1 }, { "order": 1337, - "name": "alexis0717", + "name": "mvillegas18", "count": 1, "languages": 1 }, { "order": 1338, - "name": "abengl", + "name": "alexis0717", "count": 1, "languages": 1 }, { "order": 1339, - "name": "santaravena", + "name": "abengl", "count": 1, "languages": 1 }, { "order": 1340, - "name": "cliverjimny123", + "name": "santaravena", "count": 1, "languages": 1 }, { "order": 1341, - "name": "kevinramirez28", + "name": "cliverjimny123", "count": 1, "languages": 1 }, { "order": 1342, - "name": "francescoalterio", + "name": "kevinramirez28", "count": 1, "languages": 1 }, { "order": 1343, - "name": "diegoasebey", + "name": "francescoalterio", "count": 1, "languages": 1 }, { "order": 1344, - "name": "victormdev24", + "name": "diegoasebey", "count": 1, "languages": 1 }, { "order": 1345, - "name": "frankqv", + "name": "victormdev24", "count": 1, "languages": 1 }, { "order": 1346, - "name": "denisortega", + "name": "frankqv", "count": 1, "languages": 1 }, { "order": 1347, - "name": "m4xisil", + "name": "denisortega", "count": 1, "languages": 1 }, { "order": 1348, - "name": "jose-miguel1", + "name": "m4xisil", "count": 1, "languages": 1 }, { "order": 1349, - "name": "conrado85", + "name": "jose-miguel1", "count": 1, "languages": 1 }, { "order": 1350, - "name": "lucianogriffa", + "name": "conrado85", "count": 1, "languages": 1 }, { "order": 1351, - "name": "sergioab7", + "name": "lucianogriffa", "count": 1, "languages": 1 }, { "order": 1352, - "name": "jacobrwx", + "name": "sergioab7", "count": 1, "languages": 1 }, { "order": 1353, - "name": "abraham9804", + "name": "jacobrwx", "count": 1, "languages": 1 }, { "order": 1354, - "name": "agus-ig", + "name": "abraham9804", "count": 1, "languages": 1 }, { "order": 1355, - "name": "lytsar", + "name": "agus-ig", "count": 1, "languages": 1 }, { "order": 1356, - "name": "frcan89", + "name": "lytsar", "count": 1, "languages": 1 }, { "order": 1357, - "name": "mhrosariom", + "name": "frcan89", "count": 1, "languages": 1 }, { "order": 1358, - "name": "ja-bell", + "name": "mhrosariom", "count": 1, "languages": 1 }, { "order": 1359, - "name": "carlosdiaz-dev", + "name": "ja-bell", "count": 1, "languages": 1 }, { "order": 1360, - "name": "codejoss", + "name": "carlosdiaz-dev", "count": 1, "languages": 1 }, { "order": 1361, - "name": "ricarsur", + "name": "codejoss", "count": 1, "languages": 1 }, { "order": 1362, - "name": "fzcarlitos", + "name": "ricarsur", "count": 1, "languages": 1 }, { "order": 1363, - "name": "javosss", + "name": "fzcarlitos", "count": 1, "languages": 1 }, { "order": 1364, - "name": "dgquintero", + "name": "javosss", "count": 1, "languages": 1 }, { "order": 1365, - "name": "torvicv", + "name": "dgquintero", "count": 1, "languages": 1 }, { "order": 1366, - "name": "cyberingeniero", + "name": "torvicv", "count": 1, "languages": 1 }, { "order": 1367, - "name": "markbus-ai", + "name": "cyberingeniero", "count": 1, "languages": 1 }, { "order": 1368, - "name": "opahostil", + "name": "markbus-ai", "count": 1, "languages": 1 }, { "order": 1369, - "name": "gonzalinuz18", + "name": "opahostil", "count": 1, "languages": 1 }, { "order": 1370, - "name": "mmariob", + "name": "gonzalinuz18", "count": 1, "languages": 1 }, { "order": 1371, - "name": "daichiko", + "name": "mmariob", "count": 1, "languages": 1 }, { "order": 1372, - "name": "emanuelgauler", + "name": "daichiko", "count": 1, "languages": 1 }, { "order": 1373, - "name": "albmartinez", + "name": "emanuelgauler", "count": 1, "languages": 1 }, { "order": 1374, - "name": "eduardo282", + "name": "albmartinez", "count": 1, "languages": 1 }, { "order": 1375, - "name": "nightmare79", + "name": "eduardo282", "count": 1, "languages": 1 }, { "order": 1376, - "name": "vikernes27666", + "name": "nightmare79", "count": 1, "languages": 1 }, { "order": 1377, - "name": "cub-tor", + "name": "vikernes27666", "count": 1, "languages": 1 }, { "order": 1378, - "name": "carlosmperezm", + "name": "cub-tor", "count": 1, "languages": 1 }, { "order": 1379, - "name": " maxirica", + "name": "carlosmperezm", "count": 1, "languages": 1 }, { "order": 1380, - "name": "carlosmares", + "name": " maxirica", "count": 1, "languages": 1 }, { "order": 1381, - "name": "jstr14", + "name": "carlosmares", "count": 1, "languages": 1 }, { "order": 1382, - "name": "snaisel", + "name": "jstr14", "count": 1, "languages": 1 }, { "order": 1383, - "name": "thompson6626", + "name": "snaisel", "count": 1, "languages": 1 }, { "order": 1384, - "name": "leonardo-henao", + "name": "thompson6626", "count": 1, "languages": 1 }, { "order": 1385, - "name": "juancamilofvx", + "name": "leonardo-henao", "count": 1, "languages": 1 }, { "order": 1386, - "name": "c-blskv", + "name": "juancamilofvx", "count": 1, "languages": 1 }, { "order": 1387, - "name": "emaerniquez", + "name": "c-blskv", "count": 1, "languages": 1 }, { "order": 1388, - "name": "carolhs92", + "name": "emaerniquez", "count": 1, "languages": 1 }, { "order": 1389, - "name": "edisonlmg", + "name": "carolhs92", "count": 1, "languages": 1 }, From 0539836ebceeb620e5429fe808adc2258bd9971b Mon Sep 17 00:00:00 2001 From: Jesus Antonio Escamilla Date: Mon, 30 Dec 2024 03:57:29 -0600 Subject: [PATCH 095/104] #50 - JavaScript --- .../javascript/JesusAntonioEEscamilla.js" | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/JesusAntonioEEscamilla.js" diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/JesusAntonioEEscamilla.js" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/JesusAntonioEEscamilla.js" new file mode 100644 index 0000000000..ddec9d5e6a --- /dev/null +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/javascript/JesusAntonioEEscamilla.js" @@ -0,0 +1,103 @@ +/** #50 - JavaScript -> Jesus Antonio Escamilla */ + +/** + * PLANIFICADOR DE OBJETIVOS DE AÑO NUEVO. + * Utilizando la Terminal para pedir datos y agregarlos. + */ + +const fs = require('fs'); + +class GoalManager { + constructor() { + this.goals = []; + } + + addGoal(name, quantity, unit, months){ + if (this.goals.length >= 10) { + console.log("\nNo puedes añadir más de 10 objetivos."); + return; + } + + if (months > 12 || months <= 0) { + console.log("\nEl plazo debe ser entre 1 y 12 meses."); + return; + } + + this.goals.push({ + name, + quantity, + unit, + months + }); + + console.log(`\nObjetivo añadido: ${name} (${quantity} ${unit}, ${months} meses).`); + } + + generateDetailedPlan(){ + if (this.goals.length === 0) { + console.log("\nNo hay objetivos para planificar."); + return; + } + + let plan = "\nPlanificación detallada:\n\n"; + const monthsNames = [ + "Enero", + "Febrero", + "Marzo", + "Abril", + "Mayo", + "Junio", + "Julio", + "Agosto", + "Septiembre", + "Octubre", + "Noviembre", + "Diciembre", + ]; + + for (let i = 0; i < 12; i++) { + let currentMothGoals = []; + this.goals.forEach((goal, index) => { + if (i < goal.months) { + const monthlyQuantity = Math.ceil(goal.quantity / goal.months); + currentMothGoals.push( + `[ ] ${index + 1}. ${goal.name} (${monthlyQuantity} ${goal.unit}/mes). Total: ${goal.quantity}.\n` + ); + } + }); + + if (currentMothGoals.length > 0) { + plan += `\n${monthsNames[i]}:\n`; + plan += currentMothGoals.join("\n" + "\n\n"); + } + } + + return plan; + } + + savePlanToFile(filename = "detailed_plan.txt"){ + const plan = this.generateDetailedPlan(); + if (!plan) return; + + fs.writeFile(filename, plan, (err) => { + if (err) { + console.log("\nError al guardar el archivo:", err); + } else { + console.log(`\nPlanificación guardada en el archivo: ${filename}`); + } + }); + } +} + +// Ejemplo para usarlo +const manager = new GoalManager(); + +manager.addGoal("Leer libros", 12, "libros", 12); +manager.addGoal("Estudiar Git", 1, "curso", 6); +manager.addGoal("Correr", 500, "km", 12); + +const detailedPlan = manager.generateDetailedPlan(); +if (detailedPlan) { + console.log(detailedPlan); +} +manager.savePlanToFile(); \ No newline at end of file From a6b3e544c20661310971079c25ebfa90dc408467 Mon Sep 17 00:00:00 2001 From: johnalexguerrero Date: Mon, 30 Dec 2024 10:56:18 -0500 Subject: [PATCH 096/104] Reto#50-Java --- .../java/JohnAlexGuerrero.java" | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/java/JohnAlexGuerrero.java" diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/java/JohnAlexGuerrero.java" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/java/JohnAlexGuerrero.java" new file mode 100644 index 0000000000..4d4b85e2fd --- /dev/null +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/java/JohnAlexGuerrero.java" @@ -0,0 +1,156 @@ +package org.example; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.reflect.Array; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.stream.Collectors; + +// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`, +// then press Enter. You can now see whitespace characters in your code. +public class Main { + public static void main(String[] args) { + // agregar una lista de 10 objetivos para alcanzar en el nuevo año + List goals = Arrays.asList( + new Goal("Leer Libros",24, "Libro", 12), + new Goal("Estudiar Git", 1, "curso", 1), + new Goal("Hablar Ingles", 1, "Curso", 6), + new Goal("Aprender a Tocar Guitarra", 8, "Curso", 8), + new Goal("Aprender a Nadar", 2, "Curso", 2), + new Goal("ldkfldkf", 45, "Curso", 6) + ); + + // permitir añadir solo 10 objetivos como maximo + if(goals.size() > 10){ + System.out.println("Solo es permitido maximo 10 Objetivos"); + System.out.println("Debes eliminar " + (goals.size() - 10)); + System.exit(1); + } + System.out.println("Total Objetivos: " + goals.size()); + + // Cada objetivo tiene un plazo maximo de 12 meses + boolean anyHaveTimeMaxTwelveMonths = goals.stream() + .anyMatch(e -> e.getNumberMonths() > 12); + + if(anyHaveTimeMaxTwelveMonths){ + System.out.println("existe un objetivo con plazo mayor a 12 meses."); + System.out.println("revisa el plazo de tus objetivos."); + System.exit(1); + } + + // Calcular el plan detallado + // arreglo type String con los meses del año + String [] months = {"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"}; + // map type key-value donde la key es el plazo en meses para alcanzar el objetivo + // el value es una lista de objetivos que tienen la misma duración en meses + Map> goalsByAmount = goals.stream() + .collect(Collectors.groupingBy(Goal::getNumberMonths)); + // HashMap > para + HashMap > plan = new HashMap<>(); + + for(String m : months){ + List goalList = new ArrayList<>(); + for (Integer i: goalsByAmount.keySet()){ + if(plan.size() >= i){ + continue; + }else{ + for(Goal g : goalsByAmount.get(i)){ + goalList.add(g); + } + + } + } + plan.put(m, goalList); + } + + //Mostrar la planificación de objetivos por mes + for (String m: months) { + System.out.println(m + ":"); + for(Goal g: plan.get(m)){ + System.out.println(g); + + } + } + + // Guardar la planificación en archivo txt + try { + File fileData = new File("planificacion.txt"); + if(fileData.createNewFile()){ + FileWriter fileWriter = new FileWriter(fileData.getPath()); + for (String m: months) { + fileWriter.write(m + "\n"); + for(Goal g: plan.get(m)){ + fileWriter.write(g.toString() + "\n"); + } + } + fileWriter.close(); + System.out.println("fichero: " + fileData.getName() + " creado"); + System.out.println(fileData.getPath()); + }else{ + System.out.println("No se ha podido crear el fichero."); + System.out.println(fileData.getPath()); + } + }catch (IOException error){ + System.out.println("Error de creacion de fichero."); + error.printStackTrace(); + } + } + + + static class Goal{ + private String title; + private int amount; + private String units; + private int numberMonths; + + public Goal(String title, int amount, String units, int numberMonths) { + this.title = title; + this.amount = amount; + this.units = units; + this.numberMonths = numberMonths; + + } + + public String getTitle() { + return title; + } + + public int getAmount() { + return amount; + } + + public String getUnits() { + return units; + } + + public int getNumberMonths() { + return numberMonths; + } + + // calcular el numero de unidades aplicadas en cada mes + public int getUnitByMonth(){ + if(this.amount == this.numberMonths) return (this.amount / this.numberMonths); + if(this.amount < this.numberMonths) return 1; + if(this.amount > this.numberMonths) { + var resM = Math.round((float) this.amount / this.numberMonths); + var resU = this.amount % this.numberMonths; + //System.out.println("r:"+resU); + if(resU == 0) return resM; + return resM; + } + + return 3; + } + + // cada objetivo debe poseer un nombre, la cantidad de unidades a completar y su total + @Override + public String toString() { + return "[] 1. " + this.getTitle() + " ("+ this.getUnitByMonth() + " " + this.getUnits() + "/mes). Total: " + this.getAmount() + "."; + } + } + +} \ No newline at end of file From c5bfc914c034342402c962db9c1832bfa1103a3b Mon Sep 17 00:00:00 2001 From: Miguel Portillo Date: Mon, 30 Dec 2024 12:26:37 -0500 Subject: [PATCH 097/104] 11 - Go --- .../11 - MANEJO DE FICHEROS/go/MiguelP-Dev.go | 369 ++++++++++++++++++ 1 file changed, 369 insertions(+) create mode 100644 Roadmap/11 - MANEJO DE FICHEROS/go/MiguelP-Dev.go diff --git a/Roadmap/11 - MANEJO DE FICHEROS/go/MiguelP-Dev.go b/Roadmap/11 - MANEJO DE FICHEROS/go/MiguelP-Dev.go new file mode 100644 index 0000000000..fe9f959255 --- /dev/null +++ b/Roadmap/11 - MANEJO DE FICHEROS/go/MiguelP-Dev.go @@ -0,0 +1,369 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +// Con el paquete "os" podemos manejar la apertura, el cierre, la lectura y escritura de archivos, +// así como la obtención y configuración de atributos de los mismos. + +func main() { + // filename Constante que contiene el nombre del archivo. + const fileName = "MiguelP-Dev.txt" + message := []byte("Miguel\n 31 Años.\n Golang.") + + // Creamos el archivo para su uso + file, err := os.Create(fileName) + if err != nil { + fmt.Println("Error al crear el archivo.", fileName) + return + } + + // Garanticemos que el archivo se cierre enventualmente + defer file.Close() + + // Apertura del archivo con permisos de escritura + file, err = os.OpenFile(fileName, os.O_RDWR, 0644) + if err != nil { + fmt.Println("Error abriendo el archivo:", err) + return + } + + // Escribir contenido en el archivo + _, writeError := file.Write(message) + if writeError != nil { + fmt.Println("Error al escribir en el archivo:", writeError) + return + } + + // Leer el archivo desde el principio + file.Seek(0, 0) + buffer := make([]byte, len(message)) + _, readError := file.Read(buffer) + if readError != nil { + fmt.Println("Error al leer el archivo:", readError) + return + } + fmt.Println("Contenido del archivo:", string(buffer)) + + // Eliminamos el archivo + err = os.Remove(fileName) + if err != nil { + fmt.Println("error al eliminar el archivo") + return + } + + // Extra + // Creamos el archivo y controlamos el posible error + file, err = os.OpenFile(productsFile, os.O_APPEND|os.O_CREATE, 0644) + if err != nil { + fmt.Println("Error al crear el archivo Main():", err) + return + } + + err = file.Close() + if err != nil { + fmt.Println("Error al cerrar el archivo Main(): ", err) + } + + var productName string + var productQuantity string + var productPrice string + var option uint + + for { + fmt.Println("Selecciona una de las opciones: ") + fmt.Println("1. Añadir un Producto") + fmt.Println("2. Consultar un producto") + fmt.Println("3. Consultar lista de productos") + fmt.Println("4. Consultar precio unitario de productos") + fmt.Println("5. Consultar venta total") + fmt.Println("6. Actualizar un producto") + fmt.Println("7. Eliminar un producto") + fmt.Println("8. Salir") + fmt.Scan(&option) + + switch option { + case 1: + fmt.Printf("Ingresa el nombre del producto: ") + fmt.Scan(&productName) + fmt.Printf("Ingresa la cantidad: ") + fmt.Scan(&productQuantity) + fmt.Printf("Ingresa el valor: ") + fmt.Scan(&productPrice) + err := pro.AddingProduct(productName, productQuantity, productPrice) + if err != nil { + fmt.Println("Error AddingProduct(): ", err) + } + case 2: + fmt.Printf("Ingresa el nombre del producto: ") + fmt.Scan(&productName) + err := pro.searchProduct(productName) + if err != nil { + fmt.Println("Error searchProduct(): ", err) + } + case 3: + err := pro.listOfProducts() + if err != nil { + fmt.Println("Error listOfProducts(): ", err) + } + case 4: + err := pro.totalSaleByProduct() + if err != nil { + fmt.Println("Error totalSaleByProduct(): ", err) + } + case 5: + err := pro.totalSaleAmount() + if err != nil { + fmt.Println("Error totalSaleAmount(): ", err) + } + case 6: + fmt.Printf("Ingresa el nombre del producto: ") + fmt.Scan(&productName) + fmt.Printf("Ingresa la cantidad: ") + fmt.Scan(&productQuantity) + fmt.Printf("Ingresa el valor: ") + fmt.Scan(&productPrice) + err := pro.updateProduct(productName, productQuantity, productPrice) + if err != nil { + fmt.Println("Error updateProduct(): ", err) + } + case 7: + fmt.Println("Ingrese el nombre del producto a eliminar: ") + fmt.Scan(&productName) + pro.deleteProduct(productName) + case 8: + err := os.Remove(productsFile) + if err != nil { + fmt.Println("Error al eliminar el archivo:", err) + return + } + os.Exit(0) + default: + fmt.Println("Selecciona una opcion correcta\n") + } + } +} + +var productsFile = "Productos.txt" +var tmpFile = "tmp.txt" + +type products struct { + name string + quantity string + price string +} + +var pro = products{} + +func (p *products) AddingProduct(name, quantity, price string) error { + + products, err := search(productsFile) + if err != nil { + return err + } + + err = os.Remove(productsFile) + if err != nil { + return err + } + + file, err := os.Create(productsFile) + if err != nil { + return err + } + defer file.Close() + + if len(products) > 0 { + for _, product := range products { + _, err = file.WriteString(product + "\n") + if err != nil { + return err + } + } + } + + newProduct := strings.ToLower(name) + ", " + quantity + ", " + price + "\n" + _, err = file.WriteString(newProduct) + if err != nil { + return err + } + + err = file.Sync() + if err != nil { + return err + } + return nil +} + +func (p *products) searchProduct(name string) error { + products, err := search(productsFile) + if err != nil { + return err + } + + for _, product := range products { + split := strings.Split(product, ", ") + if strings.ToLower(split[0]) == strings.ToLower(name) { + fmt.Printf("Nombre: %s, Cantidad: %s, Valor: %s.\n", split[0], split[1], split[2]) + return nil + } + } + fmt.Printf("Producto %s no encontrado.\n", strings.ToUpper(name)) + return nil +} + +func (p *products) listOfProducts() error { + products, err := search(productsFile) + if err != nil { + return err + } + + for _, product := range products { + split := strings.Split(product, ", ") + fmt.Printf("Nombre: %s, Cantidad: %s, Valor: %s.\n", split[0], split[1], split[2]) + } + return nil +} + +func (p *products) deleteProduct(name string) error { + products, err := search(productsFile) + if err != nil { + return err + } + + var newProducts = []string{} + for _, product := range products { + splited := strings.Split(product, ", ") + if strings.ToLower(splited[0]) != strings.ToLower(name) { + newProducts = append(newProducts, splited[0]+", "+splited[1]+", "+splited[2]) + } + } + + err = os.Remove(productsFile) + if err != nil { + return err + } + + file, err := os.Create(productsFile) + if err != nil { + return err + } + defer file.Close() + + for i := 0; i <= len(newProducts)-1; i++ { + file.WriteString(newProducts[i] + "\n") + } + file.Sync() + + return nil +} + +func (p *products) updateProduct(name, quantity, price string) error { + products, err := search(productsFile) + if err != nil { + return err + } + + var newProducts = []string{} + for _, product := range products { + splited := strings.Split(product, ", ") + if strings.ToLower(splited[0]) != strings.ToLower(name) { + newProducts = append(newProducts, splited[0]+", "+splited[1]+", "+splited[2]) + } else if strings.ToLower(splited[0]) == strings.ToLower(name) { + newProducts = append(newProducts, name+", "+quantity+", "+price) + } + } + + err = os.Remove(productsFile) + if err != nil { + return err + } + + file, err := os.Create(productsFile) + if err != nil { + return err + } + defer file.Close() + + for i := 0; i <= len(newProducts)-1; i++ { + file.WriteString(newProducts[i] + "\n") + } + file.Sync() + + return nil +} + +func (p *products) totalSaleAmount() error { + products, err := search(productsFile) + if err != nil { + return err + } + amounts := []string{} + for _, product := range products { + split := strings.Split(product, ", ") + amounts = append(amounts, split[2]) + } + + var total float64 + for i := 0; i <= len(amounts)-1; i++ { + conversion, err := strconv.ParseFloat(amounts[i], 64) + if err != nil { + return err + } + total += conversion + } + fmt.Printf("Total vendido: %v\n", total) + return nil +} + +func (p *products) totalSaleByProduct() error { + products, err := search(productsFile) + if err != nil { + return err + } + + for i := 0; i <= len(products)-1; i++ { + splittedProduct := strings.Split(products[i], ", ") + + price, err := strconv.ParseFloat(splittedProduct[2], 64) + if err != nil { + return err + } + + quantity, err := strconv.Atoi(splittedProduct[1]) + if err != nil { + return err + } + + unitaryPrice := price / float64(quantity) + + fmt.Printf("Producto: %s, Cantidad total: %v, Precio total: %v, Precio por unidad: %v\n", splittedProduct[0], splittedProduct[2], quantity, unitaryPrice) + } + + return nil +} + +func search(filename string) ([]string, error) { + file, err := os.OpenFile(filename, os.O_RDONLY, 0644) + if err != nil { + return []string{}, err + } + defer file.Close() + + var products = []string{} + scanner := bufio.NewScanner(file) + for scanner.Scan() { + products = append(products, scanner.Text()) + } + + if err := scanner.Err(); err != nil { + return []string{}, err + } + + return products, nil +} From 44363154ea2145123def1b7deec7f86c9be45b27 Mon Sep 17 00:00:00 2001 From: Bruce <88008233+Roswell468@users.noreply.github.com> Date: Mon, 30 Dec 2024 16:18:50 -0300 Subject: [PATCH 098/104] Delete Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/.gitignore --- .../java/JohnAlexGuerrero/.gitignore | 38 ------------------- 1 file changed, 38 deletions(-) delete mode 100644 Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/.gitignore diff --git a/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/.gitignore b/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/.gitignore deleted file mode 100644 index 5ff6309b71..0000000000 --- a/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### IntelliJ IDEA ### -.idea/modules.xml -.idea/jarRepositories.xml -.idea/compiler.xml -.idea/libraries/ -*.iws -*.iml -*.ipr - -### Eclipse ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ - -### Mac OS ### -.DS_Store \ No newline at end of file From 2ef7033d0ee79f1a81d546ef06d0eeb2f31072d3 Mon Sep 17 00:00:00 2001 From: Bruce <88008233+Roswell468@users.noreply.github.com> Date: Mon, 30 Dec 2024 16:19:11 -0300 Subject: [PATCH 099/104] Delete Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/src/main/java/org/example/Main.java --- .../src/main/java/org/example/Main.java | 113 ------------------ 1 file changed, 113 deletions(-) delete mode 100644 Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/src/main/java/org/example/Main.java diff --git a/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/src/main/java/org/example/Main.java b/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/src/main/java/org/example/Main.java deleted file mode 100644 index 823c966d58..0000000000 --- a/Roadmap/46 - X VS BLUESKY/java/JohnAlexGuerrero/src/main/java/org/example/Main.java +++ /dev/null @@ -1,113 +0,0 @@ -package org.example; - -import java.util.HashSet; -import java.util.Objects; - -// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`, -// then press Enter. You can now see whitespace characters in your code. -public class Main { - public static void main(String[] args) { - SocialNetwork socialnetwork = new SocialNetwork(); - - //- Registrar un usuario por defecto con nombre e identificador único. - socialnetwork.registerUser("u123", "alexander guerrero"); - socialnetwork.registerUser("u456", "sandra estacio"); - socialnetwork.registerUser("u467", "carolina maigual"); - socialnetwork.registerUser("u897", "mileidy cruz"); - socialnetwork.registerUser("u230", "daniel botina"); - socialnetwork.registerUser("u239", "diego botina"); - socialnetwork.registerUser("u348", "gloria maigual"); - socialnetwork.registerUser("u438", "teresa maigual"); - socialnetwork.registerUser("u489", "alejandra rojas"); - - //- Seleccionar un usuario - User u1 = socialnetwork.getUser("u489"); - //- Un usuario puede seguir/dejar de seguir a otro. - u1.followUser("u348"); - u1.followUser("u467"); - u1.followUser("u897"); - - //- Mostrar usuarios - for (User user : socialnetwork.getUsers()) { - System.out.println(user.toString()); - } - } -} - -class SocialNetwork{ - private static HashSet users; - public SocialNetwork() { - users = new HashSet<>(); - } - public void registerUser(String id, String name){ - users.add(new User(id, name)); - } - public User getUser(String id){ - for(User user: users){ - if(user.getId().equals(id)){ - return user; - } - } - return null; - } - public void unfollowUser(){} - public HashSet getUsers() { - return users; - } -} - -class User{ - private String id; - private String name; - private HashSet followers; - private HashSet following; - public void followUser(String followIdUser){ - followers.add(followIdUser); - } - - public User(String id, String name) { - this.id = id; - this.name = name; - this.followers = new HashSet(); - this.following = new HashSet(); - } - - public String getId() { - return id; - } - - public String getName() { - return name; - } - - public HashSet getFollowers() { - return followers; - } - - public HashSet getFollowing() { - return following; - } - - @Override - public String toString() { - return "User{" + - "id='" + id + '\'' + - ", name='" + name + '\'' + - ", followers=" + followers + - ", following=" + following + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - User user = (User) o; - return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(followers, user.followers) && Objects.equals(following, user.following); - } - - @Override - public int hashCode() { - return Objects.hash(id, name, followers, following); - } -} From a390a594fbaa827dd09a9e7feaf8e3cbb4b20c06 Mon Sep 17 00:00:00 2001 From: Brais Moure Date: Mon, 30 Dec 2024 21:38:48 +0100 Subject: [PATCH 100/104] =?UTF-8?q?Correcci=C3=B3n=20Roadmap=2050?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +- .../python/mouredev.py" | 143 ++++++++++++++++++ 2 files changed, 144 insertions(+), 10 deletions(-) create mode 100644 "Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/mouredev.py" diff --git a/README.md b/README.md index bd2ba5eb46..17ac02677b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ # Roadmap retos de programación semanales 2024 - ### Ruta de estudio con ejercicios para mejorar tu lógica de programación y aprender cualquier lenguaje. Gratis, a tu ritmo y en comunidad. #### [https://retosdeprogramacion.com/roadmap](https://retosdeprogramacion.com/roadmap) @@ -16,20 +15,12 @@ ## Información importante -* Cada semana se publica un nuevo reto y se corrige en directo desde **[Twitch](https://twitch.tv/mouredev)** el ejercicio de la semana pasada. -* En la sección "Eventos" de nuestro servidor de **[Discord](https://discord.gg/mouredev)** encontrarás el día y horario por país de los directos. * Puedes utilizar **cualquier lenguaje de programación**, y encontrar tanto mis correcciones como las de la comunidad en el directorio de cada reto. * **¿Quieres participar?** Te lo explico en la sección **[Instrucciones](https://github.com/mouredev/roadmap-retos-programacion#instrucciones)** en este mismo documento. * Los retos siguen un orden basado en su ruta de estudio pero si ya tienes conocimientos puedes resolverlos de manera totalmente independiente. Simplemente revisa su nivel de dificultad. -* Una vez se haya cumplido la semana de publicación del reto, podrás consultar mi corrección y las de la comunidad en cualquier lenguaje de programación. > Consulta la [web](https://retosdeprogramacion.com/roadmap) para más información. -## Corrección y próximo ejercicio - -> #### Lunes 30 de diciembre de 2024 a las 20:00 (hora España) desde **[Twitch](https://twitch.tv/mouredev)** -> #### Consulta el **[horario](https://discord.gg/6qdjZwXA?event=1318390433465765918)** por país y crea un **[recordatorio](https://discord.gg/6qdjZwXA?event=1318390433465765918)** - ## Roadmap | # | Ejercicio | Corrección | Vídeo | Comunidad | @@ -84,7 +75,7 @@ |47|[CALENDARIO DE ADVIENTO](./Roadmap/47%20-%20CALENDARIO%20DE%20ADVIENTO/ejercicio.md)|[📝](./Roadmap/47%20-%20CALENDARIO%20DE%20ADVIENTO/python/mouredev.py)|[▶️](https://youtu.be/LteI1J5gmZw)|[👥](./Roadmap/47%20-%20CALENDARIO%20DE%20ADVIENTO/) |48|[ÁRBOL DE NAVIDAD](./Roadmap/48%20-%20ÁRBOL%20DE%20NAVIDAD/ejercicio.md)|[📝](./Roadmap/48%20-%20ÁRBOL%20DE%20NAVIDAD/python/mouredev.py)|[▶️](https://youtu.be/bIguZe3iXVo)|[👥](./Roadmap/48%20-%20ÁRBOL%20DE%20NAVIDAD/) |49|[EL ALMACÉN DE PAPÁ NOEL](./Roadmap/49%20-%20EL%20ALMACÉN%20DE%20PAPÁ%20NOEL/ejercicio.md)|[📝](./Roadmap/49%20-%20EL%20ALMACÉN%20DE%20PAPÁ%20NOEL/python/mouredev.py)|[▶️](https://youtu.be/XGMxosQArxw)|[👥](./Roadmap/49%20-%20EL%20ALMACÉN%20DE%20PAPÁ%20NOEL/) -|50|[PLANIFICADOR DE OBJETIVOS DE AÑO NUEVO](./Roadmap/50%20-%20PLANIFICADOR%20DE%20OBJETIVOS%20DE%20A%C3%91O%20NUEVO/ejercicio.md)|[🗓️ 30/12/24](https://discord.gg/6qdjZwXA?event=1318390433465765918)||[👥](./Roadmap/50%20-%20PLANIFICADOR%20DE%20OBJETIVOS%20DE%20A%C3%91O%20NUEVO/) +|50|[PLANIFICADOR DE OBJETIVOS DE AÑO NUEVO](./Roadmap/50%20-%20PLANIFICADOR%20DE%20OBJETIVOS%20DE%20A%C3%91O%20NUEVO/ejercicio.md)|[📝](./Roadmap/50%20-%20PLANIFICADOR%20DE%20OBJETIVOS%20DE%20A%C3%91O%20NUEVO/python/mouredev.py)||[👥](./Roadmap/50%20-%20PLANIFICADOR%20DE%20OBJETIVOS%20DE%20A%C3%91O%20NUEVO/) ## Cursos en YouTube diff --git "a/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/mouredev.py" "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/mouredev.py" new file mode 100644 index 0000000000..6c910cd3cc --- /dev/null +++ "b/Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE A\303\221O NUEVO/python/mouredev.py" @@ -0,0 +1,143 @@ +import os + +MONTHS = [ + "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", + "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" +] + + +def show_menu(): + print("\nPlanificador de objetivos:") + print("1. Añadir objetivo") + print("2. Calcular el plan detallado") + print("3. Guardar la planificación") + print("4. Salir") + + +class Goal: + + def __init__(self, goal_name: str, amount: int, units: str, limit: int): + self.goal_name = goal_name + self.amount = amount + self.units = units + self.limit = limit + + +def request_goal() -> Goal: + + goal_name = input("Meta: ") + + while True: + try: + amount = int(input("Cantidad: ")) + if amount <= 0: + print("La cantidad debe ser un número positivo.") + continue + break + except: + print("Por favor, introduce un número entero válido.") + + units = input("Unidades: ") + + while True: + try: + limit = int(input("Plazo en meses (máximo 12): ")) + if limit <= 0 or limit > len(MONTHS): + print("El plazo debe ser un número entre 1 y 12 (meses).") + continue + break + except: + print("Por favor, introduce un número entre 1 y 12 (meses).") + + return Goal(goal_name, amount, units, limit) + + +def calculate_detailed_plan(goals: list[Goal]) -> dict: + + plan = {month: [] for month in range(1, len(MONTHS) + 1)} + + for goal in goals: + month_amount = goal.amount / goal.limit + + for month in range(1, goal.limit + 1): + plan[month].append( + Goal(goal.goal_name, round(month_amount, 2), goal.units, goal.amount)) + + return plan + + +def show_detailed_plan(plan: dict): + + for month in range(1, len(MONTHS) + 1): + + if not plan[month]: + # No hay objetivos en este mes + break + + print(f"\n{MONTHS[month - 1]}: ") + + for index, goal in enumerate(plan[month], start=1): + print( + f"[ ] {index}. {goal.goal_name} ({ + goal.amount} {goal.units}/mes). Total: {goal.limit}.") + + +def save_detailed_plan(plan: dict): + + file_path = os.path.join(os.path.dirname( + os.path.abspath(__file__)), "plan.txt") + + with open(file_path, "w", encoding="utf-8") as file: + file.write("Plan detallado\n") + + for month in range(1, len(MONTHS) + 1): + + if not plan[month]: + # No hay objetivos en este mes + break + + file.write(f"\n{MONTHS[month - 1]}:\n") + + for index, goal in enumerate(plan[month], start=1): + file.write( + f"[ ] {index}. {goal.goal_name} ({ + goal.amount} {goal.units}/mes). Total: {goal.limit}.\n") + + print(f"Plan guardado con éxito en {file_path}") + + +goals = [] + +while True: + + show_menu() + + option = input("Elige una opción: ") + + if option == "1": + if len(goals) >= 10: + print("Has alcanzado el número máximo de objetivos (10).") + else: + goal = request_goal() + goals.append(goal) + print("Objetivo añadido con éxito.") + + elif option == "2": + if len(goals) == 0: + print("No hay objetivos añadidos.") + else: + plan = calculate_detailed_plan(goals) + show_detailed_plan(plan) + + elif option == "3": + if len(goals) == 0: + print("No hay objetivos para guardar.") + else: + plan = calculate_detailed_plan(goals) + save_detailed_plan(plan) + + elif option == "4": + print("Saliendo del planificador.") + break + else: + print("Opción inválida. Elige una opción entre 1 y 4.") From 1a0a86e8058ae620b76e0145be9846bcc476c844 Mon Sep 17 00:00:00 2001 From: mouredev Date: Tue, 31 Dec 2024 00:16:08 +0000 Subject: [PATCH 101/104] Update stats --- Roadmap/stats.json | 424 ++++++++++++++++++++++----------------------- 1 file changed, 212 insertions(+), 212 deletions(-) diff --git a/Roadmap/stats.json b/Roadmap/stats.json index d2ba50a158..0d378a1b11 100644 --- a/Roadmap/stats.json +++ b/Roadmap/stats.json @@ -1,7 +1,7 @@ { "challenges_total": 51, "languages_total": 52, - "files_total": 8876, + "files_total": 8888, "users_total": 1393, "challenges_ranking": [ { @@ -191,13 +191,13 @@ }, { "order": 38, - "name": "42 - TORNEO DRAGON BALL", + "name": "37 - OASIS VS LINKIN PARK", "count": 50 }, { "order": 39, - "name": "37 - OASIS VS LINKIN PARK", - "count": 49 + "name": "42 - TORNEO DRAGON BALL", + "count": 50 }, { "order": 40, @@ -217,31 +217,31 @@ { "order": 43, "name": "47 - CALENDARIO DE ADVIENTO", - "count": 37 + "count": 38 }, { "order": 44, - "name": "40 - FORTNITE RUBIUS CUP", + "name": "48 - \u00c1RBOL DE NAVIDAD", "count": 36 }, { "order": 45, - "name": "48 - \u00c1RBOL DE NAVIDAD", - "count": 35 + "name": "46 - X VS BLUESKY", + "count": 36 }, { "order": 46, - "name": "43 - GIT GITHUB CLI", - "count": 35 + "name": "40 - FORTNITE RUBIUS CUP", + "count": 36 }, { "order": 47, - "name": "46 - X VS BLUESKY", - "count": 35 + "name": "49 - EL ALMAC\u00c9N DE PAP\u00c1 NOEL", + "count": 36 }, { "order": 48, - "name": "49 - EL ALMAC\u00c9N DE PAP\u00c1 NOEL", + "name": "43 - GIT GITHUB CLI", "count": 35 }, { @@ -257,27 +257,27 @@ { "order": 51, "name": "50 - PLANIFICADOR DE OBJETIVOS DE A\u00d1O NUEVO", - "count": 15 + "count": 22 } ], "languages_ranking": [ { "order": 1, "name": "python", - "count": 3678, - "percentage": 41.44 + "count": 3682, + "percentage": 41.43 }, { "order": 2, "name": "javascript", - "count": 1807, - "percentage": 20.36 + "count": 1809, + "percentage": 20.35 }, { "order": 3, "name": "java", - "count": 910, - "percentage": 10.25 + "count": 915, + "percentage": 10.29 }, { "order": 4, @@ -313,13 +313,13 @@ "order": 9, "name": "swift", "count": 171, - "percentage": 1.93 + "percentage": 1.92 }, { "order": 10, "name": "c++", - "count": 148, - "percentage": 1.67 + "count": 149, + "percentage": 1.68 }, { "order": 11, @@ -596,7 +596,7 @@ { "order": 4, "name": "hectorio23", - "count": 150, + "count": 153, "languages": 3 }, { @@ -638,7 +638,7 @@ { "order": 11, "name": "jesusantonioeescamilla", - "count": 72, + "count": 73, "languages": 3 }, { @@ -703,21 +703,21 @@ }, { "order": 22, - "name": "neslarra", - "count": 52, - "languages": 2 + "name": "santyjl", + "count": 53, + "languages": 3 }, { "order": 23, - "name": "ricjdev", + "name": "neslarra", "count": 52, "languages": 2 }, { "order": 24, - "name": "santyjl", - "count": 51, - "languages": 3 + "name": "ricjdev", + "count": 52, + "languages": 2 }, { "order": 25, @@ -727,26 +727,26 @@ }, { "order": 26, - "name": "asjordi", + "name": "mouredev", "count": 51, "languages": 1 }, { "order": 27, - "name": "josegs95", + "name": "asjordi", "count": 51, "languages": 1 }, { "order": 28, - "name": "rauldoezon", + "name": "josegs95", "count": 51, "languages": 1 }, { "order": 29, - "name": "mouredev", - "count": 50, + "name": "rauldoezon", + "count": 51, "languages": 1 }, { @@ -1843,1027 +1843,1027 @@ }, { "order": 212, - "name": "luisolivaresj", + "name": "johnalexguerrero", "count": 9, "languages": 2 }, { "order": 213, - "name": "blancowilson", + "name": "luisolivaresj", "count": 9, "languages": 2 }, { "order": 214, - "name": "joseesmil04", + "name": "blancowilson", "count": 9, "languages": 2 }, { "order": 215, + "name": "joseesmil04", + "count": 9, + "languages": 2 + }, + { + "order": 216, "name": "brockar", "count": 9, "languages": 1 }, { - "order": 216, + "order": 217, "name": "gjbecerrae", "count": 9, "languages": 1 }, { - "order": 217, + "order": 218, "name": "jcdm60", "count": 9, "languages": 1 }, { - "order": 218, + "order": 219, "name": "troynebula", "count": 9, "languages": 1 }, { - "order": 219, + "order": 220, "name": "yoezequiel", "count": 9, "languages": 1 }, { - "order": 220, + "order": 221, "name": "haroldalb", "count": 9, "languages": 1 }, { - "order": 221, + "order": 222, "name": "vid92", "count": 9, "languages": 1 }, { - "order": 222, + "order": 223, "name": "fduron", "count": 9, "languages": 1 }, { - "order": 223, + "order": 224, "name": "cmejiajulian", "count": 9, "languages": 1 }, { - "order": 224, + "order": 225, "name": "joapalobael", "count": 9, "languages": 1 }, { - "order": 225, + "order": 226, "name": "omarland", "count": 9, "languages": 1 }, { - "order": 226, + "order": 227, "name": "sperezsa", "count": 9, "languages": 1 }, { - "order": 227, + "order": 228, "name": "karys4", "count": 9, "languages": 1 }, { - "order": 228, + "order": 229, "name": "pakiuh", "count": 8, "languages": 4 }, { - "order": 229, + "order": 230, "name": "angel-delg", "count": 8, "languages": 4 }, { - "order": 230, + "order": 231, "name": "domo2pdev", "count": 8, "languages": 3 }, { - "order": 231, + "order": 232, "name": "ediedramos", "count": 8, "languages": 2 }, { - "order": 232, + "order": 233, "name": "xmunder", "count": 8, "languages": 2 }, { - "order": 233, + "order": 234, "name": "ansuzgs", "count": 8, "languages": 2 }, { - "order": 234, + "order": 235, "name": "pcosin", "count": 8, "languages": 2 }, { - "order": 235, + "order": 236, "name": "carlosvr48", "count": 8, "languages": 1 }, { - "order": 236, + "order": 237, "name": "jtrujilloalcocer", "count": 8, "languages": 1 }, { - "order": 237, + "order": 238, "name": "jacmac45", "count": 8, "languages": 1 }, { - "order": 238, + "order": 239, "name": "toral24", "count": 8, "languages": 1 }, { - "order": 239, + "order": 240, "name": "jorgeadamowicz", "count": 8, "languages": 1 }, { - "order": 240, + "order": 241, "name": "linerlander", "count": 8, "languages": 1 }, { - "order": 241, + "order": 242, "name": "abelperezcollado", "count": 8, "languages": 1 }, { - "order": 242, + "order": 243, "name": "sarismejiasanchez", "count": 8, "languages": 1 }, { - "order": 243, + "order": 244, "name": "glossypath", "count": 8, "languages": 1 }, { - "order": 244, + "order": 245, "name": "srvariable", "count": 8, "languages": 1 }, { - "order": 245, + "order": 246, "name": "isj-code", "count": 8, "languages": 1 }, { - "order": 246, + "order": 247, "name": "westwbn", "count": 8, "languages": 1 }, { - "order": 247, + "order": 248, "name": "matitc", "count": 8, "languages": 1 }, { - "order": 248, + "order": 249, "name": "jaxi86", "count": 8, "languages": 1 }, { - "order": 249, + "order": 250, "name": "yisusocanto", "count": 8, "languages": 1 }, { - "order": 250, + "order": 251, "name": "zequy40", "count": 8, "languages": 1 }, { - "order": 251, + "order": 252, "name": "leandrocfd", "count": 8, "languages": 1 }, { - "order": 252, + "order": 253, "name": "cyberdidac", "count": 8, "languages": 1 }, { - "order": 253, + "order": 254, "name": "bytecodesky", "count": 8, "languages": 1 }, { - "order": 254, + "order": 255, "name": "darubiano", "count": 7, "languages": 7 }, { - "order": 255, + "order": 256, "name": "nwpablodeveloper", "count": 7, "languages": 3 }, { - "order": 256, + "order": 257, "name": "cubandeveloper89", "count": 7, "languages": 3 }, { - "order": 257, + "order": 258, "name": "younes0-0", "count": 7, "languages": 2 }, { - "order": 258, + "order": 259, "name": "davstudy", "count": 7, "languages": 2 }, { - "order": 259, + "order": 260, "name": "danielbelenguer", "count": 7, "languages": 2 }, { - "order": 260, + "order": 261, "name": "pwrxman", "count": 7, "languages": 1 }, { - "order": 261, + "order": 262, "name": "albertomorilla", "count": 7, "languages": 1 }, { - "order": 262, + "order": 263, "name": "hectordbh", "count": 7, "languages": 1 }, { - "order": 263, + "order": 264, "name": "ldre3", "count": 7, "languages": 1 }, { - "order": 264, + "order": 265, "name": "jose-larss", "count": 7, "languages": 1 }, { - "order": 265, + "order": 266, "name": "dgrex", "count": 7, "languages": 1 }, { - "order": 266, + "order": 267, "name": "ruhlmirko", "count": 7, "languages": 1 }, { - "order": 267, + "order": 268, "name": "maxirica", "count": 7, "languages": 1 }, { - "order": 268, + "order": 269, "name": "franvozzi", "count": 7, "languages": 1 }, { - "order": 269, + "order": 270, "name": "marinaortells", "count": 7, "languages": 1 }, { - "order": 270, + "order": 271, "name": "mtirador", "count": 7, "languages": 1 }, { - "order": 271, + "order": 272, "name": "alextc35", "count": 7, "languages": 1 }, { - "order": 272, + "order": 273, "name": "18miguelgalarza", "count": 7, "languages": 1 }, { - "order": 273, + "order": 274, "name": "abrahamraies", "count": 7, "languages": 1 }, { - "order": 274, + "order": 275, "name": "ocandodev", "count": 7, "languages": 1 }, { - "order": 275, + "order": 276, "name": "markc1234", "count": 7, "languages": 1 }, { - "order": 276, + "order": 277, "name": "shevotool", "count": 7, "languages": 1 }, { - "order": 277, + "order": 278, "name": "aarxnmendez", "count": 7, "languages": 1 }, { - "order": 278, + "order": 279, "name": "abel-ade", "count": 6, "languages": 3 }, { - "order": 279, + "order": 280, "name": "fidelysla", "count": 6, "languages": 3 }, { - "order": 280, + "order": 281, "name": "curtobrull", "count": 6, "languages": 3 }, { - "order": 281, + "order": 282, "name": "rserradev", "count": 6, "languages": 2 }, { - "order": 282, + "order": 283, "name": "troleomotor10", "count": 6, "languages": 2 }, { - "order": 283, + "order": 284, "name": "roswer13", "count": 6, "languages": 2 }, { - "order": 284, + "order": 285, "name": "devknn", "count": 6, "languages": 2 }, { - "order": 285, + "order": 286, "name": "misterdan100", "count": 6, "languages": 2 }, { - "order": 286, + "order": 287, "name": "luisk0706", "count": 6, "languages": 2 }, { - "order": 287, + "order": 288, "name": "danilo0203", "count": 6, "languages": 2 }, { - "order": 288, + "order": 289, "name": "eberstr", "count": 6, "languages": 2 }, { - "order": 289, + "order": 290, "name": "luterfloyd", "count": 6, "languages": 2 }, { - "order": 290, + "order": 291, "name": "adrs1166ma", "count": 6, "languages": 2 }, { - "order": 291, + "order": 292, "name": "oixild", "count": 6, "languages": 2 }, { - "order": 292, + "order": 293, "name": "kronstadt-lambda", "count": 6, "languages": 2 }, { - "order": 293, + "order": 294, "name": "isaias-alt", "count": 6, "languages": 2 }, { - "order": 294, + "order": 295, "name": "douglasdiazr", "count": 6, "languages": 2 }, { - "order": 295, + "order": 296, "name": "elbarbero", "count": 6, "languages": 1 }, { - "order": 296, + "order": 297, "name": "eduhumanes91", "count": 6, "languages": 1 }, { - "order": 297, + "order": 298, "name": "yeisonagm", "count": 6, "languages": 1 }, { - "order": 298, + "order": 299, "name": "dafi02", "count": 6, "languages": 1 }, { - "order": 299, + "order": 300, "name": "eamartin96", "count": 6, "languages": 1 }, { - "order": 300, + "order": 301, "name": "gliadev", "count": 6, "languages": 1 }, { - "order": 301, + "order": 302, "name": "wolffcode", "count": 6, "languages": 1 }, { - "order": 302, + "order": 303, "name": "miguelangelmtz000414", "count": 6, "languages": 1 }, { - "order": 303, + "order": 304, "name": "rusanov16", "count": 6, "languages": 1 }, { - "order": 304, + "order": 305, "name": "abascal92", "count": 6, "languages": 1 }, { - "order": 305, + "order": 306, "name": "lazar171717ech", "count": 6, "languages": 1 }, { - "order": 306, + "order": 307, "name": "mikelroset", "count": 6, "languages": 1 }, { - "order": 307, + "order": 308, "name": "guillemduno", "count": 6, "languages": 1 }, { - "order": 308, + "order": 309, "name": "mxtrar23", "count": 6, "languages": 1 }, { - "order": 309, + "order": 310, "name": "facundo-muoio", "count": 6, "languages": 1 }, { - "order": 310, + "order": 311, "name": "ssanjua", "count": 6, "languages": 1 }, { - "order": 311, + "order": 312, "name": "dannymarperone", "count": 6, "languages": 1 }, { - "order": 312, + "order": 313, "name": "alabacw74", "count": 5, "languages": 3 }, { - "order": 313, + "order": 314, "name": "bryan112094", "count": 5, "languages": 3 }, { - "order": 314, + "order": 315, "name": "tizog", "count": 5, "languages": 2 }, { - "order": 315, + "order": 316, "name": "andresmendozaf", "count": 5, "languages": 2 }, { - "order": 316, + "order": 317, "name": "icedrek", "count": 5, "languages": 2 }, { - "order": 317, + "order": 318, "name": "vmatmarco", "count": 5, "languages": 2 }, { - "order": 318, + "order": 319, "name": "espinoleandroo", "count": 5, "languages": 2 }, { - "order": 319, + "order": 320, "name": "alejandrodave", "count": 5, "languages": 2 }, { - "order": 320, + "order": 321, "name": "jalivur", "count": 5, "languages": 2 }, { - "order": 321, + "order": 322, "name": "eloychavezdev", "count": 5, "languages": 1 }, { - "order": 322, + "order": 323, "name": "w00k", "count": 5, "languages": 1 }, { - "order": 323, + "order": 324, "name": "thaishdz", "count": 5, "languages": 1 }, { - "order": 324, + "order": 325, "name": "boterop", "count": 5, "languages": 1 }, { - "order": 325, + "order": 326, "name": "d0ubt0", "count": 5, "languages": 1 }, { - "order": 326, + "order": 327, "name": "micromantic", "count": 5, "languages": 1 }, { - "order": 327, + "order": 328, "name": "javitron100", "count": 5, "languages": 1 }, { - "order": 328, + "order": 329, "name": "njaimev", "count": 5, "languages": 1 }, { - "order": 329, + "order": 330, "name": "craphaelam", "count": 5, "languages": 1 }, { - "order": 330, + "order": 331, "name": "yharyarias", "count": 5, "languages": 1 }, { - "order": 331, + "order": 332, "name": "thezhizn", "count": 5, "languages": 1 }, { - "order": 332, + "order": 333, "name": "gmbarrios", "count": 5, "languages": 1 }, { - "order": 333, + "order": 334, "name": "franz-arzapalo", "count": 5, "languages": 1 }, { - "order": 334, + "order": 335, "name": "santiago434c", "count": 5, "languages": 1 }, { - "order": 335, + "order": 336, "name": "jose-luis-lanza", "count": 5, "languages": 1 }, { - "order": 336, + "order": 337, "name": "zakkdrte", "count": 5, "languages": 1 }, { - "order": 337, + "order": 338, "name": "alberba", "count": 5, "languages": 1 }, { - "order": 338, + "order": 339, "name": "iban99", "count": 5, "languages": 1 }, { - "order": 339, + "order": 340, "name": "gabrielramos02", "count": 5, "languages": 1 }, { - "order": 340, + "order": 341, "name": "nomellamodante", "count": 5, "languages": 1 }, { - "order": 341, + "order": 342, "name": "augustdev2003", "count": 5, "languages": 1 }, { - "order": 342, + "order": 343, "name": "drvito1977", "count": 5, "languages": 1 }, { - "order": 343, + "order": 344, "name": "lucasag01", "count": 5, "languages": 1 }, { - "order": 344, + "order": 345, "name": "karolle", "count": 5, "languages": 1 }, { - "order": 345, + "order": 346, "name": "jcrodmir", "count": 5, "languages": 1 }, { - "order": 346, + "order": 347, "name": "kilianhc", "count": 5, "languages": 1 }, { - "order": 347, + "order": 348, "name": "alvarofernandezavalos", "count": 5, "languages": 1 }, { - "order": 348, + "order": 349, "name": "vasilealexandru02", "count": 5, "languages": 1 }, { - "order": 349, + "order": 350, "name": "esaens12", "count": 5, "languages": 1 }, { - "order": 350, + "order": 351, "name": "victormugo", "count": 5, "languages": 1 }, { - "order": 351, + "order": 352, "name": "adridoce", "count": 5, "languages": 1 }, { - "order": 352, + "order": 353, "name": "luis-vb", "count": 5, "languages": 1 }, { - "order": 353, + "order": 354, "name": "rubenplazavi", "count": 5, "languages": 1 }, { - "order": 354, + "order": 355, "name": "dobledj", "count": 5, "languages": 1 }, { - "order": 355, + "order": 356, "name": "robmxz", "count": 5, "languages": 1 }, { - "order": 356, + "order": 357, "name": "lauracastrillonmp", "count": 5, "languages": 1 }, { - "order": 357, + "order": 358, "name": "danielbustos342", "count": 5, "languages": 1 }, { - "order": 358, + "order": 359, "name": "yesidl12", "count": 5, "languages": 1 }, { - "order": 359, + "order": 360, "name": "d4-n1", "count": 5, "languages": 1 }, { - "order": 360, + "order": 361, "name": "joanfv-git", "count": 5, "languages": 1 }, { - "order": 361, + "order": 362, "name": "vixito", "count": 5, "languages": 1 }, { - "order": 362, + "order": 363, "name": "n1sek", "count": 5, "languages": 1 }, { - "order": 363, + "order": 364, "name": "bastianalq", "count": 5, "languages": 1 }, { - "order": 364, + "order": 365, "name": "ljoecordoba", "count": 5, "languages": 1 }, { - "order": 365, + "order": 366, "name": "alb-martinez", "count": 5, "languages": 1 }, { - "order": 366, + "order": 367, "name": "zarakilancelot", "count": 4, "languages": 3 }, { - "order": 367, + "order": 368, "name": "annaviper", "count": 4, "languages": 2 }, { - "order": 368, + "order": 369, "name": "fullovellas", "count": 4, "languages": 2 }, { - "order": 369, + "order": 370, "name": "salkalero", "count": 4, "languages": 2 }, { - "order": 370, + "order": 371, "name": "willr30", "count": 4, "languages": 2 }, { - "order": 371, + "order": 372, "name": "victorjaimesr", "count": 4, "languages": 2 }, { - "order": 372, + "order": 373, "name": "mendozalz", "count": 4, "languages": 2 }, { - "order": 373, + "order": 374, "name": "ruthmp", "count": 4, "languages": 2 }, { - "order": 374, + "order": 375, "name": "nightalchemist", "count": 4, "languages": 2 }, { - "order": 375, + "order": 376, "name": "daeduol", "count": 4, "languages": 2 }, { - "order": 376, + "order": 377, "name": "josefuentes-dev", "count": 4, "languages": 2 }, { - "order": 377, + "order": 378, "name": "eonozux", "count": 4, "languages": 2 }, { - "order": 378, + "order": 379, "name": "k3nvd", "count": 4, "languages": 2 }, { - "order": 379, + "order": 380, "name": "yablik", "count": 4, "languages": 2 }, { - "order": 380, + "order": 381, "name": "siderio2", "count": 4, "languages": 2 }, - { - "order": 381, - "name": "davidvilem", - "count": 4, - "languages": 1 - }, { "order": 382, - "name": "johnalexguerrero", + "name": "davidvilem", "count": 4, "languages": 1 }, From a597b6149d0145569c2ef638b759162baa7e3838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Gallego?= <75795616+kontroldev@users.noreply.github.com> Date: Tue, 31 Dec 2024 09:47:05 +0100 Subject: [PATCH 102/104] Rename Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/00/python/jossfullstack.java to Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/jossfullstack.java --- .../java/{00/python => }/jossfullstack.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/{00/python => }/jossfullstack.java (100%) diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/00/python/jossfullstack.java b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/jossfullstack.java similarity index 100% rename from Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/00/python/jossfullstack.java rename to Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/jossfullstack.java From 78fae92c231da8c7399a59e862400ea24e523d4a Mon Sep 17 00:00:00 2001 From: Brais Moure Date: Tue, 31 Dec 2024 10:56:10 +0100 Subject: [PATCH 103/104] =?UTF-8?q?Correcci=C3=B3n=20Roadmap=2050=20en=20v?= =?UTF-8?q?=C3=ADdeo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fin roadmap 2024 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 17ac02677b..271899c79b 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ |47|[CALENDARIO DE ADVIENTO](./Roadmap/47%20-%20CALENDARIO%20DE%20ADVIENTO/ejercicio.md)|[📝](./Roadmap/47%20-%20CALENDARIO%20DE%20ADVIENTO/python/mouredev.py)|[▶️](https://youtu.be/LteI1J5gmZw)|[👥](./Roadmap/47%20-%20CALENDARIO%20DE%20ADVIENTO/) |48|[ÁRBOL DE NAVIDAD](./Roadmap/48%20-%20ÁRBOL%20DE%20NAVIDAD/ejercicio.md)|[📝](./Roadmap/48%20-%20ÁRBOL%20DE%20NAVIDAD/python/mouredev.py)|[▶️](https://youtu.be/bIguZe3iXVo)|[👥](./Roadmap/48%20-%20ÁRBOL%20DE%20NAVIDAD/) |49|[EL ALMACÉN DE PAPÁ NOEL](./Roadmap/49%20-%20EL%20ALMACÉN%20DE%20PAPÁ%20NOEL/ejercicio.md)|[📝](./Roadmap/49%20-%20EL%20ALMACÉN%20DE%20PAPÁ%20NOEL/python/mouredev.py)|[▶️](https://youtu.be/XGMxosQArxw)|[👥](./Roadmap/49%20-%20EL%20ALMACÉN%20DE%20PAPÁ%20NOEL/) -|50|[PLANIFICADOR DE OBJETIVOS DE AÑO NUEVO](./Roadmap/50%20-%20PLANIFICADOR%20DE%20OBJETIVOS%20DE%20A%C3%91O%20NUEVO/ejercicio.md)|[📝](./Roadmap/50%20-%20PLANIFICADOR%20DE%20OBJETIVOS%20DE%20A%C3%91O%20NUEVO/python/mouredev.py)||[👥](./Roadmap/50%20-%20PLANIFICADOR%20DE%20OBJETIVOS%20DE%20A%C3%91O%20NUEVO/) +|50|[PLANIFICADOR DE OBJETIVOS DE AÑO NUEVO](./Roadmap/50%20-%20PLANIFICADOR%20DE%20OBJETIVOS%20DE%20A%C3%91O%20NUEVO/ejercicio.md)|[📝](./Roadmap/50%20-%20PLANIFICADOR%20DE%20OBJETIVOS%20DE%20A%C3%91O%20NUEVO/python/mouredev.py)|[▶️](https://youtu.be/MmHSEcWlSbk)|[👥](./Roadmap/50%20-%20PLANIFICADOR%20DE%20OBJETIVOS%20DE%20A%C3%91O%20NUEVO/) ## Cursos en YouTube From 25b77425207fdd144514805ae24bce71740268b9 Mon Sep 17 00:00:00 2001 From: mouredev Date: Wed, 1 Jan 2025 00:17:59 +0000 Subject: [PATCH 104/104] Update stats --- Roadmap/stats.json | 1462 ++++++++++++++++++++++---------------------- 1 file changed, 740 insertions(+), 722 deletions(-) diff --git a/Roadmap/stats.json b/Roadmap/stats.json index 0d378a1b11..a138c6c332 100644 --- a/Roadmap/stats.json +++ b/Roadmap/stats.json @@ -1,23 +1,23 @@ { "challenges_total": 51, "languages_total": 52, - "files_total": 8888, - "users_total": 1393, + "files_total": 8896, + "users_total": 1396, "challenges_ranking": [ { "order": 1, "name": "00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO", - "count": 1506 + "count": 1509 }, { "order": 2, "name": "01 - OPERADORES Y ESTRUCTURAS DE CONTROL", - "count": 912 + "count": 913 }, { "order": 3, "name": "02 - FUNCIONES Y ALCANCE", - "count": 677 + "count": 678 }, { "order": 4, @@ -57,12 +57,12 @@ { "order": 11, "name": "10 - EXCEPCIONES", - "count": 217 + "count": 218 }, { "order": 12, "name": "11 - MANEJO DE FICHEROS", - "count": 186 + "count": 187 }, { "order": 13, @@ -107,7 +107,7 @@ { "order": 21, "name": "20 - PETICIONES HTTP", - "count": 119 + "count": 120 }, { "order": 22, @@ -264,26 +264,26 @@ { "order": 1, "name": "python", - "count": 3682, - "percentage": 41.43 + "count": 3684, + "percentage": 41.41 }, { "order": 2, "name": "javascript", - "count": 1809, - "percentage": 20.35 + "count": 1812, + "percentage": 20.37 }, { "order": 3, "name": "java", - "count": 915, - "percentage": 10.29 + "count": 916, + "percentage": 10.3 }, { "order": 4, "name": "typescript", "count": 477, - "percentage": 5.37 + "percentage": 5.36 }, { "order": 5, @@ -294,14 +294,14 @@ { "order": 6, "name": "go", - "count": 248, - "percentage": 2.79 + "count": 250, + "percentage": 2.81 }, { "order": 7, "name": "kotlin", "count": 244, - "percentage": 2.75 + "percentage": 2.74 }, { "order": 8, @@ -319,7 +319,7 @@ "order": 10, "name": "c++", "count": 149, - "percentage": 1.68 + "percentage": 1.67 }, { "order": 11, @@ -343,7 +343,7 @@ "order": 14, "name": "vb.net", "count": 52, - "percentage": 0.59 + "percentage": 0.58 }, { "order": 15, @@ -373,7 +373,7 @@ "order": 19, "name": "pascal", "count": 20, - "percentage": 0.23 + "percentage": 0.22 }, { "order": 20, @@ -397,13 +397,13 @@ "order": 23, "name": "arduino", "count": 12, - "percentage": 0.14 + "percentage": 0.13 }, { "order": 24, "name": "fortran", "count": 12, - "percentage": 0.14 + "percentage": 0.13 }, { "order": 25, @@ -445,13 +445,13 @@ "order": 31, "name": "gdscript", "count": 4, - "percentage": 0.05 + "percentage": 0.04 }, { "order": 32, "name": "mql4", "count": 4, - "percentage": 0.05 + "percentage": 0.04 }, { "order": 33, @@ -1117,38 +1117,38 @@ }, { "order": 91, - "name": "gringoam", + "name": "hyromy", "count": 21, "languages": 1 }, { "order": 92, - "name": "restevean", + "name": "gringoam", "count": 21, "languages": 1 }, { "order": 93, - "name": "igledev", + "name": "restevean", "count": 21, "languages": 1 }, { "order": 94, - "name": "davidmoralesdeveloper", + "name": "igledev", "count": 21, "languages": 1 }, { "order": 95, - "name": "mvidalb", + "name": "davidmoralesdeveloper", "count": 21, "languages": 1 }, { "order": 96, - "name": "hyromy", - "count": 20, + "name": "mvidalb", + "count": 21, "languages": 1 }, { @@ -1597,229 +1597,229 @@ }, { "order": 171, - "name": "jeronimocardu", + "name": "miguelp-dev", "count": 12, "languages": 1 }, { "order": 172, - "name": "pancratzia", + "name": "jeronimocardu", "count": 12, "languages": 1 }, { "order": 173, - "name": "pipe281", + "name": "pancratzia", "count": 12, "languages": 1 }, { "order": 174, + "name": "pipe281", + "count": 12, + "languages": 1 + }, + { + "order": 175, "name": "llonardo798", "count": 11, "languages": 6 }, { - "order": 175, + "order": 176, "name": "switchdays", "count": 11, "languages": 2 }, { - "order": 176, + "order": 177, "name": "jchavescaceres", "count": 11, "languages": 2 }, { - "order": 177, + "order": 178, "name": "arkmiguel379", "count": 11, "languages": 2 }, { - "order": 178, + "order": 179, "name": "djsurgeon", "count": 11, "languages": 2 }, { - "order": 179, + "order": 180, "name": "teren91", "count": 11, "languages": 2 }, { - "order": 180, + "order": 181, "name": "evanz2608", "count": 11, "languages": 1 }, { - "order": 181, + "order": 182, "name": "mirandayuber", "count": 11, "languages": 1 }, { - "order": 182, + "order": 183, "name": "59822", "count": 11, "languages": 1 }, { - "order": 183, + "order": 184, "name": "m1l0j05", "count": 11, "languages": 1 }, { - "order": 184, + "order": 185, "name": "alainmartz", "count": 11, "languages": 1 }, { - "order": 185, + "order": 186, "name": "k-90", "count": 11, "languages": 1 }, { - "order": 186, + "order": 187, "name": "majinka10", "count": 11, "languages": 1 }, { - "order": 187, + "order": 188, "name": "mordevspt", "count": 11, "languages": 1 }, { - "order": 188, + "order": 189, "name": "warclimb", "count": 11, "languages": 1 }, { - "order": 189, + "order": 190, "name": "abelade", "count": 11, "languages": 1 }, { - "order": 190, + "order": 191, "name": "gustavogomez19", "count": 11, "languages": 1 }, { - "order": 191, + "order": 192, "name": "jeigar2", "count": 11, "languages": 1 }, { - "order": 192, + "order": 193, "name": "charlerodriguez3", "count": 11, "languages": 1 }, { - "order": 193, + "order": 194, "name": "ialmontedr0", "count": 11, "languages": 1 }, { - "order": 194, + "order": 195, "name": "robertoamarohub", "count": 11, "languages": 1 }, { - "order": 195, + "order": 196, "name": "oleojake", "count": 11, "languages": 1 }, { - "order": 196, + "order": 197, "name": "bertomp", "count": 10, "languages": 5 }, { - "order": 197, + "order": 198, "name": "othamae", "count": 10, "languages": 3 }, { - "order": 198, + "order": 199, "name": "vixxtory", "count": 10, "languages": 2 }, - { - "order": 199, - "name": "mauricio-leyva", - "count": 10, - "languages": 1 - }, { "order": 200, - "name": "daparradom", + "name": "mauricio-leyva", "count": 10, "languages": 1 }, { "order": 201, - "name": "xemita007", + "name": "daparradom", "count": 10, "languages": 1 }, { "order": 202, - "name": "marcose-ferretoe", + "name": "xemita007", "count": 10, "languages": 1 }, { "order": 203, - "name": "josecox13", + "name": "marcose-ferretoe", "count": 10, "languages": 1 }, { "order": 204, - "name": "littlemabbit", + "name": "josecox13", "count": 10, "languages": 1 }, { "order": 205, - "name": "thonys07", + "name": "littlemabbit", "count": 10, "languages": 1 }, { "order": 206, - "name": "jimsimrodev", + "name": "thonys07", "count": 10, "languages": 1 }, { "order": 207, - "name": "kleyner098", + "name": "jimsimrodev", "count": 10, "languages": 1 }, { "order": 208, - "name": "miguelp-dev", + "name": "kleyner098", "count": 10, "languages": 1 }, @@ -1987,145 +1987,145 @@ }, { "order": 236, + "name": "davstudy", + "count": 8, + "languages": 2 + }, + { + "order": 237, "name": "carlosvr48", "count": 8, "languages": 1 }, { - "order": 237, + "order": 238, "name": "jtrujilloalcocer", "count": 8, "languages": 1 }, { - "order": 238, + "order": 239, "name": "jacmac45", "count": 8, "languages": 1 }, { - "order": 239, + "order": 240, "name": "toral24", "count": 8, "languages": 1 }, { - "order": 240, + "order": 241, "name": "jorgeadamowicz", "count": 8, "languages": 1 }, { - "order": 241, + "order": 242, "name": "linerlander", "count": 8, "languages": 1 }, { - "order": 242, + "order": 243, "name": "abelperezcollado", "count": 8, "languages": 1 }, { - "order": 243, + "order": 244, "name": "sarismejiasanchez", "count": 8, "languages": 1 }, { - "order": 244, + "order": 245, "name": "glossypath", "count": 8, "languages": 1 }, { - "order": 245, + "order": 246, "name": "srvariable", "count": 8, "languages": 1 }, { - "order": 246, + "order": 247, "name": "isj-code", "count": 8, "languages": 1 }, { - "order": 247, + "order": 248, "name": "westwbn", "count": 8, "languages": 1 }, { - "order": 248, + "order": 249, "name": "matitc", "count": 8, "languages": 1 }, { - "order": 249, + "order": 250, "name": "jaxi86", "count": 8, "languages": 1 }, { - "order": 250, + "order": 251, "name": "yisusocanto", "count": 8, "languages": 1 }, { - "order": 251, + "order": 252, "name": "zequy40", "count": 8, "languages": 1 }, { - "order": 252, + "order": 253, "name": "leandrocfd", "count": 8, "languages": 1 }, { - "order": 253, + "order": 254, "name": "cyberdidac", "count": 8, "languages": 1 }, { - "order": 254, + "order": 255, "name": "bytecodesky", "count": 8, "languages": 1 }, { - "order": 255, + "order": 256, "name": "darubiano", "count": 7, "languages": 7 }, { - "order": 256, + "order": 257, "name": "nwpablodeveloper", "count": 7, "languages": 3 }, { - "order": 257, + "order": 258, "name": "cubandeveloper89", "count": 7, "languages": 3 }, - { - "order": 258, - "name": "younes0-0", - "count": 7, - "languages": 2 - }, { "order": 259, - "name": "davstudy", + "name": "younes0-0", "count": 7, "languages": 2 }, @@ -5215,3720 +5215,3738 @@ }, { "order": 774, - "name": "doblea74", + "name": "1nonamed", "count": 2, "languages": 1 }, { "order": 775, - "name": "miguelrejon96", + "name": "doblea74", "count": 2, "languages": 1 }, { "order": 776, - "name": "leonardo291024", + "name": "miguelrejon96", "count": 2, "languages": 1 }, { "order": 777, - "name": "mickel-arroz", + "name": "leonardo291024", "count": 2, "languages": 1 }, { "order": 778, - "name": "ovjohn", + "name": "mickel-arroz", "count": 2, "languages": 1 }, { "order": 779, - "name": "jaimemunozdev", + "name": "ovjohn", "count": 2, "languages": 1 }, { "order": 780, - "name": "christianumb", + "name": "jaimemunozdev", "count": 2, "languages": 1 }, { "order": 781, - "name": "franciscocuminilondero", + "name": "christianumb", "count": 2, "languages": 1 }, { "order": 782, - "name": "davhage", + "name": "franciscocuminilondero", "count": 2, "languages": 1 }, { "order": 783, - "name": "gianbordon", + "name": "davhage", "count": 2, "languages": 1 }, { "order": 784, - "name": "k4rv3r", + "name": "gianbordon", "count": 2, "languages": 1 }, { "order": 785, - "name": "rlores-edison", + "name": "k4rv3r", "count": 2, "languages": 1 }, { "order": 786, - "name": "esdras-josue", + "name": "rlores-edison", "count": 2, "languages": 1 }, { "order": 787, - "name": "tomasmarquez81", + "name": "esdras-josue", "count": 2, "languages": 1 }, { "order": 788, - "name": "christianhernandezb", + "name": "tomasmarquez81", "count": 2, "languages": 1 }, { "order": 789, - "name": "cesarocbu", + "name": "christianhernandezb", "count": 2, "languages": 1 }, { "order": 790, - "name": "cpcarlosprieto", + "name": "cesarocbu", "count": 2, "languages": 1 }, { "order": 791, - "name": "dhbellini", + "name": "cpcarlosprieto", "count": 2, "languages": 1 }, { "order": 792, - "name": "soldochris", + "name": "dhbellini", "count": 2, "languages": 1 }, { "order": 793, - "name": "wesborland-github", + "name": "soldochris", "count": 2, "languages": 1 }, { "order": 794, - "name": "erikayeah", + "name": "wesborland-github", "count": 2, "languages": 1 }, { "order": 795, - "name": "angelvelasco1", + "name": "erikayeah", "count": 2, "languages": 1 }, { "order": 796, - "name": "aleoe01", + "name": "angelvelasco1", "count": 2, "languages": 1 }, { "order": 797, - "name": "pogo182028", + "name": "aleoe01", "count": 2, "languages": 1 }, { "order": 798, - "name": "rikar2o", + "name": "pogo182028", "count": 2, "languages": 1 }, { "order": 799, - "name": "mbbellini", + "name": "rikar2o", "count": 2, "languages": 1 }, { "order": 800, - "name": "farthaz", + "name": "mbbellini", "count": 2, "languages": 1 }, { "order": 801, - "name": "matiasfarfan89", + "name": "farthaz", "count": 2, "languages": 1 }, { "order": 802, - "name": "jorge186414", + "name": "matiasfarfan89", "count": 2, "languages": 1 }, { "order": 803, - "name": "santiagocuevas2003", + "name": "jorge186414", "count": 2, "languages": 1 }, { "order": 804, - "name": "andnikdev", + "name": "santiagocuevas2003", "count": 2, "languages": 1 }, { "order": 805, - "name": "glaboryp", + "name": "andnikdev", "count": 2, "languages": 1 }, { "order": 806, - "name": "nxl22", + "name": "glaboryp", "count": 2, "languages": 1 }, { "order": 807, - "name": "lmedina96", + "name": "nxl22", "count": 2, "languages": 1 }, { "order": 808, - "name": "rrcoder", + "name": "lmedina96", "count": 2, "languages": 1 }, { "order": 809, - "name": "raulallue", + "name": "rrcoder", "count": 2, "languages": 1 }, { "order": 810, - "name": "frannmv", + "name": "raulallue", "count": 2, "languages": 1 }, { "order": 811, - "name": "sdm29gh", + "name": "frannmv", "count": 2, "languages": 1 }, { "order": 812, - "name": "nandaalf", + "name": "sdm29gh", "count": 2, "languages": 1 }, { "order": 813, - "name": "bereverte", + "name": "nandaalf", "count": 2, "languages": 1 }, { "order": 814, - "name": "deivisaherreraj", + "name": "bereverte", "count": 2, "languages": 1 }, { "order": 815, - "name": "angelargumedo", + "name": "deivisaherreraj", "count": 2, "languages": 1 }, { "order": 816, - "name": "vdroiid", + "name": "angelargumedo", "count": 2, "languages": 1 }, { "order": 817, - "name": "luciarf", + "name": "vdroiid", "count": 2, "languages": 1 }, { "order": 818, - "name": "aserranot", + "name": "luciarf", "count": 2, "languages": 1 }, { "order": 819, - "name": "elmarqueli", + "name": "aserranot", "count": 2, "languages": 1 }, { "order": 820, - "name": "hawkbott", + "name": "elmarqueli", "count": 2, "languages": 1 }, { "order": 821, - "name": "tiaguiito3", + "name": "hawkbott", "count": 2, "languages": 1 }, { "order": 822, - "name": "rikar20", + "name": "tiaguiito3", "count": 2, "languages": 1 }, { "order": 823, - "name": "poetry0354", + "name": "rikar20", "count": 2, "languages": 1 }, { "order": 824, - "name": "reaien", + "name": "poetry0354", "count": 2, "languages": 1 }, { "order": 825, - "name": "vecinacoo", + "name": "reaien", "count": 2, "languages": 1 }, { "order": 826, - "name": "lioarce01", + "name": "vecinacoo", "count": 2, "languages": 1 }, { "order": 827, - "name": "diegosilval", + "name": "lioarce01", "count": 2, "languages": 1 }, { "order": 828, - "name": "emersonxinay", - "count": 1, + "name": "diegosilval", + "count": 2, "languages": 1 }, { "order": 829, - "name": "davidbastosg", + "name": "emersonxinay", "count": 1, "languages": 1 }, { "order": 830, - "name": "matinbohorquez", + "name": "davidbastosg", "count": 1, "languages": 1 }, { "order": 831, - "name": "franespina", + "name": "matinbohorquez", "count": 1, "languages": 1 }, { "order": 832, - "name": "lesclaz", + "name": "franespina", "count": 1, "languages": 1 }, { "order": 833, - "name": "giovannipeirone", + "name": "lesclaz", "count": 1, "languages": 1 }, { "order": 834, - "name": "angelramirez02", + "name": "giovannipeirone", "count": 1, "languages": 1 }, { "order": 835, - "name": "whiterbb", + "name": "angelramirez02", "count": 1, "languages": 1 }, { "order": 836, - "name": "adridiazz", + "name": "whiterbb", "count": 1, "languages": 1 }, { "order": 837, - "name": "jesus2421", + "name": "adridiazz", "count": 1, "languages": 1 }, { "order": 838, - "name": "euu92", + "name": "jesus2421", "count": 1, "languages": 1 }, { "order": 839, - "name": "dfc201692", + "name": "euu92", "count": 1, "languages": 1 }, { "order": 840, - "name": "astrarothdlcxvi", + "name": "dfc201692", "count": 1, "languages": 1 }, { "order": 841, - "name": "melonconyogurt", + "name": "astrarothdlcxvi", "count": 1, "languages": 1 }, { "order": 842, - "name": "h4cker54n", + "name": "melonconyogurt", "count": 1, "languages": 1 }, { "order": 843, - "name": "batmarc91", + "name": "h4cker54n", "count": 1, "languages": 1 }, { "order": 844, - "name": "joancharles07", + "name": "batmarc91", "count": 1, "languages": 1 }, { "order": 845, - "name": "angel-agis", + "name": "joancharles07", "count": 1, "languages": 1 }, { "order": 846, - "name": "cuervo23alpha", + "name": "angel-agis", "count": 1, "languages": 1 }, { "order": 847, - "name": "mauricioobgo", + "name": "cuervo23alpha", "count": 1, "languages": 1 }, { "order": 848, - "name": "ingjavierpinilla", + "name": "mauricioobgo", "count": 1, "languages": 1 }, { "order": 849, - "name": "derobpe", + "name": "ingjavierpinilla", "count": 1, "languages": 1 }, { "order": 850, - "name": "lordzzz", + "name": "derobpe", "count": 1, "languages": 1 }, { "order": 851, - "name": "alinares94", + "name": "lordzzz", "count": 1, "languages": 1 }, { "order": 852, - "name": "jferchotorres", + "name": "alinares94", "count": 1, "languages": 1 }, { "order": 853, - "name": "713avo", + "name": "jferchotorres", "count": 1, "languages": 1 }, { "order": 854, - "name": "micendev", + "name": "713avo", "count": 1, "languages": 1 }, { "order": 855, - "name": "rusian69", + "name": "micendev", "count": 1, "languages": 1 }, { "order": 856, - "name": "riukac", + "name": "rusian69", "count": 1, "languages": 1 }, { "order": 857, - "name": "rafapg93", + "name": "riukac", "count": 1, "languages": 1 }, { "order": 858, - "name": "wijimenezz", + "name": "rafapg93", "count": 1, "languages": 1 }, { "order": 859, - "name": "vickalc", + "name": "wijimenezz", "count": 1, "languages": 1 }, { "order": 860, - "name": "nicoloboo02", + "name": "vickalc", "count": 1, "languages": 1 }, { "order": 861, - "name": "righelch", + "name": "nicoloboo02", "count": 1, "languages": 1 }, { "order": 862, - "name": "deathbat00", + "name": "righelch", "count": 1, "languages": 1 }, { "order": 863, - "name": "angeloro", + "name": "deathbat00", "count": 1, "languages": 1 }, { "order": 864, - "name": "jony-english22", + "name": "angeloro", "count": 1, "languages": 1 }, { "order": 865, - "name": "markayala13", + "name": "jony-english22", "count": 1, "languages": 1 }, { "order": 866, - "name": "albertovf", + "name": "markayala13", "count": 1, "languages": 1 }, { "order": 867, - "name": "sergiopq", + "name": "albertovf", "count": 1, "languages": 1 }, { "order": 868, - "name": "rocha30", + "name": "sergiopq", "count": 1, "languages": 1 }, { "order": 869, - "name": "marcosalvarezcalabria", + "name": "rocha30", "count": 1, "languages": 1 }, { "order": 870, - "name": "orzefox", + "name": "marcosalvarezcalabria", "count": 1, "languages": 1 }, { "order": 871, - "name": "acirdeveloper", + "name": "orzefox", "count": 1, "languages": 1 }, { "order": 872, - "name": "miguelangelmtz", + "name": "acirdeveloper", "count": 1, "languages": 1 }, { "order": 873, - "name": "emiliordev", + "name": "miguelangelmtz", "count": 1, "languages": 1 }, { "order": 874, - "name": "edgarmedranoa", + "name": "emiliordev", "count": 1, "languages": 1 }, { "order": 875, - "name": "sve-nnn", + "name": "edgarmedranoa", "count": 1, "languages": 1 }, { "order": 876, - "name": "alecraft8", + "name": "sve-nnn", "count": 1, "languages": 1 }, { "order": 877, - "name": "arperezinf", + "name": "alecraft8", "count": 1, "languages": 1 }, { "order": 878, - "name": "ddaniel27", + "name": "arperezinf", "count": 1, "languages": 1 }, { "order": 879, - "name": "jjaljuria", + "name": "ddaniel27", "count": 1, "languages": 1 }, { "order": 880, - "name": "girngoma", + "name": "jjaljuria", "count": 1, "languages": 1 }, { "order": 881, - "name": "juampaweb", + "name": "girngoma", "count": 1, "languages": 1 }, { "order": 882, - "name": "qwik-zghieb", + "name": "juampaweb", "count": 1, "languages": 1 }, { "order": 883, - "name": "willypaz243", + "name": "qwik-zghieb", "count": 1, "languages": 1 }, { "order": 884, - "name": "ouendinga", + "name": "willypaz243", "count": 1, "languages": 1 }, { "order": 885, - "name": "jetiradoro", + "name": "ouendinga", "count": 1, "languages": 1 }, { "order": 886, - "name": "bellodeveloper", + "name": "jetiradoro", "count": 1, "languages": 1 }, { "order": 887, - "name": "nachitoe", + "name": "bellodeveloper", "count": 1, "languages": 1 }, { "order": 888, - "name": "greenalpak", + "name": "nachitoe", "count": 1, "languages": 1 }, { "order": 889, - "name": "alfaroo1", + "name": "greenalpak", "count": 1, "languages": 1 }, { "order": 890, - "name": "kerunaru", + "name": "alfaroo1", "count": 1, "languages": 1 }, { "order": 891, - "name": "anitandil", + "name": "kerunaru", "count": 1, "languages": 1 }, { "order": 892, - "name": "miguel2rar", + "name": "anitandil", "count": 1, "languages": 1 }, { "order": 893, - "name": "miquelrr", + "name": "miguel2rar", "count": 1, "languages": 1 }, { "order": 894, - "name": "francomyburg", + "name": "miquelrr", "count": 1, "languages": 1 }, { "order": 895, - "name": "agustinfccll", + "name": "francomyburg", "count": 1, "languages": 1 }, { "order": 896, - "name": "gabriel-dangelo", + "name": "agustinfccll", "count": 1, "languages": 1 }, { "order": 897, - "name": "neicervb", + "name": "gabriel-dangelo", "count": 1, "languages": 1 }, { "order": 898, - "name": "eamartin", + "name": "neicervb", "count": 1, "languages": 1 }, { "order": 899, - "name": "evilpodato04", + "name": "eamartin", "count": 1, "languages": 1 }, { "order": 900, - "name": "josephinoo", + "name": "evilpodato04", "count": 1, "languages": 1 }, { "order": 901, - "name": "antroc", + "name": "josephinoo", "count": 1, "languages": 1 }, { "order": 902, - "name": "almartinez", + "name": "antroc", "count": 1, "languages": 1 }, { "order": 903, - "name": "vorosdev", + "name": "almartinez", "count": 1, "languages": 1 }, { "order": 904, - "name": "luisgarm", + "name": "vorosdev", "count": 1, "languages": 1 }, { "order": 905, - "name": "santiagomac", + "name": "luisgarm", "count": 1, "languages": 1 }, { "order": 906, - "name": "pipeyz21", + "name": "santiagomac", "count": 1, "languages": 1 }, { "order": 907, - "name": "tetotille", + "name": "pipeyz21", "count": 1, "languages": 1 }, { "order": 908, - "name": "armm77", + "name": "tetotille", "count": 1, "languages": 1 }, { "order": 909, - "name": "bjchavez", + "name": "armm77", "count": 1, "languages": 1 }, { "order": 910, - "name": "jandresalvar", + "name": "bjchavez", "count": 1, "languages": 1 }, { "order": 911, - "name": "joferpg", + "name": "jandresalvar", "count": 1, "languages": 1 }, { "order": 912, - "name": "xtinarita", + "name": "joferpg", "count": 1, "languages": 1 }, { "order": 913, - "name": "luisfglondono", + "name": "xtinarita", "count": 1, "languages": 1 }, { "order": 914, - "name": "erickcis", + "name": "luisfglondono", "count": 1, "languages": 1 }, { "order": 915, - "name": "nico70012", + "name": "erickcis", "count": 1, "languages": 1 }, { "order": 916, - "name": "miguelmancebo", + "name": "nico70012", "count": 1, "languages": 1 }, { "order": 917, - "name": "adcarret", + "name": "miguelmancebo", "count": 1, "languages": 1 }, { "order": 918, - "name": "pepitoladino", + "name": "adcarret", "count": 1, "languages": 1 }, { "order": 919, - "name": "wallsified", + "name": "pepitoladino", "count": 1, "languages": 1 }, { "order": 920, - "name": "betulioo", + "name": "wallsified", "count": 1, "languages": 1 }, { "order": 921, - "name": "neyan52", + "name": "betulioo", "count": 1, "languages": 1 }, { "order": 922, - "name": "pedroomar23 2", + "name": "neyan52", "count": 1, "languages": 1 }, { "order": 923, - "name": "dimanu-py", + "name": "pedroomar23 2", "count": 1, "languages": 1 }, { "order": 924, - "name": "snowcardenas", + "name": "dimanu-py", "count": 1, "languages": 1 }, { "order": 925, - "name": "fergz1988", + "name": "snowcardenas", "count": 1, "languages": 1 }, { "order": 926, - "name": "perla-zg", + "name": "fergz1988", "count": 1, "languages": 1 }, { "order": 927, - "name": "xhinto", + "name": "perla-zg", "count": 1, "languages": 1 }, { "order": 928, - "name": "e-xtian", + "name": "xhinto", "count": 1, "languages": 1 }, { "order": 929, - "name": "ambrociojrdelacruz", + "name": "e-xtian", "count": 1, "languages": 1 }, { "order": 930, - "name": "marcelinoarias369", + "name": "ambrociojrdelacruz", "count": 1, "languages": 1 }, { "order": 931, - "name": "ndepaul82", + "name": "marcelinoarias369", "count": 1, "languages": 1 }, { "order": 932, - "name": "devjerez", + "name": "ndepaul82", "count": 1, "languages": 1 }, { "order": 933, - "name": "franmux01", + "name": "devjerez", "count": 1, "languages": 1 }, { "order": 934, - "name": "mjordanaam", + "name": "franmux01", "count": 1, "languages": 1 }, { "order": 935, - "name": "sergiomhernandez", + "name": "mjordanaam", "count": 1, "languages": 1 }, { "order": 936, - "name": "eddyelx", + "name": "sergiomhernandez", "count": 1, "languages": 1 }, { "order": 937, - "name": "ale_cervi", + "name": "eddyelx", "count": 1, "languages": 1 }, { "order": 938, - "name": "idiegorojas", + "name": "ale_cervi", "count": 1, "languages": 1 }, { "order": 939, - "name": "danidan1214", + "name": "idiegorojas", "count": 1, "languages": 1 }, { "order": 940, - "name": "luisangeles20", + "name": "danidan1214", "count": 1, "languages": 1 }, { "order": 941, - "name": "trosky-wolf", + "name": "luisangeles20", "count": 1, "languages": 1 }, { "order": 942, - "name": "xcortes", + "name": "trosky-wolf", "count": 1, "languages": 1 }, { "order": 943, - "name": "francgci", + "name": "xcortes", "count": 1, "languages": 1 }, { "order": 944, - "name": "arturodlapaz17", + "name": "francgci", "count": 1, "languages": 1 }, { "order": 945, - "name": "adamtormer", + "name": "arturodlapaz17", "count": 1, "languages": 1 }, { "order": 946, - "name": "sherkla12e", + "name": "adamtormer", "count": 1, "languages": 1 }, { "order": 947, - "name": "neftalyr", + "name": "sherkla12e", "count": 1, "languages": 1 }, { "order": 948, - "name": "johannmanrique", + "name": "neftalyr", "count": 1, "languages": 1 }, { "order": 949, - "name": "obed-tc", + "name": "johannmanrique", "count": 1, "languages": 1 }, { "order": 950, - "name": "chrispro-afk", + "name": "obed-tc", "count": 1, "languages": 1 }, { "order": 951, - "name": "gl-informatica", + "name": "chrispro-afk", "count": 1, "languages": 1 }, { "order": 952, - "name": "gersonoroz", + "name": "gl-informatica", "count": 1, "languages": 1 }, { "order": 953, - "name": "demegorash", + "name": "gersonoroz", "count": 1, "languages": 1 }, { "order": 954, - "name": "lioomx", + "name": "demegorash", "count": 1, "languages": 1 }, { "order": 955, - "name": "chema-dw", + "name": "lioomx", "count": 1, "languages": 1 }, { "order": 956, - "name": "vicvilla30", + "name": "luistecnocode", "count": 1, "languages": 1 }, { "order": 957, - "name": "omar8102", + "name": "chema-dw", "count": 1, "languages": 1 }, { "order": 958, - "name": "anexo01", + "name": "vicvilla30", "count": 1, "languages": 1 }, { "order": 959, - "name": "sbngl", + "name": "omar8102", "count": 1, "languages": 1 }, { "order": 960, - "name": "vickalck", + "name": "anexo01", "count": 1, "languages": 1 }, { "order": 961, - "name": "osneidert", + "name": "sbngl", "count": 1, "languages": 1 }, { "order": 962, - "name": "andres-54-coder", + "name": "vickalck", "count": 1, "languages": 1 }, { "order": 963, - "name": "testiman-78", + "name": "osneidert", "count": 1, "languages": 1 }, { "order": 964, - "name": "diegogomezcor4", + "name": "andres-54-coder", "count": 1, "languages": 1 }, { "order": 965, - "name": "carlostoledoe", + "name": "testiman-78", "count": 1, "languages": 1 }, { "order": 966, - "name": "adry2024salt", + "name": "diegogomezcor4", "count": 1, "languages": 1 }, { "order": 967, - "name": "lisandroarnodo", + "name": "carlostoledoe", "count": 1, "languages": 1 }, { "order": 968, - "name": "isaacdci", + "name": "adry2024salt", "count": 1, "languages": 1 }, { "order": 969, - "name": "juanalbornoz32", + "name": "lisandroarnodo", "count": 1, "languages": 1 }, { "order": 970, - "name": "cris10026", + "name": "isaacdci", "count": 1, "languages": 1 }, { "order": 971, - "name": "devkenn", + "name": "juanalbornoz32", "count": 1, "languages": 1 }, { "order": 972, - "name": "henrydavidprimera", + "name": "cris10026", "count": 1, "languages": 1 }, { "order": 973, - "name": "luceldasilva", + "name": "devkenn", "count": 1, "languages": 1 }, { "order": 974, - "name": "mamartinez14", + "name": "henrydavidprimera", "count": 1, "languages": 1 }, { "order": 975, - "name": "javirr4", + "name": "luceldasilva", "count": 1, "languages": 1 }, { "order": 976, - "name": "copamire", + "name": "mamartinez14", "count": 1, "languages": 1 }, { "order": 977, - "name": "krisipo", + "name": "javirr4", "count": 1, "languages": 1 }, { "order": 978, - "name": "theewiick", + "name": "copamire", "count": 1, "languages": 1 }, { "order": 979, - "name": "miguelangel861", + "name": "krisipo", "count": 1, "languages": 1 }, { "order": 980, - "name": "geridage", + "name": "theewiick", "count": 1, "languages": 1 }, { "order": 981, - "name": "kshields51", + "name": "miguelangel861", "count": 1, "languages": 1 }, { "order": 982, - "name": "m4xxdev", + "name": "geridage", "count": 1, "languages": 1 }, { "order": 983, - "name": "snowale", + "name": "kshields51", "count": 1, "languages": 1 }, { "order": 984, - "name": "cristianvergaraf", + "name": "m4xxdev", "count": 1, "languages": 1 }, { "order": 985, - "name": "jansua", + "name": "snowale", "count": 1, "languages": 1 }, { "order": 986, - "name": "hnaranjog", + "name": "cristianvergaraf", "count": 1, "languages": 1 }, { "order": 987, - "name": "sergiovelayos", + "name": "jansua", "count": 1, "languages": 1 }, { "order": 988, - "name": "pepemn23", + "name": "hnaranjog", "count": 1, "languages": 1 }, { "order": 989, - "name": "giovanni-schmaily", + "name": "sergiovelayos", "count": 1, "languages": 1 }, { "order": 990, - "name": "cd1974", + "name": "pepemn23", "count": 1, "languages": 1 }, { "order": 991, - "name": "turudev1979", + "name": "giovanni-schmaily", "count": 1, "languages": 1 }, { "order": 992, - "name": "kkstrofico", + "name": "cd1974", "count": 1, "languages": 1 }, { "order": 993, - "name": "jrgranadosb", + "name": "turudev1979", "count": 1, "languages": 1 }, { "order": 994, - "name": "leo18q", + "name": "kkstrofico", "count": 1, "languages": 1 }, { "order": 995, - "name": "santifer26", + "name": "jrgranadosb", "count": 1, "languages": 1 }, { "order": 996, - "name": "xalejandrow", + "name": "leo18q", "count": 1, "languages": 1 }, { "order": 997, - "name": "kronoscba", + "name": "santifer26", "count": 1, "languages": 1 }, { "order": 998, - "name": "latorredev", + "name": "xalejandrow", "count": 1, "languages": 1 }, { "order": 999, - "name": "and-y21", + "name": "kronoscba", "count": 1, "languages": 1 }, { "order": 1000, - "name": "johao23", + "name": "latorredev", "count": 1, "languages": 1 }, { "order": 1001, - "name": "jalonso76", + "name": "and-y21", "count": 1, "languages": 1 }, { "order": 1002, - "name": "bassalex27", + "name": "johao23", "count": 1, "languages": 1 }, { "order": 1003, - "name": "v0l0v", + "name": "jalonso76", "count": 1, "languages": 1 }, { "order": 1004, - "name": "cesar-rosado", + "name": "bassalex27", "count": 1, "languages": 1 }, { "order": 1005, - "name": "rodrigolopez25", + "name": "v0l0v", "count": 1, "languages": 1 }, { "order": 1006, - "name": "carlosbb70", + "name": "cesar-rosado", "count": 1, "languages": 1 }, { "order": 1007, - "name": "marcos0803", + "name": "rodrigolopez25", "count": 1, "languages": 1 }, { "order": 1008, - "name": "eatsangels", + "name": "carlosbb70", "count": 1, "languages": 1 }, { "order": 1009, - "name": "luiscalle17", + "name": "marcos0803", "count": 1, "languages": 1 }, { "order": 1010, - "name": "leanaren", + "name": "eatsangels", "count": 1, "languages": 1 }, { "order": 1011, - "name": "neusier101", + "name": "luiscalle17", "count": 1, "languages": 1 }, { "order": 1012, - "name": "manuu42", + "name": "leanaren", "count": 1, "languages": 1 }, { "order": 1013, - "name": "ingothik", + "name": "neusier101", "count": 1, "languages": 1 }, { "order": 1014, - "name": "dacaldev", + "name": "manuu42", "count": 1, "languages": 1 }, { "order": 1015, - "name": "90dread", + "name": "ingothik", "count": 1, "languages": 1 }, { "order": 1016, - "name": "wilsonbarrera", + "name": "dacaldev", "count": 1, "languages": 1 }, { "order": 1017, - "name": "deivimiller", + "name": "90dread", "count": 1, "languages": 1 }, { "order": 1018, - "name": "jereaguilar", + "name": "wilsonbarrera", "count": 1, "languages": 1 }, { "order": 1019, - "name": "aritapia19", + "name": "deivimiller", "count": 1, "languages": 1 }, { "order": 1020, - "name": "manueldes27", + "name": "jereaguilar", "count": 1, "languages": 1 }, { "order": 1021, - "name": "g4nd4lf", + "name": "aritapia19", "count": 1, "languages": 1 }, { "order": 1022, - "name": "joamgreen", + "name": "manueldes27", "count": 1, "languages": 1 }, { "order": 1023, - "name": "mrf1989", + "name": "g4nd4lf", "count": 1, "languages": 1 }, { "order": 1024, - "name": "javidp01", + "name": "joamgreen", "count": 1, "languages": 1 }, { "order": 1025, - "name": "josuelopez5", + "name": "mrf1989", "count": 1, "languages": 1 }, { "order": 1026, - "name": "lizzymaken", + "name": "javidp01", "count": 1, "languages": 1 }, { "order": 1027, - "name": "amitchellg", + "name": "josuelopez5", "count": 1, "languages": 1 }, { "order": 1028, - "name": "gmedinat911", + "name": "lizzymaken", "count": 1, "languages": 1 }, { "order": 1029, - "name": "emmanuelmmontesinos ", + "name": "amitchellg", "count": 1, "languages": 1 }, { "order": 1030, - "name": "facundorsabia", + "name": "gmedinat911", "count": 1, "languages": 1 }, { "order": 1031, - "name": "judithernandez", + "name": "emmanuelmmontesinos ", "count": 1, "languages": 1 }, { "order": 1032, - "name": "oxtornado", + "name": "facundorsabia", "count": 1, "languages": 1 }, { "order": 1033, - "name": "alejandro000", + "name": "judithernandez", "count": 1, "languages": 1 }, { "order": 1034, - "name": "gilbertho502", + "name": "oxtornado", "count": 1, "languages": 1 }, { "order": 1035, - "name": "salas89", + "name": "alejandro000", "count": 1, "languages": 1 }, { "order": 1036, - "name": "jgregoris", + "name": "gilbertho502", "count": 1, "languages": 1 }, { "order": 1037, - "name": "jandortiz", + "name": "salas89", "count": 1, "languages": 1 }, { "order": 1038, - "name": "natanaelzubiri", + "name": "jgregoris", "count": 1, "languages": 1 }, { "order": 1039, - "name": "jchernandez87", + "name": "jandortiz", "count": 1, "languages": 1 }, { "order": 1040, - "name": "cisneros2404", + "name": "natanaelzubiri", "count": 1, "languages": 1 }, { "order": 1041, - "name": "vmarialuzm", + "name": "jchernandez87", "count": 1, "languages": 1 }, { "order": 1042, - "name": "lilitr09", + "name": "cisneros2404", "count": 1, "languages": 1 }, { "order": 1043, - "name": "vsxr", + "name": "vmarialuzm", "count": 1, "languages": 1 }, { "order": 1044, - "name": "pushodev", + "name": "lilitr09", "count": 1, "languages": 1 }, { "order": 1045, - "name": "pablom-2015", + "name": "vsxr", "count": 1, "languages": 1 }, { "order": 1046, - "name": "josem17-cyber", + "name": "pushodev", "count": 1, "languages": 1 }, { "order": 1047, - "name": "yetlanezils", + "name": "pablom-2015", "count": 1, "languages": 1 }, { "order": 1048, - "name": "experthacker444", + "name": "josem17-cyber", "count": 1, "languages": 1 }, { "order": 1049, - "name": "luxilith", + "name": "yetlanezils", "count": 1, "languages": 1 }, { "order": 1050, - "name": "decinx1", + "name": "experthacker444", "count": 1, "languages": 1 }, { "order": 1051, - "name": "neshurtado", + "name": "luxilith", "count": 1, "languages": 1 }, { "order": 1052, - "name": "ferngpv", + "name": "decinx1", "count": 1, "languages": 1 }, { "order": 1053, - "name": "randy7394", + "name": "neshurtado", "count": 1, "languages": 1 }, { "order": 1054, - "name": "pr1de-23", + "name": "ferngpv", "count": 1, "languages": 1 }, { "order": 1055, - "name": "claudios1980", + "name": "randy7394", "count": 1, "languages": 1 }, { "order": 1056, - "name": "manueldenisdev", + "name": "pr1de-23", "count": 1, "languages": 1 }, { "order": 1057, - "name": "lluistech", + "name": "claudios1980", "count": 1, "languages": 1 }, { "order": 1058, - "name": "walyfigueroa", + "name": "manueldenisdev", "count": 1, "languages": 1 }, { "order": 1059, - "name": "jordanurzua", + "name": "lluistech", "count": 1, "languages": 1 }, { "order": 1060, - "name": "yamiyugi25", + "name": "walyfigueroa", "count": 1, "languages": 1 }, { "order": 1061, - "name": "julioorozco05", + "name": "jordanurzua", "count": 1, "languages": 1 }, { "order": 1062, - "name": "jgarteag", + "name": "yamiyugi25", "count": 1, "languages": 1 }, { "order": 1063, - "name": "juan-cruz01", + "name": "julioorozco05", "count": 1, "languages": 1 }, { "order": 1064, - "name": "jgcmurcia", + "name": "jgarteag", "count": 1, "languages": 1 }, { "order": 1065, - "name": "acobo3", + "name": "juan-cruz01", "count": 1, "languages": 1 }, { "order": 1066, - "name": "alejarandro", + "name": "jgcmurcia", "count": 1, "languages": 1 }, { "order": 1067, - "name": "davidgramiro", + "name": "acobo3", "count": 1, "languages": 1 }, { "order": 1068, - "name": "dakkaj", + "name": "alejarandro", "count": 1, "languages": 1 }, { "order": 1069, - "name": "sofiamfernandez", + "name": "davidgramiro", "count": 1, "languages": 1 }, { "order": 1070, - "name": "yeisongil", + "name": "dakkaj", "count": 1, "languages": 1 }, { "order": 1071, - "name": "jafuma0320", + "name": "sofiamfernandez", "count": 1, "languages": 1 }, { "order": 1072, - "name": "howlett9999", + "name": "yeisongil", "count": 1, "languages": 1 }, { "order": 1073, - "name": "ignacioskm", + "name": "jafuma0320", "count": 1, "languages": 1 }, { "order": 1074, - "name": "dgjuancho", + "name": "howlett9999", "count": 1, "languages": 1 }, { "order": 1075, - "name": "eljavi0", + "name": "ignacioskm", "count": 1, "languages": 1 }, { "order": 1076, - "name": "charly024", + "name": "dgjuancho", "count": 1, "languages": 1 }, { "order": 1077, - "name": "rastaxico", + "name": "eljavi0", "count": 1, "languages": 1 }, { "order": 1078, - "name": "pandawangt", + "name": "charly024", "count": 1, "languages": 1 }, { "order": 1079, - "name": "zyodev1", + "name": "rastaxico", "count": 1, "languages": 1 }, { "order": 1080, - "name": "juli-m4", + "name": "pandawangt", "count": 1, "languages": 1 }, { "order": 1081, - "name": "masenace", + "name": "zyodev1", "count": 1, "languages": 1 }, { "order": 1082, - "name": "zeraven09", + "name": "juli-m4", "count": 1, "languages": 1 }, { "order": 1083, - "name": "kata-lg", + "name": "masenace", "count": 1, "languages": 1 }, { "order": 1084, - "name": "van-02", + "name": "zeraven09", "count": 1, "languages": 1 }, { "order": 1085, - "name": "x3mboy", + "name": "kata-lg", "count": 1, "languages": 1 }, { "order": 1086, - "name": "ca2puntosv", + "name": "van-02", "count": 1, "languages": 1 }, { "order": 1087, - "name": "franciscokarriere", + "name": "x3mboy", "count": 1, "languages": 1 }, { "order": 1088, - "name": "franckdot", + "name": "ca2puntosv", "count": 1, "languages": 1 }, { "order": 1089, - "name": "brunom-93", + "name": "franciscokarriere", "count": 1, "languages": 1 }, { "order": 1090, - "name": "maurspi", + "name": "franckdot", "count": 1, "languages": 1 }, { "order": 1091, - "name": "trollface77", + "name": "brunom-93", "count": 1, "languages": 1 }, { "order": 1092, - "name": "jhonnfl", + "name": "maurspi", "count": 1, "languages": 1 }, { "order": 1093, - "name": "zakeyo", + "name": "trollface77", "count": 1, "languages": 1 }, { "order": 1094, - "name": "manuelgomezg", + "name": "jhonnfl", "count": 1, "languages": 1 }, { "order": 1095, - "name": "jarzatedev", + "name": "zakeyo", "count": 1, "languages": 1 }, { "order": 1096, - "name": "luisfcaro", + "name": "manuelgomezg", "count": 1, "languages": 1 }, { "order": 1097, - "name": "edm1ya", + "name": "jarzatedev", "count": 1, "languages": 1 }, { "order": 1098, - "name": "alejandroruiz23", + "name": "luisfcaro", "count": 1, "languages": 1 }, { "order": 1099, - "name": "jaimesoftdev", + "name": "edm1ya", "count": 1, "languages": 1 }, { "order": 1100, - "name": "alexvasquez199914", + "name": "alejandroruiz23", "count": 1, "languages": 1 }, { "order": 1101, - "name": "deimoshall", + "name": "jaimesoftdev", "count": 1, "languages": 1 }, { "order": 1102, - "name": "over-kr", + "name": "alexvasquez199914", "count": 1, "languages": 1 }, { "order": 1103, - "name": "fede6299", + "name": "deimoshall", "count": 1, "languages": 1 }, { "order": 1104, - "name": "kevin05m", + "name": "over-kr", "count": 1, "languages": 1 }, { "order": 1105, - "name": "diegomm27", + "name": "fede6299", "count": 1, "languages": 1 }, { "order": 1106, - "name": "pablo-lnx", + "name": "kevin05m", "count": 1, "languages": 1 }, { "order": 1107, - "name": "darkohokage", + "name": "diegomm27", "count": 1, "languages": 1 }, { "order": 1108, - "name": "chrystiancalderon", + "name": "pablo-lnx", "count": 1, "languages": 1 }, { "order": 1109, - "name": "gianellannie", + "name": "darkohokage", "count": 1, "languages": 1 }, { "order": 1110, - "name": "serg_pq", + "name": "chrystiancalderon", "count": 1, "languages": 1 }, { "order": 1111, - "name": "jose-zga", + "name": "gianellannie", "count": 1, "languages": 1 }, { "order": 1112, - "name": "zyn7e", + "name": "serg_pq", "count": 1, "languages": 1 }, { "order": 1113, - "name": "xhaloidx", + "name": "jose-zga", "count": 1, "languages": 1 }, { "order": 1114, - "name": "frankmon03", + "name": "zyn7e", "count": 1, "languages": 1 }, { "order": 1115, - "name": "martinaq", + "name": "xhaloidx", "count": 1, "languages": 1 }, { "order": 1116, - "name": "lewisoneil", + "name": "frankmon03", "count": 1, "languages": 1 }, { "order": 1117, - "name": "cristobalbelcor", + "name": "martinaq", "count": 1, "languages": 1 }, { "order": 1118, - "name": "cristian-encalada", + "name": "lewisoneil", "count": 1, "languages": 1 }, { "order": 1119, - "name": "chalaito88", + "name": "cristobalbelcor", "count": 1, "languages": 1 }, { "order": 1120, - "name": "angeldevsarrollo", + "name": "cristian-encalada", "count": 1, "languages": 1 }, { "order": 1121, - "name": "hanzd07", + "name": "chalaito88", "count": 1, "languages": 1 }, { "order": 1122, - "name": "vikinghost", + "name": "angeldevsarrollo", "count": 1, "languages": 1 }, { "order": 1123, - "name": "det3992", + "name": "hanzd07", "count": 1, "languages": 1 }, { "order": 1124, - "name": "alvaropg15", + "name": "vikinghost", "count": 1, "languages": 1 }, { "order": 1125, - "name": "danisaurio94", + "name": "jossfullstack", "count": 1, "languages": 1 }, { "order": 1126, - "name": "iguerrerov", + "name": "det3992", "count": 1, "languages": 1 }, { "order": 1127, - "name": "bycris13", + "name": "alvaropg15", "count": 1, "languages": 1 }, { "order": 1128, - "name": "albert-29", + "name": "danisaurio94", "count": 1, "languages": 1 }, { "order": 1129, - "name": "nolemoon", + "name": "iguerrerov", "count": 1, "languages": 1 }, { "order": 1130, - "name": "ignaciiodev", + "name": "bycris13", "count": 1, "languages": 1 }, { "order": 1131, - "name": "jrgim", + "name": "albert-29", "count": 1, "languages": 1 }, { "order": 1132, - "name": "clespinosa2024", + "name": "nolemoon", "count": 1, "languages": 1 }, { "order": 1133, - "name": "cybersutro", + "name": "ignaciiodev", "count": 1, "languages": 1 }, { "order": 1134, - "name": "reneguzman7", + "name": "jrgim", "count": 1, "languages": 1 }, { "order": 1135, - "name": "nazhiravila", + "name": "clespinosa2024", "count": 1, "languages": 1 }, { "order": 1136, + "name": "cybersutro", + "count": 1, + "languages": 1 + }, + { + "order": 1137, + "name": "reneguzman7", + "count": 1, + "languages": 1 + }, + { + "order": 1138, + "name": "nazhiravila", + "count": 1, + "languages": 1 + }, + { + "order": 1139, "name": "dsmhp0", "count": 1, "languages": 1 }, { - "order": 1137, + "order": 1140, "name": "algeloro", "count": 1, "languages": 1 }, { - "order": 1138, + "order": 1141, "name": "adriansaint07", "count": 1, "languages": 1 }, { - "order": 1139, + "order": 1142, "name": "v1k770r", "count": 1, "languages": 1 }, { - "order": 1140, + "order": 1143, "name": "jaquelinetorres", "count": 1, "languages": 1 }, { - "order": 1141, + "order": 1144, "name": "jlrojano", "count": 1, "languages": 1 }, { - "order": 1142, + "order": 1145, "name": "maynor06", "count": 1, "languages": 1 }, { - "order": 1143, + "order": 1146, "name": "dovinhoyos", "count": 1, "languages": 1 }, { - "order": 1144, + "order": 1147, "name": "alefine", "count": 1, "languages": 1 }, { - "order": 1145, + "order": 1148, "name": "ivanserran", "count": 1, "languages": 1 }, { - "order": 1146, + "order": 1149, "name": "alexeigio", "count": 1, "languages": 1 }, { - "order": 1147, + "order": 1150, "name": "fredylopez01", "count": 1, "languages": 1 }, { - "order": 1148, + "order": 1151, "name": "santiagopereiraviroga", "count": 1, "languages": 1 }, { - "order": 1149, + "order": 1152, "name": "deathbato", "count": 1, "languages": 1 }, { - "order": 1150, + "order": 1153, "name": "jony_english22", "count": 1, "languages": 1 }, { - "order": 1151, + "order": 1154, "name": "mathiur", "count": 1, "languages": 1 }, { - "order": 1152, + "order": 1155, "name": "derkopath", "count": 1, "languages": 1 }, { - "order": 1153, + "order": 1156, "name": "robermejia", "count": 1, "languages": 1 }, { - "order": 1154, + "order": 1157, "name": "lautimorales", "count": 1, "languages": 1 }, { - "order": 1155, + "order": 1158, "name": "diegopardomontero", "count": 1, "languages": 1 }, { - "order": 1156, + "order": 1159, "name": "adriangonzalezroble", "count": 1, "languages": 1 }, { - "order": 1157, + "order": 1160, "name": "dariel800xd", "count": 1, "languages": 1 }, { - "order": 1158, + "order": 1161, "name": "sxxnzdev", "count": 1, "languages": 1 }, { - "order": 1159, + "order": 1162, "name": "pguillo", "count": 1, "languages": 1 }, { - "order": 1160, + "order": 1163, "name": "dany3gs", "count": 1, "languages": 1 }, { - "order": 1161, + "order": 1164, "name": "durwian", "count": 1, "languages": 1 }, { - "order": 1162, + "order": 1165, "name": "antoniojzp86", "count": 1, "languages": 1 }, { - "order": 1163, + "order": 1166, "name": "jaimenar", "count": 1, "languages": 1 }, { - "order": 1164, + "order": 1167, "name": "rreyes0424", "count": 1, "languages": 1 }, { - "order": 1165, + "order": 1168, "name": "javiir", "count": 1, "languages": 1 }, { - "order": 1166, + "order": 1169, "name": "queralesdev", "count": 1, "languages": 1 }, { - "order": 1167, + "order": 1170, "name": "cristianmr87", "count": 1, "languages": 1 }, { - "order": 1168, + "order": 1171, "name": "kgrc05", "count": 1, "languages": 1 }, { - "order": 1169, + "order": 1172, "name": "sanuka78", "count": 1, "languages": 1 }, { - "order": 1170, + "order": 1173, "name": "pvigo10", "count": 1, "languages": 1 }, { - "order": 1171, + "order": 1174, "name": "lizandev", "count": 1, "languages": 1 }, { - "order": 1172, + "order": 1175, "name": "danielcastillo1112", "count": 1, "languages": 1 }, { - "order": 1173, + "order": 1176, "name": "devm0nk3y", "count": 1, "languages": 1 }, { - "order": 1174, + "order": 1177, "name": "corvo-99", "count": 1, "languages": 1 }, { - "order": 1175, + "order": 1178, "name": "sirvega83", "count": 1, "languages": 1 }, { - "order": 1176, + "order": 1179, "name": "malkarmah", "count": 1, "languages": 1 }, { - "order": 1177, + "order": 1180, "name": "franpua", "count": 1, "languages": 1 }, { - "order": 1178, + "order": 1181, "name": "vinyoles", "count": 1, "languages": 1 }, { - "order": 1179, + "order": 1182, "name": "omarroman29", "count": 1, "languages": 1 }, { - "order": 1180, + "order": 1183, "name": "theposi", "count": 1, "languages": 1 }, { - "order": 1181, + "order": 1184, "name": "1cel4nc3", "count": 1, "languages": 1 }, { - "order": 1182, + "order": 1185, "name": "marianofernandezs", "count": 1, "languages": 1 }, { - "order": 1183, + "order": 1186, "name": "paluzz", "count": 1, "languages": 1 }, { - "order": 1184, + "order": 1187, "name": "sergio-strazzacappa", "count": 1, "languages": 1 }, { - "order": 1185, + "order": 1188, "name": "arathhh8", "count": 1, "languages": 1 }, { - "order": 1186, + "order": 1189, "name": "juandevian", "count": 1, "languages": 1 }, { - "order": 1187, + "order": 1190, "name": "gabrielcharibpolls", "count": 1, "languages": 1 }, { - "order": 1188, + "order": 1191, "name": "jatomas", "count": 1, "languages": 1 }, { - "order": 1189, + "order": 1192, "name": "astriebeck", "count": 1, "languages": 1 }, { - "order": 1190, + "order": 1193, "name": "rocadev2714", "count": 1, "languages": 1 }, { - "order": 1191, + "order": 1194, "name": "afacorroloscos", "count": 1, "languages": 1 }, { - "order": 1192, + "order": 1195, "name": "chrisfelixgil", "count": 1, "languages": 1 }, { - "order": 1193, + "order": 1196, "name": "marvinagui", "count": 1, "languages": 1 }, { - "order": 1194, + "order": 1197, "name": "ledyam", "count": 1, "languages": 1 }, { - "order": 1195, + "order": 1198, "name": "jcrobles99", "count": 1, "languages": 1 }, { - "order": 1196, + "order": 1199, "name": "angel-tineo", "count": 1, "languages": 1 }, { - "order": 1197, + "order": 1200, "name": "marqitos", "count": 1, "languages": 1 }, { - "order": 1198, + "order": 1201, "name": "wilibac", "count": 1, "languages": 1 }, { - "order": 1199, + "order": 1202, "name": "ishimaku", "count": 1, "languages": 1 }, { - "order": 1200, + "order": 1203, "name": "nunezlagos", "count": 1, "languages": 1 }, { - "order": 1201, + "order": 1204, "name": "sandrarg85", "count": 1, "languages": 1 }, { - "order": 1202, + "order": 1205, "name": "pkmaventura", "count": 1, "languages": 1 }, { - "order": 1203, + "order": 1206, "name": "miguelgargallo", "count": 1, "languages": 1 }, { - "order": 1204, + "order": 1207, "name": "lobogeekmx", "count": 1, "languages": 1 }, { - "order": 1205, + "order": 1208, "name": "rootqui", "count": 1, "languages": 1 }, { - "order": 1206, + "order": 1209, "name": "palons29", "count": 1, "languages": 1 }, { - "order": 1207, + "order": 1210, "name": "implevacui", "count": 1, "languages": 1 }, { - "order": 1208, + "order": 1211, "name": "mickysoft", "count": 1, "languages": 1 }, { - "order": 1209, + "order": 1212, "name": "alexisbarradev", "count": 1, "languages": 1 }, { - "order": 1210, + "order": 1213, "name": "tartabullroberto", "count": 1, "languages": 1 }, { - "order": 1211, + "order": 1214, "name": "kelvincb", "count": 1, "languages": 1 }, { - "order": 1212, + "order": 1215, "name": "lara-vel-dev", "count": 1, "languages": 1 }, { - "order": 1213, + "order": 1216, "name": "serg-pq", "count": 1, "languages": 1 }, { - "order": 1214, + "order": 1217, "name": "acirdevelper", "count": 1, "languages": 1 }, { - "order": 1215, + "order": 1218, "name": "francisleble", "count": 1, "languages": 1 }, { - "order": 1216, + "order": 1219, "name": "jhordanluyo", "count": 1, "languages": 1 }, { - "order": 1217, + "order": 1220, "name": "bokysherlo", "count": 1, "languages": 1 }, { - "order": 1218, + "order": 1221, "name": "daniel-cas", "count": 1, "languages": 1 }, { - "order": 1219, + "order": 1222, "name": "borjadelgadodev", "count": 1, "languages": 1 }, { - "order": 1220, + "order": 1223, "name": "alvarominarro", "count": 1, "languages": 1 }, { - "order": 1221, + "order": 1224, "name": "mbmaeso", "count": 1, "languages": 1 }, { - "order": 1222, + "order": 1225, "name": "deiiviitdev", "count": 1, "languages": 1 }, { - "order": 1223, + "order": 1226, "name": "braiso-22", "count": 1, "languages": 1 }, { - "order": 1224, + "order": 1227, "name": "davidcv-dev", "count": 1, "languages": 1 }, { - "order": 1225, + "order": 1228, "name": "luisalberto22", "count": 1, "languages": 1 }, { - "order": 1226, + "order": 1229, "name": "mauricioyair", "count": 1, "languages": 1 }, { - "order": 1227, + "order": 1230, "name": "rulo77", "count": 1, "languages": 1 }, { - "order": 1228, + "order": 1231, "name": "serg032", "count": 1, "languages": 1 }, { - "order": 1229, + "order": 1232, "name": "jancalos", "count": 1, "languages": 1 }, { - "order": 1230, + "order": 1233, "name": "manuhssj", "count": 1, "languages": 1 }, { - "order": 1231, + "order": 1234, "name": "feliaguirre7", "count": 1, "languages": 1 }, { - "order": 1232, + "order": 1235, "name": "manugonzalito", "count": 1, "languages": 1 }, { - "order": 1233, + "order": 1236, "name": "cibacoa", "count": 1, "languages": 1 }, { - "order": 1234, + "order": 1237, "name": "lucc4sz", "count": 1, "languages": 1 }, { - "order": 1235, + "order": 1238, "name": "gizelads", "count": 1, "languages": 1 }, { - "order": 1236, + "order": 1239, "name": "deaconst", "count": 1, "languages": 1 }, { - "order": 1237, + "order": 1240, "name": "marcosapodaca", "count": 1, "languages": 1 }, { - "order": 1238, + "order": 1241, "name": "coletonosh", "count": 1, "languages": 1 }, { - "order": 1239, + "order": 1242, "name": "axelwestman", "count": 1, "languages": 1 }, { - "order": 1240, + "order": 1243, "name": "is2095", "count": 1, "languages": 1 }, { - "order": 1241, + "order": 1244, "name": "seigigim", "count": 1, "languages": 1 }, { - "order": 1242, + "order": 1245, "name": "javodevon", "count": 1, "languages": 1 }, { - "order": 1243, + "order": 1246, "name": "marcosjarrin", "count": 1, "languages": 1 }, { - "order": 1244, + "order": 1247, "name": "angelcruzg23", "count": 1, "languages": 1 }, { - "order": 1245, + "order": 1248, "name": "fernandofl", "count": 1, "languages": 1 }, { - "order": 1246, + "order": 1249, "name": "quirogapau", "count": 1, "languages": 1 }, { - "order": 1247, + "order": 1250, "name": "brayancordova1", "count": 1, "languages": 1 }, { - "order": 1248, + "order": 1251, "name": "yaojema", "count": 1, "languages": 1 }, { - "order": 1249, + "order": 1252, "name": "gerespinosa", "count": 1, "languages": 1 }, { - "order": 1250, + "order": 1253, "name": "flarien", "count": 1, "languages": 1 }, { - "order": 1251, + "order": 1254, "name": "lopesteban", "count": 1, "languages": 1 }, { - "order": 1252, + "order": 1255, "name": "gc796", "count": 1, "languages": 1 }, { - "order": 1253, + "order": 1256, "name": "nixoo657", "count": 1, "languages": 1 }, { - "order": 1254, + "order": 1257, "name": "miguelsarm", "count": 1, "languages": 1 }, { - "order": 1255, + "order": 1258, "name": "diego-santana23", "count": 1, "languages": 1 }, { - "order": 1256, + "order": 1259, "name": "edperez07", "count": 1, "languages": 1 }, { - "order": 1257, + "order": 1260, "name": "siuldev", "count": 1, "languages": 1 }, { - "order": 1258, + "order": 1261, "name": "alvarommedia", "count": 1, "languages": 1 }, { - "order": 1259, + "order": 1262, "name": "johanrv", "count": 1, "languages": 1 }, { - "order": 1260, + "order": 1263, "name": "mekanicas", "count": 1, "languages": 1 }, { - "order": 1261, + "order": 1264, "name": "cristiantorres53", "count": 1, "languages": 1 }, { - "order": 1262, + "order": 1265, "name": "rojasvargas", "count": 1, "languages": 1 }, { - "order": 1263, + "order": 1266, "name": "nicorey89", "count": 1, "languages": 1 }, { - "order": 1264, + "order": 1267, "name": "estefrac", "count": 1, "languages": 1 }, { - "order": 1265, + "order": 1268, "name": "rotsenn", "count": 1, "languages": 1 }, { - "order": 1266, + "order": 1269, "name": "pointfs", "count": 1, "languages": 1 }, { - "order": 1267, + "order": 1270, "name": "royhuamanavila", "count": 1, "languages": 1 }, { - "order": 1268, + "order": 1271, "name": "sixtodev", "count": 1, "languages": 1 }, { - "order": 1269, + "order": 1272, "name": "jd-gm", "count": 1, "languages": 1 }, { - "order": 1270, + "order": 1273, "name": "pierre-ol", "count": 1, "languages": 1 }, { - "order": 1271, + "order": 1274, "name": "jpiacaruso", "count": 1, "languages": 1 }, { - "order": 1272, + "order": 1275, "name": "kouski", "count": 1, "languages": 1 }, { - "order": 1273, + "order": 1276, "name": "dianelis1", "count": 1, "languages": 1 }, { - "order": 1274, + "order": 1277, "name": "kinrgdev", "count": 1, "languages": 1 }, { - "order": 1275, + "order": 1278, "name": "rodmiggithub", "count": 1, "languages": 1 }, { - "order": 1276, + "order": 1279, "name": "augustbs", "count": 1, "languages": 1 }, { - "order": 1277, + "order": 1280, "name": "aleclto7", "count": 1, "languages": 1 }, { - "order": 1278, + "order": 1281, "name": "alemar16", "count": 1, "languages": 1 }, { - "order": 1279, + "order": 1282, "name": "vmga09", "count": 1, "languages": 1 }, { - "order": 1280, + "order": 1283, "name": "cgomezadolfo", "count": 1, "languages": 1 }, { - "order": 1281, + "order": 1284, "name": "nnunezmedina", "count": 1, "languages": 1 }, { - "order": 1282, + "order": 1285, "name": "luchof5", "count": 1, "languages": 1 }, { - "order": 1283, + "order": 1286, "name": "edgonzz", "count": 1, "languages": 1 }, { - "order": 1284, + "order": 1287, "name": "ronnieruuz", "count": 1, "languages": 1 }, { - "order": 1285, + "order": 1288, "name": "ercky1980", "count": 1, "languages": 1 }, { - "order": 1286, + "order": 1289, "name": "maximotoro", "count": 1, "languages": 1 }, { - "order": 1287, + "order": 1290, "name": "kenzambrano", "count": 1, "languages": 1 }, { - "order": 1288, + "order": 1291, "name": "lfam200", "count": 1, "languages": 1 }, { - "order": 1289, + "order": 1292, "name": "antonioverdugo", "count": 1, "languages": 1 }, { - "order": 1290, + "order": 1293, "name": "madelefonb", "count": 1, "languages": 1 }, { - "order": 1291, + "order": 1294, "name": "dacronik", "count": 1, "languages": 1 }, { - "order": 1292, + "order": 1295, "name": "kronomio", "count": 1, "languages": 1 }, { - "order": 1293, + "order": 1296, "name": "1978acb", "count": 1, "languages": 1 }, { - "order": 1294, + "order": 1297, "name": "xnomada", "count": 1, "languages": 1 }, { - "order": 1295, + "order": 1298, "name": "imista", "count": 1, "languages": 1 }, { - "order": 1296, + "order": 1299, "name": "dmhenaopa", "count": 1, "languages": 1 }, { - "order": 1297, + "order": 1300, "name": "lugryssd3v", "count": 1, "languages": 1 }, { - "order": 1298, + "order": 1301, "name": "gustavoguerrero", "count": 1, "languages": 1 }, { - "order": 1299, + "order": 1302, "name": "datrujillog", "count": 1, "languages": 1 }, { - "order": 1300, + "order": 1303, "name": "romanocoder", "count": 1, "languages": 1 }, { - "order": 1301, + "order": 1304, "name": "hfvaronb", "count": 1, "languages": 1 }, { - "order": 1302, + "order": 1305, "name": "kocho03", "count": 1, "languages": 1 }, { - "order": 1303, + "order": 1306, "name": "johnniew81", "count": 1, "languages": 1 }, { - "order": 1304, + "order": 1307, "name": "vainsito1", "count": 1, "languages": 1 }, { - "order": 1305, + "order": 1308, "name": "s9code", "count": 1, "languages": 1 }, { - "order": 1306, + "order": 1309, "name": "albabp", "count": 1, "languages": 1 }, { - "order": 1307, + "order": 1310, "name": "joseperesini", "count": 1, "languages": 1 }, { - "order": 1308, + "order": 1311, "name": "chriszaldana", "count": 1, "languages": 1 }, { - "order": 1309, + "order": 1312, "name": "diegoxxd", "count": 1, "languages": 1 }, { - "order": 1310, + "order": 1313, "name": "aidicoop", "count": 1, "languages": 1 }, { - "order": 1311, + "order": 1314, "name": "krrattoss5", "count": 1, "languages": 1 }, { - "order": 1312, + "order": 1315, "name": "javieradev", "count": 1, "languages": 1 }, { - "order": 1313, + "order": 1316, "name": "lfwzk", "count": 1, "languages": 1 }, { - "order": 1314, + "order": 1317, "name": "fullstackarlo", "count": 1, "languages": 1 }, { - "order": 1315, + "order": 1318, "name": "leydimadrid", "count": 1, "languages": 1 }, { - "order": 1316, + "order": 1319, "name": "joshua0730-star", "count": 1, "languages": 1 }, { - "order": 1317, + "order": 1320, "name": "afl0r3s", "count": 1, "languages": 1 }, { - "order": 1318, + "order": 1321, "name": "sejotaz", "count": 1, "languages": 1 }, { - "order": 1319, + "order": 1322, "name": "alexxawada", "count": 1, "languages": 1 }, { - "order": 1320, + "order": 1323, "name": "juanserdev", "count": 1, "languages": 1 }, { - "order": 1321, + "order": 1324, "name": "chrissr0", "count": 1, "languages": 1 }, { - "order": 1322, + "order": 1325, "name": "yessikamichelle", "count": 1, "languages": 1 }, { - "order": 1323, + "order": 1326, "name": "l3v1xx", "count": 1, "languages": 1 }, { - "order": 1324, + "order": 1327, "name": "juanpablo-a", "count": 1, "languages": 1 }, { - "order": 1325, + "order": 1328, "name": "nozodev", "count": 1, "languages": 1 }, { - "order": 1326, + "order": 1329, "name": "isnatthy", "count": 1, "languages": 1 }, { - "order": 1327, + "order": 1330, "name": "frannm29", "count": 1, "languages": 1 }, { - "order": 1328, + "order": 1331, "name": "peticas", "count": 1, "languages": 1 }, { - "order": 1329, + "order": 1332, "name": "francomoreira", "count": 1, "languages": 1 }, { - "order": 1330, + "order": 1333, "name": "jsruedatorres", "count": 1, "languages": 1 }, { - "order": 1331, + "order": 1334, "name": "mdemena", "count": 1, "languages": 1 }, { - "order": 1332, + "order": 1335, "name": "saintsluis", "count": 1, "languages": 1 }, { - "order": 1333, + "order": 1336, "name": "oscarletelier", "count": 1, "languages": 1 }, { - "order": 1334, + "order": 1337, "name": "nfom24", "count": 1, "languages": 1 }, { - "order": 1335, + "order": 1338, "name": "patricioguerra30", "count": 1, "languages": 1 }, { - "order": 1336, + "order": 1339, "name": "walkerlyna", "count": 1, "languages": 1 }, { - "order": 1337, + "order": 1340, "name": "mvillegas18", "count": 1, "languages": 1 }, { - "order": 1338, + "order": 1341, "name": "alexis0717", "count": 1, "languages": 1 }, { - "order": 1339, + "order": 1342, "name": "abengl", "count": 1, "languages": 1 }, { - "order": 1340, + "order": 1343, "name": "santaravena", "count": 1, "languages": 1 }, { - "order": 1341, + "order": 1344, "name": "cliverjimny123", "count": 1, "languages": 1 }, { - "order": 1342, + "order": 1345, "name": "kevinramirez28", "count": 1, "languages": 1 }, { - "order": 1343, + "order": 1346, "name": "francescoalterio", "count": 1, "languages": 1 }, { - "order": 1344, + "order": 1347, "name": "diegoasebey", "count": 1, "languages": 1 }, { - "order": 1345, + "order": 1348, "name": "victormdev24", "count": 1, "languages": 1 }, { - "order": 1346, + "order": 1349, "name": "frankqv", "count": 1, "languages": 1 }, { - "order": 1347, + "order": 1350, "name": "denisortega", "count": 1, "languages": 1 }, { - "order": 1348, + "order": 1351, "name": "m4xisil", "count": 1, "languages": 1 }, { - "order": 1349, + "order": 1352, "name": "jose-miguel1", "count": 1, "languages": 1 }, { - "order": 1350, + "order": 1353, "name": "conrado85", "count": 1, "languages": 1 }, { - "order": 1351, + "order": 1354, "name": "lucianogriffa", "count": 1, "languages": 1 }, { - "order": 1352, + "order": 1355, "name": "sergioab7", "count": 1, "languages": 1 }, { - "order": 1353, + "order": 1356, "name": "jacobrwx", "count": 1, "languages": 1 }, { - "order": 1354, + "order": 1357, "name": "abraham9804", "count": 1, "languages": 1 }, { - "order": 1355, + "order": 1358, "name": "agus-ig", "count": 1, "languages": 1 }, { - "order": 1356, + "order": 1359, "name": "lytsar", "count": 1, "languages": 1 }, { - "order": 1357, + "order": 1360, "name": "frcan89", "count": 1, "languages": 1 }, { - "order": 1358, + "order": 1361, "name": "mhrosariom", "count": 1, "languages": 1 }, { - "order": 1359, + "order": 1362, "name": "ja-bell", "count": 1, "languages": 1 }, { - "order": 1360, + "order": 1363, "name": "carlosdiaz-dev", "count": 1, "languages": 1 }, { - "order": 1361, + "order": 1364, "name": "codejoss", "count": 1, "languages": 1 }, { - "order": 1362, + "order": 1365, "name": "ricarsur", "count": 1, "languages": 1 }, { - "order": 1363, + "order": 1366, "name": "fzcarlitos", "count": 1, "languages": 1 }, { - "order": 1364, + "order": 1367, "name": "javosss", "count": 1, "languages": 1 }, { - "order": 1365, + "order": 1368, "name": "dgquintero", "count": 1, "languages": 1 }, { - "order": 1366, + "order": 1369, "name": "torvicv", "count": 1, "languages": 1 }, { - "order": 1367, + "order": 1370, "name": "cyberingeniero", "count": 1, "languages": 1 }, { - "order": 1368, + "order": 1371, "name": "markbus-ai", "count": 1, "languages": 1 }, { - "order": 1369, + "order": 1372, "name": "opahostil", "count": 1, "languages": 1 }, { - "order": 1370, + "order": 1373, "name": "gonzalinuz18", "count": 1, "languages": 1 }, { - "order": 1371, + "order": 1374, "name": "mmariob", "count": 1, "languages": 1 }, { - "order": 1372, + "order": 1375, "name": "daichiko", "count": 1, "languages": 1 }, { - "order": 1373, + "order": 1376, "name": "emanuelgauler", "count": 1, "languages": 1 }, { - "order": 1374, + "order": 1377, "name": "albmartinez", "count": 1, "languages": 1 }, { - "order": 1375, + "order": 1378, "name": "eduardo282", "count": 1, "languages": 1 }, { - "order": 1376, + "order": 1379, "name": "nightmare79", "count": 1, "languages": 1 }, { - "order": 1377, + "order": 1380, "name": "vikernes27666", "count": 1, "languages": 1 }, { - "order": 1378, + "order": 1381, "name": "cub-tor", "count": 1, "languages": 1 }, { - "order": 1379, + "order": 1382, "name": "carlosmperezm", "count": 1, "languages": 1 }, { - "order": 1380, + "order": 1383, "name": " maxirica", "count": 1, "languages": 1 }, { - "order": 1381, + "order": 1384, "name": "carlosmares", "count": 1, "languages": 1 }, { - "order": 1382, + "order": 1385, "name": "jstr14", "count": 1, "languages": 1 }, { - "order": 1383, + "order": 1386, "name": "snaisel", "count": 1, "languages": 1 }, { - "order": 1384, + "order": 1387, "name": "thompson6626", "count": 1, "languages": 1 }, { - "order": 1385, + "order": 1388, "name": "leonardo-henao", "count": 1, "languages": 1 }, { - "order": 1386, + "order": 1389, "name": "juancamilofvx", "count": 1, "languages": 1 }, { - "order": 1387, + "order": 1390, "name": "c-blskv", "count": 1, "languages": 1 }, { - "order": 1388, + "order": 1391, "name": "emaerniquez", "count": 1, "languages": 1 }, { - "order": 1389, + "order": 1392, "name": "carolhs92", "count": 1, "languages": 1 }, { - "order": 1390, + "order": 1393, "name": "tilordqwerty", "count": 1, "languages": 1 }, { - "order": 1391, + "order": 1394, "name": "rawc1nnamon", "count": 1, "languages": 1 }, { - "order": 1392, + "order": 1395, "name": "luism95", "count": 1, "languages": 1 }, { - "order": 1393, + "order": 1396, "name": "santyjl44", "count": 1, "languages": 1