diff --git a/README.md b/README.md index a0c5b49814..ed5ee76a10 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,8 @@ ## Corrección y próximo ejercicio -> #### Lunes 9 de septiembre de 2024 a las 20:00 (hora España) desde **[Twitch](https://twitch.tv/mouredev)** -> #### Consulta el **[horario](https://discord.gg/7A9NDvrb?event=1277739431696138385)** por país y crea un **[recordatorio](https://discord.gg/7A9NDvrb?event=1277739431696138385)** +> #### Lunes 16 de septiembre de 2024 a las 20:00 (hora España) desde **[Twitch](https://twitch.tv/mouredev)** +> #### Consulta el **[horario](https://discord.gg/8cxgGTxm?event=1280229634524450877)** por país y crea un **[recordatorio](https://discord.gg/8cxgGTxm?event=1280229634524450877)** ## Roadmap @@ -70,7 +70,8 @@ |33|[RESCATANDO A MICKEY](./Roadmap/33%20-%20RESCATANDO%20A%20MICKEY/ejercicio.md)|[📝](./Roadmap/33%20-%20RESCATANDO%20A%20MICKEY/python/mouredev.py)|[▶️](https://youtu.be/Bo9Cp3N68C0)|[👥](./Roadmap/33%20-%20RESCATANDO%20A%20MICKEY/) |34|[ÁRBOL GENEALÓGICO DE LA CASA DEL DRAGÓN](./Roadmap/34%20-%20ÁRBOL%20GENEALÓGICO%20LA%20CASA%20DEL%20DRAGÓN/ejercicio.md)|[📝](./Roadmap/34%20-%20ÁRBOL%20GENEALÓGICO%20LA%20CASA%20DEL%20DRAGÓN/python/mouredev.py)|[▶️](https://youtu.be/GAHBOAzgE2w)|[👥](./Roadmap/34%20-%20ÁRBOL%20GENEALÓGICO%20LA%20CASA%20DEL%20DRAGÓN/) |35|[REPARTIENDO LOS ANILLOS DE PODER](./Roadmap/35%20-%20REPARTIENDO%20LOS%20ANILLOS%20DE%20PODER/ejercicio.md)|[📝](./Roadmap/35%20-%20REPARTIENDO%20LOS%20ANILLOS%20DE%20PODER/python/mouredev.py)|[▶️](https://youtu.be/10i2dnaMLj8)|[👥](./Roadmap/35%20-%20REPARTIENDO%20LOS%20ANILLOS%20DE%20PODER/) -|36|[EL SOMBRERO SELECCIONADOR](./Roadmap/36%20-%20EL%20SOMBRERO%20SELECCIONADOR/ejercicio.md)|[🗓️ 09/09/24](https://discord.gg/7A9NDvrb?event=1277739431696138385)||[👥](./Roadmap/36%20-%20EL%20SOMBRERO%20SELECCIONADOR/) +|36|[EL SOMBRERO SELECCIONADOR](./Roadmap/36%20-%20EL%20SOMBRERO%20SELECCIONADOR/ejercicio.md)|[📝](./Roadmap/36%20-%20EL%20SOMBRERO%20SELECCIONADOR/python/mouredev.py)||[👥](./Roadmap/36%20-%20EL%20SOMBRERO%20SELECCIONADOR/) +|37|[OASIS VS LINKIN PARK](./Roadmap/37%20-%20OASIS%20VS%20LINKIN%20PARK/ejercicio.md)|[🗓️ 16/09/24](https://discord.gg/8cxgGTxm?event=1280229634524450877)||[👥](./Roadmap/37%20-%20OASIS%20VS%20LINKIN%20PARK/) ## Cursos en YouTube diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/c/1ceL4nc3.c b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/c/1ceL4nc3.c new file mode 100644 index 0000000000..e404897e1b --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/c/1ceL4nc3.c @@ -0,0 +1,29 @@ +https://www.cprogramming.com + +Types of comments +// // = // comment // +/* */ = /* comment */ + +// constant value = const + type of variable + name of variable // +const int n = 5; + +//Data types // +char character = 'a'; // Single character, 1 byte // +int integer = 9; // Signed integer in base 10, 4 bytes// +float decimal = 1.5; // Floating point number with six digits of precision, 4 bytes // +double decimalDouble = -2456.4452; // Hold about 15 to 16 digits after and before any given decimal point, 8 bytes // +long longinteger = 132344546L; // Signed long integer, 4 bytes // +short shortinteger = 128; // Short signed integer, 2 bytes // +unsigned unsignedinteger = 50; // Unsigned integer in base 10, 4 bytes // +unsigned long unsignedlonginteger = 451345245UL; // Unsigned long long integer, 8 bytes // +unsigned short unsignedshortinteger = 256; // Short unsigned integer, 2 bytes // + +#include // header function + +int main() // main function +{ // indicates the beginning and end of functions and other code blocks // + char l_name = 'C'; // create a variable named l_name and assign it the character C // + + printf("!Hola %c!\n", l_name); // print the string !Hola + variable l_name// // %c indicates that the funtion is printing a character// // \n print another line// + +} diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/queralesDev.java b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/queralesDev.java new file mode 100644 index 0000000000..ae365710f3 --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/java/queralesDev.java @@ -0,0 +1,29 @@ + +public class queralesDev { + public static void main(String[] args) { + /* + https://www.java.com/es/ + */ + + /* + Las diferentes sintaxis para crear comentarios son las siguientes + /* Esto es Comentario de varias lineas + //comentario de una sola linea + ///comentario de una sola linea tambien + */ + + int numeroEntero; + String JAVA = "Soy una constante"; + + byte numero; + int numeroEntero2; + short numeroCorto; + long numeroLargo; + double numeroConComa; + char caracter; + float numeroConComa2; + + System.out.printf("Hola soy java"); + + } +} \ No newline at end of file diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/javascript/Erysnell.js b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/javascript/Erysnell.js new file mode 100644 index 0000000000..5724de5752 --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/javascript/Erysnell.js @@ -0,0 +1,15 @@ +// https://developer.mozilla.org/es/docs/Web/JavaScript + +// comentarios de una sola linea +/*comentarios +de varias lineas*/ + +let variable; +const constante = 5; + +let number = 1; +let string = 'string'; +let boolean = true; +let array = [1,2,3]; + +console.log("Hola Javascript"); \ No newline at end of file diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/Dkp-Dev.py b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/Dkp-Dev.py new file mode 100644 index 0000000000..30eb399d5c --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/Dkp-Dev.py @@ -0,0 +1,28 @@ +# 1.Crea un comentario en el código y coloca la URL del sitio web oficial del lenguaje de programación que has seleccionado. +# Empezamos de cero! + +# https://www.python.org + +""" + Este es + un comentario + en 3 lineas +""" +# 2.Crea una variable (y una constante si el lenguaje lo soporta). +variable = "Mi Variable" +MY_CONSTANT = "Constante" # Esta constante puede mutar, pero al estar en mayusculas, por convencion nadie la deberia de cambiar + +# 3.Crea variables representando todos los tipos de datos primitivos +int_var = 7 +float_var = 2.5 +bool_var = True +bool2_var = False +string_var = "Cadena de texto" +string2_var = 'Cadena de texto con comilla simple' + +# 4.Imprime por terminal el texto: "¡Hola, [y el nombre de tu lenguaje]!" + +YO = "Dkp-Dev!" +PYTHON = "Python!!" + +print("Hola", PYTHON, "soy ",YO) diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/jandortiz.py b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/jandortiz.py new file mode 100644 index 0000000000..c2ffe8b5d2 --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/jandortiz.py @@ -0,0 +1,23 @@ +# Parte 1. +# https://www.python.org/ + +# Parte 2. +# Esto es un primer comentario. + +""" +Otra forma de realizar +comentarios de varias líneas. +""" + +# Parte 3. +mi_primera_variable = 3 +HORAS_DIA = 24 + +# Parte 4. +numero_entero = 54 +numero_decimal = 43.2 +cadena_texto = "Hola mundo" +variable_booleana = True +variable_none = None + +print("¡Hola, Python!") \ No newline at end of file diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/jheisonquiroga.py b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/jheisonquiroga.py new file mode 100644 index 0000000000..7a6a10f2d1 --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/jheisonquiroga.py @@ -0,0 +1,29 @@ +#https://www.python.org/ +#1. Sintaxis de creacion de comentarios +#1.1. Para una sola linea se utilizan los numerales (#) +""" +1.2. Comentar varias lineas: Se utilizan las comillas dobles o simples triples +""" +''' +1.2. Comentar varias lineas: Se utilizan las comillas dobles o simples triples +''' +#2. Crea una variable y una constante si el lenguaje lo soporta +mi_variable = 69 + +#2.1. Costante +PI = 3.1416 + +#3. Tipos de datos + +cadena = "string" #Cadena de texto (str) +numero_entero = 10 # Numero entero (int) +numero_flotante = 3.5 # Numero flotante (float) +booleano = True # Valor booleano (bool) +lista = [1,2,3] # Lista (list) +tupla = (1,2,3) # tupla (tuple) +diccionario = {"clave" : "valor"} #Diccionario (dict) + +nombre_lenguaje = "Python" +print(f"¡Hola, {nombre_lenguaje}!") + + diff --git a/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/jmontoyac.py b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/jmontoyac.py new file mode 100644 index 0000000000..9549398af8 --- /dev/null +++ b/Roadmap/00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO/python/jmontoyac.py @@ -0,0 +1,24 @@ +# https://www.python.org/ + +# Comentario de una linea + +''' +# Comentario multi lineas +# Segunda linea de comentario +''' + +# Variable en Python +primera_variable = 0 + +# Constante en Python +DURACION_MILISEGUNDOS = 300 + +# Tipos de datos primitivos +variable_string_comillas_simples = 'String de comillas simples' +Variable_string_comillas_dobles = "String de comillas dobles" +variable_int = 3600 +variable_float = 5.5 +variable_boolean = True +variable_nula = None + +print("¡Hola Python!") \ No newline at end of file diff --git a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/c++/oixild.cpp b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/c++/oixild.cpp new file mode 100644 index 0000000000..4371e59852 --- /dev/null +++ b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/c++/oixild.cpp @@ -0,0 +1,136 @@ +/* + * EJERCICIO: + * - Crea ejemplos utilizando todos los tipos de operadores de tu lenguaje: + * Aritmticos, lgicos, de comparacin, asignacin, 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. + + * + * Seguro que al revisar detenidamente las posibilidades has descubierto algo nuevo. + */ + + +#include +#include +#include // Para manejo de excepciones + +using namespace std; + +int main() { + // ** Operadores aritmticos ** + int a = 10; + int b = 3; + + cout << "Operadores aritmticos:" << endl; + cout << "Suma: " << a + b << endl; // Suma + cout << "Resta: " << a - b << endl; // Resta + cout << "Multiplicacin: " << a * b << endl; // Multiplicacin + cout << "Divisin: " << a / b << endl; // Divisin + cout << "Mdulo: " << a % b << endl; // Mdulo + cout << "Incremento: " << ++a << endl; // Incremento + cout << "Decremento: " << --b << endl; // Decremento + + // ** Operadores de asignacin ** + cout << "\nOperadores de asignacin:" << endl; + a = 5; + cout << "a = 5 -> " << a << endl; + a += 2; + cout << "a += 2 -> " << a << endl; + a -= 1; + cout << "a -= 1 -> " << a << endl; + a *= 3; + cout << "a *= 3 -> " << a << endl; + a /= 2; + cout << "a /= 2 -> " << a << endl; + a %= 3; + cout << "a %= 3 -> " << a << endl; + + // ** Operadores de comparacin ** + cout << "\nOperadores de comparacin:" << endl; + cout << "a == b: " << (a == b) << endl; // Igualdad + cout << "a != b: " << (a != b) << endl; // Diferente + cout << "a < b: " << (a < b) << endl; // Menor que + cout << "a > b: " << (a > b) << endl; // Mayor que + cout << "a <= b: " << (a <= b) << endl; // Menor o igual que + cout << "a >= b: " << (a >= b) << endl; // Mayor o igual que + + // ** Operadores lgicos ** + cout << "\nOperadores lgicos:" << endl; + bool x = true; + bool y = false; + cout << "x && y: " << (x && y) << endl; // AND lgico + cout << "x || y: " << (x || y) << endl; // OR lgico + cout << "!x: " << !x << endl; // NOT lgico + + // ** Operadores de bits ** + cout << "\nOperadores de bits:" << endl; + int c = 5; // 0101 en binario + int d = 9; // 1001 en binario + cout << "c & d: " << (c & d) << endl; // AND a nivel de bits + cout << "c | d: " << (c | d) << endl; // OR a nivel de bits + cout << "c ^ d: " << (c ^ d) << endl; // XOR a nivel de bits + cout << "~c: " << ~c << endl; // NOT a nivel de bits + cout << "c << 1: " << (c << 1) << endl; // Desplazamiento a la izquierda + cout << "c >> 1: " << (c >> 1) << endl; // Desplazamiento a la derecha + + // ** Estructuras de control: Condicionales ** + cout << "\nEstructuras de control - Condicionales:" << endl; + if (a > b) { + cout << "a es mayor que b" << endl; + } + else { + cout << "a no es mayor que b" << endl; + } + + // ** Estructuras de control: Iterativas ** + cout << "\nEstructuras de control - Iterativas:" << endl; + cout << "Bucle for:" << endl; + for (int i = 0; i < 3; i++) { + cout << "i = " << i << endl; + } + + cout << "Bucle while:" << endl; + int i = 0; + while (i < 3) { + cout << "i = " << i << endl; + i++; + } + + cout << "Bucle do-while:" << endl; + i = 0; + do { + cout << "i = " << i << endl; + i++; + } while (i < 3); + + // ** Estructuras de control: Manejo de excepciones ** + cout << "\nEstructuras de control - Excepciones:" << endl; + try { + int divisor = 0; + if (divisor == 0) { + throw runtime_error("Error: Divisin entre cero"); + } + int resultado = 10 / divisor; + cout << "Resultado: " << resultado << endl; + } + catch (const exception& e) { + cout << e.what() << endl; + } + + // ** Dificultad Extra ** + cout << "\nDificultad Extra:" << endl; + + int num = 10; + while (num <= 55) { + if (num % 2 == 0 && num % 3 != 0 && num % 16 != 0) { + cout << num << " " << endl; + num++; + } + num++; + } + return 0; +} diff --git a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/duendeintemporal.js b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/duendeintemporal.js new file mode 100644 index 0000000000..5e4194c903 --- /dev/null +++ b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/javascript/duendeintemporal.js @@ -0,0 +1,675 @@ +/* { RETOS DE PROGRAMACIÓN } #1 OPERADORES Y ESTRUCTURAS DE CONTROL */ +//Note: I use Matt Frisbie book "Professional JavaScript for Web Developers" as a reference to give accurate additional information about the use of some operantors +//I also serch some tips in JavaScript Notes for Professionals from the beautiful people of StackOverflow. You can get it for free in GoalKicker.com + +//short for console.log +let log = console.log.bind(console); + +/* OPERATORS */ +//Unary Operators + + //Unary Plus and Minus +/* When the unary plus is applied to a nonnumeric value, it performs the same conversion as the +Number() casting function: the Boolean values of false and true are converted to 0 and 1, string +values are parsed according to a set of specific rules, and objects have their valueOf() and/or +toString() method called to get a value to convert. */ + + let str1 = "03"; + str1 = +str1; + log(str1) // value becomes numeric 3 + + let str2 = "1.4"; + log(str1 + +str2)// 4.4 + + str2 = +str2; + log(str2) // value becomes numeric 1.4 + + let str3 = "zaz"; + str3 = +str3; + log(str3) // value becomes NaN + + let bool = true; + bool = +bool; + log(bool) // value becomes numeric 1 + + let f_num = 2.8; + f_num = +f_num; + log(f_num) // no change, still 2.8 + + let obj = { + valueOf() { + return -5; + } + }; + obj = +obj; + log(obj) // value becomes numeric -5 + +/* The unary minus operator’s primary use is to negate a numeric value, such as converting 1 into –1. The simple case is illustrated here: */ + + let g_actions=50; + g_actions= -g_actions; + log(g_actions) // value becomes -50 + +/* When used on a numeric value, the unary minus simply negates the value. When used on non numeric values, unary minus applies all of the same rules as unary plus and then negates the result */ + + str1 = -str1; + log(str1) // value becomes numeric -3 + + str2 = -str2; + log(str2) // value becomes numeric -1.4 + + str3 = -str3; + log(str3) // value becomes NaN + + bool = -bool; + log(bool) // value becomes numeric -1 + + f_num = -f_num; + log(f_num) // no change, still -2.8 + + obj = -obj; + log(obj) // value becomes numeric 5 + + + //Increment/Decrement ++ -- + let num1 = 10, num2 = 5, num3, num4; + num3 = num1++; + log(num3); // 10 + log(num1); // 11 + num3 = ++num1; + log(num3); // 12 + log(num1); // 12 + num4 = num2--; + log(num4); // 5 + log(num2); // 4 + num4 = --num2; + log(num4); // 3 + log(num2); // 3 + num4++; + log(num4); // 4 + + + //Bitwise Operators +/* The next set of operators works with numbers at their very base level, with the bits that represent them in memory. +When you apply bitwise operators to numbers in ECMAScript, a conversion takes place behind the scenes: the 64-bit number is converted into a 32-bit number, the operation is performed, and then the 32-bit result is stored back into a 64-bit number. */ + +//Bitwise NOT ~ +//The bitwise NOT is represented by a tilde (~) and simply returns the one’s complement of the number. +let n1 = 25; // binary 00000000000000000000000000011001 +let n2 = ~n1; // binary 11111111111111111111111111100110 +log(n2); // -26 it negates the number and subtracts 1 +//same to say +n2 = -n1 -1; +//but bitwise operation performs faster cause it works at the lowest lavel of numeric representation. + +//Bitwise AND & +//A bitwise AND operation returns 1 if both bits are 1. It returns 0 if any bits are 0. + +let n3 = 25 & 3; +log(n3) /* logs: 1 cause the comparation of both binary codes is : + 25 = 0000 0000 0000 0000 0000 0000 0001 1001 + 3 = 0000 0000 0000 0000 0000 0000 0000 0011 + --------------------------------------------- + AND = 0000 0000 0000 0000 0000 0000 0000 0001 */ + +//Bitwise OR | +//A bitwise OR operation returns 1 if at least one bit is 1. It returns 0 only if both bits are 0. + +n3 = 25 | 3; +log(n3) /* Logs: 27 cause the comparation of both binary codes is : + 25 = 0000 0000 0000 0000 0000 0000 0001 1001 + 3 = 0000 0000 0000 0000 0000 0000 0000 0011 + --------------------------------------------- + OR = 0000 0000 0000 0000 0000 0000 0001 1011 */ + +//Bitwise XOR +//Bitwise XOR is different from bitwise OR in that it returns 1 only when exactly one bit has a value of 1 (if both bits contain 1, it returns 0). + +n3 = 25 ^ 3; +log(n3); /* Logs: 26 cause the comparation of both binary codes is : + 25 = 0000 0000 0000 0000 0000 0000 0001 1001 + 3 = 0000 0000 0000 0000 0000 0000 0000 0011 + --------------------------------------------- + XOR = 0000 0000 0000 0000 0000 0000 0001 1010 */ + +//Left Shift +//The left shift is represented by two less-than signs (<<) and shifts all bits in a number to the left by the number of positions given + +let number = 2; // 10 in binary code +let new_number = number << 6; // 10000000 in binary code wich is decimal 128 +log(new_number)// 128 + +/* |1| |0| |0| |0| |0| |0| |0| |0| +(2^7x1) + (2^6x0) + (2^5x0) + (2^4x0) + (2^3x0) + (2^2x0) + (2^1x0) + (2^0x0) //here ^ is a powder + 128 + 0 + 0 + 0 + 0 + 0 + 0 + 0 = 128 */ + +//Signed Right Shift +//The signed right shift is represented by two greater-than signs (>>) and shifts all bits in a 32-bitnumber to the right while preserving the sign (positive or negative). + +number = 128; // 10000000 in binary code +new_number = number >> 6 // 10 in binary code wich is decimal 2 +log(new_number)// 2 + + +//Unsigned Right Shift +/* The unsigned right shift is represented by three greater-than signs (>>>) and shifts all bits in a 32-bit number to the right. For numbers that are positive, the effect is the same as a signed right shift. For negative numbers unlike signed right shift, the empty bits get filled with zeros regardless of the sign of the number.*/ + +number = -64; // equal to binary 11111111111111111111111111000000 +new_number = number >>> 5; // equal to decimal 134217726 +log(new_number)// 134217726 +/* because the unsigned right shift treats this as a positive number, it considers the value to be +4294967232. When this value is shifted to the right by five bits, it becomes 00000111111111111111 +111111111110, which is 134217726. */ + + +/* Boolean operators */ +//Logical NOT ! +//can be used in any value. This operator always returns a Boolean value, regardless of the data type it’s used on. The logical NOT operator first converts the operand to a Boolean value and then negates it, + +log(!false); // true +log(!"shadow"); // false +log(!0); // true +log(!NaN); // true +log(!""); // true +log(!57344); // false +log(!null) // true +log(!undefined) // true + +//it can be used to transform a value into it's boolean equivalent by using two NOT operators in a row + +let name = 'Angy'; +//name = !!name; +//log(name); // Logs: true + +//Note: see that the first negate the value after covert it, the second just convert it to boolean. + +//Logical ADN && +//it operates over two values and return true if both values are true, false otherwise +log(true && name)// Angy +log(false && 'Angy')// false +log(4 < 5 && 8 >6)// true +/* Logical AND can be used with any type of operand, not just Boolean values. When either operand is +not a primitive Boolean, logical AND does not always return a Boolean value; instead, it does one of the following: +➤➤ If the first operand is an object, then the second operand is always returned. +➤➤ If the second operand is an object, then the object is returned only if the first operand evalu- +ates to true. +➤➤ If both operands are objects, then the second operand is returned. +➤➤ If either operand is null, then null is returned. +➤➤ If either operand is NaN, then NaN is returned. +➤➤ If either operand is undefined, then undefined is returned. */ + + + +//Logical OR || +//it operates over two values and return true if both or one of both values are true, false other wise +let empty = ''; +log(false || empty)// Logs: +log(name || empty)// Angy +log(4 >= 5 || 8 >6)// true + +/* Just like logical AND, if either operand is not a Boolean, logical OR will not always return a Boolean value; instead, it does one of the following: +➤➤ If the first operand is an object, then the first operand is returned. +➤➤ If the first operand evaluates to false, then the second operand is returned. +➤➤ If both operands are objects, then the first operand is returned. +➤➤ If both operands are null, then null is returned. +➤➤ If both operands are NaN, then NaN is returned. +➤➤ If both operands are undefined, then undefined is returned. */ + +//Note: Both AND and OR are short-circuit operants, this means sometimes only the first operator is evaluated + +//Multiplicative Operators +/* There are three multiplicative operators in ECMAScript: multiply, divide, and modulus. These operators work in a manner similar to their counterparts in languages such as Java, C, and Perl, but they also include some automatic type conversions when dealing with nonnumeric values. */ + +//Multiple Operator * +number = 4 * '8'; +log(number)// Logs: 32 cause the above explanation + +//Divide Operator / +number = 10 / 5; +log(number)// Logs: 2 +number = 4 / 40; +log(number)// Logs: 0.1 + +//Modulus (remainder) Operator % +number = 41 % 5; +log(number)// Logs: 1 + +//Exponentiation Operator ** +number = 4 ** 2; +log(number)// Logs: 16 +//same as +log(Math.pow(4,2))// 16 + +//Add Operator + +number = 76 + 78; +log(number)// 154 +log('76' + '78')// 7678 on strings performs as a concatenator + +number = BigInt(767867686876876) + BigInt(6757575755); +log(number)// 767874444452631n + +//Subtract - +number = 48 - 3; +log(number)// 45 + +//Note: These operators has a particulary behavior in some cases when are used with Infinity, 0, NaN or a non numeric values, you should search if you want more information. + + +/* Relatioanl Operators */ +/* The less-than (<), greater-than (>), less-than-or-equal-to (<=), and greater-than-or-equal-to (>=) relational operators perform comparisons between values in the same way that you learned in math class. */ +let computation = 76 < 4; +log(computation)// false +computation = 87 > 32; +log(computation)// true +computation = 43 <= 43; +log(computation)// true +computation = 44 >= 85; +log(computation)// false + +let user ={ + name: 'Clavin & Hobbes' +} + +log(user <= 4)// false + +log("43" < "8")// true +log("43" < 8)// false + +log('DeepState' < 'real people')// true not only cause are more real people, but when we talk about strings the upper characters has lower codes than the regulars ones +console.log('DeepState'.toLowerCase() < 'real people'.toLocaleLowerCase())// true again ... well ummm sometimes we win + +/* As with other operators in ECMAScript, there are some conversions and other oddities that happen +when using different data types. They are as follows: +➤➤ If the operands are numbers, perform a numeric comparison. +➤➤ If the operands are strings, compare the character codes of each corresponding character in +the string. +➤➤ If one operand is a number, convert the other operand to a number and perform a numeric +comparison. +➤➤ If an operand is an object, call valueOf() and use its result to perform the comparison +according to the previous rules. If valueOf() is not available, call toString() and use that +value according to the previous rules. +➤➤ If an operand is a Boolean, convert it to a number and perform the comparison */ + +//Equality operators +//Determining whether two variables are equivalent is one of the most important operations in programming. + +//equal or Equality Operator == +log(2 == '2')// true +//deep comparation, also comapare types. identically equal or Strict Equality Operator === +log(2 === '2')// false +//not-equal or Inequality Operator != +log(2 != '2')// false +//deep comparation, also compare types. identically not-equal or Strict Inequality Operator !== +log(2 !== '2')// true + +/* When performing conversions, the equal and not-equal operators follow these basic rules: +➤➤ If an operand is a Boolean value, convert it into a numeric value before checking for +equality. A value of false converts to 0, whereas a value of true converts to 1. +➤➤ If one operand is a string and the other is a number, attempt to convert the string into a +number before checking for equality. +➤➤ If one of the operands is an object and the other is not, the valueOf() method is called on +the object to retrieve a primitive value to compare according to the previous rules. + +The operators also follow these rules when making comparisons: +➤➤ Values of null and undefined are equal. +➤➤ Values of null and undefined cannot be converted into any other values for +equality checking. +➤➤ If either operand is NaN, the equal operator returns false and the not-equal operator +returns true. Important note: even if both operands are NaN, the equal operator returns +false because, by rule, NaN is not equal to NaN. +➤➤ If both operands are objects, then they are compared to see if they are the same object. If +both operands point to the same object, then the equal operator returns true. Otherwise, +the two are not equal. */ + +log(NaN != NaN)// true +log(true == 1)// true +log(null==undefined)// true +log(null===undefined)// false + +//Conditional Operator (condition)? true : false; +/* This basically allows a conditional assignment to a variable depending on the evaluation of the +boolean_expression. If it’s true, then true_value is assigned to the variable; if it’s false, then +false_value is assigned to the variabl */ + + +let login = (user.name == 'Nixon')? `Succesfull login, Wellcome ${user.name}` : "Sorry we don't have any user with that name"; +log(login)// Sorry we don't have any user with that name + +//Assignment Operators + +let a = 'a'; +a = a + a; +log(a)// aa + +number = 8; + +/* Compound assignment is done with one of the multiplicative, additive, or bitwise–shift operators +followed by an equal sign (=). These assignments are designed as shorthand for such common situa- +tions as: */ + +number *= number; +log(number)// 64 + +number -= 4; +log(number)// 60 + +/* Compound-assignment operators exist for each of the major mathematical operations and a few +others as well. They are as follows: +➤➤ Multiply/assign (*=) +➤➤ Divide/assign (/=) +➤➤ Modulus/assign (%=) +➤➤ Add/assign (+=) +➤➤ Subtract/assign (-=) +➤➤ Left shift/assign (<<=) +➤➤ Signed right shift/assign (>>=) +➤➤ Unsigned right shift/assign (>>>=) +These operators are designed specifically as shorthand ways of achieving operations. They do not +represent any performance improvement. */ + +// Membership Operators +// the in operator +let Crows = { + description: "Mutant fat man lives beyond the margins of the known universe...", + age: 600, +} + +log('description' in Crows)// true +log('location' in Crows)// false + +// instanceof operator + +class User { + constructor(name, age, email) { + this.name = name; + this.age = age; + this.email = email; + } + + greeting() { + return `Hi ${this.name}. Wellcome to Roadmap Exercise #01.`; + } +} + +const niko_zen = new User('Niko', 41, 'duendeintemporal@hotmail.com'); +log(niko_zen.greeting())// 'Hi Niko. Wellcome to Roadmap Exercise #01'; + +log(niko_zen instanceof User) // true +log(niko_zen instanceof Object) // true +log(4 instanceof Number) // false cause 4 is a primitive value +let four = new Number(4) +log( four instanceof Number)// true + +// Type Operators +// we can use instanceof or typeof +log(typeof true)// boolean +log(typeof NaN)// number +log(typeof niko_zen)// object + +//Destructuring Operatorations spread operator ... +// on arrays +let books = ['Dune', 'Shibumi', 'El Maestro de Esgrima', 'El Perfume']; +let books2 = ['Elocuent javascript', 'You Don’t Know JS ES6 Beyond', 'Linux Command Line An Admin Beginners Guide', 'Learn Bash the Hard Way', 'Programming Algorithms', 'MATLAB Notes for Professionals'] +const mix_books = [...books, ...books2]; +const [frank_herbert, trevanian] = books; +log(trevanian)//Logs: Shibumi + +// on objects +const { email } = niko_zen; +log(email)// duendeintemporal@hotmail.com + +const niko_zen_settings ={ + mode: 'dark', + avatar: 'moebius.svg', + interfaz: 'compact', +} + +const niko_zen_data = { ...niko_zen, ...niko_zen_settings }; +log(niko_zen_data)//Logs both objects niko_zen instance and niko_zen_settings + +function showUser({name, age, email}){ + log(`User name: ${name}, age: ${age}, email: ${email}`); +} + +showUser(niko_zen)// Logs: User name: Niko, age: 41, email: duendeintemporal@hotmail.com + +// we can also asign default values in destructuring + +const config = { font: 'monospace' }; +const { font, mode = 'dark' } = config; + +log(font, mode)// monospace dark + +//you can use destructuring for exchange values on two or more variables +let ninja1 = 'Hiroshi'; +let ninja2 = 'Neko'; +let ninja3 = 'Kage'; + +[ninja1, ninja2, ninja3] = [ninja2, ninja3, ninja1]; +log(ninja1)// Neko + +// you can copy objects or arrays without modifing the original +const shinobi = { + skills: ['fast', 'quick', 'precise', 'lethal', 'computational thinking'], + location: 'no found', +} + +const trix = { ...shinobi }; +trix.location = 'Bangkok, Thailand'; + +log(shinobi.location)// no found +log(trix.location)// Bangkok, Thailand + +// you can also use spread operator to pass array elements as arguments in functions or methods +nums = [1,3,4,5,6,] +log(Math.max(...nums))// logs: 6 + +// or to create an array of arguments +const calculateAverage = (...numbers)=> { + const total = numbers.reduce((sum, num) => sum + num, 0); + return total / numbers.length; +} + +// see that when we call the function all the arguments get holded in numbers +const average = calculateAverage(90, 76, 45, 23, 67); +console.log(average); // 60.2 + +// you can also use it to convert a string into an array of its individual characters + +let maximum = 'in a society that has abolish every kind of adventure, the only adventure that remains is abolish the society' + +let maxim_arr = [...maximum]; +log(maxim_arr)// [ "i", "n", " ", "a", " ", "s", "o", "c", "i", "e", … ] + +//Comma Operator +//The comma operator allows execution of more than one operation in a single statement, as illustrated here: + +let number1 = 1, number2 = 2, number3 = 3, number4; +log(number1, number2, number3, number4)// 1 2 3 undefined + +/*Most often, the comma operator is used in the declaration of variables; however, it can also be used to assign values. When used in this way, the comma operator always returns the last item in the +expression, as in the following example: */ +number = (225, 14, 40, 8, 220); // num becomes 220 +log(number)// 220 +/*There aren’t many times when commas are used in this way; however, it is helpful to understand that this behavior exists. */ + +//Flow Control Statements +//the if statement +if(number){ + number+=4; + log(number)// 224 +} + +//the else statement +if(number){ + number+=4; + log(number)// 228 +}else{ + // what ever +} + +//the else if statement +if(number > 300){ + number+=4; + log(number) +}else if(number > 200){ + number+=4; + log(number)// Logs: 232 +} +else{ + //do something +} + +// the do-while statement +/* The do-while statement is a post-test loop, meaning that the escape condition is evaluated only after the code inside the loop has been executed. */ +let count = 0; +do { + log("I'm learning a lot in this roadmap for coders, even with these basic exercises") + count++; +} while (count < 1); + +// the while statement +//while(true){ + //do something + //create an infinite loop cause always evaluate to true +//} + +// the for statement +number = 0; +for(let i = 1; i <= 100; i++){ + number += i; +} +log(number)// Logs: 5050 + +//Nothing can be done with a for loop that can’t be done using a while loop. The for loop simply encapsulates the loop-related code into a single location. + +// the for-in statement +// let us iterate over the properties of object elements +let user2 = { + name: 'Nikita', + age: 32, + location: 'No Found', +} + +for(let data in user2){ + log(data) // logs only the property + log(data, user2[data]) // logs the property and the value + log(data, eval('user2.' + data)) // the same as before +} + +/* Object properties in ECMAScript are unordered, so the order in which property names are returned +in a for-in statement cannot necessarily be predicted. All enumerable properties will be returned +once, but the order may differ across browsers. */ + +// the for-of statement +// is thinked to iterate over array elements +let oddNums = [1,3,5,7,9] + +for(let num of oddNums){ + log(num)// logs each num +} + +/* we can use Object.entries(), Object.keys(), Object.values() to iterate over object f. e. + +Object.entries(user2) result in: + [ + [ "name", "Nikita" ] + [ "age", 32 ] + [ "location", "No Found" ] + ] */ +// so we can just +for(let [key, val] of Object.entries(user2)){ + log(`${key}: ${val}`); +} + +// Label statements +outer_loop:for(let i = 0; i <= 10; i++){ + inner_loop:for(let y = 0; y < 5; y++){ + if((i==2) && (y == 4)) break outer_loop; + if(y==3) break inner_loop; + log('Is there anybody outthere?') + } +} + +// break and continue statements +/* The break and continue statements provide stricter control over the execution of code in a loop. +The break statement exits the loop immediately, forcing execution to continue with the next state- +ment after the loop. The continue statement, on the other hand, exits the loop immediately, but +execution continues from the top of the loop. Here’s an example: */ +number = 0; +while(number < 5){ + if(number == 3) break; + log(number); + number++; +}// Logs: number value three times: 0 1 2 + +number = 0; +while(number < 5){ + if(number == 3){ + number++; + continue; + } + log(number); + number++; +}// Logs: number value four times: 0 1 2 4 + +//The with Statement + +/* The with statement was created as a convenience for times when a single object was being coded to over and over again, as in this example: + +let qs = location.search.substring(1); +let hostName = location.hostname; +let url = location.href; + +Here, the location object is used on every line. This code can be rewritten using the with statement +as follows: + +with(location) { +let qs = search.substring(1); +let hostName = hostname; +let url = href; +} */ + +//example +with(user){ + log(name)// Clavin & Hobbes +// log(age)// thow an error cause age is undefined +} + +//Note: the with statement is generally discouraged in modern JavaScript because it can lead to code that is difficult to read and maintain, and it can also cause performance issues. + +// The Switch Statement + +switch(user.name){ + case 'Nikita': + log('Wellcome agent'); + break; + case 'Calvin &' + 'Hobbes': + log('Bring me some cookies'); + break; + default: + log('Turn off that TV'); //log this cause is missing and space in the second case +} + +//we can also use an expression that evaluates a string concatenation in a case. The ability to have case expressions also allows you to do things like this: +/* +let num = 25; +switch (true) { + case num < 0: + console.log("Less than 0."); + break; + case num >= 0 && num <= 10: + console.log("Between 0 and 10."); + break; + case num > 10 && num <= 20: + console.log("Between 10 and 20."); + break; + default: + console.log("More than 20."); +} */ + +// Extra dificulty: Create a program that prints the even numbers from 10 to 55 inclusive and avoids printing the numbers if they are equal to 16 or multiples of 3 + +for(let i = 10; i <= 55; i++ ){ + if(i % 3 == 0 || i == 16) continue; + if(i % 2 == 0) log(i); +} \ No newline at end of file diff --git a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/kotlin/Clotrack.kt b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/kotlin/Clotrack.kt new file mode 100644 index 0000000000..fb3e89d3e1 --- /dev/null +++ b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/kotlin/Clotrack.kt @@ -0,0 +1,121 @@ +// 01 OPERADORES Y ESTRUCTURAS DE CONTROL + // EJERCICIO: + /* 01-01 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) + */ + // Inicializo unas variables random para trabajar con ellas, para todos los ejercicios + var myOperator1 = 5 + var myOperator2 = 3 + var myProveOperator = 0 + var i = 0 + var myBooleanTrue = true + var myBooleanFalse = false + var rangeAlfabet = 'a'..'d' + var myCahr = 'b' + + // En kotlin tenemos 5 tipos de operadores aritmeticos [+] [-] [*] [/] [%] a continuacion unos ejemplos variados + myProveOperator = myOperator1 + myOperator2 ++ + println(myProveOperator) + myProveOperator = myOperator1 -- + println(myProveOperator) + println(myOperator1 * 9) + println((myProveOperator * myOperator1) / myOperator2) + if(myProveOperator % 2 == 0) { + println("El numero " + myProveOperator + " es par") + } + // En kotlin tenemos cuatro operadores logicos [|] = OR [&] = AND [.xor()] = XOR y Desigualdad [!] y a continuacion unos ejemplos + println("${myBooleanTrue || myBooleanFalse} \n${myBooleanTrue && myBooleanFalse} \n${myBooleanFalse.xor(myBooleanTrue)} \n${!myBooleanTrue}") + + // En Kotlin tenemos diferentes comparadores [>] mayor [<] menor y [=] que podemos jugar con ellos y mezclarlos con igualdad [>=] + if(myOperator1 > 20){ + println("El numero $myOperator1 es mayor que 20") + } else if(myOperator1 < 20){ + println("El numero $myOperator1 es menor que 20") + } else { + println("El numero $myOperator1 es igual a 20") + } + + // No podemos olvidarnos de los comparadores [==] de igualdad o el de [!=] diferencia + if(myOperator1 == myProveOperator){ + println("Te va a tocar la loteria") + } else if(myOperator1 != myProveOperator){ + println("No hay suerte colega, asi es la vida") + } else { + println("Esto no tendria que pasar colega!") + } + + //Ya por ultimo y para mi sorpresa se pueden utilizar comparaciones como [a..d] o [1..4] + if (myCahr in rangeAlfabet){ // este tipo de comparador [a..d] se debe usar dentro de una variable + println("El caracter $myCahr esta dentro del rango entre a y d") + } else{ + println("El caracter $myCahr esta fuera del rango entre a y d") + } + + if (myOperator2 !in 1..4){ + println("El numero $myOperator2 esta dentro del rango entre 1 y 4") + } else{ + println("El numero $myOperator2 esta fuera de rango entre el 1 y el 4") + } + + /* 01-02 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... + */ + // Me cae tanta gracia que dejadme repetir este ejemplo condicional de 'if, else if y else' ;) + if(myOperator1 == myProveOperator){ + println("Te va a tocar la loteria") + } else if(myOperator1 != myProveOperator){ + println("No hay suerte colega, asi es la vida") + } else { + println("Esto no tendria que pasar colega!") + } + + // No es el unico condicional tambien tenemos 'when' es en apariencia identico a un swithc + when (myProveOperator){ + myOperator1 -> println("Los espiritus estan de tu lado hoy") + myOperator2 -> println("Ten cuidado al salir dedida, ponte crema solar o arderas como un misto") + else -> { + println("Ten cuidado esta noche al salir con la luna llena") + } + } + + // Comencemos con los bucles en este caso con el 'while' quiero aclarar un concepto la condicion de cierre del + // bucle es hacer mientras la condicion se cumpla! en el ejemplo mientras myProbeOperator sea menor que 10 + while (myProveOperator < 10){ + println("El valor del operador de prueba es $myProveOperator ") + myProveOperator ++ + } + + //Sigamos con el bucle 'do-while que en este caso si o si almenos una vez debe ejecutarse el do manejar con cuidado! + do{ + println("Numero de veces que declare mi amor y me rompieron el corazon en mil trocitos $myProveOperator") + myProveOperator ++ + } while (myProveOperator < myOperator2) + + // Ya para finalizar el marabilloso y explendido bucle 'for' aclarar que la diferencia esque la condicion de + // cierre de este bucle es hacer asta que se cumpla la condicion! + for (myProveOperator in 5 downTo 1){ + println("Doy vuelta y vueltas sin parar, que mareo! Ya ne se cuanto tiempo llevo aqui!") + } + + // Ahora que tenemos la variable myProbeOperator en 0 y viendo lo extraño que es declarar 'for' en kotlin + // quiero imprimir una tabla de multiplicar del 5 ;) sin operaciones dentro del 'for' directamente en su condicion + // debo aclarar que no he podido crear las tipicas variables dentro del bucle como [i, j o k] sino fuera del bucle :( + for (myProveOperator in 0..50 step 5){ + println("$i x 5 = $myProveOperator") + i ++ + } + // 01-03 Debes hacer print por consola del resultado de todos los ejemplos. + // Todos los ejemplos/resultados anteriores ya han sido impresos por consola anteriormente!! + + /* 01-04 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. + */ + i = 10 + for (i in 10..55) { + if (i % 2 == 0 && i != 16 && i % 3 != 0){ + println(i) + } + } \ No newline at end of file diff --git a/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/python/jmontoyac.py b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/python/jmontoyac.py new file mode 100644 index 0000000000..9442249238 --- /dev/null +++ b/Roadmap/01 - OPERADORES Y ESTRUCTURAS DE CONTROL/python/jmontoyac.py @@ -0,0 +1,69 @@ +# Ejemplo de operadores aritmeticos + +a = 5 +b = 2 + +print(f'Valor de variable a: {a}') +print(f'Valor de variable b: {b}') + +print(f'a + b: {a+b}') +print(f'a - b: {a-b}') +print(f'a * b: {a*b}') +print(f'a / b: {a/b}') +print(f'a % b: {a%b}') + +# Ejemplo de operadores logicos + +# Operador and +print('## Operador and ##') +print(f'True and True: {True and True}') +print(f'True and False: {True and False}') +print(f'False and True: {False and True}') +print(f'False and False: {False and False}') + +# Operador or +print('## Operador or ##') +print(f'True or True: {True or True}') +print(f'True or False: {True or False}') +print(f'False or True: {False or True}') +print(f'False or False: {False or False}') + +# Operador not +print('## Operador not ##') +print(f'not True: {not True}') +print(f'not False: {not False}') + +# Operadores de comparacion + +print('## Operadores de comparacion ##') +print(f'{a} == {b}: {a==b}') +print(f'{a} != {b}: {a!=b}') +print(f'{a} < {b}: {a {b}: {a>b}') +print(f'{a} <= {b}: {a<=b}') +print(f'{a} >= {b}: {a>=b}') + +# Operadores de asignacion + +print('## Operadores de asignacion ##') +x = "Hola" +y = 256 +z = 128 +print(f'x = "Hola", valor de variable x: {x}') +print(f'y = 265, valor de variable y: {y}') +y += z +print(f'y += z, resultado: {y}') +y -= z +print(f'y -= z, resultado: {y}') +y *= z +print(f'y *= z, resultado: {y}') +y /= z +print(f'y /= z, resultado: {y}') +y %= z +print(f'y %= z, resultado: {y}') +y = 2 +z = 6 +y **= z +print(f'y **= z, resultado: {y}') +y //= z +print(f'y //= z, resultado: {y}') \ No newline at end of file diff --git a/Roadmap/02 - FUNCIONES Y ALCANCE/bash/drvito1977.sh b/Roadmap/02 - FUNCIONES Y ALCANCE/bash/drvito1977.sh new file mode 100644 index 0000000000..d43bb57587 --- /dev/null +++ b/Roadmap/02 - FUNCIONES Y ALCANCE/bash/drvito1977.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# Esta línea indica que el script debe ser interpretado por Bash + +# Función sin parámetros ni retorno +function sin_parametros_ni_retorno { + # Imprime un mensaje indicando que esta función no tiene parámetros ni retorno + echo "Función sin parámetros ni retorno" +} + +# Función con un parámetro +function con_un_parametro { + # $1 es el primer parámetro pasado a la función + echo "Función con un parámetro: $1" +} + +# Función con varios parámetros +function con_varios_parametros { + # $1, $2, y $3 son los primeros tres parámetros pasados a la función + echo "Función con varios parámetros: $1, $2, $3" +} + +# Llamada a la función sin parámetros ni retorno +sin_parametros_ni_retorno + +# Llamada a la función con un parámetro +con_un_parametro "Hola" + +# Llamada a la función con varios parámetros +con_varios_parametros "Uno" "Dos" "Tres" + +# Definición de la función 'fa' anidada +function fa { + # Imprime un mensaje indicando que se está llamando a la función 'fa' + echo "Llamando a la función anidada, fa" + + # Definición de la función interna 'fu' dentro de 'fa' + function fu { + # Imprime un mensaje indicando que se está llamando a la función 'fu' + echo "Llamando a la función interna, fu" + } + + # Llama a la función interna 'fu' dentro de la función 'fa' + fu +} + +# Llama a la función 'fa' +fa + +# Calcula el factorial de 'n' usando un bucle while +function factorial { + local n=$1 + local result=1 + while [ $n -gt 1 ]; do + result=$((result * n)) + ((n--)) + done + # Devuelve el resultado del factorial + echo $result +} +factorial 5 # Llama a la función 'factorial' con el argumento 5 + +# Función que recibe dos parámetros de tipo cadena de texto y retorna un número +function imprimir_numeros { + local cadena1=$1 + local cadena2=$2 + local contador=0 + + for ((i=1; i<=100; i++)); do + if ((i % 3 == 0 && i % 5 == 0)); then + echo "${cadena1}${cadena2}" + elif ((i % 3 == 0)); then + echo "$cadena1" + elif ((i % 5 == 0)); then + echo "$cadena2" + else + echo "$i" + ((contador++)) + fi + done + + # Retorna el número de veces que se ha impreso el número en lugar de los textos + return $contador +} + +# Llamada a la función 'imprimir_numeros' con los parámetros "Fizz" y "Buzz" +imprimir_numeros "Fizz" "Buzz" +# Captura el valor de retorno de la función +contador=$? +echo "El número de veces que se ha impreso el número en lugar de los textos es: $contador" + diff --git a/Roadmap/03 - ESTRUCTURAS DE DATOS/bash/drvito1977.sh b/Roadmap/03 - ESTRUCTURAS DE DATOS/bash/drvito1977.sh new file mode 100644 index 0000000000..8fffd9d060 --- /dev/null +++ b/Roadmap/03 - ESTRUCTURAS DE DATOS/bash/drvito1977.sh @@ -0,0 +1,186 @@ +#!/bin/bash + +# Ejemplos de estructuras en Bash + +# Arrays +# Definición de un array con elementos iniciales +array=(1 2 3 4 5) +# Imprimir todos los elementos del array +echo "Array original: ${array[@]}" +# Añadir un nuevo elemento al final del array +array+=(6) # Inserción +# Imprimir el array después de la inserción +echo "Array después de inserción: ${array[@]}" +# Eliminar el tercer elemento del array (índice 2) +unset array[2] # Borrado +# Imprimir el array después del borrado +echo "Array después de borrado: ${array[@]}" +# Actualizar el segundo elemento del array (índice 1) a 10 +array[1]=10 # Actualización +# Imprimir el array después de la actualización +echo "Array después de actualización: ${array[@]}" +# Ordenar el array y guardarlo en una nueva variable +sorted_array=($(for i in "${array[@]}"; do echo $i; done | sort)) # Ordenación +# Imprimir el array ordenado +echo "Array ordenado: ${sorted_array[@]}" + +# Arrays asociativos +# Declarar un array asociativo +declare -A assoc_array +# Inicializar el array asociativo con pares clave-valor +assoc_array=([key1]=value1 [key2]=value2) +# Imprimir todos los valores del array asociativo +echo "Array asociativo original: ${assoc_array[@]}" +# Añadir un nuevo par clave-valor al array asociativo +assoc_array[key3]=value3 # Inserción +# Imprimir el array asociativo después de la inserción +echo "Array asociativo después de inserción: ${assoc_array[@]}" +# Eliminar un par clave-valor del array asociativo usando la clave +unset assoc_array[key1] # Borrado +# Imprimir el array asociativo después del borrado +echo "Array asociativo después de borrado: ${assoc_array[@]}" +# Actualizar el valor asociado a una clave existente +assoc_array[key2]=new_value # Actualización +# Imprimir el array asociativo después de la actualización +echo "Array asociativo después de actualización: ${assoc_array[@]}" + +# Strings (cadenas de texto) +# Definir una cadena de texto +string="Hola Mundo" +# Imprimir la cadena original +echo "String original: $string" +# Añadir un carácter al final de la cadena +string+="!" # Inserción +# Imprimir la cadena después de la inserción +echo "String después de inserción: $string" +# Eliminar parte de la cadena (mantener solo los primeros 4 caracteres) +string=${string:0:4} # Borrado +# Imprimir la cadena después del borrado +echo "String después de borrado: $string" +# Actualizar la cadena completa +string="Hola Bash" # Actualización +# Imprimir la cadena después de la actualización +echo "String después de actualización: $string" + +# Numbers (números) +# Definir un número +num=5 +# Imprimir el número original +echo "Número original: $num" +# Incrementar el número en 5 +((num+=5)) # Inserción (suma) +# Imprimir el número después de la inserción +echo "Número después de inserción: $num" +# Decrementar el número en 3 +((num-=3)) # Borrado (resta) +# Imprimir el número después del borrado +echo "Número después de borrado: $num" +# Actualizar el número a 10 +num=10 # Actualización +# Imprimir el número después de la actualización +echo "Número después de actualización: $num" + +# Agenda de contactos +declare -A agenda + +# Declarar un array asociativo para la agenda de contactos +declare -A agenda + +# Función para insertar un contacto +function insertar_contacto { + # Pedir al usuario que ingrese el nombre del contacto + read -p "Nombre: " nombre + # Pedir al usuario que ingrese el número de teléfono del contacto + read -p "Número de teléfono: " telefono + # Validar que el número de teléfono sea numérico y tenga hasta 11 dígitos + if ! echo "$telefono" | grep -qE "^[0-9]{1,11}$"; then + # Si el número no es válido, mostrar un mensaje y salir de la función + echo "Número de teléfono inválido." + return + fi + # Añadir el contacto a la agenda + agenda[$nombre]=$telefono + # Confirmar que el contacto ha sido añadido + echo "Contacto añadido." +} + +# Función para buscar un contacto +function buscar_contacto { + # Pedir al usuario que ingrese el nombre del contacto a buscar + read -p "Nombre: " nombre + # Verificar si el contacto existe en la agenda + if [[ -z ${agenda[$nombre]} ]]; then + # Si no existe, mostrar un mensaje + echo "Contacto no encontrado." + else + # Si existe, mostrar el número de teléfono del contacto + echo "Teléfono de $nombre: ${agenda[$nombre]}" + fi +} + +# Función para actualizar un contacto +function actualizar_contacto { + # Pedir al usuario que ingrese el nombre del contacto a actualizar + read -p "Nombre: " nombre + # Verificar si el contacto existe en la agenda + if [[ -z ${agenda[$nombre]} ]]; then + # Si no existe, mostrar un mensaje y salir de la función + echo "Contacto no encontrado." + return + fi + # Pedir al usuario que ingrese el nuevo número de teléfono + read -p "Nuevo número de teléfono: " telefono + # Validar que el nuevo número de teléfono sea numérico y tenga hasta 11 dígitos + if ! echo "$telefono" | grep -qE "^[0-9]{1,11}$"; then + # Si el número no es válido, mostrar un mensaje y salir de la función + echo "Número de teléfono inválido." + return + fi + # Actualizar el contacto en la agenda + agenda[$nombre]=$telefono + # Confirmar que el contacto ha sido actualizado + echo "Contacto actualizado." +} + +# Función para eliminar un contacto +function eliminar_contacto { + # Pedir al usuario que ingrese el nombre del contacto a eliminar + read -p "Nombre: " nombre + # Verificar si el contacto existe en la agenda + if [[ -z ${agenda[$nombre]} ]]; then + # Si no existe, mostrar un mensaje y salir de la función + echo "Contacto no encontrado." + return + fi + # Eliminar el contacto de la agenda + unset agenda[$nombre] + # Confirmar que el contacto ha sido eliminado + echo "Contacto eliminado." +} + +# Función para mostrar el menú de opciones +function mostrar_menu { + # Mostrar las opciones disponibles al usuario + echo "1. Insertar contacto" + echo "2. Buscar contacto" + echo "3. Actualizar contacto" + echo "4. Eliminar contacto" + echo "5. Salir" +} + +# Bucle principal para mostrar el menú y ejecutar las opciones seleccionadas +while true; do + # Mostrar el menú de opciones + mostrar_menu + # Pedir al usuario que seleccione una opción + read -p "Seleccione una opción: " opcion + # Ejecutar la acción correspondiente a la opción seleccionada + case $opcion in + 1) insertar_contacto ;; # Llamar a la función para insertar un contacto + 2) buscar_contacto ;; # Llamar a la función para buscar un contacto + 3) actualizar_contacto ;; # Llamar a la función para actualizar un contacto + 4) eliminar_contacto ;; # Llamar a la función para eliminar un contacto + 5) break ;; # Salir del bucle y terminar el programa + *) echo "Opción inválida." ;; # Mostrar un mensaje si la opción no es válida + esac +done \ No newline at end of file diff --git a/Roadmap/07 - PILAS Y COLAS/javascript/CesarCarmona30.js b/Roadmap/07 - PILAS Y COLAS/javascript/CesarCarmona30.js new file mode 100644 index 0000000000..1521879a8f --- /dev/null +++ b/Roadmap/07 - PILAS Y COLAS/javascript/CesarCarmona30.js @@ -0,0 +1,106 @@ +/** + * EJERCICIO + */ + +// PILA +let stack = []; + +// Push +stack.push('Cucumber'); +stack.push('Radish'); +stack.push('Tomato'); +stack.push('Orange'); +stack.push('Apple'); + +console.table(stack); + +// Pop +stack.pop() +console.table(stack); +stack.pop() +console.table(stack); + +// COLA +let queue = []; + +// Enqueue +queue.push('Banana'); +queue.push('Melon'); +queue.push('Strawberry'); +queue.push('Onion'); +queue.push('Garlic'); +console.table(queue); + +// Dequeue +queue.shift(); +console.table(queue); +queue.shift(); +console.table(queue); + +//PILA - Navegador +//COLA - Impresora + +class WebBrowser { + constructor() { + this.pages = []; + this.index = null + this.currentPage = null; + } + + addPage(page) { + this.pages.push(page); + this.index = this.pages.length - 1; + this.currentPage = this.pages[this.index]; + } + + goForward() { + this.currentPage = this.pages[this.index++]; + if (this.currentPage != undefined) { + return this.currentPage; + } + this.index--; + console.error('Sin referencia de página adelante'); + return '-'; + } + + goBackward() { + try { + this.currentPage = this.pages[this.index--]; + return this.currentPage; + } catch (error) { + this.index++; + console.error('Sin páginas en el historial'); + return '-'; + } + } +} + +function browserHistory(browser, input) { + let page; + console.log(`>_${input}`); + switch (input) { + case 'adelante': + page = browser.goForward(); + console.log(`Página actual: ${page}`); + break; + case 'atras': + page = browser.goBackward(); + console.log(`Página actual: ${page}`); + break; + case 'salir': + break; + default: + let new_page = input; + browser.addPage(new_page); + console.log(`Nueva página: ${new_page}`); + break; + } +} + +const edge = new WebBrowser(); +browserHistory(edge, 'Wikipedia'); +browserHistory(edge, 'YouTube'); +browserHistory(edge, 'Amazon'); +browserHistory(edge, 'atras'); +browserHistory(edge, 'atras'); +browserHistory(edge, 'adelante'); \ No newline at end of file diff --git a/Roadmap/07 - PILAS Y COLAS/typescript/qv1ko.ts b/Roadmap/07 - PILAS Y COLAS/typescript/qv1ko.ts new file mode 100644 index 0000000000..ae55deaf48 --- /dev/null +++ b/Roadmap/07 - PILAS Y COLAS/typescript/qv1ko.ts @@ -0,0 +1,19 @@ +let stack: number[] = []; + +stack.push(1); +stack.push(2); +stack.push(3); + +if (stack.length !== 0) { + console.log(stack.pop()); +} + +let queue: string[] = []; + +queue.push('a'); +queue.push('b'); +queue.push('c'); + +if (queue.length !== 0){ + console.log(queue[0]); +} diff --git a/Roadmap/08 - CLASES/java/JesusAntonioEEscamilla.java b/Roadmap/08 - CLASES/java/JesusAntonioEEscamilla.java new file mode 100644 index 0000000000..771fc9d9d3 --- /dev/null +++ b/Roadmap/08 - CLASES/java/JesusAntonioEEscamilla.java @@ -0,0 +1,44 @@ + + +/** #07 - Java -> Jesus Antonio Escamilla */ + +public class JesusAntonioEEscamilla { + public static void main(String[] args) { + //---EJERCIÓ--- + Persona persona = new Persona("Jesus Antonio", 24, "Programador"); + persona.imprimirDetalles(); + //---EXTRA--- + + } + + //---EJERCIÓ--- + // Definición de la clase Persona + static class Persona { + // Atributos de la clase + private String nombre; + private int edad; + private String ocupacion; + + // Constructor de la clase Persona + public Persona(String nombre, int edad, String ocupacion) { + this.nombre = nombre; // Inicializa el atributo nombre + this.edad = edad; // Inicializa el atributo edad + this.ocupacion = ocupacion; // Inicializa el atributo ocupacion + } + + // Método para imprimir los atributos de la clase + public void imprimirDetalles() { + System.out.println("Nombre: " + nombre); + System.out.println("Edad: " + edad); + System.out.println("Profesión: " + ocupacion); + } + } + + + + /**-----DIFICULTAD EXTRA-----*/ + + // Pendiente + + /**-----DIFICULTAD EXTRA-----*/ +} \ No newline at end of file diff --git a/Roadmap/08 - CLASES/java/Qv1ko.java b/Roadmap/08 - CLASES/java/Qv1ko.java new file mode 100644 index 0000000000..9d99163537 --- /dev/null +++ b/Roadmap/08 - CLASES/java/Qv1ko.java @@ -0,0 +1,71 @@ +class Qv1ko { + + public static void main(String[] args) { + + C1 example1 = new C1(); + System.out.println(example1.toString()); + example1.setC1String("Example 1"); + System.out.println(example1.getC1String()); + + C2 example2 = new C2(); + System.out.println(example2.toString()); + example2.setC2String("Example 2"); + System.out.println(example2.getC2String()); + + } + +} + +class C1 { + + String c1String; + + C1() { + this.c1String = "example"; + } + + C1(String value) { + this.c1String = value; + } + + public String getC1String() { + return c1String; + } + + public void setC1String(String c1String) { + this.c1String = c1String; + } + + @Override + public String toString() { + return "Class 1 value: " + c1String; + } + +} + +class C2 { + + String c2String; + + C2() { + this.c2String = "example"; + } + + C2(String value) { + this.c2String = value; + } + + public String getC2String() { + return c2String; + } + + public void setC2String(String c2String) { + this.c2String = c2String; + } + + @Override + public String toString() { + return "Class 2 value: " + c2String; + } + +} diff --git a/Roadmap/08 - CLASES/python/JesusAntonioEEscamilla.py b/Roadmap/08 - CLASES/python/JesusAntonioEEscamilla.py new file mode 100644 index 0000000000..3fbb235ef6 --- /dev/null +++ b/Roadmap/08 - CLASES/python/JesusAntonioEEscamilla.py @@ -0,0 +1,28 @@ +# #08 - Python -> Jesus Antonio Escamilla + +""" +EJERCIÓ +""" +# Definición de la clase Persona +class Persona: + # Inicializador con atributos nombre y edad + def __init__(self, nombre, edad, ocupacion): + self.nombre = nombre + self.edad = edad + self.ocupacion = ocupacion + + # Método para imprimir los atributos + def imprimir_informacion(self): + print(f"Nombre: {self.nombre}, Edad: {self.edad}, Ocupación: {self.ocupacion}") + +# Crear una instancia de la clase Persona +persona1 = Persona("Jesus Antonio", 30, "Programador") + +persona1.imprimir_informacion() + + + +""" +EXTRA +""" +# Pendientes \ No newline at end of file diff --git a/Roadmap/11 - MANEJO DE FICHEROS/python/mvidalb.py b/Roadmap/11 - MANEJO DE FICHEROS/python/mvidalb.py new file mode 100644 index 0000000000..cb35e0142a --- /dev/null +++ b/Roadmap/11 - MANEJO DE FICHEROS/python/mvidalb.py @@ -0,0 +1,105 @@ +import os + +''' +Ejercicio +''' +file_name = "mvidalb.txt" + +with open(file_name, "w") as file: + file.write("Mario\n") + file.write("40\n") + file.write("Python") + +with open(file_name, "r") as file: + print(file.read()) + +os.remove(file_name) + + +''' +Ejercicio extra +''' +file_txt = "ventas.txt" +open(file_txt, "a") #a = append, seguir añadiendo + +while True: + print("¡Bienvenido!") + 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.") + accion = input("Selecciona la acción a realizar: ") + + match accion: + case "1": + name = input("Nombre: ") + quantity = input("Cantidad: ") + price = input("Precio: ") + with open(file_txt, "a",) as file: #a = append, seguir añadiendo + file.write(f"{name}, {quantity}, {price}\n") + case "2": + name = input("Nombre: ") + with open(file_txt, "r") as file: + for line in file.readlines(): + if line.split(", ")[0] == name: + print(line) + break + print("Ese producto no existe!\n") + case "3": + name = input("Nombre: ") + quantity = input("Cantidad: ") + price = input("Precio: ") + with open(file_txt, "r") as file: # Copio todas las líneas + lines = file.readlines() + with open(file_txt, "w") as file: # Escribo todo de nuevo + for line in lines: + if line.split(", ")[0] == name: + file.write(f"{name}, {quantity}, {price}\n") + print("Producto actualizado!\n") + else: + file.write(line) + case "4": + name = input("Nombre: ") + with open(file_txt, "r") as file: # Copio todas las líneas + lines = file.readlines() + with open(file_txt, "w") as file: # Escribo todo de nuevo + for line in lines: + if line.split(", ")[0] != name: + file.write(line) + else: + print("Ese producto no existe!") + case "5": + with open(file_txt, "r") as file: + print(file.read()) + case "6": + total_price = 0 + with open(file_txt, "r") as file: + for line in file.readlines(): + quantity = int(line.split(", ")[1]) + price = float(line.split(", ")[2]) + total_price += quantity*price + print(f"Venta total: {total_price} €") + case "7": + name = input("Nombre: ") + total_product = 0 + with open(file_txt, "r") as file: + for line in file.readlines(): + components = line.split(", ") + if components[0] == name: + quantity = int(line.split(", ")[1]) + price = float(line.split(", ")[2]) + total_product += quantity*price + break + print(f"Venta producto {name}: {total_product} €") + case "8": + print("ventas.txt ha sido borrado. ¡Hasta pronto!") + os.remove(file_txt) + break + case _: + print("No ha seleccionado ninguna acción entre los números 1 y 5.") + + \ No newline at end of file diff --git a/Roadmap/12 - JSON Y XML/python/mvidalb.py b/Roadmap/12 - JSON Y XML/python/mvidalb.py new file mode 100644 index 0000000000..8df0bacfbc --- /dev/null +++ b/Roadmap/12 - JSON Y XML/python/mvidalb.py @@ -0,0 +1,107 @@ +import json +import os +import xml.etree.ElementTree as xml + +data = { + "name" : "Mario", + "age" : 40, + "birth_date" : "01/01/2000", + "programming_languages" : ["Python", "C#"] +} + +# XML +xml_file = "mvidalb.xml" + +def create_xml(): + + root = xml.Element("data") + + for key, value in data.items(): + child = xml.SubElement(root, key) + if isinstance(value, list): + for item in value: + child_child = xml.SubElement(child, "item") + child_child.text = item + else: + child.text = str(value) + + tree = xml.ElementTree(root) + tree.write(xml_file) + +create_xml() + +with open(xml_file, "r") as xml_data: + print("XML file:") + print(xml_data.read()) + +os.remove(xml_file) + + +# JSON +json_file = "mvidalb.json" + +def create_json(): + with open(json_file, "w") as json_data: + json.dump(data, json_data) + +create_json() + +# Shift + Alt + F para formatear el archivo a formato JSON! + +with open(json_file, "r") as json_data: + print("JSON file:") + print(json_data.read()) + +os.remove(json_file) + + +''' +Ejercicio extra +''' +create_xml() +create_json() + +class Data: + + def __init__(self, name, age, birth_date, programming_languages) -> None: + self.name = name + self.age = age + self.birth_date = birth_date + self.programming_languages = programming_languages + +def extract_xml(): + with open(xml_file, "r") as xml_data: + + root = xml.fromstring(xml_data.read()) + name = root.find("name").text + age = root.find("age").text + birth_date = root.find("birth_date").text + + programming_languages = [] + for item in root.find("programming_languages"): + programming_languages.append(item.text) + + xml_class = Data(name, age, birth_date, programming_languages) + print("DATA CLASS: XML FILE") + print(xml_class.__dict__) + +def extract_json(): + with open(json_file, "r") as json_data: + + json_dict = json.load(json_data) + + name = json_dict["name"] + age = json_dict["age"] + birth_date = json_dict["birth_date"] + programming_languages = json_dict["programming_languages"] + + json_class = Data(name, age, birth_date, programming_languages) + print("DATA CLASS: JSON FILE") + print(json_class.__dict__) + +extract_xml() +extract_json() + +os.remove(xml_file) +os.remove(json_file) + diff --git a/Roadmap/17 - ITERACIONES/python/JuanDAW37.py b/Roadmap/17 - ITERACIONES/python/JuanDAW37.py new file mode 100644 index 0000000000..78bee852d1 --- /dev/null +++ b/Roadmap/17 - ITERACIONES/python/JuanDAW37.py @@ -0,0 +1,74 @@ +""" +* 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? +""" +# Bucle while +print('*******Bucle While*******') +i = 1 +while i <= 10: + print(i) + i += 1 + +# Simulando Do...While +print('*******Bucle Simulando Do...While*******') +i = 1 +while True: + if i <= 10: + print(i) + i += 1 + else: + break + +# Bucle for +print('*******Bucle For con listas(lists)*******') +numeros = [1,2,3,4,5,6,7,8,9,10] + +for i in numeros: + print(i) + +print('*******Bucle For con conjuntos(sets)*******') +for i in {1,2,3,4,5,6,7,8,9,10}: + print(i) + +print('*******Bucle For con mapas(maps)*******') +for i in {1:'a',2:'b',3:'c',4:'d',5:'e',6:'f',7:'g',8:'h',9:'i',10:'j'}: + print(i) + +print('*******Bucle For con tuplas(tuples)*******') +for i in (1,2,3,4,5,6,7,8,9,10): + print(i) + +print('*******Bucle For con función range()*******') +for i in range(1, 11): + print(i) + +# Función recursiva: +print('*******Función Recursiva*******') +def imprimir_numeros(n:int = 1): + if n <= 10: + print(n) + imprimir_numeros(n + 1) + +imprimir_numeros() + +# EXTRA, de las 10 solicitadas podemos contar con las anteriores +print('*******Bucle For con Generadores Conprehesion List*******') +print(*[x for x in range(1, 11)], sep='\n') #El * indica que es un conprehesion list y usando sep indicamos que el separador, en este caso, será un retorno de carro + +print('*******Cadena de texto*******') +lenguaje = 'Python' +for letra in lenguaje: + print(letra) + +print('*******Cadena de texto al revés*******') +for letra in reversed(lenguaje): + print(letra) + +print('*******Cadena de texto ordenada, usando enumerate para saber su índice*******') +for i, letra in enumerate(sorted(lenguaje)): + print(f'Índice {i}, letra {letra}') \ No newline at end of file diff --git a/Roadmap/18 - CONJUNTOS/python/JuanDAW37.py b/Roadmap/18 - CONJUNTOS/python/JuanDAW37.py new file mode 100644 index 0000000000..408188a4fb --- /dev/null +++ b/Roadmap/18 - CONJUNTOS/python/JuanDAW37.py @@ -0,0 +1,59 @@ +"""* 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.""" + +conjunto = ['a', 'b', 'c', 'd'] +print(f'Mi conjunto es {conjunto}') +# Añade un elemento al final. +conjunto.append('e') +print(f'Mi conjunto es {conjunto}') +# Añade un elemento al principio. +conjunto.insert(0,'a') +print(f'Mi conjunto es {conjunto}') +# Añade varios elementos en bloque al final. +conjunto.extend(['y', 'z']) +print(f'Mi conjunto es {conjunto}') +# Añade varios elementos en bloque en una posición concreta. +conjunto[2:2] = ['d', 'h', 'r'] +print(f'Mi conjunto es {conjunto}') +# Elimina un elemento en una posición concreta. +del conjunto[2] +print(f'Mi conjunto es {conjunto}') +# Actualiza el valor de un elemento en una posición concreta. +conjunto[3] = 'ñ' +print(f'Mi conjunto es {conjunto}') +# Comprueba si un elemento está en un conjunto. +print(f'¿El elemento está en el conjunto? {'t' in conjunto}') +# Elimina todo el contenido del conjunto. +conjunto.clear() +print(f'Mi conjunto es {conjunto}') + +# EXTRA +conjunto1 = {'a', 'b', 'c'} +conjunto2 = {'b', 'c', 'd'} +# - Unión. +print(conjunto1.union(conjunto2)) + +# - Intersección +print(conjunto1.intersection(conjunto2)) + +# - Diferencia +print(conjunto1.difference(conjunto2)) + +# - Diferencia simétrica: +print(conjunto1.symmetric_difference(conjunto2)) \ No newline at end of file diff --git a/Roadmap/26 - SOLID SRP/kotlin/eulogioep.kt b/Roadmap/26 - SOLID SRP/kotlin/eulogioep.kt new file mode 100644 index 0000000000..1ad0fb4cec --- /dev/null +++ b/Roadmap/26 - SOLID SRP/kotlin/eulogioep.kt @@ -0,0 +1,130 @@ +/* + * Principio de Responsabilidad Única (SRP) + * + * El Principio de Responsabilidad Única es el primer principio de SOLID y establece que una clase + * debe tener una, y solo una, razón para cambiar. En otras palabras, una clase debe tener una + * única responsabilidad bien definida. + * + * Este principio promueve la modularidad, facilita el mantenimiento y mejora la legibilidad del código. + * Cuando una clase tiene múltiples responsabilidades, se vuelve más difícil de entender, modificar y probar. + */ + +// Definiciones de datos comunes +data class Book(val title: String, val author: String, var availableCopies: Int) +data class User(val name: String, val id: String, val email: String) +data class Loan(val user: User, val book: Book) + +// Versión que no cumple con SRP +class LibraryWithoutSRP { + private val books = mutableListOf() + private val users = mutableListOf() + private val loans = mutableListOf() + + fun addBook(title: String, author: String, copies: Int) { + books.add(Book(title, author, copies)) + } + + fun registerUser(name: String, id: String, email: String) { + users.add(User(name, id, email)) + } + + fun loanBook(userId: String, bookTitle: String) { + val user = users.find { it.id == userId } + val book = books.find { it.title == bookTitle } + if (user != null && book != null && book.availableCopies > 0) { + loans.add(Loan(user, book)) + book.availableCopies-- + } + } + + fun returnBook(userId: String, bookTitle: String) { + val loan = loans.find { it.user.id == userId && it.book.title == bookTitle } + if (loan != null) { + loans.remove(loan) + loan.book.availableCopies++ + } + } +} + +// Versión refactorizada que cumple con SRP +class BookManager { + private val books = mutableListOf() + + fun addBook(title: String, author: String, copies: Int) { + books.add(Book(title, author, copies)) + } + + fun findBook(title: String): Book? = books.find { it.title == title } +} + +class UserManager { + private val users = mutableListOf() + + fun registerUser(name: String, id: String, email: String) { + users.add(User(name, id, email)) + } + + fun findUser(id: String): User? = users.find { it.id == id } +} + +class LoanManager { + private val loans = mutableListOf() + + fun loanBook(user: User, book: Book) { + if (book.availableCopies > 0) { + loans.add(Loan(user, book)) + book.availableCopies-- + } + } + + fun returnBook(user: User, book: Book) { + val loan = loans.find { it.user == user && it.book == book } + if (loan != null) { + loans.remove(loan) + book.availableCopies++ + } + } +} + +class Library( + private val bookManager: BookManager, + private val userManager: UserManager, + private val loanManager: LoanManager +) { + fun addBook(title: String, author: String, copies: Int) { + bookManager.addBook(title, author, copies) + } + + fun registerUser(name: String, id: String, email: String) { + userManager.registerUser(name, id, email) + } + + fun loanBook(userId: String, bookTitle: String) { + val user = userManager.findUser(userId) + val book = bookManager.findBook(bookTitle) + if (user != null && book != null) { + loanManager.loanBook(user, book) + } + } + + fun returnBook(userId: String, bookTitle: String) { + val user = userManager.findUser(userId) + val book = bookManager.findBook(bookTitle) + if (user != null && book != null) { + loanManager.returnBook(user, book) + } + } +} + +// Uso del sistema refactorizado +fun main() { + val bookManager = BookManager() + val userManager = UserManager() + val loanManager = LoanManager() + val library = Library(bookManager, userManager, loanManager) + + library.addBook("1984", "George Orwell", 5) + library.registerUser("EulogioEP", "001", "eulogioep@email.com") + library.loanBook("001", "1984") + library.returnBook("001", "1984") +} \ No newline at end of file diff --git a/Roadmap/27 - SOLID OCP/kotlin/eulogioep.kt b/Roadmap/27 - SOLID OCP/kotlin/eulogioep.kt new file mode 100644 index 0000000000..b389ca6481 --- /dev/null +++ b/Roadmap/27 - SOLID OCP/kotlin/eulogioep.kt @@ -0,0 +1,76 @@ +/* + * Principio Abierto-Cerrado (OCP) de SOLID + * + * El principio OCP establece que las entidades de software (clases, módulos, funciones, etc.) + * deben estar abiertas para la extensión, pero cerradas para la modificación. Esto significa + * que debemos poder extender el comportamiento de una clase sin modificar su código existente. + * + * En este ejemplo, demostraremos cómo aplicar el OCP en el diseño de una calculadora, + * permitiendo agregar nuevas operaciones sin modificar el código existente. + */ + +// Interfaz que define la operación matemática +interface Operation { + fun execute(a: Double, b: Double): Double +} + +// Implementaciones de las operaciones básicas +class Addition : Operation { + override fun execute(a: Double, b: Double) = a + b +} + +class Subtraction : Operation { + override fun execute(a: Double, b: Double) = a - b +} + +class Multiplication : Operation { + override fun execute(a: Double, b: Double) = a * b +} + +class Division : Operation { + override fun execute(a: Double, b: Double): Double { + if (b == 0.0) throw IllegalArgumentException("Cannot divide by zero") + return a / b + } +} + +// Calculadora que utiliza el principio OCP +class Calculator { + private val operations = mutableMapOf() + + fun addOperation(name: String, operation: Operation) { + operations[name] = operation + } + + fun calculate(a: Double, b: Double, operationName: String): Double { + val operation = operations[operationName] + ?: throw IllegalArgumentException("Operation not supported") + return operation.execute(a, b) + } +} + +// Ejemplo de uso y prueba +fun main() { + val calculator = Calculator() + + // Agregar operaciones básicas + calculator.addOperation("add", Addition()) + calculator.addOperation("subtract", Subtraction()) + calculator.addOperation("multiply", Multiplication()) + calculator.addOperation("divide", Division()) + + // Probar operaciones básicas + println("5 + 3 = ${calculator.calculate(5.0, 3.0, "add")}") + println("5 - 3 = ${calculator.calculate(5.0, 3.0, "subtract")}") + println("5 * 3 = ${calculator.calculate(5.0, 3.0, "multiply")}") + println("6 / 3 = ${calculator.calculate(6.0, 3.0, "divide")}") + + // Agregar una nueva operación (potencia) sin modificar el código existente + class Power : Operation { + override fun execute(a: Double, b: Double) = Math.pow(a, b) + } + calculator.addOperation("power", Power()) + + // Probar la nueva operación + println("2^3 = ${calculator.calculate(2.0, 3.0, "power")}") +} diff --git a/Roadmap/32 - BATALLA DEADPOOL Y WOLVERINE/javascript/isaacus98.js b/Roadmap/32 - BATALLA DEADPOOL Y WOLVERINE/javascript/isaacus98.js new file mode 100644 index 0000000000..457f23f44f --- /dev/null +++ b/Roadmap/32 - BATALLA DEADPOOL Y WOLVERINE/javascript/isaacus98.js @@ -0,0 +1,147 @@ +/* + * 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. + */ + +class Character { + constructor(name, health, minDamage, maxDamage, evasion) { + this.name = name + this.health = health + this.minDamage = minDamage + this.maxDamage = maxDamage + this.evasion = evasion + } + + // Devuelve el numero de daño generado + attack() { + return Math.floor(Math.random() * this.maxDamage) + this.minDamage + } + + // Devuelve true si esquiva el ataque, false si no lo esquiva y le resta puntos de vida + dodge(damage) { + let isEvasion = Math.floor(Math.random() * 100) + 1 + + // Ha evadido el ataque + if (isEvasion <= this.evasion) { + return true + } else { + if ((this.health - damage) < 0) { + this.health = 0 + } else { + this.health -= damage + } + + return false + } + } +} + +const rl = require('readline-sync'); + +// Pide los puntos de vida que tendra Deadpool +let health = rl.question("Inserte la cantidad de vida que tendra Deadpool? ") +let deadpool = new Character("Deadpool", parseInt(health), 10, 100, 25) + +// Pide los puntos de vida que tendra Wolverine +health = rl.question("Inserte la cantidad de vida que tendra Wolverine? ") +let wolverine = new Character("Wolverine", parseInt(health), 10, 120, 20) + +console.log("Estadisticas Deadpool") +console.table(deadpool) + +console.log("Estadisticas Wolverine") +console.table(wolverine) + +battle() + +async function battle() { + let alternate = true + let evasion = false + let damage = 0 + let wolverineInitialHealth = wolverine.health + let deadpoolInitialHealth = deadpool.health + + do { + + // Deadpool + if (alternate) { + console.log("Turno de Deadpool") + + // Realizar ataque + damage = deadpool.attack() + console.log(`Deadpool hace un ataque de ${damage} puntos de daño`) + + // Evasión + evasion = wolverine.dodge(damage) + if (evasion) { + console.log("Wolverine ha esquivado el ataque") + } else { + console.log(`Wolverine a recibido un ataque de ${damage} puntos de daño`) + } + + // Comprovar si el turno canvia + if (damage == deadpool.maxDamage & !evasion) { + console.log("Wolverine entra en modo de regeneración") + alternate = true + } else { + alternate = false + } + } else { // Wolverine + console.log("Turno de Wolverine") + + // Realizar ataque + damage = wolverine.attack() + console.log(`Wolverine hace un ataque de ${damage} puntos de daño`) + + // Evasión + evasion = deadpool.dodge(damage) + if (evasion) { + console.log("Deadpool ha esquivado el ataque") + } else { + console.log(`Deadpool a recibido un ataque de ${damage} puntos de daño`) + } + + // Comprovar si el turno canvia + if (damage == wolverine.maxDamage & !evasion) { + console.log("Deadpool entra en modo de regeneración") + alternate = false + } else { + alternate = true + } + } + + // Mostrar vida de los personajes a final de turno + console.log(`Deadpool: ${deadpool.health}/${deadpoolInitialHealth}`) + console.log(`Wolverine: ${wolverine.health}/${wolverineInitialHealth}`) + + // Pausa de 1 segundo + await new Promise(r => setTimeout(r, 1000)); + } while(deadpool.health > 0 & wolverine.health > 0) + + if (deadpool.health == 0) { + console.log("Wolverine ha ganado la pelea") + } else { + console.log("Deadpool ha ganado la pelea") + } +} \ No newline at end of file diff --git a/Roadmap/35 - REPARTIENDO LOS ANILLOS DE PODER/python/rigo93acosta.py b/Roadmap/35 - REPARTIENDO LOS ANILLOS DE PODER/python/rigo93acosta.py new file mode 100644 index 0000000000..8112901480 --- /dev/null +++ b/Roadmap/35 - REPARTIENDO LOS ANILLOS DE PODER/python/rigo93acosta.py @@ -0,0 +1,73 @@ +''' +/* + * 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. + */ +''' + +def is_prime(number: int) -> bool: + if number < 2: + return False + for i in range(2, int((number ** 0.5)+1)): + if number % i == 0: + return False + return True + + + +def distribute_rings(total_rings: int): + + distributed_rings = [] + + sauron = 1 + total_rings -= sauron + + for men in range(2, total_rings, 2): + for elves in range(1, total_rings, 2): + + dwarves = total_rings - elves - men + + if dwarves > 0 and is_prime(dwarves): + + distributed_rings.append({ + "Hombres": men, + "Elfos": elves, + "Enanos": dwarves, + "Sauron": sauron + }) + + if distributed_rings: + return distributed_rings + return "Error: No es posible repartir los anillos." + +if __name__ == '__main__': + + try: + total_rings = int( + input('Introduce el número de anillos a repartir: ') + ) + + distributed_rings = distribute_rings(total_rings) + + if isinstance(distributed_rings, list): + print("Posibles distribuciones de los anillos de poder:\n") + for distribution in enumerate(distributed_rings): + print(f"{distribution[0] + 1}. {distribution[1]}") + + print(f"\nDistribución media: {distributed_rings[int(len(distributed_rings) / 2)]}") + else: + print(distributed_rings) + except ValueError: + print('Error, el número debe ser un entero.') diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/go/hozlucas28.go b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/go/hozlucas28.go new file mode 100644 index 0000000000..29adf378b8 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/go/hozlucas28.go @@ -0,0 +1,250 @@ +package main + +import ( + "bufio" + "fmt" + "maps" + rand "math/rand/v2" + "os" + "slices" + "strings" +) + +/* -------------------------------------------------------------------------- */ +/* STRUCTS */ +/* -------------------------------------------------------------------------- */ + +type Question struct { + CorrectAnswer string + Options []string + Points float32 + Question string + _ struct{} +} + +type QuestionsPerHouse struct { + Backend [2]Question + Data [2]Question + Frontend [2]Question + Mobile [2]Question + _ struct{} +} + +/* -------------------------------------------------------------------------- */ +/* UTILS */ +/* -------------------------------------------------------------------------- */ + +func toLongDisjunction[T string](slice []T) string { + var arrayLength int = len(slice) + + if arrayLength == 0 { + panic("slice empty") + } + + var rtn string = string(slice[0]) + + if arrayLength == 1 { + return rtn + } + + for _, element := range slice[1 : arrayLength-1] { + rtn += fmt.Sprintf(", %s", element) + } + + rtn += fmt.Sprintf(", and %s", slice[arrayLength-1]) + + return rtn +} + +func rndChoice[T string](choices []T) T { + var choicesLength int = len(choices) + + if choicesLength == 0 { + panic("slice of choices empty") + } + + if choicesLength == 1 { + return choices[0] + } + + var rndIndex int = rand.IntN(choicesLength - 1) + + return choices[rndIndex] +} + +func makeQuestion[T string](question *Question) float32 { + var reader *bufio.Reader = bufio.NewReader(os.Stdin) + + var questionMsg string = fmt.Sprintf("> %s (%s): ", question.Question, toLongDisjunction(question.Options)) + + fmt.Print(questionMsg) + userAnswer, err := reader.ReadString('\n') + if err == nil { + userAnswer = strings.ToUpper(strings.TrimSpace(userAnswer)) + } + + var exit bool = slices.ContainsFunc(question.Options, func(opt string) bool { + return strings.Compare(userAnswer, strings.ToUpper(opt)) == 0 + }) + + for !exit { + fmt.Printf("\n> Invalid option! Try again...\n\n") + + fmt.Print(questionMsg) + userAnswer, err := reader.ReadString('\n') + if err == nil { + userAnswer = strings.ToUpper(strings.TrimSpace(userAnswer)) + } + + exit = slices.ContainsFunc(question.Options, func(opt string) bool { + return strings.Compare(userAnswer, strings.ToUpper(opt)) == 0 + }) + } + + if strings.Compare(userAnswer, strings.ToUpper(question.CorrectAnswer)) == 0 { + return question.Points + } else { + return 0 + } + +} + +/* -------------------------------------------------------------------------- */ +/* MAIN */ +/* -------------------------------------------------------------------------- */ + +func main() { + var reader *bufio.Reader = bufio.NewReader(os.Stdin) + + var questionsPerHouse QuestionsPerHouse = QuestionsPerHouse{ + Backend: [2]Question{ + { + CorrectAnswer: "JavaScript", + Options: []string{"Java", "JavaScript", "Python", "Ruby"}, + Question: "What is the primary language used in backend development?", + Points: 5, + }, + { + CorrectAnswer: "PostgreSQL", + Options: []string{"MySQL", "MongoDB", "PostgreSQL", "SQLite"}, + Points: 5, + Question: "Which database is commonly used for storing data in backend applications?", + }, + }, + Data: [2]Question{ + { + CorrectAnswer: "Data analysis", + Options: []string{"Data analysis", "Data visualization", "Data mining", "Data modeling"}, + Points: 5, + Question: "What is the process of analyzing and interpreting data called?", + }, + { + CorrectAnswer: "Julia", + Options: []string{"Python", "R", "SQL", "Julia"}, + Points: 5, + Question: "Which programming language is commonly used for data analysis?", + }, + }, + Frontend: [2]Question{ + { + CorrectAnswer: "JavaScript", + Options: []string{"HTML", "CSS", "JavaScript", "Python"}, + Points: 5, + Question: "What is the primary language used in frontend development?", + }, + { + CorrectAnswer: "Angular", + Options: []string{"React", "Angular", "Vue", "Ember"}, + Points: 5, + Question: "Which framework is commonly used for building user interfaces?", + }, + }, + Mobile: [2]Question{ + { + CorrectAnswer: "Flutter", + Options: []string{"iOS", "Android", "React Native", "Flutter"}, + Points: 5, + Question: "Which platform is commonly used for developing mobile applications?", + }, + { + CorrectAnswer: "Objective-C", + Options: []string{"Swift", "Kotlin", "Java", "Objective-C"}, + Points: 5, + Question: "What is the primary language used in mobile app development?", + }, + }, + } + + fmt.Print("> Enter your name: ") + userName, err := reader.ReadString('\n') + if err != nil { + panic(err) + } + userName = strings.TrimSpace(userName) + + var pointsPerHouse map[string]float32 = map[string]float32{ + "backend": 0, + "data": 0, + "frontend": 0, + "mobile": 0, + } + + fmt.Println() + pointsPerHouse["backend"] += makeQuestion(&questionsPerHouse.Backend[0]) + + fmt.Println() + pointsPerHouse["backend"] += makeQuestion(&questionsPerHouse.Backend[1]) + + fmt.Println() + pointsPerHouse["data"] += makeQuestion(&questionsPerHouse.Data[0]) + + fmt.Println() + pointsPerHouse["data"] += makeQuestion(&questionsPerHouse.Data[1]) + + fmt.Println() + pointsPerHouse["frontend"] += makeQuestion(&questionsPerHouse.Frontend[0]) + + fmt.Println() + pointsPerHouse["frontend"] += makeQuestion(&questionsPerHouse.Frontend[1]) + + fmt.Println() + pointsPerHouse["mobile"] += makeQuestion(&questionsPerHouse.Mobile[0]) + + fmt.Println() + pointsPerHouse["mobile"] += makeQuestion(&questionsPerHouse.Mobile[1]) + + var maxPoint float32 = max( + pointsPerHouse["backend"], + pointsPerHouse["data"], + pointsPerHouse["frontend"], + pointsPerHouse["mobile"], + ) + + var maxPoints map[string]float32 = map[string]float32{ + "backend": pointsPerHouse["backend"], + "data": pointsPerHouse["data"], + "frontend": pointsPerHouse["frontend"], + "mobile": pointsPerHouse["mobile"], + } + + maps.DeleteFunc(maxPoints, func(key string, value float32) bool { + return value != maxPoint + }) + + if len(maxPoints) == 1 { + for house := range maxPoints { + fmt.Printf("\n> %s will be part of the %s house!", userName, house) + break + } + return + } + + var houses []string + for house := range maxPoints { + houses = append(houses, house) + } + + var rndHouse string = rndChoice(houses) + + fmt.Printf("\n> The decision has been complicated, but %s will be part of the %s house!", userName, rndHouse) +} diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/java/mantaras96.java b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/java/mantaras96.java new file mode 100644 index 0000000000..b79a861558 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/java/mantaras96.java @@ -0,0 +1,165 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.Scanner; + +public class Mantaras96 { + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + Respuestas respuestas = new Respuestas(); + + String name = obtenerNombreAlumno(scanner); + + List preguntas = cargarPreguntas(); + + // Aquí podrías llamar a otras funciones para continuar el programa, por + // ejemplo: + realizarPreguntas(scanner, respuestas, preguntas); + String casa = determinarCasa(respuestas); + System.out.println("El sombrero seleccionador ha decidido que perteneces a la casa: " + casa); + + scanner.close(); + } + + public static String determinarCasa(Respuestas respuestas) { + int maxPuntos = Math.max(Math.max(respuestas.getPuntosFront(), respuestas.getPuntosBack()), + Math.max(respuestas.getPuntosMobile(), respuestas.getPuntosData())); + List casasEmpatadas = new ArrayList<>(); + + if (respuestas.getPuntosFront() == maxPuntos) { + casasEmpatadas.add("Frontend"); + } + if (respuestas.getPuntosBack() == maxPuntos) { + casasEmpatadas.add("Backend"); + } + if (respuestas.getPuntosMobile() == maxPuntos) { + casasEmpatadas.add("Mobile"); + } + if (respuestas.getPuntosData() == maxPuntos) { + casasEmpatadas.add("Data"); + } + + if (casasEmpatadas.size() > 1) { + System.out.println("¡La decisión ha sido complicada! Hubo un empate."); + Random random = new Random(); + return casasEmpatadas.get(random.nextInt(casasEmpatadas.size())); + } else { + return casasEmpatadas.get(0); + } + } + + public static void mostrarResultados(Respuestas respuestas) { + String casa = determinarCasa(respuestas); + System.out.println("El sombrero seleccionador ha decidido que perteneces a la casa: " + casa); + } + + public static List cargarPreguntas() { + List preguntas = new ArrayList<>(); + preguntas.add( + "Pregunta 1: ¿Qué lenguaje de programación prefieres? (Responde con 1 para JavaScript, 2 para Java, 3 para Swift, 4 para Python)"); + preguntas.add( + "Pregunta 2: ¿Qué tipo de proyectos disfrutas más? (Responde con 1 para Aplicaciones web, 2 para Sistemas empresariales, 3 para Aplicaciones móviles, 4 para Análisis de datos)"); + preguntas.add( + "Pregunta 3: ¿Qué herramienta prefieres usar? (Responde con 1 para React, 2 para Spring, 3 para Xcode, 4 para Pandas)"); + preguntas.add( + "Pregunta 4: ¿Cuál es tu área de interés? (Responde con 1 para Diseño de interfaces, 2 para Arquitectura de software, 3 para Desarrollo de apps, 4 para Ciencia de datos)"); + preguntas.add( + "Pregunta 5: ¿Qué prefieres hacer en tu tiempo libre? (Responde con 1 para Crear sitios web, 2 para Trabajar en backend, 3 para Desarrollar juegos móviles, 4 para Analizar grandes conjuntos de datos)"); + preguntas.add( + "Pregunta 6: ¿Cuál es tu rol ideal en un equipo? (Responde con 1 para Diseñador UI/UX, 2 para Ingeniero de software, 3 para Desarrollador móvil, 4 para Científico de datos)"); + preguntas.add( + "Pregunta 7: ¿Qué tecnología te emociona más? (Responde con 1 para CSS y HTML, 2 para Microservicios, 3 para Kotlin, 4 para Machine Learning)"); + preguntas.add( + "Pregunta 8: ¿Qué tipo de problemas te gusta resolver? (Responde con 1 para Problemas de diseño, 2 para Problemas de lógica, 3 para Problemas de accesibilidad, 4 para Problemas de análisis de datos)"); + preguntas.add( + "Pregunta 9: ¿Qué tipo de lectura prefieres? (Responde con 1 para Blogs de diseño, 2 para Libros técnicos, 3 para Artículos sobre desarrollo móvil, 4 para Investigaciones de datos)"); + preguntas.add( + "Pregunta 10: ¿Dónde te ves en cinco años? (Responde con 1 para Desarrollando interfaces innovadoras, 2 para Liderando equipos de backend, 3 para Creando apps revolucionarias, 4 para Descubriendo insights en datos)"); + return preguntas; + } + + public static void realizarPreguntas(Scanner scanner, Respuestas respuestas, List preguntas) { + for (String pregunta : preguntas) { + boolean respuestaValida = false; + while (!respuestaValida) { + System.out.println(pregunta); + String respuesta = scanner.nextLine(); + try { + int puntos = Integer.parseInt(respuesta); + respuestas.addPointsToHouse(puntos); + respuestaValida = true; + } catch (NumberFormatException e) { + System.out.println("Por favor, ingrese un número válido."); + } + } + } + } + + public static String obtenerNombreAlumno(Scanner scanner) { + System.out.println("Bienvenido a Hogwarts. Indica tu nombre al sombrero seleccionador:"); + String name = scanner.nextLine(); + return name; + } + + public static class Respuestas { + int puntosFront = 0; + int puntosBack = 0; + int puntosMobile = 0; + int puntosData = 0; + + public int getPuntosFront() { + return puntosFront; + } + + public void setPuntosFront(int puntosFront) { + this.puntosFront = puntosFront; + } + + public int getPuntosBack() { + return puntosBack; + } + + public void setPuntosBack(int puntosBack) { + this.puntosBack = puntosBack; + } + + public int getPuntosMobile() { + return puntosMobile; + } + + public void setPuntosMobile(int puntosMobile) { + this.puntosMobile = puntosMobile; + } + + public int getPuntosData() { + return puntosData; + } + + public void setPuntosData(int puntosData) { + this.puntosData = puntosData; + } + + public Respuestas() { + // Constructor por defecto + } + + public void addPointsToHouse(int points) { + switch (points) { + case 1: + this.puntosFront++; + break; + case 2: + this.puntosBack++; + break; + case 3: + this.puntosMobile++; + break; + case 4: + this.puntosData++; + break; + } + + } + } +} diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/java/miguelex.java b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/java/miguelex.java new file mode 100644 index 0000000000..cdf8e2b615 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/java/miguelex.java @@ -0,0 +1,289 @@ +import java.util.*; + +class Casa { + private String nombre; + private int puntos; + + public Casa(String nombre) { + this.nombre = nombre; + this.puntos = 0; + } + + public String getNombre() { + return nombre; + } + + public void agregarPuntos(int puntos) { + this.puntos += puntos; + } + + public int getPuntos() { + return puntos; + } +} + +class Alumno { + private String nombre; + + public Alumno(String nombre) { + this.nombre = nombre; + } + + public String getNombre() { + return nombre; + } +} + +class Pregunta { + private String pregunta; + private List opciones; + + public Pregunta(String pregunta, List opciones) { + this.pregunta = pregunta; + this.opciones = opciones; + } + + public void mostrarPregunta() { + System.out.println(pregunta); + for (int i = 0; i < opciones.size(); i++) { + System.out.println((i + 1) + ": " + opciones.get(i).getTexto()); + } + } + + public String obtenerCasaSegunRespuesta(int respuesta) { + return opciones.get(respuesta - 1).getCasa(); + } +} + +class Opcion { + private String texto; + private String casa; + + public Opcion(String texto, String casa) { + this.texto = texto; + this.casa = casa; + } + + public String getTexto() { + return texto; + } + + public String getCasa() { + return casa; + } +} + +class SombreroSeleccionador { + private Map casas; + private List preguntas; + + public SombreroSeleccionador(Map casas, List preguntas) { + this.casas = casas; + this.preguntas = preguntas; + } + + public void asignarCasa(Alumno alumno) { + List preguntasSeleccionadas = seleccionarPreguntas(); + Scanner scanner = new Scanner(System.in); + + for (Pregunta pregunta : preguntasSeleccionadas) { + pregunta.mostrarPregunta(); + int respuesta = leerRespuesta(scanner); + String casa = pregunta.obtenerCasaSegunRespuesta(respuesta); + casas.get(casa).agregarPuntos(1); + } + + mostrarResultado(alumno); + scanner.close(); + } + + private List seleccionarPreguntas() { + List preguntasSeleccionadas = new ArrayList<>(); + Set indicesSeleccionados = new HashSet<>(); + Random random = new Random(); + + while (preguntasSeleccionadas.size() < 10) { + int indice = random.nextInt(preguntas.size()); + if (!indicesSeleccionados.contains(indice)) { + indicesSeleccionados.add(indice); + preguntasSeleccionadas.add(preguntas.get(indice)); + } + } + + return preguntasSeleccionadas; + } + + private int leerRespuesta(Scanner scanner) { + int respuesta = 0; + while (respuesta < 1 || respuesta > 4) { + System.out.print("Selecciona una opción (1-4): "); + respuesta = scanner.nextInt(); + } + return respuesta; + } + + private void mostrarResultado(Alumno alumno) { + List casasOrdenadas = new ArrayList<>(casas.values()); + casasOrdenadas.sort(Comparator.comparingInt(Casa::getPuntos).reversed()); + + int maxPuntos = casasOrdenadas.get(0).getPuntos(); + List ganadoras = new ArrayList<>(); + for (Casa casa : casasOrdenadas) { + if (casa.getPuntos() == maxPuntos) { + ganadoras.add(casa); + } + } + + Casa ganadora; + if (ganadoras.size() > 1) { + System.out.println("\n\nLa decisión fue difícil..."); + Random random = new Random(); + ganadora = ganadoras.get(random.nextInt(ganadoras.size())); + } else { + ganadora = ganadoras.get(0); + } + + System.out.println("\n\n" + alumno.getNombre() + ", el sombrero seleccionador te ha asignado a la casa " + ganadora.getNombre().toUpperCase() + "!!!!\n"); + } +} + +public class miguelex { + public static void main(String[] args) { + Map casas = new HashMap<>(); + casas.put("frontend", new Casa("Frontend")); + casas.put("backend", new Casa("Backend")); + casas.put("mobile", new Casa("Mobile")); + casas.put("data", new Casa("Data")); + + List preguntas = Arrays.asList( + new Pregunta("¿Qué prefieres?", Arrays.asList( + new Opcion("Diseñar interfaces", "frontend"), + new Opcion("Crear APIs", "backend"), + new Opcion("Desarrollar apps móviles", "mobile"), + new Opcion("Analizar datos", "data") + )), + new Pregunta("¿Cuál es tu lenguaje de programación favorito?", Arrays.asList( + new Opcion("JavaScript", "frontend"), + new Opcion("Python", "backend"), + new Opcion("Kotlin", "mobile"), + new Opcion("R", "data") + )), + new Pregunta("¿Qué herramienta utilizas más a menudo?", Arrays.asList( + new Opcion("Figma o Sketch", "frontend"), + new Opcion("Docker o Kubernetes", "backend"), + new Opcion("Android Studio o Xcode", "mobile"), + new Opcion("Jupyter Notebooks o Excel", "data") + )), + new Pregunta("¿Qué te interesa más aprender?", Arrays.asList( + new Opcion("HTML/CSS y JavaScript avanzado", "frontend"), + new Opcion("Patrones de diseño y arquitectura de software", "backend"), + new Opcion("Programación nativa para dispositivos móviles", "mobile"), + new Opcion("Estadística y Machine Learning", "data") + )), + new Pregunta("¿Qué tipo de proyecto te gustaría liderar?", Arrays.asList( + new Opcion("Un sitio web interactivo y atractivo", "frontend"), + new Opcion("Una plataforma escalable con microservicios", "backend"), + new Opcion("Una app móvil innovadora", "mobile"), + new Opcion("Un sistema de recomendación basado en datos", "data") + )), + new Pregunta("¿Qué es lo más importante para ti en un proyecto?", Arrays.asList( + new Opcion("La experiencia de usuario", "frontend"), + new Opcion("El rendimiento y la escalabilidad", "backend"), + new Opcion("La adaptabilidad a diferentes dispositivos", "mobile"), + new Opcion("La precisión de los análisis", "data") + )), + new Pregunta("¿Qué prefieres trabajar?", Arrays.asList( + new Opcion("En un entorno donde el diseño visual es clave", "frontend"), + new Opcion("En la lógica del negocio y la arquitectura", "backend"), + new Opcion("En apps móviles con buen rendimiento", "mobile"), + new Opcion("En el análisis y visualización de datos", "data") + )), + new Pregunta("¿Qué framework te parece más interesante?", Arrays.asList( + new Opcion("React o Angular", "frontend"), + new Opcion("Spring o Django", "backend"), + new Opcion("Flutter o React Native", "mobile"), + new Opcion("TensorFlow o Pandas", "data") + )), + new Pregunta("¿Qué tipo de reto disfrutas más?", Arrays.asList( + new Opcion("Hacer que un sitio web sea accesible y rápido", "frontend"), + new Opcion("Optimizar la comunicación entre servicios", "backend"), + new Opcion("Mejorar la experiencia del usuario en móviles", "mobile"), + new Opcion("Encontrar patrones ocultos en los datos", "data") + )), + new Pregunta("¿Qué prefieres resolver?", Arrays.asList( + new Opcion("Problemas de diseño y maquetación", "frontend"), + new Opcion("Problemas de concurrencia y escalabilidad", "backend"), + new Opcion("Problemas de rendimiento en aplicaciones móviles", "mobile"), + new Opcion("Problemas de predicción y análisis de datos", "data") + )), + new Pregunta("¿Qué es lo que más te emociona en tecnología?", Arrays.asList( + new Opcion("La evolución de las interfaces de usuario", "frontend"), + new Opcion("La innovación en la arquitectura de software", "backend"), + new Opcion("Las nuevas capacidades de los dispositivos móviles", "mobile"), + new Opcion("Los avances en inteligencia artificial y análisis de datos", "data") + )), + new Pregunta("¿Qué te gusta hacer en tu tiempo libre?", Arrays.asList( + new Opcion("Diseñar sitios web personales o interfaces", "frontend"), + new Opcion("Hacer proyectos con servidores y APIs", "backend"), + new Opcion("Crear apps móviles para resolver problemas cotidianos", "mobile"), + new Opcion("Hacer análisis de datos para tomar decisiones mejor informadas", "data") + )), + new Pregunta("¿Qué te gustaría dominar?", Arrays.asList( + new Opcion("Animaciones y transiciones en la web", "frontend"), + new Opcion("Arquitectura de microservicios", "backend"), + new Opcion("Optimización de aplicaciones móviles", "mobile"), + new Opcion("Modelos predictivos y análisis de datos", "data") + )), + new Pregunta("¿Qué tipo de problema prefieres resolver en un hackathon?", Arrays.asList( + new Opcion("Mejorar la interfaz de usuario de una aplicación", "frontend"), + new Opcion("Optimizar el rendimiento de una API", "backend"), + new Opcion("Crear una aplicación móvil desde cero", "mobile"), + new Opcion("Generar insights a partir de grandes conjuntos de datos", "data") + )), + new Pregunta("¿Qué prefieres al trabajar en equipo?", Arrays.asList( + new Opcion("Encargarte de la parte visual y de interacción del usuario", "frontend"), + new Opcion("Asegurarte de que la lógica y los datos fluyan correctamente", "backend"), + new Opcion("Hacer que la app funcione bien en diferentes dispositivos", "mobile"), + new Opcion("Proveer métricas y análisis para tomar mejores decisiones", "data") + )), + new Pregunta("¿Cuál es tu prioridad al optimizar código?", Arrays.asList( + new Opcion("Que la interfaz cargue rápido y sea amigable", "frontend"), + new Opcion("Que los servicios backend sean escalables y eficientes", "backend"), + new Opcion("Que la app móvil consuma pocos recursos y sea fluida", "mobile"), + new Opcion("Que el procesamiento de datos sea rápido y preciso", "data") + )), + new Pregunta("¿Qué prefieres al probar una aplicación?", Arrays.asList( + new Opcion("Verificar que el diseño y la usabilidad sean impecables", "frontend"), + new Opcion("Asegurar que las funcionalidades y la lógica sean correctas", "backend"), + new Opcion("Revisar que la app funcione correctamente en múltiples dispositivos", "mobile"), + new Opcion("Validar que los resultados de los análisis sean exactos", "data") + )), + new Pregunta("¿Qué tipo de proyectos sigues en la industria?", Arrays.asList( + new Opcion("Proyectos de diseño web innovador y UX", "frontend"), + new Opcion("Nuevas tecnologías de servidores y backends", "backend"), + new Opcion("Aplicaciones móviles disruptivas y eficientes", "mobile"), + new Opcion("Proyectos de inteligencia artificial y ciencia de datos", "data") + )), + new Pregunta("¿Qué harías para mejorar una plataforma existente?", Arrays.asList( + new Opcion("Mejorar la apariencia y usabilidad de la interfaz", "frontend"), + new Opcion("Optimizar el rendimiento de las consultas y los servidores", "backend"), + new Opcion("Hacer que la plataforma sea accesible desde dispositivos móviles", "mobile"), + new Opcion("Incluir más análisis de datos para obtener mejor información", "data") + )), + new Pregunta("¿Qué aspecto del desarrollo de software te parece más retador?", Arrays.asList( + new Opcion("Hacer que una aplicación web sea visualmente atractiva", "frontend"), + new Opcion("Crear sistemas backend que manejen millones de usuarios", "backend"), + new Opcion("Optimizar la app móvil para diferentes sistemas operativos", "mobile"), + new Opcion("Gestionar grandes volúmenes de datos y extraer conclusiones útiles", "data") + )) + ); + + Scanner scanner = new Scanner(System.in); + System.out.print("Por favor, introduce tu nombre: "); + String nombreAlumno = scanner.nextLine(); + Alumno alumno = new Alumno(nombreAlumno); + + SombreroSeleccionador sombrero = new SombreroSeleccionador(casas, preguntas); + sombrero.asignarCasa(alumno); + } +} diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/JesusAntonioEEscamilla.js b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/JesusAntonioEEscamilla.js new file mode 100644 index 0000000000..6295cb82ae --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/JesusAntonioEEscamilla.js @@ -0,0 +1,170 @@ +/** #36 - JavaScript -> Jesus Antonio Escamilla */ + +/** + * EL SOMBRERO SELECCIONADOR. + * Utilizando la Terminal para pedir datos y agregarlos. + */ + +const readline = require('readline'); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +// Casas y sus puntos iniciales +const house = { + Frontend: 0, + Backend: 0, + Mobile: 0, + Data: 0 +} + +// Preguntas y sus opciones con puntos asignados a cada casa +const questions = [ + { + question: '1-¿Que te apasiona más al programador?', + options: { + a: {text: 'Crear interfaces de usuario', points: { Frontend: 2 }}, + b: {text: 'Desarrollador lógica de negocio', points: { Backend: 2 }}, + c: {text: 'Aplicaciones móviles', points: { Mobile: 2 }}, + d: {text: 'Trabajar con datos y descubrir patrones para mejorar decisiones', points: { Data: 2 }}, + }, + }, + { + question: '2-¿Cuál es tu herramienta favorita?', + options: { + a: { text: 'React o Angular', points: { Frontend: 2 } }, + b: { text: 'Node.js', points: { Backend: 2 } }, + c: { text: 'Swift o Kotlin', points: { Mobile: 2 } }, + d: { text: 'Python y Pandas', points: { Data: 2 } }, + }, + }, + { + question: '3-¿Cuál de estas tareas te resulta más satisfactoria?', + options: { + a: { text: 'Diseñar y estilizar componentes visuales', points: { Frontend: 2 } }, + b: { text: 'Crear APIs y gestionar bases de datos', points: { Backend: 2 } }, + c: { text: 'Optimizar aplicaciones para diferentes dispositivos móviles', points: { Mobile: 2 } }, + d: { text: 'Trabajar con grandes volúmenes de datos y modelos analíticos', points: { Data: 2 } }, + }, + }, + { + question: '4-¿Con cuál de estas tecnologías te sientes más cómodo trabajando?', + options: { + a: { text: 'HTML, CSS, JavaScript', points: { Frontend: 2 } }, + b: { text: 'Python, Java, SQL', points: { Backend: 2 } }, + c: { text: 'Flutter, React Native', points: { Mobile: 2 } }, + d: { text: 'R, SQL, Hadoop', points: { Data: 2 } }, + }, + }, + { + question: '5-¿Qué herramienta o lenguaje prefieres usar para resolver problemas?', + options: { + a: { text: 'Herramientas y frameworks para diseño de interfaces (e.g., Figma, React)', points: { Frontend: 2 } }, + b: { text: 'Lenguajes y frameworks para backend (e.g., Node.js, Django, Spring Boot)', points: { Backend: 2 } }, + c: { text: 'Herramientas de desarrollo móvil (e.g., Xcode, Android Studio)', points: { Mobile: 2 } }, + d: { text: 'Herramientas de análisis de dato (e.g., Jupyter, Tableau, Power BI)', points: { Data: 2 } }, + }, + }, + { + question: '6-¿Cuál de estas actividades disfrutas más?', + options: { + a: { text: 'Crear experiencias de usuario interactivas y responsivas', points: { Frontend: 2 } }, + b: { text: 'Resolver problemas complejos de lógica y optimización de procesos', points: { Backend: 2 } }, + c: { text: 'Construir y probar aplicaciones que funcionen en múltiples dispositivos móviles', points: { Mobile: 2 } }, + d: { text: 'Analizar y visualizar datos para extraer información relevante', points: { Data: 2 } }, + }, + }, + { + question: '7-¿Qué prefieres en un proyecto?', + options: { + a: { text: 'Trabajar en el diseño y la interacción con los usuarios', points: { Frontend: 2 } }, + b: { text: 'Enfocarte en la lógica de negocio y la eficiencia del sistema', points: { Backend: 2 } }, + c: { text: 'Desarrollar para plataformas móviles y trabajar con sus características únicas', points: { Mobile: 2 } }, + d: { text: 'Investigar y analizar datos para proporcionar insights', points: { Data: 2 } }, + }, + }, + { + question: '8-¿Cuál es tu tipo de proyecto ideal?', + options: { + a: { text: 'Un sitio web interactivo y visualmente atractivo', points: { Frontend: 2 } }, + b: { text: 'Un sistema robusto que gestione datos y lógica de negocio', points: { Backend: 2 } }, + c: { text: 'Una aplicación móvil con una experiencia de usuario fluida', points: { Mobile: 2 } }, + d: { text: 'Un dashboard o modelo predictivo que ofrezca información clave', points: { Data: 2 } }, + }, + }, + { + question: '9-¿Qué te da más satisfacción al finalizar un proyecto?', + options: { + a: { text: 'Ver a los usuarios interactuar de manera positiva con tu interfaz', points: { Frontend: 2 } }, + b: { text: 'Saber que tu código maneja de manera eficiente grandes volúmenes de datos', points: { Backend: 2 } }, + c: { text: 'Ver tu aplicación móvil en funcionamiento en diferentes dispositivos', points: { Mobile: 2 } }, + d: { text: 'Proveer información valiosa basada en datos a la empresa', points: { Data: 2 } }, + }, + }, + { + question: '10-¿Qué consideras un reto divertido en el desarrollo?', + options: { + a: { text: 'Mejorar la usabilidad y la estética de una aplicación', points: { Frontend: 2 } }, + b: { text: 'Optimizar la seguridad y el rendimiento de un backend', points: { Backend: 2 } }, + c: { text: 'Resolver problemas de compatibilidad entre diferentes plataformas móviles', points: { Mobile: 2 } }, + d: { text: 'Desarrollar modelos predictivos y manejar bases de datos complejas', points: { Data: 2 } }, + }, + }, +]; + +let currentQuestion = 0; +let studentName = ''; + +// Función para hacer preguntas +function askQuestion() { + if (currentQuestion < questions.length) { + const q = questions[currentQuestion]; + console.log(`\n${q.question}`); + console.log(`a) ${q.options.a.text}`); + console.log(`b) ${q.options.b.text}`); + console.log(`c) ${q.options.c.text}`); + console.log(`d) ${q.options.d.text}`); + + rl.question('Selección una opción (a, b, c, d): ', (answer) => { + const option = q.options[answer.toLowerCase()]; + + if (option) { + Object.keys(option.points).forEach((house) => { + house[house] += option.points[house]; + }); + + currentQuestion++; + askQuestion(); + } else { + console.log('Opción no válida. Intenta de nuevo.'); + askQuestion(); + } + }); + } else { + sortStudent(); + } +} + +// Función para determinar la casa del estudiante +function sortStudent() { + const sortedHouses = Object.entries(house).sort(([, a], [, b]) => b - a); + const topHouse = sortedHouses[0]; + const tiedHouse = sortedHouses.filter(([, points]) => points === topHouse[1]); + + if (tiedHouse.length > 1) { + const chosenHouse = tiedHouse[Math.floor(Math.random() * tiedHouse.length)]; + console.log(`\n¡Vaya, ${studentName}! Fue una decisión complicada, pero te he colocado en ${chosenHouse[0]}!`); + } else { + console.log(`\n${studentName}, te he colocado en ${topHouse[0]}!`); + } + + rl.close(); +} + +// Inicio del programa +rl.question('¿Cuál es tu nombre? ', (name) => { + studentName = name; + askQuestion(); +}); \ No newline at end of file diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/Rafacv23.js b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/Rafacv23.js new file mode 100644 index 0000000000..e29c144395 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/Rafacv23.js @@ -0,0 +1,290 @@ +const readline = require("readline") + +const preguntas = [ + { + pregunta: "¿Qué parte de un proyecto disfrutas más?", + opciones: [ + { + respuesta: "Crear interfaces interactivas y atractivas", + casa: "Frontend", + }, + { + respuesta: "Diseñar la estructura de datos y las bases de datos", + casa: "Backend", + }, + { + respuesta: "Desarrollar aplicaciones móviles", + casa: "Mobile", + }, + { + respuesta: "Implementar sistemas de seguridad y control de acceso", + casa: "Data", + }, + ], + }, + { + pregunta: "¿Cuál es tu lenguaje de programación favorito?", + opciones: [ + { + respuesta: "JavaScript", + casa: "Frontend", + }, + { + respuesta: "Python", + casa: "Backend", + }, + { + respuesta: "Swift", + casa: "Mobile", + }, + { + respuesta: "R", + casa: "Data", + }, + ], + }, + { + pregunta: "¿Qué herramienta te resulta más útil en tu trabajo diario?", + opciones: [ + { + respuesta: "Visual Studio Code", + casa: "Frontend", + }, + { + respuesta: "Git y GitHub", + casa: "Backend", + }, + { + respuesta: "Docker y Kubernetes", + casa: "Mobile", + }, + { + respuesta: "Jupyter Notebooks", + casa: "Data", + }, + ], + }, + { + pregunta: "¿Cómo prefieres gestionar tus proyectos?", + opciones: [ + { + respuesta: "Utilizando versiones de control", + casa: "Frontend", + }, + { + respuesta: "Utilizando un herramienta de planeamiento", + casa: "Backend", + }, + { + respuesta: "Utilizando un herramienta de gestión de proyectos", + casa: "Mobile", + }, + { + respuesta: "Utilizando un herramienta de planificación", + casa: "Data", + }, + ], + }, + { + pregunta: "¿Qué parte de la depuración de código disfrutas más?", + opciones: [ + { + respuesta: "Encontrar errores visuales en las interfaces", + casa: "Frontend", + }, + { + respuesta: "Corregir problemas de rendimiento en el servidor", + casa: "Backend", + }, + { + respuesta: "Desarrollar nuevas características y funciones", + casa: "Mobile", + }, + { + respuesta: "Optimizar algoritmos de procesamiento de datos", + casa: "Data", + }, + ], + }, + { + pregunta: "¿Cuál sería tu rol ideal en un equipo de desarrollo?", + opciones: [ + { + respuesta: "Desarrollador/Diseñador Frontend", + casa: "Frontend", + }, + { + respuesta: "Arquitecto de Soluciones Backend", + casa: "Backend", + }, + { + respuesta: "Desarrollador de Aplicaciones Móviles", + casa: "Mobile", + }, + { + respuesta: "Científico de Datos", + casa: "Data", + }, + ], + }, + { + pregunta: "¿Cómo prefieres aprender nuevas tecnologías?", + opciones: [ + { + respuesta: + "Experimentando con nuevas librerías y frameworks de frontend", + casa: "Frontend", + }, + { + respuesta: + "Trabajando con nuevas tecnologías de servidores y bases de datos", + casa: "Backend", + }, + { + respuesta: "Explorando nuevas plataformas de desarrollo móvil", + casa: "Mobile", + }, + { + respuesta: + "Analizando nuevos algoritmos y técnicas de procesamiento de datos", + casa: "Data", + }, + ], + }, + { + pregunta: "¿Qué tipo de proyectos te motivan más?", + opciones: [ + { + respuesta: "Crear interfaces web interactivas y atractivas", + casa: "Frontend", + }, + { + respuesta: "Desarrollar sistemas robustos y escalables en la nube", + casa: "Backend", + }, + { + respuesta: + "Desarrollar aplicaciones móviles con excelente experiencia de usuario", + casa: "Mobile", + }, + { + respuesta: "Proyectos de análisis y visualización de datos", + casa: "Data", + }, + ], + }, + { + pregunta: "¿Qué tecnología te gustaría dominar en el futuro?", + opciones: [ + { + respuesta: "WebAssembly y animaciones avanzadas en la web", + casa: "Frontend", + }, + { + respuesta: "Inteligencia Artificial y Machine Learning en servidores", + casa: "Backend", + }, + { + respuesta: "Realidad aumentada en aplicaciones móviles", + casa: "Mobile", + }, + { + respuesta: "Big Data y análisis de grandes volúmenes de información", + casa: "Data", + }, + ], + }, + { + pregunta: "¿Cómo te gusta colaborar en un equipo?", + opciones: [ + { + respuesta: "Diseñando y mejorando la experiencia de usuario", + casa: "Frontend", + }, + { + respuesta: "Integrando servicios y APIs en el backend", + casa: "Backend", + }, + { + respuesta: "Asegurando la mejor experiencia en aplicaciones móviles", + casa: "Mobile", + }, + { + respuesta: "Proporcionando análisis detallados a partir de los datos", + casa: "Data", + }, + ], + }, +] + +const puntosCasas = { + Frontend: 0, + Backend: 0, + Mobile: 0, + Data: 0, +} + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}) +const prompt = (query) => new Promise((resolve) => rl.question(query, resolve)) + +;(async () => { + try { + console.log( + "Bienvenido a Hogwarts, la escuela de Programación para magos y brujas del código." + ) + + for (let i = 0; i < preguntas.length; i++) { + const pregunta = preguntas[i] + + console.log(`\n${pregunta.pregunta}`) + pregunta.opciones.forEach((opcion, index) => { + console.log(`${index + 1}) ${opcion.respuesta}`) + }) + + let respuesta = await prompt("Selecciona una opción (1-4): ") + respuesta = parseInt(respuesta) - 1 + + // Validar que la respuesta esté en el rango adecuado + if (respuesta >= 0 && respuesta < pregunta.opciones.length) { + const casaSeleccionada = pregunta.opciones[respuesta].casa + puntosCasas[casaSeleccionada]++ + } else { + console.log( + "Opción inválida, por favor selecciona un número entre 1 y 4." + ) + i-- // Volver a preguntar si la opción es inválida + } + } + + // Encontrar el puntaje más alto + const maxPuntos = Math.max(...Object.values(puntosCasas)) + + // Encontrar todas las casas que tienen el puntaje más alto + const casasEmpatadas = Object.keys(puntosCasas).filter( + (casa) => puntosCasas[casa] === maxPuntos + ) + + let casaGanadora + + if (casasEmpatadas.length > 1) { + // Si hay empate, selecciona una casa al azar + console.log("\nEl sombrero ha tenido dificultades para decidir...") + const indiceAleatorio = Math.floor(Math.random() * casasEmpatadas.length) + casaGanadora = casasEmpatadas[indiceAleatorio] + } else { + // Si no hay empate, simplemente selecciona la casa ganadora + casaGanadora = casasEmpatadas[0] + } + + console.log(`\n¡Felicidades! Perteneces a la casa ${casaGanadora}.`) + rl.close() + } catch (e) { + console.error("Error en la selección", e) + } +})() + +// When done reading prompt, exit program +rl.on("close", () => process.exit(0)) diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/RaulDoezon.js b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/RaulDoezon.js new file mode 100644 index 0000000000..1678938c41 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/RaulDoezon.js @@ -0,0 +1,90 @@ +/* + 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). +*/ + +let userName = ""; +let frontEndHouse = 0; +let backEndHouse = 0; +let mobileHouse = 0; +let dataScienceHouse = 0; +const questions = [ + "1. ¿Qué prefieres jugar?: \na) Super Metroid \nb) Ajedrez \nc) Pokémon Go \nd) Sudoku", + "2. ¿Con qué actividad te identificas más?: \na) Dibujar \nb) Doblar la ropa \nc) Editar fotos en el teléfono \nd) Acomodar la despensa", + "3. ¿Dónde te gusta más escuchar música?: \na) Audífonos \nb) Mini componente \nc) Bocina portatil \nd) Donde sea pero Hi-Res", + "4. ¿Qué superhéroe es tu favorito?: \na) Spider-Man \nb) Superman \nc) Flash \nd) Doctor Strange", + "5. Si volvieras a cursar una materia, ¿cuál sería?: \na) Biología \nb) Cálculo diferencial e integral \nc) Física \nd) Probabilidad y estadística", + "6. Si te regalaran un dispositivo electrónico, ¿cuál elegirías?: \na) MacBook \nb) PC \nc) Smartphone \nd) Raspberry Pi", + "7. ¿Qué recurso utilizarías para administrar tus finanzas?: \na) Aplicación de escritorio \nb) Papel y lápiz \nc) Aplicación móvil \nd) Hoja de cálculo", + "8. ¿Qué te llama más la atención en un sitio web?: \na) La apariencia \nb) Las validaciones en un formulario \nc) La adaptación a medidas pequeñas \nd) La información que muestra", + "9. ¿Qué lenguaje de programación es tu favorito?: \na) JavaScript \nb) Python \nc) Swift \nd) SQL", + "10. ¿Con qué persona te sientes más identificado?: \na) Miguel Durán \nb) Héctor de León \nc) Brais Moure \nd) Rafa Gonzalez Gouveia", +]; + +userName = prompt("Por favor, ingresa tu nombre:"); + +for (let index = 0; index < questions.length; index++) { + let quiz = prompt(questions[index]); + + switch (quiz.toLowerCase()) { + case "a": + frontEndHouse += 4; + break; + + case "b": + backEndHouse += 4; + break; + + case "c": + mobileHouse += 4; + break; + + case "d": + dataScienceHouse += 4; + break; + + default: + alert("Por favor, selecciona una opción válida."); + + index--; + break; + } +} + +let allHouses = { + "Front-end": frontEndHouse, + "Back-end": backEndHouse, + "Mobile": mobileHouse, + "Data Science": dataScienceHouse, +}; +let houseNames = Object.keys(allHouses); +let higherScore = Math.max.apply(null, houseNames.map((houseScore) => allHouses[houseScore])); +let chosenHouse = houseNames.reduce((house, score) => { + if (allHouses[score] === higherScore) { + house.push(score); + } + + return house; +}, []); +let randomSelection = Math.round(Math.random() * (chosenHouse.length - 1) + 1) - 1; + +if (chosenHouse.length > 1) { + console.log(`${userName}, la decisión ha sido complicada, pero pertenecerás a la casa de ${chosenHouse[randomSelection]}.`); +} else { + console.log(`${userName}, pertenecerás a la casa de ${chosenHouse[0]}.`); +} diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/miguelex.js b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/miguelex.js new file mode 100644 index 0000000000..8a59254143 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/javascript/miguelex.js @@ -0,0 +1,251 @@ +const readline = require('readline'); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +class Casa { + constructor(nombre) { + this.nombre = nombre; + this.puntos = 0; + } + + getNombre() { + return this.nombre; + } + + agregarPuntos(puntos) { + this.puntos += puntos; + } + + getPuntos() { + return this.puntos; + } +} + +class Alumno { + constructor(nombre) { + this.nombre = nombre; + } + + getNombre() { + return this.nombre; + } +} + +class Pregunta { + constructor(pregunta, opciones) { + this.pregunta = pregunta; + this.opciones = opciones; + } + + mostrarPregunta() { + console.log(this.pregunta); + this.opciones.forEach((opcion, index) => { + console.log(`${index + 1}: ${opcion.texto}`); + }); + } + + obtenerCasaSegunRespuesta(respuesta) { + return this.opciones[respuesta - 1].casa; + } +} + +class SombreroSeleccionador { + constructor(casas, preguntas) { + this.casas = casas; + this.preguntas = preguntas; + } + + async asignarCasa(alumno) { + const preguntasSeleccionadas = this.seleccionarPreguntas(); + for (let pregunta of preguntasSeleccionadas) { + pregunta.mostrarPregunta(); + let respuesta = await this.leerRespuesta(); + let casa = pregunta.obtenerCasaSegunRespuesta(respuesta); + this.casas[casa].agregarPuntos(1); + } + + this.mostrarResultado(alumno); + rl.close(); + } + + seleccionarPreguntas() { + const preguntasSeleccionadas = []; + const indicesSeleccionados = new Set(); + + while (preguntasSeleccionadas.length < 10) { + let indice = Math.floor(Math.random() * this.preguntas.length); + if (!indicesSeleccionados.has(indice)) { + indicesSeleccionados.add(indice); + preguntasSeleccionadas.push(this.preguntas[indice]); + } + } + + return preguntasSeleccionadas; + } + + async leerRespuesta() { + return new Promise((resolve) => { + rl.question("Selecciona una opción (1-4): ", (respuesta) => { + resolve(parseInt(respuesta)); + }); + }); + } + + mostrarResultado(alumno) { + const casasOrdenadas = Object.values(this.casas).sort((a, b) => b.getPuntos() - a.getPuntos()); + + const maxPuntos = casasOrdenadas[0].getPuntos(); + const ganadoras = casasOrdenadas.filter(casa => casa.getPuntos() === maxPuntos); + + let ganadora; + if (ganadoras.length > 1) { + console.log("\n\nLa decisión fue difícil..."); + ganadora = ganadoras[Math.floor(Math.random() * ganadoras.length)]; + } else { + ganadora = ganadoras[0]; + } + + console.log(`\n\n ${alumno.getNombre()}, el sombrero seleccionador te ha asignado a la casa ${ganadora.getNombre().toUpperCase()}!!!!\n`); + } +} + + +const casas = { + 'frontend': new Casa('Frontend'), + 'backend': new Casa('Backend'), + 'mobile': new Casa('Mobile'), + 'data': new Casa('Data') +}; + +const preguntas = [ + new Pregunta("¿Qué prefieres?", [ + { texto: 'Diseñar interfaces', casa: 'frontend' }, + { texto: 'Crear APIs', casa: 'backend' }, + { texto: 'Desarrollar apps móviles', casa: 'mobile' }, + { texto: 'Analizar datos', casa: 'data' } + ]), + new Pregunta("¿Cuál es tu lenguaje de programación favorito?", [ + { texto: 'JavaScript', casa: 'frontend' }, + { texto: 'Python', casa: 'backend' }, + { texto: 'Kotlin', casa: 'mobile' }, + { texto: 'R', casa: 'data' } + ]), + new Pregunta("¿Qué herramienta utilizas más a menudo?", [ + { texto: 'Figma o Sketch', casa: 'frontend' }, + { texto: 'Docker o Kubernetes', casa: 'backend' }, + { texto: 'Android Studio o Xcode', casa: 'mobile' }, + { texto: 'Jupyter Notebooks o Excel', casa: 'data' } + ]), + new Pregunta("¿Qué te interesa más aprender?", [ + { texto: 'HTML/CSS y JavaScript avanzado', casa: 'frontend' }, + { texto: 'Patrones de diseño y arquitectura de software', casa: 'backend' }, + { texto: 'Programación nativa para dispositivos móviles', casa: 'mobile' }, + { texto: 'Estadística y Machine Learning', casa: 'data' } + ]), + new Pregunta("¿Qué tipo de proyecto te gustaría liderar?", [ + { texto: 'Un sitio web interactivo y atractivo', casa: 'frontend' }, + { texto: 'Una plataforma escalable con microservicios', casa: 'backend' }, + { texto: 'Una app móvil innovadora', casa: 'mobile' }, + { texto: 'Un sistema de recomendación basado en datos', casa: 'data' } + ]), + new Pregunta("¿Qué es lo más importante para ti en un proyecto?", [ + { texto: 'La experiencia de usuario', casa: 'frontend' }, + { texto: 'El rendimiento y la escalabilidad', casa: 'backend' }, + { texto: 'La adaptabilidad a diferentes dispositivos', casa: 'mobile' }, + { texto: 'La precisión de los análisis', casa: 'data' } + ]), + new Pregunta("¿Qué prefieres trabajar?", [ + {texto : 'En un entorno donde el diseño visual es clave', casa :'frontend'}, + {texto : 'En la lógica del negocio y la arquitectura', casa :'backend'}, + {texto : 'En apps móviles con buen rendimiento', casa :'mobile'}, + {texto : 'En el análisis y visualización de datos', casa :'data'} + ]), + new Pregunta("¿Qué framework te parece más interesante?", [ + {texto: 'React o Angular', casa :'frontend'}, + {texto : 'Spring o Django', casa :'backend'}, + {texto : 'Flutter o React Native', casa :'mobile'}, + {texto : 'TensorFlow o Pandas', casa :'data'} + ]), + new Pregunta("¿Qué tipo de reto disfrutas más?", [ + {texto : 'Hacer que un sitio web sea accesible y rápido', casa :'frontend'}, + {texto : 'Optimizar la comunicación entre servicios', casa :'backend'}, + {texto : 'Mejorar la experiencia del usuario en móviles', casa :'mobile'}, + {texto : 'Encontrar patrones ocultos en los datos', casa :'data'} + ]), + new Pregunta("¿Qué prefieres resolver?", [ + {texto : 'Problemas de diseño y maquetación', casa :'frontend'}, + {texto : 'Problemas de concurrencia y escalabilidad', casa :'backend'}, + {texto : 'Problemas de rendimiento en aplicaciones móviles', casa :'mobile'}, + {texto : 'Problemas de predicción y análisis de datos', casa :'data'} + ]), + new Pregunta("¿Qué es lo que más te emociona en tecnología?", [ + {texto : 'La evolución de las interfaces de usuario', casa :'frontend'}, + {texto : 'La innovación en la arquitectura de software', casa :'backend'}, + {texto : 'Las nuevas capacidades de los dispositivos móviles', casa :'mobile'}, + {texto : 'Los avances en inteligencia artificial y análisis de datos', casa : 'data'} + ]), + new Pregunta("¿Qué te gusta hacer en tu tiempo libre?", [ + {texto : 'Diseñar sitios web personales o interfaces', casa: 'frontend'}, + {texto : 'Hacer proyectos con servidores y APIs', casa: 'backend'}, + {texto : 'Crear apps móviles para resolver problemas cotidianos', casa: 'mobile'}, + {texto : 'Hacer análisis de datos para tomar decisiones mejor informadas', casa: 'data'} + ]), + new Pregunta("¿Qué te gustaría dominar?", [ + {texto : 'Animaciones y transiciones en la web', casa: 'frontend'}, + {texto : 'Arquitectura de microservicios', casa: 'backend'}, + {texto : 'Optimización de aplicaciones móviles', casa: 'mobile'}, + {texto : 'Modelos predictivos y análisis de datos', casa: 'data'} + ]), + new Pregunta("¿Qué tipo de problema prefieres resolver en un hackathon?", [ + {texto : 'Mejorar la interfaz de usuario de una aplicación', casa: 'frontend'}, + {texto : 'Optimizar el rendimiento de una API', casa: 'backend'}, + {texto : 'Crear una aplicación móvil desde cero', casa: 'mobile'}, + {texto : 'Generar insights a partir de grandes conjuntos de datos', casa: 'data'} + ]), + new Pregunta("¿Qué prefieres al trabajar en equipo?", [ + {texto : 'Encargarte de la parte visual y de interacción del usuario', casa: 'frontend'}, + {texto : 'Asegurarte de que la lógica y los datos fluyan correctamente', casa: 'backend'}, + {texto : 'Hacer que la app funcione bien en diferentes dispositivos', casa: 'mobile'}, + {texto : 'Proveer métricas y análisis para tomar mejores decisiones', casa: 'data'} + ]), + new Pregunta("¿Cuál es tu prioridad al optimizar código?", [ + {texto : 'Que la interfaz cargue rápido y sea amigable', casa: 'frontend'}, + {texto : 'Que los servicios backend sean escalables y eficientes', casa: 'backend'}, + {texto : 'Que la app móvil consuma pocos recursos y sea fluida', casa: 'mobile'}, + {texto : 'Que el procesamiento de datos sea rápido y preciso', casa: 'data'} + ]), + new Pregunta("¿Qué prefieres al probar una aplicación?", [ + {texto : 'Verificar que el diseño y la usabilidad sean impecables', casa: 'frontend'}, + {texto : 'Asegurar que las funcionalidades y la lógica sean correctas', casa :'backend'}, + {texto : 'Revisar que la app funcione correctamente en múltiples dispositivos', casa : 'mobile'}, + {texto : 'Validar que los resultados de los análisis sean exactos', casa : 'data'} + ]), + new Pregunta("¿Qué tipo de proyectos sigues en la industria?", [ + {texto : 'Proyectos de diseño web innovador y UX', casa : 'frontend'}, + {texto : 'Nuevas tecnologías de servidores y backends', casa : 'backend'}, + {texto : 'Aplicaciones móviles disruptivas y eficientes', casa : 'mobile'}, + {texto : 'Proyectos de inteligencia artificial y ciencia de datos', casa : 'data'} + ]), + new Pregunta("¿Qué harías para mejorar una plataforma existente?", [ + {texto : 'Mejorar la apariencia y usabilidad de la interfaz', casa : 'frontend'}, + {texto : 'Optimizar el rendimiento de las consultas y los servidores', casa : 'backend'}, + {texto : 'Hacer que la plataforma sea accesible desde dispositivos móviles', casa : 'mobile'}, + {texto : 'Incluir más análisis de datos para obtener mejor información', casa : 'data'} + ]), + new Pregunta("¿Qué aspecto del desarrollo de software te parece más retador?", [ + {texto : 'Hacer que una aplicación web sea visualmente atractiva', casa : 'frontend'}, + {texto : 'Crear sistemas backend que manejen millones de usuarios', casa : 'backend'}, + {texto : 'Optimizar la app móvil para diferentes sistemas operativos', casa : 'mobile'}, + {texto : 'Gestionar grandes volúmenes de datos y extraer conclusiones útiles', casa : 'data'} + ]), +]; + +rl.question("Por favor, introduce tu nombre: ", (nombreAlumno) => { + const alumno = new Alumno(nombreAlumno); + + const sombrero = new SombreroSeleccionador(casas, preguntas); + sombrero.asignarCasa(alumno); +}); diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/php/miguelex.php b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/php/miguelex.php new file mode 100644 index 0000000000..264d6dc23d --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/php/miguelex.php @@ -0,0 +1,245 @@ +nombre = $nombre; + } + + public function getNombre(): string { + return $this->nombre; + } + + public function agregarPuntos(int $puntos): void { + $this->puntos += $puntos; + } + + public function getPuntos(): int { + return $this->puntos; + } +} + +class Alumno { + private string $nombre; + + public function __construct(string $nombre) { + $this->nombre = $nombre; + } + + public function getNombre(): string { + return $this->nombre; + } +} + +class Pregunta { + private string $pregunta; + private array $opciones; // ['opción' => 'Casa'] + + public function __construct(string $pregunta, array $opciones) { + $this->pregunta = $pregunta; + $this->opciones = $opciones; + } + + public function mostrarPregunta(): void { + echo $this->pregunta . PHP_EOL; + foreach ($this->opciones as $index => $opcion) { + echo ($index + 1) . ": " . $opcion['texto'] . PHP_EOL; + } + } + + public function obtenerCasaSegunRespuesta(int $respuesta): string { + return $this->opciones[$respuesta - 1]['casa']; + } +} + +class SombreroSeleccionador { + private array $casas; + private array $preguntas; + + public function __construct(array $casas, array $preguntas) { + $this->casas = $casas; + $this->preguntas = $preguntas; + } + + public function asignarCasa(Alumno $alumno): void { + $preguntasSeleccionadas = $this->seleccionarPreguntas(); + foreach ($preguntasSeleccionadas as $pregunta) { + $pregunta->mostrarPregunta(); + $respuesta = (int)readline("Selecciona una opción (1-4): "); + $casa = $pregunta->obtenerCasaSegunRespuesta($respuesta); + $this->casas[$casa]->agregarPuntos(1); + } + + $this->mostrarResultado($alumno); + } + + private function seleccionarPreguntas(): array { + $preguntasSeleccionadas = array_rand($this->preguntas, 10); + return array_map(fn($indice) => $this->preguntas[$indice], $preguntasSeleccionadas); + } + + private function mostrarResultado(Alumno $alumno): void { + usort($this->casas, fn($casa1, $casa2) => $casa2->getPuntos() <=> $casa1->getPuntos()); + + $maxPuntos = $this->casas[0]->getPuntos(); + $ganadoras = array_filter($this->casas, fn($casa) => $casa->getPuntos() === $maxPuntos); + + if (count($ganadoras) > 1) { + echo "\n\nLa decisión fue difícil...\n"; + $ganadora = $ganadoras[array_rand($ganadoras)]; + } else { + $ganadora = $ganadoras[0]; + } + + echo "\n\n ".$alumno->getNombre() . ", el sombrero seleccionador te ha asignado a la casa " . strtoupper($ganadora->getNombre()) . "!!!!\n" . PHP_EOL; + } +} + +$casas = [ + 'frontend' => new BaseCasa('Frontend'), + 'backend' => new BaseCasa('Backend'), + 'mobile' => new BaseCasa('Mobile'), + 'data' => new BaseCasa('Data') +]; + +$preguntas = [ + new Pregunta("¿Qué prefieres?", [ + ['texto' => 'Diseñar interfaces', 'casa' => 'frontend'], + ['texto' => 'Crear APIs', 'casa' => 'backend'], + ['texto' => 'Desarrollar apps móviles', 'casa' => 'mobile'], + ['texto' => 'Analizar datos', 'casa' => 'data'] + ]), + new Pregunta("¿Cuál es tu lenguaje de programación favorito?", [ + ['texto' => 'JavaScript', 'casa' => 'frontend'], + ['texto' => 'Python', 'casa' => 'backend'], + ['texto' => 'Kotlin', 'casa' => 'mobile'], + ['texto' => 'R', 'casa' => 'data'] + ]), + new Pregunta("¿Qué herramienta utilizas más a menudo?", [ + ['texto' => 'Figma o Sketch', 'casa' => 'frontend'], + ['texto' => 'Docker o Kubernetes', 'casa' => 'backend'], + ['texto' => 'Android Studio o Xcode', 'casa' => 'mobile'], + ['texto' => 'Jupyter Notebooks o Excel', 'casa' => 'data'] + ]), + new Pregunta("¿Qué te interesa más aprender?", [ + ['texto' => 'HTML/CSS y JavaScript avanzado', 'casa' => 'frontend'], + ['texto' => 'Patrones de diseño y arquitectura de software', 'casa' => 'backend'], + ['texto' => 'Programación nativa para dispositivos móviles', 'casa' => 'mobile'], + ['texto' => 'Estadística y Machine Learning', 'casa' => 'data'] + ]), + new Pregunta("¿Qué tipo de proyecto te gustaría liderar?", [ + ['texto' => 'Un sitio web interactivo y atractivo', 'casa' => 'frontend'], + ['texto' => 'Una plataforma escalable con microservicios', 'casa' => 'backend'], + ['texto' => 'Una app móvil innovadora', 'casa' => 'mobile'], + ['texto' => 'Un sistema de recomendación basado en datos', 'casa' => 'data'] + ]), + new Pregunta("¿Qué es lo más importante para ti en un proyecto?", [ + ['texto' => 'La experiencia de usuario', 'casa' => 'frontend'], + ['texto' => 'El rendimiento y la escalabilidad', 'casa' => 'backend'], + ['texto' => 'La adaptabilidad a diferentes dispositivos', 'casa' => 'mobile'], + ['texto' => 'La precisión de los análisis', 'casa' => 'data'] + ]), + new Pregunta("¿Qué prefieres trabajar?", [ + ['texto' => 'En un entorno donde el diseño visual es clave', 'casa' => 'frontend'], + ['texto' => 'En la lógica del negocio y la arquitectura', 'casa' => 'backend'], + ['texto' => 'En apps móviles con buen rendimiento', 'casa' => 'mobile'], + ['texto' => 'En el análisis y visualización de datos', 'casa' => 'data'] + ]), + new Pregunta("¿Qué framework te parece más interesante?", [ + ['texto' => 'React o Angular', 'casa' => 'frontend'], + ['texto' => 'Spring o Django', 'casa' => 'backend'], + ['texto' => 'Flutter o React Native', 'casa' => 'mobile'], + ['texto' => 'TensorFlow o Pandas', 'casa' => 'data'] + ]), + new Pregunta("¿Qué tipo de reto disfrutas más?", [ + ['texto' => 'Hacer que un sitio web sea accesible y rápido', 'casa' => 'frontend'], + ['texto' => 'Optimizar la comunicación entre servicios', 'casa' => 'backend'], + ['texto' => 'Mejorar la experiencia del usuario en móviles', 'casa' => 'mobile'], + ['texto' => 'Encontrar patrones ocultos en los datos', 'casa' => 'data'] + ]), + new Pregunta("¿Qué prefieres resolver?", [ + ['texto' => 'Problemas de diseño y maquetación', 'casa' => 'frontend'], + ['texto' => 'Problemas de concurrencia y escalabilidad', 'casa' => 'backend'], + ['texto' => 'Problemas de rendimiento en aplicaciones móviles', 'casa' => 'mobile'], + ['texto' => 'Problemas de predicción y análisis de datos', 'casa' => 'data'] + ]), + new Pregunta("¿Qué es lo que más te emociona en tecnología?", [ + ['texto' => 'La evolución de las interfaces de usuario', 'casa' => 'frontend'], + ['texto' => 'La innovación en la arquitectura de software', 'casa' => 'backend'], + ['texto' => 'Las nuevas capacidades de los dispositivos móviles', 'casa' => 'mobile'], + ['texto' => 'Los avances en inteligencia artificial y análisis de datos', 'casa' => 'data'] + ]), + new Pregunta("¿Qué te gusta hacer en tu tiempo libre?", [ + ['texto' => 'Diseñar sitios web personales o interfaces', 'casa' => 'frontend'], + ['texto' => 'Hacer proyectos con servidores y APIs', 'casa' => 'backend'], + ['texto' => 'Crear apps móviles para resolver problemas cotidianos', 'casa' => 'mobile'], + ['texto' => 'Hacer análisis de datos para tomar decisiones mejor informadas', 'casa' => 'data'] + ]), + new Pregunta("¿Qué te gustaría dominar?", [ + ['texto' => 'Animaciones y transiciones en la web', 'casa' => 'frontend'], + ['texto' => 'Arquitectura de microservicios', 'casa' => 'backend'], + ['texto' => 'Optimización de aplicaciones móviles', 'casa' => 'mobile'], + ['texto' => 'Modelos predictivos y análisis de datos', 'casa' => 'data'] + ]), + new Pregunta("¿Qué tipo de problema prefieres resolver en un hackathon?", [ + ['texto' => 'Mejorar la interfaz de usuario de una aplicación', 'casa' => 'frontend'], + ['texto' => 'Optimizar el rendimiento de una API', 'casa' => 'backend'], + ['texto' => 'Crear una aplicación móvil desde cero', 'casa' => 'mobile'], + ['texto' => 'Generar insights a partir de grandes conjuntos de datos', 'casa' => 'data'] + ]), + new Pregunta("¿Qué prefieres al trabajar en equipo?", [ + ['texto' => 'Encargarte de la parte visual y de interacción del usuario', 'casa' => 'frontend'], + ['texto' => 'Asegurarte de que la lógica y los datos fluyan correctamente', 'casa' => 'backend'], + ['texto' => 'Hacer que la app funcione bien en diferentes dispositivos', 'casa' => 'mobile'], + ['texto' => 'Proveer métricas y análisis para tomar mejores decisiones', 'casa' => 'data'] + ]), + new Pregunta("¿Cuál es tu prioridad al optimizar código?", [ + ['texto' => 'Que la interfaz cargue rápido y sea amigable', 'casa' => 'frontend'], + ['texto' => 'Que los servicios backend sean escalables y eficientes', 'casa' => 'backend'], + ['texto' => 'Que la app móvil consuma pocos recursos y sea fluida', 'casa' => 'mobile'], + ['texto' => 'Que el procesamiento de datos sea rápido y preciso', 'casa' => 'data'] + ]), + new Pregunta("¿Qué prefieres al probar una aplicación?", [ + ['texto' => 'Verificar que el diseño y la usabilidad sean impecables', 'casa' => 'frontend'], + ['texto' => 'Asegurar que las funcionalidades y la lógica sean correctas', 'casa' => 'backend'], + ['texto' => 'Revisar que la app funcione correctamente en múltiples dispositivos', 'casa' => 'mobile'], + ['texto' => 'Validar que los resultados de los análisis sean exactos', 'casa' => 'data'] + ]), + new Pregunta("¿Qué tipo de proyectos sigues en la industria?", [ + ['texto' => 'Proyectos de diseño web innovador y UX', 'casa' => 'frontend'], + ['texto' => 'Nuevas tecnologías de servidores y backends', 'casa' => 'backend'], + ['texto' => 'Aplicaciones móviles disruptivas y eficientes', 'casa' => 'mobile'], + ['texto' => 'Proyectos de inteligencia artificial y ciencia de datos', 'casa' => 'data'] + ]), + new Pregunta("¿Qué harías para mejorar una plataforma existente?", [ + ['texto' => 'Mejorar la apariencia y usabilidad de la interfaz', 'casa' => 'frontend'], + ['texto' => 'Optimizar el rendimiento de las consultas y los servidores', 'casa' => 'backend'], + ['texto' => 'Hacer que la plataforma sea accesible desde dispositivos móviles', 'casa' => 'mobile'], + ['texto' => 'Incluir más análisis de datos para obtener mejor información', 'casa' => 'data'] + ]), + new Pregunta("¿Qué aspecto del desarrollo de software te parece más retador?", [ + ['texto' => 'Hacer que una aplicación web sea visualmente atractiva', 'casa' => 'frontend'], + ['texto' => 'Crear sistemas backend que manejen millones de usuarios', 'casa' => 'backend'], + ['texto' => 'Optimizar la app móvil para diferentes sistemas operativos', 'casa' => 'mobile'], + ['texto' => 'Gestionar grandes volúmenes de datos y extraer conclusiones útiles', 'casa' => 'data'] + ]), + +]; + + +echo "Bienvenido al sombrero seleccionador de Hogwarts de programación.\n"; +$nombreAlumno = readline("Por favor, introduce tu nombre: "); +$alumno = new Alumno($nombreAlumno); + +$sombrero = new SombreroSeleccionador($casas, $preguntas); +$sombrero->asignarCasa($alumno); + + diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/Alecraft8.py b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/Alecraft8.py new file mode 100644 index 0000000000..d8c113acc4 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/Alecraft8.py @@ -0,0 +1,75 @@ +from random import randint + +# Array de Preguntas del Sombrero + +preguntas = [ + "¿Te sientes cómodo manejando servidores?", + "¿Eres bueno con Javascript y CSS?", + "¿Manejas bases de datos?", + "¿Programas en Python, Ruby, C, u otro lenguaje de Backend?", + "¿Te gusta tomar café?", + "¿Haz hecho algun proyecto de páginas web?", + "¿Conoces tecnologías de manejo de datos?", + "¿Te gusta programar programas de escritorio?", + "¿Usas PHP?", + "¿Usas Kotlin y/o Java?" +] + +# Variables de respuestas + +n = "no" +s = "si" +l = "lo manejo" +m = "no mucho" + +# Posibles variaciones de respuestas +# N de Array = N de Preguntas + +responses = { + "Frontend": [n, s, n, n, m, l, n, m, m, m], + "Backend": [l, m, l, s, s, s, l, l, l, l], + "Mobile": [m, l, m, m, l, n, m, n, n, s], + "Data": [s, n, s, l, n, m, s, s, s, n] + } + +houses_points = { + "Frontend": 0, + "Backend": 0, + "Mobile": 0, + "Data": 0 + } + +def main(): + name = input("Ingrese el nombre del alumno: ") + print("Bienvenido al Hogwarts Express, %s!" % (name)) + print("Este es tu sombrero seleccionador, encuentra tu camino hacia la escuela de programación de Hogwarts.") + print("Empezamos las preguntas.") + for pregunta in range(len(preguntas)): + bad_answer = True + while bad_answer: + respuesta = input(preguntas[pregunta] + " (Si/No/No mucho/Lo manejo): ").lower() + if respuesta in ["si", "no", "lo manejo", "no mucho"]: + for i in responses.keys(): + if responses[i][pregunta] == respuesta: + houses_points[i] += 1 + bad_answer = False + else: + print("Respuesta incorrecta, intenta nuevamente.") + + casas_mas_probables = [] + + for i in houses_points.keys(): + casas_mas_probables.append((houses_points[i], i)) + casas_mas_probables.sort(reverse=True) + + casa_mas_probable = 0 + + if casas_mas_probables[0][0] == casas_mas_probables[1][0]: + print("La decision ha sido dificil...") + casa_mas_probable = randint(0,1) + + return name, casas_mas_probables[casa_mas_probable][1] + +if __name__ == "__main__": + nombre_alumno, estancia = main() + print("¡%s, te ha tocado %s!" % (nombre_alumno, estancia)) diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/CesarCarmona30.py b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/CesarCarmona30.py new file mode 100644 index 0000000000..647b80f92b --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/CesarCarmona30.py @@ -0,0 +1,138 @@ +''' + EJERCICIO +''' + +import random, time + +houses = { + "a": ["Frontend", 0], + "b": ["Backend", 0], + "c": ["Desarrollo de videojuegos", 0], + "d": ["Ciberseguridad", 0] +} + +pets = { + "Frontend": "𖤍", + "Backend": "𓅓", + "Desarrollo de videojuegos": "𓅛", + "Ciberseguridad": "𓃠" +} + +print(f"""Bienvenido a la escuela de la programación de Hogwarts para magos y brujas del código. +A continuación el sombrero te guiará a través de preguntas para encontrar tu camino hacia tu casa ideal. +Cuál de estás casas será la que te consolide...\n""") + +for house, animal in pets.items(): + print(f'{animal} {house} {animal}') + +name = input("\nEmpecemos... ¿Cuál es tu nombre?: ") + +questions = [ + { 1: "¿Qué parte de un proyecto te resulta más interesante?", + "options": { + "a": "Crear una interfaz de usuario atractiva y fácil de usar.", + "b": "Desarrollar la lógica de negocio y gestionar bases de datos.", + "c": "Diseñar mecánicas y físicas de inmersivas.", + "d": "Asegurar la protección de los datos y prevenir ataques." + }}, + { 2: "¿Qué herramienta preferirías utilizar?", + "options": { + "a": "Figma o Sketch.", + "b": "Docker o Kubernetes.", + "c": "Unity o Unreal Engine.", + "d": "Wireshark o Burp Suite." + }}, + { 3: "¿Qué tipo de errores disfrutas resolver?", + "options": { + "a": "Fallos de estilo o funcionalidad en una página web.", + "b": "Bugs en la lógica del servidor o en una base de datos.", + "c": "Problemas de comportamiento o física en un juego.", + "d": "Vulnerabilidades en el sistema o posibles puntos de ataque." + }}, + { 4: "Lenguaje de programación (o tecnología) favorito:", + "options": { + "a": "JavaScript o TypeScript.", + "b": "Python, Java o Node.js.", + "c": "C++ o C#.", + "d": "C, Python o Bash." + }}, + { 5: "¿Qué prefieres optimizar en un proyecto?", + "options": { + "a": "La experiencia de usuario y la velocidad de carga de la interfaz.", + "b": "El rendimiento del servidor y las consultas de la base de datos.", + "c": "Los gráficos y la jugabilidad en tiempo real.", + "d": "La seguridad de los datos y la prevención de intrusiones." + }}, + { 6: "¿Qué tipo de desafíos te emocionan más?", + "options": { + "a": "Crear animaciones fluidas y transiciones en la interfaz.", + "b": "Diseñar una API robusta y eficiente.", + "c": "Implementar inteligencia artificial para NPCs en un videojuego.", + "d": "Descubrir y mitigar una nueva vulnerabilidad de seguridad." + }}, + { 7: "¿Qué tecnología te gustaría dominar?", + "options": { + "a": "React, Vue o Angular", + "b": "Express, Django o Flask", + "c": "Unreal Engine o Unity", + "d": "Metasploit o herramientas de análisis forense digital." + }}, + { 8: "¿En qué área preferirías trabajar a largo plazo?", + "options": { + "a": "Creación de interfaces y experiencias de usuario visuales.", + "b": "Diseño de la lógica interna y los servicios de backend.", + "c": "Desarrollo de mundos y mecánicas en videojuegos.", + "d": "Auditoría de seguridad y pentesting." + }}, + { 9: "¿Qué proyecto te resulta más atractivo?", + "options": { + "a": "Desarrollar una aplicación web interactiva y dinámica.", + "b": "Crear una API que sirva datos a múltiples plataformas.", + "c": "Desarrollar un videojuego inmersivo en 3D.", + "d": "Desarrollar un sistema de protección contra ataques DDoS." + }}, + { 10: "¿Qué prefieres como objetivo principal en tu trabajo?", + "options": { + "a": "Hacer que la aplicación sea visualmente atractiva y fácil de usar.", + "b": "Asegurarte de que la aplicación funcione sin problemas en el servidor.", + "c": "Crear una experiencia de juego envolvente y divertida.", + "d": "Garantizar que los sistemas estén seguros contra ataques." + }} +] + + +for id, question in enumerate(questions): + print(f"\nPregunta {id + 1}: {question[id + 1]}") + for option, answer in question["options"].items(): + print(f"{option}) {answer}") + + reply = input("Elige una opción:\n>_ ").lower() + + while reply not in question["options"]: + reply = input("Opción no válida. Por favor intenta de nuevo. a) b) c) o d): ").lower() + + houses[reply][1] += 1 + +max_score = max(house[1] for house in houses.values()) +winning_houses = [house_name for house_name, house in houses.items() if house[1] == max_score] + +chosen_house = None + +print(f"¡Felicidades {name.capitalize()}!") + +if len(winning_houses) > 1: + chosen_house_key = random.choice(winning_houses) + chosen_house = houses[chosen_house_key][0] + print(f"¡La decisión ha sido complicada! Pero finalmente, el sombrero te ha asignado a la casa...") +else: + chosen_house = houses[winning_houses[0]][0] + print(f"El sombrero te ha asignado a la casa...") + +for sec in range(1, 4): + time.sleep(1) + print('.' * sec) + +time.sleep(1) +print(f'{pets[chosen_house]}' * 20, end='') +print(f"\n──⊹¡{chosen_house.upper()}!⊹──") +print(f'{pets[chosen_house]}' * 20, end='') \ No newline at end of file diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/hozlucas28.py b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/hozlucas28.py new file mode 100644 index 0000000000..23c5a92e82 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/hozlucas28.py @@ -0,0 +1,227 @@ +# pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring,redefined-outer-name + +from typing import TypedDict, TypeVar, Literal, Any +from random import choice + + +# ---------------------------------------------------------------------------- # +# TYPES # +# ---------------------------------------------------------------------------- # + +T = TypeVar("T", bound=str) + + +class Question[T](TypedDict): + correct_answer: T + options: list[T] + points: float + question: str + + +QuestionsPerHouse = TypedDict( + "QuestionsPerHouse", + { + "backend": tuple[ + Question[Literal["Java", "JavaScript", "Python", "Ruby"]], + Question[Literal["MySQL", "MongoDB", "PostgreSQL", "SQLite"]], + ], + "data": tuple[ + Question[ + Literal[ + "Data analysis", + "Data visualization", + "Data mining", + "Data modeling", + ] + ], + Question[Literal["Python", "R", "SQL", "Julia"]], + ], + "frontend": tuple[ + Question[Literal["HTML", "CSS", "JavaScript", "Python"]], + Question[Literal["React", "Angular", "Vue", "Ember"]], + ], + "mobile": tuple[ + Question[Literal["iOS", "Android", "React Native", "Flutter"]], + Question[Literal["Swift", "Kotlin", "Java", "Objective-C"]], + ], + }, +) + + +# ---------------------------------------------------------------------------- # +# UTILS # +# ---------------------------------------------------------------------------- # + + +def list_to_long_disjunction(*, _list: list[T]) -> str: + rtn: str = str(object=_list[0]) + + for element in _list[1 : len(_list) - 1]: + rtn += f", {element}" + + if len(_list) > 1: + rtn += f", and {str(object=_list[-1])}" + + return rtn + + +def make_question(question: Question[T]) -> float: + user_answer: str = ( + input( + f"> {question.get('question')} " + f"({list_to_long_disjunction(_list=question.get('options'))}): " + ) + .strip() + .upper() + ) + + uppercased_options: list[str] = [ + str(object=opt).upper() for opt in question.get("options") + ] + + while user_answer not in uppercased_options: + print("\n> Invalid option! Try again...") + + user_answer: str = ( + input( + f"\n> {question.get('question')} " + f"({list_to_long_disjunction(_list=question.get('options'))}): " + ) + .strip() + .upper() + ) + + return ( + question.get("points") + if user_answer == str(object=question.get("correct_answer")).upper() + else 0 + ) + + +# ---------------------------------------------------------------------------- # +# MAIN # +# ---------------------------------------------------------------------------- # + +questions_per_house: QuestionsPerHouse = { + "backend": ( + { + "correct_answer": "JavaScript", + "options": ["Java", "JavaScript", "Python", "Ruby"], + "question": "What is the primary language used in backend development?", + "points": 5, + }, + { + "correct_answer": "PostgreSQL", + "options": ["MySQL", "MongoDB", "PostgreSQL", "SQLite"], + "points": 5, + "question": "Which database is commonly used for storing data in backend applications?", + }, + ), + "data": ( + { + "correct_answer": "Data analysis", + "options": [ + "Data analysis", + "Data visualization", + "Data mining", + "Data modeling", + ], + "points": 5, + "question": "What is the process of analyzing and interpreting data called?", + }, + { + "correct_answer": "Julia", + "options": ["Python", "R", "SQL", "Julia"], + "points": 5, + "question": "Which programming language is commonly used for data analysis?", + }, + ), + "frontend": ( + { + "correct_answer": "JavaScript", + "options": ["HTML", "CSS", "JavaScript", "Python"], + "points": 5, + "question": "What is the primary language used in frontend development?", + }, + { + "correct_answer": "Angular", + "options": ["React", "Angular", "Vue", "Ember"], + "points": 5, + "question": "Which framework is commonly used for building user interfaces?", + }, + ), + "mobile": ( + { + "correct_answer": "Flutter", + "options": ["iOS", "Android", "React Native", "Flutter"], + "points": 5, + "question": "Which platform is commonly used for developing mobile applications?", + }, + { + "correct_answer": "Objective-C", + "options": ["Swift", "Kotlin", "Java", "Objective-C"], + "points": 5, + "question": "What is the primary language used in mobile app development?", + }, + ), +} + +user_name: str = input("> Enter your name: ").strip() + +points: list[list[Any]] = [ + ["backend", 0], + ["data", 0], + ["frontend", 0], + ["mobile", 0], +] + +print() +points[0][1] += make_question(question=questions_per_house.get("backend")[0]) + +print() +points[0][1] += make_question(question=questions_per_house.get("backend")[1]) + +print() +points[1][1] += make_question(question=questions_per_house.get("data")[0]) + +print() +points[1][1] += make_question(question=questions_per_house.get("data")[1]) + +print() +points[2][1] += make_question(question=questions_per_house.get("frontend")[0]) + +print() +points[2][1] += make_question(question=questions_per_house.get("frontend")[1]) + +print() +points[3][1] += make_question(question=questions_per_house.get("mobile")[0]) + +print() +points[3][1] += make_question(question=questions_per_house.get("mobile")[1]) + +max_points: list[list[Any]] = [] + +for [house, housePoints] in points: + if len(max_points) == 0: + max_points.append([house, housePoints]) + continue + + if max_points[0][1] > housePoints: + continue + + if max_points[0][1] == housePoints: + max_points.append([house, housePoints]) + else: + max_points[0] = [house, housePoints] + + +if len(max_points) == 1: + print(f"\n> {user_name} will be part of the {max_points[0][0]} house!") +else: + print(max_points) + rnd_choice: list[Any] = choice(seq=max_points) + + print( + f"\n> The decision has been complicated," + f" but {user_name} will be part of the {rnd_choice[0]} house!" + ) diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/juanppdev.py b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/juanppdev.py new file mode 100644 index 0000000000..c907db37c6 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/juanppdev.py @@ -0,0 +1,75 @@ +""" + * 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 random, 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). +""" + +import random + +# Definimos las casas +casas = ["Frontend", "Backend", "Mobile", "Data"] + +# Definimos las preguntas y las respuestas +preguntas = [ + ("¿Qué prefieres hacer en tu tiempo libre?", ["Leer documentación", "Desarrollar una app", "Analizar datos", "Diseñar interfaces"]), + ("¿Qué lenguaje de programación te gusta más?", ["JavaScript", "Python", "Swift", "SQL"]), + ("¿Qué tipo de proyectos te interesan más?", ["Web", "Backend", "Móvil", "Big Data"]), + ("¿Qué herramienta prefieres usar?", ["React", "Django", "Flutter", "Pandas"]), + ("¿Qué tipo de problemas te gusta resolver?", ["Interfaz de usuario", "Lógica de negocio", "Optimización de rendimiento", "Análisis de datos"]), + ("¿Qué tipo de empresa te gustaría trabajar?", ["Startup", "Corporación", "Freelance", "Investigación"]), + ("¿Qué tipo de tareas disfrutas más?", ["Diseño", "Programación", "Pruebas", "Análisis"]), + ("¿Qué prefieres aprender?", ["CSS", "Docker", "Kotlin", "Machine Learning"]), + ("¿Qué tipo de equipo prefieres?", ["Diseñadores", "Desarrolladores", "Ingenieros de software", "Científicos de datos"]), + ("¿Qué tipo de retos te motivan?", ["Creativos", "Técnicos", "Innovadores", "Analíticos"]) +] + +# Función para asignar puntos a las casas +def asignar_puntos(respuesta): + if respuesta == 0: + return [1, 0, 0, 0] + elif respuesta == 1: + return [0, 1, 0, 0] + elif respuesta == 2: + return [0, 0, 1, 0] + elif respuesta == 3: + return [0, 0, 0, 1] + +# Función principal +def sombrero_seleccionador(): + nombre = input("¿Cuál es tu nombre? ") + puntos = [0, 0, 0, 0] + + for i in range(10): + pregunta, respuestas = random.choice(preguntas) + print(f"\nPregunta {i+1}: {pregunta}") + for j, respuesta in enumerate(respuestas): + print(f"{j+1}. {respuesta}") + eleccion = int(input("Elige una opción (1-4): ")) - 1 + puntos = [x + y for x, y in zip(puntos, asignar_puntos(eleccion))] + + max_puntos = max(puntos) + posibles_casas = [casas[i] for i, p in enumerate(puntos) if p == max_puntos] + + if len(posibles_casas) > 1: + casa_final = random.choice(posibles_casas) + print(f"\n{nombre}, la decisión ha sido complicada, pero finalmente perteneces a la casa {casa_final}!") + else: + casa_final = posibles_casas[0] + print(f"\n{nombre}, perteneces a la casa {casa_final}!") + +# Ejecutar el programa +sombrero_seleccionador() diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/miguelex.py b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/miguelex.py new file mode 100644 index 0000000000..f18b4d0e66 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/miguelex.py @@ -0,0 +1,228 @@ +import random + +class Casa: + def __init__(self, nombre): + self.nombre = nombre + self.puntos = 0 + + def get_nombre(self): + return self.nombre + + def agregar_puntos(self, puntos): + self.puntos += puntos + + def get_puntos(self): + return self.puntos + +class Alumno: + def __init__(self, nombre): + self.nombre = nombre + + def get_nombre(self): + return self.nombre + +class Pregunta: + def __init__(self, pregunta, opciones): + self.pregunta = pregunta + self.opciones = opciones + + def mostrar_pregunta(self): + print(self.pregunta) + for idx, opcion in enumerate(self.opciones): + print(f"{idx + 1}: {opcion['texto']}") + + def obtener_casa_segun_respuesta(self, respuesta): + return self.opciones[respuesta - 1]['casa'] + +class SombreroSeleccionador: + def __init__(self, casas, preguntas): + self.casas = casas + self.preguntas = preguntas + + def asignar_casa(self, alumno): + preguntas_seleccionadas = self.seleccionar_preguntas() + for pregunta in preguntas_seleccionadas: + pregunta.mostrar_pregunta() + respuesta = self.leer_respuesta() + casa = pregunta.obtener_casa_segun_respuesta(respuesta) + self.casas[casa].agregar_puntos(1) + + self.mostrar_resultado(alumno) + + def seleccionar_preguntas(self): + preguntas_seleccionadas = [] + indices_seleccionados = set() + + while len(preguntas_seleccionadas) < 10: + indice = random.randint(0, len(self.preguntas) - 1) + if indice not in indices_seleccionados: + indices_seleccionados.add(indice) + preguntas_seleccionadas.append(self.preguntas[indice]) + + return preguntas_seleccionadas + + def leer_respuesta(self): + while True: + try: + respuesta = int(input("Selecciona una opción (1-4): ")) + if 1 <= respuesta <= 4: + return respuesta + else: + print("Por favor, elige un número entre 1 y 4.") + except ValueError: + print("Por favor, introduce un número válido.") + + def mostrar_resultado(self, alumno): + casas_ordenadas = sorted(self.casas.values(), key=lambda casa: casa.get_puntos(), reverse=True) + + max_puntos = casas_ordenadas[0].get_puntos() + ganadoras = [casa for casa in casas_ordenadas if casa.get_puntos() == max_puntos] + + if len(ganadoras) > 1: + print("\n\nLa decisión fue difícil...") + ganadora = random.choice(ganadoras) + else: + ganadora = ganadoras[0] + + print(f"\n\n{alumno.get_nombre()}, el sombrero seleccionador te ha asignado a la casa {ganadora.get_nombre().upper()}!!!!\n") + + +# Definir las casas +casas = { + 'frontend': Casa('Frontend'), + 'backend': Casa('Backend'), + 'mobile': Casa('Mobile'), + 'data': Casa('Data') +} + +# Definir las preguntas +preguntas = [ + Pregunta("¿Qué prefieres?", [ + {'texto': 'Diseñar interfaces', 'casa': 'frontend'}, + {'texto': 'Crear APIs', 'casa': 'backend'}, + {'texto': 'Desarrollar apps móviles', 'casa': 'mobile'}, + {'texto': 'Analizar datos', 'casa': 'data'} + ]), + Pregunta("¿Cuál es tu lenguaje de programación favorito?", [ + {'texto': 'JavaScript', 'casa': 'frontend'}, + {'texto': 'Python', 'casa': 'backend'}, + {'texto': 'Kotlin', 'casa': 'mobile'}, + {'texto': 'R', 'casa': 'data'} + ]), + Pregunta("¿Qué herramienta utilizas más a menudo?", [ + {'texto': 'Figma o Sketch', 'casa': 'frontend'}, + {'texto': 'Docker o Kubernetes', 'casa': 'backend'}, + {'texto': 'Android Studio o Xcode', 'casa': 'mobile'}, + {'texto': 'Jupyter Notebooks o Excel', 'casa': 'data'} + ]), + Pregunta("¿Qué te interesa más aprender?", [ + { 'texto': 'HTML/CSS y JavaScript avanzado', 'casa': 'frontend' }, + { 'texto': 'Patrones de diseño y arquitectura de software', 'casa': 'backend' }, + { 'texto': 'Programación nativa para dispositivos móviles', 'casa': 'mobile' }, + { 'texto': 'Estadística y Machine Learning', 'casa': 'data' } + ]), + Pregunta("¿Qué tipo de proyecto te gustaría liderar?", [ + { 'texto': 'Un sitio web interactivo y atractivo', 'casa': 'frontend' }, + { 'texto': 'Una plataforma escalable con microservicios', 'casa': 'backend' }, + { 'texto': 'Una app móvil innovadora', 'casa': 'mobile' }, + { 'texto': 'Un sistema de recomendación basado en datos', 'casa': 'data' } + ]), + Pregunta("¿Qué es lo más importante para ti en un proyecto?", [ + { 'texto': 'La experiencia de usuario', 'casa': 'frontend' }, + { 'texto': 'El rendimiento y la escalabilidad', 'casa': 'backend' }, + { 'texto': 'La adaptabilidad a diferentes dispositivos', 'casa': 'mobile' }, + { 'texto': 'La precisión de los análisis', 'casa': 'data' } + ]), + Pregunta("¿Qué prefieres trabajar?", [ + {'texto' : 'En un entorno donde el diseño visual es clave', 'casa' :'frontend'}, + {'texto' : 'En la lógica del negocio y la arquitectura', 'casa' :'backend'}, + {'texto' : 'En apps móviles con buen rendimiento', 'casa' :'mobile'}, + {'texto' : 'En el análisis y visualización de datos', 'casa' :'data'} + ]), + Pregunta("¿Qué framework te parece más interesante?", [ + {'texto' : 'React o Angular', 'casa' :'frontend'}, + {'texto' : 'Spring o Django', 'casa' :'backend'}, + {'texto' : 'Flutter o React Native', 'casa' :'mobile'}, + {'texto' : 'TensorFlow o Pandas', 'casa' :'data'} + ]), + Pregunta("¿Qué tipo de reto disfrutas más?", [ + {'texto' : 'Hacer que un sitio web sea accesible y rápido', 'casa' :'frontend'}, + {'texto' : 'Optimizar la comunicación entre servicios', 'casa' :'backend'}, + {'texto' : 'Mejorar la experiencia del usuario en móviles', 'casa' :'mobile'}, + {'texto' : 'Encontrar patrones ocultos en los datos', 'casa' :'data'} + ]), + Pregunta("¿Qué prefieres resolver?", [ + {'texto' : 'Problemas de diseño y maquetación', 'casa' :'frontend'}, + {'texto' : 'Problemas de concurrencia y escalabilidad', 'casa' :'backend'}, + {'texto' : 'Problemas de rendimiento en aplicaciones móviles', 'casa' :'mobile'}, + {'texto' : 'Problemas de predicción y análisis de datos', 'casa' :'data'} + ]), + Pregunta("¿Qué es lo que más te emociona en tecnología?", [ + {'texto' : 'La evolución de las interfaces de usuario', 'casa' :'frontend'}, + {'texto' : 'La innovación en la arquitectura de software', 'casa' :'backend'}, + {'texto' : 'Las nuevas capacidades de los dispositivos móviles', 'casa' :'mobile'}, + {'texto' : 'Los avances en inteligencia artificial y análisis de datos', 'casa' : 'data'} + ]), + Pregunta("¿Qué te gusta hacer en tu tiempo libre?", [ + {'texto' : 'Diseñar sitios web personales o interfaces', 'casa': 'frontend'}, + {'texto' : 'Hacer proyectos con servidores y APIs', 'casa': 'backend'}, + {'texto' : 'Crear apps móviles para resolver problemas cotidianos', 'casa': 'mobile'}, + {'texto' : 'Hacer análisis de datos para tomar decisiones mejor informadas', 'casa': 'data'} + ]), + Pregunta("¿Qué te gustaría dominar?", [ + {'texto' : 'Animaciones y transiciones en la web', 'casa': 'frontend'}, + {'texto' : 'Arquitectura de microservicios', 'casa': 'backend'}, + {'texto' : 'Optimización de aplicaciones móviles', 'casa': 'mobile'}, + {'texto' : 'Modelos predictivos y análisis de datos', 'casa': 'data'} + ]), + Pregunta("¿Qué tipo de problema prefieres resolver en un hackathon?", [ + {'texto' : 'Mejorar la interfaz de usuario de una aplicación', 'casa': 'frontend'}, + {'texto' : 'Optimizar el rendimiento de una API', 'casa': 'backend'}, + {'texto' : 'Crear una aplicación móvil desde cero', 'casa': 'mobile'}, + {'texto' : 'Generar insights a partir de grandes conjuntos de datos', 'casa': 'data'} + ]), + Pregunta("¿Qué prefieres al trabajar en equipo?", [ + {'texto' : 'Encargarte de la parte visual y de interacción del usuario', 'casa': 'frontend'}, + {'texto' : 'Asegurarte de que la lógica y los datos fluyan correctamente', 'casa': 'backend'}, + {'texto' : 'Hacer que la app funcione bien en diferentes dispositivos', 'casa': 'mobile'}, + {'texto' : 'Proveer métricas y análisis para tomar mejores decisiones', 'casa': 'data'} + ]), + Pregunta("¿Cuál es tu prioridad al optimizar código?", [ + {'texto' : 'Que la interfaz cargue rápido y sea amigable', 'casa': 'frontend'}, + {'texto' : 'Que los servicios backend sean escalables y eficientes', 'casa': 'backend'}, + {'texto' : 'Que la app móvil consuma pocos recursos y sea fluida', 'casa': 'mobile'}, + {'texto' : 'Que el procesamiento de datos sea rápido y preciso', 'casa': 'data'} + ]), + Pregunta("¿Qué prefieres al probar una aplicación?", [ + {'texto' : 'Verificar que el diseño y la usabilidad sean impecables', 'casa': 'frontend'}, + {'texto' : 'Asegurar que las funcionalidades y la lógica sean correctas', 'casa' :'backend'}, + {'texto' : 'Revisar que la app funcione correctamente en múltiples dispositivos', 'casa' : 'mobile'}, + {'texto' : 'Validar que los resultados de los análisis sean exactos', 'casa' : 'data'} + ]), + Pregunta("¿Qué tipo de proyectos sigues en la industria?", [ + {'texto' : 'Proyectos de diseño web innovador y UX', 'casa' : 'frontend'}, + {'texto' : 'Nuevas tecnologías de servidores y backends', 'casa' : 'backend'}, + {'texto' : 'Aplicaciones móviles disruptivas y eficientes', 'casa' : 'mobile'}, + {'texto' : 'Proyectos de inteligencia artificial y ciencia de datos', 'casa' : 'data'} + ]), + Pregunta("¿Qué harías para mejorar una plataforma existente?", [ + {'texto' : 'Mejorar la apariencia y usabilidad de la interfaz', 'casa' : 'frontend'}, + {'texto' : 'Optimizar el rendimiento de las consultas y los servidores', 'casa' : 'backend'}, + {'texto' : 'Hacer que la plataforma sea accesible desde dispositivos móviles', 'casa' : 'mobile'}, + {'texto' : 'Incluir más análisis de datos para obtener mejor información', 'casa' : 'data'} + ]), + Pregunta("¿Qué aspecto del desarrollo de software te parece más retador?", [ + {'texto' : 'Hacer que una aplicación web sea visualmente atractiva', 'casa' : 'frontend'}, + {'texto' : 'Crear sistemas backend que manejen millones de usuarios', 'casa' : 'backend'}, + {'texto' : 'Optimizar la app móvil para diferentes sistemas operativos', 'casa' : 'mobile'}, + {'texto' : 'Gestionar grandes volúmenes de datos y extraer conclusiones útiles', 'casa' : 'data'} + ]), +] + +# Solicitar nombre del alumno +nombre_alumno = input("Por favor, introduce tu nombre: ") +alumno = Alumno(nombre_alumno) + +# Crear instancia del sombrero seleccionador y asignar casa +sombrero = SombreroSeleccionador(casas, preguntas) +sombrero.asignar_casa(alumno) diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/mouredev.py b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/mouredev.py new file mode 100644 index 0000000000..922e4bd298 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/python/mouredev.py @@ -0,0 +1,253 @@ +import random + +houses = { + "Frontend": 0, + "Backend": 0, + "Mobile": 0, + "Data": 0 +} + +questions = [ + { + "question": "¿Qué tipo de proyectos te interesa más desarrollar?", + "answers": [ + { + "option": "Aplicaciones móviles nativas para múltiples plataformas.", + "house": "Mobile" + }, + { + "option": "Interfaces visualmente atractivas y responsivas.", + "house": "Frontend" + }, + { + "option": "Procesamiento y análisis de grandes volúmenes de datos.", + "house": "Data" + }, + { + "option": "Sistemas robustos y optimización de rendimiento del servidor.", + "house": "Backend" + } + ] + }, + { + "question": "¿Qué aspecto del desarrollo disfrutas más?", + "answers": [ + { + "option": "Resolver problemas complejos de lógica y escalabilidad.", + "house": "Backend" + }, + { + "option": "Analizar datos para tomar decisiones basadas en estadísticas.", + "house": "Data" + }, + { + "option": "Crear aplicaciones móviles eficientes y funcionales.", + "house": "Mobile" + }, + { + "option": "Trabajar en el diseño y la experiencia de usuario.", + "house": "Frontend" + } + ] + }, + { + "question": "¿Qué herramienta prefieres usar en tu día a día?", + "answers": [ + { + "option": "Kotlin o Swift para desarrollar apps móviles nativas.", + "house": "Mobile" + }, + { + "option": "Python o R para análisis de datos.", + "house": "Data" + }, + { + "option": "Frameworks como React o Angular.", + "house": "Frontend" + }, + { + "option": "Lenguajes como Node.js o Python para la gestión de servidores.", + "house": "Backend" + } + ] + }, + { + "question": "¿Cómo te ves en un equipo de desarrollo?", + "answers": [ + { + "option": "Modelando datos y construyendo dashboards de análisis.", + "house": "Data" + }, + { + "option": "Encargado de la lógica del servidor y las APIs.", + "house": "Backend" + }, + { + "option": "Desarrollando la interfaz y funcionalidad de una app móvil.", + "house": "Mobile" + }, + { + "option": "Diseñando las interacciones y los componentes visuales.", + "house": "Frontend" + } + ] + }, + { + "question": "¿Qué te motiva más al trabajar en un proyecto?", + "answers": [ + { + "option": "Ver cómo el diseño cobra vida en la pantalla.", + "house": "Frontend" + }, + { + "option": "Descubrir insights a partir del análisis de datos.", + "house": "Data" + }, + { + "option": "Optimizar el rendimiento y escalabilidad del sistema.", + "house": "Backend" + }, + { + "option": "Lograr que una aplicación móvil funcione perfectamente en cualquier dispositivo.", + "house": "Mobile" + } + ] + }, + { + "question": "¿Cuál es tu enfoque al aprender nuevas tecnologías?", + "answers": [ + { + "option": "Explorar técnicas avanzadas de análisis de datos y machine learning.", + "house": "Data" + }, + { + "option": "Aprender sobre nuevas arquitecturas y lenguajes de servidor.", + "house": "Backend" + }, + { + "option": "Probar nuevas plataformas y herramientas para desarrollo móvil.", + "house": "Mobile" + }, + { + "option": "Experimentar con nuevas librerías y frameworks de interfaz de usuario.", + "house": "Frontend" + } + ] + }, + { + "question": "¿Qué tipo de desafíos disfrutas más resolver?", + "answers": [ + { + "option": "Solución de problemas de concurrencia y carga en servidores.", + "house": "Backend" + }, + { + "option": "Optimización de interfaces para que se vean bien en cualquier dispositivo.", + "house": "Frontend" + }, + { + "option": "Análisis de grandes volúmenes de datos para detectar patrones ocultos.", + "house": "Data"}, + { + "option": "Creación de experiencias de usuario fluídas en dispositivos móviles.", + "house": "Mobile" + } + ] + }, + { + "question": "¿Cómo te gusta medir el éxito de tu trabajo?", + "answers": [ + { + "option": "Por la estabilidad y rapidez del sistema bajo carga.", + "house": "Backend" + }, + { + "option": "Mediante la satisfacción del usuario con la interfaz visual.", + "house": "Frontend" + }, + { + "option": "Por la fluidez y buen rendimiento de la app móvil en diferentes dispositivos.", + "house": "Mobile"}, + { + "option": "Por la precisión y relevancia de los resultados obtenidos en el análisis de datos.", + "house": "Data" + } + ] + }, + { + "question": "¿Qué te resulta más interesante al trabajar con tecnologías emergentes?", + "answers": [ + { + "option": "Trabajar con tecnologías de big data o inteligencia artificial.", + "house": "Data" + }, + { + "option": "Explorar nuevas arquitecturas para mejorar el rendimiento del servidor.", + "house": "Backend" + }, + { + "option": "Probar nuevas herramientas y metodologías para mejorar el diseño y la UX.", + "house": "Frontend" + }, + { + "option": "Desarrollar apps móviles que aprovechen nuevas capacidades de hardware.", + "house": "Mobile" + } + ] + }, + { + "question": "¿Cómo te enfrentas a un nuevo problema en un proyecto?", + "answers": [ + { + "option": "Buscando patrones y soluciones basadas en análisis de datos.", + "house": "Data" + }, + { + "option": "Replanteando la estructura visual y funcional de la interfaz.", + "house": "Frontend" + }, + { + "option": "Explorando cómo mejorar la experiencia del usuario en dispositivos móviles.", + "house": "Mobile" + }, + { + "option": "Analizando la estructura de datos y la lógica del backend.", + "house": "Backend" + } + ] + } +] + +print("\n¡Bienvenido a Hogwarts, la escuela de programación para magos y brujas del código!") +print("El sombrero seleccionador decidirá cuál es tu casa como programador.") + +name = input("\n¿Cuál es tu nombre? ") + +for index, question in enumerate(questions): + + print(f"\nPregunta {index + 1}: {question["question"]}\n") + + for i, answer in enumerate(question["answers"]): + print(f"{i + 1}. {answer["option"]}") + + choice = int(input("\nSelecciona una respuesta entre 1 y 4: ")) + + selected_answer = question["answers"][choice - 1] + houses[selected_answer["house"]] += 1 + +assigned_house = max(houses, key=houses.get) +scores = list(houses.values()) + +if scores.count(max(scores)) > 1: + possible_houses = [ + house for house, + points in houses.items() if points == max(scores) + ] + assigned_house = random.choice(possible_houses) + + print( + f"""\nHmmmm... Ha sido una decisión muy complicada, { + name}.\n¡Pero finalmente tu casa será {assigned_house}!""" + ) +else: + print(f"\nEnhorabuena, {name}.\n¡Tu casa será {assigned_house}!") diff --git a/Roadmap/36 - EL SOMBRERO SELECCIONADOR/typescript/miguelex.ts b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/typescript/miguelex.ts new file mode 100644 index 0000000000..fa2c728090 --- /dev/null +++ b/Roadmap/36 - EL SOMBRERO SELECCIONADOR/typescript/miguelex.ts @@ -0,0 +1,266 @@ +import * as readline from 'readline'; + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +class Casa { + private nombre: string; + private puntos: number; + + constructor(nombre: string) { + this.nombre = nombre; + this.puntos = 0; + } + + public getNombre(): string { + return this.nombre; + } + + public agregarPuntos(puntos: number): void { + this.puntos += puntos; + } + + public getPuntos(): number { + return this.puntos; + } +} + +class Alumno { + private nombre: string; + + constructor(nombre: string) { + this.nombre = nombre; + } + + public getNombre(): string { + return this.nombre; + } +} + +interface Opcion { + texto: string; + casa: string; +} + +class Pregunta { + private pregunta: string; + private opciones: Opcion[]; + + constructor(pregunta: string, opciones: Opcion[]) { + this.pregunta = pregunta; + this.opciones = opciones; + } + + public mostrarPregunta(): void { + console.log(this.pregunta); + this.opciones.forEach((opcion, index) => { + console.log(`${index + 1}: ${opcion.texto}`); + }); + } + + public obtenerCasaSegunRespuesta(respuesta: number): string { + return this.opciones[respuesta - 1].casa; + } +} + +class SombreroSeleccionador { + private casas: Record; + private preguntas: Pregunta[]; + + constructor(casas: Record, preguntas: Pregunta[]) { + this.casas = casas; + this.preguntas = preguntas; + } + + public async asignarCasa(alumno: Alumno): Promise { + const preguntasSeleccionadas = this.seleccionarPreguntas(); + for (const pregunta of preguntasSeleccionadas) { + pregunta.mostrarPregunta(); + const respuesta = await this.leerRespuesta(); + const casa = pregunta.obtenerCasaSegunRespuesta(respuesta); + this.casas[casa].agregarPuntos(1); + } + + this.mostrarResultado(alumno); + rl.close(); + } + + private seleccionarPreguntas(): Pregunta[] { + const preguntasSeleccionadas: Pregunta[] = []; + const indicesSeleccionados = new Set(); + + while (preguntasSeleccionadas.length < 10) { + const indice = Math.floor(Math.random() * this.preguntas.length); + if (!indicesSeleccionados.has(indice)) { + indicesSeleccionados.add(indice); + preguntasSeleccionadas.push(this.preguntas[indice]); + } + } + + return preguntasSeleccionadas; + } + + private leerRespuesta(): Promise { + return new Promise((resolve) => { + rl.question("Selecciona una opción (1-4): ", (respuesta) => { + resolve(parseInt(respuesta)); + }); + }); + } + + private mostrarResultado(alumno: Alumno): void { + const casasOrdenadas = Object.values(this.casas).sort((a, b) => b.getPuntos() - a.getPuntos()); + + const maxPuntos = casasOrdenadas[0].getPuntos(); + const ganadoras = casasOrdenadas.filter(casa => casa.getPuntos() === maxPuntos); + + let ganadora: Casa; + if (ganadoras.length > 1) { + console.log("\n\nLa decisión fue difícil..."); + ganadora = ganadoras[Math.floor(Math.random() * ganadoras.length)]; + } else { + ganadora = ganadoras[0]; + } + + console.log(`\n\n ${alumno.getNombre()}, el sombrero seleccionador te ha asignado a la casa ${ganadora.getNombre().toUpperCase()}!!!!\n`); + } +} + +const casas: Record = { + 'frontend': new Casa('Frontend'), + 'backend': new Casa('Backend'), + 'mobile': new Casa('Mobile'), + 'data': new Casa('Data') +}; + +const preguntas = [ + new Pregunta("¿Qué prefieres?", [ + { texto: 'Diseñar interfaces', casa: 'frontend' }, + { texto: 'Crear APIs', casa: 'backend' }, + { texto: 'Desarrollar apps móviles', casa: 'mobile' }, + { texto: 'Analizar datos', casa: 'data' } + ]), + new Pregunta("¿Cuál es tu lenguaje de programación favorito?", [ + { texto: 'JavaScript', casa: 'frontend' }, + { texto: 'Python', casa: 'backend' }, + { texto: 'Kotlin', casa: 'mobile' }, + { texto: 'R', casa: 'data' } + ]), + new Pregunta("¿Qué herramienta utilizas más a menudo?", [ + { texto: 'Figma o Sketch', casa: 'frontend' }, + { texto: 'Docker o Kubernetes', casa: 'backend' }, + { texto: 'Android Studio o Xcode', casa: 'mobile' }, + { texto: 'Jupyter Notebooks o Excel', casa: 'data' } + ]), + new Pregunta("¿Qué te interesa más aprender?", [ + { texto: 'HTML/CSS y JavaScript avanzado', casa: 'frontend' }, + { texto: 'Patrones de diseño y arquitectura de software', casa: 'backend' }, + { texto: 'Programación nativa para dispositivos móviles', casa: 'mobile' }, + { texto: 'Estadística y Machine Learning', casa: 'data' } + ]), + new Pregunta("¿Qué tipo de proyecto te gustaría liderar?", [ + { texto: 'Un sitio web interactivo y atractivo', casa: 'frontend' }, + { texto: 'Una plataforma escalable con microservicios', casa: 'backend' }, + { texto: 'Una app móvil innovadora', casa: 'mobile' }, + { texto: 'Un sistema de recomendación basado en datos', casa: 'data' } + ]), + new Pregunta("¿Qué es lo más importante para ti en un proyecto?", [ + { texto: 'La experiencia de usuario', casa: 'frontend' }, + { texto: 'El rendimiento y la escalabilidad', casa: 'backend' }, + { texto: 'La adaptabilidad a diferentes dispositivos', casa: 'mobile' }, + { texto: 'La precisión de los análisis', casa: 'data' } + ]), + new Pregunta("¿Qué prefieres trabajar?", [ + {texto : 'En un entorno donde el diseño visual es clave', casa :'frontend'}, + {texto : 'En la lógica del negocio y la arquitectura', casa :'backend'}, + {texto : 'En apps móviles con buen rendimiento', casa :'mobile'}, + {texto : 'En el análisis y visualización de datos', casa :'data'} + ]), + new Pregunta("¿Qué framework te parece más interesante?", [ + {texto: 'React o Angular', casa :'frontend'}, + {texto : 'Spring o Django', casa :'backend'}, + {texto : 'Flutter o React Native', casa :'mobile'}, + {texto : 'TensorFlow o Pandas', casa :'data'} + ]), + new Pregunta("¿Qué tipo de reto disfrutas más?", [ + {texto : 'Hacer que un sitio web sea accesible y rápido', casa :'frontend'}, + {texto : 'Optimizar la comunicación entre servicios', casa :'backend'}, + {texto : 'Mejorar la experiencia del usuario en móviles', casa :'mobile'}, + {texto : 'Encontrar patrones ocultos en los datos', casa :'data'} + ]), + new Pregunta("¿Qué prefieres resolver?", [ + {texto : 'Problemas de diseño y maquetación', casa :'frontend'}, + {texto : 'Problemas de concurrencia y escalabilidad', casa :'backend'}, + {texto : 'Problemas de rendimiento en aplicaciones móviles', casa :'mobile'}, + {texto : 'Problemas de predicción y análisis de datos', casa :'data'} + ]), + new Pregunta("¿Qué es lo que más te emociona en tecnología?", [ + {texto : 'La evolución de las interfaces de usuario', casa :'frontend'}, + {texto : 'La innovación en la arquitectura de software', casa :'backend'}, + {texto : 'Las nuevas capacidades de los dispositivos móviles', casa :'mobile'}, + {texto : 'Los avances en inteligencia artificial y análisis de datos', casa : 'data'} + ]), + new Pregunta("¿Qué te gusta hacer en tu tiempo libre?", [ + {texto : 'Diseñar sitios web personales o interfaces', casa: 'frontend'}, + {texto : 'Hacer proyectos con servidores y APIs', casa: 'backend'}, + {texto : 'Crear apps móviles para resolver problemas cotidianos', casa: 'mobile'}, + {texto : 'Hacer análisis de datos para tomar decisiones mejor informadas', casa: 'data'} + ]), + new Pregunta("¿Qué te gustaría dominar?", [ + {texto : 'Animaciones y transiciones en la web', casa: 'frontend'}, + {texto : 'Arquitectura de microservicios', casa: 'backend'}, + {texto : 'Optimización de aplicaciones móviles', casa: 'mobile'}, + {texto : 'Modelos predictivos y análisis de datos', casa: 'data'} + ]), + new Pregunta("¿Qué tipo de problema prefieres resolver en un hackathon?", [ + {texto : 'Mejorar la interfaz de usuario de una aplicación', casa: 'frontend'}, + {texto : 'Optimizar el rendimiento de una API', casa: 'backend'}, + {texto : 'Crear una aplicación móvil desde cero', casa: 'mobile'}, + {texto : 'Generar insights a partir de grandes conjuntos de datos', casa: 'data'} + ]), + new Pregunta("¿Qué prefieres al trabajar en equipo?", [ + {texto : 'Encargarte de la parte visual y de interacción del usuario', casa: 'frontend'}, + {texto : 'Asegurarte de que la lógica y los datos fluyan correctamente', casa: 'backend'}, + {texto : 'Hacer que la app funcione bien en diferentes dispositivos', casa: 'mobile'}, + {texto : 'Proveer métricas y análisis para tomar mejores decisiones', casa: 'data'} + ]), + new Pregunta("¿Cuál es tu prioridad al optimizar código?", [ + {texto : 'Que la interfaz cargue rápido y sea amigable', casa: 'frontend'}, + {texto : 'Que los servicios backend sean escalables y eficientes', casa: 'backend'}, + {texto : 'Que la app móvil consuma pocos recursos y sea fluida', casa: 'mobile'}, + {texto : 'Que el procesamiento de datos sea rápido y preciso', casa: 'data'} + ]), + new Pregunta("¿Qué prefieres al probar una aplicación?", [ + {texto : 'Verificar que el diseño y la usabilidad sean impecables', casa: 'frontend'}, + {texto : 'Asegurar que las funcionalidades y la lógica sean correctas', casa :'backend'}, + {texto : 'Revisar que la app funcione correctamente en múltiples dispositivos', casa : 'mobile'}, + {texto : 'Validar que los resultados de los análisis sean exactos', casa : 'data'} + ]), + new Pregunta("¿Qué tipo de proyectos sigues en la industria?", [ + {texto : 'Proyectos de diseño web innovador y UX', casa : 'frontend'}, + {texto : 'Nuevas tecnologías de servidores y backends', casa : 'backend'}, + {texto : 'Aplicaciones móviles disruptivas y eficientes', casa : 'mobile'}, + {texto : 'Proyectos de inteligencia artificial y ciencia de datos', casa : 'data'} + ]), + new Pregunta("¿Qué harías para mejorar una plataforma existente?", [ + {texto : 'Mejorar la apariencia y usabilidad de la interfaz', casa : 'frontend'}, + {texto : 'Optimizar el rendimiento de las consultas y los servidores', casa : 'backend'}, + {texto : 'Hacer que la plataforma sea accesible desde dispositivos móviles', casa : 'mobile'}, + {texto : 'Incluir más análisis de datos para obtener mejor información', casa : 'data'} + ]), + new Pregunta("¿Qué aspecto del desarrollo de software te parece más retador?", [ + {texto : 'Hacer que una aplicación web sea visualmente atractiva', casa : 'frontend'}, + {texto : 'Crear sistemas backend que manejen millones de usuarios', casa : 'backend'}, + {texto : 'Optimizar la app móvil para diferentes sistemas operativos', casa : 'mobile'}, + {texto : 'Gestionar grandes volúmenes de datos y extraer conclusiones útiles', casa : 'data'} + ]), +]; + + +rl.question("Por favor, introduce tu nombre: ", (nombreAlumno) => { + const alumno = new Alumno(nombreAlumno); + const sombrero = new SombreroSeleccionador(casas, preguntas); + sombrero.asignarCasa(alumno); +}); diff --git a/Roadmap/37 - OASIS VS LINKIN PARK/ejercicio.md b/Roadmap/37 - OASIS VS LINKIN PARK/ejercicio.md new file mode 100644 index 0000000000..1a12932b5a --- /dev/null +++ b/Roadmap/37 - OASIS VS LINKIN PARK/ejercicio.md @@ -0,0 +1,29 @@ +# #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. + */ +``` +#### Tienes toda la información extendida sobre el roadmap de retos de programación en **[retosdeprogramacion.com/roadmap](https://retosdeprogramacion.com/roadmap)**. + +Sigue las **[instrucciones](../../README.md)**, consulta las correcciones y aporta la tuya propia utilizando el lenguaje de programación que quieras. + +> Recuerda que cada semana se publica un nuevo ejercicio y se corrige el de la semana anterior en directo desde **[Twitch](https://twitch.tv/mouredev)**. Tienes el horario en la sección "eventos" del servidor de **[Discord](https://discord.gg/mouredev)**. \ No newline at end of file diff --git a/Roadmap/stats.json b/Roadmap/stats.json index 627a83a17d..d1aebb947e 100644 --- a/Roadmap/stats.json +++ b/Roadmap/stats.json @@ -1,28 +1,28 @@ { - "challenges_total": 37, + "challenges_total": 38, "languages_total": 48, - "files_total": 6870, - "users_total": 1150, + "files_total": 6920, + "users_total": 1158, "challenges_ranking": [ { "order": 1, "name": "00 - SINTAXIS, VARIABLES, TIPOS DE DATOS Y HOLA MUNDO", - "count": 1254 + "count": 1261 }, { "order": 2, "name": "01 - OPERADORES Y ESTRUCTURAS DE CONTROL", - "count": 761 + "count": 765 }, { "order": 3, "name": "02 - FUNCIONES Y ALCANCE", - "count": 584 + "count": 585 }, { "order": 4, "name": "03 - ESTRUCTURAS DE DATOS", - "count": 400 + "count": 401 }, { "order": 5, @@ -42,12 +42,12 @@ { "order": 8, "name": "07 - PILAS Y COLAS", - "count": 242 + "count": 244 }, { "order": 9, "name": "08 - CLASES", - "count": 222 + "count": 225 }, { "order": 10, @@ -62,22 +62,22 @@ { "order": 12, "name": "11 - MANEJO DE FICHEROS", - "count": 154 + "count": 155 }, { "order": 13, - "name": "13 - PRUEBAS UNITARIAS", + "name": "14 - FECHAS", "count": 130 }, { "order": 14, - "name": "14 - FECHAS", - "count": 129 + "name": "13 - PRUEBAS UNITARIAS", + "count": 130 }, { "order": 15, "name": "12 - JSON Y XML", - "count": 128 + "count": 129 }, { "order": 16, @@ -92,12 +92,12 @@ { "order": 18, "name": "17 - ITERACIONES", - "count": 113 + "count": 114 }, { "order": 19, "name": "18 - CONJUNTOS", - "count": 111 + "count": 112 }, { "order": 20, @@ -137,12 +137,12 @@ { "order": 27, "name": "26 - SOLID SRP", - "count": 63 + "count": 64 }, { "order": 28, "name": "27 - SOLID OCP", - "count": 59 + "count": 60 }, { "order": 29, @@ -156,12 +156,12 @@ }, { "order": 31, - "name": "30 - SOLID DIP", - "count": 46 + "name": "32 - BATALLA DEADPOOL Y WOLVERINE", + "count": 47 }, { "order": 32, - "name": "32 - BATALLA DEADPOOL Y WOLVERINE", + "name": "30 - SOLID DIP", "count": 46 }, { @@ -171,115 +171,120 @@ }, { "order": 34, - "name": "31 - SIMULADOR JUEGOS OL\u00cdMPICOS", + "name": "35 - REPARTIENDO LOS ANILLOS DE PODER", "count": 38 }, { "order": 35, - "name": "35 - REPARTIENDO LOS ANILLOS DE PODER", - "count": 37 + "name": "31 - SIMULADOR JUEGOS OL\u00cdMPICOS", + "count": 38 }, { "order": 36, + "name": "36 - EL SOMBRERO SELECCIONADOR", + "count": 36 + }, + { + "order": 37, "name": "34 - \u00c1RBOL GENEAL\u00d3GICO LA CASA DEL DRAG\u00d3N", "count": 32 }, { - "order": 37, - "name": "36 - EL SOMBRERO SELECCIONADOR", - "count": 13 + "order": 38, + "name": "37 - OASIS VS LINKIN PARK", + "count": 0 } ], "languages_ranking": [ { "order": 1, "name": "python", - "count": 2959, - "percentage": 43.07 + "count": 2979, + "percentage": 43.05 }, { "order": 2, "name": "javascript", - "count": 1369, - "percentage": 19.93 + "count": 1378, + "percentage": 19.91 }, { "order": 3, "name": "java", - "count": 614, - "percentage": 8.94 + "count": 619, + "percentage": 8.95 }, { "order": 4, "name": "typescript", - "count": 302, - "percentage": 4.4 + "count": 305, + "percentage": 4.41 }, { "order": 5, "name": "c#", - "count": 252, - "percentage": 3.67 + "count": 253, + "percentage": 3.66 }, { "order": 6, "name": "kotlin", - "count": 212, - "percentage": 3.09 + "count": 215, + "percentage": 3.11 }, { "order": 7, "name": "go", - "count": 212, - "percentage": 3.09 + "count": 213, + "percentage": 3.08 }, { "order": 8, "name": "swift", "count": 166, - "percentage": 2.42 + "percentage": 2.4 }, { "order": 9, "name": "php", - "count": 151, + "count": 152, "percentage": 2.2 }, { "order": 10, "name": "c++", - "count": 113, - "percentage": 1.64 + "count": 114, + "percentage": 1.65 }, { "order": 11, "name": "rust", - "count": 112, + "count": 113, "percentage": 1.63 }, { "order": 12, "name": "c", - "count": 66, - "percentage": 0.96 + "count": 67, + "percentage": 0.97 }, { "order": 13, "name": "dart", - "count": 48, - "percentage": 0.7 + "count": 49, + "percentage": 0.71 }, { "order": 14, "name": "bash", - "count": 41, - "percentage": 0.6 + "count": 43, + "percentage": 0.62 }, { "order": 15, "name": "vb.net", - "count": 36, - "percentage": 0.52 + "count": 37, + "percentage": 0.53 }, { "order": 16, @@ -327,13 +332,13 @@ "order": 23, "name": "julia", "count": 10, - "percentage": 0.15 + "percentage": 0.14 }, { "order": 24, "name": "scala", "count": 10, - "percentage": 0.15 + "percentage": 0.14 }, { "order": 25, @@ -484,19 +489,19 @@ { "order": 1, "name": "miguelex", - "count": 156, + "count": 161, "languages": 15 }, { "order": 2, "name": "kenysdev", - "count": 144, + "count": 148, "languages": 4 }, { "order": 3, "name": "hozlucas28", - "count": 103, + "count": 105, "languages": 3 }, { @@ -562,7 +567,7 @@ { "order": 14, "name": "jesusantonioeescamilla", - "count": 52, + "count": 55, "languages": 3 }, { @@ -573,39 +578,39 @@ }, { "order": 16, - "name": "amadorquispe", - "count": 49, - "languages": 2 + "name": "cesarcarmona30", + "count": 50, + "languages": 4 }, { "order": 17, - "name": "cesarcarmona30", - "count": 48, - "languages": 4 + "name": "amadorquispe", + "count": 49, + "languages": 2 }, { "order": 18, - "name": "ricjdev", + "name": "juanppdev", "count": 47, - "languages": 2 + "languages": 3 }, { "order": 19, - "name": "raulg91", + "name": "ricjdev", "count": 47, "languages": 2 }, { "order": 20, - "name": "jesusway69", + "name": "raulg91", "count": 47, "languages": 2 }, { "order": 21, - "name": "juanppdev", - "count": 46, - "languages": 3 + "name": "jesusway69", + "count": 47, + "languages": 2 }, { "order": 22, @@ -663,38 +668,38 @@ }, { "order": 31, - "name": "asjordi", + "name": "mouredev", "count": 37, "languages": 1 }, { "order": 32, - "name": "n0hagonada", - "count": 36, - "languages": 3 + "name": "asjordi", + "count": 37, + "languages": 1 }, { "order": 33, - "name": "emmanuelmmontesinos", + "name": "n0hagonada", "count": 36, - "languages": 1 + "languages": 3 }, { "order": 34, - "name": "mouredev", + "name": "rauldoezon", "count": 36, "languages": 1 }, { "order": 35, - "name": "rauldoezon", - "count": 35, + "name": "emmanuelmmontesinos", + "count": 36, "languages": 1 }, { "order": 36, "name": "rigo93acosta", - "count": 35, + "count": 36, "languages": 1 }, { @@ -717,49 +722,49 @@ }, { "order": 40, + "name": "qv1ko", + "count": 33, + "languages": 4 + }, + { + "order": 41, "name": "worlion", "count": 33, "languages": 2 }, { - "order": 41, + "order": 42, "name": "avcenal", "count": 33, "languages": 1 }, { - "order": 42, + "order": 43, "name": "juandaherrera", "count": 32, "languages": 5 }, { - "order": 43, + "order": 44, "name": "pedroomar23", "count": 32, "languages": 3 }, { - "order": 44, + "order": 45, "name": "pyramsd", "count": 32, "languages": 1 }, { - "order": 45, + "order": 46, "name": "fborjalv", "count": 32, "languages": 1 }, - { - "order": 46, - "name": "ronipg", - "count": 31, - "languages": 4 - }, { "order": 47, - "name": "qv1ko", + "name": "ronipg", "count": 31, "languages": 4 }, @@ -807,40 +812,40 @@ }, { "order": 55, + "name": "eulogioep", + "count": 28, + "languages": 1 + }, + { + "order": 56, "name": "thegera4", "count": 27, "languages": 2 }, { - "order": 56, + "order": 57, "name": "parababire", "count": 27, "languages": 1 }, { - "order": 57, + "order": 58, "name": "isilanes", "count": 27, "languages": 1 }, { - "order": 58, + "order": 59, "name": "lucasrebuffo", "count": 27, "languages": 1 }, { - "order": 59, + "order": 60, "name": "nightblockchain30", "count": 26, "languages": 2 }, - { - "order": 60, - "name": "eulogioep", - "count": 26, - "languages": 1 - }, { "order": 61, "name": "caverobrandon", @@ -855,21 +860,21 @@ }, { "order": 63, - "name": "monicavaquerano", + "name": "isaacus98", "count": 25, - "languages": 2 + "languages": 4 }, { "order": 64, - "name": "allbertomd", + "name": "monicavaquerano", "count": 25, - "languages": 1 + "languages": 2 }, { "order": 65, - "name": "isaacus98", - "count": 24, - "languages": 3 + "name": "allbertomd", + "count": 25, + "languages": 1 }, { "order": 66, @@ -993,67 +998,67 @@ }, { "order": 86, - "name": "trufoplus", + "name": "juandaw37", "count": 19, "languages": 1 }, { "order": 87, + "name": "trufoplus", + "count": 19, + "languages": 1 + }, + { + "order": 88, "name": "pguillo02", "count": 18, "languages": 5 }, { - "order": 88, + "order": 89, "name": "estuardodev", "count": 18, "languages": 4 }, { - "order": 89, + "order": 90, "name": "lumanet", "count": 18, "languages": 1 }, { - "order": 90, + "order": 91, "name": "mensius87", "count": 17, "languages": 4 }, { - "order": 91, + "order": 92, "name": "kevined11", "count": 17, "languages": 3 }, { - "order": 92, + "order": 93, "name": "raulfauli", "count": 17, "languages": 2 }, { - "order": 93, + "order": 94, "name": "saicobys", "count": 17, "languages": 2 }, - { - "order": 94, - "name": "andreavzqz", - "count": 17, - "languages": 1 - }, { "order": 95, - "name": "hyromy", + "name": "andreavzqz", "count": 17, "languages": 1 }, { "order": 96, - "name": "juandaw37", + "name": "hyromy", "count": 17, "languages": 1 }, @@ -1137,340 +1142,340 @@ }, { "order": 110, + "name": "gordo-master", + "count": 15, + "languages": 1 + }, + { + "order": 111, "name": "sniker1223", "count": 14, "languages": 4 }, { - "order": 111, + "order": 112, + "name": "redom69", + "count": 14, + "languages": 4 + }, + { + "order": 113, "name": "andresgcastillo", "count": 14, "languages": 2 }, { - "order": 112, + "order": 114, "name": "ygriegasb", "count": 14, "languages": 2 }, { - "order": 113, + "order": 115, "name": "gonzadev28", "count": 14, "languages": 2 }, { - "order": 114, + "order": 116, "name": "elmer125", "count": 14, "languages": 1 }, { - "order": 115, + "order": 117, "name": "vincentrodriguezr", "count": 14, "languages": 1 }, { - "order": 116, + "order": 118, "name": "mikelm2020", "count": 14, "languages": 1 }, { - "order": 117, - "name": "gordo-master", - "count": 14, - "languages": 1 - }, - { - "order": 118, + "order": 119, "name": "paula2409", "count": 14, "languages": 1 }, { - "order": 119, + "order": 120, "name": "volumidev", "count": 13, "languages": 3 }, { - "order": 120, + "order": 121, "name": "diegoibb", "count": 13, "languages": 3 }, { - "order": 121, + "order": 122, "name": "manjaitan", "count": 13, "languages": 2 }, { - "order": 122, + "order": 123, "name": "jesuses1312", "count": 13, "languages": 2 }, { - "order": 123, + "order": 124, "name": "ocram1304", "count": 13, "languages": 1 }, { - "order": 124, + "order": 125, "name": "dan-corbo", "count": 13, "languages": 1 }, { - "order": 125, + "order": 126, "name": "juanchernandezdev", "count": 13, "languages": 1 }, { - "order": 126, + "order": 127, "name": "c-gabs", "count": 13, "languages": 1 }, { - "order": 127, + "order": 128, "name": "jav-mol", "count": 13, "languages": 1 }, { - "order": 128, + "order": 129, "name": "tomu98", "count": 13, "languages": 1 }, { - "order": 129, + "order": 130, + "name": "mvidalb", + "count": 13, + "languages": 1 + }, + { + "order": 131, "name": "neosv", "count": 13, "languages": 1 }, { - "order": 130, + "order": 132, "name": "julian98789", "count": 13, "languages": 1 }, { - "order": 131, + "order": 133, "name": "juanrcoder", "count": 12, "languages": 2 }, { - "order": 132, + "order": 134, "name": "keltoi-dev", "count": 12, "languages": 2 }, { - "order": 133, + "order": 135, "name": "andresmcardenas", "count": 12, "languages": 2 }, { - "order": 134, + "order": 136, "name": "a-mayans", "count": 12, "languages": 2 }, { - "order": 135, + "order": 137, "name": "deathwing696", "count": 12, "languages": 2 }, { - "order": 136, + "order": 138, "name": "pancratzia", "count": 12, "languages": 1 }, { - "order": 137, + "order": 139, "name": "jeronimocardu", "count": 12, "languages": 1 }, { - "order": 138, + "order": 140, "name": "evilpotato04", "count": 12, "languages": 1 }, { - "order": 139, + "order": 141, "name": "javierjoyera", "count": 12, "languages": 1 }, { - "order": 140, + "order": 142, "name": "dataciriano", "count": 12, "languages": 1 }, { - "order": 141, + "order": 143, "name": "josealberto13", "count": 12, "languages": 1 }, { - "order": 142, + "order": 144, "name": "clmiranda", "count": 12, "languages": 1 }, { - "order": 143, + "order": 145, "name": "andrewcodev", "count": 12, "languages": 1 }, { - "order": 144, + "order": 146, "name": "javierfiestasbotella", "count": 12, "languages": 1 }, { - "order": 145, + "order": 147, "name": "pipe281", "count": 12, "languages": 1 }, { - "order": 146, + "order": 148, "name": "jchavescaceres", "count": 11, "languages": 2 }, { - "order": 147, + "order": 149, "name": "switchdays", "count": 11, "languages": 2 }, { - "order": 148, + "order": 150, "name": "arkmiguel379", "count": 11, "languages": 2 }, { - "order": 149, + "order": 151, "name": "ialmontedr0", "count": 11, "languages": 1 }, { - "order": 150, + "order": 152, "name": "charlerodriguez3", "count": 11, "languages": 1 }, { - "order": 151, + "order": 153, "name": "oleojake", "count": 11, "languages": 1 }, { - "order": 152, + "order": 154, "name": "7r0n1x", "count": 11, "languages": 1 }, { - "order": 153, + "order": 155, "name": "alainmartz", "count": 11, "languages": 1 }, { - "order": 154, + "order": 156, "name": "warclimb", "count": 11, "languages": 1 }, { - "order": 155, + "order": 157, "name": "mirandayuber", "count": 11, "languages": 1 }, { - "order": 156, + "order": 158, "name": "m1l0j05", "count": 11, "languages": 1 }, { - "order": 157, + "order": 159, "name": "59822", "count": 11, "languages": 1 }, { - "order": 158, - "name": "mvidalb", - "count": 11, - "languages": 1 - }, - { - "order": 159, + "order": 160, "name": "majinka10", "count": 11, "languages": 1 }, { - "order": 160, + "order": 161, "name": "jeigar2", "count": 11, "languages": 1 }, { - "order": 161, + "order": 162, "name": "abelade", "count": 11, "languages": 1 }, { - "order": 162, + "order": 163, "name": "gustavogomez19", "count": 11, "languages": 1 }, { - "order": 163, + "order": 164, "name": "evanz2608", "count": 11, "languages": 1 }, { - "order": 164, + "order": 165, "name": "bertomp", "count": 10, "languages": 5 }, - { - "order": 165, - "name": "redom69", - "count": 10, - "languages": 4 - }, { "order": 166, "name": "othamae", @@ -2061,1777 +2066,1777 @@ }, { "order": 264, - "name": "eloychavezdev", + "name": "oixild", "count": 5, - "languages": 1 + "languages": 2 }, { "order": 265, - "name": "vasilealexandru02", + "name": "eloychavezdev", "count": 5, "languages": 1 }, { "order": 266, - "name": "esaens12", + "name": "vasilealexandru02", "count": 5, "languages": 1 }, { "order": 267, - "name": "victormugo", + "name": "esaens12", "count": 5, "languages": 1 }, { "order": 268, - "name": "adridoce", + "name": "victormugo", "count": 5, "languages": 1 }, { "order": 269, - "name": "vixito", + "name": "adridoce", "count": 5, "languages": 1 }, { "order": 270, - "name": "danielbustos342", + "name": "vixito", "count": 5, "languages": 1 }, { "order": 271, - "name": "douglasdiazr", + "name": "danielbustos342", "count": 5, "languages": 1 }, { "order": 272, - "name": "n1sek", + "name": "douglasdiazr", "count": 5, "languages": 1 }, { "order": 273, - "name": "robmxz", + "name": "n1sek", "count": 5, "languages": 1 }, { "order": 274, - "name": "d4-n1", + "name": "robmxz", "count": 5, "languages": 1 }, { "order": 275, - "name": "lauracastrillonmp", + "name": "d4-n1", "count": 5, "languages": 1 }, { "order": 276, - "name": "joanfv-git", + "name": "lauracastrillonmp", "count": 5, "languages": 1 }, { "order": 277, - "name": "yharyarias", + "name": "joanfv-git", "count": 5, "languages": 1 }, { "order": 278, - "name": "jorgeadamowicz", + "name": "yharyarias", "count": 5, "languages": 1 }, { "order": 279, - "name": "franz-arzapalo", + "name": "jorgeadamowicz", "count": 5, "languages": 1 }, { "order": 280, - "name": "d0ubt0", + "name": "franz-arzapalo", "count": 5, "languages": 1 }, { "order": 281, - "name": "gmbarrios", + "name": "d0ubt0", "count": 5, "languages": 1 }, { "order": 282, - "name": "santiago434c", + "name": "gmbarrios", "count": 5, "languages": 1 }, { "order": 283, - "name": "augustdev2003", + "name": "santiago434c", "count": 5, "languages": 1 }, { "order": 284, - "name": "alberba", + "name": "augustdev2003", "count": 5, "languages": 1 }, { "order": 285, - "name": "gabrielramos02", + "name": "alberba", "count": 5, "languages": 1 }, { "order": 286, - "name": "thezhizn", + "name": "gabrielramos02", "count": 5, "languages": 1 }, { "order": 287, - "name": "jose-luis-lanza", + "name": "thezhizn", "count": 5, "languages": 1 }, { "order": 288, - "name": "nomellamodante", + "name": "jose-luis-lanza", "count": 5, "languages": 1 }, { "order": 289, - "name": "karolle", + "name": "nomellamodante", "count": 5, "languages": 1 }, { "order": 290, - "name": "jcrodmir", + "name": "karolle", "count": 5, "languages": 1 }, { "order": 291, - "name": "alvarofernandezavalos", + "name": "jcrodmir", "count": 5, "languages": 1 }, { "order": 292, - "name": "lucasag01", + "name": "alvarofernandezavalos", "count": 5, "languages": 1 }, { "order": 293, - "name": "thaishdz", + "name": "lucasag01", "count": 5, "languages": 1 }, { "order": 294, - "name": "bastianalq", + "name": "thaishdz", "count": 5, "languages": 1 }, { "order": 295, - "name": "w00k", + "name": "bastianalq", "count": 5, "languages": 1 }, { "order": 296, - "name": "boterop", + "name": "w00k", "count": 5, "languages": 1 }, { "order": 297, - "name": "zarakilancelot", - "count": 4, - "languages": 3 + "name": "boterop", + "count": 5, + "languages": 1 }, { "order": 298, - "name": "eonozux", - "count": 4, - "languages": 2 + "name": "rafacv23", + "count": 5, + "languages": 1 }, { "order": 299, - "name": "yablik", + "name": "zarakilancelot", "count": 4, - "languages": 2 + "languages": 3 }, { "order": 300, - "name": "fullovellas", + "name": "eonozux", "count": 4, "languages": 2 }, { "order": 301, - "name": "k3nvd", + "name": "yablik", "count": 4, "languages": 2 }, { "order": 302, - "name": "josefuentes-dev", + "name": "fullovellas", "count": 4, "languages": 2 }, { "order": 303, - "name": "willr30", + "name": "k3nvd", "count": 4, "languages": 2 }, { "order": 304, - "name": "ruthmp", + "name": "josefuentes-dev", "count": 4, "languages": 2 }, { "order": 305, - "name": "oixild", + "name": "willr30", "count": 4, "languages": 2 }, { "order": 306, - "name": "daeduol", + "name": "ruthmp", "count": 4, "languages": 2 }, { "order": 307, - "name": "mendozalz", + "name": "daeduol", "count": 4, "languages": 2 }, { "order": 308, - "name": "salkalero", + "name": "mendozalz", "count": 4, "languages": 2 }, { "order": 309, - "name": "elhacedordecosas", + "name": "salkalero", "count": 4, - "languages": 1 + "languages": 2 }, { "order": 310, - "name": "andeveling", + "name": "drvito1977", "count": 4, "languages": 1 }, { "order": 311, - "name": "santiago-munoz-garcia", + "name": "elhacedordecosas", "count": 4, "languages": 1 }, { "order": 312, - "name": "deivitdev", + "name": "andeveling", "count": 4, "languages": 1 }, { "order": 313, - "name": "joshbaez", + "name": "santiago-munoz-garcia", "count": 4, "languages": 1 }, { "order": 314, - "name": "marcoslombardo", + "name": "deivitdev", "count": 4, "languages": 1 }, { "order": 315, - "name": "lrpeset", + "name": "joshbaez", "count": 4, "languages": 1 }, { "order": 316, - "name": "dieswae", + "name": "marcoslombardo", "count": 4, "languages": 1 }, { "order": 317, - "name": "mateo423", + "name": "lrpeset", "count": 4, "languages": 1 }, { "order": 318, - "name": "joaquinlopez14", + "name": "dieswae", "count": 4, "languages": 1 }, { "order": 319, - "name": "angelurrutdev", + "name": "mateo423", "count": 4, "languages": 1 }, { "order": 320, - "name": "elianisdev", + "name": "joaquinlopez14", "count": 4, "languages": 1 }, { "order": 321, - "name": "omegatroy", + "name": "angelurrutdev", "count": 4, "languages": 1 }, { "order": 322, - "name": "socramwd", + "name": "elianisdev", "count": 4, "languages": 1 }, { "order": 323, - "name": "carzep09", + "name": "omegatroy", "count": 4, "languages": 1 }, { "order": 324, - "name": "mayerga", + "name": "socramwd", "count": 4, "languages": 1 }, { "order": 325, - "name": "hugovrc", + "name": "carzep09", "count": 4, "languages": 1 }, { "order": 326, - "name": "cdbiancotti", + "name": "mayerga", "count": 4, "languages": 1 }, { "order": 327, - "name": "h4ckxel", + "name": "hugovrc", "count": 4, "languages": 1 }, { "order": 328, - "name": "tobibordino", + "name": "cdbiancotti", "count": 4, "languages": 1 }, { "order": 329, - "name": "guillermo-k", + "name": "h4ckxel", "count": 4, "languages": 1 }, { "order": 330, - "name": "zakkdrte", + "name": "tobibordino", "count": 4, "languages": 1 }, { "order": 331, - "name": "sarismejiasanchez", + "name": "guillermo-k", "count": 4, "languages": 1 }, { "order": 332, - "name": "buriticasara", + "name": "zakkdrte", "count": 4, "languages": 1 }, { "order": 333, - "name": "davstudy", + "name": "sarismejiasanchez", "count": 4, "languages": 1 }, { "order": 334, - "name": "zerek247", + "name": "buriticasara", "count": 4, "languages": 1 }, { "order": 335, - "name": "vicman-182", + "name": "davstudy", "count": 4, "languages": 1 }, { "order": 336, - "name": "dlgai12", + "name": "zerek247", "count": 4, "languages": 1 }, { "order": 337, - "name": "rodrigoghr", + "name": "vicman-182", "count": 4, "languages": 1 }, { "order": 338, - "name": "txuky", + "name": "dlgai12", "count": 4, "languages": 1 }, { "order": 339, - "name": "nox456", + "name": "rodrigoghr", "count": 4, "languages": 1 }, { "order": 340, - "name": "mplatab", + "name": "txuky", "count": 4, "languages": 1 }, { "order": 341, - "name": "angell4s", + "name": "nox456", "count": 4, "languages": 1 }, { "order": 342, - "name": "quejuan52", + "name": "mplatab", "count": 4, "languages": 1 }, { "order": 343, - "name": "axelprz", + "name": "angell4s", "count": 4, "languages": 1 }, { "order": 344, - "name": "javirub", + "name": "quejuan52", "count": 4, "languages": 1 }, { "order": 345, - "name": "mallcca", + "name": "axelprz", "count": 4, "languages": 1 }, { "order": 346, - "name": "sunjamer", + "name": "javirub", "count": 4, "languages": 1 }, { "order": 347, - "name": "carrenoalexander", + "name": "mallcca", "count": 4, "languages": 1 }, { "order": 348, - "name": "jadraz", + "name": "sunjamer", "count": 4, "languages": 1 }, { "order": 349, - "name": "anvildestroyer", + "name": "carrenoalexander", "count": 4, "languages": 1 }, { "order": 350, - "name": "luissssoto", + "name": "jadraz", "count": 4, "languages": 1 }, { "order": 351, - "name": "albertorevel", + "name": "anvildestroyer", "count": 4, "languages": 1 }, { "order": 352, - "name": "juanca2805", + "name": "luissssoto", "count": 4, "languages": 1 }, { "order": 353, - "name": "bladi23", + "name": "albertorevel", "count": 4, "languages": 1 }, { "order": 354, - "name": "blasbarragan", + "name": "juanca2805", "count": 4, "languages": 1 }, { "order": 355, - "name": "jerrysantana", + "name": "bladi23", "count": 4, "languages": 1 }, { "order": 356, - "name": "abel-ade", + "name": "blasbarragan", "count": 4, "languages": 1 }, { "order": 357, - "name": "jairo-alejandro", + "name": "jerrysantana", "count": 4, "languages": 1 }, { "order": 358, - "name": "sbs24", + "name": "abel-ade", "count": 4, "languages": 1 }, { "order": 359, - "name": "traver79", + "name": "jairo-alejandro", "count": 4, "languages": 1 }, { "order": 360, - "name": "ramxv", + "name": "sbs24", "count": 4, "languages": 1 }, { "order": 361, - "name": "inkhemi", + "name": "traver79", "count": 4, "languages": 1 }, { "order": 362, - "name": "juperdev", + "name": "ramxv", "count": 4, "languages": 1 }, { "order": 363, - "name": "rafacv23", + "name": "inkhemi", "count": 4, "languages": 1 }, { "order": 364, - "name": "d1d4cum", + "name": "juperdev", "count": 4, "languages": 1 }, { "order": 365, - "name": "mohamedelderkaoui", + "name": "d1d4cum", "count": 4, "languages": 1 }, { "order": 366, + "name": "mohamedelderkaoui", + "count": 4, + "languages": 1 + }, + { + "order": 367, "name": "abelsrzz", "count": 3, "languages": 3 }, { - "order": 367, + "order": 368, "name": "angelo-eyama", "count": 3, "languages": 3 }, { - "order": 368, + "order": 369, "name": "akaisombra", "count": 3, "languages": 3 }, { - "order": 369, + "order": 370, "name": "oskarcali", "count": 3, "languages": 3 }, { - "order": 370, + "order": 371, "name": "owen-ian", "count": 3, "languages": 3 }, { - "order": 371, + "order": 372, "name": "jehiselruth", "count": 3, "languages": 3 }, { - "order": 372, + "order": 373, "name": "n-skot", "count": 3, "languages": 2 }, { - "order": 373, + "order": 374, + "name": "clotrack", + "count": 3, + "languages": 2 + }, + { + "order": 375, "name": "dimasb69", "count": 3, "languages": 2 }, { - "order": 374, + "order": 376, "name": "alfarog507", "count": 3, "languages": 2 }, { - "order": 375, + "order": 377, "name": "eloitr", "count": 3, "languages": 2 }, { - "order": 376, + "order": 378, "name": "diegopc-dev", "count": 3, "languages": 2 }, { - "order": 377, + "order": 379, "name": "robindev1812", "count": 3, "languages": 2 }, { - "order": 378, + "order": 380, "name": "arliumdev", "count": 3, "languages": 2 }, { - "order": 379, + "order": 381, "name": "skala2301", "count": 3, "languages": 2 }, { - "order": 380, + "order": 382, "name": "pablotaber", "count": 3, "languages": 2 }, { - "order": 381, + "order": 383, "name": "allanoscoding", "count": 3, "languages": 2 }, { - "order": 382, + "order": 384, "name": "seba9906", "count": 3, "languages": 2 }, { - "order": 383, + "order": 385, "name": "augustosdev", "count": 3, "languages": 2 }, { - "order": 384, + "order": 386, "name": "dylanb55", "count": 3, "languages": 1 }, { - "order": 385, + "order": 387, "name": "mellamoomar", "count": 3, "languages": 1 }, { - "order": 386, + "order": 388, "name": "oscar503sv", "count": 3, "languages": 1 }, { - "order": 387, + "order": 389, "name": "alejomazov", "count": 3, "languages": 1 }, { - "order": 388, + "order": 390, "name": "bryanalzate007", "count": 3, "languages": 1 }, { - "order": 389, + "order": 391, "name": "ivanpelu7", "count": 3, "languages": 1 }, { - "order": 390, + "order": 392, "name": "dmauricio4", "count": 3, "languages": 1 }, { - "order": 391, + "order": 393, "name": "davidr1594", "count": 3, "languages": 1 }, { - "order": 392, + "order": 394, "name": "vandresca", "count": 3, "languages": 1 }, { - "order": 393, + "order": 395, "name": "marlonleon2023", "count": 3, "languages": 1 }, { - "order": 394, + "order": 396, "name": "nikorasu-d", "count": 3, "languages": 1 }, { - "order": 395, + "order": 397, "name": "barbafebles", "count": 3, "languages": 1 }, { - "order": 396, + "order": 398, "name": "heliercamejo", "count": 3, "languages": 1 }, { - "order": 397, + "order": 399, "name": "aggranadoss", "count": 3, "languages": 1 }, { - "order": 398, + "order": 400, "name": "dannyvera1234", "count": 3, "languages": 1 }, { - "order": 399, + "order": 401, "name": "axelsparta", "count": 3, "languages": 1 }, { - "order": 400, + "order": 402, "name": "gitperalta", "count": 3, "languages": 1 }, { - "order": 401, + "order": 403, "name": "samuelarandia", "count": 3, "languages": 1 }, { - "order": 402, + "order": 404, "name": "jaimerocel96", "count": 3, "languages": 1 }, { - "order": 403, + "order": 405, "name": "sitnestic", "count": 3, "languages": 1 }, { - "order": 404, + "order": 406, "name": "matteozhao98", "count": 3, "languages": 1 }, { - "order": 405, + "order": 407, "name": "tebaah", "count": 3, "languages": 1 }, { - "order": 406, + "order": 408, "name": "sebasgrdev", "count": 3, "languages": 1 }, { - "order": 407, + "order": 409, "name": "14davidnkt", "count": 3, "languages": 1 }, { - "order": 408, + "order": 410, "name": "legs30011", "count": 3, "languages": 1 }, { - "order": 409, + "order": 411, "name": "dariorfm", "count": 3, "languages": 1 }, { - "order": 410, + "order": 412, "name": "orlas135", "count": 3, "languages": 1 }, { - "order": 411, + "order": 413, "name": "arbenisacosta", "count": 3, "languages": 1 }, { - "order": 412, + "order": 414, "name": "hectoriglesias", "count": 3, "languages": 1 }, { - "order": 413, + "order": 415, "name": "matrix-miguel", "count": 3, "languages": 1 }, { - "order": 414, + "order": 416, "name": "jacarrillob", "count": 3, "languages": 1 }, { - "order": 415, + "order": 417, "name": "jelozanov", "count": 3, "languages": 1 }, { - "order": 416, + "order": 418, "name": "andyfg0289", "count": 3, "languages": 1 }, { - "order": 417, + "order": 419, "name": "daniback95", "count": 3, "languages": 1 }, { - "order": 418, + "order": 420, "name": "r4kso", "count": 3, "languages": 1 }, { - "order": 419, + "order": 421, "name": "singularpigeon", "count": 3, "languages": 1 }, { - "order": 420, + "order": 422, "name": "sandracalatayud", "count": 3, "languages": 1 }, { - "order": 421, + "order": 423, "name": "andresargote", "count": 3, "languages": 1 }, { - "order": 422, + "order": 424, "name": "fernandog25", "count": 3, "languages": 1 }, { - "order": 423, + "order": 425, "name": "agusbelp", "count": 3, "languages": 1 }, { - "order": 424, + "order": 426, "name": "uyarra73", "count": 3, "languages": 1 }, { - "order": 425, + "order": 427, "name": "asaelz", "count": 3, "languages": 1 }, { - "order": 426, + "order": 428, "name": "davidb313", "count": 3, "languages": 1 }, { - "order": 427, + "order": 429, "name": "fdcorreadev", "count": 3, "languages": 1 }, { - "order": 428, + "order": 430, "name": "magupe09", "count": 3, "languages": 1 }, { - "order": 429, + "order": 431, "name": "nathaliamf", "count": 3, "languages": 1 }, { - "order": 430, + "order": 432, "name": "victorsschz", "count": 3, "languages": 1 }, { - "order": 431, + "order": 433, "name": "hatorob", "count": 3, "languages": 1 }, { - "order": 432, + "order": 434, "name": "zuluangel", "count": 3, "languages": 1 }, { - "order": 433, + "order": 435, "name": "matiascba27", "count": 3, "languages": 1 }, { - "order": 434, + "order": 436, "name": "faga01", "count": 3, "languages": 1 }, { - "order": 435, + "order": 437, "name": "ahinar", "count": 3, "languages": 1 }, { - "order": 436, + "order": 438, "name": "migueltfangche", "count": 3, "languages": 1 }, { - "order": 437, + "order": 439, "name": "josueeeee", "count": 3, "languages": 1 }, { - "order": 438, + "order": 440, "name": "emaenriquez", "count": 3, "languages": 1 }, { - "order": 439, + "order": 441, "name": "sebascmb", "count": 3, "languages": 1 }, { - "order": 440, + "order": 442, "name": "gpinedaoviedo", "count": 3, "languages": 1 }, { - "order": 441, + "order": 443, "name": "blfuentes", "count": 3, "languages": 1 }, { - "order": 442, + "order": 444, "name": "javiearth", "count": 3, "languages": 1 }, { - "order": 443, + "order": 445, "name": "atienzar", "count": 3, "languages": 1 }, { - "order": 444, + "order": 446, "name": "coshiloco", "count": 3, "languages": 1 }, { - "order": 445, + "order": 447, "name": "crisvigas", "count": 3, "languages": 1 }, { - "order": 446, + "order": 448, "name": "tomytsa", "count": 3, "languages": 1 }, { - "order": 447, + "order": 449, "name": "rocallejas", "count": 3, "languages": 1 }, { - "order": 448, + "order": 450, "name": "guido2288", "count": 3, "languages": 1 }, { - "order": 449, + "order": 451, "name": "githjuan", "count": 3, "languages": 1 }, { - "order": 450, + "order": 452, "name": "jeyker-dev", "count": 3, "languages": 1 }, { - "order": 451, + "order": 453, "name": "eliskopun", "count": 3, "languages": 1 }, { - "order": 452, + "order": 454, "name": "ramon-almeida", "count": 3, "languages": 1 }, { - "order": 453, + "order": 455, "name": "danielperezrubio", "count": 3, "languages": 1 }, { - "order": 454, + "order": 456, "name": "minn09", "count": 3, "languages": 1 }, { - "order": 455, + "order": 457, "name": "elkin-dev", "count": 3, "languages": 1 }, { - "order": 456, + "order": 458, "name": "bertolini-victor", "count": 3, "languages": 1 }, { - "order": 457, + "order": 459, "name": "jorgegarcia-dev", "count": 3, "languages": 1 }, { - "order": 458, + "order": 460, "name": "suescun845", "count": 3, "languages": 1 }, { - "order": 459, + "order": 461, "name": "carlosalberto05", "count": 3, "languages": 1 }, { - "order": 460, + "order": 462, "name": "mmacalli", "count": 3, "languages": 1 }, { - "order": 461, + "order": 463, "name": "mstaz4", "count": 3, "languages": 1 }, { - "order": 462, + "order": 464, "name": "emilianohoyos", "count": 3, "languages": 1 }, { - "order": 463, + "order": 465, "name": "rgeditv1", "count": 3, "languages": 1 }, { - "order": 464, + "order": 466, "name": "elder202", "count": 3, "languages": 1 }, { - "order": 465, + "order": 467, "name": "dandrusco", "count": 3, "languages": 1 }, { - "order": 466, + "order": 468, "name": "mizadlogcia", "count": 3, "languages": 1 }, { - "order": 467, + "order": 469, "name": "antii16", "count": 3, "languages": 1 }, { - "order": 468, + "order": 470, "name": "strooplab", "count": 3, "languages": 1 }, { - "order": 469, + "order": 471, "name": "marcoh2325", "count": 3, "languages": 1 }, { - "order": 470, + "order": 472, "name": "frostbitepy", "count": 3, "languages": 1 }, { - "order": 471, + "order": 473, "name": "zzepu", "count": 3, "languages": 1 }, { - "order": 472, + "order": 474, "name": "tekatoki", "count": 3, "languages": 1 }, { - "order": 473, + "order": 475, "name": "yeam-10", "count": 3, "languages": 1 }, { - "order": 474, + "order": 476, "name": "exanderguitar", "count": 3, "languages": 1 }, { - "order": 475, + "order": 477, "name": "camilo-zuluaga", "count": 3, "languages": 1 }, { - "order": 476, + "order": 478, "name": "macova96", "count": 3, "languages": 1 }, { - "order": 477, + "order": 479, "name": "betzadev", "count": 3, "languages": 1 }, { - "order": 478, + "order": 480, "name": "monikgbar", "count": 3, "languages": 1 }, { - "order": 479, + "order": 481, "name": "guillesese", "count": 3, "languages": 1 }, { - "order": 480, + "order": 482, "name": "artdugarte", "count": 3, "languages": 1 }, { - "order": 481, + "order": 483, "name": "jofedev", "count": 3, "languages": 1 }, { - "order": 482, + "order": 484, "name": "oscarhub90", "count": 3, "languages": 1 }, { - "order": 483, + "order": 485, "name": "tonywarcode", "count": 3, "languages": 1 }, { - "order": 484, + "order": 486, "name": "oscargeovannyrincon", "count": 3, "languages": 1 }, { - "order": 485, + "order": 487, "name": "joandevpy", "count": 3, "languages": 1 }, { - "order": 486, + "order": 488, "name": "estelacode", "count": 3, "languages": 1 }, { - "order": 487, + "order": 489, "name": "xurxogz", "count": 3, "languages": 1 }, { - "order": 488, + "order": 490, "name": "freedainew", "count": 3, "languages": 1 }, { - "order": 489, + "order": 491, "name": "swifty0705", "count": 3, "languages": 1 }, { - "order": 490, + "order": 492, "name": "marce1084", "count": 3, "languages": 1 }, { - "order": 491, + "order": 493, "name": "rubioj17", "count": 3, "languages": 1 }, { - "order": 492, + "order": 494, "name": "kingsaul22", "count": 3, "languages": 1 }, { - "order": 493, + "order": 495, "name": "ainoaran", "count": 3, "languages": 1 }, { - "order": 494, + "order": 496, "name": "francofmv", "count": 3, "languages": 1 }, { - "order": 495, + "order": 497, "name": "davidsorroche", "count": 3, "languages": 1 }, { - "order": 496, + "order": 498, "name": "david-quinones", "count": 3, "languages": 1 }, { - "order": 497, + "order": 499, "name": "fluna29", "count": 3, "languages": 1 }, { - "order": 498, + "order": 500, "name": "natalinacn", "count": 3, "languages": 1 }, { - "order": 499, + "order": 501, "name": "kine-jdf", "count": 3, "languages": 1 }, { - "order": 500, + "order": 502, "name": "yaretzyrb", "count": 3, "languages": 1 }, { - "order": 501, + "order": 503, "name": "confley", "count": 3, "languages": 1 }, { - "order": 502, + "order": 504, "name": "beonzj", "count": 3, "languages": 1 }, { - "order": 503, + "order": 505, "name": "juxxon23", "count": 3, "languages": 1 }, { - "order": 504, + "order": 506, "name": "frangarmez21", "count": 3, "languages": 1 }, { - "order": 505, + "order": 507, "name": "ikeragi05", "count": 3, "languages": 1 }, { - "order": 506, + "order": 508, "name": "johnalexguerrero", "count": 3, "languages": 1 }, { - "order": 507, + "order": 509, "name": "devvdroid01", "count": 2, "languages": 2 }, { - "order": 508, - "name": "clotrack", - "count": 2, - "languages": 2 - }, - { - "order": 509, + "order": 510, "name": "sgb004", "count": 2, "languages": 2 }, { - "order": 510, + "order": 511, "name": "chuanmi", "count": 2, "languages": 2 }, { - "order": 511, + "order": 512, "name": "jlcareglio", "count": 2, "languages": 2 }, { - "order": 512, + "order": 513, "name": "jurgen-alfaro", "count": 2, "languages": 2 }, { - "order": 513, + "order": 514, "name": "lydaf", "count": 2, "languages": 2 }, { - "order": 514, + "order": 515, "name": "carresoft", "count": 2, "languages": 2 }, { - "order": 515, + "order": 516, "name": "ismaelmatiz", "count": 2, "languages": 2 }, { - "order": 516, + "order": 517, "name": "tecfer", "count": 2, "languages": 2 }, { - "order": 517, + "order": 518, "name": "elsanty08", "count": 2, "languages": 2 }, { - "order": 518, + "order": 519, "name": "jorgesilencio", "count": 2, "languages": 2 }, { - "order": 519, + "order": 520, "name": "berentolkien", "count": 2, "languages": 2 }, { - "order": 520, + "order": 521, "name": "felipedev303", "count": 2, "languages": 2 }, { - "order": 521, + "order": 522, "name": "lemito66", "count": 2, "languages": 2 }, { - "order": 522, + "order": 523, "name": "alexsamboy", "count": 2, "languages": 2 }, { - "order": 523, + "order": 524, "name": "enrgarvic", "count": 2, "languages": 2 }, { - "order": 524, + "order": 525, "name": "jovany-java", "count": 2, "languages": 2 }, { - "order": 525, + "order": 526, "name": "raul-progr", "count": 2, "languages": 2 }, { - "order": 526, + "order": 527, "name": "jmofuture", "count": 2, "languages": 2 }, { - "order": 527, + "order": 528, "name": "angel-alvarez-dev", "count": 2, "languages": 2 }, { - "order": 528, + "order": 529, "name": "lilberick", "count": 2, "languages": 2 }, { - "order": 529, + "order": 530, "name": "camiloforero1997", "count": 2, "languages": 2 }, { - "order": 530, + "order": 531, "name": "alejosor", "count": 2, "languages": 2 }, { - "order": 531, + "order": 532, "name": "juan-wills", "count": 2, "languages": 2 }, { - "order": 532, + "order": 533, "name": "lurtur", "count": 2, "languages": 2 }, { - "order": 533, + "order": 534, "name": "jhonatanmustiolacas", "count": 2, "languages": 2 }, - { - "order": 534, - "name": "elmarqueli", - "count": 2, - "languages": 1 - }, { "order": 535, - "name": "tiaguiito3", + "name": "elmarqueli", "count": 2, "languages": 1 }, { "order": 536, - "name": "angelargumedo", + "name": "tiaguiito3", "count": 2, "languages": 1 }, { "order": 537, - "name": "reaien", + "name": "angelargumedo", "count": 2, "languages": 1 }, { "order": 538, - "name": "rikar20", + "name": "reaien", "count": 2, "languages": 1 }, { "order": 539, - "name": "vdroiid", + "name": "rikar20", "count": 2, "languages": 1 }, { "order": 540, - "name": "frannmv", + "name": "vdroiid", "count": 2, "languages": 1 }, { "order": 541, - "name": "rrcoder", + "name": "frannmv", "count": 2, "languages": 1 }, { "order": 542, - "name": "diegosilval", + "name": "rrcoder", "count": 2, "languages": 1 }, { "order": 543, - "name": "nandaalf", + "name": "diegosilval", "count": 2, "languages": 1 }, { "order": 544, - "name": "hawkbott", + "name": "nandaalf", "count": 2, "languages": 1 }, { "order": 545, - "name": "tomasmarquez81", + "name": "hawkbott", "count": 2, "languages": 1 }, { "order": 546, - "name": "poetry0354", + "name": "tomasmarquez81", "count": 2, "languages": 1 }, { "order": 547, - "name": "santiagocuevas2003", + "name": "poetry0354", "count": 2, "languages": 1 }, { "order": 548, - "name": "lmedina96", + "name": "santiagocuevas2003", "count": 2, "languages": 1 }, { "order": 549, - "name": "lorenamesa", + "name": "lmedina96", "count": 2, "languages": 1 }, { "order": 550, - "name": "raulallue", + "name": "lorenamesa", "count": 2, "languages": 1 }, { "order": 551, - "name": "luciarf", + "name": "raulallue", "count": 2, "languages": 1 }, { "order": 552, - "name": "aserranot", + "name": "luciarf", "count": 2, "languages": 1 }, { "order": 553, - "name": "devcherry1", + "name": "aserranot", "count": 2, "languages": 1 }, { "order": 554, - "name": "yowcloud", + "name": "devcherry1", "count": 2, "languages": 1 }, { "order": 555, - "name": "fefestuve", + "name": "yowcloud", "count": 2, "languages": 1 }, { "order": 556, - "name": "fsfigueroa77", + "name": "fefestuve", "count": 2, "languages": 1 }, { "order": 557, - "name": "nahuelborromeo", + "name": "fsfigueroa77", "count": 2, "languages": 1 }, { "order": 558, - "name": "peibolstrike", + "name": "nahuelborromeo", "count": 2, "languages": 1 }, { "order": 559, - "name": "drvito1977", + "name": "peibolstrike", "count": 2, "languages": 1 }, @@ -4113,3273 +4118,3321 @@ }, { "order": 606, - "name": "davhage", + "name": "duendeintemporal", "count": 2, "languages": 1 }, { "order": 607, - "name": "erikayeah", + "name": "davhage", "count": 2, "languages": 1 }, { "order": 608, - "name": "misterdan100", + "name": "erikayeah", "count": 2, "languages": 1 }, { "order": 609, - "name": "memogv", + "name": "misterdan100", "count": 2, "languages": 1 }, { "order": 610, - "name": "glaboryp", + "name": "memogv", "count": 2, "languages": 1 }, { "order": 611, - "name": "ovjohn", + "name": "glaboryp", "count": 2, "languages": 1 }, { "order": 612, - "name": "haryblanco20", + "name": "ovjohn", "count": 2, "languages": 1 }, { "order": 613, - "name": "christianhernandezb", + "name": "haryblanco20", "count": 2, "languages": 1 }, { "order": 614, - "name": "akzorla", + "name": "christianhernandezb", "count": 2, "languages": 1 }, { "order": 615, - "name": "0pio", + "name": "akzorla", "count": 2, "languages": 1 }, { "order": 616, - "name": "porto1090", + "name": "0pio", "count": 2, "languages": 1 }, { "order": 617, - "name": "johannhsdev", + "name": "porto1090", "count": 2, "languages": 1 }, { "order": 618, - "name": "jago86", + "name": "johannhsdev", "count": 2, "languages": 1 }, { "order": 619, - "name": "diegokarabin", + "name": "jago86", "count": 2, "languages": 1 }, { "order": 620, - "name": "gugliio", + "name": "diegokarabin", "count": 2, "languages": 1 }, { "order": 621, - "name": "kcx46", + "name": "gugliio", "count": 2, "languages": 1 }, { "order": 622, - "name": "nachodev7", + "name": "kcx46", "count": 2, "languages": 1 }, { "order": 623, - "name": "fernandoatello", + "name": "nachodev7", "count": 2, "languages": 1 }, { "order": 624, - "name": "pablosalme", + "name": "fernandoatello", "count": 2, "languages": 1 }, { "order": 625, - "name": "jsacristanbeltri", + "name": "pablosalme", "count": 2, "languages": 1 }, { "order": 626, - "name": "baauus", + "name": "jsacristanbeltri", "count": 2, "languages": 1 }, { "order": 627, - "name": "s384", + "name": "baauus", "count": 2, "languages": 1 }, { "order": 628, - "name": "lauradiazm29", + "name": "s384", "count": 2, "languages": 1 }, { "order": 629, - "name": "pakomor", + "name": "lauradiazm29", "count": 2, "languages": 1 }, { "order": 630, - "name": "adogdev", + "name": "pakomor", "count": 2, "languages": 1 }, { "order": 631, - "name": "eriickm", + "name": "adogdev", "count": 2, "languages": 1 }, { "order": 632, - "name": "christiancoc", + "name": "eriickm", "count": 2, "languages": 1 }, { "order": 633, - "name": "rojasricoo", + "name": "christiancoc", "count": 2, "languages": 1 }, { "order": 634, - "name": "inf015", + "name": "rojasricoo", "count": 2, "languages": 1 }, { "order": 635, - "name": "csaraugusto2", + "name": "inf015", "count": 2, "languages": 1 }, { "order": 636, - "name": "zalazarmartin", + "name": "csaraugusto2", "count": 2, "languages": 1 }, { "order": 637, - "name": "ziellucio01", + "name": "zalazarmartin", "count": 2, "languages": 1 }, { "order": 638, - "name": "dota43ver", + "name": "ziellucio01", "count": 2, "languages": 1 }, { "order": 639, - "name": "fjsubero", + "name": "dota43ver", "count": 2, "languages": 1 }, { "order": 640, - "name": "julind0", + "name": "fjsubero", "count": 2, "languages": 1 }, { "order": 641, - "name": "dariangl", + "name": "julind0", "count": 2, "languages": 1 }, { "order": 642, - "name": "ggtorca", + "name": "jmontoyac", "count": 2, "languages": 1 }, { "order": 643, - "name": "soydaviddev", + "name": "dariangl", "count": 2, "languages": 1 }, { "order": 644, - "name": "e-techgod", + "name": "ggtorca", "count": 2, "languages": 1 }, { "order": 645, - "name": "aboredllama", + "name": "soydaviddev", "count": 2, "languages": 1 }, { "order": 646, - "name": "nevaito", + "name": "e-techgod", "count": 2, "languages": 1 }, { "order": 647, - "name": "nach012", + "name": "aboredllama", "count": 2, "languages": 1 }, { "order": 648, - "name": "dans182", + "name": "nevaito", "count": 2, "languages": 1 }, { "order": 649, - "name": "freyfonseca", + "name": "nach012", "count": 2, "languages": 1 }, { "order": 650, - "name": "aegpgrafologo", + "name": "dans182", "count": 2, "languages": 1 }, { "order": 651, - "name": "alejandrovelasquezr", + "name": "freyfonseca", "count": 2, "languages": 1 }, { "order": 652, - "name": "fabianpa505", + "name": "aegpgrafologo", "count": 2, "languages": 1 }, { "order": 653, - "name": "carlosmarte23", + "name": "alejandrovelasquezr", "count": 2, "languages": 1 }, { "order": 654, - "name": "anblackter", + "name": "fabianpa505", "count": 2, "languages": 1 }, { "order": 655, - "name": "tic4", + "name": "carlosmarte23", "count": 2, "languages": 1 }, { "order": 656, - "name": "josephfaster", + "name": "anblackter", "count": 2, "languages": 1 }, { "order": 657, - "name": "gregfc95", + "name": "tic4", "count": 2, "languages": 1 }, { "order": 658, - "name": "victore16", + "name": "josephfaster", "count": 2, "languages": 1 }, { "order": 659, - "name": "dokeys28", + "name": "gregfc95", "count": 2, "languages": 1 }, { "order": 660, - "name": "noaregui", + "name": "victore16", "count": 2, "languages": 1 }, { "order": 661, - "name": "alejandro-mantilla", + "name": "dokeys28", "count": 2, "languages": 1 }, { "order": 662, - "name": "gmigues", + "name": "noaregui", "count": 2, "languages": 1 }, { "order": 663, - "name": "juanseevn", + "name": "alejandro-mantilla", "count": 2, "languages": 1 }, { "order": 664, - "name": "vesubius", + "name": "gmigues", "count": 2, "languages": 1 }, { "order": 665, - "name": "zeti1231", + "name": "juanseevn", "count": 2, "languages": 1 }, { "order": 666, - "name": "cipollalucas", + "name": "vesubius", "count": 2, "languages": 1 }, { "order": 667, - "name": "miguelberrio0810", + "name": "zeti1231", "count": 2, "languages": 1 }, { "order": 668, - "name": "santiagodc8", + "name": "cipollalucas", "count": 2, "languages": 1 }, { "order": 669, - "name": "pedrojog", + "name": "miguelberrio0810", "count": 2, "languages": 1 }, { "order": 670, - "name": "culebropalido", + "name": "santiagodc8", "count": 2, "languages": 1 }, { "order": 671, - "name": "marioyellowy", + "name": "pedrojog", "count": 2, "languages": 1 }, { "order": 672, - "name": "jcknot", + "name": "culebropalido", "count": 2, "languages": 1 }, { "order": 673, - "name": "peeanoot", + "name": "marioyellowy", "count": 2, "languages": 1 }, { "order": 674, - "name": "coronelsam", + "name": "jcknot", "count": 2, "languages": 1 }, { "order": 675, - "name": "arhl2023", + "name": "peeanoot", "count": 2, "languages": 1 }, { "order": 676, - "name": "marianoemir", + "name": "coronelsam", "count": 2, "languages": 1 }, { "order": 677, - "name": "isidrojng", + "name": "arhl2023", "count": 2, "languages": 1 }, { "order": 678, - "name": "anaroncero", + "name": "marianoemir", "count": 2, "languages": 1 }, { "order": 679, - "name": "hersac", + "name": "isidrojng", "count": 2, "languages": 1 }, { "order": 680, - "name": "vecinacoo", + "name": "anaroncero", "count": 2, "languages": 1 }, { "order": 681, - "name": "juanmjimenezs", + "name": "hersac", "count": 2, "languages": 1 }, { "order": 682, - "name": "armentaangel", + "name": "vecinacoo", "count": 2, "languages": 1 }, { "order": 683, - "name": "lordzzz777", + "name": "juanmjimenezs", "count": 2, "languages": 1 }, { "order": 684, - "name": "sdm29gh", + "name": "armentaangel", "count": 2, "languages": 1 }, { "order": 685, - "name": "zonnen69", + "name": "lordzzz777", "count": 2, "languages": 1 }, { "order": 686, - "name": "jmichael39", + "name": "sdm29gh", "count": 2, "languages": 1 }, { "order": 687, - "name": "davidvilem", + "name": "zonnen69", "count": 2, "languages": 1 }, { "order": 688, - "name": "torvicv", - "count": 1, + "name": "jmichael39", + "count": 2, "languages": 1 }, { "order": 689, - "name": "dgquintero", - "count": 1, + "name": "davidvilem", + "count": 2, "languages": 1 }, { "order": 690, - "name": "c-blskv", - "count": 1, + "name": "mantaras96", + "count": 2, "languages": 1 }, { "order": 691, - "name": "emaerniquez", + "name": "torvicv", "count": 1, "languages": 1 }, { "order": 692, - "name": "carolhs92", + "name": "dgquintero", "count": 1, "languages": 1 }, { "order": 693, - "name": "leonardo-henao", + "name": "c-blskv", "count": 1, "languages": 1 }, { "order": 694, - "name": "juancamilofvx", + "name": "emaerniquez", "count": 1, "languages": 1 }, { "order": 695, - "name": "vikernes27666", + "name": "carolhs92", "count": 1, "languages": 1 }, { "order": 696, - "name": "cub-tor", + "name": "leonardo-henao", "count": 1, "languages": 1 }, { "order": 697, - "name": "nightmare79", + "name": "juancamilofvx", "count": 1, "languages": 1 }, { "order": 698, - "name": "carlosmperezm", + "name": "vikernes27666", "count": 1, "languages": 1 }, { "order": 699, - "name": "gonzalinuz18", + "name": "cub-tor", "count": 1, "languages": 1 }, { "order": 700, - "name": "qwik-zghieb", + "name": "nightmare79", "count": 1, "languages": 1 }, { "order": 701, - "name": "miquelrr", + "name": "carlosmperezm", "count": 1, "languages": 1 }, { "order": 702, - "name": "miguel2rar", + "name": "gonzalinuz18", "count": 1, "languages": 1 }, { "order": 703, - "name": "eamartin", + "name": "qwik-zghieb", "count": 1, "languages": 1 }, { "order": 704, - "name": "gabriel-dangelo", + "name": "miquelrr", "count": 1, "languages": 1 }, { "order": 705, - "name": "agustinfccll", + "name": "miguel2rar", "count": 1, "languages": 1 }, { "order": 706, - "name": "anitandil", + "name": "eamartin", "count": 1, "languages": 1 }, { "order": 707, - "name": "evilpodato04", + "name": "gabriel-dangelo", "count": 1, "languages": 1 }, { "order": 708, - "name": "francomyburg", + "name": "agustinfccll", "count": 1, "languages": 1 }, { "order": 709, - "name": "neicervb", + "name": "anitandil", "count": 1, "languages": 1 }, { "order": 710, - "name": "josephinoo", + "name": "evilpodato04", "count": 1, "languages": 1 }, { "order": 711, - "name": "arathhh8", + "name": "francomyburg", "count": 1, "languages": 1 }, { "order": 712, - "name": "paluzz", + "name": "neicervb", "count": 1, "languages": 1 }, { "order": 713, - "name": "theposi", + "name": "josephinoo", "count": 1, "languages": 1 }, { "order": 714, - "name": "vinyoles", + "name": "arathhh8", "count": 1, "languages": 1 }, { "order": 715, - "name": "omarroman29", + "name": "paluzz", "count": 1, "languages": 1 }, { "order": 716, - "name": "sergio-strazzacappa", + "name": "theposi", "count": 1, "languages": 1 }, { "order": 717, - "name": "corvo-99", + "name": "vinyoles", "count": 1, "languages": 1 }, { "order": 718, - "name": "danielcastillo1112", + "name": "omarroman29", "count": 1, "languages": 1 }, { "order": 719, - "name": "malkarmah", + "name": "1cel4nc3", "count": 1, "languages": 1 }, { "order": 720, - "name": "sirvega83", + "name": "sergio-strazzacappa", "count": 1, "languages": 1 }, { "order": 721, - "name": "franpua", + "name": "corvo-99", "count": 1, "languages": 1 }, { "order": 722, - "name": "van-02", + "name": "danielcastillo1112", "count": 1, "languages": 1 }, { "order": 723, - "name": "x3mboy", + "name": "malkarmah", "count": 1, "languages": 1 }, { "order": 724, - "name": "mickysoft", + "name": "sirvega83", "count": 1, "languages": 1 }, { "order": 725, - "name": "deimoshall", + "name": "franpua", "count": 1, "languages": 1 }, { "order": 726, - "name": "palons29", + "name": "van-02", "count": 1, "languages": 1 }, { "order": 727, - "name": "serg032", + "name": "x3mboy", "count": 1, "languages": 1 }, { "order": 728, - "name": "seigigim", + "name": "mickysoft", "count": 1, "languages": 1 }, { "order": 729, - "name": "cibacoa", + "name": "deimoshall", "count": 1, "languages": 1 }, { "order": 730, - "name": "axelwestman", + "name": "palons29", "count": 1, "languages": 1 }, { "order": 731, - "name": "javodevon", + "name": "serg032", "count": 1, "languages": 1 }, { "order": 732, - "name": "mauricioyair", + "name": "seigigim", "count": 1, "languages": 1 }, { "order": 733, - "name": "manuhssj", + "name": "cibacoa", "count": 1, "languages": 1 }, { "order": 734, - "name": "coletonosh", + "name": "axelwestman", "count": 1, "languages": 1 }, { "order": 735, - "name": "manugonzalito", + "name": "javodevon", "count": 1, "languages": 1 }, { "order": 736, - "name": "gizelads", + "name": "mauricioyair", "count": 1, "languages": 1 }, { "order": 737, - "name": "lucc4sz", + "name": "manuhssj", "count": 1, "languages": 1 }, { "order": 738, - "name": "feliaguirre7", + "name": "coletonosh", "count": 1, "languages": 1 }, { "order": 739, - "name": "rulo77", + "name": "manugonzalito", "count": 1, "languages": 1 }, { "order": 740, - "name": "is2095", + "name": "gizelads", "count": 1, "languages": 1 }, { "order": 741, - "name": "jancalos", + "name": "lucc4sz", "count": 1, "languages": 1 }, { "order": 742, - "name": "marcosapodaca", + "name": "feliaguirre7", "count": 1, "languages": 1 }, { "order": 743, - "name": "angelcruzg23", + "name": "rulo77", "count": 1, "languages": 1 }, { "order": 744, - "name": "ca2puntosv", + "name": "is2095", "count": 1, "languages": 1 }, { "order": 745, - "name": "armm77", + "name": "jancalos", "count": 1, "languages": 1 }, { "order": 746, - "name": "afacorroloscos", + "name": "marcosapodaca", "count": 1, "languages": 1 }, { "order": 747, - "name": "rocadev2714", + "name": "angelcruzg23", "count": 1, "languages": 1 }, { "order": 748, - "name": "chrisfelixgil", + "name": "ca2puntosv", "count": 1, "languages": 1 }, { "order": 749, - "name": "sandrarg85", + "name": "armm77", "count": 1, "languages": 1 }, { "order": 750, - "name": "rootqui", + "name": "afacorroloscos", "count": 1, "languages": 1 }, { "order": 751, - "name": "ishimaku", + "name": "rocadev2714", "count": 1, "languages": 1 }, { "order": 752, - "name": "pkmaventura", + "name": "chrisfelixgil", "count": 1, "languages": 1 }, { "order": 753, - "name": "miguelgargallo", + "name": "sandrarg85", "count": 1, "languages": 1 }, { "order": 754, - "name": "astriebeck", + "name": "rootqui", "count": 1, "languages": 1 }, { "order": 755, - "name": "lobogeekmx", + "name": "ishimaku", "count": 1, "languages": 1 }, { "order": 756, - "name": "marvinagui", + "name": "pkmaventura", "count": 1, "languages": 1 }, { "order": 757, - "name": "marqitos", + "name": "miguelgargallo", "count": 1, "languages": 1 }, { "order": 758, - "name": "nunezlagos", + "name": "astriebeck", "count": 1, "languages": 1 }, { "order": 759, - "name": "jcrobles99", + "name": "lobogeekmx", "count": 1, "languages": 1 }, { "order": 760, - "name": "ledyam", + "name": "marvinagui", "count": 1, "languages": 1 }, { "order": 761, - "name": "jatomas", + "name": "marqitos", "count": 1, "languages": 1 }, { "order": 762, - "name": "jaennova", + "name": "nunezlagos", "count": 1, "languages": 1 }, { "order": 763, - "name": "luisalberto22", + "name": "jcrobles99", "count": 1, "languages": 1 }, { "order": 764, - "name": "francisleble", + "name": "ledyam", "count": 1, "languages": 1 }, { "order": 765, - "name": "deiiviitdev", + "name": "jatomas", "count": 1, "languages": 1 }, { "order": 766, - "name": "braiso-22", + "name": "jaennova", "count": 1, "languages": 1 }, { "order": 767, - "name": "daniel-cas", + "name": "luisalberto22", "count": 1, "languages": 1 }, { "order": 768, - "name": "acirdevelper", + "name": "francisleble", "count": 1, "languages": 1 }, { "order": 769, - "name": "borjadelgadodev", + "name": "deiiviitdev", "count": 1, "languages": 1 }, { "order": 770, - "name": "elpeque29", + "name": "braiso-22", "count": 1, "languages": 1 }, { "order": 771, - "name": "jhordanluyo", + "name": "daniel-cas", "count": 1, "languages": 1 }, { "order": 772, - "name": "davidcv-dev", + "name": "acirdevelper", "count": 1, "languages": 1 }, { "order": 773, - "name": "mbmaeso", + "name": "borjadelgadodev", "count": 1, "languages": 1 }, { "order": 774, - "name": "alvarominarro", + "name": "elpeque29", "count": 1, "languages": 1 }, { "order": 775, - "name": "bjchavez", + "name": "jhordanluyo", "count": 1, "languages": 1 }, { "order": 776, - "name": "madelefonb", + "name": "davidcv-dev", "count": 1, "languages": 1 }, { "order": 777, - "name": "lfwzk", + "name": "mbmaeso", "count": 1, "languages": 1 }, { "order": 778, - "name": "ercky1980", + "name": "alvarominarro", "count": 1, "languages": 1 }, { "order": 779, - "name": "jsruedatorres", + "name": "bjchavez", "count": 1, "languages": 1 }, { "order": 780, - "name": "jacobrwx", + "name": "madelefonb", "count": 1, "languages": 1 }, { "order": 781, - "name": "abengl", + "name": "lfwzk", "count": 1, "languages": 1 }, { "order": 782, - "name": "jd-gm", + "name": "ercky1980", "count": 1, "languages": 1 }, { "order": 783, - "name": "lucianogriffa", + "name": "jsruedatorres", "count": 1, "languages": 1 }, { "order": 784, - "name": "quirogapau", + "name": "jacobrwx", "count": 1, "languages": 1 }, { "order": 785, - "name": "joseperesini", + "name": "abengl", "count": 1, "languages": 1 }, { "order": 786, - "name": "mhrosariom", + "name": "jd-gm", "count": 1, "languages": 1 }, { "order": 787, - "name": "sergioab7", + "name": "lucianogriffa", "count": 1, "languages": 1 }, { "order": 788, - "name": "santaravena", + "name": "quirogapau", "count": 1, "languages": 1 }, { "order": 789, - "name": "datrujillog", + "name": "joseperesini", "count": 1, "languages": 1 }, { "order": 790, - "name": "johnniew81", + "name": "mhrosariom", "count": 1, "languages": 1 }, { "order": 791, - "name": "chriszaldana", + "name": "sergioab7", "count": 1, "languages": 1 }, { "order": 792, - "name": "antonioverdugo", + "name": "santaravena", "count": 1, "languages": 1 }, { "order": 793, - "name": "kronomio", + "name": "datrujillog", "count": 1, "languages": 1 }, { "order": 794, - "name": "kevinramirez28", + "name": "johnniew81", "count": 1, "languages": 1 }, { "order": 795, - "name": "juanpablo-a", + "name": "chriszaldana", "count": 1, "languages": 1 }, { "order": 796, - "name": "gerespinosa", + "name": "antonioverdugo", "count": 1, "languages": 1 }, { "order": 797, - "name": "1978acb", + "name": "kronomio", "count": 1, "languages": 1 }, { "order": 798, - "name": "alexxawada", + "name": "kevinramirez28", "count": 1, "languages": 1 }, { "order": 799, - "name": "ricarsur", + "name": "juanpablo-a", "count": 1, "languages": 1 }, { "order": 800, - "name": "alemar16", + "name": "gerespinosa", "count": 1, "languages": 1 }, { "order": 801, - "name": "pointfs", + "name": "1978acb", "count": 1, "languages": 1 }, { "order": 802, - "name": "edperez07", + "name": "alexxawada", "count": 1, "languages": 1 }, { "order": 803, - "name": "dacronik", + "name": "ricarsur", "count": 1, "languages": 1 }, { "order": 804, - "name": "abraham9804", + "name": "alemar16", "count": 1, "languages": 1 }, { "order": 805, - "name": "afl0r3s", + "name": "pointfs", "count": 1, "languages": 1 }, { "order": 806, - "name": "dianelis1", + "name": "edperez07", "count": 1, "languages": 1 }, { "order": 807, - "name": "fernandofl", + "name": "dacronik", "count": 1, "languages": 1 }, { "order": 808, - "name": "conrado85", + "name": "abraham9804", "count": 1, "languages": 1 }, { "order": 809, - "name": "agus-ig", + "name": "afl0r3s", "count": 1, "languages": 1 }, { "order": 810, - "name": "alvarommedia", + "name": "dianelis1", "count": 1, "languages": 1 }, { "order": 811, - "name": "maximotoro", + "name": "fernandofl", "count": 1, "languages": 1 }, { "order": 812, - "name": "m4xisil", + "name": "conrado85", "count": 1, "languages": 1 }, { "order": 813, - "name": "francomoreira", + "name": "agus-ig", "count": 1, "languages": 1 }, { "order": 814, - "name": "aleclto7", + "name": "alvarommedia", "count": 1, "languages": 1 }, { "order": 815, - "name": "nnunezmedina", + "name": "maximotoro", "count": 1, "languages": 1 }, { "order": 816, - "name": "codejoss", + "name": "m4xisil", "count": 1, "languages": 1 }, { "order": 817, - "name": "yaojema", + "name": "francomoreira", "count": 1, "languages": 1 }, { "order": 818, - "name": "romanocoder", + "name": "aleclto7", "count": 1, "languages": 1 }, { "order": 819, - "name": "sixtodev", + "name": "nnunezmedina", "count": 1, "languages": 1 }, { "order": 820, - "name": "cgomezadolfo", + "name": "codejoss", "count": 1, "languages": 1 }, { "order": 821, - "name": "rojasvargas", + "name": "yaojema", "count": 1, "languages": 1 }, { "order": 822, - "name": "carlosdiaz-dev", + "name": "romanocoder", "count": 1, "languages": 1 }, { "order": 823, - "name": "l3v1xx", + "name": "sixtodev", "count": 1, "languages": 1 }, { "order": 824, - "name": "patricioguerra30", + "name": "cgomezadolfo", "count": 1, "languages": 1 }, { "order": 825, - "name": "lytsar", + "name": "rojasvargas", "count": 1, "languages": 1 }, { "order": 826, - "name": "siuldev", + "name": "carlosdiaz-dev", "count": 1, "languages": 1 }, { "order": 827, - "name": "brayancordova1", + "name": "l3v1xx", "count": 1, "languages": 1 }, { "order": 828, - "name": "ronnieruuz", + "name": "patricioguerra30", "count": 1, "languages": 1 }, { "order": 829, - "name": "yessikamichelle", + "name": "lytsar", "count": 1, "languages": 1 }, { "order": 830, - "name": "vainsito1", + "name": "siuldev", "count": 1, "languages": 1 }, { "order": 831, - "name": "oscarletelier", + "name": "brayancordova1", "count": 1, "languages": 1 }, { "order": 832, - "name": "kocho03", + "name": "ronnieruuz", "count": 1, "languages": 1 }, { "order": 833, - "name": "aidicoop", + "name": "yessikamichelle", "count": 1, "languages": 1 }, { "order": 834, - "name": "albabp", + "name": "vainsito1", "count": 1, "languages": 1 }, { "order": 835, - "name": "nozodev", + "name": "oscarletelier", "count": 1, "languages": 1 }, { "order": 836, - "name": "mvillegas18", + "name": "kocho03", "count": 1, "languages": 1 }, { "order": 837, - "name": "augustbs", + "name": "aidicoop", "count": 1, "languages": 1 }, { "order": 838, - "name": "luchof5", + "name": "albabp", "count": 1, "languages": 1 }, { "order": 839, - "name": "fullstackarlo", + "name": "nozodev", "count": 1, "languages": 1 }, { "order": 840, - "name": "mdemena", + "name": "mvillegas18", "count": 1, "languages": 1 }, { "order": 841, - "name": "cliverjimny123", + "name": "augustbs", "count": 1, "languages": 1 }, { "order": 842, - "name": "rodmiggithub", + "name": "luchof5", "count": 1, "languages": 1 }, { "order": 843, - "name": "s9code", + "name": "fullstackarlo", "count": 1, "languages": 1 }, { "order": 844, - "name": "javieradev", + "name": "mdemena", "count": 1, "languages": 1 }, { "order": 845, - "name": "xnomada", + "name": "cliverjimny123", "count": 1, "languages": 1 }, { "order": 846, - "name": "miguelsarm", + "name": "rodmiggithub", "count": 1, "languages": 1 }, { "order": 847, - "name": "royhuamanavila", + "name": "s9code", "count": 1, "languages": 1 }, { "order": 848, - "name": "imista", + "name": "javieradev", "count": 1, "languages": 1 }, { "order": 849, - "name": "denisortega", + "name": "xnomada", "count": 1, "languages": 1 }, { "order": 850, - "name": "kouski", + "name": "miguelsarm", "count": 1, "languages": 1 }, { "order": 851, - "name": "leydimadrid", + "name": "royhuamanavila", "count": 1, "languages": 1 }, { "order": 852, - "name": "frannm29", + "name": "imista", "count": 1, "languages": 1 }, { "order": 853, - "name": "saintsluis", + "name": "denisortega", "count": 1, "languages": 1 }, { "order": 854, - "name": "gc796", + "name": "kouski", "count": 1, "languages": 1 }, { "order": 855, - "name": "pierre-ol", + "name": "leydimadrid", "count": 1, "languages": 1 }, { "order": 856, - "name": "francescoalterio", + "name": "frannm29", "count": 1, "languages": 1 }, { "order": 857, - "name": "gustavoguerrero", + "name": "saintsluis", "count": 1, "languages": 1 }, { "order": 858, - "name": "diegoxxd", + "name": "gc796", "count": 1, "languages": 1 }, { "order": 859, - "name": "walkerlyna", + "name": "pierre-ol", "count": 1, "languages": 1 }, { "order": 860, - "name": "sejotaz", + "name": "francescoalterio", "count": 1, "languages": 1 }, { "order": 861, - "name": "duendeintemporal", + "name": "gustavoguerrero", "count": 1, "languages": 1 }, { "order": 862, - "name": "frcan89", + "name": "diegoxxd", "count": 1, "languages": 1 }, { "order": 863, - "name": "nicorey89", + "name": "walkerlyna", "count": 1, "languages": 1 }, { "order": 864, - "name": "alexis0717", + "name": "erysnell", "count": 1, "languages": 1 }, { "order": 865, - "name": "edgonzz", + "name": "sejotaz", "count": 1, "languages": 1 }, { "order": 866, - "name": "vmga09", + "name": "frcan89", "count": 1, "languages": 1 }, { "order": 867, - "name": "lfam200", + "name": "nicorey89", "count": 1, "languages": 1 }, { "order": 868, - "name": "kenzambrano", + "name": "alexis0717", "count": 1, "languages": 1 }, { "order": 869, - "name": "dmhenaopa", + "name": "edgonzz", "count": 1, "languages": 1 }, { "order": 870, - "name": "jpiacaruso", + "name": "vmga09", "count": 1, "languages": 1 }, { "order": 871, - "name": "isnatthy", + "name": "lfam200", "count": 1, "languages": 1 }, { "order": 872, - "name": "peticas", + "name": "kenzambrano", "count": 1, "languages": 1 }, { "order": 873, - "name": "flarien", + "name": "dmhenaopa", "count": 1, "languages": 1 }, { "order": 874, - "name": "franciscokarriere", + "name": "jpiacaruso", "count": 1, "languages": 1 }, { "order": 875, - "name": "pipeyz21", + "name": "isnatthy", "count": 1, "languages": 1 }, { "order": 876, - "name": "luisgarm", + "name": "peticas", "count": 1, "languages": 1 }, { "order": 877, - "name": "tetotille", + "name": "flarien", "count": 1, "languages": 1 }, { "order": 878, - "name": "vorosdev", + "name": "franciscokarriere", "count": 1, "languages": 1 }, { "order": 879, - "name": "santiagomac", + "name": "pipeyz21", "count": 1, "languages": 1 }, { "order": 880, - "name": "implevacui", + "name": "luisgarm", "count": 1, "languages": 1 }, { "order": 881, - "name": "fede6299", + "name": "tetotille", "count": 1, "languages": 1 }, { "order": 882, - "name": "kevin05m", + "name": "vorosdev", "count": 1, "languages": 1 }, { "order": 883, - "name": "diegomm27", + "name": "santiagomac", "count": 1, "languages": 1 }, { "order": 884, - "name": "pablo-lnx", + "name": "implevacui", "count": 1, "languages": 1 }, { "order": 885, - "name": "darkohokage", + "name": "fede6299", "count": 1, "languages": 1 }, { "order": 886, - "name": "jhonnfl", + "name": "kevin05m", "count": 1, "languages": 1 }, { "order": 887, - "name": "jarzatedev", + "name": "diegomm27", "count": 1, "languages": 1 }, { "order": 888, - "name": "brunom-93", + "name": "pablo-lnx", "count": 1, "languages": 1 }, { "order": 889, - "name": "alejandroruiz23", + "name": "darkohokage", "count": 1, "languages": 1 }, { "order": 890, - "name": "trollface77", + "name": "jhonnfl", "count": 1, "languages": 1 }, { "order": 891, - "name": "jaimesoftdev", + "name": "jarzatedev", "count": 1, "languages": 1 }, { "order": 892, - "name": "edm1ya", + "name": "brunom-93", "count": 1, "languages": 1 }, { "order": 893, - "name": "tartabullroberto", + "name": "alejandroruiz23", "count": 1, "languages": 1 }, { "order": 894, - "name": "serg-pq", + "name": "trollface77", "count": 1, "languages": 1 }, { "order": 895, - "name": "lara-vel-dev", + "name": "jaimesoftdev", "count": 1, "languages": 1 }, { "order": 896, - "name": "alexisbarradev", + "name": "edm1ya", "count": 1, "languages": 1 }, { "order": 897, - "name": "kelvincb", + "name": "tartabullroberto", "count": 1, "languages": 1 }, { "order": 898, - "name": "carlostoledoe", + "name": "serg-pq", "count": 1, "languages": 1 }, { "order": 899, - "name": "gilbertho502", + "name": "lara-vel-dev", "count": 1, "languages": 1 }, { "order": 900, - "name": "v0l0v", + "name": "alexisbarradev", "count": 1, "languages": 1 }, { "order": 901, - "name": "johao23", + "name": "kelvincb", "count": 1, "languages": 1 }, { "order": 902, - "name": "geridage", + "name": "carlostoledoe", "count": 1, "languages": 1 }, { "order": 903, - "name": "vmarialuzm", + "name": "gilbertho502", "count": 1, "languages": 1 }, { "order": 904, - "name": "snowcardenas", + "name": "v0l0v", "count": 1, "languages": 1 }, { "order": 905, - "name": "and-y21", + "name": "johao23", "count": 1, "languages": 1 }, { "order": 906, - "name": "arturodlapaz17", + "name": "geridage", "count": 1, "languages": 1 }, { "order": 907, - "name": "manuu42", + "name": "vmarialuzm", "count": 1, "languages": 1 }, { "order": 908, - "name": "howlett9999", + "name": "snowcardenas", "count": 1, "languages": 1 }, { "order": 909, - "name": "hnaranjog", + "name": "and-y21", "count": 1, "languages": 1 }, { "order": 910, - "name": "wallsified", + "name": "arturodlapaz17", "count": 1, "languages": 1 }, { "order": 911, - "name": "lluistech", + "name": "manuu42", "count": 1, "languages": 1 }, { "order": 912, - "name": "mamartinez14", + "name": "howlett9999", "count": 1, "languages": 1 }, { "order": 913, - "name": "ambrociojrdelacruz", + "name": "dkp-dev", "count": 1, "languages": 1 }, { "order": 914, - "name": "bassalex27", + "name": "hnaranjog", "count": 1, "languages": 1 }, { "order": 915, - "name": "yetlanezils", + "name": "wallsified", "count": 1, "languages": 1 }, { "order": 916, - "name": "ndepaul82", + "name": "lluistech", "count": 1, "languages": 1 }, { "order": 917, - "name": "amitchellg", + "name": "mamartinez14", "count": 1, "languages": 1 }, { "order": 918, - "name": "turudev1979", + "name": "ambrociojrdelacruz", "count": 1, "languages": 1 }, { "order": 919, - "name": "deivimiller", + "name": "bassalex27", "count": 1, "languages": 1 }, { "order": 920, - "name": "haroldalb", + "name": "yetlanezils", "count": 1, "languages": 1 }, { "order": 921, - "name": "dakkaj", + "name": "ndepaul82", "count": 1, "languages": 1 }, { "order": 922, - "name": "juli-m4", + "name": "amitchellg", "count": 1, "languages": 1 }, { "order": 923, - "name": "sergiomhernandez", + "name": "turudev1979", "count": 1, "languages": 1 }, { "order": 924, - "name": "masenace", + "name": "deivimiller", "count": 1, "languages": 1 }, { "order": 925, - "name": "e-xtian", + "name": "haroldalb", "count": 1, "languages": 1 }, { "order": 926, - "name": "vickalck", + "name": "dakkaj", "count": 1, "languages": 1 }, { "order": 927, - "name": "gmedinat911", + "name": "jheisonquiroga", "count": 1, "languages": 1 }, { "order": 928, - "name": "eljavi0", + "name": "juli-m4", "count": 1, "languages": 1 }, { "order": 929, - "name": "yeisongil", + "name": "sergiomhernandez", "count": 1, "languages": 1 }, { "order": 930, - "name": "julioorozco05", + "name": "masenace", "count": 1, "languages": 1 }, { "order": 931, - "name": "fergz1988", + "name": "e-xtian", "count": 1, "languages": 1 }, { "order": 932, - "name": "marcos0803", + "name": "vickalck", "count": 1, "languages": 1 }, { "order": 933, - "name": "xcortes", + "name": "gmedinat911", "count": 1, "languages": 1 }, { "order": 934, - "name": "facundorsabia", + "name": "eljavi0", "count": 1, "languages": 1 }, { "order": 935, - "name": "nico70012", + "name": "yeisongil", "count": 1, "languages": 1 }, { "order": 936, - "name": "charly024", + "name": "julioorozco05", "count": 1, "languages": 1 }, { "order": 937, - "name": "devjerez", + "name": "fergz1988", "count": 1, "languages": 1 }, { "order": 938, - "name": "gersonoroz", + "name": "marcos0803", "count": 1, "languages": 1 }, { "order": 939, - "name": "jafuma0320", + "name": "xcortes", "count": 1, "languages": 1 }, { "order": 940, - "name": "g4nd4lf", + "name": "facundorsabia", "count": 1, "languages": 1 }, { "order": 941, - "name": "obed-tc", + "name": "nico70012", "count": 1, "languages": 1 }, { "order": 942, - "name": "devkenn", + "name": "charly024", "count": 1, "languages": 1 }, { "order": 943, - "name": "xalejandrow", + "name": "devjerez", "count": 1, "languages": 1 }, { "order": 944, - "name": "henrydavidprimera", + "name": "gersonoroz", "count": 1, "languages": 1 }, { "order": 945, - "name": "luceldasilva", + "name": "jafuma0320", "count": 1, "languages": 1 }, { "order": 946, - "name": "mjordanaam", + "name": "g4nd4lf", "count": 1, "languages": 1 }, { "order": 947, - "name": "betulioo", + "name": "obed-tc", "count": 1, "languages": 1 }, { "order": 948, - "name": "judithernandez", + "name": "devkenn", "count": 1, "languages": 1 }, { "order": 949, - "name": "dimanu-py", + "name": "xalejandrow", "count": 1, "languages": 1 }, { "order": 950, - "name": "snowale", + "name": "henrydavidprimera", "count": 1, "languages": 1 }, { "order": 951, - "name": "cd1974", + "name": "luceldasilva", "count": 1, "languages": 1 }, { "order": 952, - "name": "acobo3", + "name": "mjordanaam", "count": 1, "languages": 1 }, { "order": 953, - "name": "isaacdci", + "name": "betulioo", "count": 1, "languages": 1 }, { "order": 954, - "name": "manueldenisdev", + "name": "judithernandez", "count": 1, "languages": 1 }, { "order": 955, - "name": "anexo01", + "name": "dimanu-py", "count": 1, "languages": 1 }, { "order": 956, - "name": "yamiyugi25", + "name": "snowale", "count": 1, "languages": 1 }, { "order": 957, - "name": "gl-informatica", + "name": "cd1974", "count": 1, "languages": 1 }, { "order": 958, - "name": "miguelmancebo", + "name": "acobo3", "count": 1, "languages": 1 }, { "order": 959, - "name": "neusier101", + "name": "isaacdci", "count": 1, "languages": 1 }, { "order": 960, - "name": "emmanuelmmontesinos ", + "name": "manueldenisdev", "count": 1, "languages": 1 }, { "order": 961, - "name": "xhinto", + "name": "anexo01", "count": 1, "languages": 1 }, { "order": 962, - "name": "dacaldev", + "name": "yamiyugi25", "count": 1, "languages": 1 }, { "order": 963, - "name": "juan-cruz01", + "name": "gl-informatica", "count": 1, "languages": 1 }, { "order": 964, - "name": "juanalbornoz32", + "name": "miguelmancebo", "count": 1, "languages": 1 }, { "order": 965, - "name": "cisneros2404", + "name": "neusier101", "count": 1, "languages": 1 }, { "order": 966, - "name": "neftalyr", + "name": "emmanuelmmontesinos ", "count": 1, "languages": 1 }, { "order": 967, - "name": "latorredev", + "name": "xhinto", "count": 1, "languages": 1 }, { "order": 968, - "name": "osneidert", + "name": "dacaldev", "count": 1, "languages": 1 }, { "order": 969, - "name": "jrgranadosb", + "name": "juan-cruz01", "count": 1, "languages": 1 }, { "order": 970, - "name": "vicvilla30", + "name": "juanalbornoz32", "count": 1, "languages": 1 }, { "order": 971, - "name": "carlosbb70", + "name": "cisneros2404", "count": 1, "languages": 1 }, { "order": 972, - "name": "pablom-2015", + "name": "neftalyr", "count": 1, "languages": 1 }, { "order": 973, - "name": "xtinarita", + "name": "latorredev", "count": 1, "languages": 1 }, { "order": 974, - "name": "wilsonbarrera", + "name": "osneidert", "count": 1, "languages": 1 }, { "order": 975, - "name": "jereaguilar", + "name": "jrgranadosb", "count": 1, "languages": 1 }, { "order": 976, - "name": "giovanni-schmaily", + "name": "vicvilla30", "count": 1, "languages": 1 }, { "order": 977, - "name": "danidan1214", + "name": "carlosbb70", "count": 1, "languages": 1 }, { "order": 978, - "name": "demegorash", + "name": "pablom-2015", "count": 1, "languages": 1 }, { "order": 979, - "name": "cris10026", + "name": "xtinarita", "count": 1, "languages": 1 }, { "order": 980, - "name": "davidgramiro", + "name": "wilsonbarrera", "count": 1, "languages": 1 }, { "order": 981, - "name": "jgarteag", + "name": "jereaguilar", "count": 1, "languages": 1 }, { "order": 982, - "name": "adcarret", + "name": "giovanni-schmaily", "count": 1, "languages": 1 }, { "order": 983, - "name": "natanaelzubiri", + "name": "danidan1214", "count": 1, "languages": 1 }, { "order": 984, - "name": "diegogomezcor4", + "name": "demegorash", "count": 1, "languages": 1 }, { "order": 985, - "name": "perla-zg", + "name": "cris10026", "count": 1, "languages": 1 }, { "order": 986, - "name": "neshurtado", + "name": "davidgramiro", "count": 1, "languages": 1 }, { "order": 987, - "name": "marcelinoarias369", + "name": "jgarteag", "count": 1, "languages": 1 }, { "order": 988, - "name": "pushodev", + "name": "adcarret", "count": 1, "languages": 1 }, { "order": 989, - "name": "sherkla12e", + "name": "natanaelzubiri", "count": 1, "languages": 1 }, { "order": 990, - "name": "luisangeles20", + "name": "diegogomezcor4", "count": 1, "languages": 1 }, { "order": 991, - "name": "omar8102", + "name": "perla-zg", "count": 1, "languages": 1 }, { "order": 992, - "name": "eatsangels", + "name": "neshurtado", "count": 1, "languages": 1 }, { "order": 993, - "name": "alejarandro", + "name": "marcelinoarias369", "count": 1, "languages": 1 }, { "order": 994, - "name": "tashidian", + "name": "pushodev", "count": 1, "languages": 1 }, { "order": 995, - "name": "alejandro000", + "name": "sherkla12e", "count": 1, "languages": 1 }, { "order": 996, - "name": "francgci", + "name": "luisangeles20", "count": 1, "languages": 1 }, { "order": 997, - "name": "krisipo", + "name": "omar8102", "count": 1, "languages": 1 }, { "order": 998, - "name": "jalonso76", + "name": "eatsangels", "count": 1, "languages": 1 }, { "order": 999, - "name": "leo18q", + "name": "alejarandro", "count": 1, "languages": 1 }, { "order": 1000, - "name": "sofiamfernandez", + "name": "tashidian", "count": 1, "languages": 1 }, { "order": 1001, - "name": "jgregoris", + "name": "alejandro000", "count": 1, "languages": 1 }, { "order": 1002, - "name": "josuelopez5", + "name": "francgci", "count": 1, "languages": 1 }, { "order": 1003, - "name": "mrf1989", + "name": "krisipo", "count": 1, "languages": 1 }, { "order": 1004, - "name": "zeraven09", + "name": "jalonso76", "count": 1, "languages": 1 }, { "order": 1005, - "name": "pr1de-23", + "name": "leo18q", "count": 1, "languages": 1 }, { "order": 1006, - "name": "kronoscba", + "name": "sofiamfernandez", "count": 1, "languages": 1 }, { "order": 1007, - "name": "erickcis", + "name": "jgregoris", "count": 1, "languages": 1 }, { "order": 1008, - "name": "experthacker444", + "name": "josuelopez5", "count": 1, "languages": 1 }, { "order": 1009, - "name": "javirr4", + "name": "mrf1989", "count": 1, "languages": 1 }, { "order": 1010, - "name": "ignacioskm", + "name": "zeraven09", "count": 1, "languages": 1 }, { "order": 1011, - "name": "jchernandez87", + "name": "pr1de-23", "count": 1, "languages": 1 }, { "order": 1012, - "name": "ferngpv", + "name": "kronoscba", "count": 1, "languages": 1 }, { "order": 1013, - "name": "kshields51", + "name": "erickcis", "count": 1, "languages": 1 }, { "order": 1014, - "name": "salas89", + "name": "experthacker444", "count": 1, "languages": 1 }, { "order": 1015, - "name": "90dread", + "name": "javirr4", "count": 1, "languages": 1 }, { "order": 1016, - "name": "chema-dw", + "name": "ignacioskm", "count": 1, "languages": 1 }, { "order": 1017, - "name": "sbngl", + "name": "jchernandez87", "count": 1, "languages": 1 }, { "order": 1018, - "name": "m4xxdev", + "name": "ferngpv", "count": 1, "languages": 1 }, { "order": 1019, - "name": "cristianvergaraf", + "name": "kshields51", "count": 1, "languages": 1 }, { "order": 1020, - "name": "lizzymaken", + "name": "salas89", "count": 1, "languages": 1 }, { "order": 1021, - "name": "claudios1980", + "name": "90dread", "count": 1, "languages": 1 }, { "order": 1022, - "name": "sergiovelayos", + "name": "chema-dw", "count": 1, "languages": 1 }, { "order": 1023, - "name": "miguelangel861", + "name": "sbngl", "count": 1, "languages": 1 }, { "order": 1024, - "name": "marcosjarrin", + "name": "m4xxdev", "count": 1, "languages": 1 }, { "order": 1025, + "name": "cristianvergaraf", + "count": 1, + "languages": 1 + }, + { + "order": 1026, + "name": "lizzymaken", + "count": 1, + "languages": 1 + }, + { + "order": 1027, + "name": "jandortiz", + "count": 1, + "languages": 1 + }, + { + "order": 1028, + "name": "claudios1980", + "count": 1, + "languages": 1 + }, + { + "order": 1029, + "name": "sergiovelayos", + "count": 1, + "languages": 1 + }, + { + "order": 1030, + "name": "miguelangel861", + "count": 1, + "languages": 1 + }, + { + "order": 1031, + "name": "marcosjarrin", + "count": 1, + "languages": 1 + }, + { + "order": 1032, "name": "jandresalvar", "count": 1, "languages": 1 }, { - "order": 1026, + "order": 1033, "name": "joferpg", "count": 1, "languages": 1 }, { - "order": 1027, + "order": 1034, "name": "jlrojano", "count": 1, "languages": 1 }, { - "order": 1028, + "order": 1035, "name": "ivanserran", "count": 1, "languages": 1 }, { - "order": 1029, + "order": 1036, "name": "dany3gs", "count": 1, "languages": 1 }, { - "order": 1030, + "order": 1037, "name": "lizandev", "count": 1, "languages": 1 }, { - "order": 1031, + "order": 1038, "name": "adriangonzalezroble", "count": 1, "languages": 1 }, { - "order": 1032, + "order": 1039, "name": "dariel800xd", "count": 1, "languages": 1 }, { - "order": 1033, + "order": 1040, "name": "cristian-encalada", "count": 1, "languages": 1 }, { - "order": 1034, + "order": 1041, "name": "lewisoneil", "count": 1, "languages": 1 }, { - "order": 1035, + "order": 1042, "name": "hanzd07", "count": 1, "languages": 1 }, { - "order": 1036, + "order": 1043, "name": "bycris13", "count": 1, "languages": 1 }, { - "order": 1037, + "order": 1044, "name": "santiagopereiraviroga", "count": 1, "languages": 1 }, { - "order": 1038, + "order": 1045, "name": "v1k770r", "count": 1, "languages": 1 }, { - "order": 1039, + "order": 1046, "name": "gianellannie", "count": 1, "languages": 1 }, { - "order": 1040, + "order": 1047, "name": "alefine", "count": 1, "languages": 1 }, { - "order": 1041, + "order": 1048, "name": "chalaito88", "count": 1, "languages": 1 }, { - "order": 1042, + "order": 1049, "name": "fredylopez01", "count": 1, "languages": 1 }, { - "order": 1043, + "order": 1050, "name": "dsmhp0", "count": 1, "languages": 1 }, { - "order": 1044, + "order": 1051, "name": "lautimorales", "count": 1, "languages": 1 }, { - "order": 1045, + "order": 1052, "name": "alexeigio", "count": 1, "languages": 1 }, { - "order": 1046, + "order": 1053, "name": "angeldevsarrollo", "count": 1, "languages": 1 }, { - "order": 1047, + "order": 1054, "name": "pguillo", "count": 1, "languages": 1 }, { - "order": 1048, + "order": 1055, "name": "vikinghost", "count": 1, "languages": 1 }, { - "order": 1049, + "order": 1056, "name": "derkopath", "count": 1, "languages": 1 }, { - "order": 1050, + "order": 1057, "name": "adriansaint07", "count": 1, "languages": 1 }, { - "order": 1051, + "order": 1058, "name": "javiir", "count": 1, "languages": 1 }, { - "order": 1052, + "order": 1059, "name": "sxxnzdev", "count": 1, "languages": 1 }, { - "order": 1053, + "order": 1060, "name": "det3992", "count": 1, "languages": 1 }, { - "order": 1054, + "order": 1061, "name": "frankmon03", "count": 1, "languages": 1 }, { - "order": 1055, + "order": 1062, "name": "xhaloidx", "count": 1, "languages": 1 }, { - "order": 1056, + "order": 1063, "name": "iguerrerov", "count": 1, "languages": 1 }, { - "order": 1057, + "order": 1064, "name": "jrgim", "count": 1, "languages": 1 }, { - "order": 1058, + "order": 1065, "name": "cristianmr87", "count": 1, "languages": 1 }, { - "order": 1059, + "order": 1066, "name": "rumacar05", "count": 1, "languages": 1 }, { - "order": 1060, + "order": 1067, "name": "jose-zga", "count": 1, "languages": 1 }, { - "order": 1061, + "order": 1068, "name": "mathiur", "count": 1, "languages": 1 }, { - "order": 1062, + "order": 1069, "name": "robermejia", "count": 1, "languages": 1 }, { - "order": 1063, + "order": 1070, "name": "sanuka78", "count": 1, "languages": 1 }, { - "order": 1064, + "order": 1071, "name": "reneguzman7", "count": 1, "languages": 1 }, { - "order": 1065, + "order": 1072, "name": "durwian", "count": 1, "languages": 1 }, { - "order": 1066, + "order": 1073, "name": "martinaq", "count": 1, "languages": 1 }, { - "order": 1067, + "order": 1074, "name": "kgrc05", "count": 1, "languages": 1 }, { - "order": 1068, + "order": 1075, + "name": "queralesdev", + "count": 1, + "languages": 1 + }, + { + "order": 1076, "name": "dovinhoyos", "count": 1, "languages": 1 }, { - "order": 1069, + "order": 1077, "name": "maynor06", "count": 1, "languages": 1 }, { - "order": 1070, + "order": 1078, "name": "jaimenar", "count": 1, "languages": 1 }, { - "order": 1071, + "order": 1079, "name": "chrystiancalderon", "count": 1, "languages": 1 }, { - "order": 1072, + "order": 1080, "name": "alvaropg15", "count": 1, "languages": 1 }, { - "order": 1073, + "order": 1081, "name": "deathbato", "count": 1, "languages": 1 }, { - "order": 1074, + "order": 1082, "name": "rreyes0424", "count": 1, "languages": 1 }, { - "order": 1075, + "order": 1083, "name": "algeloro", "count": 1, "languages": 1 }, { - "order": 1076, + "order": 1084, "name": "jony_english22", "count": 1, "languages": 1 }, { - "order": 1077, + "order": 1085, "name": "antoniojzp86", "count": 1, "languages": 1 }, { - "order": 1078, + "order": 1086, "name": "serg_pq", "count": 1, "languages": 1 }, { - "order": 1079, + "order": 1087, "name": "zyn7e", "count": 1, "languages": 1 }, { - "order": 1080, + "order": 1088, "name": "diegopardomontero", "count": 1, "languages": 1 }, { - "order": 1081, + "order": 1089, "name": "cristobalbelcor", "count": 1, "languages": 1 }, { - "order": 1082, + "order": 1090, "name": "albert-29", "count": 1, "languages": 1 }, { - "order": 1083, + "order": 1091, "name": "pvigo10", "count": 1, "languages": 1 }, { - "order": 1084, + "order": 1092, "name": "clespinosa2024", "count": 1, "languages": 1 }, { - "order": 1085, + "order": 1093, "name": "danisaurio94", "count": 1, "languages": 1 }, { - "order": 1086, + "order": 1094, "name": "jaquelinetorres", "count": 1, "languages": 1 }, { - "order": 1087, + "order": 1095, "name": "javosss", "count": 1, "languages": 1 }, { - "order": 1088, + "order": 1096, "name": "eduardo282", "count": 1, "languages": 1 }, { - "order": 1089, + "order": 1097, "name": "franespina", "count": 1, "languages": 1 }, { - "order": 1090, + "order": 1098, "name": "davidbastosg", "count": 1, "languages": 1 }, { - "order": 1091, + "order": 1099, "name": "carlosmares", "count": 1, "languages": 1 }, { - "order": 1092, + "order": 1100, "name": "rawc1nnamon", "count": 1, "languages": 1 }, { - "order": 1093, + "order": 1101, "name": "deivisaherreraj", "count": 1, "languages": 1 }, { - "order": 1094, + "order": 1102, "name": "alfaroo1", "count": 1, "languages": 1 }, { - "order": 1095, + "order": 1103, "name": "astrarothdlcxvi", "count": 1, "languages": 1 }, { - "order": 1096, + "order": 1104, "name": "kerunaru", "count": 1, "languages": 1 }, { - "order": 1097, + "order": 1105, "name": "marcosalvarezcalabria", "count": 1, "languages": 1 }, { - "order": 1098, + "order": 1106, "name": "orzefox", "count": 1, "languages": 1 }, { - "order": 1099, + "order": 1107, "name": "acirdeveloper", "count": 1, "languages": 1 }, { - "order": 1100, + "order": 1108, "name": "emiliordev", "count": 1, "languages": 1 }, { - "order": 1101, + "order": 1109, "name": "sve-nnn", "count": 1, "languages": 1 }, { - "order": 1102, + "order": 1110, "name": "edgarmedranoa", "count": 1, "languages": 1 }, { - "order": 1103, + "order": 1111, "name": "rafapg93", "count": 1, "languages": 1 }, { - "order": 1104, + "order": 1112, "name": "vickalc", "count": 1, "languages": 1 }, { - "order": 1105, + "order": 1113, "name": "riukac", "count": 1, "languages": 1 }, { - "order": 1106, + "order": 1114, "name": "rusian69", "count": 1, "languages": 1 }, { - "order": 1107, + "order": 1115, "name": "wijimenezz", "count": 1, "languages": 1 }, { - "order": 1108, + "order": 1116, "name": "albertovf", "count": 1, "languages": 1 }, { - "order": 1109, + "order": 1117, "name": "markayala13", "count": 1, "languages": 1 }, { - "order": 1110, + "order": 1118, "name": "rocha30", "count": 1, "languages": 1 }, { - "order": 1111, + "order": 1119, "name": "righelch", "count": 1, "languages": 1 }, { - "order": 1112, + "order": 1120, "name": "deathbat00", "count": 1, "languages": 1 }, { - "order": 1113, + "order": 1121, "name": "nicoloboo02", "count": 1, "languages": 1 }, { - "order": 1114, + "order": 1122, "name": "sergiopq", "count": 1, "languages": 1 }, { - "order": 1115, + "order": 1123, "name": "angeloro", "count": 1, "languages": 1 }, { - "order": 1116, + "order": 1124, "name": "jony-english22", "count": 1, "languages": 1 }, { - "order": 1117, + "order": 1125, "name": "lordzzz", "count": 1, "languages": 1 }, { - "order": 1118, + "order": 1126, "name": "alinares94", "count": 1, "languages": 1 }, { - "order": 1119, + "order": 1127, "name": "jferchotorres", "count": 1, "languages": 1 }, { - "order": 1120, + "order": 1128, "name": "713avo", "count": 1, "languages": 1 }, { - "order": 1121, + "order": 1129, "name": "micendev", "count": 1, "languages": 1 }, { - "order": 1122, + "order": 1130, "name": "ingjavierpinilla", "count": 1, "languages": 1 }, { - "order": 1123, + "order": 1131, "name": "batmarc91", "count": 1, "languages": 1 }, { - "order": 1124, + "order": 1132, "name": "angel-agis", "count": 1, "languages": 1 }, { - "order": 1125, + "order": 1133, "name": "lesterdavid31", "count": 1, "languages": 1 }, { - "order": 1126, + "order": 1134, "name": "joancharles07", "count": 1, "languages": 1 }, { - "order": 1127, + "order": 1135, "name": "mauricioobgo", "count": 1, "languages": 1 }, { - "order": 1128, + "order": 1136, "name": "cuervo23alpha", "count": 1, "languages": 1 }, { - "order": 1129, + "order": 1137, "name": "h4cker54n", "count": 1, "languages": 1 }, { - "order": 1130, + "order": 1138, "name": "derobpe", "count": 1, "languages": 1 }, { - "order": 1131, + "order": 1139, "name": "willypaz243", "count": 1, "languages": 1 }, { - "order": 1132, + "order": 1140, "name": "emersonxinay", "count": 1, "languages": 1 }, { - "order": 1133, + "order": 1141, + "name": "alecraft8", + "count": 1, + "languages": 1 + }, + { + "order": 1142, "name": "greenalpak", "count": 1, "languages": 1 }, { - "order": 1134, + "order": 1143, "name": "juampaweb", "count": 1, "languages": 1 }, { - "order": 1135, + "order": 1144, "name": "girngoma", "count": 1, "languages": 1 }, { - "order": 1136, + "order": 1145, "name": "jjaljuria", "count": 1, "languages": 1 }, { - "order": 1137, + "order": 1146, "name": "ddaniel27", "count": 1, "languages": 1 }, { - "order": 1138, + "order": 1147, "name": "dfc201692", "count": 1, "languages": 1 }, { - "order": 1139, + "order": 1148, "name": "angelramirez02", "count": 1, "languages": 1 }, { - "order": 1140, + "order": 1149, "name": "lesclaz", "count": 1, "languages": 1 }, { - "order": 1141, + "order": 1150, "name": "giovannipeirone", "count": 1, "languages": 1 }, { - "order": 1142, + "order": 1151, "name": "whiterbb", "count": 1, "languages": 1 }, { - "order": 1143, + "order": 1152, "name": "adridiazz", "count": 1, "languages": 1 }, { - "order": 1144, + "order": 1153, "name": "jesus2421", "count": 1, "languages": 1 }, { - "order": 1145, + "order": 1154, "name": "euu92", "count": 1, "languages": 1 }, { - "order": 1146, + "order": 1155, "name": "santyjl44", "count": 1, "languages": 1 }, { - "order": 1147, + "order": 1156, "name": "luism95", "count": 1, "languages": 1 }, { - "order": 1148, + "order": 1157, "name": "ouendinga", "count": 1, "languages": 1 }, { - "order": 1149, + "order": 1158, "name": "melonconyogurt", "count": 1, "languages": 1 - }, - { - "order": 1150, - "name": "mantaras96", - "count": 1, - "languages": 1 } ] } \ No newline at end of file