diff --git a/README.md b/README.md index e671aa8d10..f00fc7f49f 100644 --- a/README.md +++ b/README.md @@ -39,9 +39,17 @@ Aquí encontrarás el listado de retos, su fecha de publicación, dificultad y e * **#19** - 11/05/23 | Media | [`ANÁLISIS DE TEXTO`](./Retos/Reto%20%2319%20-%20ANÁLISIS%20DE%20TEXTO%20%5BMedia%5D/ejercicio.md) | Correcciones: [[MI SOLUCIÓN](./Retos/Reto%20%2319%20-%20ANÁLISIS%20DE%20TEXTO%20%5BMedia%5D/python/mouredev.py)] [[COMUNIDAD](./Retos/Reto%20%2319%20-%20ANÁLISIS%20DE%20TEXTO%20%5BMedia%5D/)] * **#20** - 15/05/23 | Media | [`LA TRIFUERZA`](./Retos/Reto%20%2320%20-%20LA%20TRIFUERZA%20%5BMedia%5D/ejercicio.md) | Correcciones: [[MI SOLUCIÓN](./Retos/Reto%20%2320%20-%20LA%20TRIFUERZA%20%5BMedia%5D/python/mouredev.py)] [[COMUNIDAD](./Retos/Reto%20%2320%20-%20LA%20TRIFUERZA%20%5BMedia%5D/)] * **#21** - 22/05/23 | Media | [`NÚMEROS PRIMOS GEMELOS`](./Retos/Reto%20%2321%20-%20NÚMEROS%20PRIMOS%20GEMELOS%20%5BMedia%5D/ejercicio.md) | Correcciones: [[MI SOLUCIÓN](./Retos/Reto%20%2321%20-%20NÚMEROS%20PRIMOS%20GEMELOS%20%5BMedia%5D/python/mouredev.py)] [[COMUNIDAD](./Retos/Reto%20%2321%20-%20NÚMEROS%20PRIMOS%20GEMELOS%20%5BMedia%5D/)] -* **#22** - 29/05/23 | Media | [`LA ESPIRAL`](./Retos/Reto%20%2322%20-%20LA%20ESPIRAL%20%5BMedia%5D/ejercicio.md) | Último reto publicado - -> **Corrección y Publicación próximo reto - 06/06/23 | [🗓️ Horario evento corrección en directo](https://discord.gg/mouredev?event=1112777023081938981) en [Twitch](https://twitch.tv/mouredev)** +* **#22** - 29/05/23 | Media | [`LA ESPIRAL`](./Retos/Reto%20%2322%20-%20LA%20ESPIRAL%20%5BMedia%5D/ejercicio.md) | Correcciones: [[MI SOLUCIÓN](./Retos/Reto%20%2322%20-%20LA%20ESPIRAL%20%5BMedia%5D/python/mouredev.py)] [[COMUNIDAD](./Retos/Reto%20%2322%20-%20LA%20ESPIRAL%20%5BMedia%5D/)] +* **#23** - 06/06/23 | Media | [`LA BASE DE DATOS`](./Retos/Reto%20%2323%20-%20LA%20BASE%20DE%20DATOS%20%5BMedia%5D/ejercicio.md) | Correcciones: [[MI SOLUCIÓN](./Retos/Reto%20%2323%20-%20LA%20BASE%20DE%20DATOS%20%5BMedia%5D/python/mouredev.py)] [[COMUNIDAD](./Retos/Reto%20%2323%20-%20LA%20BASE%20DE%20DATOS%20%5BMedia%5D/)] +* **#24** - 12/06/23 | Fácil | [`CIFRADO CÉSAR`](./Retos/Reto%20%2324%20-%20CIFRADO%20CÉSAR%20%5BFácil%5D/ejercicio.md) | Correcciones: [[MI SOLUCIÓN](./Retos/Reto%20%2324%20-%20CIFRADO%20CÉSAR%20%5BFácil%5D/python/mouredev.py)] [[COMUNIDAD](./Retos/Reto%20%2324%20-%20CIFRADO%20CÉSAR%20%5BFácil%5D/)] +* **#25** - 19/06/23 | Media | [`EL CÓDIGO KONAMI`](./Retos/Reto%20%2325%20-%20EL%20CÓDIGO%20KONAMI%20%5BMedia%5D/ejercicio.md) | Correcciones: [[MI SOLUCIÓN](./Retos/Reto%20%2325%20-%20EL%20CÓDIGO%20KONAMI%20%5BMedia%5D/python/mouredev.py)] [[COMUNIDAD](./Retos/Reto%20%2325%20-%20EL%20CÓDIGO%20KONAMI%20%5BMedia%5D/)] +* **#26** - 26/06/23 | Media | [`TESTING`](./Retos/Reto%20%2326%20-%20TESTING%20%5BMedia%5D/ejercicio.md) | Correcciones: [[MI SOLUCIÓN](./Retos/Reto%20%2326%20-%20TESTING%20%5BMedia%5D/python/mouredev.py)] [[COMUNIDAD](./Retos/Reto%20%2326%20-%20TESTING%20%5BMedia%5D/)] +* **#27** - 03/07/23 | Media | [`CUENTA ATRÁS`](./Retos/Reto%20%2327%20-%20CUENTA%20ATRÁS%20%5BMedia%5D/ejercicio.md) | Correcciones: [[MI SOLUCIÓN](./Retos/Reto%20%2327%20-%20CUENTA%20ATRÁS%20%5BMedia%5D/python/mouredev.py)] [[COMUNIDAD](./Retos/Reto%20%2327%20-%20CUENTA%20ATRÁS%20%5BMedia%5D/)] +* **#28** - 10/07/23 | Media | [`EXPRESIÓN MATEMÁTICA`](./Retos/Reto%20%2328%20-%20EXPRESIÓN%20MATEMÁTICA%20%5BMedia%5D/ejercicio.md) | Correcciones: [[MI SOLUCIÓN](./Retos/Reto%20%2328%20-%20EXPRESIÓN%20MATEMÁTICA%20%5BMedia%5D/python/mouredev.py)] [[COMUNIDAD](./Retos/Reto%20%2328%20-%20EXPRESIÓN%20MATEMÁTICA%20%5BMedia%5D/)] +* **#29** - 17/07/23 | Fácil | [`EL CARÁCTER INFILTRADO`](./Retos/Reto%20%2329%20-%20EL%20CARÁCTER%20INFILTRADO%20%5BFácil%5D/ejercicio.md) | Correcciones: [[MI SOLUCIÓN](./Retos/Reto%20%2329%20-%20EL%20CARÁCTER%20INFILTRADO%20%5BFácil%5D/python/mouredev.py)] [[COMUNIDAD](./Retos/Reto%20%2329%20-%20EL%20CARÁCTER%20INFILTRADO%20%5BFácil%5D/)] +* **#30** - 24/07/23 | Media | [`EL TECLADO T9`](./Retos/Reto%20%2330%20-%20EL%20TECLADO%20T9%20%5BMedia%5D/ejercicio.md) | Último reto publicado + +> **Corrección y Publicación próximo reto - 31/07/23 | [🗓️ Horario evento corrección en directo](https://discord.gg/aYbJWd9t?event=1133085330262736989) en [Twitch](https://twitch.tv/mouredev)** *Puedes ejecutar el archivo [language_stats.py](./Retos/language_stats.py) para visualizar las estadísticas de uso de cada lenguaje.* diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c#/ernestoalbarez.cs" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c#/ernestoalbarez.cs" new file mode 100644 index 0000000000..7553af1e0b --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c#/ernestoalbarez.cs" @@ -0,0 +1,43 @@ +using System; + +/* +Reto #0: EL FAMOSO "FIZZ BUZZ" + + + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". +*/ + + +class Program +{ + static void Main() + { + string fizz = "Fizz"; + string buzz = "Buzz"; + string fizzBuzz = "FizzBuzz"; + + for (int i=1; i<=100; i++) + { + bool divisibleBy3 = i%3==0; + bool divisibleBy5 = i%5==0; + + if (divisibleBy3 && divisibleBy5) { + Console.WriteLine(fizzBuzz); + } + else if (divisibleBy3) { + Console.WriteLine(fizz); + } + else if (divisibleBy5) { + Console.WriteLine(buzz); + } + else { + Console.WriteLine(i); + } + } + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c#/iggict.cs" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c#/iggict.cs" new file mode 100644 index 0000000000..a003a3d8a0 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c#/iggict.cs" @@ -0,0 +1,11 @@ +using System; + +for (int i = 1; i <= 100; i++) +{ + Console.WriteLine( + i % 3 == 0 && i % 5 == 0 ? "fizzbuzz" : + i % 3 == 0 ? "fizz" : + i % 5 == 0 ? "buzz" + : $"{i}" + ); +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/6d61726b.cpp" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/6d61726b.cpp" new file mode 100644 index 0000000000..d0480ba4c7 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/6d61726b.cpp" @@ -0,0 +1,18 @@ +#include + +int main() +{ + for (short i = 1; i <= 100; i++) + { + if (i % 3 == 0 && i % 5 == 0) + std::cout << "fizzbuzz" << std::endl; + else if (i % 3 == 0) + std::cout << "fizz" << std::endl; + else if (i % 5 == 0) + std::cout << "buzz" << std::endl; + else + std::cout << i << std::endl; + } + + return 0; +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/ernestoalbarez.cpp" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/ernestoalbarez.cpp" new file mode 100644 index 0000000000..cacd0f64d2 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/ernestoalbarez.cpp" @@ -0,0 +1,41 @@ +#include +#include + +/* +Reto #0: EL FAMOSO "FIZZ BUZZ" + + + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". +*/ + +int main() +{ + std::string fizz = "Fizz"; + std::string buzz = "Buzz"; + std::string fizzBuzz = "FizzBuzz"; + + for (int i = 1; i <= 100; i++) { + bool divisibleBy3 = i % 3 == 0; + bool divisibleBy5 = i % 5 == 0; + + if (divisibleBy3 && divisibleBy5) { + std::cout << fizzBuzz << std::endl; + } + else if (divisibleBy3) { + std::cout << fizz << std::endl; + } + else if (divisibleBy5) { + std::cout << buzz << std::endl; + } + else { + std::cout << i << std::endl; + } + } + + return 0; +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/pyramsd.cpp" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/pyramsd.cpp" new file mode 100644 index 0000000000..e83e5626e1 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/pyramsd.cpp" @@ -0,0 +1,11 @@ +#include +using namespace std; + +int main(){ + for (int i = 0; i <= 100; i++){ + if (i % 3 == 0 && i % 5 == 0) cout << "fizzbuzz" << endl; + else if (i % 3 == 0) cout << "fizz" << endl; + else if (i % 5 == 0) cout << "buzz" << endl; + else cout << i << endl; + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/ronnyg2121.cpp" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/ronnyg2121.cpp" new file mode 100644 index 0000000000..19eafa1b5b --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c++/ronnyg2121.cpp" @@ -0,0 +1,26 @@ +#include +using namespace std; + +int main(int argc, char const *argv[]) +{ + // Solución al ejercicio #0 + for (int i = 0; i < 101; i++) { + if (i %3 == 0 && i %5 == 0) { + cout << "fizzbuzz\n" << endl; + } + + else if (i %3 == 0) { + cout << "fizz\n" << endl; + } + + else if(i %5 == 0) { + cout << "buzz\n" << endl; + } + + else { + cout << i << endl; + } + } + + return 0; +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c/ernestoalbarez.c" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c/ernestoalbarez.c" new file mode 100644 index 0000000000..a00f6f7f90 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c/ernestoalbarez.c" @@ -0,0 +1,35 @@ +#include +#include + +/* +Reto #0: EL FAMOSO "FIZZ BUZZ" + + + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". +*/ + +void main() { + const char* fizz = "Fizz"; + const char* buzz = "Buzz"; + const char* fizzBuzz = "FizzBuzz"; + + for (int i=1; i<=100; i++) { + bool divisibleBy3 = i%3==0; + bool divisibleBy5 = i%5==0; + + if (divisibleBy3 && divisibleBy5) { + puts(fizzBuzz); + } else if (divisibleBy3) { + puts(fizz); + } else if (divisibleBy5) { + puts(buzz); + } else { + printf("%d\n", i); + } + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c/juangonzalezdla.c" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c/juangonzalezdla.c" new file mode 100644 index 0000000000..467a0a65de --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/c/juangonzalezdla.c" @@ -0,0 +1,18 @@ +#include + +int main() +{ + for(int n = 1; n <= 100; n++) { + if (n % 3 == 0 && n % 5 == 0) { + printf("%d fizzbuzz\n", n); + } else if (n % 3 == 0) { + printf("%d fizz\n", n); + } else if (n % 5 == 0) { + printf("%d buzz\n", n); + } else { + printf("%d\n", n); + } + } + + return 0; +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/dart/AnzurezDev.dart" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/dart/AnzurezDev.dart" new file mode 100644 index 0000000000..0c1e933987 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/dart/AnzurezDev.dart" @@ -0,0 +1,10 @@ +void main() { + fizzBuzz(); +} + +void fizzBuzz() { + for ( int index=1; index<=100; index++ ) { + String output = ( index % 3 ==0 ? "fizz" : "" ) + ( index % 5 ==0 ? "buzz" : ""); + print( output.isEmpty ? index : output ); + } +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/dart/amandabrodriguez.dart" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/dart/amandabrodriguez.dart" new file mode 100644 index 0000000000..626f6c668e --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/dart/amandabrodriguez.dart" @@ -0,0 +1,24 @@ +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ + +void main() { + for (var i = 0; i <= 100; i++) { + if (i == 0) { + print(0); + } else if (i % 3 == 0 && i % 5 == 0) { + print("fizzbuzz"); + } else if (i % 3 == 0) { + print("fizz"); + } else if (i % 5 == 0) { + print("buzz"); + } else { + print(i); + } + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/go/josevalver.go" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/go/josevalver.go" new file mode 100644 index 0000000000..d28f03481f --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/go/josevalver.go" @@ -0,0 +1,19 @@ +package main + +import ( + "fmt" +) + +func main() { + for i := 1; i <= 100; i++ { + if i%3 == 0 { + fmt.Println("fizz") + } else if i%5 == 0 { + fmt.Println("buzz") + } else if i%3 == 0 && i%5 == 0 { + fmt.Println("fizzbuzz") + } else { + fmt.Println(i) + } + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/AnzurezDev.java" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/AnzurezDev.java" new file mode 100644 index 0000000000..621bfe0772 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/AnzurezDev.java" @@ -0,0 +1,12 @@ +public class AnzurezDev { + public static void main( String args[] ) { + fizzBuzz(); + } + + public static void fizzBuzz() { + for ( int index=1; index<=100; index++ ) { + String output = ( index % 3==0 ? "fizz" : "" ) + ( index % 5==0 ? "buzz" : "" ); + System.out.println( output.isEmpty() ? index : output ); + } + } +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/EnLoerDEV.java" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/EnLoerDEV.java" new file mode 100644 index 0000000000..6e48a9f8d6 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/EnLoerDEV.java" @@ -0,0 +1,16 @@ +package Main; +public class Main { + public static void main(String[] args) { + for(int i=1;i<101;i++){ + if(i%15 == 0 ){ + System.out.println("FizzBuzz"); + }else if(i%3 == 0){ + System.out.println("Fizz"); + }else if(i%5 ==0){ + System.out.println("Buzz"); + }else{ + System.out.println(i); + } + } + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/alvaruncio.java" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/alvaruncio.java" new file mode 100644 index 0000000000..e66407e0f3 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/alvaruncio.java" @@ -0,0 +1,24 @@ +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ + +public class alvaruncio{ + public static void main(String[] args) { + for (int i = 1; i < 101; i++) + if (i % 3 == 0 && i % 5 == 0){ + System.out.println("fizzbuzz"); + } else if (i % 3 == 0) { + System.out.println("fizz"); + } else if (i % 5 == 0){ + System.out.println("buzz"); + } else { + System.out.println(i); + } + } + +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/asjordi.java" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/asjordi.java" new file mode 100644 index 0000000000..403054e0ce --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/asjordi.java" @@ -0,0 +1,26 @@ +public class asjordi { + + public static void main(String[] args) { + + for (int i = 1; i <= 100; i++) { + + if (i % 3 == 0 && i % 5 == 0) { + System.out.println("fizzbuzz"); + continue; + } + + if (i % 3 == 0) { + System.out.println("fizz"); + continue; + } + + if (i % 5 == 0) { + System.out.println("buzz"); + continue; + } + + System.out.println(i); + } + } + +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/bramenn.java" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/bramenn.java" new file mode 100644 index 0000000000..e71089b45c --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/bramenn.java" @@ -0,0 +1,19 @@ +class Bramenn { + public static void main(String[] args) { + fizzBuzz(); + } + + public static void fizzBuzz() { + for (int i = 1; i <= 100; i++) { + if (i % 3 == 0 && i % 5 == 0) { + System.out.println("fizzbuzz"); + } else if (i % 3 == 0) { + System.out.println("fizz"); + } else if (i % 5 == 0) { + System.out.println("buzz"); + } else { + System.out.println(i); + } + } + } +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/ernestoalbarez.java" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/ernestoalbarez.java" new file mode 100644 index 0000000000..1256c702d5 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/ernestoalbarez.java" @@ -0,0 +1,32 @@ +/* +Reto #0: EL FAMOSO "FIZZ BUZZ" + + + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". +*/ + +public class ernestoalbarez { + public static void main(String[] args) { + for (int i=1; i<=100; i++) { + StringBuilder output = new StringBuilder(); + + if (i % 3 == 0) { + output.append("Fizz"); + } + if (i % 5 == 0) { + output.append("Buzz"); + } + + System.out.println( + output.length()>0 ? + output.toString() : + String.valueOf(i) + ); + } + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/felipenico.java" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/felipenico.java" new file mode 100644 index 0000000000..03dc87a634 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/felipenico.java" @@ -0,0 +1,29 @@ + +/** + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + * + * @author Felipe Niño Cortes + */ +public class felipenico { + + public static void main(String[] args) { + imprimir(); + } + + public static void imprimir() { + for (int i = 0; i < 101; i++) { + if ((i % 3 == 0) && (i % 5 == 0)) { + System.out.println("fizzbuzz"); + } else if (i % 3 == 0) { + System.out.println("fizz"); + } else if (i % 5 == 0) { + System.out.println("buzz"); + } + } + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/rayneflores.java" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/rayneflores.java" new file mode 100644 index 0000000000..b321aad262 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/rayneflores.java" @@ -0,0 +1,19 @@ +public class main{ + public static void main(String[] args){ + for(int i = 1; i <= 100; i++){ + comprobar(i); + } + } + + private static void comprobar(int i) { + if(i%3==0 && i%5==0) { + System.out.println("fizzbuzz"); + } else if(i%3==0){ + System.out.println("fizz"); + } else if(i%5==0){ + System.out.println("buzz"); + } else { + System.out.println(i); + } + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/vandresca.java" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/vandresca.java" new file mode 100644 index 0000000000..b8bebcec40 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/java/vandresca.java" @@ -0,0 +1,16 @@ +/** + * Listar los números del 1 al 100 ambos incluidos + * Si el número es múltiplo de 3 sustituir por la palabra 'fizz' + * Si el número es múltiplo de 5 sustituir por la palabra 'buzz' + * Si el número es múltiplo de 3 y 5 sustituir por la palabra 'fizzbuzz' + */ +public class vandresca { + public static void main(String[] args) { + for(int i = 0; i<100; i++){ + if(i%15==0) System.out.println("fizzbuzz"); + else if(i%3==0) System.out.println("fizz"); + else if(i%5==0) System.out.println("buzz"); + else System.out.println(i); + } + } +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/AnzurezDev.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/AnzurezDev.js" new file mode 100644 index 0000000000..69781e3838 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/AnzurezDev.js" @@ -0,0 +1,8 @@ +const fizzBuzz = () => { + for ( let index=1; index<=100; index++ ) { + let output = ( index % 3 ==0 ? "fizz" : "" ) + ( index % 5 ==0 ? "buzz" : "" ); + console.log( output ? output : index ) + } +} + +fizzBuzz(); \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Qv1ko.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Qv1ko.js" new file mode 100644 index 0000000000..b7e850bc7a --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Qv1ko.js" @@ -0,0 +1,11 @@ +for (let i = 1; i < 101; i++) { + if (i % 3 == 0 && i % 5 == 0) { + console.log("fizzbuzz"); + } else if (i % 3 == 0) { + console.log("fizz"); + } else if (i % 5 == 0) { + console.log("buzz"); + } else { + console.log(i); + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Raul1551.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Raul1551.js" new file mode 100644 index 0000000000..7723290d46 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Raul1551.js" @@ -0,0 +1,37 @@ +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ + + +function fizzBuzz(num) { + + if (typeof num !== 'number') { + return 'Fail! You must enter a number' + } + + for (let i = 0; i <= num; i++) { + let output = ""; + if (i % 3 == 0) { + output += 'fizz'; + } + if (i % 5 == 0) { + output += 'buzz'; + } + + console.log(i + " " + output + "\n"); + } + +} + +const num = 100; + +fizzBuzz("num"); + + + + diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Robindev1812.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Robindev1812.js" new file mode 100644 index 0000000000..c59aba7696 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Robindev1812.js" @@ -0,0 +1,16 @@ +for (let i = 1; i <= 100; i++) { + let output; + + if (i % 3 == 0 && i % 5 == 0) { + output = "fizzbuzz"; + console.log(output); + } else if (i % 3 == 0) { + output = "fizz"; + console.log(output); + } else if (i % 5 == 0) { + output = "buzz"; + console.log(output); + } else { + console.log(i); + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Rolo27s.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Rolo27s.js" new file mode 100644 index 0000000000..e18ba5753f --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/Rolo27s.js" @@ -0,0 +1,12 @@ +// Solucion Reto #0: EL FAMOSO "FIZZ BUZZ" +for (let i = 1; i <= 100; i++) { + if (i % 3 == 0 && i % 5 == 0) { + console.log("fizzbuzz"); + } else if (i % 3 == 0) { + console.log("fizz"); + } else if (i % 5 == 0) { + console.log("buzz"); + } else { + console.log(i); + } +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/TheFabi8A.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/TheFabi8A.js" new file mode 100644 index 0000000000..6c78d3ebfa --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/TheFabi8A.js" @@ -0,0 +1,11 @@ +for (var i = 1; i < 101; i++) { + if (i % 3 === 0 && i % 5 === 0) { + console.log("fizzbuzz"); + } else if (i % 3 === 0) { + console.log("fizz"); + } else if (i % 5 === 0) { + console.log("buzz"); + } else { + console.log(i); + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/afl0r3s.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/afl0r3s.js" new file mode 100644 index 0000000000..c6a4fdb281 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/afl0r3s.js" @@ -0,0 +1,19 @@ +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ + +function fizzBuzz( ) { + for (let i = 1; i <= 100; i++) { + if (i % 15 === 0) console.log(`${i} - fizzbuzz`); + if (i % 5 === 0) console.log(`${i} - buzz`); + if (i % 3 === 0) console.log(`${i} - fizz`); + console.log(`${i}`) + } +} + +fizzBuzz(); diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/camiloPerezDussan.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/camiloPerezDussan.js" new file mode 100644 index 0000000000..070cfbe522 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/camiloPerezDussan.js" @@ -0,0 +1,28 @@ +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ + +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ + +let fizzBuzz = (number, i = 1) => { + if (i <= number) { + if (i % 3 == 0 && i % 5 == 0) console.log("fizzbuzz"); + else if (i % 3 == 0) console.log("fizz"); + else if (i % 5 == 0) console.log("buzz"); + else console.log(i) + fizzBuzz(number, ++i) + } +} +fizzBuzz(100) \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/daldev14.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/daldev14.js" new file mode 100644 index 0000000000..21d879b7dd --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/daldev14.js" @@ -0,0 +1,33 @@ +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ + +function FizzBuzz() { + for (let i = 1; i <= 100; i++) { + let output = `${i % 3 == 0 ? "fizz" : ""}${i % 5 == 0 ? "buzz" : ""}`; + console.log(output ? output : i); + } +} + +FizzBuzz(); + +/* utilizando array */ + +function FizzBuzzv2() { + const FizzBuzzArray = new Array(100).fill(0).map((_value, index) => { + if ((index + 1) % 5 == 0 && (index + 1) % 3 == 0) return "fizzbuzz"; + if ((index + 1) % 3 == 0) return "fizz"; + if ((index + 1) % 5 == 0) return "buzz"; + + return index + 1; + }); + + FizzBuzzArray.forEach((el) => console.log(el)); +} + +FizzBuzzv2(); \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/ernestoalbarez.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/ernestoalbarez.js" new file mode 100644 index 0000000000..128c9959bc --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/ernestoalbarez.js" @@ -0,0 +1,24 @@ +/* +Reto #0: EL FAMOSO "FIZZ BUZZ" + + + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ + +for (let i=1; i<=100; i++) { + let output = ""; + + if (i%3 === 0) { + output += "Fizz"; + } + if (i%5 === 0) { + output += "Buzz"; + } + console.log(output || `${i}`); +} + \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/gersancabo.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/gersancabo.js" new file mode 100644 index 0000000000..87d87da206 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/gersancabo.js" @@ -0,0 +1,21 @@ +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ +for (let i = 1; i <= 100; i++) { + let result = ""; + if (i % 3 == 0 ) { + result = "fizz"; + } + if (i % 5 == 0) { + result += "buzz"; + } + if (result.length == 0) { + result = i; + } + console.log(result + "\n"); +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/hogan26.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/hogan26.js" new file mode 100644 index 0000000000..6dc9d3441f --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/hogan26.js" @@ -0,0 +1,20 @@ +/* +* Escribe un programa que muestre por consola (con un print) los +* números de 1 a 100 (ambos incluidos y con un salto de línea entre +* cada impresión), sustituyendo los siguientes: +* - Múltiplos de 3 por la palabra "fizz". +* - Múltiplos de 5 por la palabra "buzz". +* - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". +*/ + +const fizzbuzz = () => { + for (let numero = 1; numero <= 100; numero++) { + if (numero % 3 == 0 && numero % 5 == 0) console.log('fizzbuzz') + else if(numero % 3 == 0) console.log('fizz') + else if (numero % 5 == 0) console.log('buzz') + else console.log(numero) + } +} + +fizzbuzz() + diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/ricaardev.js" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/ricaardev.js" new file mode 100644 index 0000000000..5f6bbd5085 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/javascript/ricaardev.js" @@ -0,0 +1,14 @@ +for (let i = 1; i <= 100; i++) { + if (i % 15 === 0) { + console.log("fizzbuzz"); + continue; + } if (i % 3 === 0) { + console.log("fizz"); + continue; + } if (i % 5 === 0) { + console.log("buzz"); + continue; + } else { + console.log(i) + }; +}; \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/kotlin/dotero-dev.kt" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/kotlin/dotero-dev.kt" new file mode 100644 index 0000000000..2b1928529e --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/kotlin/dotero-dev.kt" @@ -0,0 +1,17 @@ +fun main(){ + fizzBuzz() +} + +fun fizzBuzz(){ + for (i in 1..100){ + if (i%3==0 && i%5==0){ + println("fizzbuzz") + } else if (i%3==0){ + println("fizz") + } else if (i%5==0){ + println("buzz") + } else{ + println(i) + } + } +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/kotlin/masdos.kt" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/kotlin/masdos.kt" new file mode 100644 index 0000000000..ca81b32935 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/kotlin/masdos.kt" @@ -0,0 +1,23 @@ +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ + +fun main() { + fizzbuzz() +} + +private fun fizzbuzz() { + for (i in 1..100) { + when { + i % 3 == 0 && i % 5 == 0 -> println("fizzbuzz") + i % 3 == 0 -> println("fizz") + i % 5 == 0 -> println("buzz") + else -> println(i) + } + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/php/AnzurezDev.php" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/php/AnzurezDev.php" new file mode 100644 index 0000000000..08823e392e --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/php/AnzurezDev.php" @@ -0,0 +1,10 @@ + None: + if numero % 3 == 0 and numero % 5 == 0: + print("fizzbuzz \n") + elif numero % 3 == 0: + print("fizz \n") + elif numero % 5 == 0: + print("buzz \n") + else: + print(f"{numero} \n") + +np.vectorize(print_numero)(np.arange(101)) \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/Salcedogg.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/Salcedogg.py" new file mode 100644 index 0000000000..fc43a00463 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/Salcedogg.py" @@ -0,0 +1,9 @@ +for i in range(1, 101): + if i % 3 == 0 and i % 5 == 0: + print('FizzBuzz') + elif i % 3 == 0: + print('Fizz') + elif i % 5 == 0: + print('Buzz') + else: + print(i) \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/ShinMugenNoKabe.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/ShinMugenNoKabe.py" new file mode 100644 index 0000000000..e595998122 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/ShinMugenNoKabe.py" @@ -0,0 +1,13 @@ +def fizzbuzz(): + for i in range(1, 101): + if i % 3 == 0 and i % 5 == 0: + print("fizzbuzz") + elif i % 3 == 0: + print("fizz") + elif i % 5 == 0: + print("buzz") + else: + print(i) + +if __name__ == "__main__": + fizzbuzz() \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/aburicia9.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/aburicia9.py" new file mode 100644 index 0000000000..5ff45c10cf --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/aburicia9.py" @@ -0,0 +1,9 @@ +for x in range(1, 101): + if x % 3 == 0 and x % 5 == 0: + print("FizzBuzz") + elif x % 3 == 0: + print("Fizz") + elif x % 5 == 0: + print("Buzz") + else: + print(x) diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/alberba.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/alberba.py" new file mode 100644 index 0000000000..a047acd9cf --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/alberba.py" @@ -0,0 +1,13 @@ + + +# Inicializamo el range en uno ya que el 0 no esta incluído +for i in range(1, 101): + # Para cada i, solo entrará en una de estas condiciones + if i % 3 == 0 and i % 5 == 0: + print("fizzbuzz") + elif i % 5 == 0: + print("buzz") + elif i % 3 == 0: + print("fizz") + else: + print(i) \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/bramenn.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/bramenn.py" new file mode 100644 index 0000000000..8a58136b87 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/bramenn.py" @@ -0,0 +1,12 @@ +def fizzbuzz(): + for i in range(1, 101): + if i % 3 == 0 and i % 5 == 0: + print("fizzbuzz") + elif i % 3 == 0: + print("fizz") + elif i % 5 == 0: + print("buzz") + else: + print(i) + +fizzbuzz() diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/callmeGustavo.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/callmeGustavo.py" new file mode 100644 index 0000000000..3a6a3f8cb1 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/callmeGustavo.py" @@ -0,0 +1,17 @@ +for i in range(1,100+1): + #print(i,'\n') + + if i % 15 == 0: + print('fizzbuzz','\n') + + #print(i,'\n') + elif i % 5 == 0: + print('buzz','\n') + #print(i,'\n') + + elif i % 3 == 0: + print('fizz','\n') + #print(i,'\n') + + else: + print(i,'\n') \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/dotero-dev.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/dotero-dev.py" new file mode 100644 index 0000000000..ed13213a60 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/dotero-dev.py" @@ -0,0 +1,9 @@ +for i in range (100): + if (i+1)%3 == 0 and (i+1)%5==0: + print("fizzbuzz") + elif (i+1)%3 == 0: + print ("fizz") + elif (i+1)%5 == 0: + print("buzz") + else: + print(i+1) \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/edgarmejiav.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/edgarmejiav.py" new file mode 100644 index 0000000000..26d1603ec5 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/edgarmejiav.py" @@ -0,0 +1,7 @@ +for i in range(1, 101): + if i % 3 == 0 and i % 5 == 0: + print("fizzbuzz") + elif i % 3 == 0: + print("fizz") + elif i % 5 == 0: + print("buzz") \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/ernestoalbarez.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/ernestoalbarez.py" new file mode 100644 index 0000000000..9e62735064 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/ernestoalbarez.py" @@ -0,0 +1,23 @@ +""" +Reto #0: EL FAMOSO "FIZZ BUZZ" + + + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". +""" +def fizz_buzz(): + for i in range(1,101): + if (i % 3 == 0 and i % 5 == 0): + print("FizzBuzz") + elif(i % 3 == 0): + print("Fizz") + elif(i % 5 == 0): + print("Buzz") + else: + print(i) + +fizz_buzz() \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/fedecoronado.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/fedecoronado.py" index e9796fa80d..1db6e822f9 100644 --- "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/fedecoronado.py" +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/fedecoronado.py" @@ -1,18 +1,19 @@ -'''/* - * Escribe un programa que muestre por consola (con un print) los - * números de 1 a 100 (ambos incluidos y con un salto de línea entre - * cada impresión), sustituyendo los siguientes: - * - Múltiplos de 3 por la palabra "fizz". - * - Múltiplos de 5 por la palabra "buzz". - * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". - */''' - -for i in range(1,101): - if i%3 == 0 and i%5 == 0: - print("fizzbuzz") - elif i%3 == 0: - print("fizz") - elif i%5 == 0: - print("buzz") - else: - print(i) +'''/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */''' + +for i in range(1,101): + if i%3 == 0 and i%5 == 0: + print("fizzbuzz") + elif i%3 == 0: + print("fizz") + elif i%5 == 0: + print("buzz") + else: + print(i) + \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/felipenico.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/felipenico.py" new file mode 100644 index 0000000000..ae9b20917a --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/felipenico.py" @@ -0,0 +1,17 @@ +'''/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */''' +for i in range(0,101): + if((i % 3 == 0) and (i % 5 == 0)): + print("fizzbuzz") + #print(i) + elif(i % 3 == 0): + print("fizz") + #print(i) + elif(i % 5 == 0): + print("buzz") \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/fjgonzalezbarea.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/fjgonzalezbarea.py" new file mode 100644 index 0000000000..193c35dcc3 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/fjgonzalezbarea.py" @@ -0,0 +1,28 @@ +""" + Escribe un programa que muestre por consola (con un print) los + números de 1 a 100 (ambos incluidos y con un salto de línea entre + cada impresión), sustituyendo los siguientes: + - Múltiplos de 3 por la palabra "fizz". + - Múltiplos de 5 por la palabra "buzz". + - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + + Ejecución: + python -m fjgonzalezbarea +""" + +def is_divisible_by(number, divisor): + return number % divisor == 0 + +def print_fizz_buzz(): + for index in range(1, 100): + if is_divisible_by(index, 3) and is_divisible_by(index, 5): + print("fizzbuzz") + elif is_divisible_by(index, 3): + print("fizz") + elif is_divisible_by(index, 5): + print("buzz") + else: + print(index) + +if __name__ == "__main__": + print_fizz_buzz() diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/hogan26.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/hogan26.py" new file mode 100644 index 0000000000..99ea3b59b7 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/hogan26.py" @@ -0,0 +1,10 @@ +for numero in range(1,101): + if numero%3==0 and numero%5==0: + print('fizzbuzz') + elif numero%3==0: + print('fizz') + elif numero%5==0: + print('buzz') + else: + print(numero) + \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/josemerino1984.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/josemerino1984.py" similarity index 100% rename from "Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/josemerino1984.py" rename to "Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/josemerino1984.py" diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/josevegas27.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/josevegas27.py" new file mode 100644 index 0000000000..06f7a867eb --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/josevegas27.py" @@ -0,0 +1,21 @@ +''' + RETO #1: EL FAMOSO "FIZZ BUZZ" + + Escribe un programa que muestre por consola (con un print) los +números de 1 a 100 (ambos incluidos y con un salto de línea entre +cada impresión), sustituyendo los siguientes: + - Múltiplos de 3 por la palabra "fizz". + - Múltiplos de 5 por la palabra "buzz". + - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". +''' + +for i in range(1,101): + + if (i%3 == 0) & (i%5 == 0): + print('fizzbuzz') + elif (i%5 == 0): + print('buzz') + elif (i%3 == 0): + print('fizz') + else: + print(i) \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/klimyflorez.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/klimyflorez.py" new file mode 100644 index 0000000000..58968fd224 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/klimyflorez.py" @@ -0,0 +1,24 @@ +''' + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". +''' + + +def fizzbuzz(): + for num in range(1, 101): + if num % 3 == 0 and num % 5 == 0: + print('FizzBuzz\n') + elif num % 3 == 0: + print('Fizz\n') + elif num % 5 == 0: + print('Buzz\n') + else: + print(f'{num}\n') + + +if __name__ == "__main__": + fizzbuzz() diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/kodingrick.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/kodingrick.py" new file mode 100644 index 0000000000..279f8e5493 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/kodingrick.py" @@ -0,0 +1,18 @@ +from math import fmod + +''' +The function `fizzbuzz` prints numbers from 1 to 100, replacing multiples of 3 with 'fizz', +multiples of 5 with 'buzz', and multiples of both 3 and 5 with 'fizzbuzz'. +''' +def fizzbuzz() -> None: + for number in range (1, 101): + if fmod(number, 3) == 0 and fmod(number, 5) == 0: + print('fizzbuzz') + elif fmod(number, 3) == 0: + print('fizz') + elif fmod(number, 5) == 0: + print('buzz') + else: + print(number) + +fizzbuzz() diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/marcoatrs.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/marcoatrs.py" new file mode 100644 index 0000000000..2f27ffd084 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/marcoatrs.py" @@ -0,0 +1,12 @@ +# Reto 0 + +def fizz_buzz(): + for i in range(1, 101): + fizz = i % 3 == 0 + buzz = i % 5 == 0 + if fizz and buzz: print("fizzbuzz") + elif fizz: print("fizz") + elif buzz: print("buzz") + else: print(i) + +fizz_buzz() diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/rafaelramirez150.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/rafaelramirez150.py" new file mode 100644 index 0000000000..03432d7d0e --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/rafaelramirez150.py" @@ -0,0 +1,23 @@ +''' +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ +''' + +for num in range(1, 101): + if num % 3 == 0 and num % 5 == 0: + print("fizzbuzz") + elif num % 3 == 0: + print("fizz") + elif num % 5 == 0: + print("buzz") + else: + print(num) + + + diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/rafaelramireza.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/rafaelramireza.py" new file mode 100644 index 0000000000..d376cdf8c4 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/rafaelramireza.py" @@ -0,0 +1,17 @@ +''' + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". +''' +for numero in range (1, 101): + if ((numero % 3) and (numero % 5 == 0)): + print ("fizzbuzz") + elif (numero % 3 == 0): + print ("fizz") + elif (numero % 5 == 0): + print ("buzz") + else: + print (numero) \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/ronnyg2121.py" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/ronnyg2121.py" new file mode 100644 index 0000000000..7ef2adfebd --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/python/ronnyg2121.py" @@ -0,0 +1,12 @@ +# Mi solución del ejercicio1 + +for i in range(1, 101, 1): + if i %3 == 0 and i %5 == 0: + print("fizzbuzz\n") + + elif i %3 == 0: + print("fizz\n") + elif i %5 == 0: + print("buzz\n") + else: + print(f"{i}\n") \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/ruby/ernestoalbarez.rb" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/ruby/ernestoalbarez.rb" new file mode 100644 index 0000000000..f1ad196c55 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/ruby/ernestoalbarez.rb" @@ -0,0 +1,26 @@ +=begin +Reto #0: EL FAMOSO "FIZZ BUZZ" + + + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". +=end +def fizz_buzz + 100.times do |i| + if i % 15 == 0 + puts "FizzBuzz" + elsif i % 3 == 0 + puts "Fizz" + elsif i % 5 == 0 + puts "Buzz" + else + puts i + end + end +end + +fizz_buzz \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/rust/josevalver.rs" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/rust/josevalver.rs" new file mode 100644 index 0000000000..3fd0c4b41a --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/rust/josevalver.rs" @@ -0,0 +1,13 @@ +fn main() { + for i in 1..101 { + if i % 3 == 0 { + println!("fizz"); + } else if i % 5 == 0 { + println!("buzz"); + } else if i % 3 == 0 && i % 5 == 0 { + println!("fizzbuzz"); + } else { + println!("{}", i); + } + } +} \ No newline at end of file diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/swift/kontroldev.swift" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/swift/kontroldev.swift" new file mode 100644 index 0000000000..f486da0d4d --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/swift/kontroldev.swift" @@ -0,0 +1,22 @@ +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ +import UIKit + +for number in 1...100 { + if number % 3 == 0 && number % 5 == 0 { + print("fizzbuzz") + } else if number % 3 == 0 { + print("fizz") + } else if number % 5 == 0 { + print("buzz") + } else { + print(number) + } +} + diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/Qv1ko.ts" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/Qv1ko.ts" new file mode 100644 index 0000000000..0eaef84e32 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/Qv1ko.ts" @@ -0,0 +1,11 @@ +for (let i = 1; i <= 100; i++) { + if (i % 5 == 0 && i % 3 == 0) { + console.log("fizzbuzz") + } else if (i % 3 == 0) { + console.log("fizz") + } else if (i % 5 == 0) { + console.log("buzz") + } else { + console.log(i) + } +} diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/freddoOswaldo.ts" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/freddoOswaldo.ts" new file mode 100644 index 0000000000..b2ef715cee --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/freddoOswaldo.ts" @@ -0,0 +1,21 @@ +/* + * Reto 0 + * Imprimir los números del 1 al 100 + * Si el número es múltiplo de 3 imprimir "fizz" + * Si el número es múltiplo de 5 imprimir "buzz" + * Si el número es múltiplo de 3 y 5 imprimir "fizzbuzz" + * Si no es múltiplo de 3 o 5 imprimir el número + */ +function printNumbers(limit = 100) { + const FIZZ = "fizz"; + const BUZZ = "buzz"; + + for (let count = 1; count <= limit; count++) { + let result = ""; + result += !(count % 3) ? FIZZ : ""; + result += !(count % 5) ? BUZZ : ""; + console.log(`${result || count}\n`); + } +} + +printNumbers(); diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/miguelriosoliveira.ts" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/miguelriosoliveira.ts" new file mode 100644 index 0000000000..3488a24f22 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/miguelriosoliveira.ts" @@ -0,0 +1,154 @@ +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ + +function fizzBuzz() { + Array.from({ length: 100 }, (_, i) => i + 1).forEach(num => { + const isBy3 = num % 3 === 0; + const isBy5 = num % 5 === 0; + if (isBy3 && isBy5) { + console.log('fizzbuzz'); + } else if (isBy3) { + console.log('fizz'); + } else if (isBy5) { + console.log('buzz'); + } else { + console.log(num); + } + }); +} + +function test() { + // Arrange + let myOutput = ''; + const log = console.log; + console.log = arg => { + log(arg); + myOutput += `${arg}\n`; + }; + + // Act + fizzBuzz(); + + // Assert + console.log = log; + const expectedOutput = + [ + 1, + 2, + 'fizz', + 4, + 'buzz', + 'fizz', + 7, + 8, + 'fizz', + 'buzz', + 11, + 'fizz', + 13, + 14, + 'fizzbuzz', + 16, + 17, + 'fizz', + 19, + 'buzz', + 'fizz', + 22, + 23, + 'fizz', + 'buzz', + 26, + 'fizz', + 28, + 29, + 'fizzbuzz', + 31, + 32, + 'fizz', + 34, + 'buzz', + 'fizz', + 37, + 38, + 'fizz', + 'buzz', + 41, + 'fizz', + 43, + 44, + 'fizzbuzz', + 46, + 47, + 'fizz', + 49, + 'buzz', + 'fizz', + 52, + 53, + 'fizz', + 'buzz', + 56, + 'fizz', + 58, + 59, + 'fizzbuzz', + 61, + 62, + 'fizz', + 64, + 'buzz', + 'fizz', + 67, + 68, + 'fizz', + 'buzz', + 71, + 'fizz', + 73, + 74, + 'fizzbuzz', + 76, + 77, + 'fizz', + 79, + 'buzz', + 'fizz', + 82, + 83, + 'fizz', + 'buzz', + 86, + 'fizz', + 88, + 89, + 'fizzbuzz', + 91, + 92, + 'fizz', + 94, + 'buzz', + 'fizz', + 97, + 98, + 'fizz', + 'buzz', + ].join('\n') + '\n'; + if (myOutput === expectedOutput) { + console.log('✅ PASS'); + } else { + expectedOutput; + console.log('❌ FAIL', { + expected: expectedOutput, + received: myOutput, + }); + } +} + +test(); diff --git "a/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/nicodav28.ts" "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/nicodav28.ts" new file mode 100644 index 0000000000..17b5faaf75 --- /dev/null +++ "b/Retos/Reto #0 - EL FAMOSO FIZZ BUZZ [F\303\241cil]/typescript/nicodav28.ts" @@ -0,0 +1,41 @@ +/* + * Escribe un programa que muestre por consola (con un print) los + * números de 1 a 100 (ambos incluidos y con un salto de línea entre + * cada impresión), sustituyendo los siguientes: + * - Múltiplos de 3 por la palabra "fizz". + * - Múltiplos de 5 por la palabra "buzz". + * - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz". + */ +class FizzBuzz{ + private max: number; + + constructor(maxValue: number){ + this.max = maxValue; + } + + public print(): void { + let i: number; + for (i = 1; i <= this.max; i++){ + console.log(this.evaluate(i)); + } + } + + private evaluate(i: number): any { + let retorno: any; + + if (i % 3 === 0 && i % 5 === 0) { + retorno = "FizzBuzz"; + } else if (i % 3 === 0) { + retorno = "Fizz"; + } else if(i % 5 === 0){ + retorno = "Buzz"; + } else { + retorno = i; + } + + return retorno; + } +} + +const fizzBuzz = new FizzBuzz(100); +fizzBuzz.print(); diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/c#/iggict.cs" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/c#/iggict.cs" new file mode 100644 index 0000000000..3c7cf1bde4 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/c#/iggict.cs" @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +Dictionary leetDict = new(StringComparer.OrdinalIgnoreCase) { + { "a", "4" }, + { "b", "I3" }, + { "c", "[" }, + { "d", ")" }, + { "e", "3" }, + { "f", "|=" }, + { "g", "&" }, + { "h", "#" }, + { "i", "1" }, + { "j", ",_|" }, + { "k", ">|" }, + { "l", "1" }, + { "m", @"/\/\" }, + { "n", "^/" }, + { "o", "0" }, + { "p", "|*" }, + { "q", "(_,)" }, + { "r", "I2" }, + { "s", "5" }, + { "t", "7" }, + { "u", "(_)" }, + { "v", @"\/" }, + { "w", @"\/\/" }, + { "x", "><" }, + { "y", "j" }, + { "z", "2" }, + { "0", "o" }, + { "1", "L" }, + { "2", "R" }, + { "3", "E" }, + { "4", "A" }, + { "5", "S" }, + { "6", "b" }, + { "7", "T" }, + { "8", "B" }, + { "9", "g" } + }; + +do +{ + Console.WriteLine("\nEscribe el texto que quieras traducir a leet:"); + string originalText = Console.ReadLine() ?? ""; + + string translatedText = string.Concat( + originalText.Select(x => + { + string c = x.ToString(); + return leetDict.ContainsKey(c) ? leetDict[c] : c; + }) + ); + + Console.WriteLine(translatedText); + +} while (true); \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/c++/6d61726b.cpp" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/c++/6d61726b.cpp" new file mode 100644 index 0000000000..b9df19aeb7 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/c++/6d61726b.cpp" @@ -0,0 +1,61 @@ +#include +#include +#include + +using namespace std; + +int main() +{ + const map LEET_SPEAK_ALPHABET = { + {'a', "4",}, + {'b', "I3",}, + {'c', "[",}, + {'d', ")",}, + {'e', "3",}, + {'f', "|=",}, + {'g', "&",}, + {'h', "#",}, + {'i', "1",}, + {'j', ",_|",}, + {'k', ">|",}, + {'l', "1",}, + {'m', "/\\/\\",}, + {'n', "^/",}, + {'o', "0",}, + {'p', "|*",}, + {'q', "(_,)",}, + {'r', "I2",}, + {'s', "5",}, + {'t', "7",}, + {'u', "(_)",}, + {'v', "\\/",}, + {'w', "\\/\\/",}, + {'x', "><",}, + {'y', "j",}, + {'z', "2",}, + {'1', "L"}, + {'2', "R",}, + {'3', "E",}, + {'4', "A",}, + {'5', "S",}, + {'6', "b",}, + {'7', "T",}, + {'8', "B"}, + {'9', "g",}, + {'0', "o"}, + {' ', " "} + }; + + string texto = ""; + getline(cin, texto); + + for (char caracter : texto) + { + auto iterador = LEET_SPEAK_ALPHABET.find(caracter); + if (iterador != LEET_SPEAK_ALPHABET.end()) + cout << iterador->second; + } + + cout << endl; + return 0; +} \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/c++/pyramsd.cpp" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/c++/pyramsd.cpp" new file mode 100644 index 0000000000..5f7f593bb7 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/c++/pyramsd.cpp" @@ -0,0 +1,33 @@ +#include +#include +#include +using namespace std; + +int main(){ + map dicctionary = { + {'a', "4"}, {'b', "I3"}, {'c', "["}, {'d', ")"}, {'e', "3"}, {'f', "|="}, {'g', "&"}, + {'h', "#"}, {'i', "1"}, {'j', ",_|"}, {'k', ">|"}, {'l', "1"}, {'m', "/\\/\\"}, + {'n', "^/"}, {'o', "0"}, {'p', "|*"}, {'q', "(_,)"}, {'r', "|2"}, {'s', "5"}, {'t', "7"}, + {'u', "(_)"}, {'v', "\\/"}, {'w', "\\/\\/"}, {'x', "><"}, {'y', "j"}, {'z', "2"}, + {'1', "L"}, {'2', "R"}, {'3', "E"}, {'4', "A"}, {'5', "S"}, {'6', "b"}, {'7', "T"}, + {'8', "B"}, {'9', "g"}, {'0', "o"} + }; + + string texto; + cout << "Ingrese texto: "; + getline(cin, texto); + + string textoTraducido = ""; + + for (char i : texto){ + char lowerCase = tolower(i); + if (dicctionary.count(lowerCase) > 0){ + textoTraducido += dicctionary[lowerCase]; + }else{ + textoTraducido += i; + } + } + + cout << textoTraducido; + +} diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/dart/AnzurezDev.dart" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/dart/AnzurezDev.dart" new file mode 100644 index 0000000000..a96dc6d034 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/dart/AnzurezDev.dart" @@ -0,0 +1,54 @@ +const Map alphabet = { + "A": "4", + "B": "I3", + "C": "[", + "D": ")", + "E": "3", + "F": "|=", + "G": "&", + "H": "#", + "I": "1", + "J": ",_|", + "K": ">|", + "L": "1", + "M": "/\\/\\", + "N": "^/", + "O": "0", + "P": "|*", + "Q": "(_,)", + "R": "I2", + "S": "5", + "T": "7", + "U": "(_)", + "V": "\\/", + "W": "\\/\\/", + "X": "><", + "Y": "j", + "Z": "2", + "1": "L", + "2": "R", + "3": "E", + "4": "A", + "5": "S", + "6": "b", + "7": "T", + "8": "B", + "9": "g", + "0": "o" +}; + + + +void leetLang( dynamic objText ) { + String text = objText.toString().toUpperCase(); + String output = ""; + + for ( int index=0; index alphabet = constMap(); + + private static Map constMap() { + Map map = new HashMap<>(); + + map.put( "A", "4" ); + map.put( "B", "I3" ); + map.put( "C", "[" ); + map.put( "D", ")" ); + map.put( "E", "3" ); + map.put( "F", "|=" ); + map.put( "G", "&" ); + map.put( "H", "#" ); + map.put( "I", "1" ); + map.put( "J", ",_|" ); + map.put( "K", ">|" ); + map.put( "L", "1" ); + map.put( "M", "/\\/\\" ); + map.put( "N", "^/" ); + map.put( "O", "0" ); + map.put( "P", "|*" ); + map.put( "Q", "(_,)" ); + map.put( "R", "I2" ); + map.put( "S", "5" ); + map.put( "T", "7" ); + map.put( "U", "(_)" ); + map.put( "V", "\\/" ); + map.put( "W", "\\/\\/" ); + map.put( "X", "><" ); + map.put( "Y", "j" ); + map.put( "Z", "2" ); + map.put( "1", "L" ); + map.put( "2", "R" ); + map.put( "3", "E" ); + map.put( "4", "A" ); + map.put( "5", "S" ); + map.put( "6", "b" ); + map.put( "7", "T" ); + map.put( "8", "B" ); + map.put( "9", "g" ); + map.put( "0", "o" ); + + return Collections.unmodifiableMap( map ); + } + + public static void leetLang( Object objText ) { + String text = objText.toString(); + String output = ""; + String letters[] = text.toUpperCase().split( "" ); + + for ( String letter : letters ) + output += alphabet.get( letter ) == null ? letter : alphabet.get( letter ); + + System.out.println( output ); + } + + public static void main(String[] args) { + leetLang( "This is the hacker language" ); + } +} \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/Qv1ko.java" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/Qv1ko.java" index 01b1d36096..2939841a75 100644 --- "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/Qv1ko.java" +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/Qv1ko.java" @@ -1,60 +1,53 @@ -import java.util.Scanner; - public class Qv1ko { public static void main(String[] args) { - Scanner sc=new Scanner(System.in); - String userText=" "; - System.out.print("Write: "); - userText=sc.nextLine(); - leetTranslator(userText); - sc.close(); - }//main + leetTranslator("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ex ex, volutpat vel metus vel, feugiat auctor metus. Mauris elit felis."); + }// main private static void leetTranslator(String text) { - String translatedText="Text in leet -> "; - for(int i=0;i translatedText += '4'; + case 'b' -> translatedText += "I3"; + case 'c' -> translatedText += '['; + case 'd' -> translatedText += ')'; + case 'e' -> translatedText += '3'; + case 'f' -> translatedText += "|="; + case 'g' -> translatedText += '&'; + case 'h' -> translatedText += '#'; + case 'i' -> translatedText += '1'; + case 'j' -> translatedText += ",_|"; + case 'k' -> translatedText += ">|"; + case 'l' -> translatedText += '1'; + case 'm' -> translatedText += "/\\/\\"; + case 'n' -> translatedText += "^/"; + case 'o' -> translatedText += '0'; + case 'p' -> translatedText += "|*"; + case 'q' -> translatedText += "(_,)"; + case 'r' -> translatedText += "I2"; + case 's' -> translatedText += '5'; + case 't' -> translatedText += '7'; + case 'u' -> translatedText += "(_)"; + case 'v' -> translatedText += "\\/"; + case 'w' -> translatedText += "\\/\\/"; + case 'x' -> translatedText += "><"; + case 'y' -> translatedText += 'j'; + case 'z' -> translatedText += '2'; + case '0' -> translatedText += 'o'; + case '1' -> translatedText += 'L'; + case '2' -> translatedText += 'R'; + case '3' -> translatedText += 'E'; + case '4' -> translatedText += 'A'; + case '5' -> translatedText += 'S'; + case '6' -> translatedText += 'b'; + case '7' -> translatedText += 'T'; + case '8' -> translatedText += 'B'; + case '9' -> translatedText += 'g'; + default -> translatedText += text.charAt(i); + }// switch } System.out.println(translatedText); - }//leetTranslator + }// leetTranslator -}//class +}// class diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/asjordi.java" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/asjordi.java" new file mode 100644 index 0000000000..ba13a52edc --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/asjordi.java" @@ -0,0 +1,57 @@ +import java.util.HashMap; + +public class asjordi { + + public String leetConverter(String str) { + + String[] strArray = str.toUpperCase().split(""); + StringBuilder msg = new StringBuilder(); + + HashMap alphabet = new HashMap<>(); + alphabet.put("A", "4"); + alphabet.put("B", "I3"); + alphabet.put("C", "["); + alphabet.put("D", ")"); + alphabet.put("E", "3"); + alphabet.put("F", "|="); + alphabet.put("G", "&"); + alphabet.put("H", "#"); + alphabet.put("I", "1"); + alphabet.put("J", ",_|"); + alphabet.put("K", ">|"); + alphabet.put("L", "1"); + alphabet.put("M", "/\\/\\"); + alphabet.put("N", "^/"); + alphabet.put("O", "0"); + alphabet.put("P", "|*"); + alphabet.put("Q", "(_,)"); + alphabet.put("R", "I2"); + alphabet.put("S", "5"); + alphabet.put("T", "7"); + alphabet.put("U", "(_)"); + alphabet.put("V", "\\/"); + alphabet.put("W", "\\/\\/"); + alphabet.put("X", "><"); + alphabet.put("Y", "j"); + alphabet.put("Z", "2"); + alphabet.put(" ", " "); + alphabet.put("1", "L"); + alphabet.put("2", "R"); + alphabet.put("3", "E"); + alphabet.put("4", "A"); + alphabet.put("5", "S"); + alphabet.put("6", "b"); + alphabet.put("7", "T"); + alphabet.put("8", "B"); + alphabet.put("9", "g"); + alphabet.put("0", "o"); + + for (String s : strArray) { + msg.append(alphabet.get(s)); + } + + return msg.toString(); + + } + +} diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/bramenn.java" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/bramenn.java" new file mode 100644 index 0000000000..681358e284 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/bramenn.java" @@ -0,0 +1,49 @@ +import java.util.HashMap; + +class Bramenn { + + + public static void main(String[] args){ + System.out.println(translateTextToHackerLanguage("LEET")); + } + + public static String translateTextToHackerLanguage(String text){ + HashMap hackerDictionary = new HashMap(); + hackerDictionary.put("a", "4"); + hackerDictionary.put("b", "I3"); + hackerDictionary.put("c", "["); + hackerDictionary.put("d", ")"); + hackerDictionary.put("e", "3"); + hackerDictionary.put("f", "|="); + hackerDictionary.put("g", "&"); + hackerDictionary.put("h", "#"); + hackerDictionary.put("i", "1"); + hackerDictionary.put("j", ",_|"); + hackerDictionary.put("k", ">|"); + hackerDictionary.put("l", "1"); + hackerDictionary.put("m", "/\\/\\"); + hackerDictionary.put("n", "^/"); + hackerDictionary.put("o", "0"); + hackerDictionary.put("p", "|*"); + hackerDictionary.put("q", "(_,)"); + hackerDictionary.put("r", "I2"); + hackerDictionary.put("s", "5"); + hackerDictionary.put("t", "7"); + hackerDictionary.put("u", "(_)"); + hackerDictionary.put("v", "\\/"); + hackerDictionary.put("w", "\\/\\/"); + hackerDictionary.put("x", "><"); + hackerDictionary.put("y", "j"); + hackerDictionary.put("z", "2"); + hackerDictionary.put(" ", " "); + + String translation = ""; + + for (char letter: text.toLowerCase().toCharArray()){ + translation += hackerDictionary.get(String.valueOf(letter)); + } + + return translation; + + } +} \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/raclosdev.java" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/raclosdev.java" new file mode 100644 index 0000000000..280bdaac0e --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/java/raclosdev.java" @@ -0,0 +1,72 @@ + +/* + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + */ + +import java.util.HashMap; +import java.util.Map; + +public class raclosdev { + static Map replacements = new HashMap<>(); + + + public static String hackText(String text) { + + StringBuilder hacked = new StringBuilder(); + for (Character c : text.toCharArray()) { + if (replacements.containsKey(c)) hacked.append(replacements.get(c)); + else hacked.append(c); + } + + return text; + } + + public static void main(String[] args) { + String texto = "Reto solucionado por RaclosDev"; + System.out.println(hackText(texto)); + } + + public void fillMap() { + replacements.put('a', "4"); + replacements.put('b', "6"); + replacements.put('c', "("); + replacements.put('d', "|)"); + replacements.put('e', "3"); + replacements.put('f', "|="); + replacements.put('g', "6"); + replacements.put('h', "|-|"); + replacements.put('i', "1"); + replacements.put('j', "_|"); + replacements.put('k', "|<"); + replacements.put('l', "1_"); + replacements.put('m', "|V|"); + replacements.put('n', "|\\|"); + replacements.put('o', "0"); + replacements.put('p', "|*"); + replacements.put('q', "0_"); + replacements.put('r', "|2"); + replacements.put('s', "5"); + replacements.put('t', "7"); + replacements.put('u', "|_|"); + replacements.put('v', "\\/"); + replacements.put('w', "\\/\\/"); + replacements.put('x', "><"); + replacements.put('y', "`/"); + replacements.put('z', "2"); + replacements.put('0', "O"); + replacements.put('1', "I"); + replacements.put('2', "Z"); + replacements.put('3', "E"); + replacements.put('4', "A"); + replacements.put('5', "S"); + replacements.put('6', "G"); + replacements.put('7', "T"); + replacements.put('8', "B"); + replacements.put('9', "P"); + } +} diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/AlinaBernardez.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/AlinaBernardez.js" new file mode 100644 index 0000000000..bb93c97b3a --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/AlinaBernardez.js" @@ -0,0 +1,36 @@ +const alfabeto = new Map([ + ['a','4'], + ['b','I3'], + ['c','['], + ['d',')'], + ['e','3'], + ['f','|='], + ['g','&'], + ['h','#'], + ['i','1'], + ['j',',_|'], + ['k','>|'], + ['l','1'], + ['m','^^'], + ['n','|\|'], + ['o','0'], + ['p','|*'], + ['q','(_,)'], + ['r','I2'], + ['s','5'], + ['t','7'], + ['u','(_)'], + ['v','\/'], + ['w','\/\/'], + ['x','><'], + ['y','j'], + ['z','2'] +]) +let traduccion = []; + +function traducir(texto) { + let letras = texto.toLowerCase().split('') + letras.map(letra => { alfabeto.has(letra) ? traduccion.push(alfabeto.get(letra)) : traduccion.push(letra) + }) + return traduccion.join('') +} \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/AnzurezDev.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/AnzurezDev.js" new file mode 100644 index 0000000000..28aceea77f --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/AnzurezDev.js" @@ -0,0 +1,50 @@ +const alphabet = { + A: '4', + B: 'I3', + C: '[', + D: ')', + E: '3', + F: '|=', + G: '&', + H: '#', + I: '1', + J: ',_|', + K: '>|', + L: '1', + M: '/\\/\\', + N: '^/', + O: '0', + P: '|*', + Q: '(_,)', + R: 'I2', + S: '5', + T: '7', + U: '(_)', + V: '\\/', + W: '\\/\\/', + X: '><', + Y: 'j', + Z: '2', + 1: 'L', + 2: 'R', + 3: 'E', + 4: 'A', + 5: 'S', + 6: 'b', + 7: 'T', + 8: 'B', + 9: 'g', + 0: 'o' +}; + +const leetLang = text => { + text = String( text ); + let output = ""; + + for ( let letter of text.toUpperCase() ) + output += letter in alphabet ? alphabet[ letter ] : letter ; + + console.log( output ); +} + +leetLang( "This is the hacker language" ); \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/Qv1ko.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/Qv1ko.js" new file mode 100644 index 0000000000..64b1b3eee6 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/Qv1ko.js" @@ -0,0 +1,12 @@ +translateLeet("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + +function translateLeet(text) { + let result = "" + const leetDictionary = new Map([["A", "4"],["B", "I3"],["C", "["],["D", ")"],["E", "3"],["F", "|="],["G", "&"],["H", "#"],["I", "1"],["J", ",_|"],["K", ">|"],["L", "1"],["M", "/\\/\\\\"],["N", "^/"],["O", "0"],["P", "|*"],["Q", "(_,)"],["R", "I2"],["S", "5"],["T", "7"],["U", "(_)"],["V", "\/"],["W", "\/\\/"],["X", "><"],["Y", "j"],["Z", "2"],["1", "L"],["2", "R"],["3", "E"],["4", "A"],["5", "S"],["6", "b"],["7", "T"],["8", "B"],["9", "g"],["0", "o"]]) + + for (let i = 0; i < text.length; i++) { + result += leetDictionary.get(text.charAt(i).toUpperCase()) || text.charAt(i) + } + + console.log(result) +} diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/Raul1551.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/Raul1551.js" new file mode 100644 index 0000000000..e36d4d201f --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/Raul1551.js" @@ -0,0 +1,36 @@ +/* + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + */ + +const dictionaryToLeet = { + a: "4", b: "I3", c: "[", d: ")", e: "3", f: "|=", + g: "&", h: "#", i: "1", j: ",_|", k: ">|", l: "1", + m: "/\\/\\", n: "^/", o: 0, p: "|*", q: "(_,)", r: "|2", + s: "5", t: "7", u: "(_)", v: "\/", w: "\/\/", x: "><", + y: "j", z: "2", 1: "L", 2: "R", 3: "E", 4: "A", 5: "S", 6: "b", 7: "T", 8: "B", 9: "g", 0: "0" +} + +function convertsToLeetLanguage(text) { + + let leetText = ""; + + for (let i = 0; i < text.length; i++) { + + const character = text[i].toLowerCase(); + + if (dictionaryToLeet.hasOwnProperty(character)) { + leetText += dictionaryToLeet[character]; + } else { + leetText += text[i]; + } + } + return leetText; +} + +const text = "Hello there. Welcome to the Leet Dictionary version 7.4.0"; +convertsToLeetLanguage(text) \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/Robindev1812.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/Robindev1812.js" new file mode 100644 index 0000000000..1b803ea0fd --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/Robindev1812.js" @@ -0,0 +1,50 @@ +function leet(text) { + let alphabet = { + a: "4", + b: "I3", + c: "[", + d: ")", + e: "3", + f: "|=", + g: "&", + h: "#", + i: "1", + j: ",_|", + k: ">|", + l: "1", + m: "/\\/\\", + n: "^/", + o: "0", + p: "|*", + q: "(_,)", + r: "I2", + s: "5", + t: "7", + u: "(_)", + v: "\\/", + w: "\\/\\/", + x: "><", + y: "j", + z: "2", + 1: "L", + 2: "R", + 3: "E", + 4: "A", + 5: "S", + 6: "b", + 7: "T", + 8: "B", + 9: "g", + 0: "o", + }; + + let translation = ""; + + for (let letter of text.toLowerCase()) { + translation += letter in alphabet ? alphabet[letter] : letter; + } + + console.log(translation); +} + +leet("Robinson"); diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/TheFabi8A.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/TheFabi8A.js" new file mode 100644 index 0000000000..4771733a73 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/TheFabi8A.js" @@ -0,0 +1,57 @@ +/* + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + */ +function leetSpeak() { + const textPrompt = prompt("Escriba el texto a modificar").toLowerCase(); + const alphabet = { + a: "4", + b: "I3", + c: "[", + d: ")", + e: "3", + f: "|=", + g: "&", + h: "#", + i: "1", + j: ",_|", + k: ">|", + l: "1", + m: "/\\/\\", + n: "^/", + o: "0", + p: "|*", + q: "(_,)", + r: "I2", + s: "5", + t: "7", + u: "(_)", + v: "\\/", + w: "\\/\\/", + x: "><", + y: "j", + z: "2", + 1: "L", + 2: "R", + 3: "E", + 4: "A", + 5: "S", + 6: "b", + 7: "T", + 8: "B", + 9: "g", + 0: "o", + }; + + let modifiedText = [...textPrompt] + .map((char) => (alphabet[char] ? alphabet[char] : char)) + .join(""); + + console.log(modifiedText); +} + +leetSpeak(); diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/daldev14.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/daldev14.js" new file mode 100644 index 0000000000..61857cc40e --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/daldev14.js" @@ -0,0 +1,32 @@ +/* + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + */ + +const Dictionary = { + "a": '4', "b": 'I3', "c": '[', "d": ')', "e": '3', "f": '|=', "g": '&', "h": '#', + "i": '1', "j": ',_|', "k": '>|', "l": '1', "m": '/\\/\\', "n": '^/', "o": '0', + "p": '|*', "q": '(_,)', "r": 'I2', "s": '5', "t": '7', "u": '(_)', "v": '\\/', + "w": '\\/\\/', "x": '><', "y": 'j', "z": '2', "1": 'L', "2": 'R', "3": 'E', + "4": 'A', "5": 'S', "6": 'b', "7": 'T', "8": 'B', "9": 'g', "0": 'o', +}; + +function ConvertToLeet(text) { + let arr = text.toLowerCase().split(""); + arr = arr + .map((item) => { + if (Dictionary[item]) return Dictionary[item]; + return item; + }) + .join(""); + + return arr; +} + +const result = ConvertToLeet("Daniel André Amaya López 203"); + +console.log(result); diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/diegomardev.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/diegomardev.js" new file mode 100644 index 0000000000..3ecfd12dba --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/diegomardev.js" @@ -0,0 +1,34 @@ +const leet_conversion = { +"A": "4", "B": "I3", +"C": "[", "D": ")", +"E": "3", "F": "|=", +"G": "6", "H": "#", +"I": "1", "J": ",_|", +"K": ">|", "L": "1", +"M": "/\\/\\", "N": " ^/", +"O": "0", "P": " |*", +"Q": "(_,)", "R": "I2", +"S": "5", "T": "7", +"U": "(_)", "V": "\\/", +"W": "\\/\\/", "X": "><", +"Y": "j", "Z": "2", +"1": "L", "2": "R", +"3": "E", "4": "A", +"5": "S", "6": "b", +"7": "T", "8": "B", +"9": "g", "0": "o" +} +function leet_speak(text) { //HACKER SPEAK + const text_UpperCase = text.toUpperCase() + let conversion_text = "" + for (let i = 0; i < text_UpperCase.length; i++) { + if(leet_conversion[(text_UpperCase[i])]===undefined){ + conversion_text += text_UpperCase[i] + } + else{ + conversion_text += leet_conversion[(text_UpperCase[i])] + } + } + return conversion_text +} +console.log(leet_speak("Hola mundo!!!")); \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/ernestoalbarez.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/ernestoalbarez.js" new file mode 100644 index 0000000000..2030b595a5 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/ernestoalbarez.js" @@ -0,0 +1,43 @@ +function strToLeet(inputString) { + const leet = { + 'a': '4', + 'b': '13', + 'c': '[', + 'd': ')', + 'e': '3', + 'f': '|=', + 'g': '&', + 'h': '#', + 'i': '1', + 'j': ',_|', + 'k': '>|', + 'l': '1', + 'm': '/\\/\\', + 'n': '^/', + 'o': '0', + 'p': '|*', + 'q': '(_,)', + 'r': '12', + 's': '5', + 't': '7', + 'u': '(_)', + 'v': '/', + 'w': '\\/\\/', + 'x': '><', + 'y': 'j', + 'z': '2', + '1': 'L', + '2': 'R', + '3': 'E', + '4': 'A', + '5': 'S', + '6': 'b', + '7': 'T', + '8': 'B', + '9': 'g', + '0': 'o' + }; + + return inputString.toLowerCase().split('') + .map(c => leet[c] || c).join(''); +} diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/gersancabo.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/gersancabo.js" new file mode 100644 index 0000000000..1dbc387be4 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/gersancabo.js" @@ -0,0 +1,88 @@ +/* + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + */ + +const readline = require("readline"); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +const DictionaryNormal2Leet = { + a: "4", + b: "I3", + c: "[", + d: ")", + e: "3", + f: "|=", + g: "&", + h: "#", + i: "1", + j: ",_|", + k: ">|", + l: "1", + m: "/\\/\\", + n: "^/", + o: "0", + p: "|*", + q: "(_,)", + r: "I2", + s: "5", + t: "7", + u: "(_)", + v: "\\/", + w: "\\/\\/", + x: "><", + y: "j", + z: "2", + 0: "o", + 1: "L", + 2: "R", + 3: "E", + 4: "A", + 5: "S", + 6: "b", + 7: "T", + 8: "B", + 9: "g" +} + +/** + * Transform a normal text in leet text + * + * @param {string} textInput normal text + * @returns {string} textOutput leet text + */ +function normal2leet(textInput) { + let textOutput = ""; + textInput = textInput.toLowerCase(); + for (let i = 0; i < textInput.length; i++) { + let textCharacter = textInput.charAt(i) + let leetCharacter = DictionaryNormal2Leet[textCharacter]; + if (leetCharacter != undefined) { + textCharacter = leetCharacter + } + textOutput += textCharacter; + } + return textOutput; +} + +/** + * Ask for a text to convert to leet alphabet + */ +function askAText() { + let textInput = ""; + rl.question("Escribe tu texto:\n", function (answer) { + textInput = answer; + console.log(normal2leet(textInput)); + rl.close(); + }); +} + +askAText(); \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/hogan26.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/hogan26.js" new file mode 100644 index 0000000000..e24f210f58 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/hogan26.js" @@ -0,0 +1,24 @@ +/* +# Reto #1: EL "LENGUAJE HACKER" +#### Dificultad: Fácil | Publicación: 02/01/23 | Corrección: 09/01/23 + +## Enunciado + +* Escribe un programa que reciba un texto y transforme lenguaje natural a +* "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje +* se caracteriza por sustituir caracteres alfanuméricos. +* - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) +* con el alfabeto y los números en "leet". +* (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") +*/ + +diccionario = {'a':'4','b':'|3','c':'[','d':')','e':'3','f':'|=','g':'&','h':'#','i':'1','j':',_|','k':'>|','l':'1','m':'/\\/\\','n':'^/','o':'0','p':'|*','q':'(_,)','r':'|2','s':'5','t':'7','u':'(_)','v':'\\/','w':'\\/\\/','x':'><','y':'j','z':'2','1':'L','2':'R','3':'E','4':'A','5':'S','6':'b','7':'T','8':'B','9':'g','0':'o',' ':' '} + +const traduccion = palabra => { + let traduccion = '' + for (letra of palabra) traduccion += diccionario[letra] + return traduccion +} + +palabra = prompt('Ingrese la palabra') +console.log(traduccion(palabra)) diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/pepegonzale.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/pepegonzale.js" new file mode 100644 index 0000000000..76726584ce --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/pepegonzale.js" @@ -0,0 +1,42 @@ +const language = { + a: "4", + b: "I3", + c: "[", + d: ")", + e: "3", + f: "|=", + g: "&", + h: "#", + i: "1", + j: ",_|", + k: ">|", + l: "1", + m: "/\\/\\", + n: "^/", + o: "0", + p: "|*", + q: "(_,)", + r: "I2", + s: "5", + t: "7", + u: "(_)", + v: "\\/", + w: "\\/\\/", + x: "><", + y: "j", + z: "2", + 1: "L", + 2: "R", + 3: "E", + 4: "A", + 5: "S", + 6: "b", + 7: "T", + 8: "B", + 9: "g", + 0: "o"}; +function hacker_language(input){ + return input.toLowerCase().split('').map(e => language[e]).join('') +} + +hackeer_language("PepiLLo") \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/saragarrofe.js" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/saragarrofe.js" new file mode 100644 index 0000000000..306a4144f9 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/javascript/saragarrofe.js" @@ -0,0 +1,41 @@ + let lenguaje = { + "a": "4", + "b": "I3", + "c": "[", + "d": ")", + "e": "3", + "f": "|=", + "g": "&", + "h": "#", + "i": "1", + "j": ",_|", + "k": ">|", + "l": "1", + "m": "JVI", + "n": "^/", + "o": "0", + "p": "|*", + "q": "(_,)", + "r": "I2", + "s": "5", + "t": "7", + "u": "(_)", + "v": "\/", + "w": "\/\/", + "x": "><", + "y": "j", + "z": "2" +} + + + +function hacker(texto) { + let ret = ""; + for (palabra of texto) { + let minuscula = palabra.toLowerCase(); + ret += lenguaje[minuscula] + } + return ret +} + +hacker("LenguajeHacker") diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/kotlin/marchdz.kt" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/kotlin/marchdz.kt" new file mode 100644 index 0000000000..4372244dca --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/kotlin/marchdz.kt" @@ -0,0 +1,21 @@ +fun naturalToLeetTranslator(text: String) { + val naturalToLeetDictionary = mapOf( + "A" to "4", "B" to "I3", "C" to "[", "D" to ")", "E" to "3", "F" to "|=", "G" to "&", "H" to "#", "I" to "1", + "J" to ",_|", "K" to ">|", "L" to "1", "M" to "/\\/\\", "N" to "^/", "O" to "0", "P" to "|*", "Q" to "(_,)", + "R" to "I2", "S" to "5", "T" to "7", "U" to "(_)", "V" to "\\/", "W" to "\\/\\/", "X" to "><", "Y" to "j", + "Z" to "2", "1" to "L", "2" to "R", "3" to "E", "4" to "A", "5" to "S", "6" to "b", "7" to "T", "8" to "B", + "9" to "g", "0" to "o" + ) + + var translatedText = "" + + for (char in text) { + translatedText += naturalToLeetDictionary[char.uppercase()] ?: char + } + println("$text ==> $translatedText") +} + +fun main() { + naturalToLeetTranslator("foo bar") + naturalToLeetTranslator("Testing Leet translator") +} diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/php/AnzurezDev.php" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/php/AnzurezDev.php" new file mode 100644 index 0000000000..396f42d1c3 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/php/AnzurezDev.php" @@ -0,0 +1,51 @@ + '4', + 'B' => 'I3', + 'C' => '[', + 'D' => ')', + 'E' => '3', + 'F' => '|=', + 'G' => '&', + 'H' => '#', + 'I' => '1', + 'J' => ',_|', + 'K' => '>|', + 'L' => '1', + 'M' => '/\\/\\', + 'N' => '^/', + 'O' => '0', + 'P' => '|*', + 'Q' => '(_,)', + 'R' => 'I2', + 'S' => '5', + 'T' => '7', + 'U' => '(_)', + 'V' => '\\/', + 'W' => '\\/\\/', + 'X' => '><', + 'Y' => 'j', + 'Z' => '2', + '1' => 'L', + '2' => 'R', + '3' => 'E', + '4' => 'A', + '5' => 'S', + '6' => 'b', + '7' => 'T', + '8' => 'B', + '9' => 'g', + '0' => 'o' +)); + +function leet_lang( $text ) { + $output = ""; + $text = strtoupper( $text ); + + for ( $index=0; $index '4', + 'b' => 'I3', + 'c' => '[', + 'd' => ')', + 'e' => '3', + 'f' => '|=', + 'g' => '&', + 'h' => '#', + 'i' => '1', + 'j' => ',_|', + 'k' => '>|', + 'l' => '1', + 'm' => '/\/\\', + 'n' => '^/', + 'o' => '0', + 'p' => '|*', + 'q' => '(_,)', + 'r' => 'I2', + 's' => '5', + 't' => '7', + 'u' => '(_)', + 'v' => '\/', + 'w' => '\/\/', + 'x' => '><', + 'y' => 'j', + 'z' => '2', + '1' => 'L', + '2' => 'R', + '3' => 'E', + '4' => 'A', + '5' => 'S', + '6' => 'b', + '7' => 'T', + '8' => 'B', + '9' => 'g', + '0' => 'o', + ]; + + foreach (str_split(strval($text)) as $letter) { + $leetText .= $vocabulary[$letter]; + } + return $leetText; +} + +/* The code `echo leet(123); echo leet("kodingrick");` is calling the `leet()` function twice with +different arguments and then printing the returned leet versions of the input strings. */ +echo leet(123) . PHP_EOL; +echo leet("kodingrick") . PHP_EOL; diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/AnzurezDev.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/AnzurezDev.py" new file mode 100644 index 0000000000..4b3d09cfe3 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/AnzurezDev.py" @@ -0,0 +1,49 @@ +ALPHABET = { + "A": '4', + "B": 'I3', + "C": '[', + "D": ')', + "E": '3', + "F": '|=', + "G": '&', + "H": '#', + "I": '1', + "J": ',_|', + "K": '>|', + "L": '1', + "M": '/\\/\\', + "N": '^/', + "O": '0', + "P": '|*', + "Q": '(_,)', + "R": 'I2', + "S": '5', + "T": '7', + "U": '(_)', + "V": '\\/', + "W": '\\/\\/', + "X": '><', + "Y": 'j', + "Z": '2', + "1": 'L', + "2": 'R', + "3": 'E', + "4": 'A', + "5": 'S', + "6": 'b', + "7": 'T', + "8": 'B', + "9": 'g', + "0": 'o' +} + +def leet_lang( text ): + text = str( text ) + output = "" + + for letter in text.upper(): + output += ALPHABET.get( letter ) if ALPHABET.get( letter ) else letter + + print( output ) + +leet_lang( "This is the hacker language" ); \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/PedroOrtix.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/PedroOrtix.py" new file mode 100644 index 0000000000..321b08b56c --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/PedroOrtix.py" @@ -0,0 +1,51 @@ +# ``` +# /* +# * Escribe un programa que reciba un texto y transforme lenguaje natural a +# * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje +# * se caracteriza por sustituir caracteres alfanuméricos. +# * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) +# * con el alfabeto y los números en "leet". +# * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") +# */ +# ``` + +vocab = { + "a": "4", + "b": "13", + "c": "[", + "d": ")", + "e": "3", + "f": "|=", + "g": "&", + "h": "#", + "i": "1", + "j": ",_|", + "k": ">|", + "l": "1", + "m": "", + "n": "^/", + "o": "0", + "p": "|*", + "q": "(_,)", + "r": "l2", + "s": "5", + "t": "7", + "u": "(_)", + "v": "\/", + "w": "\\/\\/", + "x": "><", + "y": "j", + "z": "2" +} + +def leet_translate(input: str) -> str: + palabras = list(input.split()) + palabras_traducidas = [] + for palabra in palabras: + transformar = lambda x: vocab[x] + palabra_leet = ('').join(list(map(transformar, palabra))) + palabras_traducidas.append(palabra_leet) + + return (" ").join(palabras_traducidas) + +print(leet_translate(input("Introduce texto: "))) \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/ShinMugenNoKabe.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/ShinMugenNoKabe.py" new file mode 100644 index 0000000000..08a97e3079 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/ShinMugenNoKabe.py" @@ -0,0 +1,48 @@ +# Escribe un programa que reciba un texto y transforme lenguaje natural a +# "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje +# se caracteriza por sustituir caracteres alfanuméricos. +# - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) +# con el alfabeto y los números en "leet". +# (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + +LEETCODE = { + "a": "4", + "b": "I3", + "c": "[", + "d": ")", + "e": "3", + "f": "|=", + "g": "&", + "h": "#", + "i": "1", + "j": ",_|", + "k": ">|", + "l": "1", + "m": "/\/\\", + "n": "^/", + "o": "0", + "p": "|*", + "q": "(_,)", + "r": "I2", + "s": "5", + "t": "7", + "u": "(_)", + "v": "\\/", + "w": "\/\/", + "x": "><", + "y": "j", + "z": "2" +} + + +def translate_to_leetcode(text: str) -> str: + return "".join([LEETCODE.get(char.lower(), char) for char in text]) + + +def main(): + text = input(translate_to_leetcode("Escribe un texto: ")) + print(translate_to_leetcode(text)) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/alberba.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/alberba.py" new file mode 100644 index 0000000000..85de6bb019 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/alberba.py" @@ -0,0 +1,21 @@ +def traductor_leet(texto): + word_translator = {'A': '4', "B": "I3", 'C': '[', 'D': ')', 'E': '3', 'F': '|=', + 'G': '&', 'H': '#', 'I': '1', 'J': ',_|', 'K': '|<¡', + 'L': '|_', 'M': '/\/\\', 'N': '^/', 'O': '0', 'P': '|*', + 'Q': '(_,)', 'R': 'I2', 'S': '5', 'T': '7', 'U': '(_)', + 'V': '\/', 'W': '\/\/', 'X': '><', 'Y': 'j', 'Z': '2', + '0': 'o', '1': 'L', '2': 'R', '3': 'E', '4': 'A', '5': 'S', + '6': 'b', '7': 'T', '8': 'B', '9': 'g'} + result = "" + + # Como el usuario puede escribir una oración con mínusculas, crearemos un + # estandar en mayúsculas + for char in texto.upper(): + if char in word_translator.keys(): + result += word_translator[char] + # Para caracteres que no esten definidos, los escribiremos sin modificar + else: + result += char + print(result) + +traductor_leet(input("Escribe tu frase: ")) \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/bramenn.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/bramenn.py" new file mode 100644 index 0000000000..e04fc4c333 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/bramenn.py" @@ -0,0 +1,35 @@ +hacker_dictionary = { + "a":"4", + "b":"I3", + "c":"[", + "d":")", + "e":"3", + "f":"|=", + "g":"&", + "h":"#", + "i":"1", + "j":",_|", + "k":">|", + "l":"1", + "m":"/\\/\\", + "n":"^/", + "o":"0", + "p":"|*", + "q":"(_,)", + "r":"I2", + "s":"5", + "t":"7", + "u":"(_)", + "v":"\\/", + "w":"\\/\\/", + "x":"><", + "y":"j", + "z":"2", + " ":" ", +} + +def main(text: str): + return "".join(letter.replace(letter, hacker_dictionary.get(letter, letter)) for letter in text.lower()) + + +print(main("leet")) \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/callmeGustavo.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/callmeGustavo.py" new file mode 100644 index 0000000000..6cf17b6f91 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/callmeGustavo.py" @@ -0,0 +1,64 @@ + + + +def reto2(text): + diccionario = { + "a": "4", + "b": "I3", + "c": "[", + "d": ")", + "e": "3", + "f": "|=", + "g": "&", + "h": "#", + "i": "1", + "j": ",_|", + "k": ">|", + "l": "1", + "m": "/\/\\", + "n": "^/", + "o": "0", + "p": "|*", + "q": "(_,)", + "r": "|2", + "s": "5", + "t": "7", + "u": "(_)", + "v": "\/", + "w": "\/\/", + "x": "><", + "y": "j", + "z": "2", + "1": "L", + "2": "R", + "3": "E", + "4": "A", + "5": "S", + "6": "b", + "7": "T", + "8": "B", + "9": "g", + "0": "o", + " ": " " +} + + # text = input('Ingrese texto: ') + + + + text_translate = '' + + for letter in text: + + if letter in diccionario.keys(): + text_translate += diccionario[letter] + + print(text_translate) + + return text_translate + + + +text = input("Write the text to translate: ") +reto2(text) + diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/coolbender.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/coolbender.py" new file mode 100644 index 0000000000..1813de2a67 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/coolbender.py" @@ -0,0 +1,22 @@ +''' +/* + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + */ +''' + +leetDict={"a":"4", "e":"3", "i":"1", "o":"0", "u":"v"} + +def thelleter(): + text=input("Introduce un texto para transformar:") + for l in leetDict.keys(): + text = text.replace(l, leetDict[l]) + + return text + + +print(thelleter()) \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/ernestoalbarez.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/ernestoalbarez.py" new file mode 100644 index 0000000000..845ed2a5ed --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/ernestoalbarez.py" @@ -0,0 +1,43 @@ +def str_to_leet(input_string): + leet = { + 'a': '4', + 'b': '13', + 'c': '[', + 'd': ')', + 'e': '3', + 'f': '|=', + 'g': '&', + 'h': '#', + 'i': '1', + 'j': ',_|', + 'k': '>|', + 'l': '1', + 'm': '/\\/\\', + 'n': '^/', + 'o': '0', + 'p': '|*', + 'q': '(_,)', + 'r': '12', + 's': '5', + 't': '7', + 'u': '(_)', + 'v': '/', + 'w': '\\/\\/', + 'x': '><', + 'y': 'j', + 'z': '2', + '1': 'L', + '2': 'R', + '3': 'E', + '4': 'A', + '5': 'S', + '6': 'b', + '7': 'T', + '8': 'B', + '9': 'g', + '0': 'o' + } + + return ''.join( + [leet[c] if c in leet else c for c in input_string.lower()] + ) diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/fedecoronado.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/fedecoronado.py" new file mode 100644 index 0000000000..5e1730790a --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/fedecoronado.py" @@ -0,0 +1,28 @@ +'''/* + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + */''' + +leet = { + "a": "4", "b": "I3", "c": "[", "d": ")", "e": "3", "f": "|=", "g": "&", "h": "#", "i": "1", "j": ",_|", "k": ">|", + "l": "1", "m": "/\/\\", "n": "^/", "o": "0", "p": "|*", "q": "(_,)", "r": "|2", "s": "5", "t": "7", "u": "(_)", + "v": "\/", "w": "\/\/", "x": "><", "y": "j", "z": "2", "1": "L", "2": "R", "3": "E", "4": "A", "5": "S", "6": "b", + "7": "T", "8": "B", "9": "g", "0": "o" +} + +def text_to_leet(string): + string = string.lower() + salida ="" + for letra in string: + try: + salida+=leet[letra] + except: + salida += "_" + return salida + +print(text_to_leet("Fede$rico")) + \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/felipenico.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/felipenico.py" new file mode 100644 index 0000000000..6132fcc1ce --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/felipenico.py" @@ -0,0 +1,61 @@ +'''/* + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + */''' +class Encrypt: + alphabet = { + 'A':'4', + 'B':'I3', + 'C':'[', + 'D':')', + 'E':'3', + 'F':'|=', + 'G':'&', + 'H':'#', + 'I':'1', + 'J':',_|', + 'K':'>|', + 'L':'1', + 'M':'JVI', + 'N':'Λ/', + 'O':'0', + 'P':'|°', + 'Q':'(_,)', + 'R':'I2', + 'S':'5', + 'T':'7', + 'U':'(_)', + 'V':'\/', + 'W':'\/\/', + 'X':'><', + 'Y':'j', + 'Z':'2', + '0':'o', + '1':'L', + '2':'R', + '3':'E', + '4':'A', + '5':'S', + '6':'b', + '7':'T', + '8':'B', + '9':'g', + + } + def lorem_ipsum(): + return "Lorem ipsum dolor sit amet, consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." + #return "hola Mundo" + def hackear(): + c = "" + for n in Encrypt.lorem_ipsum().upper(): + if(n.isalnum()): #n in Encrypt.alphabet.keys() + c += Encrypt.alphabet[n] + else: + c += n + return c +print(Encrypt.hackear()) + diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/fjgonzalezbarea.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/fjgonzalezbarea.py" new file mode 100644 index 0000000000..e11437412f --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/fjgonzalezbarea.py" @@ -0,0 +1,59 @@ +""" + Escribe un programa que reciba un texto y transforme lenguaje natural a + "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + se caracteriza por sustituir caracteres alfanuméricos. + - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) con el alfabeto y los números en "leet". + (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + + Ejecución: + python -m fjgonzalezbarea +""" +dictionary: dict[str, str] = { + "A":"4", + "B":"I3", + "C":"[", + "D":")", + "E":"3", + "F":"|=", + "G":"&", + "H":"#", + "I":"1", + "J":",_|", + "K":">|", + "L":"1", + "M":"JVI", + "N":"^/", + "O":"0", + "P":"|*", + "Q":"(_,)", + "R":"I2", + "S":"5", + "T":"7", + "U":"(_)", + "V":"|/", + "W":"\/\/", + "X":"><", + "Y":"j", + "Z":"2", + "1":"L", + "2":"R", + "3":"E", + "4":"A", + "5":"S", + "6":"b", + "7":"T", + "8":"B", + "9":"g", + "0":"o", +} + +def transform_character(character: str) -> str: + return dictionary.get(character.upper(), character) + +def transform_text(text: str): + transformed_text = "".join([transform_character(character) for character in text]) + print(f"The text translated to hacker language is:\n {transformed_text}") + +if __name__ == "__main__": + text = input("Introduce a text: ") + transform_text(text) diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/hogan26.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/hogan26.py" new file mode 100644 index 0000000000..003d901a1a --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/hogan26.py" @@ -0,0 +1,11 @@ +diccionario = {'a':'4','b':'|3','c':'[','d':')','e':'3','f':'|=','g':'&','h':'#','i':'1','j':',_|','k':'>|','l':'1','m':'/\/\\','n':'^/','o':'0','p':'|*','q':'(_,)','r':'|2','s':'5','t':'7','u':'(_)','v':'\/','w':'\/\/','x':'><','y':'j','z':'2','1':'L','2':'R','3':'E','4':'A','5':'S','6':'b','7':'T','8':'B','9':'g','0':'o',' ':' '} + +def traducir(palabra): + traduccion = '' + for letra in palabra: + traduccion += diccionario[letra] + + return traduccion + +palabra = input('Ingresa una palabra\n').lower() +print(traducir(palabra)) \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/klimyflorez.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/klimyflorez.py" new file mode 100644 index 0000000000..7a55fa3fbe --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/klimyflorez.py" @@ -0,0 +1,51 @@ +''' +* Escribe un programa que reciba un texto y transforme lenguaje natural a +* "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje +* se caracteriza por sustituir caracteres alfanuméricos. +* - Utiliza esta tabla(https: // www.gamehouse.com/blog/leet-speak-cheat-sheet/) +* con el alfabeto y los números en "leet". +* (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") +''' + +leet_dir = { + 'a': '4', + 'b': 'I3', + 'c': '[', + 'd': ')', + 'e': '3', + 'f': '|=', + 'g': '&', + 'h': '#', + 'i': '1', + 'j': ',_|', + 'k': '>|', + 'l': '£', + 'm': '|\/|', + 'n': '^/', + 'o': '0', + 'p': '|*', + 'q': '(_,)', + 'r': 'I2', + 's': '5', + 't': '7', + 'u': '(_)', + 'v': '\/', + 'w': '\/\/', + 'x': '><', + 'y': 'j', + 'z': '2', +} + +def lenguaje_hacker(): + text = input('Please, input your Text to convert to l33t code:\n>').lower() + leet_text = '' + + for letter in text: + if letter in leet_dir: + leet_text += leet_dir[letter] + else: + leet_text += letter + return print(leet_text) + + +lenguaje_hacker() \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/kodingrick.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/kodingrick.py" new file mode 100644 index 0000000000..5b7074f0d7 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/kodingrick.py" @@ -0,0 +1,58 @@ +''' +The `leet` function takes a string or integer as input and returns the leet (1337) version of the +text. + +:param text: The `text` parameter in the `leet` function is either a string or an integer +:type text: str|int +:return: The function `leet` returns a string that has been converted to leet (1337) text. +''' +def leet(text: str|int) -> str: + leet_text = '' + vocabulary = { + 'a': '4', + 'b': 'I3', + 'c': '[', + 'd': ')', + 'e': '3', + 'f': '|=', + 'g': '&', + 'h': '#', + 'i': '1', + 'j': ',_|', + 'k': '>|', + 'l': '1', + 'm': '/\/\\', + 'n': '^/', + 'o': '0', + 'p': '|*', + 'q': '(_,)', + 'r': 'I2', + 's': '5', + 't': '7', + 'u': '(_)', + 'v': '\/', + 'w': '\/\/', + 'x': '><', + 'y': 'j', + 'z': '2', + '1': 'L', + '2': 'R', + '3': 'E', + '4': 'A', + '5': 'S', + '6': 'b', + '7': 'T', + '8': 'B', + '9': 'g', + '0': 'o', + } + + for letter in str(text): + leet_text += vocabulary[letter] + + return leet_text + +# The code is asking the user to input a text and then it calls the `leet` function with the user's +# input as the argument. The leet version of the input text is then printed to the console. +input = input('Give me a text: ') +print('the leet text is: %s' %(leet(input))) \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/marcoatrs.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/marcoatrs.py" new file mode 100644 index 0000000000..0b09c9d594 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/marcoatrs.py" @@ -0,0 +1,47 @@ +leet = { + "A": "4", + "B": "I3", + "C": "[", + "D": ")", + "E": "3", + "F": "|=", + "G": "&", + "H": "#", + "I": "1", + "J": ",_|", + "K": ">|", + "L": "1", + "M": "/\/\\", + "N": "^/", + "O": "0", + "P": "|*", + "Q": "(_,)", + "R": "I2", + "S": "5", + "T": "7", + "U": "(_)", + "V": "\/", + "W": "\/\/", + "X": "><", + "Y": "j", + "Z": "2", + "1": "L", + "2": "R", + "3": "E", + "4": "A", + "5": "S", + "6": "b", + "7": "T", + "8": "B", + "9": "g", + "0": "o" +} + +def convert_leet(text: str) -> str: + up_text = text.upper() + return "".join(leet.get(t, t) for t in up_text) + + +print(convert_leet("marcoatrs")) +print(convert_leet("hola a quien lea esto")) + diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/rafaelramirez150.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/rafaelramirez150.py" new file mode 100644 index 0000000000..e239f8fcd5 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/rafaelramirez150.py" @@ -0,0 +1,40 @@ +''' +* Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + +''' +def convert_to_leet(text): + + leet_dict = { + "a": "4", "b": "I3", "c": "[", "d": ")", "e": "3", + "f": "|=", "g": "&", "h": "#", "i": "1", "j": ":_|", + "k": ">|", "l": "1", "m": "/\\/\\", "n": "^/", "o": "0", + "p": "|*", "q": "(_,)", "r": "I2", "s": "5", "t": "7", + "u": "(_)", "v": "\\/", "w": "\\/\\/", "x": "><", + "y": "j", "z": "2", "1": "L", "2": "R", "3": "E", + "4": "A", "5": "S", "6": "b", "7": "T", "8": "B", + "9": "g", "0": "o" +} + + leet_text = "" + + for char in text: + if char.lower() in leet_dict: + leet_text += leet_dict[char.lower()] + else: + leet_text += char + + return leet_text + +# Pedir al usuario que ingrese un texto +texto_original = input("Ingresa un texto: ") + +# Convertir el texto a lenguaje hacker (leet) +texto_leet = convert_to_leet(texto_original) + +# Imprimir el texto convertido +print("Texto en lenguaje hacker (leet):", texto_leet) \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/rafaelramireza.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/rafaelramireza.py" new file mode 100644 index 0000000000..ac4450b17b --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/rafaelramireza.py" @@ -0,0 +1,28 @@ +""" + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") +""" + +diccionario = { + "a": "4", "b": "I3", "c": "[", "d": ")", "e": "3", + "f": "|=", "g": "&", "h": "#", "i": "1", "j": ":_|", + "k": ">|", "l": "1", "m": "/\\/\\", "n": "^/", "o": "0", + "p": "|*", "q": "(_,)", "r": "I2", "s": "5", "t": "7", + "u": "(_)", "v": "\\/", "w": "\\/\\/", "x": "><", + "y": "j", "z": "2", "1": "L", "2": "R", "3": "E", + "4": "A", "5": "S", "6": "b", "7": "T", "8": "B", + "9": "g", "0": "o" +}; + +texto = input("Introduzca un texto: ") + +hacker="" + +for letra in texto: + if letra.lower() in diccionario: + hacker = hacker + diccionario[letra.lower()] +print (f"El texto {texto} en 'Lenguaje Hacker' es: {hacker}") \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/ronnyg2121.py" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/ronnyg2121.py" new file mode 100644 index 0000000000..7a80f422f7 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/python/ronnyg2121.py" @@ -0,0 +1,69 @@ + + +# Método que se usa para convertir el carácter a código leet. Recibirá un parámetro para poder pasarle la información +def converter(text): + + # Diccionario que le asigna el carácter correspondiente ca dada letra + dict_leet = { + "a": "4", + "b": "I3", + "c": "[", + "d": "|)", + "e": "3", + "f": "|=", + "g": "(_+", + "h": ")-(", + "i": "1", + "j": "]", + "k": "|<", + "l": "7", + "m": "|V|", + "n": "|\|", + "o": "()", + "p": "|>", + "q": "0_", + "r": "I2", + "s": "$", + "t": "-|-", + "u": "(_)", + "v": "\/", + "w": "\/\/", + "x": "×", + "y": "¥", + "z": "%", + "1": "L", + "2": "R", + "3": "E", + "4": "A", + "5": "S", + "6": "b", + "7": "T", + "8": "B", + "9": "g", + "0": "o" +} + +# Variable usada para sumarle cada carácter a cada vuelta de bucle + resultado = "" + +# Bucle for que recorre el diccionario y le asigna cada carácter donde corresponda + for i in text: +# Ignorando el carácter en minúscula o mayúscula y convirtiéndolo a string + + i = str(i.lower()) + +# Comprobando si el carácter está en el diccionario + if i in dict_leet: + # Esto es lo que pasa el valor de cada clave en el diccionario + resultado += dict_leet[i] + +# Si no está, se devuelve el carácter original + else: + resultado += i + +# Regresamos la variable resultado + return resultado + +# Probando el programa +entrada = input("Ingrese el texto a convertir y pulse enter") +print(converter(entrada)) \ No newline at end of file diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/ruby/ernestoalbarez.rb" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/ruby/ernestoalbarez.rb" new file mode 100644 index 0000000000..b750705240 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/ruby/ernestoalbarez.rb" @@ -0,0 +1,42 @@ +def str_to_leet(str) + leet = { + 'a' => '4', + 'b' => 'I3', + 'c' => '[', + 'd' => ')', + 'e' => '3', + 'f' => '|=', + 'g' => '&', + 'h' => '#', + 'i' => '1', + 'j' => ',_|', + 'k' => '>|', + 'l' => '1', + 'm' => '/\\/\\', + 'n' => '^/', + 'o' => '0', + 'p' => '|*', + 'q' => '(_,)', + 'r' => 'I2', + 's' => '5', + 't' => '7', + 'u' => '(_)', + 'v' => '/', + 'w' => '\\/\\/', + 'x' => '><', + 'y' => 'j', + 'z' => '2', + '1' => 'L', + '2' => 'R', + '3' => 'E', + '4' => 'A', + '5' => 'S', + '6' => 'b', + '7' => 'T', + '8' => 'B', + '9' => 'g', + '0' => 'o' + } + + return str.downcase.gsub(/[a-z]/, leet) +end diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/typescript/freddoOswaldo.ts" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/typescript/freddoOswaldo.ts" new file mode 100644 index 0000000000..ac465a69b1 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/typescript/freddoOswaldo.ts" @@ -0,0 +1,67 @@ +/* + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + * + * NOTA Los caracteres que no estén en el alfabeto se mantienen igual + */ + +const alphabet = { + a: "4", + b: "I3", + c: "[", + d: ")", + e: "3", + f: "|=", + g: "&", + h: "#", + i: "1", + j: ",_|", + k: ">|", + l: "1", + m: "/\\/\\", + n: "^/", + o: "0", + p: "|*", + q: "(_,)", + r: "|2", + s: "5", + t: "7", + u: "(_)", + v: "\\/", + w: "\\/\\/", + x: "><", + y: "j", + z: "2", + 1: "L", + 2: "R", + 3: "E", + 4: "A", + 5: "S", + 6: "b", + 7: "T", + 8: "B", + 9: "g", + 0: "o", +}; + +type KeyAlphabet = keyof typeof alphabet; + +function transformCharacter(characterKey: string) { + return alphabet[characterKey as KeyAlphabet]; +} + +function printTransformedText(text: string, textTranformed: string) { + console.log(text, "=>", textTranformed); +} +function transformText(text: string = "") { + const textTransformated = text + .toLowerCase() + .replace(/([a-z0-9])/g, (letter: string) => transformCharacter(letter)); + printTransformedText(text, textTransformated); +} + +transformText("hola mundo 1344"); diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/typescript/miguelriosoliveira.ts" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/typescript/miguelriosoliveira.ts" new file mode 100644 index 0000000000..2d128df584 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/typescript/miguelriosoliveira.ts" @@ -0,0 +1,71 @@ +/* + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + */ + +const LEET_MAP = { + a: '4', + b: 'I3', + c: '[', + d: ')', + e: '3', + f: '|=', + g: '&', + h: '#', + i: '1', + j: ',_|', + k: '>|', + l: '1', + m: '/\\/\\', + n: '^/', + o: '0', + p: '|*', + q: '(_,)', + r: 'I2', + s: '5', + t: '7', + u: '(_)', + v: '\\/', + w: '\\/\\/', + x: '><', + y: 'j', + z: '2', + '0': 'o', + '1': 'L', + '2': 'R', + '3': 'E', + '4': 'A', + '5': 'S', + '6': 'b', + '7': 'T', + '8': 'B', + '9': 'g', +}; + +function toLeet(str: string): string { + return str + .toLowerCase() + .split('') + .map(c => LEET_MAP[c] || c) + .join(''); +} + +function test() { + // Arrange + // Act + const received = toLeet('hello world'); + + // Assert + const expected = '#3110 \\/\\/0I21)'; + if (received === expected) { + console.log('✅ PASS'); + } else { + console.log('❌ FAIL', { expected, received }); + } +} + +test(); diff --git "a/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/typescript/nicodav28.ts" "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/typescript/nicodav28.ts" new file mode 100644 index 0000000000..e178b66e56 --- /dev/null +++ "b/Retos/Reto #1 - EL LENGUAJE HACKER [F\303\241cil]/typescript/nicodav28.ts" @@ -0,0 +1,54 @@ +/* + * Escribe un programa que reciba un texto y transforme lenguaje natural a + * "lenguaje hacker" (conocido realmente como "leet" o "1337"). Este lenguaje + * se caracteriza por sustituir caracteres alfanuméricos. + * - Utiliza esta tabla (https://www.gamehouse.com/blog/leet-speak-cheat-sheet/) + * con el alfabeto y los números en "leet". + * (Usa la primera opción de cada transformación. Por ejemplo "4" para la "a") + */ +class Leet{ + private dictionary: Record = { + a: '4', + b: 'I3', + c: '[', + d: ')', + e: '3', + f: '|=', + g: '&', + h: '#', + i: '1', + j: ',_|', + k: '>|', + l: '1', + m: '/\\/\\', + n: '^/', + o: '0', + p: '|*', + q: '(_,)', + r: 'I2', + s: '5', + t: '7', + u: '(_)', + v: '\\/', + w: '\\/\\/', + x: '><', + y: 'j', + z: '2' + } + + public encode(text: string): string { + text = text.toLowerCase(); + const destructuring = text.split(''); + + const result = destructuring.map((letter) => { + return this.dictionary[letter] || letter; + }) + + return result.join(''); + } + +} + +const hackerLanguage = new Leet; +const translate = hackerLanguage.encode("Hola mi nombre es Nicolas"); +console.log(translate); diff --git a/Retos/Reto #10 - LA API [Media]/java/asjordi.java b/Retos/Reto #10 - LA API [Media]/java/asjordi.java new file mode 100644 index 0000000000..169a4c5729 --- /dev/null +++ b/Retos/Reto #10 - LA API [Media]/java/asjordi.java @@ -0,0 +1,37 @@ +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +public class RickAndMortyApi { + + private final int id; + + public RickAndMortyApi(int id) { + this.id = id; + } + + public String getCharacter() throws URISyntaxException, IOException, InterruptedException { + + if (this.id > 826 || this.id < 1) return "The id parameter must be between 1 and 826"; + + String url = String.format("https://rickandmortyapi.com/api/character/%s", this.id); + + HttpClient httpClient = HttpClient.newHttpClient(); + + HttpRequest getRequest = HttpRequest.newBuilder() + .uri(new URI(url)) + .GET() + .build(); + + HttpResponse getResponse = httpClient.send(getRequest, HttpResponse.BodyHandlers.ofString()); + + if (getResponse.statusCode() > 400) return "There was an error!"; + + return getResponse.body(); + + } + +} diff --git a/Retos/Reto #10 - LA API [Media]/python/alberba.py b/Retos/Reto #10 - LA API [Media]/python/alberba.py new file mode 100644 index 0000000000..4904a6b92f --- /dev/null +++ b/Retos/Reto #10 - LA API [Media]/python/alberba.py @@ -0,0 +1,14 @@ +import requests +import json + +def random_BreakingBad_quotes(): + url = "https://api.breakingbadquotes.xyz/v1/quotes" + + response = requests.get(url) + dict_quotes = json.loads(response.content)[0] + print() + print(f'Cita: {dict_quotes["quote"]}') + print(f'Autor: {dict_quotes["author"]}') + print() + +random_BreakingBad_quotes() \ No newline at end of file diff --git a/Retos/Reto #10 - LA API [Media]/python/callmeGustavo.py b/Retos/Reto #10 - LA API [Media]/python/callmeGustavo.py new file mode 100644 index 0000000000..1950227107 --- /dev/null +++ b/Retos/Reto #10 - LA API [Media]/python/callmeGustavo.py @@ -0,0 +1,31 @@ +import requests + + +word = str(input("What is meaning of the word: ")) + +url = 'https://api.dictionaryapi.dev/api/v2/entries/en/' +response = requests.get(url + word) +breakpoint() +print(response.json()) +print(response) + + + +#url = "https://pokeapi.co/api/v2/pokemon/" + + + +#response = requests.get(url) + + + +#response = requests.get(url) +# print(name["name"]) + # print(name["url"]) + # print(name) + +#pokemon="metapod" +#res_api = requests.get(url + pokemon) +#print(res_api.json()) +#print(res_api) +# print(response.json()["results"]) \ No newline at end of file diff --git a/Retos/Reto #10 - LA API [Media]/python/klimyflorez.py b/Retos/Reto #10 - LA API [Media]/python/klimyflorez.py new file mode 100644 index 0000000000..47563a65f6 --- /dev/null +++ b/Retos/Reto #10 - LA API [Media]/python/klimyflorez.py @@ -0,0 +1,51 @@ +""" + * Llamar a una API es una de las tareas más comunes en programación. + * Implementa una llamada HTTP a una API (la que tú quieras) y muestra su + * resultado a través de la terminal. Por ejemplo: Pokémon, Marvel... + * Aquí tienes un listado de posibles APIs: + * https://github.com/public-apis/public-apis +""" +# requiere instalar modulo con : pip install requests +import requests +class ISSLocationFetcher: + def __init__(self): + self.url = "https://api.wheretheiss.at/v1/satellites/25544" + self.latitude = None + self.longitude = None + self.velocity = None + + def fetch_data(self): + response = requests.get(self.url) + if response.status_code == 200: + data = response.json() + self.latitude = data["latitude"] + self.longitude = data["longitude"] + self.velocity = data["velocity"] + else: + raise Exception( + "Error HTTP. Código de estado:", response.status_code) + + def get_latitude(self): + if self.latitude is None: + self.fetch_data() + return self.latitude + + def get_longitude(self): + if self.longitude is None: + self.fetch_data() + return self.longitude + + def get_velocity(self): + if self.velocity is None: + self.fetch_data() + return self.velocity + +location_fetcher = ISSLocationFetcher() +try: + location_fetcher.fetch_data() + print("Donde esta el ISS?") + print("Latitud:", location_fetcher.get_latitude()) + print("Longitud:", location_fetcher.get_longitude()) + print("Velocity", location_fetcher.get_velocity()) +except Exception as e: + print(str(e)) \ No newline at end of file diff --git a/Retos/Reto #10 - LA API [Media]/rust/marcoatrs.rs b/Retos/Reto #10 - LA API [Media]/rust/marcoatrs.rs new file mode 100644 index 0000000000..89568c8195 --- /dev/null +++ b/Retos/Reto #10 - LA API [Media]/rust/marcoatrs.rs @@ -0,0 +1,16 @@ +use std::collections::HashMap; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let url = "https://dog.ceo/api/breeds/image/random"; + + // Realizar la solicitud GET + let response = reqwest::get(url) + .await? + .json::>() + .await?; + + println!("{:#?}", response); + + Ok(()) +} \ No newline at end of file diff --git "a/Retos/Reto #11 - URL PARAMS [F\303\241cil]/java/asjordi.java" "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/java/asjordi.java" new file mode 100644 index 0000000000..65d59a7fb9 --- /dev/null +++ "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/java/asjordi.java" @@ -0,0 +1,28 @@ +import java.util.ArrayList; +import java.util.List; + +public class UrlUtils { + + public String[] getParams(String url){ + + List params = new ArrayList<>(); + int indexQuestionMark = url.indexOf("?"); + + if (indexQuestionMark != -1) { + String parametersUrl = url.substring(indexQuestionMark + 1); + String[] pairParameters = parametersUrl.split("&"); + + for (String pairParam : pairParameters) { + String[] part = pairParam.split("="); + if (part.length == 2) { + params.add(part[1]); + } + } + + } + + return params.toArray(new String[0]); + + } + +} diff --git "a/Retos/Reto #11 - URL PARAMS [F\303\241cil]/javascript/Qv1ko.js" "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/javascript/Qv1ko.js" new file mode 100644 index 0000000000..d1fb875aee --- /dev/null +++ "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/javascript/Qv1ko.js" @@ -0,0 +1,19 @@ +getParameters("https://retosdeprogramacion.com?year=2023&challenge=0"); + +function getParameters(url) { + + let parameters = [] + const splits = url.split("&") + + if (splits.length > 1) { + for (let i = 0; i < splits.length; i++) { + if (splits[i].split("=").length == 2) { + parameters.push('"' + splits[i].split("=")[1] + '"') + } + } + console.log(parameters.toString()) + } else { + console.log("The URL has no parameters") + } + +} diff --git "a/Retos/Reto #11 - URL PARAMS [F\303\241cil]/python/ShinMugenNoKabe.py" "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/python/ShinMugenNoKabe.py" new file mode 100644 index 0000000000..76193c6ba1 --- /dev/null +++ "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/python/ShinMugenNoKabe.py" @@ -0,0 +1,14 @@ +def get_paramteres(url: str) -> list[str]: + if not "?" in url: + return [] + + query = url.split("?")[1] + params = query.split("&") + + return [param.split("=")[1] for param in params] + + +if __name__ == "__main__": + result = get_paramteres("https://retosdeprogramacion.com?year=2023&challenge=0") + assert result == ["2023", "0"] + print(result) \ No newline at end of file diff --git "a/Retos/Reto #11 - URL PARAMS [F\303\241cil]/python/alberba.py" "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/python/alberba.py" new file mode 100644 index 0000000000..e2fc78d10b --- /dev/null +++ "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/python/alberba.py" @@ -0,0 +1,9 @@ +def extract_values(url: str) -> list: + parameters = url.split("?")[1] + values = parameters.split("&") + value_list = [] + for value in values: + value_list.append(value.split("=")[1]) + return value_list + +print(extract_values("https://www.youtube.com/watch?v=EKj8qJrC0T8&ab_channel=ToroTochoReviews")) diff --git "a/Retos/Reto #11 - URL PARAMS [F\303\241cil]/python/klimyflorez.py" "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/python/klimyflorez.py" new file mode 100644 index 0000000000..1766020fd7 --- /dev/null +++ "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/python/klimyflorez.py" @@ -0,0 +1,20 @@ +# +# Dada una URL con parámetros, crea una función que obtenga sus valores. +# No se pueden usar operaciones del lenguaje que realicen esta tarea directamente. +# +# Ejemplo: En la url https://retosdeprogramacion.com?year=2023&challenge=0 +# los parámetros serían ["2023", "0"] +# + +def params(url): + text=url.split('?') + param=text[1].split('&') + parametros=[] + + for i in param: + param=i.split('=') + parametros.append(param[1]) + + print(parametros) + +params('https://retosdeprogramacion.com?year=2023&challenge=0') \ No newline at end of file diff --git "a/Retos/Reto #11 - URL PARAMS [F\303\241cil]/typescript/Qv1ko.ts" "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/typescript/Qv1ko.ts" new file mode 100644 index 0000000000..ce20fc8a72 --- /dev/null +++ "b/Retos/Reto #11 - URL PARAMS [F\303\241cil]/typescript/Qv1ko.ts" @@ -0,0 +1,21 @@ +getParameters("https://retosdeprogramacion.com?year=2023&challenge=0"); + +function getParameters(url: string) { + + let parameters: string[] = []; + const splits = url.split("?")[1].split("&"); + let keyValue: string[] = [] + + if (splits.length > 0) { + for (let i = 0; i < splits.length; i++) { + keyValue = splits[i].split("="); + if (keyValue.length === 2) { + parameters.push(`"${keyValue[1]}"`); + } + } + console.log(parameters.join(", ")); + } else { + console.log("The URL has no parameters"); + } + +} diff --git "a/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/java/asjordi.java" "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/java/asjordi.java" new file mode 100644 index 0000000000..cd3e20efbe --- /dev/null +++ "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/java/asjordi.java" @@ -0,0 +1,12 @@ +import java.time.DayOfWeek; +import java.time.LocalDate; + +public class Friday13 { + + public static boolean check(int year, int month) { + int day = 13; + LocalDate date = LocalDate.of(year, month, day); + return date.getDayOfWeek().compareTo(DayOfWeek.FRIDAY) == 0; + } + +} diff --git "a/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/javascript/Qv1ko.js" "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/javascript/Qv1ko.js" new file mode 100644 index 0000000000..1f2a49436b --- /dev/null +++ "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/javascript/Qv1ko.js" @@ -0,0 +1,5 @@ +isFridayThirteenth(3,2023) + +function isFridayThirteenth(month, year) { + return new Date(year, month - 1, 13).getDay() === 5; +} diff --git "a/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/javascript/othamae.js" "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/javascript/othamae.js" new file mode 100644 index 0000000000..e415b2491e --- /dev/null +++ "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/javascript/othamae.js" @@ -0,0 +1,15 @@ +/* + * Crea una función que sea capaz de detectar si existe un viernes 13 en el mes y el año indicados. + * - La función recibirá el mes y el año y retornará verdadero o falso. + */ + +const isFriday13th = (month, year) => { + const date = new Date(year, month - 1, 13); + return date.getDay() === 5; +} + +console.log(isFriday13th(5, 2020)); +console.log(isFriday13th(10, 2021)); +console.log(isFriday13th(5, 2022)); +console.log(isFriday13th(7, 2023)); +console.log(isFriday13th(6, 2024)); diff --git "a/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/alberba.py" "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/alberba.py" new file mode 100644 index 0000000000..926d8d9fc1 --- /dev/null +++ "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/alberba.py" @@ -0,0 +1,12 @@ +import datetime + +def viernes_13(year: int, month: int) -> bool: + try: + return datetime.date(year, month, 13).weekday() == 4 + except: + return False + +print(viernes_13(2023, 3)) +print(viernes_13(2023, 1)) +print(viernes_13(2023, 13)) +print(viernes_13(-2023, 1)) \ No newline at end of file diff --git "a/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/juanppdev.py" "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/juanppdev.py" new file mode 100644 index 0000000000..698dfb75b2 --- /dev/null +++ "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/juanppdev.py" @@ -0,0 +1,14 @@ +import datetime + +def es_viernes_13(): + mes = int(input("Ingrese el número del mes (1-12): ")) + año = int(input("Ingrese el año: ")) + + fecha = datetime.datetime(año, mes, 13) + return fecha.weekday() == 4 + +# Ejemplo de uso +if es_viernes_13(): + print("¡Hay un viernes 13 en el mes y año especificados!") +else: + print("No hay un viernes 13 en el mes y año especificados.") diff --git "a/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/klimyflorez.py" "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/klimyflorez.py" new file mode 100644 index 0000000000..a8e7d3f0c1 --- /dev/null +++ "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/klimyflorez.py" @@ -0,0 +1,15 @@ +""" + * Crea una función que sea capaz de detectar si existe un viernes 13 en el mes y el año indicados. + * - La función recibirá el mes y el año y retornará verdadero o falso. +""" +import datetime + +def friday_thirteen(year: int, month: int) -> bool: + try: + # weekday() return day of the week, where Monday == 0 ... Sunday == 6. + return datetime.date(year,month,13).weekday() == 4 + except: + return False + +print(friday_thirteen(2023,10)) +print(friday_thirteen(2024,2)) \ No newline at end of file diff --git "a/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/siltttt.py" "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/siltttt.py" new file mode 100644 index 0000000000..dd57c61f52 --- /dev/null +++ "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/siltttt.py" @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +"""012_Viernes13.ipynb + +Automatically generated by Colaboratory. + +Original file is located at + https://colab.research.google.com/drive/1YdJb2Htw90LdLOxZtqyIRukDH3iDMTWp +""" + +''' + * Crea una función que sea capaz de detectar si existe un viernes 13 en el mes y el año indicados. + * - La función recibirá el mes y el año y retornará verdadero o falso. +''' + +!pip install datetime +from datetime import date + +def viernes_13(mes, anyo): + + return date(year = anyo, month = mes, day = 13).weekday() == 4 + +while True: + try: + mes = int(input('Introduce el mes: ')) + anyo = int(input('Introduce el año: ')) + break + + except: + print('Error. Debes introducir NÚMERO de mes y año.') + +viernes_13(mes, anyo) \ No newline at end of file diff --git "a/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/tecfer.py" "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/tecfer.py" new file mode 100644 index 0000000000..9c2d8c9729 --- /dev/null +++ "b/Retos/Reto #12 - VIERNES 13 [F\303\241cil]/python/tecfer.py" @@ -0,0 +1,21 @@ +''' + Crea una función que sea capaz de detectar si existe un viernes 13 en el mes y el año indicados. + - La función recibirá el mes y el año y retornará verdadero o falso. +''' +import datetime + +def friday_13(month, year) ->bool : + try: + return datetime.date(year, month, 13).isoweekday() == 5 + except: + return False + +def main(): + + print(friday_13(6,2023)) + print(friday_13(4,2023)) + print(friday_13(10,2023)) + print(friday_13(1,2023)) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/java/asjordi.java b/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/java/asjordi.java new file mode 100644 index 0000000000..21795b1d19 --- /dev/null +++ b/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/java/asjordi.java @@ -0,0 +1,95 @@ +import java.util.List; +import java.util.Random; +import java.util.Scanner; + +public class GuessWord { + + public static void main(String[] args) { + GuessWord g = new GuessWord(1); + g.play(); + } + + private final Random r = new Random(); + private final List listOfWords = List.of("java", "javascript", "python", "csharp", "nodejs", "mysql", "git", "github"); + private final String word; + private int attempts = 3; + + public GuessWord(int attempts){ + if (attempts > 3) this.attempts = attempts; + this.word = listOfWords.get(r.nextInt(listOfWords.size())); + } + + public void play(){ + + String hideWord = hideCharacters(this.word); + boolean wordIsComplete = false; + Scanner sc = new Scanner(System.in); + + System.out.println("Welcome to the word guessing game"); + + while (!wordIsComplete) { + if (this.attempts == 0) break; + System.out.println("Remaining attempts: " + this.attempts); + System.out.println("Guess the word --> " + hideWord); + System.out.println("Enter a character or a full word!"); + String userInput = sc.nextLine(); + + if (userInput.length() > 0){ + if (userInput.equals(this.word)){ + System.out.println("You win!!\nThe word is: " + this.word); + wordIsComplete = true; + } else if (this.word.contains(userInput)){ + hideWord = searchMatches(this.word, hideWord, userInput); + if (hideWord.equals(this.word)){ + System.out.println("You win!!\nThe word is: " + this.word); + wordIsComplete = true; + break; + } + } + } + + this.attempts--; + } + + if (!wordIsComplete) System.out.println("You lost!!\nThe word is: " + this.word); + + } + + private String hideCharacters(String str){ + + List alphabet = List.of( + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", + "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" + ); + + int limitHide = (str.length() * 60) / 100; + int actualLength = 0; + + while (actualLength < limitHide){ + String letter = alphabet.get(r.nextInt(alphabet.size())); + if (str.contains(letter)) { + str = str.replace(letter, "_"); + } + actualLength = str.length() - str.replace("_", "").length(); + } + + return str; + + } + + public String searchMatches(String originalWord, String hideWord, String letter){ + + String[] originalWordArr = originalWord.split(""); + String[] hideWordArr = hideWord.split(""); + + for (int i = 0; i < originalWordArr.length; i++) { + if (originalWordArr[i].equals(letter)){ + hideWordArr[i] = letter; + } + } + + return String.join("", hideWordArr); + + } + +} diff --git a/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/javascript/othamae.js b/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/javascript/othamae.js new file mode 100644 index 0000000000..39c5a23a26 --- /dev/null +++ b/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/javascript/othamae.js @@ -0,0 +1,107 @@ +/* + * Crea un pequeño juego que consista en adivinar palabras en un número máximo de intentos: + * - El juego comienza proponiendo una palabra aleatoria incompleta + * - Por ejemplo "m_ur_d_v", y el número de intentos que le quedan + * - El usuario puede introducir únicamente una letra o una palabra (de la misma longitud que + * la palabra a adivinar) + * - Si escribe una letra y acierta, se muestra esa letra en la palabra. Si falla, se resta + * uno al número de intentos + * - Si escribe una resolución y acierta, finaliza el juego, en caso contrario, se resta uno + * al número de intentos + * - Si el contador de intentos llega a 0, el jugador pierde + * - La palabra debe ocultar de forma aleatoria letras, y nunca puede comenzar ocultando más del 60% + * - Puedes utilizar las palabras que quieras y el número de intentos que consideres + */ + +const readline = require('readline') + + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + + }) + + +const hideWord = (word) => { + let hiddenWord = word.split(''); + let num = Math.floor(word.length * 0.6) + while (num >0) { + const randomIndex = Math.floor(Math.random() * word.length) + let letter = hiddenWord[randomIndex] + if (letter !== '_') { + for(let i = 0; i < word.length; i++){ + if(word[i] === letter){ + hiddenWord[i] = '_' + } + } + } + num-- + } + return hiddenWord.join('') +} + +const wordFound = (wordToCheck, word) => { + let wordToCheckString = wordToCheck.join('') + if (wordToCheckString === word) { + console.log('You win!') + rl.close() + return true + } + return false +} + +const letterFound = (letter, word) => { + return word.includes(letter) +} +const openLetter = (userGuess, word, hiddenWord) => { + let newHiddenWord = hiddenWord.split('') + const wordArray = word.split('') + if (word.includes(userGuess[0])) { + for (let i = 0; i < word.length; i++) { + if (wordArray[i] === userGuess[0]) { + newHiddenWord[i] = userGuess[0] + } + } + } + return newHiddenWord.join('') + +} + +const guessWord = (word, attempts) => { + console.log('Try to guess the word, you have ' + attempts + ' attempts') + let hiddenWord = hideWord(word) + console.log('The word is: ' + hiddenWord) + rl.on('line', (input) => { + let userInput = input.trim() + let userGuess = userInput.split('') + if((userGuess.length > 1 && userGuess.length != word.length) || userInput=== ''){ + console.log('You must write a word or a letter') + } else if(userGuess.length === 1){ + letterFound(userGuess[0], word) ? hiddenWord = openLetter(userGuess, word, hiddenWord) : attempts-- + wordFound(hiddenWord.split(''), word) ? `Word found!! ${word}` : console.log('Try again, you have ' + attempts + ' attempts') + } + if (userGuess.length === word.length ) { + wordFound(userGuess, word) ? `Word found!! ${word}` : attempts-- + } + + if (attempts === 0) { + console.log('No more attempts, you lose 😢') + rl.close() + } else { + console.log('The word is: ' + hiddenWord) + } + + + }) + + +} + + +const playGame = (word, attempts) => { + guessWord(word, attempts) +} + + +playGame("holacaracola", 5) \ No newline at end of file diff --git a/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/python/alberba.py b/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/python/alberba.py new file mode 100644 index 0000000000..7a3a36c6b2 --- /dev/null +++ b/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/python/alberba.py @@ -0,0 +1,35 @@ +import random + +words = ["albert", "elefante"] +word = random.choice(words) +intentos = 8 + +num_hidden = int(len(word) * 0.5) +positions = random.sample(range(len(word)), num_hidden) + +game_word = "" +for i in range(len(word)): + game_word += word[i] if i not in positions else "_" + +print(game_word) + +while intentos > 0: + entrada = input("Escribe una letra o la solución: ") + if len(entrada) == 1: + success = False + if entrada in word: + for i, letter in enumerate(word): + if letter == entrada and game_word[i] == "_": + game_word = game_word[:i] + entrada + game_word[i + 1:] + success = True + print(game_word) + if not success: + print("Incorrecto") + intentos -= 1 + else: + if entrada == word: + print("Has ganado") + break + else: + print("La palabra no es correcta") + intentos -= 1 \ No newline at end of file diff --git a/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/python/klimyflorez.py b/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/python/klimyflorez.py new file mode 100644 index 0000000000..0b99f7c7bb --- /dev/null +++ b/Retos/Reto #13 - ADIVINA LA PALABRA [Media]/python/klimyflorez.py @@ -0,0 +1,101 @@ +""" + * Crea un pequeño juego que consista en adivinar palabras en un número máximo de intentos: + * - El juego comienza proponiendo una palabra aleatoria incompleta + * - Por ejemplo "m_ur_d_v", y el número de intentos que le quedan + * - El usuario puede introducir únicamente una letra o una palabra (de la misma longitud que + * la palabra a adivinar) + * - Si escribe una letra y acierta, se muestra esa letra en la palabra. Si falla, se resta + * uno al número de intentos + * - Si escribe una resolución y acierta, finaliza el juego, en caso contrario, se resta uno + * al número de intentos + * - Si el contador de intentos llega a 0, el jugador pierde + * - La palabra debe ocultar de forma aleatoria letras, y nunca puede comenzar ocultando más del 60% + * - Puedes utilizar las palabras que quieras y el número de intentos que consideres +""" +import random + +class Game: + def __init__(self, words = None, try_times=10, min_limit_hidden = 30, max_limit_hidden=60): + self.try_times = try_times + self.max_limit_hidden = max_limit_hidden + self.min_limit_hidden = min_limit_hidden + if words == None: + self.words = [ + "murcielago", + "dinosaurio", + "apocalipsis", + "universo", + "maravilloso", + "extraordinario", + "fantastico" + ] + else: + self.words = words + self.selected_word = "" + self.hidden_letters = [] + + def __hide_letters(self, word): + num_letters = len(word) + percentage_to_hidden = random.randint(self.min_limit_hidden, self.max_limit_hidden) + max_letters_to_hide = int((num_letters * percentage_to_hidden)/100) + letters_index = list(range(0, num_letters)) + + for i in range(max_letters_to_hide): + pos = random.choice(letters_index) + self.hidden_letters.append(pos) + word = list(word) + word[pos] = "_" + word = "".join(word) + letters_index.remove(pos) + self.hidden_letters.sort() + + return word + + def __select_word(self): + selected = random.choice(self.words) + self.selected_word = selected + selected = self.__hide_letters(selected) + return selected + + def play(self): + win = False + word = self.__select_word() + + print("La palabra es: " + word) + print("Números de intentos: " + str(self.try_times)) + + while not win and self.try_times > 0: + l = input("Completa la palabra: ") + if len(l) == 1: + expected_letter = self.selected_word[self.hidden_letters[0]] + if l == expected_letter: + self.hidden_letters.pop(0) + word = word.replace("_", l, 1) + if (self.hidden_letters == []): + win = True + else: + self.try_times = self.try_times - 1 + print("Números de intentos: "+str(self.try_times)) + else: + if len(l) == len(self.selected_word): + if l == self.selected_word: + word = l + win = True + else: + self.try_times = self.try_times - 1 + print("Números de intentos: "+str(self.try_times)) + else: + self.try_times = self.try_times - 1 + print("Números de intentos: "+str(self.try_times)) + + print("Intentalo nuevamente: " + word) + + if not win: + print("No acertaste, la palabra correcta es " + self.selected_word) + else: + print("Felicidades! Acertaste!") + + +if __name__ == "__main__": + game = Game() + game.play() \ No newline at end of file diff --git "a/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/java/asjordi.java" "b/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/java/asjordi.java" new file mode 100644 index 0000000000..5edb463d8b --- /dev/null +++ "b/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/java/asjordi.java" @@ -0,0 +1,56 @@ +import java.util.HashMap; +import java.util.Map; + +public class ConvertOctalAndHexadecimal { + + public int convertDecimalToOctal(int decimalNumber){ + int quotient = decimalNumber; + int remainder; + StringBuilder octalResult = new StringBuilder(); + + if (decimalNumber == 0) return 0; + + while (quotient > 0) { + remainder = quotient % 8; + octalResult.append(remainder); + quotient = quotient / 8; + } + + return Integer.parseInt(octalResult.reverse().toString()); + } + + public String convertDecimalToHexadecimal(int decimalNumber){ + Map hexMap = createHexMap(); + StringBuilder hexadecimalResult = new StringBuilder(); + + while (decimalNumber > 0) { + int remainder = decimalNumber % 16; + hexadecimalResult.append(hexMap.get(remainder)); + decimalNumber = decimalNumber / 16; + } + + return hexadecimalResult.reverse().toString(); + } + + private static Map createHexMap() { + Map hexMap = new HashMap<>(); + hexMap.put(0, '0'); + hexMap.put(1, '1'); + hexMap.put(2, '2'); + hexMap.put(3, '3'); + hexMap.put(4, '4'); + hexMap.put(5, '5'); + hexMap.put(6, '6'); + hexMap.put(7, '7'); + hexMap.put(8, '8'); + hexMap.put(9, '9'); + hexMap.put(10, 'A'); + hexMap.put(11, 'B'); + hexMap.put(12, 'C'); + hexMap.put(13, 'D'); + hexMap.put(14, 'E'); + hexMap.put(15, 'F'); + return hexMap; + } + +} diff --git "a/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/javascript/Qv1ko.js" "b/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/javascript/Qv1ko.js" new file mode 100644 index 0000000000..300762d917 --- /dev/null +++ "b/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/javascript/Qv1ko.js" @@ -0,0 +1,21 @@ +decimalConverter(21) + +function decimalConverter(decimal) { + let number = decimal + let octal = "" + let hex = "" + let hexValues = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"] + while(number > 0) { + octal = number % 8 + octal + number = Math.floor(number / 8) + } + octal = (octal === "")? "0" : octal + console.log(decimal + " in octal is " + octal) + number = decimal + while(number > 0) { + hex = hexValues[number % 16] + hex; + number = Math.floor(number / 16) + } + hex = (hex === "")? "0" : hex; + console.log(decimal + " in hex is 0x" + hex); +} diff --git "a/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/kotlin/dotero-dev.kt" "b/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/kotlin/dotero-dev.kt" new file mode 100644 index 0000000000..5d72eeec09 --- /dev/null +++ "b/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/kotlin/dotero-dev.kt" @@ -0,0 +1,39 @@ +fun main() { + val number = 15 + decimalToOctal(number) + decimalToHexadecimal(number) +} + +fun decimalToOctal(num:Int){ + var numero: Int = num + var octal = "" + var resto = 0 + while (numero > 0){ + resto = numero%8 + octal = "$resto$octal" + numero -= resto + numero /= 8 + } + println("El número en decimal $num es $octal en octal.") +} + +fun decimalToHexadecimal(num:Int){ + var numero: Int = num + var hexadecimal = "" + var resto = 0 + val valoresEnHexadecimal: List = listOf("A","B","C","D","E","F") + while (numero > 0){ + resto = numero%16 + if (resto > 9){ + resto -= 10 + val caracterHexadecimal: String = valoresEnHexadecimal.get(resto) + hexadecimal = "$caracterHexadecimal$hexadecimal" + resto += 10 + } else{ + hexadecimal = "$resto$hexadecimal" + } + numero -= resto + numero /= 16 + } + println("El número en decimal $num es $hexadecimal en hexadecimal.") +} \ No newline at end of file diff --git "a/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/python/klimyflorez.py" "b/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/python/klimyflorez.py" new file mode 100644 index 0000000000..d05d8d0a8b --- /dev/null +++ "b/Retos/Reto #14 - OCTAL Y HEXADECIMAL [F\303\241cil]/python/klimyflorez.py" @@ -0,0 +1,53 @@ +# Reto #14: Octal y Hexadecimal +#### Dificultad: Fácil | Publicación: 03/04/23 | Corrección: 10/04/23 +## Enunciado +# +# Crea una función que reciba un número decimal y lo trasforme a Octal +# y Hexadecimal. +# - No está permitido usar funciones propias del lenguaje de programación que +# realicen esas operaciones directamente. +# +class DecimalConverter: + def __init__(self): + pass + + def to_octal(self, num): + if not isinstance(num, int): + raise TypeError("El número debe ser entero.") + if num < 0: + raise ValueError("El número debe ser positivo.") + octal_num = "" + while num != 0: + octal_num = str(num % 8) + octal_num + num //= 8 + return octal_num + + def to_hexadecimal(self, num): + if not isinstance(num, int): + raise TypeError("El número debe ser entero.") + if num < 0: + raise ValueError("El número debe ser positivo.") + hex_num = "" + while num != 0: + rem = num % 16 + if rem < 10: + hex_num = str(rem) + hex_num + else: + hex_num = chr(ord('A') + rem - 10) + hex_num + num //= 16 + return hex_num + +if __name__ == '__main__': + dc = DecimalConverter() + while True: + try: + decimal_num = int(input("Ingrese un número decimal positivo: ")) + octal_num = dc.to_octal(decimal_num) + hex_num = dc.to_hexadecimal(decimal_num) + print("Octal:", octal_num) + print("Hexadecimal:", hex_num) + break + except ValueError: + print("El valor ingresado debe ser un número entero positivo.") + except Exception as e: + print(e) \ No newline at end of file diff --git "a/Retos/Reto #15 - AUREBESH [F\303\241cil]/java/asjordi.java" "b/Retos/Reto #15 - AUREBESH [F\303\241cil]/java/asjordi.java" new file mode 100644 index 0000000000..4bc833e4b3 --- /dev/null +++ "b/Retos/Reto #15 - AUREBESH [F\303\241cil]/java/asjordi.java" @@ -0,0 +1,48 @@ +import java.util.HashMap; +import java.util.Map; + +public class Aurebesh { + + public String translateToAurebesh(String sentence) { + + Map alphabetMap = createAlphabetMap(); + StringBuilder res = new StringBuilder(); + String[] arr = sentence.split(""); + + for (String s : arr) { + if (!alphabetMap.containsKey(s)) { + res.append(s); + continue; + } + res.append(alphabetMap.get(s)); + } + + return res.toString(); + + } + + public String translateFromAurebesh(String sentence) { + + Map alphabetMap = createAlphabetMap(); + + for (Map.Entry map: alphabetMap.entrySet()) { + sentence = sentence.replace(map.getValue(), map.getKey()); + } + + return sentence; + + } + + private static Map createAlphabetMap(){ + Map alphabet = new HashMap<>(); + alphabet.put("a", "aurek"); alphabet.put("b", "besh"); alphabet.put("c", "cresh"); alphabet.put("d", "dorn"); + alphabet.put("e", "esk"); alphabet.put("f", "forn"); alphabet.put("g", "grek"); alphabet.put("h", "herf"); + alphabet.put("i", "isk"); alphabet.put("j", "jenth"); alphabet.put("k", "krill"); alphabet.put("l", "leth"); + alphabet.put("m", "merm"); alphabet.put("n", "nern"); alphabet.put("o", "osk"); alphabet.put("p", "peth"); + alphabet.put("q", "qek"); alphabet.put("r", "resh"); alphabet.put("s", "senth"); alphabet.put("t", "trill"); + alphabet.put("u", "usk"); alphabet.put("v", "vev"); alphabet.put("w", "wesk"); alphabet.put("x", "xesh"); + alphabet.put("y", "yirt"); alphabet.put("z", "zerek"); + return alphabet; + } + +} diff --git "a/Retos/Reto #15 - AUREBESH [F\303\241cil]/python/klimyflorez.py" "b/Retos/Reto #15 - AUREBESH [F\303\241cil]/python/klimyflorez.py" new file mode 100644 index 0000000000..6bbb527439 --- /dev/null +++ "b/Retos/Reto #15 - AUREBESH [F\303\241cil]/python/klimyflorez.py" @@ -0,0 +1,74 @@ +""" + * Crea una función que sea capaz de transformar Español al lenguaje básico del universo + * Star Wars: el "Aurebesh". + * - Puedes dejar sin transformar los caracteres que no existan en "Aurebesh". + * - También tiene que ser capaz de traducir en sentido contrario. + * + * ¿Lo has conseguido? Nómbrame en twitter.com/mouredev y escríbeme algo en Aurebesh. + * + * ¡Que la fuerza os acompañe! +""" + +DICTIONARY_AUREBESH = { + 'a': 'aurek', + 'b': 'besh', + 'c': 'cresh', + 'd': 'dorn', + 'e': 'esk', + 'f': 'forn', + 'g': 'grek', + 'h': 'herf', + 'i': 'isk', + 'j': 'jenth', + 'k': 'krill', + 'l': 'leth', + 'm': 'mern', + 'n': 'nern', + 'o': 'osk', + 'p': 'peth', + 'q': 'qek', + 'r': 'resh', + 's': 'senth', + 't': 'trill', + 'u': 'usk', + 'v': 'vev', + 'w': 'wesk', + 'x': 'xesh', + 'y': 'yirt', + 'z': 'zerek' +} + +DOUBLE_AUREBESH = { + 'ch': 'cherek', + 'ae': 'enth', + 'eo': 'onith', + 'kh': 'krenth', + 'ng': 'nen', + 'oo': 'orenth', + 'sh': 'sen', + 'th': 'thesh' +} + + +def translateAurebesh(text): + text = text.lower() + result = "" + + idx = 0 + while (idx < len(text)): + if idx != (len(text) - 1) and (text[idx] + text[idx + 1]) in DOUBLE_AUREBESH.keys(): + result += DOUBLE_AUREBESH[text[idx] + text[idx + 1]] + idx += 1 + elif (text[idx]) in DICTIONARY_AUREBESH.keys(): + result += DICTIONARY_AUREBESH[text[idx]] + else: + result += text[idx] + + idx += 1 + + return result + + +print(translateAurebesh('Hola mundo!')) + +print(translateAurebesh('Larga vida y prosperidad.')) diff --git a/Retos/Reto #16 - LA ESCALERA [Media]/java/asjordi.java b/Retos/Reto #16 - LA ESCALERA [Media]/java/asjordi.java new file mode 100644 index 0000000000..bb0ffa615d --- /dev/null +++ b/Retos/Reto #16 - LA ESCALERA [Media]/java/asjordi.java @@ -0,0 +1,47 @@ +public class Stairs { + + public static void main(String[] args) { + + Stairs s = new Stairs(); + int num = 10; + + if (num >= 0) System.out.println(s.createFromRight(num)); + if (num < 0) System.out.println(s.createFromLeft(num)); + + } + + private final StringBuilder stair = new StringBuilder(); + private final String blankSpace = " "; + + public String createFromRight(int num){ + + if (num == 0) return "__"; + + String stairRight = "_| "; + + this.stair.append(this.blankSpace.repeat((num * 2))).append("_\n"); + + for (int i = num - 1; i >= 0; i--) { + this.stair.append(this.blankSpace.repeat((i * 2))).append(stairRight).append("\n"); + } + + return this.stair.toString(); + + } + + public String createFromLeft(int num){ + + String stairLeft = " |_"; + num = Math.abs(num); + + this.stair.append("_\n"); + + for (int i = 0; i < num; i++) { + this.stair.append(this.blankSpace.repeat((i * 2))).append(stairLeft).append("\n"); + } + + return this.stair.toString(); + + } + +} diff --git a/Retos/Reto #16 - LA ESCALERA [Media]/javascript/cesar-ch.js b/Retos/Reto #16 - LA ESCALERA [Media]/javascript/cesar-ch.js new file mode 100644 index 0000000000..4902baef2e --- /dev/null +++ b/Retos/Reto #16 - LA ESCALERA [Media]/javascript/cesar-ch.js @@ -0,0 +1,46 @@ +/* + * Crea una función que dibuje una escalera según su número de escalones. + * - Si el número es positivo, será ascendente de izquiera a derecha. + * - Si el número es negativo, será descendente de izquiera a derecha. + * - Si el número es cero, se dibujarán dos guiones bajos (__). + * + * Ejemplo: 4 + * _ + * _| + * _| + * _| + * _| + * + */ + +function Ladder(num) { + let latter = '' + if (num === 0) { + latter = '__' + } else if (num > 0) { + for (let i = 0; i < num; i++) { + if (i === 0) { + latter += ' '.repeat((num - i) * 2) + latter += '_\n' + } + latter += ' '.repeat((num - i - 1) * 2) + latter += '_' + latter += '|\n' + } + + } else { + for (let i = 0; i > num; i--) { + if (i === 0) { + latter += '_\n' + } + latter += ' '.repeat(Math.abs(i) * 2 + 1) + latter += '|' + latter += '_\n' + } + } + return latter +} + + +console.log(Ladder(7)); +console.log(Ladder(-7)); \ No newline at end of file diff --git a/Retos/Reto #16 - LA ESCALERA [Media]/python/cesar-ch.py b/Retos/Reto #16 - LA ESCALERA [Media]/python/cesar-ch.py new file mode 100644 index 0000000000..6baff2d5ae --- /dev/null +++ b/Retos/Reto #16 - LA ESCALERA [Media]/python/cesar-ch.py @@ -0,0 +1,39 @@ +""" + * Crea una función que dibuje una escalera según su número de escalones. + * - Si el número es positivo, será ascendente de izquiera a derecha. + * - Si el número es negativo, será descendente de izquiera a derecha. + * - Si el número es cero, se dibujarán dos guiones bajos (__). + * + * Ejemplo: 4 + * _ + * _| + * _| + * _| + * _| + * +""" + + +def Ladder(num): + ladder = '' + if num == 0: + ladder = '__' + elif num > 0: + for i in range(num): + if i == 0: + ladder += ' ' * (num - i) * 2 + ladder += '_\n' + ladder += ' ' * (num - i-1) * 2 + ladder += '_|\n' + else: + for i in range(abs(num)): + if i == 0: + ladder += '_\n' + ladder += ' ' * ((i) * 2 + 1) + ladder += '|_\n' + + return ladder + + +print(Ladder(7)) +print(Ladder(-7)) diff --git a/Retos/Reto #16 - LA ESCALERA [Media]/python/klimyflorez.py b/Retos/Reto #16 - LA ESCALERA [Media]/python/klimyflorez.py new file mode 100644 index 0000000000..678d85a318 --- /dev/null +++ b/Retos/Reto #16 - LA ESCALERA [Media]/python/klimyflorez.py @@ -0,0 +1,32 @@ +""" + * Crea una función que dibuje una escalera según su número de escalones. + * - Si el número es positivo, será ascendente de izquiera a derecha. + * - Si el número es negativo, será descendente de izquiera a derecha. + * - Si el número es cero, se dibujarán dos guiones bajos (__). + * + * Ejemplo: 4 + * _ + * _| + * _| + * _| + * _| + * +""" +def draw_stairs(stairs): + if stairs > 0: # upward direction + for stair in range(stairs + 1): + if stair == 0: print((" " * stairs * 2) + "_") + else: print(" " * ((stairs - stair) * 2) + "_|") + + elif stairs < 0: # downward direction + for stair in range(abs(stairs) + 1): + if stair == 0: print("_") + else: print(" " * (stair * 2 - 1) + "|_") + + elif stairs == 0: # flat + print("__") + + +draw_stairs(4) +draw_stairs(-4) +draw_stairs(0) \ No newline at end of file diff --git a/Retos/Reto #16 - LA ESCALERA [Media]/typescript/cesar-ch.ts b/Retos/Reto #16 - LA ESCALERA [Media]/typescript/cesar-ch.ts new file mode 100644 index 0000000000..2d5e77fcaf --- /dev/null +++ b/Retos/Reto #16 - LA ESCALERA [Media]/typescript/cesar-ch.ts @@ -0,0 +1,45 @@ +/* + * Crea una función que dibuje una escalera según su número de escalones. + * - Si el número es positivo, será ascendente de izquiera a derecha. + * - Si el número es negativo, será descendente de izquiera a derecha. + * - Si el número es cero, se dibujarán dos guiones bajos (__). + * + * Ejemplo: 4 + * _ + * _| + * _| + * _| + * _| + * + */ + +function Ladder2(num: number): string { + let latter: string = '' + if (num === 0) { + latter = '__' + } else if (num > 0) { + for (let i = 0; i < num; i++) { + if (i === 0) { + latter += ' '.repeat((num - i) * 2) + latter += '_\n' + } + latter += ' '.repeat((num - i - 1) * 2) + latter += '_' + latter += '|\n' + } + } else { + for (let i = 0; i > num; i--) { + if (i === 0) { + latter += '_\n' + } + latter += ' '.repeat(Math.abs(i) * 2 + 1) + latter += '|' + latter += '_\n' + } + } + return latter +} + + +console.log(Ladder2(7)); +console.log(Ladder2(-7)); \ No newline at end of file diff --git "a/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/java/asjordi.java" "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/java/asjordi.java" new file mode 100644 index 0000000000..f85f38861f --- /dev/null +++ "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/java/asjordi.java" @@ -0,0 +1,45 @@ +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +public class ReadCommits { + + public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException { + + Gson gson = new Gson(); + String url = "https://api.github.com/repos/mouredev/retos-programacion-2023/commits?per_page=10"; + HttpClient httpClient = HttpClient.newHttpClient(); + + HttpRequest getRequest = HttpRequest.newBuilder() + .uri(new URI(url)) + .GET() + .build(); + + HttpResponse getResponse = httpClient.send(getRequest, HttpResponse.BodyHandlers.ofString()); + int responseCode = getResponse.statusCode(); + + if (responseCode != 200) System.out.println("There was an error!"); + + String responseBody = getResponse.body(); + JsonArray commits = gson.fromJson(responseBody, JsonArray.class); + + for (int i = 0; i < commits.size(); i++) { + JsonObject commit = commits.get(i).getAsJsonObject(); + JsonObject commitDetails = commit.get("commit").getAsJsonObject(); + String hash = commit.get("sha").getAsString(); + String author = commitDetails.get("author").getAsJsonObject().get("name").getAsString(); + String message = commitDetails.get("message").getAsString(); + String date = commitDetails.get("author").getAsJsonObject().get("date").getAsString(); + + System.out.println("Commit " + (i + 1) + " | " + hash + " | " + author + " | " + message + " | " + date); + } + + } + +} diff --git "a/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/javascript/Lemito66.js" "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/javascript/Lemito66.js" new file mode 100644 index 0000000000..338b16f8a6 --- /dev/null +++ "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/javascript/Lemito66.js" @@ -0,0 +1,45 @@ +/* + * ¡Estoy de celebración! He publicado mi primer libro: + * "Git y GitHub desde cero" + * - Papel: mouredev.com/libro-git + * - eBook: mouredev.com/ebook-git + * + * ¿Sabías que puedes leer información de Git y GitHub desde la gran + * mayoría de lenguajes de programación? + * + * Crea un programa que lea los últimos 10 commits de este repositorio y muestre: + * - Hash + * - Autor + * - Mensaje + * - Fecha y hora + * + * Ejemplo de salida: + * Commit 1 (el más reciente) | 12345A | MoureDev | Este es un commit | 24/04/2023 21:00 + * + * Se permite utilizar librerías que nos faciliten esta tarea. + * + */ + +const getData = async (username, nameRepo, numberOfCommits) => { + const url = `https://api.github.com/repos/${username}/${nameRepo}/commits`; + const response = await fetch(url); + const data = await response.json(); + + const commits = data.slice(0, numberOfCommits).map((commit, index) => { + const { sha, commit: { author: { name, date }, message } } = commit; + const newDate = new Date(date).toLocaleString(); + return `Commit ${index + 1} | ${sha.slice(0, 7)} | ${name} | ${message} | ${newDate}`; + } + ); + return commits; + +}; + +(async () => { + const data = await getData("lemito66", "django-crud-react", 10); + + data.forEach(element => { + console.log(element); + }); + +})(); \ No newline at end of file diff --git "a/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/javascript/cesar-ch.js" "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/javascript/cesar-ch.js" new file mode 100644 index 0000000000..980e6d2caa --- /dev/null +++ "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/javascript/cesar-ch.js" @@ -0,0 +1,37 @@ +/* + * ¡Estoy de celebración! He publicado mi primer libro: + * "Git y GitHub desde cero" + * - Papel: mouredev.com/libro-git + * - eBook: mouredev.com/ebook-git + * + * ¿Sabías que puedes leer información de Git y GitHub desde la gran + * mayoría de lenguajes de programación? + * + * Crea un programa que lea los últimos 10 commits de este repositorio y muestre: + * - Hash + * - Autor + * - Mensaje + * - Fecha y hora + * + * Ejemplo de salida: + * Commit 1 (el más reciente) | 12345A | MoureDev | Este es un commit | 24/04/2023 21:00 + * + * Se permite utilizar librerías que nos faciliten esta tarea. + * + */ + + +async function CommitList() { + const url = "https://api.github.com/repos/mouredev/retos-programacion-2023/commits" + const res = await fetch(url) + const data = await res.json() + let list = '' + + for (let i = 0; i < 10; i++) { + list += `* Commit ${i + 1} | ${data[i].commit.tree.sha.slice(0, 7)} | ${data[i].commit.author.name} | ${data[i].commit.message.replace(/\n/g, ' ')} | ${new Date(data[i].commit.author.date).toLocaleString()}\n` + } + + console.log(list) +} + +CommitList() \ No newline at end of file diff --git "a/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/Lemito66.py" "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/Lemito66.py" new file mode 100644 index 0000000000..2089463847 --- /dev/null +++ "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/Lemito66.py" @@ -0,0 +1,49 @@ +''' +/* + * ¡Estoy de celebración! He publicado mi primer libro: + * "Git y GitHub desde cero" + * - Papel: mouredev.com/libro-git + * - eBook: mouredev.com/ebook-git + * + * ¿Sabías que puedes leer información de Git y GitHub desde la gran + * mayoría de lenguajes de programación? + * + * Crea un programa que lea los últimos 10 commits de este repositorio y muestre: + * - Hash + * - Autor + * - Mensaje + * - Fecha y hora + * + * Ejemplo de salida: + * Commit 1 (el más reciente) | 12345A | MoureDev | Este es un commit | 24/04/2023 21:00 + * + * Se permite utilizar librerías que nos faciliten esta tarea. + * + */ +''' + +import requests + +def show_date(date: str) -> str: + year = date[:4] + month = date[5:7] + day = date[8:10] + time = date[11:16] + + return day + "/" + month + "/" + year + " " + time + + +def get_repository(username: str, name: str, number_of_commits: int): + try: + url = f'https://api.github.com/repos/{username}/{name}/commits' + response = requests.get(url) + json_response = response.json() + + for i in range(number_of_commits): + print( + f'Commit {i+1} | {json_response[i]["sha"]} | {json_response[i]["commit"]["author"]["name"]} | {json_response[i]["commit"]["message"]} | {show_date(json_response[i]["commit"]["author"]["date"])}') + except: + print('An exception occurred') + + +get_repository('lemito66', 'django-crud-react',10) diff --git "a/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/cesar-ch.py" "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/cesar-ch.py" new file mode 100644 index 0000000000..1bd0eda0e5 --- /dev/null +++ "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/cesar-ch.py" @@ -0,0 +1,39 @@ +""" + * ¡Estoy de celebración! He publicado mi primer libro: + * "Git y GitHub desde cero" + * - Papel: mouredev.com/libro-git + * - eBook: mouredev.com/ebook-git + * + * ¿Sabías que puedes leer información de Git y GitHub desde la gran + * mayoría de lenguajes de programación? + * + * Crea un programa que lea los últimos 10 commits de este repositorio y muestre: + * - Hash + * - Autor + * - Mensaje + * - Fecha y hora + * + * Ejemplo de salida: + * Commit 1 (el más reciente) | 12345A | MoureDev | Este es un commit | 24/04/2023 21:00 + * + * Se permite utilizar librerías que nos faciliten esta tarea. + * +""" + +import requests + + +def commit_list(): + url = "https://api.github.com/repos/mouredev/retos-programacion-2023/commits" + res = requests.get(url) + data = res.json() + commit_list = '' + + for i in range(10): + commit_list += "* Commit {} | {} | {} | {} | {}\n".format( + i + 1, data[i]['sha'][:7], data[i]['commit']['author']['name'], data[i]['commit']['message'].replace('\n', ' '), data[i]['commit']['author']['date']) + + print(commit_list) + + +commit_list() diff --git "a/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/jaicarra.py" "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/jaicarra.py" new file mode 100644 index 0000000000..af073615df --- /dev/null +++ "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/jaicarra.py" @@ -0,0 +1,57 @@ + +# * ¿Sabías que puedes leer información de Git y GitHub desde la gran +# * mayoría de lenguajes de programación? +# * +# * Crea un programa que lea los últimos 10 commits de este repositorio y muestre: +# * - Hash +# * - Autor +# * - Mensaje +# * - Fecha y hora +# * +# * Ejemplo de salida: +# * Commit 1 (el más reciente) | 12345A | MoureDev | Este es un commit | 24/04/2023 21: 00 +# * +# * Se permite utilizar librerías que nos faciliten esta tarea. +# * +# */ + +import requests + +from token_logic import url, headers +# url = "https://api.github.com/repos/mouredev/retos-programacion-2023/commits" +# headers = { +# 'Accept': 'application/vnd.github+json', +# 'Authorization': 'Bearer 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', +# 'X-GitHub-Api-Version': '2022-11-28' +# } + +response = requests.get(url,headers=headers) +data = response.json() +print +# print(help(json.dumps)) + +counter= 0 +for commit in data[:10]: + counter += 1 + Hash = commit["sha"] + Autor = commit['commit']['author']['name'] + Mensaje = commit["commit"]["message"] + C_Mensaje = Mensaje.replace("\n"," ") + Fecha_y_hora = commit["commit"]["author"]["date"] + + # * Ejemplo de salida: +# * Commit 1 (el más reciente) | 12345A | MoureDev | Este es un commit | 24/04/2023 21: 00 + # print(Hash,Autor,C_Mensaje,Fecha_y_hora) + print("Commit" ,counter, " mas recientes", Fecha_y_hora, Hash, Autor,C_Mensaje,) + + + + + + + + + + + + \ No newline at end of file diff --git "a/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/javierfiestasbotella.py" "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/javierfiestasbotella.py" new file mode 100644 index 0000000000..c03526fa3c --- /dev/null +++ "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/javierfiestasbotella.py" @@ -0,0 +1,31 @@ +'''/* + * ¡Estoy de celebración! He publicado mi primer libro: + * "Git y GitHub desde cero" + * - Papel: mouredev.com/libro-git + * - eBook: mouredev.com/ebook-git + * + * ¿Sabías que puedes leer información de Git y GitHub desde la gran + * mayoría de lenguajes de programación? + * + * Crea un programa que lea los últimos 10 commits de este repositorio y muestre: + * - Hash + * - Autor + * - Mensaje + * - Fecha y hora + * + * Ejemplo de salida: + * Commit 1 (el más reciente) | 12345A | MoureDev | Este es un commit | 24/04/2023 21:00 + * + * Se permite utilizar librerías que nos faciliten esta tarea. + * + */''' + +import git + +ruta_repositorio = 'retos_mourodev\\retos-programacion-2023' +repo = git.Repo(ruta_repositorio) +commits = list(repo.iter_commits())[:10][::-1] +for idx, commit in enumerate(commits, 1): + mensaje = commit.message.splitlines()[0] + print(f'Commit {idx}| {commit.hexsha} | {commit.author.name} | {mensaje} | {commit.authored_datetime}') + diff --git "a/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/klimyflorez.py" "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/klimyflorez.py" new file mode 100644 index 0000000000..e6ee705904 --- /dev/null +++ "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/python/klimyflorez.py" @@ -0,0 +1,81 @@ +# Reto #17: Git y GitHub +#### Dificultad: Difícil | Publicación: 24/04/23 | Corrección: 01/05/23 +## Enunciado +# +# ¡Estoy de celebración! He publicado mi primer libro: +# "Git y GitHub desde cero" +# - Papel: mouredev.com/libro-git +# - eBook: mouredev.com/ebook-git +# +# ¿Sabías que puedes leer información de Git y GitHub desde la gran +# mayoría de lenguajes de programación? +# +# Crea un programa que lea los últimos 10 commits de este repositorio y muestre: +# - Hash +# - Autor +# - Mensaje +# - Fecha y hora +# +# Ejemplo de salida: +# Commit 1 (el más reciente) | 12345A | MoureDev | Este es un commit | 24/04/2023 21:00 +# +# Se permite utilizar librerías que nos faciliten esta tarea. +# +import requests + + +from typing import Generator + + +def get_repo_commits(repo: str) -> str: + return f"https://api.github.com/repos/{repo}/commits" + + +def all_commits(repo_url: str) -> list[dict]: + try: + return requests.get(repo_url).json() + except requests.exceptions.RequestException as err: + print(err) + + +def format_commits(commits: list[dict]) -> Generator: + return (f"commit #{str(i+1)} | hash={str(commit['sha'])} | Author={commit['commit']['author']['name']} | Message={commit['commit']['message']} | Date={commit['commit']['author']['date']}" for i, commit in enumerate(commits)) + + +def commits_to_show(number: int = 10) -> int: + try: + return abs(int(number)) + except ValueError: + print(ValueError( + f"Invalid value for 'number': '{number}'. Please enter a valid integer.")) + + +def generate_commits(commits: Generator, number: int = 10, mode="DESC") -> list[str]: + mode = mode.upper() + commit_mode: tuple[str, str] = ("ASC", "DESC") + + try: + if mode not in commit_mode: + raise ValueError(f"PLace a valide mode: {commit_mode}") + except ValueError as err: + print(err) + + if mode == commit_mode[0]: + return [commit for commit in commits][:number] + + return [commit for commit in commits][-number:] + + +def main() -> None: + repo_to_use = get_repo_commits(repo="mouredev/retos-programacion-2023") + available_commits = all_commits(repo_url=repo_to_use) + formatted_commits = format_commits(commits=available_commits) + commits_number_to_show = commits_to_show(number="5") + + commits = generate_commits( + formatted_commits, commits_number_to_show, mode="asc") + print(commits) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git "a/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/typescript/cesar-ch.ts" "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/typescript/cesar-ch.ts" new file mode 100644 index 0000000000..04136655f3 --- /dev/null +++ "b/Retos/Reto #17 - GIT Y GITHUB [Dif\303\255cil]/typescript/cesar-ch.ts" @@ -0,0 +1,37 @@ +/* + * ¡Estoy de celebración! He publicado mi primer libro: + * "Git y GitHub desde cero" + * - Papel: mouredev.com/libro-git + * - eBook: mouredev.com/ebook-git + * + * ¿Sabías que puedes leer información de Git y GitHub desde la gran + * mayoría de lenguajes de programación? + * + * Crea un programa que lea los últimos 10 commits de este repositorio y muestre: + * - Hash + * - Autor + * - Mensaje + * - Fecha y hora + * + * Ejemplo de salida: + * Commit 1 (el más reciente) | 12345A | MoureDev | Este es un commit | 24/04/2023 21:00 + * + * Se permite utilizar librerías que nos faciliten esta tarea. + * + */ + + +async function CommitList2(): Promise { + const url: string = "https://api.github.com/repos/mouredev/retos-programacion-2023/commits" + const res = await fetch(url) + const data = await res.json() + let list: string = '' + + for (let i = 0; i < 10; i++) { + list += `* Commit ${i + 1} | ${data[i].commit.tree.sha.slice(0, 7)} | ${data[i].commit.author.name} | ${data[i].commit.message.replace(/\n/g, ' ')} | ${new Date(data[i].commit.author.date).toLocaleString()}\n` + } + + console.log(list) +} + +CommitList2() diff --git "a/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/javascript/cesar-ch.js" "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/javascript/cesar-ch.js" new file mode 100644 index 0000000000..6039025c1c --- /dev/null +++ "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/javascript/cesar-ch.js" @@ -0,0 +1,35 @@ +/* + * El día 128 del año celebramos en la comunidad el "Hola Mundo day" + * Vamos a hacer "web scraping" sobre su sitio web: https://holamundo.day + * + * Crea un programa que se conecte a la web del evento e imprima únicamente la agenda de eventos + * del día 8. Mostrando hora e información de cada uno. + * Ejemplo: "16:00 | Bienvenida" + * + * Se permite utilizar librerías que nos faciliten esta tarea. + * + */ + +import puppeteer from "puppeteer"; + +async function webScraping() { + const browser = await puppeteer.launch({ + headless: false, + slowMo: 400 + }); + const page = await browser.newPage(); + await page.goto("https://holamundo.day"); + const result = await page.evaluate(() => { + const blockquotes = document.querySelectorAll("blockquote"); + const data = [...blockquotes].slice(21,).map(blockquote => { + const time = blockquote.innerText + return time + + }) + return data + }) + console.log(result.join('\n')) + await browser.close() +} + +webScraping() \ No newline at end of file diff --git "a/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/Lemito66.py" "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/Lemito66.py" new file mode 100644 index 0000000000..3a74c04ee8 --- /dev/null +++ "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/Lemito66.py" @@ -0,0 +1,20 @@ +""" +* El día 128 del año celebramos en la comunidad el "Hola Mundo day" + * Vamos a hacer "web scraping" sobre su sitio web: https://holamundo.day + * + * Crea un programa que se conecte a la web del evento e imprima únicamente la agenda de eventos + * del día 8. Mostrando hora e información de cada uno. + * Ejemplo: "16:00 | Bienvenida" + * + * Se permite utilizar librerías que nos faciliten esta tarea. + * +""" + +from bs4 import BeautifulSoup +import requests + +blockquotes = BeautifulSoup(requests.get( + "https://holamundo.day").content).find_all("blockquote") + +for blockquote in blockquotes[21:]: + print(blockquote.text) diff --git "a/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/ShinMugenNoKabe.py" "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/ShinMugenNoKabe.py" new file mode 100644 index 0000000000..ddd498c3fa --- /dev/null +++ "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/ShinMugenNoKabe.py" @@ -0,0 +1,11 @@ +from bs4 import BeautifulSoup +import requests + +request = requests.get("https://holamundo.day/") +scrap = BeautifulSoup(request.content, "html.parser") + + +blockquotes = scrap.find_all("blockquote", attrs={"class", "BlockquoteElement___StyledBlockquote-sc-1dtx4ci-0 slate-BlockquoteElement notion-quote unset-width"}) + +for block in blockquotes[21:]: + print(block.text) \ No newline at end of file diff --git "a/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/fedecoronado.py" "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/fedecoronado.py" new file mode 100644 index 0000000000..e1aad85d83 --- /dev/null +++ "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/fedecoronado.py" @@ -0,0 +1,49 @@ +'''/* + * El día 128 del año celebramos en la comunidad el "Hola Mundo day" + * Vamos a hacer "web scraping" sobre su sitio web: https://holamundo.day + * + * Crea un programa que se conecte a la web del evento e imprima únicamente la agenda de eventos + * del día 8. Mostrando hora e información de cada uno. + * Ejemplo: "16:00 | Bienvenida" + * + * Se permite utilizar librerías que nos faciliten esta tarea. + * + */''' + +from selenium import webdriver +from selenium.webdriver.chrome.service import Service +from webdriver_manager.chrome import ChromeDriverManager # sirve para actualizar el driver +from selenium.webdriver.common.by import By +import os +import pandas as pd +import time + +url ="https://holamundo.day/" + +try: + driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) +except: +#forma tradicional + try: + driver_service = Service(executable_path=driver_path) + driver = webdriver.Chrome(service=driver_service) + except: + print("el controlador del Chrome está edsactualizado, descargue") + print(" la versión Latest stable release:, de https://chromedriver.chromium.org/home") + time.sleep(30) + quit() +driver.get(url) +time.sleep(10) +driver.maximize_window() +articulo = driver.find_element(By.XPATH, '//*[@id="section-37c93060-be70-11ed-a6a0-03f7635e8df3"]/div[2]/div/article') +lineas = articulo.text.split("\n") +dia = 0 +for linea in lineas: + if dia == 8: + print(linea) + if "Despedida" in linea: + dia = 9 + if "Agenda 8 de mayo" in linea: + dia = 8 +driver.quit() + \ No newline at end of file diff --git "a/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/klimyflorez.py" "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/klimyflorez.py" new file mode 100644 index 0000000000..b095c2d968 --- /dev/null +++ "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/klimyflorez.py" @@ -0,0 +1,31 @@ +"""/* + * El día 128 del año celebramos en la comunidad el "Hola Mundo day" + * Vamos a hacer "web scraping" sobre su sitio web: https://holamundo.day + * + * Crea un programa que se conecte a la web del evento e imprima únicamente la agenda de eventos + * del día 8. Mostrando hora e información de cada uno. + * Ejemplo: "16:00 | Bienvenida" + * + * Se permite utilizar librerías que nos faciliten esta tarea. + * + */ +""" + +import requests +from bs4 import BeautifulSoup + +def Titulo(tag): + return tag.name=="h1" and "Agenda 8 de mayo" in tag.text + +def Agenda(url): + response = requests.get(url) + html = response.text + soup = BeautifulSoup(html, 'html.parser') + + Fecha = soup.find(Titulo) + Horario = Fecha.find_all_next("blockquote", {"class": "BlockquoteElement___StyledBlockquote-sc-1dtx4ci-0 slate-BlockquoteElement notion-quote unset-width"}) + for Hora in Horario: + print(Hora.get_text()) + +url="https://holamundo.day/" +Agenda(url) \ No newline at end of file diff --git "a/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/tecfer.py" "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/tecfer.py" new file mode 100644 index 0000000000..d1998e58e2 --- /dev/null +++ "b/Retos/Reto #18 - WEB SCRAPING [Dif\303\255cil]/python/tecfer.py" @@ -0,0 +1,22 @@ +''' +El día 128 del año celebramos en la comunidad el "Hola Mundo day" +Vamos a hacer "web scraping" sobre su sitio web: https://holamundo.day + +Crea un programa que se conecte a la web del evento e imprima únicamente la agenda de eventos +del día 8. Mostrando hora e información de cada uno. +Ejemplo: "16:00 | Bienvenida" + +Se permite utilizar librerías que nos faciliten esta tarea. +''' +#pip install beautifulsoup4 +#pip install lxml + +import requests +from bs4 import BeautifulSoup + +soup = BeautifulSoup(requests.get('https://holamundo.day/').content, 'lxml') + +elementos = soup.find_all('blockquote') +for elemento in elementos[21:]: + print(elemento.get_text()) + diff --git "a/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/java/Cflorezp.java" "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/java/Cflorezp.java" new file mode 100644 index 0000000000..03713b65cf --- /dev/null +++ "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/java/Cflorezp.java" @@ -0,0 +1,63 @@ +package reto19AnalisisTexto; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Scanner; +import java.util.stream.Collectors; + +/* + * Crea un programa que analice texto y obtenga: + * - Número total de palabras. + * - Longitud media de las palabras. + * - Número de oraciones del texto (cada vez que aparecen un punto). + * - Encuentre la palabra más larga. + * + * Todo esto utilizando un único bucle. + */ +public class Cflorezp { + + public static void main(String[] args) { + + String sentence = ""; + + System.out.println("Por favor ingrese sus frases, ¡¡No olvide finalizar cada frase con punto!!"); + Scanner in = new Scanner(System.in); + sentence = in.nextLine(); + + sentence = sentence.concat(" "); + + int words = 0; + int numOfLetters = 0; + int numOfSentences = 0; + int tamanio = 0; + String largeWord = ""; + List word = new ArrayList<>(); + + for(int i = 0; i < sentence.length(); i++){ + if(sentence.charAt(i) == ' '){ + words++; + if(word.size() > tamanio){ + largeWord = word.stream().map(Objects::toString).collect(Collectors.joining()); + tamanio = word.size(); + } + word.clear(); + } + if(sentence.charAt(i) != ' ' && sentence.charAt(i) != '.'){ + numOfLetters++; + word.add(sentence.charAt(i)); + } + if(sentence.charAt(i) == '.'){ + numOfSentences++; + } + } + + System.out.println("Hay un total de " + words + " palabras."); + System.out.println("La longitud media de las palabras es de " + numOfLetters / words + " letras."); + System.out.println("Hay un total de " + numOfSentences + " oraciones."); + System.out.println("la palabra mas larga es: " + largeWord); + + in.close(); + + } +} diff --git "a/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/java/asjordi.java" "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/java/asjordi.java" new file mode 100644 index 0000000000..10163e6a6c --- /dev/null +++ "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/java/asjordi.java" @@ -0,0 +1,30 @@ +public class TextParser { + + public void parse(String text){ + + text = text.replace("\n", " "); + String[] textArray = text.split(" "); + int numOfWords = 0; + double meanWordsLength = 0; + int numOfSentences = 0; + String longestWord = ""; + + for (String word : textArray) { + if (word.length() != 0) { + numOfWords++; + meanWordsLength += word.length(); + if (word.contains(".")) numOfSentences++; + if (longestWord.length() < word.length()) longestWord = word; + } + } + + meanWordsLength /= numOfWords; + + System.out.println("Number of words: " + numOfWords); + System.out.println("Mean: " + meanWordsLength); + System.out.println("Number of sentences: " + numOfSentences); + System.out.println("Longest word: " + longestWord); + + } + +} diff --git "a/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/javascript/LilyMilano.js" "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/javascript/LilyMilano.js" new file mode 100644 index 0000000000..50207a5806 --- /dev/null +++ "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/javascript/LilyMilano.js" @@ -0,0 +1,39 @@ +const text = `It is a truth universally acknowledged that a single man in possession of a good fortune, must be in want of a wife.`; + +let wordCount = 0; +let totalChars = 0; +let sentenceCount = 0; +let longestWord = ''; + +for (let i = 0; i < text.length; i++) { + if (text[i] === ' ') { + wordCount++; + } else if (text[i] === '.') { + sentenceCount++; + } else { + if (text[i - 1] === ' ' || i === 0) { + let word = ''; + + while (i < text.length && text[i] !== ' ' && text[i] !== '.') { + word += text[i]; + i++; + } + i--; + + totalChars += word.length; + + if (word.length > longestWord.length) { + longestWord = word; + } + } + } +} + +wordCount++; + +const avgWordLength = totalChars / wordCount; + +console.log(`Total words: ${wordCount}`); // Total words: 23 +console.log(`Average word length: ${avgWordLength}`); // Average word length: 4.043478260869565 +console.log(`Total sentences: ${sentenceCount}`); // Total sentences: 1 +console.log(`Longest word: ${longestWord}`); // Longest word: acknowledged diff --git "a/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/javascript/LucasSantillan.js" "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/javascript/LucasSantillan.js" new file mode 100644 index 0000000000..3067bf2b9d --- /dev/null +++ "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/javascript/LucasSantillan.js" @@ -0,0 +1,44 @@ +/* +Crea un programa que analice texto y obtenga: +- Número total de palabras. +- Longitud media de las palabras. +- Número de oraciones del texto (cada vez que aparecen un punto). +- Encuentre la palabra más larga. + Todo esto utilizando un único bucle. + + Texto extraido del cuento "El jorobadito" de Roberto Arlt +*/ +"use strict" + +const texto = `Los diversos y exagerados rumores desparramados con motivo de la conducta que observé en compañía de Rigoletto, el jorobadito, en la casa de la señora X, apartaron en su tiempo a mucha gente de mi lado. +Sin embargo, mis singularidades no me acarrearon mayores desventuras, de no perfeccionarlas estrangulando a Rigoletto. +Retorcerle el pescuezo al jorobadito ha sido de mi parte un acto más ruinoso e imprudente para mis intereses, que atentar contra la existencia de un benefactor de la humanidad.`; + +function analicisTexto(texto) { + let numOraciones = 0; + let acumPromedioPalabras = 0; + let palabraMasLarga = ''; + let textoFomateando = ''; + let textoOraciones = []; + let textoPalabras = []; + + textoOraciones = texto.split('.'); + numOraciones = textoOraciones.length - 1; + + textoFomateando = texto.replaceAll('\n', ' '); + textoFomateando = textoFomateando.replaceAll(/[^0-zÀ-ÿ\ ]+/g, ''); + textoPalabras = textoFomateando.split(' '); + + textoPalabras.forEach(palabra => { + palabraMasLarga = palabra.length > palabraMasLarga.length ? palabra : palabraMasLarga; + acumPromedioPalabras += palabra.length; + }); + + console.log(`Número total de palabras: ${textoPalabras.length}`); + console.log(`Longitud media de las palabras: ${acumPromedioPalabras / textoPalabras.length}`); + console.log(`Número de oraciones: ${numOraciones}`); + console.log(`La palabra más larga es: "${palabraMasLarga}"`); + +} + +analicisTexto(texto); diff --git "a/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/javascript/cesar-ch.js" "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/javascript/cesar-ch.js" new file mode 100644 index 0000000000..16548ca137 --- /dev/null +++ "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/javascript/cesar-ch.js" @@ -0,0 +1,53 @@ +/* + * Crea un programa que analice texto y obtenga: + * - Número total de palabras. + * - Longitud media de las palabras. + * - Número de oraciones del texto (cada vez que aparecen un punto). + * - Encuentre la palabra más larga. + * + * Todo esto utilizando un único bucle. + */ + +function analizeText(text) { + let totalWords = 0 + let averageWordLength = 0 + let totalSentences = 0 + let longestWord = '' + + text.replaceAll(/\(|\)|\[|\]|\n/g,'').split(' ').map(word => { + if (word.includes('.')) { + totalSentences++ + } + + return word.split('.').map(w => { + console.log(w) + if(w.match(/^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s*[a-zA-ZÀ-ÿ\u00f1\u00d1]*)*[a-zA-ZÀ-ÿ\u00f1\u00d1]+$|[y]/g) && w.length > 0){ + console.log(w) + console.log(w.match(/^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s*[a-zA-ZÀ-ÿ\u00f1\u00d1]*)*[a-zA-ZÀ-ÿ\u00f1\u00d1]+$|[y]/g).join('')) + totalWords++ + averageWordLength += w.length + if (w.length > longestWord.length) { + longestWord = w + } + } + }) + + }) + averageWordLength /= totalWords + + return { + totalWords: totalWords, + averageWordLength: averageWordLength, + totalSentences: totalSentences, + longestWord: longestWord + } +} + + +console.log(analizeText(`Crea un programa que analice texto y obtenga : +- Número total de palabras. +- Longitud media de las palabras. +- Número de oraciones del texto (cada vez que aparecen un punto). +- Encuentre la palabra más larga. + +Todo esto utilizando un único bucle.`)) \ No newline at end of file diff --git "a/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/python/klimyflorez.py" "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/python/klimyflorez.py" new file mode 100644 index 0000000000..0c0f0bf4eb --- /dev/null +++ "b/Retos/Reto #19 - AN\303\201LISIS DE TEXTO [Media]/python/klimyflorez.py" @@ -0,0 +1,38 @@ +''' +/* + * Crea un programa que analice texto y obtenga: + * - Número total de palabras. + * - Longitud media de las palabras. + * - Número de oraciones del texto (cada vez que aparecen un punto). + * - Encuentre la palabra más larga. + * + * Todo esto utilizando un único bucle. + */ +''' + +class CheckTexto: + def __init__(self, texto): + self.texto = texto + self.palabras = texto.split() + self.num_palabras = len(self.palabras) + self.longitud_total = sum(len(palabra) for palabra in self.palabras) + self.num_oraciones = texto.count('.') + self.palabra_mas_larga = max(self.palabras, key=len) + + def longitud_media(self): + return self.longitud_total / self.num_palabras + + def __str__(self): + return f"Número total de palabras: {self.num_palabras}\n" \ + f"Longitud media de las palabras: {self.longitud_media()}\n" \ + f"Número de oraciones del texto: {self.num_oraciones}\n" \ + f"Palabra más larga: {self.palabra_mas_larga}" + +texto = """La nave estelar USS Enterprise está bajo un gran reacondicionamiento y su excomandante, James T. Kirk, ha sido ascendido a Almirante y ahora es Jefe de Operaciones +de la Flota Estelar. Una poderosa fuerza alienígena, en forma de una masiva nube de energía con una longitud de 82 unidades astronómicas, es detectada en espacio Klingon y +parece dirigirse rumbo a la Tierra. A su paso, la nube destruye tres naves Klingons y la estación espacial de la flota Epsilon 9. Como única nave en rango del alcance, +la flota envía la Enterprise para interceptar la nube, acelerando su reacondicionamiento, el cual deberá ser probado en el transcurso de la misión asignada. +El Almirante Kirk toma el mando de la nave, lo cual disgusta al capitán Willard Decker, quien ha supervisado las mejoras como nuevo oficial. Con varios de los exmiembros +de la tripulación a bordo, la Enterprise inicia su viaje.""" +palabra = CheckTexto(texto) +print(palabra) \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/c#/iggict.cs b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/c#/iggict.cs new file mode 100644 index 0000000000..3511791362 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/c#/iggict.cs @@ -0,0 +1,48 @@ + +using System.Collections.Generic; +using System; + +const string P1 = "P1"; +const string P2 = "P2"; + +Dictionary tennisDict = new() +{ + { 0, "Love"}, + { 1, "15"}, + { 2, "30"}, + { 3, "40"} +}; + +do +{ + string result; + + int player1 = 0; + int player2 = 0; + + Console.Write("\nIntroduce la secuencia de puntos del juego (P1,P2,P1,etc.):"); + string points = Console.ReadLine() ?? ""; + + var pointsArray = points.Split(','); + + foreach (var point in pointsArray) + { + if (point.Trim().ToUpper().Equals(P1)) + player1++; + else if (point.Trim().ToUpper().Equals(P2)) + player2++; + + result = player1 == player2 && player1 >= 3 ? "Deuce" : + player1 > 3 && player1-player2 == 1 ? "Ventaja P1" : + player1 > 3 && player1-player2 > 1 ? "Ha ganado el P1" : + player2 > 3 && player2-player1 == 1 ? "Ventaja P2" : + player2 > 3 && player2-player1 > 1 ? "Ha ganado el P2" : + $"{tennisDict[player1]} - {tennisDict[player2]}"; + + Console.WriteLine(result); + + if (result.StartsWith("Ha ganado")) + break; + } + +} while (true); diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/c++/6d61726b.cpp b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/c++/6d61726b.cpp new file mode 100644 index 0000000000..b49d5a7f11 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/c++/6d61726b.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include + +using namespace std; + +int main() +{ + map PUNTOS = { + {0, "Love"}, + {1, "15"}, + {2, "30"}, + {3, "40"} + }; + + string texto = "P1 P1 P2 P2 P1 P2 P1 P1"; + istringstream iss(texto); + vector listaJugadores; + string palabra; + + while (getline(iss, palabra, ' ')) { + listaJugadores.push_back(palabra); + } + + int puntosJugador1 = 0; + int puntosJugador2 = 0; + + for (auto jugador : listaJugadores) + { + if (puntosJugador1 == 4) + { + cout << "Deuce" << "\nVentaja P1" << "\nHa ganado el P1\n"; + break; + } + else if (puntosJugador2 == 4) + { + cout << "Deuce" << "\nVentaja P2" << "\nHa ganado el P2\n"; + break; + } + + if (jugador == "P1") + { + cout << PUNTOS[puntosJugador1] << " - " << PUNTOS[puntosJugador2]; + puntosJugador1++; + } + else if (jugador == "P2") + { + cout << PUNTOS[puntosJugador1] << " - " << PUNTOS[puntosJugador2]; + puntosJugador2++; + } + + cout << endl; + } + + return 0; +} \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/c++/pyramsd.cpp b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/c++/pyramsd.cpp new file mode 100644 index 0000000000..560a3df1f6 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/c++/pyramsd.cpp @@ -0,0 +1,31 @@ +#include +#include +using namespace std; + +void finalMatch(const vector& lista); + +int main(){ + vector lista {"P1", "P1", "P2", "P2", "P1", "P2", "P1", "P1"}; + finalMatch(lista); +} + +vector scores {"love", "15", "30", "40"}; + +void finalMatch(const vector& lista){ + int p1 = 0, p2 = 0; + + for (string p : lista){ + if (p == "P1") p1 += 1; + else if (p == "P2") p2 += 1; + + if (p1 == 3 && p2 == 3) cout << "Deuce" << endl; + else if (p1 >= 4 || p2 >= 4){ + int diff = p1 - p2; + if (diff == 0) cout << "Deuce" << endl; + else if (diff == 1) cout << "Ventaja P1" << endl; + else if (diff == -1) cout << "Ventaja P2" << endl; + else if (diff >= 2) cout << "Ha ganado el P1" << endl; + else cout << "Ha ganado P2"; + }else cout << scores[p1] << "-" << scores[p2] << endl; + } +} diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/java/asjordi.java b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/java/asjordi.java new file mode 100644 index 0000000000..e652e52043 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/java/asjordi.java @@ -0,0 +1,59 @@ +import java.util.ArrayList; +import java.util.Arrays; + +public class asjordi { + + enum Player { + P1, + P2 + } + + public void generateScore(ArrayList points) { + ArrayList game = new ArrayList<>(Arrays.asList("Love", "15", "30", "40")); + int playerOnePoints = 0; + int playerTwoPoints = 0; + boolean isFinished = false; + boolean error = false; + + + for (Player point : points) { + + error = isFinished; + playerOnePoints += point == Player.P1 ? 1 : 0; + playerTwoPoints += point == Player.P2 ? 1 : 0; + + if (playerOnePoints >= 3 && playerTwoPoints >= 3) { + if (!isFinished && Math.abs(playerOnePoints - playerTwoPoints) <= 1){ + if (playerOnePoints == playerTwoPoints) { + System.out.println("Deuce"); + } else { + if (playerOnePoints > playerTwoPoints) { + System.out.println("Ventaja " + Player.P1); + } else { + System.out.println("Ventaja " + Player.P2); + } + } + } else { + isFinished = true; + } + } else { + if (playerOnePoints < 4 || playerTwoPoints < 4) { + System.out.println(game.get(playerOnePoints) + " - " + game.get(playerTwoPoints)); + } else { + isFinished = true; + } + + } + } + + if (error) { + System.out.println("There was an error in the game!"); + } else { + if (playerOnePoints > playerTwoPoints) { + System.out.println(Player.P1 + " has won"); + } else { + System.out.println(Player.P2 + " has won"); + } + } + } +} diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/java/bramenn.java b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/java/bramenn.java new file mode 100644 index 0000000000..95b3abb5dc --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/java/bramenn.java @@ -0,0 +1,156 @@ + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +class Bramenn { + + public static void main(String[] args) { + + List tennisSets = Arrays.asList("P1", "P1", "P2", "P2", "P1", "P2", "P1", "P1"); + // List tennisSets = Arrays.asList("P1", "P2", "P2", "P2", "P1", "P2", "P1", "P1"); + // List tennisSets = Arrays.asList("P1", "P2", "P2", "P2", "P1", "P2", "P1", "P2"); + + Player player_1 = new Player("P1"); + Player player_2 = new Player("P2"); + + TennisMatch theGame = new TennisMatch(player_1, player_2, tennisSets); + + theGame.runGame(); + } + +} + +class Player { + + private String name; + private int score; + + public Player(String name) { + this.name = name; + this.score = 0; + } + + public String getName() { + return name; + } + + public int getScore() { + return score; + } + + public void setScore(int score) { + this.score += score; + } + +} + +class TennisMatch { + + private Player player_1; + private Player player_2; + private Player winner; + private List tennisSets; + + static HashMap tennisPoints; + static { + tennisPoints = new HashMap<>(); + tennisPoints.put(0, "Love"); + tennisPoints.put(1, "15"); + tennisPoints.put(2, "30"); + tennisPoints.put(3, "40"); + }; + + public TennisMatch(Player player_1, Player player_2, List tennisSets) { + this.player_1 = player_1; + this.player_2 = player_2; + this.tennisSets = tennisSets; + } + + public Player getPlayer_1() { + return player_1; + } + + public Player getPlayer_2() { + return player_2; + } + + public Player getWinner() { + return winner; + } + + public void setWinner(Player winner) { + this.winner = winner; + } + + public void runGame() { + this.tennisNarrator(); + + } + + public void tennisNarrator() { + + String advantageText = "Ventaja %s"; + String scoreText = "%s - %s"; + + for (int tennisSet = 0; tennisSet < this.tennisSets.size(); tennisSet++) { + + Player player = this.getPlayerByName(this.tennisSets.get(tennisSet)); + + String text = ""; + + player.setScore(1); + + switch (tennisSet) { + case 5: + case 6: + player = this.getPlayerWithHighestScore(); + + if (player == null) { + text = "Deuce"; + } else { + text = String.format(advantageText, player.getName()); + } + + break; + + case 7: + this.setWinner(this.getPlayerWithHighestScore()); + break; + default: + text = String.format(scoreText, tennisPoints.get(player_1.getScore()), + tennisPoints.get(player_2.getScore())); + break; + } + + if (!text.isEmpty()) { + System.out.println(text); + } + } + + try { + System.out.println("Ha ganado el " + this.getWinner().getName()); + } catch (Exception e) { + System.out.println("Deuce"); + } + } + + public Player getPlayerWithHighestScore() { + Player winner = null; + if (this.player_1.getScore() > this.player_2.getScore()) { + winner = player_1; + } else if (this.player_1.getScore() < this.player_2.getScore()) { + winner = player_2; + } + return winner; + } + + public Player getPlayerByName(String name) { + + if (name == this.getPlayer_1().getName()) { + return this.getPlayer_1(); + } else { + return this.getPlayer_2(); + } + } +} diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/java/raclosDev.java b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/java/raclosDev.java new file mode 100644 index 0000000000..bb66881b46 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/java/raclosDev.java @@ -0,0 +1,49 @@ +package org.example; + +import java.util.*; + +public class raclosDev { + public static void main(String[] args) { + String[] secuencia = {"P1", "P1", "P2", "P2", "P1", "P2", "P1", "P1"}; + jugarJuego(secuencia); + } + + public static void jugarJuego(String[] secuencia) { + int puntuacionP1 = 0; + int puntuacionP2 = 0; + + for (String punto : secuencia) { + if (punto.equals("P1")) { + puntuacionP1++; + } else if (punto.equals("P2")) { + puntuacionP2++; + } + + mostrarPuntuacion(puntuacionP1, puntuacionP2); + + if (puntuacionP1 >= 4 && puntuacionP1 - puntuacionP2 >= 2) { + System.out.println("Ha ganado el P1"); + break; + } else if (puntuacionP2 >= 4 && puntuacionP2 - puntuacionP1 >= 2) { + System.out.println("Ha ganado el P2"); + break; + } + } + } + + public static void mostrarPuntuacion(int puntuacionP1, int puntuacionP2) { + String[] puntuaciones = {"Love", "15", "30", "40", "Deuce", "Ventaja"}; + + if (puntuacionP1 >= 3 && puntuacionP2 >= 3) { + if (puntuacionP1 == puntuacionP2) { + System.out.println("Deuce"); + } else if (puntuacionP1 > puntuacionP2) { + System.out.println("Ventaja P1"); + } else { + System.out.println("Ventaja P2"); + } + } else { + System.out.println(puntuaciones[puntuacionP1] + " - " + puntuaciones[puntuacionP2]); + } + } +} diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/AlinaBernardez.js b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/AlinaBernardez.js new file mode 100644 index 0000000000..17b8e726d3 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/AlinaBernardez.js @@ -0,0 +1,32 @@ +const puntos = ['Love', 15, 30, 40]; +let P1 = 0; +let P2 = 0; + +const partido = ['P1', 'P1', 'P2', 'P2', 'P1', 'P2', 'P1','P2', 'P1','P2','P1','P1']; + + +partido.map(punto => { + let resultado; + punto === 'P1' ? P1++ : P2++; + if(P1 < 4 || P2 < 4) { + resultado = puntos[P1] + ' - ' + puntos[P2] + } + else if(P1 >= 4 && P1 !== P2) { + resultado = 'Ventaja P1'; + if(P1 - P2 === 2) { + resultado = '¡Ganador: P1!'; + //Resetear secuencia para que no admita más puntuación. + } + } + else if(P2 >= 4 && P1 !== P2) { + resultado = 'Ventaja P2' + if(P2 - P1 === 2) { + resultado = 'Ganador: P2' + //Resetear secuencia para que no admita más puntuación. + } + } + else if(P1 >= 3 && P2 >= 3 && P1 === P2) { + resultado = 'Deuce'; + } + console.log(resultado) +}) \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/Raul1551.js b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/Raul1551.js new file mode 100644 index 0000000000..6397fd61c5 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/Raul1551.js @@ -0,0 +1,64 @@ +/* + * Escribe un programa que muestre cómo transcurre un juego de tenis y quién lo ha ganado. + * El programa recibirá una secuencia formada por "P1" (Player 1) o "P2" (Player 2), según quien + * gane cada punto del juego. + * + * - Las puntuaciones de un juego son "Love" (cero), 15, 30, 40, "Deuce" (empate), ventaja. + * - Ante la secuencia [P1, P1, P2, P2, P1, P2, P1, P1], el programa mostraría lo siguiente: + * 15 - Love + * 30 - Love + * 30 - 15 + * 30 - 30 + * 40 - 30 + * Deuce + * Ventaja P1 + * Ha ganado el P1 + * - Si quieres, puedes controlar errores en la entrada de datos. + * - Consulta las reglas del juego si tienes dudas sobre el sistema de puntos. + */ + +function tennisGame(sequence) { + let points_P1 = 0; + let points_P2 = 0; + + const POINTS = ["Love", 15, 30, 40]; + + for (let game of sequence) { + if (game === "P1") { + points_P1++; + } else if (game === "P2") { + points_P2++; + } else { + console.log("Error: Invalid play"); + return; + } + + if (points_P1 >= 3 && points_P2 >= 3) { + if (points_P1 === points_P2) { + console.log("Deuce"); + } else if (points_P1 - points_P2 === 1) { + console.log("Ventaja P1"); + } else if (points_P2 - points_P1 === 1) { + console.log("Ventaja P2"); + } else if (points_P1 - points_P2 >= 2) { + console.log("Ha ganado el P1"); + return; + } else if (points_P2 - points_P1 >= 2) { + console.log("Ha ganado el P2"); + return; + } + } else { + console.log(POINTS[points_P1] + " - " + POINTS[points_P2]); + } + } + + console.log("Fin del juego"); + } + + const sequence = ["P1", "P1", "P2", "P2", "P1", "P2", "P1", "P1"]; + tennisGame(sequence); + + + + + diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/edu2122.js b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/edu2122.js new file mode 100644 index 0000000000..c1ab6a7494 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/edu2122.js @@ -0,0 +1,71 @@ +/* + * Escribe un programa que muestre cómo transcurre un juego de tenis y quién lo ha ganado. + * El programa recibirá una secuencia formada por "P1" (Player 1) o "P2" (Player 2), según quien + * gane cada punto del juego. + * + * - Las puntuaciones de un juego son "Love" (cero), 15, 30, 40, "Deuce" (empate), ventaja. + * - Ante la secuencia [P1, P1, P2, P2, P1, P2, P1, P1], el programa mostraría lo siguiente: + * 15 - Love + * 30 - Love + * 30 - 15 + * 30 - 30 + * 40 - 30 + * Deuce + * Ventaja P1 + * Ha ganado el P1 + * - Si quieres, puedes controlar errores en la entrada de datos. + * - Consulta las reglas del juego si tienes dudas sobre el sistema de puntos. + */ + +const Player = { + P1: 1, + P2: 2 +}; + +function tenisGame(points) { + game = ['Love', 15, 30, 40, 'Deuce', 'Ventaja']; + let p1Points = 0; + let p2Points = 0; + let finished = false; + let error = false; + + for( const player of points) { + error = finished; + + p1Points = (player == Player.P1) ? p1Points + 1 : p1Points; + p2Points = (player == Player.P2) ? p2Points + 1 : p2Points; + + if (p1Points >= 3 && p2Points >= 3) { + + if (!finished && Math.abs(p1Points - p2Points) <= 1) { + if (p1Points == p2Points) { + console.log(game[4]); + } else if (p1Points > p2Points) { + console.log(game[5], 'P1'); + } else { + console.log(game[5], 'P2'); + } + } else { + finished = true; + }; + + } else{ + if (p1Points < 4 || p2Points < 4) { + console.log(game[p1Points], '-', game[p2Points]); + } else{ + finished = true; + }; + }; + }; + if (error) { + console.log("Los puntos jugados no son correctos"); + } else{ + if (p1Points > p2Points){ + console.log("Ha ganado el P1"); + } else { + console.log("Ha ganado el P2"); + }; + }; +}; + +tenisGame([Player.P1, Player.P1, Player.P2, Player.P2, Player.P1, Player.P2, Player.P1, Player.P1]); \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/hogan26.js b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/hogan26.js new file mode 100644 index 0000000000..4a3dddfc2d --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/javascript/hogan26.js @@ -0,0 +1,57 @@ +class Jugador{ + constructor(){ + this.puntaje = 0 + } + anotacion(){ + this.puntaje++ + } + obtener_puntaje(){ + return this.puntaje + } +} + +class PartidoTenis{ + constructor(secuencia){ + this.jugador1 = new Jugador() + this.jugador2 = new Jugador() + this.secuencia = secuencia + this.diferencia = 0 + this.terminado = false + } + + calcular_diferencia(){ + this.diferencia = Math.abs(this.jugador1.obtener_puntaje() - this.jugador2.obtener_puntaje()) + } + + imprimir_jugada(){ + let definicion_puntajes = {0 : 'love',1 : '15',2 : '30',3 : '40'} + let jugador1 = this.jugador1.obtener_puntaje() + let jugador2 = this.jugador2.obtener_puntaje() + + if (jugador1 >=3 && jugador2 >=3 && this.diferencia == 0) console.log("Deuce") + else if (jugador1 >3 && jugador1>jugador2 && this.diferencia == 1) console.log("Ventaja Jugador 1") + else if (jugador2 >3 && jugador2>jugador1 && this.diferencia == 1) console.log("Ventaja Jugador 2") + else if (jugador1 >3 && jugador1>jugador2 && this.diferencia == 2){ + console.log("Gana Jugador 1") + this.terminado = true + }else if (jugador2 >=3 && jugador2>jugador1 && this.diferencia == 2){ + console.log("Gana Jugador 2") + this.terminado = true + }else console.log(definicion_puntajes[jugador1]+" - "+definicion_puntajes[jugador2]) + } + + proceso(secuencia){ + for(let jugador of secuencia){ + if (jugador == 'P1') this.jugador1.anotacion() + else if (jugador == 'P2') this.jugador2.anotacion() + else alert("Error en la secuencia") + this.calcular_diferencia() + this.imprimir_jugada() + if (self.terminado) break + } + } +} + +let secuencia = ['P1','P1','P2','P2','P1','P2','P1','P2','P2','P2'] +const partido = new PartidoTenis() +partido.proceso(secuencia) \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/kotlin/marchdz.kt b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/kotlin/marchdz.kt new file mode 100644 index 0000000000..3f98abca11 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/kotlin/marchdz.kt @@ -0,0 +1,41 @@ +import kotlin.math.absoluteValue + +fun tennisMatch(vararg points: String) { + var player1Score = 0 + var player2Score = 0 + var finished = false + val pointsStrings = arrayOf("Love", "15", "30", "40") + + for (point in points) { + if (!finished) { + when (point) { + "P1" -> player1Score += 1 + "P2" -> player2Score += 1 + else -> println("Ignorando un valor incorrecto en la posición ${points.indexOf(point) + 1}...") + } + + when { + player1Score >= 3 && player2Score >= 3 -> { + when { + player1Score == player2Score -> println("Deuce") + player1Score - player2Score == 1 -> println("Ventaja P1") + player2Score - player1Score == 1 -> println("Ventaja P2") + (player1Score - player2Score).absoluteValue == 2 -> finished = true + } + } + + player1Score == 4 || player2Score == 4 -> finished = true + else -> println("${pointsStrings[player1Score]} - ${pointsStrings[player2Score]}") + } + } + } + + when { + finished -> println(if (player1Score > player2Score) "Ha ganado el P1" else "Ha ganado el P2") + else -> println("Puntos insuficientes para determinar un resultado") + } +} + +fun main() { + tennisMatch("P1", "P1", "P2", "P2", "P1", "P2", "P1", "P1") +} \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/JoaquinMateosBarroso.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/JoaquinMateosBarroso.py new file mode 100644 index 0000000000..1812ea616d --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/JoaquinMateosBarroso.py @@ -0,0 +1,113 @@ + + + +class Player(): + def __init__(self, initPoints:int): + self.points = initPoints + def addPoint(self): + self.points += 15 if self.points < 30 else 10 + def getPoints(self): + return self.points + def __str__(self) -> str: + return "Love" if self.points == 0 else str(self.points) + +class TennisMatch(): + def __init__(self) -> None: + self.p1 = Player(0) + self.p2 = Player(0) + self.stage = 0 # stage=0 <=> points in [0-30]. stage=1 <=> someone points=40. stage2 <=> someone points>40. stage3 <=> finished + self.advantage = 0 # 0 <=> no advantage. 1 <=> advantage p1. 2 <=> advantage p2 + + def p1WinsPoint(self): + if self.stage == 0: + self.p1.addPoint() + if self.p1.getPoints() == 40: + self.stage = 1 + else: + if self.stage == 1: + if self.p1.getPoints() == 40: + if self.p2.getPoints() < 40: + print("Player 1 wins the game!") + self.stage = 3 # finished + else: + self.stage = 2 + else: + self.p1.addPoint() + self.stage = 2 + else: + if self.advantage == 1: + print("Player 1 wins the game!") + self.stage = 3 # finished + elif self.advantage == 2: + self.advantage = 0 + else: # self.advantage == 0 + self.advantage = 1 + + def p2WinsPoint(self): + if self.stage == 0: + self.p2.addPoint() + else: + if self.stage == 1: + if self.p2.getPoints() == 40: + if self.p1.getPoints() < 40: + print("Player 2 wins the game!") + self.stage = 3 # finished + else: + self.stage = 2 + else: + self.p2.addPoint() + self.stage = 2 + else: + if self.advantage == 2: + print("Player 1 wins the game!") + self.stage = 3 # finished + elif self.advantage == 1: + self.advantage = 0 + else: # self.advantage == 0 + self.advantage = 2 + + def finished(self): + return self.stage == 3 + + def __str__(self) -> str: + if self.stage == 0 or self.stage == 1: + return str(self.p1) + " - " + str(self.p2) + else: + if self.advantage == 1: + return "Advantage P1" + elif self.advantage == 2: + return "Advantage P2" + else: + return "Deuce" + +def tennisMatch(): + """Escribe un programa que muestre cómo transcurre un juego de tenis y quién lo ha ganado. + El programa recibirá una secuencia formada por "P1" (Player 1) o "P2" (Player 2), según quien + gane cada punto del juego. + + - Las puntuaciones de un juego son "Love" (cero), 15, 30, 40, "Deuce" (empate), ventaja. + - Ante la secuencia [P1, P1, P2, P2, P1, P2, P1, P1], el programa mostraría lo siguiente: + 15 - Love + 30 - Love + 30 - 15 + 30 - 30 + 40 - 30 + Deuce + Ventaja P1 + Ha ganado el P1 + - Si quieres, puedes controlar errores en la entrada de datos. + - Consulta las reglas del juego si tienes dudas sobre el sistema de puntos.""" + game = TennisMatch() + while not game.finished(): + print(game) + inp = input("P1 or P2? ") + if inp == "P1": + game.p1WinsPoint() + elif inp == "P2": + game.p2WinsPoint() + else: + print("Error") + + +if __name__ == "__main__": + tennisMatch() \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/PedroOrtix.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/PedroOrtix.py new file mode 100644 index 0000000000..593372c685 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/PedroOrtix.py @@ -0,0 +1,45 @@ +PUNTUACIONES = {0: "Love", 1: "15", 2: "30", 3: "40"} + +def obtener_puntuacion_str(puntuacion): + if puntuacion < len(PUNTUACIONES): + return PUNTUACIONES[puntuacion] + return "Love" + +def estado_resultado(tupla_puntos): + puntuacion_p1, puntuacion_p2 = tupla_puntos + + if puntuacion_p1 >= 3 and puntuacion_p2 >= 3: + if puntuacion_p1 == puntuacion_p2: + return "Deuce", "" + elif puntuacion_p1 - puntuacion_p2 == 1: + return "Ventaja", "P1" + elif puntuacion_p1 - puntuacion_p2 == -1: + return "Ventaja", "P2" + elif puntuacion_p1 - puntuacion_p2 >= 2: + return "Gana", "P1" + elif puntuacion_p1 - puntuacion_p2 <= -2: + return "Gana", "P2" + + return obtener_puntuacion_str(puntuacion_p1), obtener_puntuacion_str(puntuacion_p2) + +def estado_juego(lista_puntos): + estado_dinamico = [0, 0] + for punto in lista_puntos: + if punto == "P1": + estado_dinamico[0] += 1 + elif punto == "P2": + estado_dinamico[1] += 1 + + puntuacion_p1_str, puntuacion_p2_str = estado_resultado(estado_dinamico) + if puntuacion_p1_str == "Gana": + print("Ha ganado el P1") + break + elif puntuacion_p2_str == "Gana": + print("Ha ganado el P2") + break + else: + print(f"{puntuacion_p1_str} - {puntuacion_p2_str}") + +# Probamos el código con la secuencia proporcionada +# [P1, P1, P2, P2, P1, P2, P1, P1] +estado_juego(['P1', 'P1', 'P2', 'P2', 'P1', 'P2', 'P1', 'P1']) diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/alberba.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/alberba.py new file mode 100644 index 0000000000..46ec8bb583 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/alberba.py @@ -0,0 +1,41 @@ +def tennis_game(points: list): + pos_puntuacion = ["Love", 15, 30, 40, ] + punt_p1 = 0 + punt_p2 = 0 + + for point in points: + if point == "P1" or point == "P2": + if point == "P1": + punt_p1 += 1 + else: + punt_p2 += 1 + + diff = punt_p1 - punt_p2 + + if abs(diff) >= 2 and (punt_p1 > 3 or punt_p2 > 3): + # Hay un jugador que ha ganado + if diff < 0: + print("Ha ganado el P2") + else: + print("Ha ganado el P1") + else: + # El partido sigue en juego + if punt_p1 > 2 and punt_p2 > 2: + if punt_p1 == punt_p2: + # Ambos tienen la misma puntuación y han superado los 40-40 + print("Deuce") + else: + # Alguien de los dos tiene ventaja + if diff > 0: + print("Ventaja P1") + else: + print("Ventaja P2") + else: + # Los dos no han llegado a 40 + print(f'{pos_puntuacion[punt_p1]} - {pos_puntuacion[punt_p2]}') + else: + print("Error al pasar las puntuaciones.") + break + + +tennis_game(["P1", "P1", "P2", "P2", "P1", "P2", "P1", "P1"]) \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/bramenn.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/bramenn.py new file mode 100644 index 0000000000..eda287766b --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/bramenn.py @@ -0,0 +1,96 @@ + +from typing import List + +class Player: + score: int + name: str + + def __init__(self, name: str) -> None: + self.name = name + self.score = 0 + +class TennisMatch: + + player_1: Player + player_2: Player + + history_sets: List[str] + winner: Player + + tennis_dict = { + 0: "Love", + 1: "15", + 2: "30", + 3: "40", + } + + def __init__(self, player_1: Player, player_2: Player, history_sets: List[str]) -> None: + self.player_1 = player_1 + self.player_2 = player_2 + self.history_sets = history_sets + + + def run_game(self): + + counter_set = 0 + for player_name in self.history_sets: + + if player_name == self.player_1.name: + self.player_1.score += 1 + elif player_name == self.player_2.name: + self.player_2.score += 1 + + counter_set += 1 + + self.load_winner() + + if counter_set in [6, 7]: + if self.check_deuce: + print("Deuce") + else: + print(f"Ventaja {self.winner.name}") + elif counter_set in [8]: + if self.check_deuce: + print("Deuce") + continue + + + print(f"Ha ganado el {self.winner.name}") + else: + print(f"{self.tennis_dict.get(self.player_1.score)} - {self.tennis_dict.get(self.player_2.score)}") + + @property + def check_deuce(self) -> bool: + return True if self.get_high_scoring_player() is None else False + + def load_winner(self): + + if self.check_deuce: + self.winner = None + return + + self.winner = self.get_high_scoring_player() + + + + def get_high_scoring_player(self) -> Player: + + if self.player_1.score > self.player_2.score: + return self.player_1 + elif self.player_1.score < self.player_2.score: + return self.player_2 + + +def main(): + player_1 = Player(name="P1") + player_2 = Player(name="P2") + + history_sets = ["P1", "P1", "P2", "P2", "P1", "P2", "P1", "P1"] + # history_sets = ["P1", "P2", "P2", "P2", "P1", "P2", "P1", "P1"] + # history_sets = ["P1", "P2", "P2", "P2", "P1", "P2", "P1", "P2"] + + tennis_match = TennisMatch(player_1=player_1, player_2=player_2, history_sets=history_sets) + + tennis_match.run_game() + +main() \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/callmeGustavo.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/callmeGustavo.py new file mode 100644 index 0000000000..9125af9f6b --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/callmeGustavo.py @@ -0,0 +1,36 @@ +player1 = 0 +player2 = 0 + +point = ["Love", "15", "30", "40"] + + +players = ["P1", "P1", "P2", "P2", "P1", "P2", "P1", "P2"] + + + +for i in (players): + + if i == 'P1': + player1 += 1 + elif i == 'P2': + player2 += 1 + else: + print('Jugador ingresado incorrecto') + + if player1 > 3 or player2 > 3: + if player1 == player2: + print("Deuce") + elif player1 - player2 == 1: + print("Ventaja P1") + elif player1 - player2 == 2: + print("Gana P1") + elif player1 - player2 == -1: + print("Ventaja P2") + elif player1 - player2 == -2: + print("Gana P2") + + elif player1 == 3 and player2 == 3: + print("Deuce") + + else: + print(f"{point[player1]} - {point[player2]}") \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/ernestoalbarez.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/ernestoalbarez.py new file mode 100644 index 0000000000..4a6a1d80cd --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/ernestoalbarez.py @@ -0,0 +1,38 @@ +def get_score(score): + scores = {0: "Love", 15: "15", 30: "30", 40: "40"} + return scores.get(score, str(score)) + + +def get_game_result(score_p1, score_p2): + if score_p1 >= 40 and score_p2 >= 40: + if score_p1 == score_p2: + return "Deuce" + elif score_p1 - score_p2 == 1: + return "Ventaja P1" + elif score_p2 - score_p1 == 1: + return "Ventaja P2" + return None + + +def tennis_game(sequence): + score_p1 = 0 + score_p2 = 0 + + for point in sequence: + if point == "P1": + score_p1 += 15 + elif point == "P2": + score_p2 += 15 + + game_result = get_game_result(score_p1, score_p2) + if game_result: + print(f"{get_score(score_p1)} - {get_score(score_p2)}") + print(game_result) + if game_result.startswith("Ventaja"): + continue + else: + return f"Ha ganado el P1" if score_p1 > score_p2 else f"Ha ganado el P2" + + print(f"{get_score(score_p1)} - {get_score(score_p2)}") + + return f"Ha ganado el P1" if score_p1 > score_p2 else f"Ha ganado el P2" diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/fedecoronado.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/fedecoronado.py new file mode 100644 index 0000000000..722648e03c --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/fedecoronado.py @@ -0,0 +1,55 @@ +'''/* + * Escribe un programa que muestre cómo transcurre un juego de tenis y quién lo ha ganado. + * El programa recibirá una secuencia formada por "P1" (Player 1) o "P2" (Player 2), según quien + * gane cada punto del juego. + * + * - Las puntuaciones de un juego son "Love" (cero), 15, 30, 40, "Deuce" (empate), ventaja. + * - Ante la secuencia [P1, P1, P2, P2, P1, P2, P1, P1], el programa mostraría lo siguiente: + * 15 - Love + * 30 - Love + * 30 - 15 + * 30 - 30 + * 40 - 30 + * Deuce + * Ventaja P1 + * Ha ganado el P1 + * - Si quieres, puedes controlar errores en la entrada de datos. + * - Consulta las reglas del juego si tienes dudas sobre el sistema de puntos. + */''' + +secuencia = ['P1', 'P1', 'P2', 'P3', 'P1', 'P1', 'P1', 'P1'] +tantos ={0:"Love", 1: "15", 2:"30", 3:"40", 4:"Ventaja "} +# reseteo del game +score = [0,0] +fin = 0 + +for punto in secuencia: + if punto == 'P1': + score[0] += 1 + elif punto == 'P2': + score[1] += 1 + else: + print("Error en le ganador del punto") + if score[0] < 5: + puntos1 = tantos[score[0]] + if score[1] < 5: + puntos2 = tantos[score[1]] + puntos = puntos1 + " - " + puntos2 + if score[0] > 3 or score[1] > 3: + if score[0] == score[1]: + puntos = 'Deuce' + if score[0] > score[1]: + puntos = 'Ventaja P1' + if score[0] < score[1]: + puntos = 'Ventaja P2' + if score[0] >= 4 and score[0] - score[1] >= 2: + puntos = 'Ha ganado el P1' + fin = 1 + if score[1] >= 4 and score[1] - score[0] >= 2: + puntos = 'Ha ganado el P2' + fin = 1 + print(punto, score[0],score[1], puntos) + if fin == 1: + break + + diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/hogan26.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/hogan26.py new file mode 100644 index 0000000000..9d7924d0ac --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/hogan26.py @@ -0,0 +1,36 @@ +diccionario = { + 0 : 'love', + 1 : '15', + 2 : '30', + 3 : '40' +} + +def match(secuencia): + p1,p2 = 0 , 0 + for player in secuencia: + if player == 'P1': p1+= 1 + else: p2+= 1 + + if p1 == 3 and p2 == 3: print("Deuce") + elif p1 == 4 and p2 == 3: print("Ventaja P1") + elif p1 == 4 and p2 < 3: + print("Gana P1") + quit() + elif p1 == 3 and p2 == 4: print("Ventaja P2") + elif p1 < 3 and p2 == 4: + print("Gana P2") + quit() + elif p1 == 4 and p2 == 4: + p1-=1 + p2-=1 + print("Deuce") + elif p1 == 5: + print("Gana P1") + quit() + elif p2 == 5: + print("Gana P2") + quit() + else: + print(diccionario[p1]+" - "+diccionario[p2]) + +match(['P1','P1','P2','P2','P1','P2','P1','P2','P2','P2']) \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/josevegas27.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/josevegas27.py new file mode 100644 index 0000000000..159a370420 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/josevegas27.py @@ -0,0 +1,81 @@ +''' + RETO #2: EL PARTIDO DE TENIS + Escribe un programa que muestre cómo transcurre un juego de tenis y quién lo ha ganado. + El programa recibirá una secuencia formada por "P1" (Player 1) o "P2" (Player 2), según quien + gane cada punto del juego. + + - Las puntuaciones de un juego son "Love" (cero), 15, 30, 40, "Deuce" (empate), ventaja. + - Ante la secuencia [P1, P1, P2, P2, P1, P2, P1, P1], el programa mostraría lo siguiente: + 15 - Love + 30 - Love + 30 - 15 + 30 - 30 + 40 - 30 + Deuce + Ventaja P1 + Ha ganado el P1 + - Si quieres, puedes controlar errores en la entrada de datos. + - Consulta las reglas del juego si tienes dudas sobre el sistema de puntos. +''' + +# Entrada lista + +def partido_tenis(lista: list): + n,m = (0,0) + + for i in lista: + if i not in ['P1','P2']: + print ('Error en la entrada de datos') + return True + + puntos = ['Love','15','30','40','Ventaja','Ha ganado'] + + cont_p1 = puntos[n] + cont_p2 = puntos[m] + for win in lista: + + if win == 'P1': + n += 1 + cont_p1 = puntos[n] + + if win == 'P2': + m += 1 + cont_p2 = puntos[m] + + + if n == 4 and m == 4: + print('Empate') + print('\nFin del Juego') + return True + + elif n == 5 or ( n == 4 and m < 3): + print('Ha ganado P1') + print('\nFin del Juego') + return True + + elif m == 5 or ( m == 4 and n < 3): + print('Ha ganado P2') + print('\nFin del Juego') + return True + + elif n == 4 and m == 3: + print('Ventaja P1') + + elif n == 3 and m == 4: + print('Ventaja P2') + + elif n == 3 and m == 3: + print('Deuce') + + elif n <= 3 and m <= 3: + print(f'{cont_p1}-{cont_p2}') + + +puntos = input('Introduzca los puntos: ') +puntos_lsta = [] +while True: + puntos_lsta.append(puntos) + if partido_tenis(puntos_lsta): + break + puntos = input('\nSiguiente punto: ') + if puntos not in ['P1','P2']: break diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/klimyflorez.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/klimyflorez.py new file mode 100644 index 0000000000..12133273c2 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/klimyflorez.py @@ -0,0 +1,44 @@ +# Escribe un programa que muestre cómo transcurre un juego de tenis y quién lo ha ganado. +# El programa recibirá una secuencia formada por "P1" (Player 1) o "P2" (Player 2), según quien gane cada punto del juego. +# +# -Las puntuaciones de un juego son "Love" (cero), 15, 30, 40, "Deuce" (empate), ventaja. +# -Ante la secuencia [P1, P1, P2, P2, P1, P2, P1, P1], el programa mostraría lo siguiente: +# |15 - Love| +# |30 - Love| +# |30 - 15| +# |30 - 30| +# |40 - 30| +# |Deuce| +# |Ventaja P1| +# |Ha ganado el P1| +# - Si quieres, puedes controlar errores en la entrada de datos. +# - Consulta las reglas del juego si tienes dudas sobre el sistema de puntos. + +def tennis_game(points: list): + scores = {0: "Love", 1: "15", 2: "30", 3: "40"} + p1_score = 0 + p2_score = 0 + for point in points: + if point == "P1": + p1_score += 1 + elif point == "P2": + p2_score += 1 + if p1_score < 4 and p2_score < 4: + print(scores[p1_score] + " - " + scores[p2_score]) + elif p1_score == p2_score: + print("Deuce") + elif p1_score > p2_score: + if p1_score - p2_score == 1: + print("Ventaja P1") + else: + print("Ha ganado el P1") + return + else: + if p2_score - p1_score == 1: + print("Ventaja P2") + else: + print("Ha ganado el P2") + return +# Example usage +points = ["P1", "P1", "P2", "P2", "P1", "P2", "P1", "P1"] +tennis_game(points) \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/marcoatrs.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/marcoatrs.py new file mode 100644 index 0000000000..5b252a795d --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/marcoatrs.py @@ -0,0 +1,43 @@ +from typing import List + + +steps = ["Love", 15, 30, 40, "Duece", "Ventaja"] + +def win_check(p1: int, p2: int) -> bool: + if (p1 - p2) >= 2: + print("Ha ganado el P1") + return True + if (p2 - p1) >= 2: + print("Ha ganado el P2") + return True + return False + + +def tenis(sequence: List[str]): + p1, p2 = 0, 0 + for step in sequence: + if step.lower() not in ["p1", "p2"]: + print("Movimiento invalido") + continue + if step.lower() == 'p1': + p1 += 1 + else: + p2 += 1 + + if p1 == p2 == 3: + print("Deuce") + continue + + if (p1 > 3) or (p2 > 3): + if win_check(p1, p2): + break + elif p1 > p2: + print("Ventaja P1") + else: + print("Ventaja P2") + continue + + print(f'{steps[p1]} - {steps[p2]}') + + +tenis(['P1', 'P1', 'P2', 'P2', 'P1', 'P2', 'P1', 'P1']) diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/rafaelramirez150.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/rafaelramirez150.py new file mode 100644 index 0000000000..72306bc130 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/rafaelramirez150.py @@ -0,0 +1,45 @@ +''' +/* + * Escribe un programa que muestre cómo transcurre un juego de tenis y quién lo ha ganado. + * El programa recibirá una secuencia formada por "P1" (Player 1) o "P2" (Player 2), según quien + * gane cada punto del juego. + * + * - Las puntuaciones de un juego son "Love" (cero), 15, 30, 40, "Deuce" (empate), ventaja. + * - Ante la secuencia [P1, P1, P2, P2, P1, P2, P1, P1], el programa mostraría lo siguiente: + * 15 - Love + * 30 - Love + * 30 - 15 + * 30 - 30 + * 40 - 30 + * Deuce + * Ventaja P1 + * Ha ganado el P1 + * - Si quieres, puedes controlar errores en la entrada de datos. + * - Consulta las reglas del juego si tienes dudas sobre el sistema de puntos. + */ +''' + +marcador = ["Love", "15", "30", "40"] + +def juego(List): + player1 = 0 + player2 = 0 + + for p in List: + if p == "jugador1": player1 += 1 + elif p == "jugador2": player2 += 1 + + if player1 == 3 and player2 == 3: print("Deuce") + + elif player1 >= 4 or player2 >= 4: + puntaje = player1 - player2 + if puntaje == 0: print("Deuce") + elif puntaje == 1: print("La ventaja es para el Jugador 1") + elif puntaje == -1: print("La ventaja es para el Jugador 2") + elif puntaje >= 2: print("El ganador es el Jugador 1") + + else: print("El ganador es el Jugador 2") + + else: print(f"Jugador 1: {marcador[player1]} - Jugador 2: {marcador[player2]}") + +juego (["jugador1", "jugador1", "jugador2", "jugador2", "jugador1", "jugador2", "jugador1", "jugador1"]) diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/rafaelramireza.py b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/rafaelramireza.py new file mode 100644 index 0000000000..1ffc1307f4 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/python/rafaelramireza.py @@ -0,0 +1,45 @@ +''' +/* + * Escribe un programa que muestre cómo transcurre un juego de tenis y quién lo ha ganado. + * El programa recibirá una secuencia formada por "P1" (Player 1) o "P2" (Player 2), según quien + * gane cada punto del juego. + * + * - Las puntuaciones de un juego son "Love" (cero), 15, 30, 40, "Deuce" (empate), ventaja. + * - Ante la secuencia [P1, P1, P2, P2, P1, P2, P1, P1], el programa mostraría lo siguiente: + * 15 - Love + * 30 - Love + * 30 - 15 + * 30 - 30 + * 40 - 30 + * Deuce + * Ventaja P1 + * Ha ganado el P1 + * - Si quieres, puedes controlar errores en la entrada de datos. + * - Consulta las reglas del juego si tienes dudas sobre el sistema de puntos. + */ +''' + +marcador = ["Love", "15", "30", "40"] + +def juegoTenis(List): + jugador1 = 0 + jugador2 = 0 + + for p in List: + if p == "j1": jugador1 += 1 + elif p == "j2": jugador2 += 1 + + if jugador1 == 3 and jugador2 == 3: print("Deuce") + + elif jugador1 >= 4 or jugador2 >= 4: + puntaje = jugador1 - jugador2 + if puntaje == 0: print("Deuce") + elif puntaje == 1: print("La ventaja es para el Jugador 1") + elif puntaje == -1: print("La ventaja es para el Jugador 2") + elif puntaje >= 2: print("El ganador es el Jugador 1") + + else: print("El ganador es el Jugador 2") + + else: print(f"Jugador 1: {marcador[jugador1]} - Jugador 2: {marcador[jugador2]}") + +juegoTenis (["j1", "j1", "j2", "j2", "j1", "j2", "j1", "j1"]) \ No newline at end of file diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/ruby/ernestoalbarez.rb b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/ruby/ernestoalbarez.rb new file mode 100644 index 0000000000..de4e3f15a1 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/ruby/ernestoalbarez.rb @@ -0,0 +1,48 @@ +def get_score(score) + scores_mapping = { 0 => "Love", 15 => "15", 30 => "30", 40 => "40" } + scores_mapping[score] || score.to_s +end + +def get_game_result(score_p1, score_p2) + if score_p1 >= 40 && score_p2 >= 40 + if score_p1 == score_p2 + return "Deuce" + elsif score_p1 - score_p2 == 1 + return "Ventaja P1" + elsif score_p2 - score_p1 == 1 + return "Ventaja P2" + end + end + + nil +end + +def tennis_game(sequence) + score_p1 = 0 + score_p2 = 0 + + sequence.each do |point| + if point == "P1" + score_p1 += 15 + elsif point == "P2" + score_p2 += 15 + end + + game_result = get_game_result(score_p1, score_p2) + if game_result + puts "#{get_score(score_p1)} - #{get_score(score_p2)}" + puts game_result + if game_result.start_with?("Ventaja") + next + else + return "Ha ganado el P1" if score_p1 > score_p2 + return "Ha ganado el P2" if score_p2 > score_p1 + end + end + + puts "#{get_score(score_p1)} - #{get_score(score_p2)}" + end + + "Ha ganado el P1" if score_p1 > score_p2 + "Ha ganado el P2" if score_p2 > score_p1 +end diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/typescript/freddoOswaldo.ts b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/typescript/freddoOswaldo.ts new file mode 100644 index 0000000000..3b8fda102b --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/typescript/freddoOswaldo.ts @@ -0,0 +1,94 @@ +/* + * Escribe un programa que muestre cómo transcurre un juego de tenis y quién lo ha ganado. + * El programa recibirá una secuencia formada por "P1" (Player 1) o "P2" (Player 2), según quien + * gane cada punto del juego. + * + * - Las puntuaciones de un juego son "Love" (cero), 15, 30, 40, "Deuce" (empate), ventaja. + * - Ante la secuencia [P1, P1, P2, P2, P1, P2, P1, P1], el programa mostraría lo siguiente: + * 15 - Love + * 30 - Love + * 30 - 15 + * 30 - 30 + * 40 - 30 + * Deuce + * Ventaja P1 + * Ha ganado el P1 + * - Si quieres, puedes controlar errores en la entrada de datos. + * - Consulta las reglas del juego si tienes dudas sobre el sistema de puntos. + */ + +const score = ["P1", "P1", "P2", "P2", "P1", "P2", "P1", "P1"]; +const LOVE = "Love"; +const points = ["Love", "15", "30", "40"]; +const DEUCE = "Deuce"; +const ADVANTAGE = "Ventaja"; +const WIN = "Ha ganado el"; + +interface MatchScore { + P1: number; + P2: number; + finished: number; +} + +type MatchScoreKey = keyof MatchScore; + +function calculateMatchScore(point: string, matchScore: MatchScore) { + const key = Object.keys(matchScore).find((p) => p === point) as MatchScoreKey; + const notKey = Object.keys(matchScore).find( + (p) => p !== point + ) as MatchScoreKey; + + if (matchScore[key] === matchScore[notKey] && matchScore[key] === 3) { + return DEUCE; + } + + if ( + matchScore[key] > matchScore[notKey] && + matchScore[notKey] < 3 && + matchScore[key] === 4 + ) { + matchScore.finished = 1; + return `${WIN} ${key}`; + } + + if (matchScore[key] === 4 && matchScore[notKey] === 3) { + return `${ADVANTAGE} ${key}`; + } + + if (matchScore[key] === 5 && matchScore[notKey] === 3) { + matchScore.finished = 1; + return `${WIN} ${key}`; + } + + return `${points[matchScore.P1]} - ${points[matchScore.P2]}`; +} + +function addPoints(point: string, matchScore: MatchScore) { + const key = Object.keys(matchScore).find((p) => p === point) as MatchScoreKey; + + if (!key) { + throw new Error("punto invalido"); + } + + matchScore[key] += 1; +} + +function printMatchScore(scoreAfterAddPoint: string) { + console.log(scoreAfterAddPoint); +} + +function playTenis(score: string[] = []) { + const matchScore: MatchScore = { + P1: 0, + P2: 0, + finished: 0, + }; + + for (const point of score) { + addPoints(point, matchScore); + printMatchScore(calculateMatchScore(point, matchScore)); + if (!!matchScore.finished) break; + } +} + +playTenis(score); diff --git a/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/typescript/miguelriosoliveira.ts b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/typescript/miguelriosoliveira.ts new file mode 100644 index 0000000000..19641047a0 --- /dev/null +++ b/Retos/Reto #2 - EL PARTIDO DE TENIS [Media]/typescript/miguelriosoliveira.ts @@ -0,0 +1,78 @@ +/* + * Escribe un programa que muestre cómo transcurre un juego de tenis y quién lo ha ganado. + * El programa recibirá una secuencia formada por "P1" (Player 1) o "P2" (Player 2), según quien + * gane cada punto del juego. + * + * - Las puntuaciones de un juego son "Love" (cero), 15, 30, 40, "Deuce" (empate), ventaja. + * - Ante la secuencia [P1, P1, P2, P2, P1, P2, P1, P1], el programa mostraría lo siguiente: + * 15 - Love + * 30 - Love + * 30 - 15 + * 30 - 30 + * 40 - 30 + * Deuce + * Ventaja P1 + * Ha ganado el P1 + * - Si quieres, puedes controlar errores en la entrada de datos. + * - Consulta las reglas del juego si tienes dudas sobre el sistema de puntos. + */ + +const POINTS = ['Love', '15', '30', '40']; + +function tennisMatch(sequence: string[]): void { + const scores = { + P1: 0, + P2: 0, + }; + + sequence.forEach(winner => { + scores[winner]++; + if (scores.P1 <= 3 && scores.P2 <= 3 && scores.P1 + scores.P2 !== 6) { + console.log(`${POINTS[scores.P1]} - ${POINTS[scores.P2]}`); + return; + } + if (scores.P1 === scores.P2) { + console.log('Deuce'); + return; + } + if (Math.abs(scores.P1 - scores.P2) === 1) { + console.log(`Ventaja ${winner}`); + return; + } + console.log(`Ha ganado el ${winner}`); + }); +} + +function test() { + // Arrange + let received = ''; + const log = console.log; + console.log = arg => { + log(arg); + received += `${arg}\n`; + }; + + // Act + tennisMatch(['P1', 'P1', 'P2', 'P2', 'P1', 'P2', 'P1', 'P1']); + + // Assert + console.log = log; + const expected = + [ + '15 - Love', + '30 - Love', + '30 - 15', + '30 - 30', + '40 - 30', + 'Deuce', + 'Ventaja P1', + 'Ha ganado el P1', + ].join('\n') + '\n'; + if (received === expected) { + console.log('✅ PASS'); + } else { + console.log('❌ FAIL', { expected, received }); + } +} + +test(); diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/c#/malopezrom.cs b/Retos/Reto #20 - LA TRIFUERZA [Media]/c#/malopezrom.cs new file mode 100644 index 0000000000..468a0349a4 --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/c#/malopezrom.cs @@ -0,0 +1,73 @@ +/* + * ¡El nuevo "The Legend of Zelda: Tears of the Kingdom" ya está disponible! + * + * Crea un programa que dibuje una Trifuerza de "Zelda" + * formada por asteriscos. + * - Debes indicarle el número de filas de los triángulos con un entero positivo (n). + * - Cada triángulo calculará su fila mayor utilizando la fórmula 2n-1. + * + * Ejemplo: Trifuerza 2 + * + * * + * *** + * * * + * *** *** + * + */ + +using System; +using System.Text.RegularExpressions; + +namespace retosProgramacion2023 +{ + + class Program + { + static void Main(string[] args) + { + TriforceRecursive(10); + } + /** + * Funcion que calcula e imprime la trifuerza de Zelda de form recursiva + * @param level Nivel de la trifuerza + * @param currentLevel Nivel actual de la trifuerza (por defecto 0) + */ + static void TriforceRecursive(int level, int currentLevel = 0) + { + if (currentLevel == level * 2) + { + return; + } + + string row; + int firstLevel = level * 2 - 1; + int secondLevel = 0; + + if (currentLevel < level) + { + row = new string(' ', firstLevel - currentLevel); + row += PrintPoint(currentLevel); + } + else + { + secondLevel = currentLevel - level; + row = new string(' ', (level - secondLevel) - 1); + row += PrintPoint(secondLevel); + row += new string(' ', 2 * (level - secondLevel) - 1); + row += PrintPoint(secondLevel); + } + + Console.WriteLine(row); + + TriforceRecursive(level, currentLevel + 1); + } + /** + * Función que imprime los puntos de la trifuerza + * @param level Nivel de la trifuerza + */ + static string PrintPoint(int level) + { + return new string('*', 2 * level + 1); + } + } +} \ No newline at end of file diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/dart/malopezrom.dart b/Retos/Reto #20 - LA TRIFUERZA [Media]/dart/malopezrom.dart new file mode 100644 index 0000000000..03388482aa --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/dart/malopezrom.dart @@ -0,0 +1,32 @@ +void triforceRecursive(int level, [int currentLevel = 0]) { + if (currentLevel == level * 2) { + return; + } + + String row; + int firstLevel = level * 2 - 1; + int secondLevel = 0; + + if (currentLevel < level) { + row = ' ' * (firstLevel - currentLevel); + row += printPoint(currentLevel); + } else { + secondLevel = currentLevel - level; + row = ' ' * ((level - secondLevel) - 1); + row += printPoint(secondLevel); + row += ' ' * (2 * (level - secondLevel) - 1); + row += printPoint(secondLevel); + } + + print(row); + + triforceRecursive(level, currentLevel + 1); +} + +String printPoint(int level) { + return '*' * (2 * level + 1); +} + +void main() { + triforceRecursive(5); +} diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/dart/titoworlddev.dart b/Retos/Reto #20 - LA TRIFUERZA [Media]/dart/titoworlddev.dart new file mode 100644 index 0000000000..33f9cd27de --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/dart/titoworlddev.dart @@ -0,0 +1,62 @@ +/* + * ¡El nuevo "The Legend of Zelda: Tears of the Kingdom" ya está disponible! + * + * Crea un programa que dibuje una Trifuerza de "Zelda" + * formada por asteriscos. + * - Debes indicarle el número de filas de los triángulos con un entero positivo (n). + * - Cada triángulo calculará su fila mayor utilizando la fórmula 2n-1. + * + * Ejemplo: Trifuerza 2 + * + * * + * *** + * * * + * *** *** + * + */ + +void main() { + print(trifuerza(10)); +} + +String trifuerza(int triNum) { + String result = ''; + int spaces = 0; + + for (int i = 0; i <= triNum; i++) { + result = '*** ' * (triNum - i) + result; + result = ' ' * (spaces) + result; + result = '\n$result'; + result = ' * ' * (triNum - i) + result; + result = ' ' * (spaces) + result; + result = '\n$result'; + spaces += 2; + } + + return result; +} + +/* + * + *** + * * + *** *** + * * * + *** *** *** + * * * * + *** *** *** *** + * * * * * + *** *** *** *** *** + * * * * * * + *** *** *** *** *** *** + * * * * * * * + *** *** *** *** *** *** *** + * * * * * * * * + *** *** *** *** *** *** *** *** + * * * * * * * * * + *** *** *** *** *** *** *** *** *** + * * * * * * * * * * + *** *** *** *** *** *** *** *** *** *** + * * * * * * * * * * * + *** *** *** *** *** *** *** *** *** *** *** + */ \ No newline at end of file diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/java/Cflorezp.java b/Retos/Reto #20 - LA TRIFUERZA [Media]/java/Cflorezp.java new file mode 100644 index 0000000000..fdaad09319 --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/java/Cflorezp.java @@ -0,0 +1,68 @@ +package reto20LaTrifuerza; + +import java.util.Scanner; + +public class Cflorezp { + + public static void main(String[] args) { + + + Scanner input = new Scanner(System.in); + System.out.println("Cuantas filas desea por triangulo: "); + String numberOfRows = input.nextLine(); + if(validationOfNumber(numberOfRows)){ + drawTriforce(Integer.parseInt(numberOfRows)); + } + + input.close(); + } + + public static boolean validationOfNumber(String number){ + if(number.equals("0") || number.equals("1") || !number.matches("[0-9]+") ){ + System.out.println("El valor ingresado no es valido!!"); + return false; + } + return true; + } + + public static void drawTriforce(int n){ + String star = "*"; + int middle = ((4 * n) / 2) + 1; + int middleSecond = (middle + 1) / 2; + int middleThird = middleSecond; + int dif = (2 * n) ; + String starSecond = "*"; + String thirdStar = "*"; + + for(int i = 0; i< n; i++){ + for(int j = 1; j<= (4 * n); j++){ + if(j == middle){ + System.out.print(star); + star = star.concat("**"); + middle -= 1; + }else { + System.out.print(" "); + } + } + System.out.println(); + } + + for(int i = 0; i< n; i++){ + for(int j = 1; j<= (4 * n); j++){ + if(j == middleSecond){ + System.out.print(starSecond); + starSecond = starSecond.concat("**"); + middleSecond -= 1; + }else if(j == (middleThird + dif)){ + System.out.print(thirdStar); + thirdStar = thirdStar.concat("**"); + middleThird -= 3; + } + else { + System.out.print(" "); + } + } + System.out.println(); + } + } +} diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/javascript/cesar-ch.js b/Retos/Reto #20 - LA TRIFUERZA [Media]/javascript/cesar-ch.js new file mode 100644 index 0000000000..f0aa3d24c8 --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/javascript/cesar-ch.js @@ -0,0 +1,39 @@ +/* + * ¡El nuevo "The Legend of Zelda: Tears of the Kingdom" ya está disponible! + * + * Crea un programa que dibuje una Trifuerza de "Zelda" + * formada por asteriscos. + * - Debes indicarle el número de filas de los triángulos con un entero positivo (n). + * - Cada triángulo calculará su fila mayor utilizando la fórmula 2n-1. + * + * Ejemplo: Trifuerza 2 + * + * * + * *** + * * * + * *** *** + * + */ + + function drawTrifuerza(n) { + let trifuerza = '' + + for (let i = 0; i < 2 * n; i++) { + if (i < n) { + trifuerza += ' '.repeat(((2 * n) - 1) - i) + trifuerza += '*'.repeat((2 * (i + 1)) - 1) + } else { + trifuerza += ' '.repeat(((2 * n) - 1) - i) + trifuerza += '*'.repeat((2 * (i - n + 1)) - 1) + trifuerza += ' '.repeat((2 * (2 * n - i)) - 1) + trifuerza += '*'.repeat((2 * (i - n + 1)) - 1) + } + trifuerza += '\n' + + } + + return trifuerza +} + + +console.log(drawTrifuerza(3)); \ No newline at end of file diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/python/Engleonardorm7.py b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/Engleonardorm7.py new file mode 100644 index 0000000000..37baaa98b3 --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/Engleonardorm7.py @@ -0,0 +1,29 @@ +# * ¡El nuevo "The Legend of Zelda: Tears of the Kingdom" ya está disponible! +# * +# * Crea un programa que dibuje una Trifuerza de "Zelda" +# * formada por asteriscos. +# * - Debes indicarle el número de filas de los triángulos con un entero positivo (n). +# * - Cada triángulo calculará su fila mayor utilizando la fórmula 2n-1. +# * +# * Ejemplo: Trifuerza 2 +# * +# * * +# * *** +# * * * +# * *** *** +# * + +def dibujar_trifuerza(n): + fila_mayor = 2 * n + + for i in range(1, n + 1): + text = "*" * (2 * i - 1) + text = text.center(fila_mayor * 2) + print(text) + + for i in range(1, n + 1): + text = "*" * (2 * i - 1) + text = text.center(fila_mayor) + text = text * 2 + print(text) +dibujar_trifuerza(7) diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/python/Lemito66.py b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/Lemito66.py new file mode 100644 index 0000000000..af1d5d7b4e --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/Lemito66.py @@ -0,0 +1,34 @@ +''' +/* + * ¡El nuevo "The Legend of Zelda: Tears of the Kingdom" ya está disponible! + * + * Crea un programa que dibuje una Trifuerza de "Zelda" + * formada por asteriscos. + * - Debes indicarle el número de number_of_triangles de los triángulos con un entero positivo (number_of_triangles). + * - Cada triángulo calculará su fila mayor utilizando la fórmula 2n-1. + * + * Ejemplo: Trifuerza 2 + * + * * + * *** + * * * + * *** *** + * + */ +''' + + +def triforce(number_of_triangles: int): + + output = [] + for row in range(1, number_of_triangles+1): + output.append(' '*(number_of_triangles*2-row) + '*'*(2 * row-1)) + + for row in range(1, number_of_triangles+1): + output.append(' '*(number_of_triangles-row) + '*'*(2 * row-1) + ' ' * + (number_of_triangles-row) + ' '*(number_of_triangles-row+1) + '*'*(2 * row-1)) + return output + + +for i in triforce(2): + print(i) diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/python/LilyMilano.py b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/LilyMilano.py new file mode 100644 index 0000000000..ccd4cb2770 --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/LilyMilano.py @@ -0,0 +1,33 @@ +# /* +# * ¡El nuevo "The Legend of Zelda: Tears of the Kingdom" ya está disponible! +# * +# * Crea un programa que dibuje una Trifuerza de "Zelda" +# * formada por asteriscos. +# * - Debes indicarle el número de filas de los triángulos con un entero positivo (n). +# * - Cada triángulo calculará su fila mayor utilizando la fórmula 2n-1. +# * +# * Ejemplo: Trifuerza 2 +# * +# * * +# * *** +# * * * +# * *** *** +# * +# */ + +def print_triforce(rows: int): + + for row in range(0, rows): + start_space = " " * (((2 * rows) - 1) - row) + print_row = "*" * ((2 * (row + 1)) - 1) + print(f"{start_space}{print_row}") + + for row in range(rows, rows * 2): + current_row = row - rows + start_space = " " * ((rows - current_row) - 1) + middle_space = " " * ((2 * (rows - current_row)) - 1) + print_row = "*" * ((2 * (current_row + 1)) - 1) + print(f"{start_space}{print_row}{middle_space}{print_row}") + +print_triforce(2) +print_triforce(5) \ No newline at end of file diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/python/fedecoronado.py b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/fedecoronado.py new file mode 100644 index 0000000000..fdb11c74fd --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/fedecoronado.py @@ -0,0 +1,36 @@ +'''/* + * ¡El nuevo "The Legend of Zelda: Tears of the Kingdom" ya está disponible! + * + * Crea un programa que dibuje una Trifuerza de "Zelda" + * formada por asteriscos. + * - Debes indicarle el número de filas de los triángulos con un entero positivo (n). + * - Cada triángulo calculará su fila mayor utilizando la fórmula 2n-1. + * + * Ejemplo: Trifuerza 2 + * + * * + * *** + * * * + * *** *** + * + */''' + +while True: + try: + tamaño = int(input("ingrese el tamaño: ")) + if tamaño > 0: + break + else: + print("Intente con un numero positivo") + except ValueError: + print("Intente con un numero") + +base_ind = 2 * tamaño - 1 +filas = tamaño * 2 +base_total = base_ind * 2 + 1 + +for i in range(0,tamaño): + print(" "*(base_ind - i) + "*"* (2*i+1)) +for i in range(0,tamaño): + print(" "*(tamaño - i-1) + "*"*(2*i+1) + " "*(base_ind - 2*i) + "*"*(2*i+1)) + diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/python/klimyflorez.py b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/klimyflorez.py new file mode 100644 index 0000000000..d2146f5f7d --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/klimyflorez.py @@ -0,0 +1,40 @@ +''' +/* + * ¡El nuevo "The Legend of Zelda: Tears of the Kingdom" ya está disponible! + * + * Crea un programa que dibuje una Trifuerza de "Zelda" + * formada por asteriscos. + * - Debes indicarle el número de number_of_triangles de los triángulos con un entero positivo (number_of_triangles). + * - Cada triángulo calculará su fila mayor utilizando la fórmula 2n-1. + * + * Ejemplo: Trifuerza 2 + * + * * + * *** + * * * + * *** *** + * + */ +''' +def print_trifuerza(n: int) -> None: + longitud = 2 * n + + for i in range(1, n + 1): + text = "*" * (2 * i - 1) + text = text.center(longitud * 2) + print(text) + + for i in range(1, n + 1): + text = "*" * (2 * i - 1) + text = text.center(longitud) + text = text * 2 + print(text) + + +def main(): + n = int(input("Ingrese el nivel de su Trifuerza: ")) + print_trifuerza(n) + + +if __name__ == "__main__": + main() diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/python/malopezrom.py b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/malopezrom.py new file mode 100644 index 0000000000..4608ed599e --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/python/malopezrom.py @@ -0,0 +1,54 @@ +# /* +# * ¡El nuevo "The Legend of Zelda: Tears of the Kingdom" ya está disponible! +# * +# * Crea un programa que dibuje una Trifuerza de "Zelda" +# * formada por asteriscos. +# * - Debes indicarle el número de filas de los triángulos con un entero positivo(n). +# * - Cada triángulo calculará su fila mayor utilizando la fórmula 2n-1. +# * +# * Ejemplo: Trifuerza 2 +# * +# * * +# * *** +# * * * +# * *** *** +# * +# */ + +# /** +# * Funcion que calcula e imprime la trifuerza de Zelda de form recursiva +# * @ param level Nivel de la trifuerza +# * @ param currentLevel Nivel actual de la trifuerza(por defecto 0) +# */ +def triforce_recursive(level, current_level=0): + if current_level == level * 2: + return + + row = "" + first_level = level * 2 - 1 + second_level = 0 + + if current_level < level: + row = " " * (first_level - current_level) + row += print_point(current_level) + else: + second_level = current_level - level + row = " " * ((level - second_level) - 1) + row += print_point(second_level) + row += " " * (2 * (level - second_level) - 1) + row += print_point(second_level) + + print(row) + + triforce_recursive(level, current_level + 1) + + +# /** +# * Función que imprime los puntos de la trifuerza +# * @ param level Nivel de la trifuerza +# */ +def print_point(level): + return "*" * (2 * level + 1) + + +triforce_recursive(7) diff --git a/Retos/Reto #20 - LA TRIFUERZA [Media]/typescript/zerchito.ts b/Retos/Reto #20 - LA TRIFUERZA [Media]/typescript/zerchito.ts new file mode 100644 index 0000000000..acbff9904e --- /dev/null +++ b/Retos/Reto #20 - LA TRIFUERZA [Media]/typescript/zerchito.ts @@ -0,0 +1,35 @@ +/* + * ¡El nuevo "The Legend of Zelda: Tears of the Kingdom" ya está disponible! + * + * Crea un programa que dibuje una Trifuerza de "Zelda" + * formada por asteriscos. + * - Debes indicarle el número de filas de los triángulos con un entero positivo (n). + * - Cada triángulo calculará su fila mayor utilizando la fórmula 2n-1. + * + * Ejemplo: Trifuerza 2 + * + * * + * *** + * * * + * *** *** + * + */ + { + function triforceDraw(floors: number): void { + const length: number = 2 * floors; + for (let level = 1; level <= floors; level++) { + let line: string = '*'.repeat(2 * level - 1); + const spaces = ' '.repeat((length + line.length /2 ) - line.length) + line = spaces + line; + console.log(line); + } + + for (let level = 1; level <= floors; level++) { + let line: string = '*'.repeat(2 * level - 1); + let spaces = ' '.repeat(floors - level); + line = spaces + line + spaces + spaces + ' ' + line; + console.log(line); + } + } + triforceDraw(9) +} \ No newline at end of file diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/c/fegorama.c" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/c/fegorama.c" index a6be7868d9..2b34ec9e9e 100644 --- "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/c/fegorama.c" +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/c/fegorama.c" @@ -1,20 +1,29 @@ #include #include +#include + +/* + * Crea un programa que encuentre y muestre todos los pares de números primos + * gemelos en un rango concreto. + * El programa recibirá el rango máximo como número entero positivo. + * + * - Un par de números primos se considera gemelo si la diferencia entre + * ellos es exactamente 2. Por ejemplo (3, 5), (11, 13) + * + * - Ejemplo: Rango 14 + * (3, 5), (5, 7), (11, 13) + */ int isPrime(int n) { if (n < 3 || n == 4) - { return 0; - } - int max = n / 2; + int max = sqrt(n) + 1; - for (int i=2; i < max; i++) - { + for (int i = 2; i < max; i++) if (n % i == 0) return 0; - } return 1; } @@ -31,18 +40,14 @@ int main(int args, char** argv) rg = atoi(argv[1]); - if (rg > 4) { - printf("(3, 5)"); - } else - return 0; - - for (int i=4; i <= rg; i++) { - if (isPrime(i)) { + for (int i = 3; i <= rg; i = i + 2) + { + if (isPrime(i)) + { diff = i - ant; - if (diff == 2) { - printf(", (%d, %d)", ant, i); - } + if (diff == 2) + printf("%s(%d, %d)", (i != 5 ? ", " : ""), ant, i); ant = i; } diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/dart/titoworlddev.dart" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/dart/titoworlddev.dart" new file mode 100644 index 0000000000..d7f5c98d28 --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/dart/titoworlddev.dart" @@ -0,0 +1,46 @@ +/* + * Crea un programa que encuentre y muestre todos los pares de números primos + * gemelos en un rango concreto. + * El programa recibirá el rango máximo como número entero positivo. + * + * - Un par de números primos se considera gemelo si la diferencia entre + * ellos es exactamente 2. Por ejemplo (3, 5), (11, 13) + * + * - Ejemplo: Rango 14 + * (3, 5), (5, 7), (11, 13) + */ + +void main() { + print(primeCouples(14)); + print(primeCouples(129)); +} + +String primeCouples(int range) { + int prePrime = 2; + String couple = ''; + List primeList = []; + + bool isPrime(int numero) { + if (numero <= 1) { + return false; + } + for (int i = 2; i < numero; i++) { + if (numero % i == 0) { + return false; + } + } + return true; + } + + for (int i = 2; i < range; i++) { + if (isPrime(i)) { + if (i == prePrime + 2) { + couple = '($prePrime, $i)'; + primeList.add(couple); + } + prePrime = i; + } + } + + return 'Rango $range\n ${primeList.join(', ')}'; +} diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/java/Cflorezp.java" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/java/Cflorezp.java" new file mode 100644 index 0000000000..5d5f95139b --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/java/Cflorezp.java" @@ -0,0 +1,95 @@ +package reto21PrimosGemelos; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/* + * Crea un programa que encuentre y muestre todos los pares de números primos + * gemelos en un rango concreto. + * El programa recibirá el rango máximo como número entero positivo. + * + * - Un par de números primos se considera gemelo si la diferencia entre + * ellos es exactamente 2. Por ejemplo (3, 5), (11, 13) + * + * - Ejemplo: Rango 14 + * (3, 5), (5, 7), (11, 13) + */ +public class Cflorezp { + + public static void main(String[] args) { + + System.out.println("\n************************************"); + System.out.println("Calculador de numeros primos Gemelos"); + System.out.println("************************************\n"); + System.out.println("Por favor ingrese el rango de numeros que desea: "); + Scanner init = new Scanner(System.in); + String value = init.nextLine(); + + if(validationOfNumber(value)){ + int number = Integer.valueOf(value); + if(number < 5){ + System.out.println("El rango es muy pequeño por lo que no hay primos gemelos"); + }else{ + printTwins(twinsPrimes(primes(number))); + } + } + + init.close(); + } + + public static List primes(int number){ + List primes = new ArrayList<>(); + for(int i = 3; i <= number; i++ ){ + if(isPrime(i)){ + primes.add(i); + } + } + return primes; + } + + public static boolean isPrime(int number){ + int count = 0; + for(int i = 2; i < number; i++){ + int result = 0; + result = number % i; + if(result == 0){ + count++; + } + if(count == 1){ + return false; + } + } + return true; + } + public static List twinsPrimes(List numbers){ + List twins = new ArrayList<>(); + int first = 0, second = 0; + for(int i = 0; i < numbers.size(); i++){ + first = numbers.get(i); + if((i + 1) < numbers.size()){ + second = numbers.get(i + 1); + if((first + 2) == second){ + twins.add(first); + twins.add(second); + } + } + } + return twins; + } + public static void printTwins(List numbers){ + for (int i = 0; i < numbers.size(); i += 2) { + int element1 = numbers.get(i); + int element2 = numbers.get(i + 1); + System.out.print("(" + element1 + ", " + element2 + "), "); + } + } + + public static boolean validationOfNumber(String number){ + if(!number.matches("[0-9]+")){ + System.out.println("El valor ingresado no es valido!!"); + return false; + } + return true; + } +} diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/java/LilyMilano.java" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/java/LilyMilano.java" new file mode 100644 index 0000000000..a012896907 --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/java/LilyMilano.java" @@ -0,0 +1,50 @@ +/* + * Crea un programa que encuentre y muestre todos los pares de números primos + * gemelos en un rango concreto. + * El programa recibirá el rango máximo como número entero positivo. + * + * - Un par de números primos se considera gemelo si la diferencia entre + * ellos es exactamente 2. Por ejemplo (3, 5), (11, 13) + * + * - Ejemplo: Rango 14 + * (3, 5), (5, 7), (11, 13) + */ + +import java.util.ArrayList; +import java.util.List; + +public class LilyMilano { + + public static void main(String[] args) { + + int max = 33; + + List> twins = getPrimeTwins(max); + + System.out.println(twins); // [[3, 5], [5, 7], [11, 13], [17, 19], [29, 31]] + + } + + public static List> getPrimeTwins(int max) { + + List> twins = new ArrayList<>(); + + for (int i = 2; i <= max; i++) { + if (isPrime(i) && isPrime(i + 2)) { + twins.add(List.of(i, i + 2)); + } + } + + return twins; + + } + + public static boolean isPrime(int num) { + if (num <= 1) return false; + for (int i = 2; i <= Math.sqrt(num); i++) { + if (num % i == 0) return false; + } + return true; + } + +} diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/java/asjordi.java" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/java/asjordi.java" new file mode 100644 index 0000000000..5b7d5a61c6 --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/java/asjordi.java" @@ -0,0 +1,34 @@ +import java.util.stream.IntStream; + +public class TwinPrimeNumbers { + + public static String calculate(int range){ + + StringBuilder res = new StringBuilder(); + int[] rangeOfNumbers = IntStream.rangeClosed(0, range).toArray(); + + + for (int num : rangeOfNumbers){ + int currentPlusTwo = num + 2; + if (isPrime(num) && isPrime(currentPlusTwo)) res.append("(").append(num).append(", ").append(currentPlusTwo).append(")\n"); + } + + return res.toString(); + + } + + public static boolean isPrime(int num) { + + if (num <= 1) return false; + + for (int i = 2; i <= Math.sqrt(num); i++) { + if (num % i == 0) return false; + } + + return true; + + } + + + +} diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/javascript/LauraCastrillonMp.js" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/javascript/LauraCastrillonMp.js" new file mode 100644 index 0000000000..0ed3e53a4e --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/javascript/LauraCastrillonMp.js" @@ -0,0 +1,38 @@ +/* +* Crea un programa que encuentre y muestre todos los pares de números primos +* gemelos en un rango concreto. +* El programa recibirá el rango máximo como número entero positivo. +* +* - Un par de números primos se considera gemelo si la diferencia entre +* ellos es exactamente 2. Por ejemplo (3, 5), (11, 13) +* +* - Ejemplo: Rango 14 +* (3, 5), (5, 7), (11, 13) +*/ + +function isPrime(number) { + if (number <= 1) { + return false + } + + for (let i = 2; i < Math.sqrt(number); i++) { + if (number % i == 0) { + return false + } + } + + return true +} + +function twinPrimes(rangeNumber) { + twinPrimes = [] + for (let i = 2; i < rangeNumber; i++) { + if (isPrime(i) && isPrime( i + 2)) { + twinPrimes.push([i, i + 2]) + } + } + return twinPrimes +} + +console.log(twinPrimes(14)) + diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/javascript/cesar-ch.js" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/javascript/cesar-ch.js" new file mode 100644 index 0000000000..171a4c1b49 --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/javascript/cesar-ch.js" @@ -0,0 +1,35 @@ +/* + * Crea un programa que encuentre y muestre todos los pares de números primos + * gemelos en un rango concreto. + * El programa recibirá el rango máximo como número entero positivo. + * + * - Un par de números primos se considera gemelo si la diferencia entre + * ellos es exactamente 2. Por ejemplo (3, 5), (11, 13) + * + * - Ejemplo: Rango 14 + * (3, 5), (5, 7), (11, 13) + */ + +function twinNumbers(max) { + let primeNumbers = [] + for (let i = 2; i <= max; i++) { + let isPrime = 0 + for (let j = 1; j <= i; j++) { + if (i % j === 0) { + isPrime++ + } + } + if (isPrime === 2) { + primeNumbers.push(i) + } + } + let twinNumbers = [] + for (let i = 0; i < primeNumbers.length; i++) { + if (primeNumbers[i + 1] - primeNumbers[i] === 2) { + twinNumbers.push(`(${primeNumbers[i]}, ${primeNumbers[i + 1]})`) + } + } + return twinNumbers +} + +console.log(twinNumbers(100)) \ No newline at end of file diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/Engleonardorm7.py" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/Engleonardorm7.py" new file mode 100644 index 0000000000..06dfcbc1e5 --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/Engleonardorm7.py" @@ -0,0 +1,31 @@ +# * Crea un programa que encuentre y muestre todos los pares de números primos +# * gemelos en un rango concreto. +# * El programa recibirá el rango máximo como número entero positivo. +# * +# * - Un par de números primos se considera gemelo si la diferencia entre +# * ellos es exactamente 2. Por ejemplo (3, 5), (11, 13) +# * +# * - Ejemplo: Rango 14 +# * (3, 5), (5, 7), (11, 13) + +def is_prime(n): + if n <= 1: + return False + for i in range(2, int(n**0.5) + 1): + if n % i == 0: + return False + return True + +def find_twin_primes(range_max): + twin_primes = [] + for n in range(2, range_max): + if is_prime(n) and is_prime(n + 2): + twin_primes.append((n, n + 2)) + return twin_primes + +range_max = int(input("Ingresa el rango máximo: ")) +twin_prime_pairs = find_twin_primes(range_max) + +print("Pares de números primos gemelos en el rango hasta", range_max, ":") +for pair in twin_prime_pairs: + print(pair) diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/Hugovrc.py" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/Hugovrc.py" new file mode 100644 index 0000000000..454d06a721 --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/Hugovrc.py" @@ -0,0 +1,20 @@ +def es_primo(num: int) -> bool: + if num <= 1: + return False + + for indice in range(2, num): + if num % indice == 0: + return False + + return True + +def primo_gemelo(num: int): + gemelos = "" + for indice in range(2, num): + if indice + 2 < num and es_primo(indice) and es_primo(indice + 2): + gemelos += f"({indice}, {indice + 2})" + + print(gemelos) + +primo_gemelo(25) +primo_gemelo(90) diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/JavierPerezManzanaro.py" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/JavierPerezManzanaro.py" new file mode 100644 index 0000000000..e018bed416 --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/JavierPerezManzanaro.py" @@ -0,0 +1,87 @@ +""" + /* + * Crea un programa que encuentre y muestre todos los pares de números primos + * gemelos en un rango concreto. + * El programa recibirá el rango máximo como número entero positivo. + * + * - Un par de números primos se considera gemelo si la diferencia entre + * ellos es exactamente 2. Por ejemplo (3, 5), (11, 13) + * + * - Ejemplo: Rango 14 + * (3, 5), (5, 7), (11, 13) + */ + +""" + +# Doctest +# python3 -m doctest -v "#21 Números primos gemelos.py" + + +import os + + +def es_primo(numero: int)->bool: + """Vemos si un número es primo o no + + Args: + numero (int): número a estudiar + + Returns: + bool: True si, False no lo es + + + >>> es_primo(3) + True + >>> es_primo(23) + True + >>> es_primo(4) + False + >>> es_primo(9) + False + """ + if numero == 1: + return False + for i in range(2, numero): + if (numero % i) == 0: + return False + return True + + +def primos_gemelos(rango: int)->list: + """Retorna la lista de los números primos que son gemelos + + Args: + rango (int): El rango que decide el cliente + + Returns: + list: La lista de tuplas con los números primos que son gemelos + + # https://elpais.com/ciencia/el-juego-de-la-ciencia/2023-01-27/primalidad.html# + # https://es.wikipedia.org/wiki/Número_primo_gemelo + + >>> primos_gemelos(100) + [(3, 5), (5, 7), (11, 13), (17, 19), (29, 31), (41, 43), (59, 61), (71, 73)] + >>> primos_gemelos(1000) + [(3, 5), (5, 7), (11, 13), (17, 19), (29, 31), (41, 43), (59, 61), (71, 73), (101, 103), (107, 109), (137, 139), (149, 151), (179, 181), (191, 193), (197, 199), (227, 229), (239, 241), (269, 271), (281, 283), (311, 313), (347, 349), (419, 421), (431, 433), (461, 463), (521, 523), (569, 571), (599, 601), (617, 619), (641, 643), (659, 661), (809, 811), (821, 823), (827, 829), (857, 859), (881, 883)] + """ + lista_primos_gemelos = [] + for numero in range(1, rango): + if es_primo(numero): + # es primo + + if es_primo(numero+2): + #print(f'{numero} -- {numero+2}') + tupla = (numero, numero+2) + lista_primos_gemelos.append(tupla) + return lista_primos_gemelos + + + + +if __name__ == '__main__': + os.system('clear') + import doctest + doctest.testmod(verbose=True) + + rango = int(input('El rango va desde el 1 hasta ¿Cual quieres que sea el límite? ')) + print(primos_gemelos(rango)) diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/Lemito66.py" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/Lemito66.py" new file mode 100644 index 0000000000..a08c93d1c6 --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/Lemito66.py" @@ -0,0 +1,46 @@ +""" +* Crea un programa que encuentre y muestre todos los pares de números primos + * gemelos en un rango concreto. + * El programa recibirá el rango máximo como número entero positivo. + * + * - Un par de números primos se considera gemelo si la diferencia entre + * ellos es exactamente 2. Por ejemplo (3, 5), (11, 13) + * + * - Ejemplo: Rango 14 + * (3, 5), (5, 7), (11, 13) + */ +""" + +def is_prime_twin(number: int ) -> bool: + if is_prime(number) and is_prime(number + 2): + return True + else: + return False + + +def is_prime(number: int) -> bool: + if number < 2: + return False + elif number == 2: + return True + elif number > 2 and number % 2 == 0: + return False + else: + for i in range(3, int(number**0.5) + 1, 2): + if number % i == 0: + return False + return True + +print(is_prime_twin(3)) +print(is_prime_twin(5)) +print(is_prime_twin(11)) +print(is_prime_twin(17)) +print(is_prime_twin(29)) +print(is_prime_twin(41)) +print('-------------------') +print(is_prime_twin(7)) +print(is_prime_twin(13)) +print(is_prime_twin(19)) +print(is_prime_twin(23)) +print(is_prime_twin(31)) +print(is_prime_twin(37)) diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/javierfiestasbotella.py" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/javierfiestasbotella.py" new file mode 100644 index 0000000000..6f88c309b4 --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/javierfiestasbotella.py" @@ -0,0 +1,22 @@ +'''/* + * Crea un programa que encuentre y muestre todos los pares de números primos + * gemelos en un rango concreto. + * El programa recibirá el rango máximo como número entero positivo. + * + * - Un par de números primos se considera gemelo si la diferencia entre + * ellos es exactamente 2. Por ejemplo (3, 5), (11, 13) + * + * - Ejemplo: Rango 14 + * (3, 5), (5, 7), (11, 13) + */''' +lista=[1,2,3,5,7,11] +rango=int(input('Introduzca el rango donde buscar: ')) +for i in range(rango): + solucion=[] + if i%2!=0 and i%3!=0 and i%5!=0 and i%7!=0 and i%11!=0 and i!=1: + lista.append(i) +for numero in range(len(lista)-1): + if lista[numero+1]-lista[numero]==2: + solucion.append((lista[numero],lista[numero+1])) +for tupla in solucion: + print(tupla, end=', ') \ No newline at end of file diff --git "a/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/klimyflorez.py" "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/klimyflorez.py" new file mode 100644 index 0000000000..ff161c9769 --- /dev/null +++ "b/Retos/Reto #21 - N\303\232MEROS PRIMOS GEMELOS [Media]/python/klimyflorez.py" @@ -0,0 +1,37 @@ +""" +* Crea un programa que encuentre y muestre todos los pares de números primos + * gemelos en un rango concreto. + * El programa recibirá el rango máximo como número entero positivo. + * + * - Un par de números primos se considera gemelo si la diferencia entre + * ellos es exactamente 2. Por ejemplo (3, 5), (11, 13) + * + * - Ejemplo: Rango 14 + * (3, 5), (5, 7), (11, 13) + */ +""" + +def is_prime(n): + if n <= 1: + return False + for i in range(2, int(n**0.5) + 1): + if n % i == 0: + return False + return True + +def find_twin_primes(start, end): + twin_primes = [] + for num in range(start, end): + if is_prime(num) and is_prime(num + 2): + twin_primes.append((num, num + 2)) + return twin_primes + +# Obtenemos el rango máximo del usuario +max_range = int(input("Ingrese el rango máximo: ")) + +# Encontramos los pares de números primos gemelos +result = find_twin_primes(3, max_range) + +# Mostramos los pares encontrados +for twin_prime in result: + print(twin_prime) \ No newline at end of file diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/c#/JonAFernan.cs b/Retos/Reto #22 - LA ESPIRAL [Media]/c#/JonAFernan.cs new file mode 100644 index 0000000000..a3d42904d5 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/c#/JonAFernan.cs @@ -0,0 +1,81 @@ +namespace Reto22; + +/* + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + * ════╗ + * ╔══╗║ + * ║╔╗║║ + * ║╚═╝║ + * ╚═══╝ + */ +class Program +{ + static void Main(string[] args) + { + DrawSpiral(12); + /* + ═══════════╗ + ╔═════════╗║ + ║╔═══════╗║║ + ║║╔═════╗║║║ + ║║║╔═══╗║║║║ + ║║║║╔═╗║║║║║ + ║║║║║╚╝║║║║║ + ║║║║╚══╝║║║║ + ║║║╚════╝║║║ + ║║╚══════╝║║ + ║╚════════╝║ + ╚══════════╝ + */ + + } + + + static void DrawSpiral(int size) + { + bool horizontal = true; + int spiralLength = size-1; + + if(size <=2) System.Console.WriteLine("Insert a value greater than two"); + + else + { + + for(int i = 0 ; i < size ; i++) + { + //System.Console.Write(i + " "); + for (int j = 0; j < size; j++) + { + if( i<=spiralLength/2 && j==spiralLength-i) + { + System.Console.Write('\u2557'); //╗ + horizontal = false; + } + else if (i>spiralLength/2 && j== i) + { + System.Console.Write('\u255D'); // ╝ + horizontal = false; + } + else if (i<=spiralLength/2 && i !=0 && j==i-1) + { + System.Console.Write('\u2554'); //╔ + horizontal=true; + } + else if (i>spiralLength/2 && j==spiralLength-i) + { + System.Console.Write('\u255A'); //╚ + horizontal = true; + } + else if(horizontal) Console.Write('\u2550'); //═ + else Console.Write('\u2551'); // ║ + } + + System.Console.WriteLine(); + } + } + } +} diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/c/fegorama.c b/Retos/Reto #22 - LA ESPIRAL [Media]/c/fegorama.c new file mode 100644 index 0000000000..044a45c152 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/c/fegorama.c @@ -0,0 +1,56 @@ +#include +#include + +/* + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + * ════╗ + * ╔══╗║ + * ║╔╗║║ + * ║╚═╝║ + * ╚═══╝ + */ + +void build_spiral(int n) +{ + for (int i = 1; i <= n; i++) + { + for (int j = 1; j <= n; j++) + { + if (j == (n + 1) - i && i < ((n + 1) / 2) + 1) + printf("%c", 187); // ╗ + else if (j == (i - 1) && (i > 1 && i <= (n + 1) / 2)) + printf("%c", 201); // ╔ + else if (j == i && (i > (n / 2) + 1)) + printf("%c", 188); // ╝ + else if ((j == (n + 1) - i) && (i > (n / 2) + 1)) + printf("%c", 200); // ╚ + else if ((j < i - 1 && j < n - (i - 2)) || (j > n - i && j > i - 1)) + printf("%c", 186); // ║ + else if (j <= n - i || j > n - (i - 1)) + printf("%c", 205); + else + printf(" "); + } + printf("\n"); + } +} + +int main(int args, char **argv) +{ + int n; + + if (args != 2) + { + printf("Indique el total de lados."); + return 1; + } + else + n = atoi(argv[1]); + + build_spiral(n); + return 0; +} diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/java/AnzurezDev.java b/Retos/Reto #22 - LA ESPIRAL [Media]/java/AnzurezDev.java new file mode 100644 index 0000000000..950d45e976 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/java/AnzurezDev.java @@ -0,0 +1,97 @@ +import java.util.Scanner; + +public class AnzurezDev { + public static void main( String args[] ) { + int option = 1; + Scanner reader = new Scanner( System.in ); + + while ( option>0 ) { + System.out.println( "Enter a number greater than one to set the spiral size or (0) to exit:" ); + option = reader.nextInt(); + + if ( option>1 ) + printSpiral( option ); + } + } + + public static void printSpiral( int size ) { + char spiral[][] = new char[size][size]; + int iterations = size/2 + 1; + int indexLeft = 0; + int indexRight = 0; + int from = 0; + int to = size; + char horizontal = '\u2550'; // ═ + char vertical = '\u2551'; // ║ + char topLeft = '\u2554'; // ╔ + char topRight = '\u2557'; // ╗ + char downLeft = '\u255A'; // ╚ + char downRight = '\u255D'; // ╝ + char value = '\u0020'; // Blank Space + + if ( size%2 == 0 ) + iterations = size/2; + + // Traverse array by rows + for ( int iteration=0; iteration=from; indexL-- ) { + value = horizontal; + indexLeft = to-1; + indexRight = indexL; + + if ( indexL==from ) + value = downLeft; + + spiral[indexLeft][indexRight] = value; + } + + // Fill data to up (↑) + for ( int indexU=to-2; indexU>from; indexU-- ) { + value = vertical; + indexLeft = indexU; + indexRight = from; + + if ( indexU==(from+1) ) + value = topLeft; + + spiral[indexLeft][indexRight] = value; + } + + from++; + to--; + } + + // Print full array + for ( int i=0; i= row) ? "╗" : "╚"; + horizontal = (column < row) ? true : false; + } else if (row - column == 1 && row <= (side / 2)) { + spiral += "╔"; + horizontal = true; + } else if (row == column && row >= (side / 2)) { + spiral += "╝"; + horizontal = false; + } else { + spiral += (horizontal) ? "═" : "║"; + } + } + System.out.println(spiral); + } + } + +} diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/java/eJimenezDel.java b/Retos/Reto #22 - LA ESPIRAL [Media]/java/eJimenezDel.java new file mode 100644 index 0000000000..3dbb299e77 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/java/eJimenezDel.java @@ -0,0 +1,73 @@ +import java.util.Scanner; + +/* + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + * ════╗ + * ╔══╗║ + * ║╔╗║║ + * ║╚═╝║ + * ╚═══╝ + */ +public class eJimenezDel { + + public static void main(String[] args) { + eJimenezDel reto22eJimenez = new eJimenezDel(); + try(Scanner input = new Scanner(System.in)){ + int max; + + System.out.print("Ingresa el tamaño del lado: "); + max = input.nextInt(); + + reto22eJimenez.printSpiral(max); + }catch(Exception e) { + e.printStackTrace(); + + + } + } + + private void printSpiral(int lado) { + int iniRow = 1; + int iniCol = 0; + int endRow = lado; + int endCol = lado+1; + + int nivel = lado-1; + + for (int i = 1; i <= lado; i++) { + + for (int j = 1; j <= lado; j++) { + + if(i==iniRow && j==endCol-1 && j>=i) + System.out.print( "╗"); + else if(j== iniCol && i==iniRow && j < endCol-1) + System.out.print("╔"); + else if(i==lado - nivel && j==1 + nivel) + System.out.print( "╚"); + else if(j==lado && i==lado || (j==lado-nivel && i==lado-nivel && i>endRow )) + System.out.print( "╝"); + else if(j>=iniCol && j=endCol && j<=iniCol ) + System.out.print("═"); + else + System.out.print("║"); + + } + + System.out.print( "\n"); + + iniCol++; + endCol--; + iniRow++; + endRow--; + nivel--; + + + } + + } + +} diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/java/josepmonclus.java b/Retos/Reto #22 - LA ESPIRAL [Media]/java/josepmonclus.java new file mode 100644 index 0000000000..f9b910df72 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/java/josepmonclus.java @@ -0,0 +1,123 @@ +/* + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + * ════╗ + * ╔══╗║ + * ║╔╗║║ + * ║╚═╝║ + * ╚═══╝ + */ + +public class josepmonclus { + + private static final String horizontal = "═"; + private static final String vertical = "║"; + private static final String topleft = "╔"; + private static final String topright = "╗"; + private static final String botleft = "╚"; + private static final String botright = "╝"; + + public static void main(String[] args) { + josepmonclus josepmonclus = new josepmonclus(); + + josepmonclus.doEspiral(2); + + josepmonclus.doEspiral(5); + + josepmonclus.doEspiral(10); + + josepmonclus.doEspiral(25); + } + + private void doEspiral(int lado) { + String[][] espiral = new String[lado][lado]; + + // Direccion puede ser R (to Right), L (to Left), T (to Top), B (to Bottom), empezamos en (0,0) hacia la derecha (R) + String direccion = "R"; + + int row = 0; + int col = 0; + + while(!isEspiralCompletada(espiral)) { + switch (direccion) { + case "R": + if (col + 1 == espiral.length || espiral[row][col + 1] != null) { + espiral[row][col] = topright; + direccion = "B"; + row++; + } else { + espiral[row][col] = horizontal; + col++; + } + + break; + case "B": + if (row + 1 == espiral.length || espiral[row + 1][col] != null) { + espiral[row][col] = botright; + direccion = "L"; + col--; + } else { + espiral[row][col] = vertical; + row++; + } + + break; + case "L": + if(col == 0 || espiral[row][col - 1] != null) { + espiral[row][col] = botleft; + direccion = "T"; + row--; + } else { + espiral[row][col] = horizontal; + col--; + } + + break; + case "T": + if(row == 0 || espiral[row - 1][col] != null) { + espiral[row][col] = topleft; + direccion = "R"; + col++; + } else { + espiral[row][col] = vertical; + row--; + } + break; + default: + break; + } + } + + printEspiral(espiral); + } + + private void printEspiral(String[][] espiral) { + for(int i = 0; i < espiral.length; i++) { + StringBuilder sb = new StringBuilder(); + + for(int j = 0; j < espiral.length; j++) { + sb.append(espiral[i][j]); + } + + System.out.println(sb); + } + } + + private boolean isEspiralCompletada(String[][] espiral) { + boolean isCompletada = true; + + for(int i = 0; i < espiral.length; i++) { + for(int j = 0; j < espiral.length; j++) { + if(espiral[i][j] == null) { + isCompletada = false; + break; + } + } + } + + return isCompletada; + } +} \ No newline at end of file diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/java/lz4n.java b/Retos/Reto #22 - LA ESPIRAL [Media]/java/lz4n.java new file mode 100644 index 0000000000..8e1401ab3d --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/java/lz4n.java @@ -0,0 +1,41 @@ +/* + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + * ════╗ + * ╔══╗║ + * ║╔╗║║ + * ║╚═╝║ + * ╚═══╝ + */ + +import java.util.Scanner; + +public class lz4n { + public static void main(String[] agrs) { + int longitudLado; + + //Pido la longitud del lado + System.out.print("Longitud del lado: "); + longitudLado = new Scanner(System.in).nextInt(); + + //Dibujo la espiral + System.out.println("═".repeat(longitudLado -1) + "╗"); + for (int fila = 0; longitudLado - 2 * fila -3 >= 0; fila++) { + System.out.println("║".repeat(fila) + + "╔" + + "═".repeat(longitudLado - 2 * fila -3) + + "╗" + + "║".repeat(fila +1)); + } + for (int fila = longitudLado / 2 -1; fila >= 0; fila--) { + System.out.println("║".repeat(fila) + + "╚" + + "═".repeat(longitudLado - 2 * fila -2) + + "╝" + + "║".repeat(fila)); + } + } +} diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/javascript/camiloPerezDussan.js b/Retos/Reto #22 - LA ESPIRAL [Media]/javascript/camiloPerezDussan.js new file mode 100644 index 0000000000..71f9a660b2 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/javascript/camiloPerezDussan.js @@ -0,0 +1,29 @@ +/* + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + * ════╗ + * ╔══╗║ + * ║╔╗║║ + * ║╚═╝║ + * ╚═══╝ + */ + +let espiral = size => { + let espiral = '═'.repeat(size - 1) + '╗' + for (let row = 1; row < size; row++) { + espiral += row < size / 2 ? + `\n${'║'.repeat(row - 1)}╔${'═'.repeat(size - (row * 2 + 1))}╗${'║'.repeat(row)}` : + `\n${'║'.repeat(size - row - 1)}╚${'═'.repeat(row * 2 - size)}╝${'║'.repeat(size - row - 1)}` + } + console.log(espiral) +}; + +espiral(1) +espiral(3) +espiral(5) +espiral(8) +espiral(10) +espiral(20) \ No newline at end of file diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/javascript/cesar-ch.js b/Retos/Reto #22 - LA ESPIRAL [Media]/javascript/cesar-ch.js new file mode 100644 index 0000000000..e9b7ed1a17 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/javascript/cesar-ch.js @@ -0,0 +1,31 @@ +/* + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + * ════╗ + * ╔══╗║ + * ║╔╗║║ + * ║╚═╝║ + * ╚═══╝ + */ + + +function drawSpiral(size) { + let spiral = '' + + spiral += '═'.repeat(size - 1) + '╗' + '\n' + + for (let i = 0; i < Math.ceil(size / 2) - 1; i++) { + spiral += '║'.repeat(i) + '╔' + '═'.repeat(size - 3 - (2 * i)) + '╗' + '║'.repeat(i + 1) + '\n' + } + + for (let i = Math.ceil(size / 2); i < size; i++) { + spiral += '║'.repeat(size - i - 1) + '╚' + '═'.repeat(2 * i - size) + '╝' + '║'.repeat(size - i - 1) + '\n' + } + + return spiral +} + +console.log(drawSpiral(3)) diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/javascript/diegomardev.js b/Retos/Reto #22 - LA ESPIRAL [Media]/javascript/diegomardev.js new file mode 100644 index 0000000000..61fa282964 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/javascript/diegomardev.js @@ -0,0 +1,44 @@ +//- Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ +function espiral(n) { + /* + (0,0),(0,1),(0,2),(0,3),(0,4) + (1,0),(1,1),(1,2),(1,3),(1,4) + (2,0),(2,1),(2,2),(2,3),(2,4) + (3,0),(3,1),(3,2),(3,3),(3,4) + (4,0),(4,1),(4,2),(4,3),(4,4) + */ + let espiral_tramo=""; + for(let Y=0; Y<=n-1; Y++){ + /* let espiral_tramo=""; */ + let vertical=true; + for(let X=0; X<=n-1; X++){ + if(X===Y-1 && Y=n/2){ + espiral_tramo = espiral_tramo+"╝" + vertical=true; + } + else if(Y===0){espiral_tramo = espiral_tramo+"═"} + else if(vertical){espiral_tramo = espiral_tramo+"║"} + else{ + espiral_tramo = espiral_tramo+"═" + vertical=false; + } + } + espiral_tramo = espiral_tramo+"\n"//ponemos retorno de carro para que pase a la siguiente fila + } + return espiral_tramo; +} +console.log(espiral(10)); \ No newline at end of file diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/kotlin/marchdz.kt b/Retos/Reto #22 - LA ESPIRAL [Media]/kotlin/marchdz.kt new file mode 100644 index 0000000000..7f002b0dc3 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/kotlin/marchdz.kt @@ -0,0 +1,17 @@ +fun drawSpiral(squareSideSize: Int) { + if (squareSideSize > 0) { + val firstHalfOfTheSquare = if (squareSideSize % 2 == 0) squareSideSize / 2 else squareSideSize / 2 + 1 + println("═".repeat(squareSideSize - 1) + "╗") + (1 until firstHalfOfTheSquare).forEach { row -> + println("║".repeat(row - 1) + "╔" + "═".repeat(squareSideSize - 2 * row - 1) + "╗" + "║".repeat(row)) + } + (firstHalfOfTheSquare until squareSideSize).forEach { row -> + println("║".repeat(squareSideSize - row - 1) + "╚" + "═".repeat(2 * row - squareSideSize) + "╝" + + "║".repeat(squareSideSize - row - 1)) + } + } +} + +fun main() { + drawSpiral(5) +} \ No newline at end of file diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/Bryan112094.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/Bryan112094.py new file mode 100644 index 0000000000..c7fba67003 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/Bryan112094.py @@ -0,0 +1,32 @@ +class spiral(): + def __init__(self, num: int): + self.lado = ["═", "╗", "║", "╝", "╚", "╔"] + self.num = num + self.mitad = (self.num + 1) // 2 + + def inicio(self): + if self.num > 1: + for x in range(self.mitad): + if x == 0: + print(f"{self.lado[0] * (self.num - 1)}{self.lado[1]}") + else: + print(f"{self.lado[2] * (x - 1)}{self.lado[5]}{self.lado[0] * (self.num - (x * 2) - 1)}{self.lado[1]}{self.lado[2] * x}") + for y in range(self.mitad, self.num): + print(f"{self.lado[2] * (self.num - (1 + y))}{self.lado[4]}{self.lado[0] * ((y * 2) - self.num)}{self.lado[3]}{self.lado[2] * (self.num - (1 + y))}") + else: + print("═") + +def main(): + try: + print("Dibujar Espiral") + numero = int(input("Ingrese el tamaño del lado: ")) + if numero > 0: + dibujo = spiral(numero) + dibujo.inicio() + else: + print("Ingrese números mayores a 0") + except: + print('Ingreses solo números enteros') + +if __name__=="__main__": + main() diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/ClarkCodes.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/ClarkCodes.py new file mode 100644 index 0000000000..32338455b2 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/ClarkCodes.py @@ -0,0 +1,263 @@ +""" +Retos Semanales ‘23 +Reto #22: LA ESPIRAL +MEDIA | Publicación: 29/05/23 | Resolución: 06/06/23 + + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + * ════╗ + * ╔══╗║ + * ║╔╗║║ + * ║╚═╝║ + * ╚═══╝ + * +""" + +# Autor: Clark - @ClarkCodes +# Fecha de Resolución: 04/06/2023 + +# Imports +import math +import typer +from rich import print +from enum import Enum + +# Constantes +HORIZONTAL_WAY = "═" +VERTICAL_WAY = "║" +UPPER_RIGHT_CORNER = "╗" +UPPER_LEFT_CORNER = "╔" +LOWER_RIGHT_CORNER = "╝" +LOWER_LEFT_CORNER = "╚" +EVEN_CORE = "╚╝" +ODD_CORE = "╔╗" +MIN_SIDE_LEN = 3 + +# Variables Globales +welcomePending = True + +# Enums +class PartType( Enum ): + TOP = 1 + BOT = 2 + +# Funciones - Métodos +def main_menu(): + global welcomePending + + if( welcomePending ): + print( "[green]\nBienvenido al Script de [yellow]La Espiral[/yellow], ¡vamos a dibujar una![/green] 😀" ) + welcomePending = False + else: + print( "[green]\n¿Dibujas otra?" ) + + print( "[green]\nA continuación debes ingresar un número entero positivo, como mínimo 2, o ingresa 'q' si deseas salir." ) + print( "[green]¿De cuantas unidades quieres que sea el lado mayor?\n" ) + +def is_even( number : int ): + if( number % 2 == 0 ): + return True + return False + +def print_line( line : str ): + print( f"[yellow]{line}" ) + +def core_row_drawer( side_len : int, is_sl_even : bool ): + core = "" + vert_cant = side_len - 2 # total vertical chars quantity around the core, it must be distributed + left_cant = 0 # cantidad de lineas verticales que deben dibujarse a la izquierda del core + right_cant = 0 # cantidad de lineas verticales que deben dibujarse a la derecha del core + + if( is_sl_even ): # En función de si side_len es par o no, se define el tipo de core que se necesita usar y cuantas lineas verticales debendibujarse a la izquierda y a la derecha + core = EVEN_CORE + left_cant = int( vert_cant / 2 ) + right_cant = left_cant + else: + core = ODD_CORE + left_cant = math.floor( vert_cant / 2 ) + right_cant = vert_cant - left_cant + + print_line( f"{VERTICAL_WAY * left_cant}{core}{VERTICAL_WAY * right_cant}" ) + +def parts_drawer( side_len : int, horizontal_cant : int, part_type : PartType ): + vert_cant = side_len - ( horizontal_cant + 2 ) # total vertical chars quantity around corners + left_cant = math.floor( vert_cant / 2 ) # cantidad de lineas verticales que deben dibujarse a la izquierda de la ezquina izquierda + right_cant = vert_cant - left_cant # cantidad de lineas verticales que deben dibujarse a la derecha de la ezquina derecha + left_corner = "" + right_corner = "" + + if( part_type == PartType.TOP ): # Se define que tipo de esquinas se necesitan usar dependiendo del tipo de parte + left_corner = UPPER_LEFT_CORNER + right_corner = UPPER_RIGHT_CORNER + elif( part_type == PartType.BOT ): + left_corner = LOWER_LEFT_CORNER + right_corner = LOWER_RIGHT_CORNER + + print_line( f"{VERTICAL_WAY * left_cant}{left_corner}{HORIZONTAL_WAY * horizontal_cant}{right_corner}{VERTICAL_WAY * right_cant}" ) + +def spiral_drawer( side_len : int ): + print( f"[yellow]-*-[/yellow] [green]Contemplad[/green] [yellow]¡LA ESPIRAL![/yellow] [green]con[/green] [yellow]{side_len}[/yellow] [green]unidades de filas y columnas[/green] [yellow]-*-[/yellow]\n" ) + + is_sl_even = is_even( side_len ) + core_row_index = int( side_len / 2 if is_sl_even else math.floor( side_len / 2 ) ) + 1 + horizontal_cant = side_len - 1 + + for row in range( 1, side_len + 1 ): # Rango entre 1 y side_len incluídos ambos extremos + if( row == 1 ): + print_line( f"{HORIZONTAL_WAY * ( side_len - 1 )}{UPPER_RIGHT_CORNER}" ) + + else: + if( row < core_row_index ): # Parte Superior antes del core + horizontal_cant -= 2 + parts_drawer( side_len, horizontal_cant, PartType.TOP ) + + elif( row == core_row_index ): + core_row_drawer( side_len, is_sl_even ) + + elif( row > core_row_index ): # Parte Inferior despues del core + if( horizontal_cant == 1 and is_sl_even ): + horizontal_cant += 1 + elif( horizontal_cant == 2 and not is_sl_even ): + horizontal_cant = 1 + + parts_drawer( side_len, horizontal_cant, PartType.BOT ) + horizontal_cant += 2 + +def main(): + print( "[bold green]\n*** Reto #22: LA ESPIRAL - By @ClarkCodes ***" ) + + while True: + main_menu() + + print( "[bold green]Número de unidades[/bold green]", end = "" ) + userAnswer = typer.prompt( "", default = str( MIN_SIDE_LEN ) ) + + if( userAnswer == 'q' or userAnswer == 'Q' ): # Condición de Salida + print( "[green]\n✅ Esto ha sido todo por hoy.\n❤ Muchas gracias por ejecutar este Script, hasta la próxima...💻 Happy Coding!,👋🏼 bye :D\n😎 Clark." ) + break + + try: + side_len = int( userAnswer ) # Se convierte la opcion ingresada por el usuario de texto a entero + + if( side_len >= MIN_SIDE_LEN ): + print( " " ) + spiral_drawer( side_len ) + + else: + print( "\n❌ Solo se admiten números enteros positivos mayores o iguales a 2, o la letra 'q' si deseas salir, verifique nuevamente." ) + + except ValueError as ve: + print( "\n❌ Opción ingresada no disponible, solo se admiten números enteros positivos mayores o iguales a 2, o la letra 'q' si deseas salir, verifique nuevamente." ) + print( ve.with_traceback() ) + except Exception as ex: + print( "\n❌ Oops... algo no ha salido bien, revise nuevamente por favor." ) + print( ex ) + +# Llamada a la Función Principal usando typer +if __name__ == "__main__": + typer.run( main ) + +''' +Análisis, Planificación y Explicación + + * Ejemplo espiral de lado 3 (3 filas y 3 columnas): + ══╗ + ╔╗║ + ╚═╝ + + * Ejemplo espiral de lado 4 (4 filas y 4 columnas): + ═══╗ + ╔═╗║ + ║╚╝║ + ╚══╝ + + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + ════╗ + ╔══╗║ + ║╔╗║║ + ║╚═╝║ + ╚═══╝ + +* Ejemplo espiral de lado 6 (6 filas y 6 columnas): + ═════╗ + ╔═══╗║ + ║╔═╗║║ + ║║╚╝║║ + ║╚══╝║ + ╚════╝ + +* Ejemplo espiral de lado 7 (7 filas y 7 columnas): + ══════╗ + ╔════╗║ + ║╔══╗║║ + ║║╔╗║║║ + ║║╚═╝║║ + ║╚═══╝║ + ╚═════╝ + +* Ejemplo espiral de lado 10 (10 filas y 10 columnas): + +*** Se observan los siguientes patrones: + +- Una espiral solo puede ser de mínimo 3 unidades ingresadas por el usuario, con un número menor +no se formaría una figura de espiral. + +- El core o núcleo de la espiral, el cual está en el centro de esta, siempre va dibujado de una +forma determinada dependiendo si el número de unidades requeridas por el usuario es par o es impar, +este core consta siempre de dos caracteres de esquinas, si n es par se dibuja así: ╚╝ y si n es impar, +se dibuja así ╔╗, por lo tanto, se lo puede almacenar en una constante para poder usarlo llegado el momento. + +- Cuando se dibuje la linea del centro de la espiral donde va el core, para determinar cual es la fila +donde este debe ir, coincide con que el core siempre está dibujado, dependiendo de si n es par o impar; +si n es par, está dibujado en la fila cuyo orden corresponde a ( n / 2 ) + 1, pero si es impar en cambio está dibujado +en la fila cuyo orden corresponde a math.floor( n / 2 ) + 1, es decir a n / 2 pero redondeado hacia el entero +inferior más próximo + 1. + +- Los caracteres que rodean al núcleo son siempre lineas verticales, es decir el caracter '║', la cantidad +de estos caracteres que hay que dibujar al rededor del núcleo se dividen en dos partes, la cantidad de +estos caracteres a la izquierda del núcleo y a la derecha de este, dado que n es la longitud de caracteres +en la fila, y el núcleo ocupa 2 caracteres, entonces lo restante son para las lineas verticales, es decir +la cantidad de lineas verticales que rodean al núcleo es n - 2, si n es par esta resta siempre va a ser par, y +por lo contrario si n es impar esta resta también siempre va a ser impar. +Si n es par, estas lineas verticales se distribuyen equitativamente e irian la misma cantidad en ambos lados, +es decir, a la izquierda y a la derecha irian la cantidad de caracteres ( n - 2 ) / 2 +si por otro lado, n es impar, dado que hay que dividir n - 2 para 2, entendiendo que n - 2 es impar, esto significa +que el resultado de esta división va a ser inexacto y va a dar como resultado un número decimal, un float, +entonces para distribuírlo al rededor del núcleo, tratando de buscar la mitad pero sin decimales, esto +resulta en una distribución inequitativa, entonces a la izquierda coincide que siempre va la cantidad menor +y a la derecha la cantidad mayor que más se acerque a la mitad, sin usar decimales y que sumando estas dos cantidades +den como resultado n - 2, entonces coincide que a la izquierda irian math.floor( ( n - 2 ) / 2 ) caracteres, esto es, +tomando el resultado decimal de ( n - 2 ) / 2 y aplicandole el método math.floor() para obtener el entero inferior +más próximo, es decir, redondeandolo hacia abajo, y para determinar la cantidad de caracteres que van a la derecha +se resta ( n - 2 ) - la cantidad de caracteres en la izquierda, es decir: ( n - 2 ) - math.floor( ( n - 2 ) / 2 ). +Los resultados de las operaciones que vamos realizando los podemos asignar a variables si se va a necesitar ese valor +posteriormente para no tener que realizar el calculo cada vez que se lo use, unicamente por motivos explicativos +y para evitar mayores enredos, los hemos puesto aquí de esta manera. + +- Se puede dividir la espiral en tres partes, parte superior, linea del core y parte inferior, excluyendo la +primera linea la cual no sigue el patrón de las demás dado que no tiene esquina superior izquierda. +Se considera parte superior a las lineas que estan después de la primera linea y antes de la linea del core. +Se considera parte inferior a todas las lineas que estan después del core, teniendo en cuenta que el total de +número de lineas incluyendo la primera debe ser igual a n, a n en el código se la llamará side_len, que +significa side length, o sea, longitud del lado, que quiere decir longitud de caracteres de ancho y lado +requerido por el usuario para la espiral. + +- Para dibujar las lineas de la parte superior, la cantidad de lineas horizontales entre las esquinas empieza en +n - 3 y va decrementandose en 2 en cada linea posterior. La cantidad de lineas verticales al rededor es igual a +n - ( cantidad de lineas horizontales + 2, por los caracteres las esquinas ), las cuales se distribuyen de forma +similar a la linea del core. +Coincide que a la cantidad de totales de lineas verticales que deben dibujarse las asignaremos a la variable vert_cant, +entonces a la izquierda deben dibujarse math.floor( vert_cant / 2 ) caracteres, se redondea también hacia abajo +vert_cant / 2, y a la derecha deben dibujarse vert_cant - los caracteres verticales de la izquierda. + +Se observa que si n es par, la cantidad de lineas horizontales entre las esquinas de la parte superior terminan +siempre en 1, mientras que si n es impar, terminan siempre en 2. + +- Para dibujar las lineas de la parte inferior es el mismo proceso que para dibujar la parte superior, pero se +dibujar las esquinas correspondientes a la parte inferior y también se observa que la cantidad de lineas +horizontales entre las esquinas, dependiendo de si n es par, empiezan en 2, y si n es impar empiezan en 1, y +van incrementandose en 2 en cada linea posterior hasta terminar la espiral. +''' diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/Engleonardorm7.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/Engleonardorm7.py new file mode 100644 index 0000000000..f58761b225 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/Engleonardorm7.py @@ -0,0 +1,31 @@ +# /* +# * Crea una función que dibuje una espiral como la del ejemplo. +# * - Únicamente se indica de forma dinámica el tamaño del size. +# * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ +# * +# * Ejemplo espiral de size 5 (5 filas y 5 columnas): +# * ════╗ +# * ╔══╗║ +# * ║╔╗║║ +# * ║╚═╝║ +# * ╚═══╝ +# */ + + +import math + + +def espiral(size): + superior = (math.ceil(size / 2)) + + for i in range(superior): + if (i == 0): + print(("═"*(size-1)) + "╗") + else: + print(("║"*(i-1)+ "╔" + "═"*(size - (2*i)-1)) + "╗" + "║"*i) + + for i in range(superior, size): + print("║"*(size-i-1)+ "╚" + "═"*((2*i)-size) + "╝" + "║"*(size-i-1)) + +size=int(input("Escribe el tamaño de la espiral")) +espiral(size) \ No newline at end of file diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/Hugovrc.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/Hugovrc.py new file mode 100644 index 0000000000..0500bb9e5f --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/Hugovrc.py @@ -0,0 +1,29 @@ +def dibuja_espiral(num): + + for fila in range (0, num): + spiral = "" + barra_horizontal = fila == 0 + for columna in range(0, num): + if fila + columna == num - 1: + if columna >= fila: + spiral += "╗" + barra_horizontal = False + else: + spiral += "╚" + barra_horizontal = True + elif fila - columna == 1 and fila < num / 2: + spiral += "╔" + barra_horizontal = True + elif fila == columna and fila > num / 2: + spiral += "╝" + barra_horizontal = False + else: + if barra_horizontal == True: + spiral += "═" + else: + spiral += "║" + + print(spiral) + +dibuja_espiral(9) +dibuja_espiral(5) \ No newline at end of file diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/alejandroklever.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/alejandroklever.py new file mode 100644 index 0000000000..fb5b58c993 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/alejandroklever.py @@ -0,0 +1,57 @@ +def spiral_matrix(n: int, is_first: bool = True) -> list[list[str]]: + if n <= 0: + return [] + + if n == 1: + return [["╗"]] + + if n == 2: + return [ + ["═", "╗"], + ["╚", "╝"] + ] + + matrix = [[" " for _ in range(n)] for _ in range(n)] + + # draw top + for i in range(n - 1): + matrix[0][i] = "═" + matrix[0][-1] = "╗" + + # draw right + for i in range(1, n - 1): + matrix[i][-1] = "║" + matrix[-1][-1] = "╝" + + # draw bottom + for i in range(n - 1): + matrix[-1][i] = "═" + matrix[-1][0] = "╚" + + # draw left + for i in range(2, n - 1): + matrix[i][0] = "║" + matrix[1][0] = "╔" + + submatrix = spiral_matrix(n - 2, is_first=False) + + # copy the submatrix into the matrix + for i in range(n-2): + for j in range(n-2): + matrix[i + 1][j + 1] = submatrix[i][j] + + return matrix + +def spiral_matrix_to_str(matrix: list[list[str]]) -> str: + return "\n".join(["".join(row) for row in matrix]) + +if __name__ == "__main__": + while True: + try: + n = int(input("Introduce el tamaño de la espiral: ")) + break + except ValueError: + print("No has introducido un número") + + s = spiral_matrix(n) + print(spiral_matrix_to_str(s)) diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/blackriper.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/blackriper.py new file mode 100644 index 0000000000..934e88594d --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/blackriper.py @@ -0,0 +1,28 @@ +from dataclasses import dataclass +import math + +@dataclass +class Spiral: + l:int + + def print_spiral(self): + uplad = (math.ceil(self.l / 2)) + + for i in range(uplad): + if (i == 0): + print(("═"*(self.l-1)) + "╗") + else: + print(("║"*(i-1)+ "╔" + "═"*(self.l - (2*i)-1)) + "╗" + "║"*i) + + for i in range(uplad, self.l): + print("║"*(self.l-i-1)+ "╚" + "═"*((2*i)-self.l) + "╝" + "║"*(self.l-i-1)) + + +def main(): + lad= int(input("Introduce un numero de lados de la espiral ")) + sp= Spiral(lad) + sp.print_spiral() + + +if __name__ == "__main__": + main() diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/drifterDev.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/drifterDev.py new file mode 100644 index 0000000000..66bdd4f215 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/drifterDev.py @@ -0,0 +1,76 @@ +def espiral(n): + espiral=[] + for i in range (n): + filaAdd=[] + for j in range (n): + filaAdd.append(0) + espiral.append(filaAdd) + orientacion="derecha" + fila=0 + topeIzq=0 + topeDer=n-1 + topeAbajo=n-1 + topeArr=1 + columna=0 + while True: + hizo=False + if orientacion=="derecha": + if espiral[fila][columna]==0 and topeDer>columna: + espiral[fila][columna]="═" + columna+=1 + hizo=True + elif espiral[fila][columna]==0: + espiral[fila][columna]="╗" + fila+=1 + orientacion="abajo" + topeDer-=1 + hizo=True + elif orientacion=="abajo": + if espiral[fila][columna]==0 and topeAbajo>fila: + espiral[fila][columna]="║" + fila+=1 + hizo=True + elif espiral[fila][columna]==0: + espiral[fila][columna]="╝" + columna-=1 + orientacion="izquierda" + topeAbajo-=1 + hizo=True + elif orientacion=="izquierda": + if espiral[fila][columna]==0 and topeIzq1: + break + n=int(input("Ingresa un numero valido (Mayor que 1): ")) + espiral(n) + +if __name__ == "__main__": + main() diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/fedecoronado.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/fedecoronado.py new file mode 100644 index 0000000000..f0ac195178 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/fedecoronado.py @@ -0,0 +1,29 @@ +def snake(n:int): + if n > 2: + symbol = ['═',"║","╗","╝","╔","╚"] + if n%2==0: + ciclos = int(n/2-1) + else: + ciclos = int(n/2-0.5) + print(symbol[0]*(n-1) + symbol[2]) + for i in range(1,ciclos+1): + print(symbol[1]*(i-1) + + symbol[4] + + symbol[0]*(n-i*2-1) + + symbol[2] + + symbol[1]*i) + if n%2==0: + print(symbol[1]*(ciclos) + + symbol[0] + + symbol[3] + + symbol[1]*(ciclos)) + for i in range(ciclos, 0,-1): + print(symbol[1]*(i-1) + + symbol[5] + + symbol[0]*(n-i*2) + + symbol[3] + + symbol[1]*(i-1)) + +for x in range(0,11): + print(x) + snake(x) diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/gonsomito.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/gonsomito.py new file mode 100644 index 0000000000..a68a657983 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/gonsomito.py @@ -0,0 +1,29 @@ +""" + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + * ═ ═ ═ ═ ╗ + * ╔ ═ ═ ╗ ║ + * ║ ╔ ╗ ║ ║ + * ║ ╚ ═ ╝ ║ + * ╚ ═ ═ ═ ╝ +""" +#cuando tengo un valor entero, compruebo que sea mayor que 1 para pintar, +#ya que estrictamente, una espiral de 1x1 podría ser un ".". +#Pinto la primera fila, y las sucesivas según corresponda. Mitad con codos abajo, mitad codos arriba +def espirulina(lines): + if lines > 1: + print("═ "*(lines-1)+"╗") + for l in range(1,lines-(lines//2)): + print("║ "*(l-1) + "╔ " + "═ "*(lines-(2*l) - 1) + "╗ " + "║ "*l) + for l in range(lines-(lines//2), lines): + print("║ "*(lines-l-1) + "╚ " + "═ "*(2*l-lines) + "╝ " + "║ "*((lines-l)-1)) + +#Pido tamaño de espiral y compruebo que me facilitan un entero. +lineas = input("Cual es el tamaño de la espiral: ") +if lineas.isdigit(): + espirulina(int(lineas)) +else: + print("No es un valor correcto. Me gustan las espirales de más grandes.") diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/ingjavierpinilla.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/ingjavierpinilla.py new file mode 100644 index 0000000000..f8a42551e0 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/ingjavierpinilla.py @@ -0,0 +1,39 @@ +def dibujar_espiral(lado): + matriz = [["║" for _ in range(lado)] for _ in range(lado)] + + for i, row in enumerate(matriz): + if i < lado // 2: + inicio = i + limite = len(row) - (i + 1) + else: + inicio = lado - (i + 1) + limite = len(row) - (inicio + 1) + + for j in range(inicio, limite): + row[j] = "═" + + if lado % 2 != 0: + if i <= lado // 2: # impar + row[-(i + 1)] = "╗" + row[(i - 1)] = "╔" if i > 0 else row[(i - 1)] + + else: + row[-(i + 1)] = "╚" + row[i] = "╝" + + else: + if i < lado // 2: # par + row[-(i + 1)] = "╗" + row[(i - 1)] = "╔" if i > 0 else row[(i - 1)] + else: + row[-(i + 1)] = "╚" + row[i] = "╝" + + for row in matriz: + print("".join(row)) + + +# Ejemplo de uso +for i in range(10): + print(f"i:{i} " + "**" * 20) + dibujar_espiral(i) diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/javierperezmanzanaro.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/javierperezmanzanaro.py new file mode 100644 index 0000000000..a8c0e74dee --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/javierperezmanzanaro.py @@ -0,0 +1,36 @@ +""" + /* + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + ════╗ + ╔══╗║ + ║╔╗║║ + ║╚═╝║ + ╚═══╝ + + + +""" +import math + +def espiral(longitud: int): + mitad = (math.ceil(longitud / 2)) + #* Primera mitad + print('═' * (longitud-1) + '╗') + for i in range(1, mitad): + print('║' * (i-1) + '╔' + '═' * (longitud-i-i-1) + '╗' + '║' * (i)) + #* segunda mitad + for i in range(mitad -2, -1 ,-1): + print('║' * (i) + '╚' + '═' * (longitud -2 -2*i) + '╝' + '║' * (i)) + +if __name__ == '__main__': + + #longitud = int(input('¿Caul es la anchura? ')) + espiral(10) + espiral(20) + espiral(6) + + diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/jpirulo.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/jpirulo.py new file mode 100644 index 0000000000..ffd99cce3d --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/jpirulo.py @@ -0,0 +1,38 @@ +from colorama import Fore, Style + +class Espiral: + def __init__(self, size): + self.size = size + self.matriz = [[' ' for _ in range(size)] for _ in range(size)] + + def draw_spiral(self): + for row in range(self.size): + spiral = "" + horizontal = row == 0 + for col in range(self.size): + if row + col == self.size - 1: + spiral += Fore.GREEN + "╗" if col >= row else Fore.RED + "╚" + horizontal = col < row + elif row - col == 1 and row < (self.size / 2): + spiral += Fore.BLUE + "╔" + horizontal = True + elif row == col and row >= (self.size / 2): + spiral += Fore.YELLOW + "╝" + horizontal = False + else: + spiral += Fore.CYAN + "═" if horizontal else Fore.MAGENTA + "║" + self.matriz[row] = spiral + + def imprimir_espiral(self): + for fila in self.matriz: + print(fila + Style.RESET_ALL) + + +if __name__ == "__main__": + try: + size = int(input("Ingrese el tamaño de la espiral: ")) + espiral = Espiral(size) + espiral.draw_spiral() + espiral.imprimir_espiral() + except ValueError: + print("El tamaño de la espiral debe ser un número entero.") diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/juanppdev.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/juanppdev.py new file mode 100644 index 0000000000..efcc7fee6a --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/juanppdev.py @@ -0,0 +1,49 @@ +def dibujar_espiral(lado): + matriz = [[' '] * lado for _ in range(lado)] + direccion = 0 + fila_inicio = 0 + fila_fin = lado - 1 + columna_inicio = 0 + columna_fin = lado - 1 + contador = 0 + + while fila_inicio <= fila_fin and columna_inicio <= columna_fin: + if direccion == 0: + for i in range(columna_inicio, columna_fin + 1): + if i == columna_fin: + matriz[fila_inicio][i] = '╗' + else: + matriz[fila_inicio][i] = '═' + fila_inicio += 1 + elif direccion == 1: + for i in range(fila_inicio, fila_fin + 1): + if i == fila_fin: + matriz[i][columna_fin] = '╝' + else: + matriz[i][columna_fin] = '║' + columna_fin -= 1 + elif direccion == 2: + for i in range(columna_fin, columna_inicio - 1, -1): + if i == columna_inicio: + matriz[fila_fin][i] = '╚' + else: + matriz[fila_fin][i] = '═' + fila_fin -= 1 + elif direccion == 3: + for i in range(fila_fin, fila_inicio - 1, -1): + if i == fila_inicio: + matriz[i][columna_inicio] = '╔' + else: + matriz[i][columna_inicio] = '║' + columna_inicio += 1 + + direccion = (direccion + 1) % 4 + + # Imprimir la matriz + for fila in matriz: + for elemento in fila: + print(elemento, end='') + print() + +# Ejemplo de uso +dibujar_espiral(5) diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/klimyflorez.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/klimyflorez.py new file mode 100644 index 0000000000..95faa56122 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/klimyflorez.py @@ -0,0 +1,31 @@ +""" + /* + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + ════╗ + ╔══╗║ + ║╔╗║║ + ║╚═╝║ + ╚═══╝ +""" +import math + +def espiral(longitud: int): + mitad = (math.ceil(longitud / 2)) + #* Primera mitad + print('═' * (longitud-1) + '╗') + for i in range(1, mitad): + print('║' * (i-1) + '╔' + '═' * (longitud-i-i-1) + '╗' + '║' * (i)) + #* segunda mitad + for i in range(mitad -2, -1 ,-1): + print('║' * (i) + '╚' + '═' * (longitud -2 -2*i) + '╝' + '║' * (i)) + +if __name__ == '__main__': + + #longitud = int(input('¿Caul es la anchura? ')) + espiral(5) + espiral(10) + espiral(15) \ No newline at end of file diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/klyone.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/klyone.py new file mode 100644 index 0000000000..4876a8859d --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/klyone.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 + +symbols = { + "h" : "═", + "v" : "║", + "d" : "╗", + "u" : "╔", + "D" : "╝", + "U" : "╚", +} + +def generate_spiral_from_side(n): + str = "" + seq_h = 0 + seq_v = 0 + horizontal = 1 + i = n-1 + + while i >= 0: + if horizontal == 1: + str += ("h" * i) + + if seq_h == 0: + str += "d" + seq_h = 1 + else: + seq_h = 0 + str += "U" + + horizontal = 0 + i = i - 1 + else: + str += ("v" * i) + + if seq_v == 0: + str += "D" + seq_v = 1 + else: + str += "u" + seq_v = 0 + horizontal = 1 + + return str + +def generate_spiral(n): + cursor = [0, 0] + spiral = [] + direction_v = 0 + direction_h = 0 + + str = generate_spiral_from_side(n) + + for s in str: + symb = symbols[s] + cur = cursor.copy() + spiral.append([symb, cur]) + + if s == "h": + if direction_h == 0: + cursor[1] = cursor[1] + 1 + else: + cursor[1] = cursor[1] - 1 + if s == "D": + direction_h = 1 + cursor[1] = cursor[1] - 1 + if s == "d": + direction_v = 0 + cursor[0] = cursor[0] + 1 + if s == "U": + direction_v = 1 + cursor[0] = cursor[0] - 1 + if s == "u": + direction_h = 0 + cursor[1] = cursor[1] + 1 + if s == "v": + if direction_v == 0: + cursor[0] = cursor[0] + 1 + else: + cursor[0] = cursor[0] - 1 + + return spiral + +def draw_spiral(spiral): + imax = -1 + jmax = -1 + + for s in spiral: + if s[1][0] > imax: + imax = s[1][0] + if s[1][1] > jmax: + jmax = s[1][1] + + spiral_str = [] + + for i in range(imax+1): + spiral_str.append("X" * (jmax+1)) + + for s in spiral: + symb = s[0] + pos = s[1] + + tmp = list(spiral_str[pos[0]]) + tmp[pos[1]] = symb + spiral_str[pos[0]] = "".join(tmp) + + for s in spiral_str: + print(s.replace("X", " ")) + +if __name__ == "__main__": + draw_spiral(generate_spiral(1)) + draw_spiral(generate_spiral(2)) + draw_spiral(generate_spiral(3)) + draw_spiral(generate_spiral(4)) + draw_spiral(generate_spiral(5)) + draw_spiral(generate_spiral(10)) + draw_spiral(generate_spiral(30)) diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/majinka10.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/majinka10.py new file mode 100644 index 0000000000..986ba5223a --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/majinka10.py @@ -0,0 +1,95 @@ +symbols=['═', '║', '╗', '╔', '╝', '╚'] + +def dibujaMatriz(m): + for i in range(len(m)): + for j in range(len(m[i])): + print(m[i][j], end="") + print() + +def espiral(lado:int): + matriz=[] + for _ in range(lado): + a = [0]*lado + matriz.append(a) + + if lado%2==0: + n=lado//2 + m=n-1 + for i in range(n): + matriz[n][m]=symbols[5] + matriz[m][n]=symbols[2] + matriz[n][n]=symbols[4] + matriz[i][i]=symbols[0] + n+=1 + m-=1 + n=lado//2 + m=n-1 + veces2=2 + veces1=1 + for j in range(n-1): + l=m + for k in range(veces2): + matriz[n+1][l]=symbols[0] + matriz[m-1][l]=symbols[0] + matriz[l][n+1]=symbols[1] + l+=1 + veces2+=2 + r=m+1 + for b in range(veces1): + matriz[r][m-1]=symbols[1] + a=b + r+=1 + veces1+=2 + n+=1 + m-=1 + matriz[j+1][j]=symbols[3] + + else: + n=(lado-1)//2 + m=n + for i in range(n+1): + matriz[m][n]=symbols[2] + n+=1 + m-=1 + n=(lado-1)//2 + m=n-1 + veces2=2 + veces1=1 + for k in range(n): + matriz[k+1][k]=symbols[3] + matriz[k][k]=symbols[0] + matriz[n+1][n+1]=symbols[4] + matriz[n+1][m]=symbols[5] + r=m+1 + o=m+1 + for g in range(veces1): + matriz[m][r]=symbols[0] + matriz[n+1][r]=symbols[0] + matriz[o][n+1]=symbols[1] + r+=1 + o+=1 + veces1+=2 + n+=1 + m-=1 + n=(lado-1)//2 + m=n-1 + veces2=2 + for b in range(n-1): + r=m+1 + for v in range(veces2): + matriz[r][m-1]=symbols[1] + r+=1 + veces2+=2 + n+=1 + m-=1 + + dibujaMatriz(matriz) + + +espiral(0) +espiral(1) +espiral(2) +espiral(3) +espiral(4) +espiral(20) +espiral(50) diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/mouredev.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/mouredev.py new file mode 100644 index 0000000000..44a2f942f1 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/mouredev.py @@ -0,0 +1,37 @@ +''' +Matriz 5 filas x 5 columnas +(0, 0) (0, 1) (0, 2) (0, 3) (0, 4) +(1, 0) (1, 1) (1, 2) (1, 3) (1, 4) +(2, 0) (2, 1) (2, 2) (2, 3) (2, 4) +(3, 0) (3, 1) (3, 2) (3, 3) (3, 4) +(4, 0) (4, 1) (4, 2) (4, 3) (4, 4) +''' + +def draw_spiral(size): + + for row in range(0, size): + spiral = "" + horizontal = row == 0 + for col in range(0, size): + if row + col == size - 1: + spiral += "╗" if col >= row else "╚" + horizontal = col < row + elif row - col == 1 and row < (size / 2): + spiral += "╔" + horizontal = True + elif row == col and row >= (size / 2): + spiral += "╝" + horizontal = False + else: + spiral += "═" if horizontal else "║" + + print(spiral) + + +draw_spiral(0) +draw_spiral(1) +draw_spiral(2) +draw_spiral(3) +draw_spiral(5) +draw_spiral(20) +draw_spiral(50) \ No newline at end of file diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/nlarrea.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/nlarrea.py new file mode 100644 index 0000000000..45fb874b97 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/nlarrea.py @@ -0,0 +1,117 @@ +""" + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + * ════╗ + * ╔══╗║ + * ║╔╗║║ + * ║╚═╝║ + * ╚═══╝ +""" + +SYMBOLS = { + "horizontal": "═", + "vertical": "║", + "corner_up_right": "╗", + "corner_up_left": "╔", + "corner_down_right": "╝", + "corner_down_left": "╚" +} + + +def draw_spiral(side): + if (side < 2): + print(f"Can't draw a {side}x{side} spiral.\n") + else: + spiral = generate_spiral(side) + + spiral_str = "" + for row in spiral: + spiral_str += "".join(row) + spiral_str += "\n" + + print(f"{side}x{side} spiral:\n" + spiral_str) + + +def generate_spiral(side): + half_spiral = int(side / 2) + + + def generate_half_spiral(corner_left, corner_right, is_down=False): + spiral = [] + + for row in range(half_spiral): + row_table = [] + for col in range(side): + if row == 0: + if (is_down and col == 0): row_table.append(corner_left) + elif (col == side-1): row_table.append(corner_right) + else: row_table.append(SYMBOLS["horizontal"]) + else: + if ((spiral[row-1][col] == SYMBOLS["horizontal"]) and + (spiral[row-1][col-1] == corner_left or + spiral[row-1][col-1] == corner_right)): + row_table.append(corner_left) + else: + row_table.append(SYMBOLS["vertical"]) + + if (spiral[row-1][col] == corner_right): + row_table[col-1] = corner_right + + if corner_left in row_table: + start = row_table.index(corner_left) + 1 + end = row_table.index(corner_right) + + for symbol in range(start, end): + row_table[symbol] = SYMBOLS["horizontal"] + + spiral.append(row_table) + + return spiral + + + # generate: upper half spiral + + spiral = generate_half_spiral( + SYMBOLS["corner_up_left"], + SYMBOLS["corner_up_right"] + ) + + # generate: middle row (only if side is odd) + + if (side % 2 != 0): + row_table = [] + + for _ in range(len(spiral) - 1): + row_table.append(SYMBOLS["vertical"]) + + row_table.append(SYMBOLS["corner_up_left"]) + row_table.append(SYMBOLS["corner_up_right"]) + + for _ in range(side - len(row_table)): + row_table.append(SYMBOLS["vertical"]) + + spiral.append(row_table) + + # generate: down half spiral + + down_spiral = generate_half_spiral( + SYMBOLS["corner_down_left"], + SYMBOLS["corner_down_right"], + True + ) + down_spiral.reverse() + + # complete spiral + + for row in down_spiral: + spiral.append(row) + + return spiral + + +draw_spiral(1) +draw_spiral(5) +draw_spiral(10) \ No newline at end of file diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/pakiuh.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/pakiuh.py new file mode 100644 index 0000000000..d5aa2cb2f7 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/pakiuh.py @@ -0,0 +1,93 @@ +""" + * Crea una función que dibuje una espiral como la del ejemplo. + * - Únicamente se indica de forma dinámica el tamaño del lado. + * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ + * + * Ejemplo espiral de lado 5 (5 filas y 5 columnas): + * ════╗ + * ╔══╗║ + * ║╔╗║║ + * ║╚═╝║ + * ╚═══╝ +""" + +n = int(input("Introduce el tamaño del lado: ")) +antes = 0 +durante = 0 +despues = 0 +mitad = n//2 +if n%2 == 0: + print("═"*(n)+"╗") + for i in range(mitad-1): + antes = i + durante =(n-2)-(2*i) + despues = i+1 + if antes < 0: + antes = 0 + if durante < 0: + durante = 0 + if despues < 0: + despues = 0 + #print(i,n) + print("║"*antes, + "╔", + "═"*durante, + "╗", + "║"*despues, + sep="") + + for i in range(1,mitad+1): + antes = mitad-i + durante =(2*i-1) + despues = mitad-i + if antes < 0: + antes = 0 + if durante < 0: + durante = 0 + if despues < 0: + despues = 0 + #print(i,n) + print("║"*antes, + "╚", + "═"*durante, + "╝", + "║"*despues, + sep="") + +if n%2 !=0: + print("═"*(n-1)+"╗") + for i in range(mitad): + antes = i + durante =(n-3)-(2*i) + despues = i+1 + if antes < 0: + antes = 0 + if durante < 0: + durante = 0 + if despues < 0: + despues = 0 + #print(i,n) + print("║"*antes, + "╔", + "═"*durante, + "╗", + "║"*despues, + sep="") + + for i in range(1,mitad+1): + antes = mitad-i + durante =(2*i-1) + despues = mitad-i + if antes < 0: + antes = 0 + if durante < 0: + durante = 0 + if despues < 0: + despues = 0 + #print(i,n) + print("║"*antes, + "╚", + "═"*durante, + "╝", + "║"*despues, + sep="") diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/pyramsd.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/pyramsd.py new file mode 100644 index 0000000000..a8938ad057 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/pyramsd.py @@ -0,0 +1,15 @@ +import math + +def espiral(size): + first_line = math.ceil(size / 2) + + for i in range(first_line): + if i == 0: + print(("=" * (size-1)) + "╗") + else: + print(("║" * (i-1) + "╔" + "=" * (size - (2*i) - 1)) + "╗" + "║" * i) + + for i in range(first_line, size): + print("║" * (size-i-1) + "╚" + "=" * ((2*i) - size) + "╝" + "║" * (size-i-1)) + +espiral(5) diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/techpere.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/techpere.py new file mode 100644 index 0000000000..278a6d321a --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/techpere.py @@ -0,0 +1,44 @@ +# * Crea una función que dibuje una espiral como la del ejemplo. +# * - Únicamente se indica de forma dinámica el tamaño del lado. +# * - Símbolos permitidos: ═ ║ ╗ ╔ ╝ ╚ +# * +# * Ejemplo espiral de lado 5 (5 filas y 5 columnas): +# * ════╗ +# * ╔══╗║ +# * ║╔╗║║ +# * ║╚═╝║ +# * ╚═══╝ +# */ +def dibujar_espiral(lado): + matriz = [[' '] * lado for _ in range(lado)] + + fila_inicio = 0 + fila_fin = lado - 1 + columna_inicio = 0 + columna_fin = lado - 1 + direccion = 0 + + while fila_inicio <= fila_fin and columna_inicio <= columna_fin: + if direccion == 0: + for i in range(columna_inicio, columna_fin + 1): + matriz[fila_inicio][i] = '═' + fila_inicio += 1 + elif direccion == 1: + for i in range(fila_inicio, fila_fin + 1): + matriz[i][columna_fin] = '║' + columna_fin -= 1 + elif direccion == 2: + for i in range(columna_fin, columna_inicio - 1, -1): + matriz[fila_fin][i] = '═' + fila_fin -= 1 + elif direccion == 3: + for i in range(fila_fin, fila_inicio - 1, -1): + matriz[i][columna_inicio] = '║' + columna_inicio += 1 + + direccion = (direccion + 1) % 4 + + for fila in matriz: + print(''.join(fila)) +lado = 5 +dibujar_espiral(lado) \ No newline at end of file diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/python/ycanas.py b/Retos/Reto #22 - LA ESPIRAL [Media]/python/ycanas.py new file mode 100644 index 0000000000..4878765337 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/python/ycanas.py @@ -0,0 +1,20 @@ +import math + +def draw_spiral(n): + half = math.ceil(n / 2) + + for i in range(half): + if i == 0: + print('═' * (n - 1) + '╗') + + else: + print('║' * (i - 1) + '╔' + '═' * (n - 2 * i - 1) + '╗' + '║' * i) + + for i in range(n - half): + print('║' * (n - half - i - 1) + '╚' + '═' * ((n % 2) + 2 * i) + '╝' + '║' * (n - half - i - 1)) + + +draw_spiral(2) +draw_spiral(5) +draw_spiral(8) +draw_spiral(11) diff --git a/Retos/Reto #22 - LA ESPIRAL [Media]/swift/franpua.swift b/Retos/Reto #22 - LA ESPIRAL [Media]/swift/franpua.swift new file mode 100644 index 0000000000..f4c49a79a6 --- /dev/null +++ b/Retos/Reto #22 - LA ESPIRAL [Media]/swift/franpua.swift @@ -0,0 +1,19 @@ +import Foundation + +func spiral(size: Int) { + + let superior = size % 2 != 0 ? Int((Double((size + 1) / 2))) : size / 2 + for index in 0.. { + const medio = Math.ceil(n / 2); + let espiral = `${Bloque.BAS.repeat(n - 1)}${Bloque.ESD}\n`; + + for (let y = 1; y < medio; y++) { + espiral += Bloque.LAT.repeat(y - 1) + espiral += `${Bloque.ESI}${Bloque.BAS.repeat(n - (2 * y) - 1)}${Bloque.ESD}` + espiral += `${Bloque.LAT.repeat(y)}\n` + } + for (let y = medio; y < n; y++) { + espiral += Bloque.LAT.repeat(n - y - 1) + espiral += `${Bloque.EII}${Bloque.BAS.repeat((2 * y) - n)}${Bloque.EID}` + espiral += `${Bloque.LAT.repeat(n - y - 1)}\n`; + } + console.log(espiral); + // console.log(espiral.slice(0, -1).split('\n').map(l => l.split(''))) +}; +reto(5); \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/JonAFernan.cs b/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/JonAFernan.cs new file mode 100644 index 0000000000..5244e3d7fa --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/JonAFernan.cs @@ -0,0 +1,63 @@ +using System; +using MySql.Data.MySqlClient; + +namespace Reto23; + +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + + +class Program +{ + static void Main() + { + string connectionString = + "Server=mysql-5707.dinaserver.com; Database=moure_test;Uid=mouredev_read;Pwd=mouredev_pass"; + + GetDataFromServer(connectionString); + Console.ReadKey(); + + } + + private static void GetDataFromServer(string connectionString) + { + string queryString = "SELECT * FROM challenges"; + + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + try + { + MySqlCommand command = new MySqlCommand(queryString, connection); + connection.Open(); + Console.WriteLine("conected"); + + MySqlDataReader reader = command.ExecuteReader(); + + while (reader.Read()) + { + for (int i = 0; i < reader.FieldCount; i++) Console.Write(reader.GetString(i) + " | "); + + Console.WriteLine(); + } + + connection.Close(); + } + + catch(MySqlException e) + { + Console.WriteLine($"Error code: {e.Code}-{e.Message}"); + } + } + } +} \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/OcroDev.cs b/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/OcroDev.cs new file mode 100644 index 0000000000..18409f81cb --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/OcroDev.cs @@ -0,0 +1,68 @@ +// See https://aka.ms/new-console-template for more information +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente + * base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + +using MySql.Data.MySqlClient; + +namespace OcroDev; + +public class Program +{ + static void Main(string[] args) + { + string connectionString = @" + server=mysql-5707.dinaserver.com; + port=3306; + user=mouredev_read; + password=mouredev_pass; + database=moure_test; + "; + + MySqlConnection connection = new(connectionString); + try + { + connection.Open(); + + string query = "SELECT * FROM challenges"; + + MySqlCommand command = new MySqlCommand(query, connection); + MySqlDataReader reader = command.ExecuteReader(); + Console.WriteLine("["); + while (reader.Read()) + { + string id = reader.GetString("id"); + string name = reader.GetString("name"); + string difficulty = reader.GetString("difficulty"); + string date = reader.GetString("date"); + Console.WriteLine(" RowDataPacket{"); + Console.WriteLine($" id:{id},"); + Console.WriteLine($" name:{name},"); + Console.WriteLine($" difficulty:{difficulty},"); + Console.WriteLine($" date:{date}"); + Console.WriteLine(" }"); + } + Console.WriteLine("]"); + + reader.Close(); + + connection.Close(); + } + + catch(Exception ex) + { + Console.WriteLine(ex.ToString()); + } + } +}; diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/borazuwarah.cs b/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/borazuwarah.cs new file mode 100644 index 0000000000..933c60e75b --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/borazuwarah.cs @@ -0,0 +1,56 @@ +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + +using System; +using MySql.Data.MySqlClient; + + +namespace Reto23 +{ + internal class Program + { + static void Main(string[] args) + { + Connection(); + Console.ReadKey(); + + } + public static void Connection() + { + string connectionString = "server=mysql-5707.dinaserver.com;user=mouredev_read;database=moure_test;password=mouredev_pass;"; + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + + string query = "SELECT * FROM challenges;"; + + using (MySqlCommand command = new MySqlCommand(query, connection)) + { + using (MySqlDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + string column0Value = reader.GetString(0); + string column1Value = reader.GetString(1); + string column2Value = reader.GetString(2); + string column3Value = reader.GetString(3); + + Console.WriteLine($"Column1: {column0Value}, Column2: {column1Value}, Column2: {column2Value}, Column2: {column3Value}"); + } + } + } + } + } + } +} diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/malopezrom.cs b/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/malopezrom.cs new file mode 100644 index 0000000000..b74db60c44 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/c#/malopezrom.cs @@ -0,0 +1,122 @@ +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + +using System; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using MySql.Data.MySqlClient; + + +namespace retosProgramacion2023 +{ + + /** + * Clase que representa una conexión a una base de datos MySQL + * + */ + public class MySQLConnection + { + private string connectionString; + private MySqlConnection connection; + /** + * Constructor de la clase + * @param host + * @param port + * @param user + * @param password + * @param database + */ + + public MySQLConnection(string host,int port, string user, string password, string database) + { + connectionString = $"server={host};user={user};database={database};port={port};password={password};"; + this.connection = new MySqlConnection(connectionString); + } + + public bool Connect() + { + try + { + connection.Open(); + return true; + } + catch (Exception e) + { + Console.WriteLine(e.Message); + return false; + } + + + } + public void Close() + { + connection.Close(); + } + /** + * Funcion que realiza una consulta a la base de datos y devuelve una promesa con el resultado + * @returns Promise Promesa con el resultado de la consulta + * @param query Consulta a realizar + */ + public List> Query(string query) + { + List> result = new List>(); + try + { + MySqlCommand command = new MySqlCommand(query, connection); + MySqlDataReader reader = command.ExecuteReader(); + while (reader.Read()) + { + Dictionary row = new Dictionary(); + for (int i = 0; i < reader.FieldCount; i++) + { + row.Add(reader.GetName(i), reader.GetValue(i)); + } + result.Add(row); + } + reader.Close(); + return result; + } + catch (Exception e) + { + Console.WriteLine(e.Message); + return result; + } + + } + + } + + class Program + { + static void Main(string[] args) + { + + MySQLConnection connection = new MySQLConnection("mysql-5707.dinaserver.com", 3306, "mouredev_read", "mouredev_pass", "moure_test"); + if(connection.Connect()) + { + List> result = connection.Query("SELECT * FROM `challenges`"); + foreach (Dictionary row in result) + { + foreach (KeyValuePair column in row) + { + Console.WriteLine($"{column.Key} : {column.Value}"); + } + Console.WriteLine("--------------------------------------------------"); + } + connection.Close(); + } + } + + } +} \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/c/fegorama.c b/Retos/Reto #23 - LA BASE DE DATOS [Media]/c/fegorama.c new file mode 100644 index 0000000000..882e5839fe --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/c/fegorama.c @@ -0,0 +1,82 @@ +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + * + * ------------------------------------------------------------------------------- + * Compilar con GCC y MariaDB Connector/C: + * gcc .\reto23_mysql.c -o .\reto23_mysql.exe \ + * -I"C:\Program Files\MariaDB\MariaDB Connector C 64-bit\include" \ + * -L"C:\Program Files\MariaDB\MariaDB Connector C 64-bit\lib" \ + * -l libmariadb + * ------------------------------------------------------------------------------- + */ +#include "C:/Program Files/MariaDB/MariaDB Connector C 64-bit/include/mysql.h" +#include +#include + +#define CHALLENGES_FIELD_ID 0 +#define CHALLENGES_FIELD_NAME 1 +#define CHALLENGES_FIELD_DIFFICULTY 2 +#define CHALLENGES_FIELD_DATE 3 + +int main() +{ + MYSQL *conn; + MYSQL_RES *res; + MYSQL_ROW row; + + /* Configuration */ + const char *host = "mysql-5707.dinaserver.com"; + const char *user = "mouredev_read"; + const char *password = "mouredev_pass"; + const char *database = "moure_test"; + const int port = 3306; + + /* Initialize connection */ + if ((conn = mysql_init(NULL)) == NULL) + { + fprintf(stderr, "Initializing error: %s", mysql_error(conn)); + exit(1); + } + + /* Connect to database */ + if (!mysql_real_connect(conn, host, user, password, + database, port, NULL, 0)) + { + fprintf(stderr, "%s\n", mysql_error(conn)); + exit(1); + } + + /* send SQL query */ + if (mysql_query(conn, "SELECT * FROM `challenges`")) + { + fprintf(stderr, "%s\n", mysql_error(conn)); + exit(1); + } + + res = mysql_use_result(conn); + + /* output table name */ + printf("Result of query:\n"); + + while ((row = mysql_fetch_row(res)) != NULL) + printf("%s %s, %s, %s\n", row[CHALLENGES_FIELD_ID], + row[CHALLENGES_FIELD_NAME], + row[CHALLENGES_FIELD_DIFFICULTY], + row[CHALLENGES_FIELD_DATE]); + + /* close connection */ + mysql_free_result(res); + mysql_close(conn); + + return 0; +} \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/dart/malopezrom.dart b/Retos/Reto #23 - LA BASE DE DATOS [Media]/dart/malopezrom.dart new file mode 100644 index 0000000000..6e0077e3e6 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/dart/malopezrom.dart @@ -0,0 +1,82 @@ +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + +import 'package:mysql1/mysql1.dart'; + +/** + * Clase que representa una conexión a una base de datos MySQL + * + */ +class MySQLConnector{ + String host; + int port; + String user; + String password; + String database; + MySqlConnection? connection; + + + + MySQLConnector({required this.host, required this.port,required this.user, required this.password,required this.database}); + + Future connect() async{ + + try{ + connection = await MySqlConnection.connect(ConnectionSettings( + host: host, + port: port, + user: user, + db: database, + password: password)); + }catch(e){ + print(e); + } + + } + + Future disconnect() async{ + try{ + await connection!.close(); + }catch(e){ + print(e); + } + } + /** + * Funcion que realiza una consulta a la base de datos y devuelve una promesa con el resultado + * @returns Promise Promesa con el resultado de la consulta + * @param query Consulta a realizar + */ + Future>> query(String query) async{ + List> list = []; + try{ + await connect(); + final results = await connection?.query(query); + for(var row in results?.toList() ?? []){ + list.add(row.fields); + } + return list; + }catch(e){ + print(e); + return list; + } + } +} + +void main() async{ + final connection = MySQLConnector(host: 'mysql-5707.dinaserver.com', port: 3306, user: 'mouredev_read', password: 'mouredev_pass', database: 'moure_test'); + await connection.query('SELECT * FROM `challenges`').then((value) { + print(value); + }); + connection.disconnect(); +} \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/ejercicio.md b/Retos/Reto #23 - LA BASE DE DATOS [Media]/ejercicio.md new file mode 100644 index 0000000000..508d537635 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/ejercicio.md @@ -0,0 +1,25 @@ +# Reto #23: La base de datos +#### Dificultad: Media | Publicación: 06/06/23 | Corrección: 12/06/23 + +## Enunciado + +``` +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ +``` +#### Tienes toda la información extendida sobre los retos de programación semanales en **[retosdeprogramacion.com/semanales2023](https://retosdeprogramacion.com/semanales2023)**. + +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/Retos/Reto #23 - LA BASE DE DATOS [Media]/go/KevinED11.go b/Retos/Reto #23 - LA BASE DE DATOS [Media]/go/KevinED11.go new file mode 100644 index 0000000000..84b1b87cea --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/go/KevinED11.go @@ -0,0 +1,60 @@ +package main + +import ( + "database/sql" + "fmt" + _ "github.com/go-sql-driver/mysql" +) + +type Challenge struct { + Id int + Name string + Difficulty string + Date string +} + +func printTableData() { + fmt.Println("connecting with MySql database") + source := "mouredev_read:mouredev_pass@(mysql-5707.dinaserver.com)/moure_test" + + db, err := sql.Open("mysql", source) + if err != nil { + panic(err.Error()) + } + defer db.Close() + + results, err := db.Query("SELECT * FROM challenges") + if err != nil { + panic(err.Error()) + } + + defer results.Close() + + columns, err := results.Columns() + if err != nil { + panic(err.Error()) + } + fmt.Println(columns) + + listRows := []Challenge{} + for results.Next() { + var challenge Challenge + err := results.Scan(&challenge.Id, &challenge.Name, + &challenge.Difficulty, &challenge.Date) + if err != nil { + panic(err.Error()) + } + listRows = append(listRows, challenge) + + fmt.Printf("%+v\n", challenge) + } + + fmt.Println(listRows) + +} + +func main() { + go printTableData() + var name string + fmt.Scan(&name) +} diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/go/blackriper.go b/Retos/Reto #23 - LA BASE DE DATOS [Media]/go/blackriper.go new file mode 100644 index 0000000000..111a9756ea --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/go/blackriper.go @@ -0,0 +1,78 @@ +package main + +import ( + "database/sql" + "fmt" + _ "github.com/go-sql-driver/mysql" + "time" +) + +/* + 1.-Creamos modulo de go con go mod init nombre_del_modulo + 2.-Instalamos driver go de mysql go get -u github.com/go-sql-driver/mysql + 3.-No o olviden agregar la linea _ "github.com/go-sql-driver/mysql en el import de lo contrario no recnocera el driver mysql" + 4.-Happy coding +*/ + +// creamos una interface para los diferentes metodos de interaccion con la base de datos +type Database interface { + ConnectDatabase() + GetChallengs() []Challenge +} + +// creamos tipos de datos para la informacion que proviene de la base de datos +type Challenge struct { + ID int + Name string + Difficulty string + Date time.Time +} + +// implementando interface +type Sql struct { + DB *sql.DB +} + +func (sq *Sql) ConnectDatabase() { + db, err := sql.Open("mysql", "mouredev_read:mouredev_pass@tcp(mysql-5707.dinaserver.com:3306)/moure_test?parseTime=true") + + if err != nil { + panic(err.Error()) + } + sq.DB = db +} + +func (sq *Sql) GetChallengs() []Challenge { + var challenges []Challenge + + res, err := sq.DB.Query("SELECT * FROM challenges") + defer res.Close() + + if err != nil { + panic(err.Error()) + } + + for res.Next() { + var ch Challenge + err := res.Scan(&ch.ID, &ch.Name, &ch.Difficulty, &ch.Date) + if err != nil { + panic(err.Error()) + } + challenges = append(challenges, ch) + } + defer sq.DB.Close() + return challenges +} + +// funcion para imprimir datos +func PrintChallenges() { + var db Database = &Sql{} + db.ConnectDatabase() + for _, ch := range db.GetChallengs() { + fmt.Printf("%v | %v | %v | %v \n", ch.ID, ch.Name, ch.Difficulty, ch.Date) + } +} + +func main() { + PrintChallenges() +} diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/AnzurezDev.java b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/AnzurezDev.java new file mode 100644 index 0000000000..24150073d2 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/AnzurezDev.java @@ -0,0 +1,43 @@ +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +public class AnzurezDev { + private static String URL = "JDBC:mysql://mysql-5707.dinaserver.com:3306/moure_test?serverTimezone=UTC"; + private static String USER = "mouredev_read"; + private static String PASS = "mouredev_pass"; + private static String JDBC = "com.mysql.cj.jdbc.Driver"; + private static String QUERY = "SELECT * FROM challenges"; + + public static void main(String[] args) { + Connection connection = null; + Statement statement = null; + ResultSet resultSet = null; + + try { + connection = DriverManager.getConnection( URL, USER, PASS ); + Class.forName( JDBC ); + statement = connection.createStatement(); + resultSet = statement.executeQuery( QUERY ); + + while ( resultSet.next() ) { + System.out.println( resultSet.getInt(1) + "\t" + resultSet.getString(2) + "\t" + resultSet.getString(3) + "\t" + resultSet.getString(4) ); + } + } catch ( Exception e ) { + e.printStackTrace(); + } finally { + try { + if ( resultSet != null ) + resultSet.close(); + if ( statement != null ) + statement.close(); + if ( connection != null ) + connection.close(); + } catch ( SQLException e ) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/Cflorezp.java b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/Cflorezp.java new file mode 100644 index 0000000000..ddc6819d45 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/Cflorezp.java @@ -0,0 +1,66 @@ +package reto23baseDatos; + +import java.sql.*; + +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ +public class Cflorezp { + + public static void main(String[] args) { + String url = "jdbc:mysql://mysql-5707.dinaserver.com:3306/moure_test"; + String usuario = "mouredev_read"; + String contraseña = "mouredev_pass"; + + + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + + Connection conexion = DriverManager.getConnection(url, usuario, contraseña); + + Statement statement = conexion.createStatement(); + + String consulta = "SELECT * FROM challenges"; + ResultSet resultado = statement.executeQuery(consulta); + + ResultSetMetaData metaData = resultado.getMetaData(); + int columnCount = metaData.getColumnCount(); + + System.out.println("\n-------------------------------------"); + System.out.println("DATOS TABLA 'CHALLENGES'"); + System.out.println("-------------------------------------"); + while (resultado.next()) { + for (int i = 1; i <= columnCount; i++) { + String columnName = metaData.getColumnName(i); + String value = resultado.getString(i); + System.out.println(columnName + ": " + value); + } + System.out.println("-------------------------------------"); + } + + resultado.close(); + statement.close(); + conexion.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} + + + + + + + + diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/Qv1ko.java b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/Qv1ko.java new file mode 100644 index 0000000000..398ba350eb --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/Qv1ko.java @@ -0,0 +1,43 @@ +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class Qv1ko { + + public static void main(String[] args) { + + Connection con = null; + java.sql.Statement stmt = null; + ResultSet rs = null; + + try { + Class.forName("com.mysql.jdbc.Driver"); + con = DriverManager.getConnection("jdbc:mysql://mysql-5707.dinaserver.com:3306/moure_test", "mouredev_read", "mouredev_pass"); + stmt = con.createStatement(); + rs = stmt.executeQuery("SELECT * FROM `challenges`"); + while (rs.next()) { + System.out.println(rs.getString("id") + ". " + rs.getString("name") + " (" + rs.getString("difficulty") + ") - " + rs.getString("date")); + } + con.close(); + } catch (Exception exc) { + exc.printStackTrace(); + } finally { + try { + if(rs != null) { + rs.close(); + } + if(stmt != null) { + stmt.close(); + } + if(con != null) { + con.close(); + } + } catch (SQLException exc) { + exc.printStackTrace(); + } + } + + } + +} diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/algama12.java b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/algama12.java new file mode 100644 index 0000000000..36585193c6 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/algama12.java @@ -0,0 +1,44 @@ +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +public class algama12 { + + public static void main(String[] args) { + + String url = "jdbc:mysql://mysql-5707.dinaserver.com:3306/moure_test"; + String usuario = "mouredev_read"; + String contra = "mouredev_pass"; + + Connection connection = null; + Statement statement = null; + ResultSet resultSet = null; + + try { + connection = DriverManager.getConnection(url, usuario, contra); + + statement = connection.createStatement(); + + resultSet = statement.executeQuery("SELECT * FROM challenges"); + + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String challengeName = resultSet.getString("name"); + System.out.println("ID: " + id + ", Name: " + challengeName); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + // Cerrar los recursos + try { + if (resultSet != null) resultSet.close(); + if (statement != null) statement.close(); + if (connection != null) connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } +} diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/asjordi.java b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/asjordi.java new file mode 100644 index 0000000000..1cf217f239 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/asjordi.java @@ -0,0 +1,37 @@ +import java.sql.*; +import java.util.Date; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Database { + + public static void main(String[] args) { + + String url = "jdbc:mysql://mysql-5707.dinaserver.com:3306/moure_test"; + Properties props = databaseProperties(); + + try (Connection c = DriverManager.getConnection(url, props); + Statement stmt = c.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM challenges")) { + while (rs.next()){ + int id = rs.getInt("id"); + String name = rs.getString("name"); + String difficulty = rs.getString("difficulty"); + Date date = rs.getDate("date"); + System.out.println("id: " + id + " name: " + name + " difficulty: " + difficulty + " date: " + date +"\n"); + } + } catch (SQLException e) { + Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, e); + } + + } + + private static Properties databaseProperties(){ + Properties p = new Properties(); + p.setProperty("user", "mouredev_read"); + p.setProperty("password", "mouredev_pass"); + return p; + } + +} diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/eJimenezDel.java b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/eJimenezDel.java new file mode 100644 index 0000000000..58f71edfec --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/eJimenezDel.java @@ -0,0 +1,103 @@ +import java.sql.Connection; +import java.sql.Date; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; + +public class eJimenezDel { + + private final String DB="moure_test"; + private final String URL="jdbc:mysql://mysql-5707.dinaserver.com:3306/"+DB+"?serverTimezone=UTC"; + private final String USER="mouredev_read"; + private final String PASS="mouredev_pass"; + + public static void main(String[] args) { + eJimenezDel reto23eJimenez = new eJimenezDel(); + + reto23eJimenez.printTable(reto23eJimenez.getChallenges()); + + + } + + private void printTable(Listlista) { + lista.forEach(challenge-> { + System.out.println(MessageFormat.format("| {0} | {1} | {2} | {3} |", + challenge.getId(), challenge.getName(), challenge.getDifficulty(),challenge.getDate()).toString()); + + }); + } + + + + public List getChallenges() { + + List challenges = new ArrayList(); + try(Connection connection = DriverManager.getConnection(URL,USER,PASS)){ + + try(Statement statement = connection.createStatement()){ + + try(ResultSet resultSet = statement.executeQuery("SELECT * FROM challenges")){ + while(resultSet.next()){ + + int id = resultSet.getInt("id"); + String challengeName = resultSet.getString("name"); + String challengeDifficulty = resultSet.getString("difficulty"); + Date challengeDate = resultSet.getDate("date"); + Challenge challenge = new Challenge(); + challenge.setId(id); + challenge.setName(challengeName); + challenge.setDifficulty(challengeDifficulty); + challenge.setDate(challengeDate); + + challenges.add(challenge); + + } + } + } + + }catch( SQLException ex){ + System.out.println("error "+ex.getMessage()); + return new ArrayList(); + } + return challenges; + + } + + +} + +class Challenge{ + private int id; + private String name; + private String difficulty; + private Date date; + public String getDifficulty() { + return difficulty; + } + public void setDifficulty(String description) { + this.difficulty = description; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + +} diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/jesusWay69.java b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/jesusWay69.java new file mode 100644 index 0000000000..e27b02fce5 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/jesusWay69.java @@ -0,0 +1,119 @@ +package reto_23; + +import java.sql.*; + + +/* + * + * @author jesus + * + * + * + * + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente + * base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ +public class jesusWay { + + + + public static void main(String[] args) { + + + String url = "jdbc:mysql://mysql-5707.dinaserver.com:3306/moure_test"; + String usuario = "mouredev_read"; + String clave = "mouredev_pass"; + try { + Connection conexion = DriverManager.getConnection(url, usuario, clave); + PreparedStatement ps = null; + String query = "SELECT * FROM challenges"; + try { + ps = conexion.prepareStatement(query); + ResultSet rs = ps.executeQuery(); + System.out.printf("%3s %30s %-10s %10s\n", "ID", " NAME " + , "DIFFICULTY", " DATE "); + System.out.printf("%3s %30s %-10s %10s\n", "**", "********************************" + , "**********", "**********"); + //System.out.print(rs); + while (rs.next()) { + int id = rs.getInt(1); + String name = rs.getString(2); + String difficulty = rs.getString(3); + String date = rs.getString(4); + Model m = new Model(id, name, difficulty, date); + System.out.printf("%3d %-32s %-10s %-15s\n", id, name, difficulty, date); + } + conexion.close(); + } catch (SQLException ex1) { + System.out.println("ERROR SELECT: " + ex1); + + } + + } catch (SQLException ex) { + System.out.println("ERROR CONNECTION: " + ex); + + } + + } + +} + + class Model { + + private int id; + private String name; + private String difficulty; + private String date; + + public Model(int id, String name , String difficulty, String date){ + this.id =id; + this.name= name; + this.difficulty=difficulty; + this.date=date; + + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDifficulty() { + return difficulty; + } + + public void setDifficulty(String difficulty) { + this.difficulty = difficulty; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + } + diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/josepmonclus.java b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/josepmonclus.java new file mode 100644 index 0000000000..faf68e0db5 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/java/josepmonclus.java @@ -0,0 +1,90 @@ +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + +public class josepmonclus { + + private static final String MYSQL_URL = "jdbc:mysql://mysql-5707.dinaserver.com:3306/moure_test"; + private static final String MYSQL_USER = "mouredev_read"; + private static final String MYSQL_PASS = "mouredev_pass"; + + public static void main(String[] args) { + josepmonclus josepmonclus = new josepmonclus(); + + List challenges = josepmonclus.getChallenges(); + + for(Challenge c : challenges) { + System.out.println(c.toString()); + } + } + + private List getChallenges() { + List challenges = new ArrayList<>(); + + try { + Class.forName("com.mysql.jdbc.Driver"); + Connection con = DriverManager.getConnection( + MYSQL_URL, + MYSQL_USER, + MYSQL_PASS); + + Statement stmt = con.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM `challenges`"); + + while (rs.next()) { + Challenge challenge = new Challenge( + rs.getInt("id"), + rs.getString("name"), + rs.getString("difficulty"), + new Date(rs.getDate("date").getTime())); + challenges.add(challenge); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return challenges; + } + + public class Challenge { + int id; + String name; + String difficulty; + Date date; + + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); + + public Challenge(int id, String name, String difficulty, Date date) { + this.id = id; + this.name = name; + this.difficulty = difficulty; + this.date = date; + } + + // Getters & setters... + + @Override + public String toString() { + return id + " | " + name + " | " + difficulty + " | " + sdf.format(date); + } + } +} diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/HectorMartinDama.js b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/HectorMartinDama.js new file mode 100644 index 0000000000..b2f105c667 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/HectorMartinDama.js @@ -0,0 +1,19 @@ +const mysql= require('mysql'); + +const connection= mysql.createConnection({ + host: 'mysql-5707.dinaserver.com', + port: '3306', + user: 'mouredev_read', + password: 'mouredev_pass', + database: 'moure_test' +}); + +connection.connect(); + +connection.query('SELECT * FROM challenges', (error, rows) =>{ + if (error) throw error; + let results = Object.values(JSON.parse(JSON.stringify(rows))); + results.forEach(challenge => {console.log(challenge.id, challenge.name, challenge.difficulty, challenge.date)}); +}); + +connection.end(); \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/OcroDev.js b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/OcroDev.js new file mode 100644 index 0000000000..d8eeb4fed3 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/OcroDev.js @@ -0,0 +1,31 @@ +import mysql from 'mysql' + +const connection = mysql.createConnection({ + host: 'mysql-5707.dinaserver.com', + user:'mouredev_read', + password: 'mouredev_pass', + database: 'moure_test' +}) + +connection.connect() +connection.query('SELECT * FROM challenges', (err, row) => { + if (err) throw err + console.log(row) +}) +connection.end() + + +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente + * base de datos MySQL: + ? - Host: mysql-5707.dinaserver.com + ? - Port: 3306 + ? - User: mouredev_read + ? - Password: mouredev_pass + ? - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/cesar-ch.js b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/cesar-ch.js new file mode 100644 index 0000000000..97850673cc --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/cesar-ch.js @@ -0,0 +1,41 @@ +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + +import { createConnection } from 'mysql' + +let connection = createConnection({ + host: 'mysql-5707.dinaserver.com', + port: 3306, + user: 'mouredev_read', + password: 'mouredev_pass', + database: 'moure_test' +}) + +connection.connect() + +connection.query('SELECT * FROM `challenges`', (err, rows, fields) => { + if (err) throw err; + let result = JSON.parse(JSON.stringify(rows)) + + console.log('-----------------------------------------------------------------------------------------') + console.log(' ID | NAME | DIFFICULT | DATE ') + result.map(e => { + console.log('-------------------------------------------------------------------------------------') + console.log(` ${e.id} | ${e.name} | ${e.difficulty} | ${e.date}`) + console.log('-------------------------------------------------------------------------------------') + }) +}) + + +connection.end(); \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/jmedinac1987.js b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/jmedinac1987.js new file mode 100644 index 0000000000..31d3729620 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/jmedinac1987.js @@ -0,0 +1,39 @@ +/* +Para que funcione se debe tener instalado Node.js y el siguiente recurso: + "mysql": "^2.15.0", +*/ +const mysql = require("mysql"); + +function startConnection() { + return mysql.createConnection({ + host: "mysql-5707.dinaserver.com", + user: "mouredev_read", + password: "mouredev_pass", + database: "moure_test", + port: 3306, + }); +} + +function getInformation() { + try { + const connection = startConnection(); + + let sql = "SELECT * FROM challenges"; + + connection.query(sql, (err, row) => { + if (err) { + console.log(err); + return; + } else { + console.table(row); + return; + } + }); + + connection.end(); + } catch (error) { + console.log(error); + } +} + +getInformation(); diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/marcode24.js b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/marcode24.js new file mode 100644 index 0000000000..a924ab2e8a --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/marcode24.js @@ -0,0 +1,42 @@ +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + +const mysql = require('mysql'); + +const connection = mysql.createConnection({ + host: 'mysql-5707.dinaserver.com', + user: 'mouredev_read', + password: 'mouredev_pass', + database: 'moure_test', +}); + +connection.connect(); + +connection.query('SELECT * FROM challenges', (error, results) => { + if (error) throw error; + console.table(results); + // ┌─────────┬────┬───────────────────────────────┬────────────┬──────────────────────────┐ + // │ (index) │ id │ name │ difficulty │ date │ + // ├─────────┼────┼───────────────────────────────┼────────────┼──────────────────────────┤ + // │ 0 │ 1 │ 'EL FAMOSO "FIZZ BUZZ"' │ 'Fácil' │ 2022-12-26T06:00:00.000Z │ + // │ 1 │ 2 │ 'EL "LENGUAJE HACKER"' │ 'Fácil' │ 2023-01-02T06:00:00.000Z │ + // │ 2 │ 3 │ 'EL PARTIDO DE TENIS' │ 'Media' │ 2023-01-09T06:00:00.000Z │ + // │ 3 │ 4 │ 'EL GENERADOR DE CONTRASEÑAS' │ 'Media' │ 2023-01-16T06:00:00.000Z │ + // │ 4 │ 5 │ 'PRIMO, FIBONACCI Y PAR' │ 'Media' │ 2023-01-23T06:00:00.000Z │ + // └─────────┴────┴───────────────────────────────┴────────────┴──────────────────────────┘ +}); + +connection.end(); + +// Visita mi repo en GitHub para ver y correr los tests de este código --> https://github.com/marcode24/weekly-challenges diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/nlarrea.js b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/nlarrea.js new file mode 100644 index 0000000000..bb4437b5c4 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/nlarrea.js @@ -0,0 +1,44 @@ +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + +import mysql from 'mysql'; + +const host = 'mysql-5707.dinaserver.com'; +const user = 'mouredev_read'; +const password = 'mouredev_pass'; +const database = 'moure_test'; + +const conn = mysql.createConnection({ + host, + user, + password, + database +}); + +conn.connect(); + +conn.query('SELECT * FROM challenges', function (error, results) { + if (error) throw error; + + results.forEach(result => { + let day = result.date.getDate() >= 10 ? result.date.getDate() : '0'+result.date.getDate(); + let month = (result.date.getMonth() + 1) >= 10 ? (result.date.getMonth() + 1) : '0'+String(result.date.getMonth() + 1); + let year = result.date.getFullYear(); + let formatDate = `${day}-${month}-${year}`; + + console.log(`${result.id}. ${result.name} (${result.difficulty}) - ${formatDate}`); + }); +}); + +conn.end(); \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/othamae.js b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/othamae.js new file mode 100644 index 0000000000..26da5062f1 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/othamae.js @@ -0,0 +1,50 @@ +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + +const mysql = require('mysql'); + + +const connection = mysql.createConnection({ + user: 'mouredev_read', + host: 'mysql-5707.dinaserver.com', + database: 'moure_test', + password: 'mouredev_pass', + port: 3306, + }) + +connection.connect((error)=>{ + if (error){ + console.log('Unable to connect to the database: ',error) + } else{ + console.log('Connection has been established.') + } + }) + +connection.query('SELECT * FROM `challenges`', function (error, results) { + if (error){ + console.log('Error to query: ',error) + } + else{ + console.log('Query results: ',results) + } +}) + +connection.end((error)=>{ + if (error){ + console.log('Error to end: ',error) + } else{ + console.log('Connection has been closed.') + } +}) + diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/varkoms.js b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/varkoms.js new file mode 100644 index 0000000000..a1e7fcf3f2 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/javascript/varkoms.js @@ -0,0 +1,44 @@ +const mysql = require("mysql"); + +// Crear la conexion a la base de datos +const connection = mysql.createConnection({ + host: "mysql-5707.dinaserver.com", + port: 3306, + user: "mouredev_read", + password: "mouredev_pass", + database: "moure_test", +}); + +// Funcion que utilizaremos para conectarnos a la base de datos, en caso de error +// nos enviara un mensaje. +function conectar() { + connection.connect((error) => { + if (error) + return console.error( + "Error al conectar a la base de datos: " + error.message + ); + console.log("Conectado a MySQL correctamente."); + }); +} + +// Funcion con la cual obtenemmos los datos de la tabla 'challenges' +function query() { + connection.query("SELECT * FROM challenges", (error, results) => { + if (error) + return console.error("Error al ejecutar la consulta: " + error.message); + console.table(results); + }); +} + +// Funcion para poder cerrar la conexion +function cerrarConexion() { + connection.end((error) => { + if (error) + return console.error("Error al cerrar la conexion: " + error.message); + console.log("Conexion a la base de datos cerrada correctamente."); + }); +} + +conectar(); +query(); +cerrarConexion(); diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/kotlin/malopezrom.kt b/Retos/Reto #23 - LA BASE DE DATOS [Media]/kotlin/malopezrom.kt new file mode 100644 index 0000000000..64bc4d09a9 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/kotlin/malopezrom.kt @@ -0,0 +1,78 @@ +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ +import java.sql.DriverManager +import java.sql.Connection + +/** + * Clase que representa una conexión a una base de datos MySQL + * + */ +class MySQLConnection(val host: String, val port: Int, val user: String, val password: String, val database: String){ + private var connection:Connection? = null + init{ + try { + connection = DriverManager.getConnection("jdbc:mysql://$host:$port/$database", user, password) + } + catch (e:Exception){ + println(e.message) + } + + } + fun close(){ + connection?.close() + } + /** + * Funcion que realiza una consulta a la base de datos y devuelve una promesa con el resultado + * @returns Promise Promesa con el resultado de la consulta + * @param query Consulta a realizar + */ + fun query(query:String) : List>{ + val result : MutableList> = mutableListOf() + try { + val statement = connection?.createStatement().use { + val resultSet = it?.executeQuery(query) + val metaData = resultSet?.metaData + + while (resultSet?.next() == true) { + val row: MutableMap = mutableMapOf() + for (i in 1..metaData?.columnCount!!) { + row[metaData.getColumnName(i)] = resultSet.getObject(i) + } + result.add(row) + } + + + } + return result + } + catch (e:Exception){ + println(e.message) + return result + } + + } +} + + + +fun main() { + val connection = MySQLConnection("mysql-5707.dinaserver.com",3306,"mouredev_read","mouredev_pass","moure_test") + val results = connection.query("SELECT * FROM challenges") + results.forEach { row -> + row.forEach { (columnName, value) -> + println("$columnName: $value") + } + } + connection.close() +} diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/kotlin/marchdz.kt b/Retos/Reto #23 - LA BASE DE DATOS [Media]/kotlin/marchdz.kt new file mode 100644 index 0000000000..48b5e53382 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/kotlin/marchdz.kt @@ -0,0 +1,32 @@ +import java.sql.* +import java.time.format.DateTimeFormatter; + +fun main() { + val url = "jdbc:mysql://mysql-5707.dinaserver.com:3306/moure_test" + val user = "mouredev_read" + val password = "mouredev_pass" + var connection: Connection? = null + var statement: Statement? = null + var resultSet: ResultSet? = null + val dateFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy") + + try { + connection = DriverManager.getConnection(url, user, password) + statement = connection.createStatement() + resultSet = statement.executeQuery("SELECT * FROM challenges") + while (resultSet.next()) { + println( + "${resultSet.getInt("id")} " + + "${resultSet.getString("name")} " + + "${resultSet.getString("difficulty")} " + + resultSet.getDate("date")?.toLocalDate()?.format(dateFormatter) + ) + } + } catch (e: SQLException) { + println(e.message) + } finally { + resultSet?.close() + statement?.close() + connection?.close() + } +} \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/kotlin/pisanowp.kt b/Retos/Reto #23 - LA BASE DE DATOS [Media]/kotlin/pisanowp.kt new file mode 100644 index 0000000000..aef15e5e8b --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/kotlin/pisanowp.kt @@ -0,0 +1,49 @@ +import java.sql.DriverManager + +fun main() { + + /* + * + * Reto #23 06/06/2023 LA BASE DE DATOS + * + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + + // Para usar los drivers de mysql en kotlin usar la siguiente entrada + // el fichero gradle para descargar las librerías necesarias + // implementation("mysql:mysql-connector-java:8.0.26") + + val url = "jdbc:mysql://mysql-5707.dinaserver.com:3306/moure_test" + val usuario = "mouredev_read" + val contraseña = "mouredev_pass" + + val conexion = DriverManager.getConnection(url, usuario, contraseña) + + val consulta = "SELECT id, name, difficulty, date FROM challenges" + val declaracion = conexion.createStatement() + val resultado = declaracion.executeQuery(consulta) + + while (resultado.next()) { + val id = resultado.getString("id") + val name = resultado.getString("name") + val difficulty = resultado.getString("difficulty") + val date = resultado.getString("date") + + println("#$id - $date | $difficulty | $name") + + } + + resultado.close() + declaracion.close() + +} diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/php/AnzurezDev.php b/Retos/Reto #23 - LA BASE DE DATOS [Media]/php/AnzurezDev.php new file mode 100644 index 0000000000..a3bca669d6 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/php/AnzurezDev.php @@ -0,0 +1,31 @@ +connect_errno ) { + $result = $mysqli->query( $query ); + + while ( $row = $result->fetch_assoc() ) { + $columns = array_keys( $row ); + + for ( $index=0; $indexfree(); +} else { + echo "Falló la conexión: " . $mysqli->connect_error; +} + +$mysqli->close(); +?> \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/php/LucasSantillan.php b/Retos/Reto #23 - LA BASE DE DATOS [Media]/php/LucasSantillan.php new file mode 100644 index 0000000000..4eea3cc8b4 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/php/LucasSantillan.php @@ -0,0 +1,23 @@ +connect_errno){ + die('Error ' . $this->con->connect_error); +} + +if ($resultado = $con->query('SELECT * FROM challenges')) { + + while ($fila = $resultado->fetch_array(MYSQLI_NUM)) { + echo $fila[0] ."\t". $fila[1] ."\t". $fila[2] ."\t". $fila[3] ."\n"; + } + + $resultado->free(); +} + + +$con->close(); +?> diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/php/Red-Clay.php b/Retos/Reto #23 - LA BASE DE DATOS [Media]/php/Red-Clay.php new file mode 100644 index 0000000000..7e8346001f --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/php/Red-Clay.php @@ -0,0 +1,40 @@ + + + + + $valor):?> + + + + + + +
+ name)); ?> +
+ +
diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/14wual.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/14wual.py new file mode 100644 index 0000000000..bb07a7812a --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/14wual.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 + +# ██╗ ██╗██╗ ██╗ █████╗ ██╗ +# ██║ ██║██║ ██║██╔══██╗██║ +# ██║ █╗ ██║██║ ██║███████║██║ (code by wual) +# ██║███╗██║██║ ██║██╔══██║██║ +# ╚███╔███╔╝╚██████╔╝██║ ██║███████╗ +# ╚══╝╚══╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ + +# Challenge #23: The database +# Challenge of Mouredev +# Link: https://github.com/mouredev/retos-programacion-2023 + +# Reto #23: La base de datos +#### Dificultad: Media | Publicación: 06/06/23 | Corrección: 12/06/23 + +## Enunciado + +# Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: +# - Host: mysql-5707.dinaserver.com +# - Port: 3306 +# - User: mouredev_read +# - Password: mouredev_pass +# - Database: moure_test + +# Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: +# - SELECT # FROM `challenges` +# +# Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + +#pip install mysql-connector-python + +# -------------------- Extern Imports -------------------- +import mysql.connector +import datetime + +# -------------------- APP -------------------- +class Credentials: + + def __init__(self) -> None: + + self.host = "mysql-5707.dinaserver.com" + self.port = 3306 + self.user = "mouredev_read" + self.password = "mouredev_pass" + self.database = "moure_test" + +class Info: + + def about(): + + _about = """# Code By 14Wual +# Challenge #23: The database +# Challenge of Mouredev +# Link: https://github.com/mouredev/retos-programacion-2023\n""" + + print(_about) + + def return_str_current_datetime(): + current_datetime = datetime.datetime.now() + return str(current_datetime.strftime("%Y-%m-%d %H:%M:%S")) + +class Challeng: + + def __init__(self) -> None: + + Info.about() + + self.ddbb_credentials = Credentials() + self.connection = self.create_connection() + + if self.connection: + + print(f"[✓] - {Info.return_str_current_datetime()} Established connection.") + print(f"[Info] - {Info.return_str_current_datetime()} Running query.") + + try: + cursor = self.connection.cursor() + cursor.execute("SELECT * FROM challenges") + + output = cursor.fetchall() + + # output = [ + # (*, 'E* ****** "**** ****"', '*****', datetime.date(****, **, **)), + # (*, 'E* "******** ******"', '*****', datetime.date(****, **, *)), + # (*, 'E* ******* ** *****', '*****', datetime.date(****, **, *)), + # Rest of output... + # ] + + print(f"[✓] - {Info.return_str_current_datetime()} Query executed successfully.") + print(f"[Info] - {Info.return_str_current_datetime()} Closing connection.") + + try:cursor.close();self.connection.close() + finally:print(f"[✓] - {Info.return_str_current_datetime()} Connection closed correctly.") + + print(f"[Info] - {Info.return_str_current_datetime()} Showing results.") + Challeng.beautifull_print_output(output) + + except mysql.connector.Error as error:Exceptions(expecific="Error executing query", error=error) + + else:print("[x] The connection could not be completed.") + + def create_connection(self): + + print(f"[Info] - {Info.return_str_current_datetime()} Connecting to the database.") + + try:return mysql.connector.connect(host=self.ddbb_credentials.host,port=self.ddbb_credentials.port,user=self.ddbb_credentials.user,password=self.ddbb_credentials.password,database=self.ddbb_credentials.database) + except mysql.connector.errors.InterfaceError as error:Exceptions(expecific="InterfaceError", error=error) + except mysql.connector.Error as error:Exceptions(expecific="Other", error=error) + return None + + def beautifull_print_output(output): + + print("\n----- Challenges -----") + for row in output: + print("ID:", row[0]) + print("Title:", row[1]) + print("Difficulty:", row[2]) + print("Date:", row[3]) + print("----------------------") + + # ----- Challenges ----- + # ID: * + # Title: E* ****** "**** ****" + # Difficulty: ***** + # Date: ****-**-** + # ---------------------- + # Rest of output... + # ---------------------- + +class Exceptions: + def __init__(self, expecific, error) -> None: + print(f"[x] - {Info.return_str_current_datetime()} Type of error: ", expecific, f"\n[x] - {Info.return_str_current_datetime()} Error: " ,error) + +if __name__ == '__main__':Challeng() \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/AnzurezDev.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/AnzurezDev.py new file mode 100644 index 0000000000..023771fcb0 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/AnzurezDev.py @@ -0,0 +1,18 @@ +import mysql.connector + +connection = mysql.connector.connect( + host = "mysql-5707.dinaserver.com", + user = "mouredev_read", + password= "mouredev_pass", + database= "moure_test", + port = 3306 +) + +cursor = connection.cursor() +cursor.execute( "SELECT * FROM `challenges`" ) + +results = cursor.fetchall() + +for row in results: + ( identifier, title, difficulty, date ) = row + print( f'{identifier} \t {title} \t {difficulty} \t {date}' ) \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Bryan112094.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Bryan112094.py new file mode 100644 index 0000000000..429aced245 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Bryan112094.py @@ -0,0 +1,26 @@ +import mysql.connector + +def consult_sql(c): + sql = "SELECT * FROM `challenges`" + c.execute(sql) + rows = c.fetchall() + for row in rows: + print(row) + +def main(): + try: + conexion = mysql.connector.connect( + host = 'mysql-5707.dinaserver.com', + user = 'mouredev_read', + password = 'mouredev_pass', + database = 'moure_test', + port=3306 + ) + c = conexion.cursor(dictionary=True) + consult_sql(c) + except mysql.connector.Error as error: + print('No se pudo conectar la base de datos: ' + error) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/ClarkCodes.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/ClarkCodes.py new file mode 100644 index 0000000000..b2d8830ec7 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/ClarkCodes.py @@ -0,0 +1,101 @@ +""" +Retos Semanales ‘23 +Reto #23: LA BASE DE DATOS +MEDIA | Publicación: 06/06/23 | Resolución: 12/06/23 + + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente + * base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. +""" + +# Autor: Clark - @ClarkCodes +# Fecha de Resolución: 07/06/2023 + +# NOTA: Para ejecutar este Script debes tener instalado MySQL Connector/Python 8.0.33, +# el cual lo puedes descargar de la página oficial dev.mysql.com o instalarlo vía pip + +# Imports +import mysql.connector +from mysql.connector import errorcode +import typer +from rich import print +from rich.table import Table +from rich import box +from rich.progress import Progress, SpinnerColumn, TextColumn +from datetime import date + +# Constantes +CONFIG = { + "user" : "mouredev_read", + "password" : "mouredev_pass", + "host" : "mysql-5707.dinaserver.com", + "port" : 3306, + "database" : "moure_test", + "raise_on_warnings" : True + } + +def data_retriever(): + query = "SELECT * FROM `challenges`" + # Se prepara la tabla para mostrar los datos + data_table = Table( "[green]ID", "[green]Nombre", "[green]Dificultad", "[green]Fecha", title="[bold yellow]** Datos Obtenidos: Challenges **", title_justify="center", box=box.ROUNDED ) + + try: + db_connection = mysql.connector.connect( **CONFIG ) + cursor = db_connection.cursor() + cursor.execute( query ) # Se ejecuta la query + rows = cursor.fetchall() # Se obtienen los registros + # Se recorren los registros(filas) obtenidos de la BD y se los agrega como filas en la tabla + for row in rows: # Cada campo de cada registro en la columna correspondiente según la estructura de la tabla de la línea 49 + data_table.add_row( str( row[0] ), row[1], row[2], row[3].strftime( "%d/%m/%Y" ) ) + + except mysql.connector.Error as err: + if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: + print( "Nombre de usuario o contraseña incorrectos, verifique nuevamente." ) + + elif err.errno == errorcode.ER_BAD_DB_ERROR: + print( "La Base de Datos no existe." ) + + else: + print( err ) + + finally: # Se cierran el cursor y la conexión + cursor.close() + db_connection.close() + + return data_table + +def main(): + print( "[bold green]\n*** Reto #23: LA BASE DE DATOS - By @ClarkCodes ***" ) + print( "[green]\n¡Bienvenidos!, a continuación nos conectaremos a la Base de Datos Remota y mostraremos los datos en una tabla." ) + + while True: + print( "[bold green]\nPresiona cualquier tecla para empezar, o presiona 'q' para salir: [/bold green]", end = "" ) + userAnswer = input( "" ) + + if( userAnswer == 'q' or userAnswer == 'Q' ): # Condición de Salida + print( "[green]\n✅ Esto ha sido todo por hoy.\n❤ Muchas gracias por ejecutar este Script, hasta la próxima...💻 Happy Coding!,👋🏼 bye :D\n😎 Clark." ) + break + + try: + print( "" ) + with Progress( SpinnerColumn(), TextColumn( "[progress.description]{task.description}" ), transient = True ) as progress: + progress.add_task( description="[light_sky_blue1]Estableciendo conexión con el servidor... obteniendo datos... un momento por favor...", total=None ) + + print( data_retriever() ) # Se llama a la función para obtener los datos y se los muestra por pantalla + + except Exception as ex: + print( "\n❌ Oops... algo no ha salido bien, revise nuevamente por favor." ) + print( ex ) + +# Llamada a la Función Principal usando typer +if __name__ == "__main__": + typer.run( main ) diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Engleonardorm7.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Engleonardorm7.py new file mode 100644 index 0000000000..6da5dbd070 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Engleonardorm7.py @@ -0,0 +1,35 @@ +# /* +# * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente +# * base de datos MySQL: +# * - Host: mysql-5707.dinaserver.com +# * - Port: 3306 +# * - User: mouredev_read +# * - Password: mouredev_pass +# * - Database: moure_test +# * +# * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: +# * - SELECT * FROM `challenges` +# * +# * Se pueden usar librerías para realizar la lógica de conexión a la base de datos +# */ + +import mysql.connector + +mydb=mysql.connector.connect( + host = "mysql-5707.dinaserver.com", + port="3306", + user="mouredev_read", + password="mouredev_pass", + database="moure_test" +) + +cursor=mydb.cursor() + +cursor.execute("SELECT*FROM `challenges`") +results=cursor.fetchall() + +for each in results: + print(each) + +cursor.close() +mydb.close() \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Faliin.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Faliin.py new file mode 100644 index 0000000000..73fd1ef102 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Faliin.py @@ -0,0 +1,28 @@ +import mysql.connector + +# Establecer la conexión +cnx = mysql.connector.connect( + host='mysql-5707.dinaserver.com', + port=3306, + user='mouredev_read', + password='mouredev_pass', + database='moure_test' +) + +# Crear un cursor para ejecutar consultas +cursor = cnx.cursor() + +# Ejecutar la consulta +query = "SELECT * FROM challenges" +cursor.execute(query) + +# Obtener los resultados +results = cursor.fetchall() + +# Imprimir los resultados +for row in results: + print(row) + +# Cerrar el cursor y la conexión +cursor.close() +cnx.close() diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Hugovrc.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Hugovrc.py new file mode 100644 index 0000000000..a2f7141862 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Hugovrc.py @@ -0,0 +1,22 @@ +import mysql.connector + +config = { + 'user': 'mouredev_read', + 'password': 'mouredev_pass', + 'host': 'mysql-5707.dinaserver.com', + 'database': 'moure_test', + 'port': '3306' +} + +con = mysql.connector.connect(**config) +cursor = con.cursor() + +query = ("SELECT * FROM challenges") + +cursor.execute(query) + +for datos in cursor: + print(datos) + +cursor.close() +con.close() \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/KevinED11.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/KevinED11.py new file mode 100644 index 0000000000..6030c1349b --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/KevinED11.py @@ -0,0 +1,121 @@ +import mysql.connector + +from mysql.connector.cursor import MySQLCursor +from mysql.connector import errorcode + +from typing import NewType, TypeVar, Generator +from abc import ABC, abstractmethod + + + +Options = NewType("Options", dict[str, str]) + +TConnection = TypeVar("TConnection") +TCursor = TypeVar("TCursor") + + +class DatabaseError(Exception): + pass + +class AccessDeniedError(DatabaseError): + pass + +class DatabaseNotFoundError(DatabaseError): + pass + + +class DatabaseService(ABC): + + @property + @abstractmethod + def conn(self) -> TConnection: + pass + + @property + @abstractmethod + def cursor(self) -> TCursor: + pass + + +class Sql(ABC): + + @abstractmethod + def execute_query(self, query: str) -> None: + pass + + @abstractmethod + def get_query_results(self) -> Generator: + pass + + +class MySQLService(DatabaseService): + + def __init__(self, options: Options) -> None: + self.__options = options + self.__conn = None + + @property + def conn(self) -> mysql.connector.MySQLConnection: + try: + options = self.__options.copy() + cnx = mysql.connector.connect(**options) + + self.__conn = cnx + return cnx + except mysql.connector.Error as err: + cnx.close() + + if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: + raise AccessDeniedError("Something is wrong with your user name or password") + elif err.errno == errorcode.ER_BAD_DB_ERROR: + raise DatabaseNotFoundError("Database does not exist") + else: + raise DatabaseError(err) + + @property + def cursor(self) -> MySQLCursor: + return self.__conn.cursor() + + +class SqlService(Sql): + + def __init__(self, db: DatabaseService) -> None: + self.__conn = db.conn + self.__cursor = db.cursor + + def execute_query(self, query: str) -> None: + self.__cursor.execute(query) + + def get_query_results(self) -> Generator: + try: + return (challenge for challenge in self.__cursor.fetchall()) + finally: + self.__cursor.close() + self.__conn.close() + + +def main() -> None: + options: Options = { + "host": "mysql-5707.dinaserver.com", + "user": "mouredev_read", + "password": "mouredev_pass", + "database": "moure_test" + } + try: + db: DatabaseService = MySQLService(options) + + sql: Sql = SqlService(db) + sql.execute_query("SELECT * FROM challenges") + query_results = sql.get_query_results() + + for result in query_results: + print(result) + except (DatabaseNotFoundError, + DatabaseError, + AccessDeniedError) as err: + print(err) + + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Lemito66.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Lemito66.py new file mode 100644 index 0000000000..2f92fd6d35 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/Lemito66.py @@ -0,0 +1,52 @@ +""" +* Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. +""" + +import mysql.connector + + +def connection_with_mysql(config, query): + try: + connection = mysql.connector.connect(**config) + cursor = connection.cursor() + + cursor.execute(query) + result = cursor.fetchall() + + return result if result else None + except mysql.connector.Error as err: + if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: + print("Something is wrong with your user name or password") + elif err.errno == errorcode.ER_BAD_DB_ERROR: + print("Database does not exist") + else: + print(err) + finally: + if connection is not None: + connection.close() + if cursor is not None: + cursor.close() + + +print("Connection with MySQL") + +query = "SELECT * FROM challenges" +config = { + "host": "mysql-5707.dinaserver.com", + "port": "3306", + "database": "moure_test", + "user": "mouredev_read", + "password": "mouredev_pass" +} +for i in connection_with_mysql(config, query): + print(i) \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/aleluis79.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/aleluis79.py new file mode 100644 index 0000000000..c213889e9c --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/aleluis79.py @@ -0,0 +1,50 @@ +""" +Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: +- Host: mysql-5707.dinaserver.com +- Port: 3306 +- User: mouredev_read +- Password: mouredev_pass +- Database: moure_test + +Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: +- SELECT * FROM `challenges` +Se pueden usar librerías para realizar la lógica de conexión a la base de datos. +""" + +# pip install mysql-connector-python +import mysql.connector + +def imprime_resultado(table: str, titles: tuple, sizes: tuple) -> None: + + conexion = mysql.connector.connect( + host="mysql-5707.dinaserver.com", + user="mouredev_read", + password="mouredev_pass", + database="moure_test" + ) + + stitles = str(titles).replace('\'', '') + stitles = stitles[1:len(stitles)-1] + + cursor = conexion.cursor() + + consulta = f"SELECT {stitles} FROM {table}" + cursor.execute(consulta) + + resultados = cursor.fetchall() + + for i in range(len(titles)): + print(titles[i].capitalize().ljust(sizes[i]), end=" ") + print() + print("="*(sum(sizes)+len(titles)-1)) + + for fila in resultados: + for i in range(len(fila)): + print(str(fila[i]).ljust(sizes[i]), end=" ") + print() + + cursor.close() + conexion.close() + + +imprime_resultado("challenges", ("id", "name", "difficulty", "date"), (11, 100, 10, 10)) \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/fedecoronado.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/fedecoronado.py new file mode 100644 index 0000000000..86a1058810 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/fedecoronado.py @@ -0,0 +1,100 @@ +# Reto #23: La base de datos +# +# Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: +# - Host: mysql-5707.dinaserver.com +# - Port: 3306 +# - User: mouredev_read +# - Password: mouredev_pass +# - Database: moure_test +# +# Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: +# - SELECT # FROM `challenges` +# +# Se pueden usar librerías para realizar la lógica de conexión a la base de datos. +# + +import mysql.connector +from mysql.connector import errorcode + +from rich.table import Table +from rich import box +from rich import print + +from datetime import date + +class DbConnection: + def __init__(self, host, port, user, password, database): + self.host = host + self.port = port + self.user = user + self.password = password + self.database = database + self.connection = None + + def __enter__(self): + try: + self.connection = mysql.connector.connect( + host=self.host, + port=self.port, + user=self.user, + password=self.password, + database=self.database + ) + print("Conexión exitosa a la base de datos") + return self.connection + except mysql.connector.Error as error: + print("Error al conectarse a la base de datos:", error) + return None + + def __exit__(self, exc_type, exc_val, exc_tb): + if self.connection: + self.connection.close() + print("Desconexión exitosa de la base de datos") + + + +def execute_query(connection, query): + if not connection: + print("No se ha establecido una conexión a la base de datos") + return + + try: + cursor = connection.cursor() + cursor.execute( query ) # Se ejecuta la query + rows = cursor.fetchall() # Se obtienen los registros + cursor.close() # Se cierra la conexión + connection.close() + # Se prepara la tabla para mostrar los datos + data_table = Table( + "[blue]ID", "[blue]Nombre", "[red]Dificultad", "[blue]Fecha", + title="[orange]** Datos Obtenidos: Challenges **", + title_justify="center", + box=box.ROUNDED + ) + # se llena la tabla con los datos del cursor + for row in rows: + data_table.add_row( + str( row[0] ), + row[1], + row[2], + row[3].strftime( "%d/%m/%Y" ) + ) + return data_table + except mysql.connector.Error as error: + print("Error al ejecutar la consulta:", error) + + + +if __name__ == "__main__": + # Parámetros de conexión + host = "mysql-5707.dinaserver.com" + port = 3306 + user = "mouredev_read" + password = "mouredev_pass" + database = "moure_test" + + # Conectarse a la base de datos utilizando with para que se cierre sola + with DbConnection(host, port, user, password, database) as connection: + if connection: + query = "SELECT * FROM `challenges`" # Ejecutar la consulta + print(execute_query(connection, query)) \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/francisco-88.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/francisco-88.py new file mode 100644 index 0000000000..0af09a37e7 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/francisco-88.py @@ -0,0 +1,21 @@ +import mysql.connector + +conexion = mysql.connector.connect(user='mouredev_read', + password='mouredev_pass', + host='mysql-5707.dinaserver.com', + database='moure_test') + +cursor = conexion.cursor() + +print('Conexión exitosa') + +query = ("SELECT * FROM challenges") +cursor.execute(query) + +for row in cursor: + print(row) + +cursor.close() +conexion.close() + +print('Desafío terminado') \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/gonsomito.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/gonsomito.py new file mode 100644 index 0000000000..36026d7273 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/gonsomito.py @@ -0,0 +1,35 @@ +""" + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente + * base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. +""" +import mysql.connector + +#Realizar la conexión con los argumentos dados. +connect = mysql.connector.connect( + user="mouredev_read", + password="mouredev_pass", + host="mysql-5707.dinaserver.com", + database='moure_test', port=3306) + +query = "SELECT * FROM challenges" +cursor = connect.cursor() +cursor.execute(query) +result = cursor.fetchall() + +#Recorrer el cursor para mostrar los resultados de la query +for item in result: + print(item) + +#Recuerda cerrar al salir para que no se escapen los bits. +cursor.close() +connect.close() diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/jcdm60.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/jcdm60.py new file mode 100644 index 0000000000..7879d9bed2 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/jcdm60.py @@ -0,0 +1,75 @@ +# Reto #23: La base de datos +#### Dificultad: Media | Publicación: 06/06/23 | Corrección: 12/06/23 + +## Enunciado + +# +# Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: +# - Host: mysql-5707.dinaserver.com +# - Port: 3306 +# - User: mouredev_read +# - Password: mouredev_pass +# - Database: moure_test +# +# Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: +# - SELECT # FROM `challenges` +# +# Se pueden usar librerías para realizar la lógica de conexión a la base de datos. +# + +import mysql.connector + + +def connect_to_database(host, port, user, password, database): + try: + connection = mysql.connector.connect( + host=host, port=port, user=user, password=password, database=database + ) + print("Conexión exitosa a la base de datos") + return connection + except mysql.connector.Error as error: + print("Error al conectarse a la base de datos:", error) + return None + + +def execute_query(connection, query): + if not connection: + print("No se ha establecido una conexión a la base de datos") + return + + try: + cursor = connection.cursor() + cursor.execute(query) + results = cursor.fetchall() + + for row in results: + print(row) + + cursor.close() + except mysql.connector.Error as error: + print("Error al ejecutar la consulta:", error) + + +def disconnect_from_database(connection): + if connection: + connection.close() + print("Desconexión exitosa de la base de datos") + + +if __name__ == "__main__": + # Parámetros de conexión + host = "mysql-5707.dinaserver.com" + port = 3306 + user = "mouredev_read" + password = "mouredev_pass" + database = "moure_test" + + # Conectarse a la base de datos + connection = connect_to_database(host, port, user, password, database) + + # Ejecutar la consulta + query = "SELECT * FROM `challenges`" + execute_query(connection, query) + + # Desconectarse de la base de datos + disconnect_from_database(connection) diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/jpirulo.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/jpirulo.py new file mode 100644 index 0000000000..49b8050d62 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/jpirulo.py @@ -0,0 +1,60 @@ +import mysql.connector +from colorama import Fore, Style + +class MySQLConnector: + def __init__(self, host, port, user, password, database): + self.host = host + self.port = port + self.user = user + self.password = password + self.database = database + self.connection = None + self.cursor = None + + def connect(self): + try: + self.connection = mysql.connector.connect( + host=self.host, + port=self.port, + user=self.user, + password=self.password, + database=self.database + ) + self.cursor = self.connection.cursor() + print(Fore.GREEN + "Conexión exitosa a la base de datos MySQL" + Style.RESET_ALL) + except mysql.connector.Error as error: + print(Fore.RED + "Error al conectar a la base de datos:", error + Style.RESET_ALL) + + def execute_query(self, query): + try: + self.cursor.execute(query) + results = self.cursor.fetchall() + return results + except mysql.connector.Error as error: + print(Fore.RED + "Error al ejecutar la consulta:", error + Style.RESET_ALL) + + def close(self): + if self.cursor: + self.cursor.close() + if self.connection: + self.connection.close() + +# Ejemplo de uso +if __name__ == "__main__": + host = 'mysql-5707.dinaserver.com' + port = 3306 + user = 'mouredev_read' + password = 'mouredev_pass' + database = 'moure_test' + + connector = MySQLConnector(host, port, user, password, database) + connector.connect() + + query = 'SELECT * FROM challenges' + results = connector.execute_query(query) + + if results: + for row in results: + print(Fore.CYAN + str(row) + Style.RESET_ALL) + + connector.close() diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/juanppdev.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/juanppdev.py new file mode 100644 index 0000000000..566fe8ea59 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/juanppdev.py @@ -0,0 +1,12 @@ +import mysql.connector + +print("Resultados de mysql") + +conexion = mysql.connector.connect(host="mysql-5707.dinaserver.com", user="mouredev_read", passwd="mouredev_pass", db="moure_test") +cur = conexion.cursor() +cur.execute("SELECT * FROM challenges") + +for i in cur.fetchall(): + print(i) + +conexion.close() \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/klyone.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/klyone.py new file mode 100644 index 0000000000..a45d73e735 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/klyone.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +import mysql.connector + +def connect_bd(): + bd_connection = mysql.connector.connect(host = "mysql-5707.dinaserver.com", user = "mouredev_read", password = "mouredev_pass", database = "moure_test") + return bd_connection + +def get_bd_requester(bd_connection): + requester = bd_connection.cursor() + return requester + +def query(requester, cmd): + requester.execute(cmd) + +def print_query_results(requester): + result = requester.fetchall() + for r in result: + print(r) + +if __name__ == "__main__": + bd = connect_bd() + requester = get_bd_requester(bd) + query(requester, "SELECT * FROM challenges") + print_query_results(requester) diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/majinka10.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/majinka10.py new file mode 100644 index 0000000000..63dac4d5e1 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/majinka10.py @@ -0,0 +1,22 @@ +import mysql.connector + +config = { + 'user': 'mouredev_read', + 'password': 'mouredev_pass', + 'host': 'mysql-5707.dinaserver.com', + 'database': 'moure_test', + 'raise_on_warnings': True +} + +cnx = mysql.connector.connect(**config) +cursor = cnx.cursor() + +query='SELECT * FROM challenges' +cursor.execute(query) +result = cursor.fetchall() + +for row in result: + print(row) + +cursor.close() +cnx.close() \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/malopezrom.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/malopezrom.py new file mode 100644 index 0000000000..fcdc780981 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/malopezrom.py @@ -0,0 +1,56 @@ +# /* +# * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: +# * - Host: mysql-5707.dinaserver.com +# * - Port: 3306 +# * - User: mouredev_read +# * - Password: mouredev_pass +# * - Database: moure_test +# * +# * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: +# * - SELECT * FROM `challenges` +# * +# * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. +# */ + +from mysql.connector import connect + + + +class MySQLConnector: + def __init__(self, host, port, user, password, database): + self.__host = host + self.__port = port + self.__user = user + self.__password = password + self.__database = database + + def __connect(self): + return connect( + host=self.__host, + port=self.__port, + user=self.__user, + password=self.__password, + database=self.__database + ) + + def execute_query(self, query): + connection = self.__connect() + cursor = connection.cursor() + cursor.execute(query) + result = cursor.fetchall() + connection.close() + return result + + + +if __name__ == '__main__': + mysql = MySQLConnector( + host='mysql-5707.dinaserver.com', + port=3306, + user='mouredev_read', + password='mouredev_pass', + database='moure_test' + ) + result = mysql.execute_query('SELECT * FROM `challenges`') + for row in result: + print(row) \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/maurighar.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/maurighar.py new file mode 100644 index 0000000000..f4b1668ccd --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/maurighar.py @@ -0,0 +1,28 @@ +import pymysql + +host = 'mysql-5707.dinaserver.com' +# Port: 3306 +usuario = 'mouredev_read' +password = 'mouredev_pass' +db = 'moure_test' + +conexion = pymysql.connect( +host=host, +user=usuario, +password=password, +db=db, +charset='utf8mb4', +cursorclass=pymysql.cursors.DictCursor) + +cursor = conexion.cursor() + +sql = "SELECT * FROM challenges" + +cursor.execute(sql) +datos = cursor.fetchall() + +cursor.close() +conexion.close() + +for dato in datos: + print (dato) diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/mcastrezana.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/mcastrezana.py new file mode 100644 index 0000000000..66b5cc46f2 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/mcastrezana.py @@ -0,0 +1,30 @@ +# Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: +# Host: mysql-5707.dinaserver.com +# Port: 3306 +# User: mouredev_read +# Password: mouredev_pass +# Database: moure_test +# +# Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: +# SELECT * FROM `challenges` +# +# Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + +import mysql.connector + +#Realizar la conexión con los argumentos dados. +conexion = mysql.connector.connect( + host = 'mysql-5707.dinaserver.com', + port = 3306, + user = 'mouredev_read', + password = 'mouredev_pass', + database = 'moure_test', +) + +#Ahora, para movernos por las bases de datos, necesitamos crear lo que se conoce como cursor. +cursor = conexion.cursor() + +#Imprimimos la consulta +cursor.execute('SELECT * FROM challenges') +for bd in cursor: + print(bd) \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/mjordanaam.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/mjordanaam.py new file mode 100644 index 0000000000..4d23fff057 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/mjordanaam.py @@ -0,0 +1,39 @@ +""" +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ +""" +import mysql.connector + +HOST = "mysql-5707.dinaserver.com" +PORT = 3306 +USER = "mouredev_read" +PASSWORD = "mouredev_pass" +DATABASE = "moure_test" + + +database = mysql.connector.connect( + host=HOST, + port=PORT, + user=USER, + password=PASSWORD, + database=DATABASE +) + +cursor = database.cursor() + +cursor.execute("SELECT * FROM challenges") + +results = cursor.fetchall() + +[print(result) for result in results] \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/mouredev.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/mouredev.py new file mode 100644 index 0000000000..9e3ba44d88 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/mouredev.py @@ -0,0 +1,22 @@ +import mysql.connector + +config = { + "host": "mysql-5707.dinaserver.com", + "port": "3306", + "database": "moure_test", + "user": "mouredev_read", + "password": "mouredev_pass" +} + +connection = mysql.connector.connect(**config) +cursor = connection.cursor() + +query = "SELECT * FROM challenges" +cursor.execute(query) +result = cursor.fetchall() + +for row in result: + print(row) + +cursor.close() +connection.close() \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/nlarrea.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/nlarrea.py new file mode 100644 index 0000000000..1aa19b4ced --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/nlarrea.py @@ -0,0 +1,43 @@ +""" + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. +""" + +import mysql.connector + +host = "mysql-5707.dinaserver.com" +user = "mouredev_read" +password = "mouredev_pass" +database = "moure_test" + +try: + conn = mysql.connector.connect( + host=host, + database=database, + user=user, + password=password + ) + cursor = conn.cursor() + + cursor.execute("SELECT * FROM challenges") + rows = cursor.fetchall() + + for row in rows: + challenge_id, name, difficulty, date = row + print(f"{challenge_id}: {name} ({difficulty}) - {date}") + +except mysql.connector.Error as err: + print("Error while connecting to Database", err) + +finally: + cursor.close() + conn.close() \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/pakiuh.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/pakiuh.py new file mode 100644 index 0000000000..b55fcd4145 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/pakiuh.py @@ -0,0 +1,31 @@ +""" + Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + - Host: mysql-5707.dinaserver.com + - Port: 3306 + - User: mouredev_read + - Password: mouredev_pass + - Database: moure_test + + Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + - SELECT * FROM `challenges` + + Se pueden usar librerías para realizar la lógica de conexión a la base de datos. +""" +import mysql.connector + +mydb = mysql.connector.connect( + host="mysql-5707.dinaserver.com", + port=3306, + user="mouredev_read", + password="mouredev_pass", + database="moure_test" +) + +mycursor = mydb.cursor() + +mycursor.execute("SELECT * FROM `challenges`") + +myresult = mycursor.fetchall() + +for x in myresult: + print(x) \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/pyramsd.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/pyramsd.py new file mode 100644 index 0000000000..5a846d18a1 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/pyramsd.py @@ -0,0 +1,38 @@ +# install mysql-connector-python (pip install mysql-connector-python) +import mysql.connector + +user = "mouredev_read" +password = "mouredev_pass" +host = "mysql-5707.dinaserver.com" +port = "3306" +database = "moure_test" + +conexion = None + +try: + conexion = mysql.connector.connect(user=user, password=password, + host=host, database=database, + port=port) + + + consulta = "SELECT * FROM challenges" + + cursor = conexion.cursor() # realiza consultas + cursor.execute(consulta) # ejecuta la consulta + + resultados = cursor.fetchall() # leer y descartar resultado para cerrar conexion + + for i in resultados: + print(i) + +except: + print("Error al conectar a la base de datos") + +finally: + if 'cursor' in locals() and cursor is not None: + cursor.close() + if 'conexion' in locals() and conexion.is_connected(): + conexion.close() + + print("Conexion cerrada") + diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/tecfer.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/tecfer.py new file mode 100644 index 0000000000..1a125b4ca1 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/tecfer.py @@ -0,0 +1,32 @@ +''' + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. +''' +import mysql.connector + +connection = mysql.connector.connect(user='mouredev_read', + password='mouredev_pass', + host='mysql-5707.dinaserver.com', + database='moure_test', + port='3306') + +cursor = connection.cursor() + +query = "SELECT * FROM `challenges`" +cursor.execute(query) + +result = cursor.fetchall() + +connection.close() + +for row in result: + print(row) diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/ycanas.py b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/ycanas.py new file mode 100644 index 0000000000..d28fc3fe31 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/python/ycanas.py @@ -0,0 +1,23 @@ +import mysql.connector + +config = { + "host": "mysql-5707.dinaserver.com", + "port": "3306", + "database": "moure_test", + "user": "mouredev_read", + "password": "mouredev_pass" +} + +try: + with mysql.connector.connect(**config) as connection: + with connection.cursor() as cursor: + query = "SELECT * FROM challenges" + cursor.execute(query) + + result = cursor.fetchall() + + for row in result: + print(row) + +except mysql.connector.Error as error: + print(f"Error en la conexión o consulta: {error}") diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/ruby/test0n3.rb b/Retos/Reto #23 - LA BASE DE DATOS [Media]/ruby/test0n3.rb new file mode 100644 index 0000000000..f75198f1c7 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/ruby/test0n3.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +# to run this app, you require to install mysql2 gem +# gem install mysql2 + +require 'mysql2' + +# class to get db content +class MoureDevDB + attr_reader :db_host, :db_user, :db_name, :result + attr_accessor :db_pass + + def initialize + @db_host = 'mysql-5707.dinaserver.com' + @db_user = 'mouredev_read' + @db_name = 'moure_test' + @db_pass = require_pass + @result = connect_db + end + + def access_db + if @result.nil? + puts "Can't connect to database" + return + end + + puts "id\tname\t\t\tdifficulty\tdate" + @result.each(as: :array) do |row| + puts row.join("\t") + end + end + + def connect_db + begin + connect = Mysql2::Client.new(host: @db_host, username: @db_user, password: @db_pass, database: @db_name) + query_result = connect.query('SELECT * FROM challenges') + connect.close + rescue Mysql2::Error => _e + query_result = nil + end + query_result + end + + def require_pass + puts "Type password for #{@db_user}@#{@db_host}: " + gets.chomp + end +end + +MoureDevDB.new.access_db diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/shell/albertovf.sh b/Retos/Reto #23 - LA BASE DE DATOS [Media]/shell/albertovf.sh new file mode 100644 index 0000000000..45f469e144 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/shell/albertovf.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +HOST="mysql-5707.dinaserver.com" +PORT="3306" +USER="mouredev_read" +PASSWORD="mouredev_pass" +DATABASE="moure_test" + +QUERY="SELECT * FROM challenges;" + +mysql -h $HOST -u $USER -p$PASSWORD $DATABASE -e "$QUERY" \ No newline at end of file diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/shell/allbertoMD.sh b/Retos/Reto #23 - LA BASE DE DATOS [Media]/shell/allbertoMD.sh new file mode 100755 index 0000000000..e3ef4381f8 --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/shell/allbertoMD.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +host="mysql-5707.dinaserver.com" +port="3306" +user="mouredev_read" +database="moure_test" + +query="SELECT * FROM challenges" + +result=$(echo "$password" | mysql -h "$host" -P "$port" -u "$user" -p "$database" -e "$query") + +if [ $? -ne 0 ]; then + echo "Error al ejecutar la consulta" + exit 1 +fi + +echo "$result" + diff --git a/Retos/Reto #23 - LA BASE DE DATOS [Media]/typescript/malopezrom.ts b/Retos/Reto #23 - LA BASE DE DATOS [Media]/typescript/malopezrom.ts new file mode 100644 index 0000000000..7cded73d8c --- /dev/null +++ b/Retos/Reto #23 - LA BASE DE DATOS [Media]/typescript/malopezrom.ts @@ -0,0 +1,88 @@ +/* + * Realiza una conexión desde el lenguaje que hayas seleccionado a la siguiente base de datos MySQL: + * - Host: mysql-5707.dinaserver.com + * - Port: 3306 + * - User: mouredev_read + * - Password: mouredev_pass + * - Database: moure_test + * + * Una vez realices la conexión, lanza la siguiente consulta e imprime el resultado: + * - SELECT * FROM `challenges` + * + * Se pueden usar librerías para realizar la lógica de conexión a la base de datos. + */ + + +import mysql from 'mysql'; + + +/** + * Clase que representa una conexión a una base de datos MySQL + * + */ +class MysqlConnection { + host: string; + port: number; + user: string; + password: string; + database: string; + connection: mysql.Connection; + + /** + * Constructor de la clase + * @param host + * @param port + * @param user + * @param password + * @param database + */ + constructor(host: string, port: number, user: string, password: string, database: string) { + this.host = host; + this.port = port; + this.user = user; + this.password = password; + this.database = database; + this.connection = mysql.createConnection({ + host: this.host, + port: this.port, + user: this.user, + password: this.password, + database: this.database + }); + + } + + /** + * Funcion que cierra la conexión a la base de datos + */ + close(): void { + this.connection?.end(); + } + + /** + * Funcion que realiza una consulta a la base de datos y devuelve una promesa con el resultado + * @returns Promise Promesa con el resultado de la consulta + * @param query Consulta a realizar + */ + query(query: string): Promise { + return new Promise((resolve, reject) => { + this.connection.query(query, (error, results, fields) => { + if (error) reject(error); + resolve(results); + }); + + }) + } + + +} + +const connection = new MysqlConnection('mysql-5707.dinaserver.com', 3306, 'mouredev_read', 'mouredev_pass', 'moure_test'); +connection.query('SELECT * FROM `challenges`').then((results) => { + console.log(results); + connection.close(); +}).catch((error) => { + console.log(error); +}) + + diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/c#/JonAFernan.cs" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/c#/JonAFernan.cs" new file mode 100644 index 0000000000..8c684fc81a --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/c#/JonAFernan.cs" @@ -0,0 +1,89 @@ +using System.Text.RegularExpressions; +using System.Text; + +namespace Reto23; + +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + */ + +class Program +{ + static void Main(string[] args) + { + int key = 17; + + string text = "Crea un programa que realize el cifrado César de un texto y lo imprima." + + "También debe ser capaz de descifrarlo cuando así se lo indiquemos."; + + System.Console.WriteLine(CaesarCipherEncrypt(text,key)); + System.Console.WriteLine(CaesarCipherDecrypt(CaesarCipherEncrypt(text,key),key)); + + } + + static string CaesarCipherEncrypt(string text, int key) + { + //Remove all non-ASCII characters from text + text = Regex.Replace(text.Normalize(NormalizationForm.FormD),"[^\x00-\x7F]+",""); + + text = Regex.Replace(text,"[A-Z]",m=>m.ToString().ToLower()); + + //Encrypt text + return text = Regex.Replace(text,"[a-z]",new MatchEvaluator(new Cipher(key).Encrypt)); + + } + + static string CaesarCipherDecrypt(string text, int key) + { + return text = Regex.Replace(text,"[a-z]",new MatchEvaluator(new Cipher(key).Decrypt)); + } + + class Cipher + { + private int _key; + private int [] alphabetArray = Enumerable.Range(97,122-97 + 1).ToArray(); + + public Cipher(int key) + { + _key = key; + } + + public string Encrypt(Match m) + { + int letter = (int)char.Parse(m.ToString()); + int index = Array.IndexOf(alphabetArray,letter); + + for(int i=0 ; i < _key; i++) + { + if(index+1 == alphabetArray.Length) index=-1; + + letter = alphabetArray[index+1]; + index++; + } + + return ((char)letter).ToString(); + } + public string Decrypt(Match m) + { + int letter = (int)char.Parse(m.ToString()); + int index = Array.IndexOf(alphabetArray,letter); + + for(int i=0 ; i < _key; i++) + { + if(index == 0) index=alphabetArray.Length; + + letter = alphabetArray[index-1]; + index--; + + } + + return ((char)letter).ToString(); + } + + } + +} \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/c#/borazuwarah.cs" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/c#/borazuwarah.cs" new file mode 100644 index 0000000000..ca9a2ed74a --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/c#/borazuwarah.cs" @@ -0,0 +1,53 @@ +string texto = "MOUREDEV - PRIMO DE LAURA MOURE (LA RULETA DE LA SUERTE)"; +int desplazamiento = 3; +string textoCifrado = CifrarCesar(texto, desplazamiento); + +Console.WriteLine("Texto original: " + texto); +Console.WriteLine("Texto cifrado: " + textoCifrado); + + +Console.WriteLine("***************"); +Console.WriteLine("Descrifrando"); +Console.WriteLine("***************"); +string Descifrado = DescifrarCesar(textoCifrado, desplazamiento); +Console.WriteLine("Texto Descifrado: " + Descifrado); +Console.ReadKey(); + +static string CifrarCesar(string texto, int desplazamiento) +{ + string textoCifrado = ""; + + foreach (char c in texto) + { + if (char.IsLetter(c)) + { + char cifrado = (char)(((c - 'A') + desplazamiento) % 26 + 'A'); + textoCifrado += cifrado; + } + else + { + textoCifrado += c; + } + } + return textoCifrado; +} + +static string DescifrarCesar(string textoCifrado, int desplazamiento) +{ + string textoDescifrado = ""; + + foreach (char c in textoCifrado) + { + if (char.IsLetter(c)) + { + char descifrado = (char)(((c - 'A') - desplazamiento + 26) % 26 + 'A'); + textoDescifrado += descifrado; + } + else + { + textoDescifrado += c; + } + } + + return textoDescifrado; +} diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/c/fegorama.c" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/c/fegorama.c" new file mode 100644 index 0000000000..2b99a67bed --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/c/fegorama.c" @@ -0,0 +1,77 @@ +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + */ +#include +#include +#include +#include + +// Constantes y macros +#define MAX_LENGTH 50 +#define MAX_ALPHABET 26 +#define OFFSET 3 +#define POSMOD(i, n) (i % n + n) % n // https://stackoverflow.com/a/14997413/5032550 + +const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +/* + * Función para cifrado y descifrado del código César + */ +int cease(char *s, int decrypt) +{ + char c; + + // Para cada carácter de la cadena pasada... + for (int i = 0; i < strlen(s); i++) + + // Si está fuera del alfabeto de mayúsculas, error + if (s[i] < 65 || s[i] > 90) + { + fprintf(stderr, "Error: Solo letras de la A a la Z."); + exit(1); + } + + // Si está dentro... + else + { + // Se resta su código ASCII para comenzar por cero el índice del alfabeto + c = s[i] - 65; + + // Se calcula como carácter + número de posiciones a sumar o restar, si es codificar o decodificar, + // y se realiza su módulo positivo (aritmética circular) para poder rotar entre el alfabeto + // (si es Z y se codifica como Z + 2 posiciones, el resultado será B) + s[i] = decrypt == 0 ? alphabet[POSMOD(c + OFFSET, MAX_ALPHABET)] : alphabet[POSMOD(c - OFFSET, MAX_ALPHABET)]; + } + + return 0; +} + +/* + * Función principal + */ +int main(int argc, char **argv) +{ + char s[MAX_LENGTH]; + int decrypt = 0; + // Si contiene un argumento y este es "-d", desencripta + if (argc > 1 && strcmp(argv[1], "-d") == 0) + decrypt = 1; + + // Se recoge la entrada estándar + fgets(s, MAX_LENGTH, stdin); + + // Si la longitud es mayor que cero, se sustituye el retorno de carro final + // por el carácter de fin de línea (\0) + if ((strlen(s) > 0) && (s[strlen(s) - 1] == '\n')) + s[strlen(s) - 1] = '\0'; + + // Llamada a la función e impresión del mensaje + cease(s, decrypt); + printf("%s", s); + + exit(0); +} \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/ejercicio.md" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/ejercicio.md" new file mode 100644 index 0000000000..d89d49f30f --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/ejercicio.md" @@ -0,0 +1,19 @@ +# Reto #24: Cifrado César +#### Dificultad: Fácil | Publicación: 12/06/23 | Corrección: 19/06/23 + +## Enunciado + +``` +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + */ +``` +#### Tienes toda la información extendida sobre los retos de programación semanales en **[retosdeprogramacion.com/semanales2023](https://retosdeprogramacion.com/semanales2023)**. + +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/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/go/KevinED11.go" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/go/KevinED11.go" new file mode 100644 index 0000000000..a48125f887 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/go/KevinED11.go" @@ -0,0 +1,138 @@ +package main + +import ( + "errors" + "fmt" + _ "fmt" + "strings" +) + +type IAlphabet interface { + Get() string +} + +type IChiper interface { + Encrypt() (string, error) +} + +type IConversor interface { + GetMapConversion() *map[string]string +} + +type IDecrypter interface { + Decrypt() (string, error) +} + +type EnglishAlphabet struct { +} + +func (a *EnglishAlphabet) Get() string { + return "abcdefghijklmnopqrstuvwxyz" +} + +type CaesarCipherConversor struct { + IAlphabet + Shift int +} + +func (c *CaesarCipherConversor) GetMapConversion() *map[string]string { + conversor := make(map[string]string) + alphabet := c.IAlphabet.Get() + + for i, letter := range alphabet { + cesarPosition := (i + c.Shift) % len(alphabet) + cesarLetter := string(alphabet[cesarPosition]) + conversor[string(letter)] = cesarLetter + } + + return &conversor + +} + +type CaesarCipher struct { + text string + IConversor +} + +func (c *CaesarCipher) Encrypt() (string, error) { + var cesarText string + conversor := *c.IConversor.GetMapConversion() + + text := strings.ToLower(c.text) + + for _, letter := range text { + let, exists := conversor[string(letter)] + if !exists { + return "", errors.New("Invalid letter") + } + + cesarText += let + } + + return cesarText, nil + +} + +type CaesarCipherDecrypter struct { + text string + IConversor +} + +func (c *CaesarCipherDecrypter) Decrypt() (string, error) { + text := strings.ToLower(c.text) + originalMap := *c.IConversor.GetMapConversion() + newMap := make(map[string]string) + var decryptedText string + + for k, v := range originalMap { + newMap[v] = k + } + + for _, letter := range text { + let, exist := newMap[string(letter)] + if !exist { + return "", errors.New("Invalid letter") + } + + decryptedText += let + } + + return decryptedText, nil + +} + +type Main struct { + IChiper + IDecrypter +} + +func (m *Main) Encrypt() string { + result, err := m.IChiper.Encrypt() + if err != nil { + fmt.Println(err) + } + return result +} + +func (m *Main) Decrypt() string { + result, err := m.IDecrypter.Decrypt() + if err != nil { + fmt.Println(err) + } + return result +} + +func main() { + alphabet := EnglishAlphabet{} + cipherConversor := CaesarCipherConversor{IAlphabet: &alphabet, Shift: 3} + + cipher := CaesarCipher{text: "Hello", IConversor: &cipherConversor} + decrypter := CaesarCipherDecrypter{text: "khoor", IConversor: &cipherConversor} + + program := Main{IChiper: &cipher, IDecrypter: &decrypter} + encryptedText := program.Encrypt() + decryptedText := program.Decrypt() + + fmt.Println(encryptedText, decryptedText) + +} diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/go/blackriper.go" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/go/blackriper.go" new file mode 100644 index 0000000000..0cbf418649 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/go/blackriper.go" @@ -0,0 +1,83 @@ +package main + +import ( + "fmt" + "os" + "strings" +) + +var alphabet []string = []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"} + +// definir metodos de la interface +func ReadData(message string) (int, string) { + var key int + var text string + fmt.Println("Introduce extension key: ") + fmt.Scanf("%d", &key) + fmt.Println(message) + fmt.Scanf("%s", &text) + return key, text +} +func Cipher(key int, text string) string { + mayus := strings.ToUpper(text) + var cipher string + for _, word := range mayus { + for id, letter := range alphabet { + if string(word) == letter { + pos := (id + key) % len(alphabet) + cipher += alphabet[pos] + } + } + } + return cipher + +} + +func Plain(key int, cipher string) string { + mayus := strings.ToUpper(cipher) + var plain string + for _, word := range mayus { + for id, letter := range alphabet { + if string(word) == letter { + pos := (id - key) % len(alphabet) + if pos >= 0 { + plain += alphabet[pos] + } else { + if (pos * -1) <= key { + plain += alphabet[len(alphabet)-(pos*-1)] + } else { + plain += alphabet[pos*-1] + } + } + } + } + } + return plain +} + +func menu_options() { + var option int + for option != 3 { + fmt.Println("I am an encryption not a salad") + fmt.Println("1.-Encryption") + fmt.Println("2.-Decrypt") + fmt.Println("3.-Exit") + fmt.Scanf("%d", &option) + switch option { + case 1: + key, text := ReadData("Introduce text to encrypt: ") + cipher := Cipher(key, text) + fmt.Printf("The New text is : %v \n", cipher) + case 2: + key, text := ReadData("Introduce text to decrypt: ") + plain := Plain(key, text) + fmt.Printf("The Original text is : %v \n", plain) + case 3: + os.Exit(0) + } + } +} + +func main() { + menu_options() +} diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/java/Cflorezp.java" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/java/Cflorezp.java" new file mode 100644 index 0000000000..f9abd8cec1 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/java/Cflorezp.java" @@ -0,0 +1,78 @@ +package reto24cifradoCesar; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; + +public class Cflorezp { + + public static void main(String[] args) throws IOException { + + BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); + + System.out.println("\nIndique si desea cifrar o descifrar una frase\n " + + "1 -> cifrar \n 2 -> descifrar"); + int value = Integer.parseInt(input.readLine()); + + System.out.print("Ingrese la frase: "); + String sentence = input.readLine(); + + char[] sentenceChars = sentence.toCharArray(); + StringBuilder newSentence = new StringBuilder(); + + + for(int i = 0; i < sentenceChars.length; i++){ + if(sentenceChars[i] != ' '){ + newSentence.append(cifradoCesar3(value, String.valueOf(sentenceChars[i]))); + }else{ + newSentence.append(sentenceChars[i]); + } + } + + String finalSentence = newSentence.toString(); + System.out.println(finalSentence); + + } + + public static String cifradoCesar3(int option, String vowel){ + HashMap characters = new HashMap<>(); + characters.put("A", "D"); + characters.put("B", "E"); + characters.put("C", "F"); + characters.put("D", "G"); + characters.put("E", "H"); + characters.put("F", "I"); + characters.put("G", "J"); + characters.put("H", "K"); + characters.put("I", "L"); + characters.put("J", "M"); + characters.put("K", "N"); + characters.put("L", "O"); + characters.put("M", "P"); + characters.put("N", "Q"); + characters.put("O", "R"); + characters.put("P", "S"); + characters.put("Q", "T"); + characters.put("R", "U"); + characters.put("S", "V"); + characters.put("T", "W"); + characters.put("U", "X"); + characters.put("V", "Y"); + characters.put("W", "Z"); + characters.put("X", "A"); + characters.put("Y", "B"); + characters.put("Z", "C"); + + if(option == 2){ + for(String key: characters.keySet()){ + if(characters.get(key).equals(vowel.toUpperCase())){ + return key; + } + } + } + return characters.get(vowel.toUpperCase()); + } + + +} diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/java/EspinoLeandroo.java" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/java/EspinoLeandroo.java" new file mode 100644 index 0000000000..16abe3de14 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/java/EspinoLeandroo.java" @@ -0,0 +1,59 @@ +import java.util.Scanner; + +public class EspinoLeandroo { + + public static void main(String[] args) { + EspinoLeandroo espinoLeandroo = new EspinoLeandroo(); + + Scanner sc = new Scanner(System.in); + + System.out.println("Texto que deseas cifrar "); + String texto = sc.nextLine(); + System.out.println("Con cuanto desplazamiento deseas cifrar "); + int desplazamiento = sc.nextInt(); + + String textoCifrado = espinoLeandroo.cifrarCesar(texto, desplazamiento); + String textoDescifrado = espinoLeandroo.descifrarCesar(textoCifrado, desplazamiento); + System.out.println("Texto cifrado: " + textoCifrado); + System.out.println("Texto descifrado: " + textoDescifrado); + } + + + private String cifrarCesar(String texto, int desplazamiento){ + String resultado = ""; + + for(int i = 0; i 122)? letter : (letter + number > 122)? letter + number - 26 : letter + number); + } + System.out.println(result); + } + + private static void decrypt(String cesar, int number) { + String result = ""; + char[] letters = cesar.toLowerCase().toCharArray(); + for(char letter : letters) { + result += (char)((letter < 97 || letter > 122)? letter : (letter - number < 97)? letter - number + 26 : letter - number); + } + System.out.println(result); + } + +} \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/java/asjordi.java" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/java/asjordi.java" new file mode 100644 index 0000000000..8ec4df57d1 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/java/asjordi.java" @@ -0,0 +1,36 @@ +public class CaesarCipher { + + public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz"; + + public static String encrypt(String text, int shift){ + text = text.toLowerCase(); + StringBuilder encryptStr = new StringBuilder(); + + for (int i = 0; i < text.length(); i++) { + int pos = ALPHABET.indexOf(text.charAt(i)); + int encryptPos = (shift + pos) % 26; + char encryptChar = ALPHABET.charAt(encryptPos); + encryptStr.append(encryptChar); + } + + return encryptStr.toString(); + } + + public static String decrypt(String text, int shift){ + text = text.toLowerCase(); + StringBuilder decryptStr = new StringBuilder(); + + for (int i = 0; i < text.length(); i++) { + int pos = ALPHABET.indexOf(text.charAt(i)); + int decryptPos = (pos - shift) % 26; + + if (decryptPos < 0) decryptPos = ALPHABET.length() + decryptPos; + char decryptChar = ALPHABET.charAt(decryptPos); + + decryptStr.append(decryptChar); + } + + return decryptStr.toString(); + } + +} diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/EzeSandes.js" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/EzeSandes.js" new file mode 100644 index 0000000000..613328eb55 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/EzeSandes.js" @@ -0,0 +1,55 @@ +const ALPHA = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + +/** + * + * @param {String} str + * @param {Number} offset + */ +function caesarEncrypt(str, offset = 3) { + return str + .split('') + .map(letter => { + const idx = (ALPHA.indexOf(letter) + offset) % ALPHA.length; + return ALPHA[idx]; + }) + .join(''); +} + +/** + * + * @param {String} str + * @param {Number} offset + */ +function caesarDecrypt(str, offset = 3) { + return str + .split('') + .map(letter => { + const idx = ALPHA.indexOf(letter) - offset; + return ALPHA[idx < 0 ? ALPHA.length - Math.abs(idx) : idx]; + }) + .join(''); +} + +////////////////////////////////////////////// ENCRYPT + +// console.log(caesarEncrypt('abc')); +// console.log(caesarEncrypt('xyz')); +// console.log(caesarEncrypt('XYZ')); +// console.log(caesarEncrypt('XYZ', 4)); +// console.log(caesarEncrypt('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 6)); + +////////////////////////////////////////////// DECRYPT + +// console.log(caesarDecrypt('abc', 3)); // XYZ +// console.log(caesarDecrypt('def', 3)); // abc +// console.log(caesarDecrypt('def', 6)); // XYZ +// console.log(caesarDecrypt('GHIJKLMNOPQRSTUVWXYZABCDEF', 6)); // ABCDEFGHIJKLMNOPQRSTUVWXYZ + +////////////////////////////////////////////// BOTH METHODS + +function caesarsCode(str, offset = 3, encrypt = true) { + return encrypt ? caesarEncrypt(str, offset) : caesarDecrypt(str, offset); +} + +console.log(caesarsCode('abc', 3, true)); // def +console.log(caesarsCode('abc', 3, false)); // XYZ diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/LucasSantillan.js" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/LucasSantillan.js" new file mode 100644 index 0000000000..97e8e5ef3b --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/LucasSantillan.js" @@ -0,0 +1,28 @@ +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. +*/ + +function cifrarTexto(texto, semilla) { + let transformer = ''; + for(let i=0; i 255 ? (c + semilla + 32) - 256 : c + semilla ; + transformer += String.fromCharCode(c) + } + return transformer; +} + +function descifrarTexto(texto, semilla) { + semilla = 256 - 32 - semilla; + return cifrarTexto(texto, semilla); +} + +let cifrado = cifrarTexto('¡Salve, César, los que van a morir te saludan!', 12) +let descifrado = descifrarTexto(cifrado, 12) + +console.log(cifrado); +console.log(descifrado); diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/Qv1ko.js" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/Qv1ko.js" new file mode 100644 index 0000000000..6151b68fa1 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/Qv1ko.js" @@ -0,0 +1,20 @@ +encrypt("Lorem ipsum dolor sit amet.", 6) +decrypt("gjmzh dknph yjgjm ndo vhzo.", 21) + +function encrypt(text, number) { + let result = "" + const letters = text.toLowerCase().split("") + letters.forEach(letter => { + result += (letter < "a" || letter > "z") ? letter : (letter.charCodeAt(0) + number > 122)? String.fromCharCode(letter.charCodeAt(0) + number - 26) : String.fromCharCode(letter.charCodeAt(0) + number) + }) + console.log(result) +} + +function decrypt(cesar, number) { + let result = "" + const letters = cesar.toLowerCase().split("") + letters.forEach(letter => { + result += (letter < "a" || letter > "z")? letter : (letter.charCodeAt(0) - number < 97)? String.fromCharCode(letter.charCodeAt(0) - number + 26) : String.fromCharCode(letter.charCodeAt(0) - number) + }) + console.log(result) +} diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/anthonysanlucas.js" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/anthonysanlucas.js" new file mode 100644 index 0000000000..b392bd28e0 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/anthonysanlucas.js" @@ -0,0 +1,101 @@ +const alphabet = 'abcdefghijklmnñopqrstuvwxyz' + +const cipher = (message, key) => { + if (typeof message !== 'string' || !/^[a-zA-Z]+$/.test(message)) { + throw new Error('El mensaje debe ser una cadena de texto que contenga solo letras.') + } + + if (typeof key !== 'number' || !Number.isInteger(key)) { + throw new Error('La llave debe ser un número entero.') + } + + let messageToEncrypt = '' + let newArr = message.split('') + let keyToEncrypt = ((key % 27) + 27) % 27 + + newArr.forEach(letter => { + let capitalize = capitalizationChecker(letter) + letter = letter.toLowerCase() + if (alphabet.includes(letter)) { + let newLetter = alphabet[(alphabet.indexOf(letter) + keyToEncrypt) % 27] + messageToEncrypt += isCapitalized(capitalize, newLetter) + } else { + messageToEncrypt += letter + } + }) + + return messageToEncrypt +} + +const decipher = (message, key) => { + if (typeof message !== 'string' || !/^[a-zA-Z]+$/.test(message)) { + throw new Error('El mensaje debe ser una cadena de texto que contenga solo letras.') + } + + if (typeof key !== 'number' || !Number.isInteger(key)) { + throw new Error('La llave debe ser un número entero.') + } + + let messageToDecrypt = '' + let newArr = message.split('') + let keyToDecrypt = ((key % 27) - 27) % 27 + + newArr.forEach(letter => { + let capitalize = capitalizationChecker(letter) + letter = letter.toLowerCase() + if (alphabet.includes(letter)) { + let newLetter = alphabet[(alphabet.indexOf(letter) - keyToDecrypt) % 27] + messageToDecrypt += isCapitalized(capitalize, newLetter) + } else { + messageToDecrypt += letter + } + }) + + return messageToDecrypt +} + +function capitalizationChecker(letter) { + return letter === letter.toUpperCase() +} + +function isCapitalized(capitalize, letter) { + return capitalize ? letter.toUpperCase() : letter +} + +let menuOption + +do { + menuOption = prompt('Menú:\n1. Cipher Text\n2. Decipher Text\n3. Quit') + + switch (menuOption) { + case '1': + let messageToEncrypt = prompt('Ingresa el mensaje a cifrar') + let keyToEncrypt = Number(prompt('Ingresa la llave')) + + try { + alert(cipher(messageToEncrypt, keyToEncrypt)) + } catch (error) { + alert('Error: ' + error.message) + } + break + + case '2': + let messageToDecrypt = prompt('Ingresa el mensaje a descifrar') + let keyToDecrypt = Number(prompt('Ingresa la llave')) + + try { + alert(decipher(messageToDecrypt, keyToDecrypt)) + } catch (error) { + alert('Error: ' + error.message) + } + break + + case '3': + console.log('Never forget the key...') + break + + default: + console.log('Opción inválida. Selecciona una opción del menú.') + break + } +} while (menuOption !== '3') diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/cesar-ch.js" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/cesar-ch.js" new file mode 100644 index 0000000000..fe8ec176a8 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/cesar-ch.js" @@ -0,0 +1,46 @@ +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + */ + +function caesarCipher(text, shift = 3, decrypt = false) { + + if (!decrypt) { + return text.split('').map(e => { + if (e.match(/[a-z]|[A-Z]/)) { + if (97 <= e.charCodeAt() && e.charCodeAt() <= 122 && e.charCodeAt() + shift > 122) { + return String.fromCharCode(e.charCodeAt() + shift - 26) + } else if (65 <= e.charCodeAt() && e.charCodeAt() <= 90 && e.charCodeAt() + shift > 90) { + return String.fromCharCode(e.charCodeAt() + shift - 26) + } + else { + return String.fromCharCode(e.charCodeAt() + shift) + } + } else { + return e + } + + }).join('') + } else { + return text.split('').map(e => { + if (e.match(/[a-z]|[A-Z]/)) { + if (97 <= e.charCodeAt() && e.charCodeAt() <= 122 && e.charCodeAt() - shift < 97) { + return String.fromCharCode(e.charCodeAt() - shift + 26) + } else if (65 <= e.charCodeAt() && e.charCodeAt() <= 90 && e.charCodeAt() - shift < 65) { + return String.fromCharCode(e.charCodeAt() - shift + 26) + } else { + return String.fromCharCode(e.charCodeAt() - shift) + + } + } else { + return e + } + }).join('') + } +} + +console.log(caesarCipher('Mi nombre es MoureDev.', 3, false)) +console.log(caesarCipher('Pl qrpeuh hv PrxuhGhy.', 3, true)) diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/diegomardev.js" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/diegomardev.js" new file mode 100644 index 0000000000..cc0c76f9d5 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/diegomardev.js" @@ -0,0 +1,52 @@ +function cifrado_cesar(text,key){ + let cesar_text = ""; + let cesar_text_ascii = []; + for(let suma=0; suma=65 && cesar_text_ascii[suma]<=90){ + cesar_text_ascii[suma]=cesar_text_ascii[suma]+key; + if(cesar_text_ascii[suma]>90){ + cesar_text_ascii[suma] = 64+(cesar_text_ascii[suma]-90) + } + } + else if(cesar_text_ascii[suma]>=97 && cesar_text_ascii[suma]<=122){ + cesar_text_ascii[suma]=cesar_text_ascii[suma]+key; + if(cesar_text_ascii[suma]>122){ + cesar_text_ascii[suma] = 96+(cesar_text_ascii[suma]-122) + } + } + } + for(let suma=0; suma=65 && cesar_text_ascii[suma]<=90){ + cesar_text_ascii[suma]=cesar_text_ascii[suma]-key; + if(cesar_text_ascii[suma]<65){ + cesar_text_ascii[suma] = 91+(cesar_text_ascii[suma]-65) + } + } + else if(cesar_text_ascii[suma]>=97 && cesar_text_ascii[suma]<=122){ + cesar_text_ascii[suma]=cesar_text_ascii[suma]-key; + if(cesar_text_ascii[suma]<97){ + cesar_text_ascii[suma] = 123+(cesar_text_ascii[suma]-97) + } + } + } + for(let suma=0; suma prev + next; + +function obtenerCaracterEquivalente(caracter) { + let indexAlfabeto = 0; + let caracterEquivalente = ''; + const index = alfabeto.indexOf(caracter); + + if (index === -1) { + return caracter; + } + + if (this.operador === 'codificar') { + indexAlfabeto = index + this.desplazamiento; + caracterEquivalente = indexAlfabeto > 25 ? alfabeto[indexAlfabeto - 24] : alfabeto[indexAlfabeto]; + } + + if (this.operador === 'decodificar') { + indexAlfabeto = index - this.desplazamiento; + caracterEquivalente = indexAlfabeto < 0 ? alfabeto[24 + indexAlfabeto] : alfabeto[indexAlfabeto]; + } + + return caracter === caracter.toUpperCase() ? caracterEquivalente.toUpperCase() : caracterEquivalente; +}; + +const obtenerTextoEquivalente = (texto, configuracion) => { + return [...texto] + .map(obtenerCaracterEquivalente, configuracion) + .reduce(concatenar, ''); +}; + +const codificar = (texto, desplazamiento) => obtenerTextoEquivalente(texto, { desplazamiento, operador: 'codificar' }); + +const decodificar = (texto, desplazamiento) => obtenerTextoEquivalente(texto,{ desplazamiento, operador: 'decodificar' }); diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/marcode24.js" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/marcode24.js" new file mode 100644 index 0000000000..c70fe2a2da --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/marcode24.js" @@ -0,0 +1,36 @@ +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + */ + + +const cesarEncrypt = (str, offset) => { + const alphabet = 'abcdefghijklmnñopqrstuvwxyz'; + const alphabetLength = alphabet.length; + return str + .trim() + .replace(/\s+/g, ' ') + .split(' ') + .map((word) => word.split('').reduce((acc, letter) => { + const isUpperCase = letter === letter.toUpperCase(); + + if (isUpperCase) letter = letter.toLowerCase(); + const index = alphabet.indexOf(letter); + let newIndex = index + offset; + + if (newIndex >= alphabetLength) newIndex -= alphabetLength; + if (newIndex < 0) newIndex += alphabetLength; + + const newLetter = alphabet[newIndex]; + return acc + (isUpperCase ? newLetter.toUpperCase() : newLetter); + }, '')) + .join(' '); +}; + +const cesarDecrypt = (str, offset) => cesarEncrypt(str, -offset); + + +// Visita mi repo en GitHub para ver y correr los tests de este código --> https://github.com/marcode24/weekly-challenges diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/nlarrea.js" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/nlarrea.js" new file mode 100644 index 0000000000..ad8d897f0d --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/nlarrea.js" @@ -0,0 +1,44 @@ +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + */ + +const alphabet = 'abcdefghijklmnñopqrstuvwxyz'; + +const cesarCipher = (text, number = 3, cipher = true) => { + const cipheredText = text.toLowerCase().split('').map(char => { + const currentPosition = alphabet.split('').findIndex(letter => letter === char); + + if (currentPosition !== -1 && cipher) { + let position = currentPosition + number; + + if (position >= alphabet.length) { + position = Math.abs(alphabet.length - position); + } + + return alphabet[position] + } else if (currentPosition !== -1) { + let position = currentPosition - number; + + if (position < 0) { + position = alphabet.length + position; + } + + return alphabet[position] + } else { + return char; + } + }); + + return cipheredText.join(''); +}; + + +console.log(cesarCipher('Hola mundo!')); // krñd oxpgr! +console.log(cesarCipher('abcdefghijklmnñopqrstuvwxyz')); // defghijklmnñopqrstuvwxyzabc +console.log(cesarCipher('abcdefghijklmnñopqrstuvwxyz', 5)); // fghijklmnñopqrstuvwxyzabcde + +console.log(cesarCipher('krñd oxpgr!', 3, false)); // hola mundo! \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/othamae.js" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/othamae.js" new file mode 100644 index 0000000000..a5de9864cc --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/othamae.js" @@ -0,0 +1,33 @@ +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + */ + +function cesarCipher (text, number){ + let cipher = '' + for (let i = 0; i < text.length; i++){ + let char = text.charCodeAt(i) + if (char >= 65 && char <= 90){ + char = ((char - 65 + number+26) % 26) + 65 + } + else if (char >= 97 && char <= 122){ + char = ((char - 97 + number+26) % 26) + 97 + } + cipher += String.fromCharCode(char) + } + return cipher; +} + +function cesarDecipher (text, number){ + return cesarCipher(text, - number) +} + +console.log(cesarCipher('Hola mundo!', 3)) +console.log(cesarDecipher('Krod pxqgr!', 3)) + +console.log(cesarCipher('Hola mundo!', 9)) +console.log(cesarDecipher('Qxuj vdwmx!', 9)) + diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/piterxusDev.js" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/piterxusDev.js" new file mode 100644 index 0000000000..9d502ae6b2 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/piterxusDev.js" @@ -0,0 +1,30 @@ +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + */ + +function caesarCipher(textToEncrypt, displacement, decode) { + let originalAlphabet = "abcdefghijklmnñopqrstuvwxyz".repeat(2); + let lowercaseEncryptedText = textToEncrypt.toLowerCase() + let cipherText = ""; + + for (let i = 0; i < lowercaseEncryptedText.length; i++) { + + + if ((originalAlphabet.indexOf(lowercaseEncryptedText[i]) >= 0)) { + cipherText += originalAlphabet[originalAlphabet.indexOf(lowercaseEncryptedText[i]) + displacement] + } else { + cipherText += " " + } + } + + if (decode) { + return `${cipherText}: ${textToEncrypt}` + } + return cipherText; +} + + diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/test0n3.js" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/test0n3.js" new file mode 100644 index 0000000000..a2b033ea86 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/javascript/test0n3.js" @@ -0,0 +1,109 @@ +function CaesarCipher(str = "", action = "") { + const alphabet = { + a: 0, + b: 1, + c: 2, + d: 3, + e: 4, + f: 5, + g: 6, + h: 7, + i: 8, + j: 9, + k: 10, + l: 11, + m: 12, + n: 13, + ñ: 14, + o: 15, + p: 16, + q: 17, + r: 18, + s: 19, + t: 20, + u: 21, + v: 22, + w: 23, + x: 24, + y: 25, + z: 26, + }; + + const swiftDirections = { positive: 1, negative: -1 }; + + let text = str.split(""); + const swiftDirection = swiftDirections["positive"]; + const swiftNumber = 3; + const alphabetLength = Object.keys(alphabet).length; + + function act() { + if (str.length == 0 || action.length == 0) { + return "input missing"; + } + return process_text(); + } + + function process_text() { + let result = []; + text.forEach((letter) => { + let pos = alphabet[letter.toLowerCase()]; + if (pos == undefined) { + result.push(letter); + } else { + let newLetter = Object.keys(alphabet)[newPosition(pos)]; + if (isUpcase(letter)) { + result.push(newLetter.toUpperCase()); + } else { + result.push(newLetter); + } + } + }); + return result.join(""); + } + + function isUpcase(letter) { + return letter == letter.toUpperCase(); + } + + function newPosition(position) { + let offset = swiftDirection * swiftNumber; + if (action == "decipher") { + offset = -offset; + } + let newPosition = (position + offset) % alphabetLength; + if (newPosition < 0) { + newPosition = alphabetLength + newPosition; + } + return newPosition; + } + + Object.defineProperty(this, "act", { + get: function () { + return act(); + }, + }); +} + +const testsCollections = { + tests: [ + { str: "The quick brown fox jumps over the lazy dog.", action: "cipher" }, + { str: "Wkh txlfn eurzp ira mxosv ryhu wkh ñdcb grj.", action: "decipher" }, + { str: "Aquí va más texto.", action: "cipher" }, + { str: "Dtxí yd oáv whawr.", action: "decipher" }, + { str: "", action: "" }, + ], + expecteds: [ + "Wkh txlfn eurzp ira mxosv ryhu wkh ñdcb grj.", + "The quick brown fox jumps over the lazy dog.", + "Dtxí yd oáv whawr.", + "Aquí va más texto.", + "input missing", + ], +}; + +testsCollections.tests.forEach((test, index) => { + const result = new CaesarCipher(test.str, test.action); + console.log(result.act); + console.log(result.act == testsCollections.expecteds[index]); + console.log("----------------------------------------------------"); +}); diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/kotlin/Mariopolonia0.kt" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/kotlin/Mariopolonia0.kt" new file mode 100644 index 0000000000..e0bb1760a8 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/kotlin/Mariopolonia0.kt" @@ -0,0 +1,78 @@ +package EjercicioKotlin.Mouredev + +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + * + * use el ROT13 para la codificacion + */ +// + +fun main() { + //¿Cómo se puede distinguir a un extrovertido de un introvertido en la NSA? Ra ybf nfprafberf, ry rkgebiregvqb zven ybf mncngbf qr ybf BGEBF gvcbf. + Cifrar().code("Cómo se puede distinguir a un extrovertido de un introvertido en la NSA?") + Cifrar().decipher("Ra ybf nfprafberf, ry rkgebiregvqb zven ybf mncngbf qr ybf BGEBF gvcbf") +} + +class Cifrar() { + + fun decipher(texto: String) { + var cifrado = "" + texto.map { + var codigo = it.code + + if (codigo >= 65 && codigo <= 90) { + for (it in 1..13) { + codigo-- + + if (codigo < 65) { + codigo = 90 + } + } + } else if (codigo >= 97 && codigo <= 122) { + for (it in 1..13) { + codigo-- + + if (codigo < 97) { + codigo = 122 + } + } + } + + cifrado += Char(codigo) + } + println(cifrado) + } + + fun code(texto: String) { + + var cifrado = "" + texto.map { + var codigo = it.code + + if (codigo >= 65 && codigo <= 90) { + for (it in 1..13) { + codigo++ + + if (codigo > 90) { + codigo = 65 + } + } + } else if (codigo >= 97 && codigo <= 122) { + for (it in 1..13) { + codigo++ + + if (codigo > 122) { + codigo = 97 + } + } + } + + cifrado += Char(codigo) + } + println(cifrado) + } +} diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/kotlin/marchdz.kt" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/kotlin/marchdz.kt" new file mode 100644 index 0000000000..d3a896b47e --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/kotlin/marchdz.kt" @@ -0,0 +1,23 @@ +fun caesarCipher(positionsToShift: Int, text: String) { + val lowerCase = "abcdefghijklmnopqrstuvwxyz" + val upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + var textToPrint = "" + + for (character in text) { + textToPrint += when { + character.isLowerCase() -> lowerCase[(lowerCase.indexOf(character) + (positionsToShift % 26) + 26) % 26] + character.isUpperCase() -> upperCase[(upperCase.indexOf(character) + (positionsToShift % 26) + 26) % 26] + else -> character + } + } + println(textToPrint) +} + +fun caesarDecipher(positionsToShift: Int, text: String) { + caesarCipher(-positionsToShift, text) +} + +fun main() { + caesarCipher(35, "Probando el programa") + caesarDecipher(35, "Yaxkjwmx nu yaxpajvj") +} \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/kotlin/pisanowp.kt" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/kotlin/pisanowp.kt" new file mode 100644 index 0000000000..095dca56fd --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/kotlin/pisanowp.kt" @@ -0,0 +1,120 @@ +fun main() { + + /* + * + * Reto #25 12/06/2023 CIFRADO CÉSAR + * + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + * + */ + + //val frase = "Te recomiendo que busques información para conocer en profundidad cómo realizar el cifrado." + + // Pido opción a realizar (C)ifrar o (D)escifrar + val opcion = pideOpcion().uppercase() + + // Pido la frase a tratar + if (opcion == "C") print("Introduce frase a cifrar >") + else print("Introduce frase a descifrar >") + val frase = readLine() + + if (frase != null){ + // Creo mi "máquina" de cifrado, por defecto desplazamiento de 3 + var enigma = CifradoCesar() + var resultado = "" + + if (opcion == "C") resultado = enigma.cifra(frase) + else resultado = enigma.descifra(frase) + + println(resultado) + + } + +} + + + +class CifradoCesar(var desplazamiento: Int = 3){ + + fun cifra(frase:String): String { + var dummy = "" + frase.forEach { + dummy += cifraLetra(it.toChar()) + } + return dummy + } + + fun descifra(frase:String): String{ + var dummy = "" + frase.forEach { + dummy += desCifraLetra(it.toChar()) + } + return dummy + + } + + + + private fun cifraLetra(letra:Char):Char { + val code = letra.code + var newcode = code + + newcode += desplazamiento + if ((letra.code in 97..122) + && (newcode > 122) + ) { + newcode = (newcode % 122) + 97 + + } else if ((letra.code in 65..90) + && (newcode > 90) + ) { + newcode = (newcode % 90) + 65 + } + + return newcode.toChar() + + } + + private fun desCifraLetra(letra:Char):Char { + val code = letra.code + var newcode = code + + newcode -= desplazamiento + if ((letra.code in 97..122) + && (newcode < 97) + ) { + newcode = (122 - (97-newcode) ) + + } else if ((letra.code in 65..90) + && (newcode < 65) + ) { + newcode = (90 - (newcode-65)) + } + + return newcode.toChar() + + } + +} + + + +fun pideOpcion(): String { + var input: String? = null + var valido = false + while (!valido) { + print("¿Qué operación quieres hacer (C)ifrar o (D)escifrar? >") + input = readLine() + if (input in listOf("c", "C", "d", "D")){ + valido = true + } else { + println("Opción inválida.") + } + } + + return input!! +} \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/Bryan112094.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/Bryan112094.py" new file mode 100644 index 0000000000..d738f85f7f --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/Bryan112094.py" @@ -0,0 +1,40 @@ +class encryptionCesar : + def __init__(self, displace: int) : + self.alfabeto = "abcdefghijklmnñopqrstuvwxyz" + self.displace = displace + + def encodeC(self, text: str, option: int): + texto = '' + for letra in text: + if letra in self.alfabeto: + ubicacion = (self.alfabeto.index(letra) + (self.displace if option == 1 else - self.displace)) % len(self.alfabeto) + texto += self.alfabeto[ubicacion] + else: + texto += letra + return texto + + def main(self): + close = True + while close == True: + print("Que desea realizar:\n1. Encriptar\n2. Desencriptar\n3. Salir") + option = input("Escoja una opción (1, 2 ó 3): ") + if int(option) == 1 or int(option) == 2 : + text = input("Ingrese texto: ") + rpta = self.encodeC(text.lower(), int(option)) + print(rpta) + close = False + if int(option) == 3 : + close = False + + +if __name__ == '__main__': + try: + print("Bienvenido al Cifrador Cesar\nPara el desplazamiento de caracteres,") + val = int(input("Ingrese un numero entero: ")) + if val > 0 : + encoder = encryptionCesar(val) + encoder.main() + else: + print('Valor incorrecto') + except: + print('Valor incorrecto') \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ClarkCodes.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ClarkCodes.py" new file mode 100644 index 0000000000..d08c6e0a35 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ClarkCodes.py" @@ -0,0 +1,149 @@ +""" +Retos Semanales ‘23 +Reto #24: CIFRADO CÉSAR +FÁCIL | Publicación: 12/06/23 | Resolución: 19/06/23 + + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. +""" + +# Autor: Clark - @ClarkCodes +# Fecha de Resolución: 15/06/2023 + +# Imports +import typer +from rich import print +from rich.table import Table +from rich import box +from enum import Enum + +# Constantes +ENCODING_VALUE = 3 +MIN_OPTION = 1 +MAX_OPTION = 2 +UPPER_LETTERS_RANGE = range( 65, 91 ) +LOWER_LETTERS_RANGE = range( 97, 123 ) + +# Variables Globales +welcomePending = True + +# Enums +class CypherType( Enum ): + ENCRYPT = 1 + DECRYPT = 2 + +# Funciones - Métodos +def main_menu(): + global welcomePending + + if( welcomePending ): + print( "[green]\nBienvenido al Script de [yellow]El Cifrado César[/yellow], ¡vamos cifrar o decifrar un mensaje![/green] 😀" ) + welcomePending = False + else: + print( "[green]\n¿Ciframos o deciframos otro?" ) + + options_table = Table( "[green]Opción", "[green]Acción", title="[bold yellow]* Elije una Opción *", title_justify="center", box=box.ROUNDED ) + options_table.add_row( "1.", "Cifrar/Encriptar" ) + options_table.add_row( "2.", "Decifrar/Desencriptar" ) + options_table.add_row( "q.", "Salir" ) + + print( "" ) + print( options_table ) + +def index_validator( letter_index : int ) -> int: + is_letter_inside_boundaries = False + # Aplicación Heurística Algorítmica con los indices ascii de letras mayúsculas y minúsculas + if( letter_index < 97 - ENCODING_VALUE ): # Se determina si se trata de letras minúsculas o mayúsculas - Letras mayúsculas + if( letter_index > 90 ): # Determinar si se rebasa por arriba, de ser así se hace que dé la vuelta, lo mismo se hace si se trata del caso contrapuesto + return 64 + ( letter_index - 90 ) + + elif( letter_index < 65 ): # O si se reabasa por debajo + return 91 - ( 65 - letter_index ) + + else: # O si está dentro del rango + is_letter_inside_boundaries = True + + else: # Letras minúsculas + if( letter_index > 122 ): + return 96 + ( letter_index - 122 ) + + elif( letter_index < 97 ): + return 123 - ( 97 - letter_index ) + + else: + is_letter_inside_boundaries = True + + if( is_letter_inside_boundaries ): # Si está dentro del rango, simplemente se devuelve el mismo indice + return letter_index + +def cypher( cypher_type : CypherType, msj : str ) -> str: + encrypted_decrypted_msj = "" + + for letter in msj: + letter_index = ord( letter ) # Se obtiene el indice ascii de la letra + encrypted_decrypted_index = 0 + + if( letter_index in UPPER_LETTERS_RANGE or letter_index in LOWER_LETTERS_RANGE ): + encrypted_decrypted_index = index_validator( letter_index + ENCODING_VALUE ) if( cypher_type == CypherType.ENCRYPT ) else index_validator( letter_index - ENCODING_VALUE ) + encrypted_decrypted_msj += chr( encrypted_decrypted_index ) # Se obtiene la letra del indice ascii del caracter + + else: + encrypted_decrypted_msj += letter + + return encrypted_decrypted_msj + +def encrypt_decrypt( cypher_type : CypherType ): + operation_type = "cifrar/encriptar" if cypher_type == CypherType.ENCRYPT else "descifrar/desencriptar" + past_word = "cifrado/encriptado" if cypher_type == CypherType.ENCRYPT else "descifrado/desencriptado" + + print( f"\nIngrese un mensaje para {operation_type}:" ) + msj = input( "Mensaje: " ) + + if( len( msj ) > 0 ): + print( f"\nSu mensaje {past_word} con Cifrado César es el siguiente:\n" ) + + if( cypher_type == CypherType.ENCRYPT ): + print( cypher( CypherType.ENCRYPT, msj ) ) + else: + print( cypher( CypherType.DECRYPT, msj ) ) + else: + print( print( "\n❌ El mensaje no puede estar vacío, verifique nuevamente." ) ) + +def main(): + print( "[bold green]\n*** Reto #24: CIFRADO CÉSAR - By @ClarkCodes ***" ) + + while True: + main_menu() + + print( "[bold green]Opción elegida", end = "" ) + user_answer = typer.prompt( "", default = str( 1 ) ) + + if( user_answer == 'q' or user_answer == 'Q' ): # Condición de Salida + print( "[green]\n✅ Esto ha sido todo por hoy.\n❤ Muchas gracias por ejecutar este Script, hasta la próxima...💻 Happy Coding!,👋🏼 bye :D\n😎 Clark." ) + break + + try: + user_option = int( user_answer ) # Se convierte la opcion ingresada por el usuario de texto a entero + + if( user_option >= MIN_OPTION and user_option <= MAX_OPTION ): + if( user_option == CypherType.ENCRYPT.value ): # Option #1 + encrypt_decrypt( CypherType.ENCRYPT ) + + elif( user_option == CypherType.DECRYPT.value ): # Option #2 + encrypt_decrypt( CypherType.DECRYPT ) + else: + print( "\n❌ Opción ingresada no disponible, ingrese solo una de las opciones disponibles en el menú, verifique nuevamente." ) + + except ValueError as ve: + print( "\n❌ Opción ingresada no disponible, solo se admiten números enteros positivos mayores o iguales a 2, o la letra 'q' si deseas salir, verifique nuevamente." ) + print( ve ) + except Exception as ex: + print( "\n❌ Oops... algo no ha salido bien, revise nuevamente por favor." ) + print( ex ) + +# Llamada a la Función Principal usando typer +if __name__ == "__main__": + typer.run( main ) diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/EngLeonardorm7.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/EngLeonardorm7.py" new file mode 100644 index 0000000000..4655024dfb --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/EngLeonardorm7.py" @@ -0,0 +1,37 @@ +def cifrado(texto,desplazamiento=3): + cifrado="" + for caracter in texto: + if caracter.isalpha(): + codigo=ord(caracter) + nuevo_codigo=codigo+desplazamiento + + if nuevo_codigo > ord("z"): + nuevo_codigo-=26 + elif nuevo_codigo < ord("A"): + nuevo_codigo+=26 + else: + if nuevo_codigo > ord('z'): + nuevo_codigo -= 26 + elif nuevo_codigo < ord('a'): + nuevo_codigo += 26 + caracter_cifrado=chr(nuevo_codigo) + cifrado+=caracter_cifrado + else: + cifrado+=caracter + return cifrado + +def descifrado(texto, desplazamiento=3): + return cifrado(texto, -desplazamiento) + +a=int(input(""" +1. cifrar +2. descifrar +""")) +if a == 1: + texto=input("type a text") + print(cifrado(texto)) +elif a==2: + texto=input("type a text") + print(descifrado(texto)) +else: + print("type a correct option") diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/EspinoLeandro.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/EspinoLeandro.py" new file mode 100644 index 0000000000..227bc44bea --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/EspinoLeandro.py" @@ -0,0 +1,35 @@ +def cifrar_cesar(texto, desplazamiento): + resultado = "" + for letra in texto: + if letra.isalpha(): + codigo = ord(letra) + codigo_cifrado = (codigo - ord('a') + desplazamiento) % 26 + ord('a') + letra_cifrada = chr(codigo_cifrado) + resultado += letra_cifrada + else: + resultado += letra + return resultado + + +def descifrar_cesar(texto_cifrado, desplazamiento): + resultado = "" + for letra in texto_cifrado: + if letra.isalpha(): + codigo = ord(letra) + codigo_descifrado = (codigo - ord('a') - desplazamiento) % 26 + ord('a') + letra_descifrada = chr(codigo_descifrado) + resultado += letra_descifrada + else: + resultado += letra + return resultado + + +# Ejemplo de uso +texto_original = "hola mundo" +desplazamiento = 3 + +texto_cifrado = cifrar_cesar(texto_original, desplazamiento) +print("Texto cifrado:", texto_cifrado) + +texto_descifrado = descifrar_cesar(texto_cifrado, desplazamiento) +print("Texto descifrado:", texto_descifrado) diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/Hugovrc.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/Hugovrc.py" new file mode 100644 index 0000000000..da86bd3f88 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/Hugovrc.py" @@ -0,0 +1,39 @@ + +def cifrado_cesar(posicion: int, palabra: str, descifrar: False): + abecedario = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","Ñ","O","P","Q","R","S","T","U","V","W","X","Y","Z"] + cifrado = "" + + if descifrar == False: + for letra in palabra: + if letra.upper() in abecedario: + posicion_lista_abcedario = abecedario.index(letra.upper()) + cantidad_total = posicion_lista_abcedario + posicion + + if cantidad_total >= len(abecedario): + nueva_posicion = cantidad_total - len(abecedario) + cifrado += abecedario[nueva_posicion] + else: + cifrado += abecedario[posicion_lista_abcedario + posicion] + else: + cifrado += " " + else: + for letra in palabra: + if letra.upper() in abecedario: + posicion_lista_abcedario = abecedario.index(letra.upper()) + cantidad_total = posicion_lista_abcedario + posicion + if posicion <= len(abecedario): + cifrado += abecedario[posicion_lista_abcedario - posicion] + elif posicion > len(abecedario): + nueva_posicion = cantidad_total - len(abecedario) + cifrado += abecedario[nueva_posicion] + cifrado += abecedario[posicion_lista_abcedario - posicion] + else: + cifrado += " " + print(cifrado) + + +cifrado_cesar(10, "vñ pecdk vemqy uk zrjjk",True) +cifrado_cesar(5, "me gusta mucho la pizza", False) +print() +cifrado_cesar(7, "hola mundo", False) +cifrado_cesar(7, "ÑVRH SBTKV", True) \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/KevinED11.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/KevinED11.py" new file mode 100644 index 0000000000..9d89c13f89 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/KevinED11.py" @@ -0,0 +1,145 @@ +from string import ascii_uppercase +from abc import ABC, abstractmethod + + +class InvalidCharacterError(Exception): + def __init__(self, message: str) -> None: + super().__init__(message) + +class InvalIdCipherError(Exception): + pass + +class InvalidDecrypterError(Exception): + pass + + +class ICipher(ABC): + @property + @abstractmethod + def cipher(self) -> str: + pass + + +class IAlphabet(ABC): + @abstractmethod + def get(self) -> str: + pass + + +class IDecrypter(ABC): + @property + @abstractmethod + def decrypt(self) -> str: + pass + + +class IConversor(ABC): + @property + @abstractmethod + def get(self) -> dict[str, str]: + pass + + +class EnglishAlphabet(IAlphabet): + @staticmethod + def get() -> str: + return ascii_uppercase + " " + + +class SpanishAlphabet(IAlphabet): + @staticmethod + def get() -> str: + return "abcdefghijklmnñopqrstuvwxyz ".upper() + + +class CesarCipherConversor(IConversor): + def __init__(self, alphabet: IAlphabet, shift: int) -> None: + self.__alphabet = alphabet.get() + self.__shift = shift + + @property + def get(self) -> dict[str, str]: + letters = self.__alphabet + cesar = {} + + for i, letter in enumerate(letters): + cesar_position = (i + self.__shift) % len(letters) + cesar_letter = letters[cesar_position] + cesar[letter] = cesar_letter + return cesar + + + +# M + +def convert_text(text: str, conversor: dict[str, str]) -> str: + conversion = "" + for letter in text: + if letter not in conversor: + raise InvalidCharacterError(f"Invalid character: {letter}") + conversion += conversor[letter] + + return conversion + + +class CesarCipher(ICipher): + def __init__(self, text: str, conversor: IConversor) -> None: + self.__text = text.upper() + self.__conversor = conversor.get + + @property + def cipher(self) -> str: + converted_text = convert_text(text=self.__text, conversor=self.__conversor) + + return converted_text + + +class CesarCipherDecrypter(IDecrypter): + def __init__(self, cesar_text: str, conversor: IConversor) -> None: + self.__cesar_text = cesar_text.upper() + self.__conversor = conversor.get + + @property + def decrypt(self) -> str: + conversor = {v: k for k, v in self.__conversor.items()} + converted_text = convert_text(text=self.__cesar_text, conversor=conversor) + + return converted_text + + +class Main: + def __init__(self, cipher: ICipher, decrypter: IDecrypter) -> None: + self.__cipher = cipher + self.__decrypter = decrypter + self.__post_init__() + + def __post_init__(self) -> None: + if not issubclass(type(self.__cipher), ICipher): + raise InvalidDecrypterError("Invalid cipher") + if not issubclass(type(self.__decrypter), IDecrypter): + raise InvalidDecrypterError("Invalid decrypter") + + + def cipher(self) -> str: + return self.__cipher.cipher + + def decrypt(self) -> str: + return self.__decrypter.decrypt + + +if __name__ == "__main__": + alphabet = EnglishAlphabet() + conversor = CesarCipherConversor(alphabet, 3) + try: + cipher = CesarCipher("kevin duenas perro", conversor) + decrypter = CesarCipherDecrypter(cipher.cipher, conversor) + + program = Main(cipher, decrypter) + print(program.cipher()) + print(program.decrypt()) + except (InvalidCharacterError, + InvalIdCipherError, + InvalidDecrypterError) as err: + print(err) + + diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/Rusian69.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/Rusian69.py" new file mode 100644 index 0000000000..85dc9af316 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/Rusian69.py" @@ -0,0 +1,53 @@ +""" + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. +""" +# Lista que se comprobara durante la ejecucion +list_of_words = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", + "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + "0","1", "2", "3", "4", "5", "6", "7", "8", "9", " "] +#funcion +def cipher_cease (): + result = "" + try: +#inicio del sistema + print("Bienvenido al sistema de cifrado Cesar\nDesea cifrar o decodificar un mensaje en este programa\n(C: Para cifrar/D: Para decodificar:)") + insest = str(input("Ingrese su peticion: ")) +#sistema de cifrado + if insest.upper() == "C": + word = str(input("Ingrese la palabra a cifrar: ")) + code = int(input("Ingrese la clave para el cifrado: ")) + for index in word: + vaule = index.upper() + if vaule in list_of_words: + pocition = list_of_words.index(vaule) + result += list_of_words[(pocition + code)] + result = result.lower() +#sistema de decifrado + elif insest.upper() == "D": + word = str(input("Ingrese la palabra a cifrada: ")) + code = int(input("Ingrese la clave para el decifralo: ")) + for index in word: + vaule = index.upper() + if vaule in list_of_words: + pocition = list_of_words.index(vaule) + result += list_of_words[(pocition - code)] + result = result.capitalize() +#contro de errorres en inicio + else: + print ({"Error": "Parametro inicial no aceptado"}) + sentenc = str(input("Desea arracar el programa denuevo?\n(S: si / N: no)\nColoque su peticion: ")) + if sentenc.upper == "S": + cipher_cease () + elif sentenc.upper == "N": + pass + except: + return {"Error": "Sistema no pudo funcionar"} +#resultado + finally: + print("Gracias por usar nuestro servicio de codificacion.") + return result +print(cipher_cease ()) diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/drifterDev.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/drifterDev.py" new file mode 100644 index 0000000000..e802b223bd --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/drifterDev.py" @@ -0,0 +1,48 @@ +def cifrar_mensaje(mensaje, desplazamiento): + letras = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".lower() + mensaje_cifrado = "" + mensaje = mensaje.lower() + for letra in mensaje: + if letra in letras: + mensaje_cifrado += letras[ + (letras.index(letra) + desplazamiento) % (len(letras)) + ] + else: + mensaje_cifrado += letra + return mensaje_cifrado + + +def descifrar_mensaje(mensaje, desplazamiento): + letras = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".lower() + mensaje_descifrado = "" + mensaje = mensaje.lower() + for letra in mensaje: + if letra in letras: + mensaje_descifrado += letras[ + (letras.index(letra) - desplazamiento) % len(letras) + ] + else: + mensaje_descifrado += letra + return mensaje_descifrado + + +if __name__ == "__main__": + try: + modo = int( + input( + "Ingrese la opcion deseada\n1- Cifrar mensaje\n2- Descifrar mensaje\n" + ) + ) + mensaje = input("Por favor ingrese el mensaje\n") + desplazamiento = int( + input( + "Ahora introduzca el número de desplazamientos para realizar el algoritmo\n" + ) + ) + if modo == 1: + print(cifrar_mensaje(mensaje, desplazamiento)) + elif modo == 2: + print(descifrar_mensaje(mensaje, desplazamiento)) + print("\nPrograma finalizado.") + except: + print("Error al introducir la información") diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/fedecoronado.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/fedecoronado.py" new file mode 100644 index 0000000000..2e287b06ac --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/fedecoronado.py" @@ -0,0 +1,64 @@ +def cifrado(letra:str, fase): + if len(letra) == 1: + codigo_org = ord(letra) + if codigo_org>= 65 and codigo_org<=90: + codigo_enc = tranformar(codigo_org, 65, 90, fase) + elif codigo_org>= 97 and codigo_org<=122: + codigo_enc = tranformar(codigo_org, 97, 122, fase) + elif codigo_org>= 192 and codigo_org<=255: + codigo_enc = tranformar(codigo_org, 192, 255, fase) + else: + codigo_enc = codigo_org + else: + print("cifre de una letar por vez") + return False + return chr(codigo_enc) + +def tranformar(codigo, desde, hasta, fase): + if (codigo >= desde and codigo <= hasta and fase > 0): + codigo = codigo + fase + if (codigo > hasta): + codigo = codigo - ((hasta - desde) + 1) + if (codigo >= desde and codigo <= hasta and fase < 0): + codigo = codigo + fase + if (codigo < desde): + codigo = codigo + ((hasta - desde) + 1) + return codigo + +def encriptar(texto: str, fase:int = 7): + if fase >=1 and fase <=25: + encriptado ="" + for letra in texto: + encriptado = encriptado + cifrado(letra, fase) + return encriptado + else: + print("la fase debe ser entre 1 y 25") + return False + +def desencriptar(texto: str, fase:int = 7): + if fase >=1 and fase <=25: + encriptado ="" + for letra in texto: + encriptado = encriptado + cifrado(letra, -fase) + return encriptado + else: + print("la fase debe ser entre 1 y 25") + return False + + +if __name__ == "__main__": + # prueba + for i in range(65,255): + print(i, chr(i), cifrado(chr(i), 4), cifrado(cifrado(chr(i), 4),-4)) + + + #prueba 2 + a = encriptar("federico coronado",10) + b = desencriptar(a,10) + print(a) + print(b) + + a = encriptar("* Crea un programa que realize el cifrado César de un texto y lo imprima. * También debe ser capaz de descifrarlo cuando así se lo indiquemos. * * Te recomiendo que busques información para conocer en profundidad cómo * realizar el cifrado. Esto también forma parte del reto.",10) + b = desencriptar(a,10) + print(a) + print(b) diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/francisco-88.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/francisco-88.py" new file mode 100644 index 0000000000..e8940eaca9 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/francisco-88.py" @@ -0,0 +1,25 @@ +def cifrar(texto, clave): + resultado = "" + + for char in texto: + if char.isalpha(): + ascii_offset = 65 if char.isupper() else 97 + resultado += chr((ord(char) - ascii_offset + clave) % 26 + ascii_offset) + else: + resultado += char + + return resultado + +def descifrar(texto, clave): + return cifrar(texto, -clave) + +opcion = input("¿Quieres cifrar o descifrar? Por favor utiliza c=cifrar o d=descifrar: ") +clave = int(input("Ingresa el número de desplazamientos: ")) +mensaje = input("Ingresa el mensaje: ") + +if opcion.lower() == "c": + print("Mensaje cifrado: " + cifrar(mensaje, clave)) +elif opcion.lower() == "d": + print("Mensaje descifrado: " + descifrar(mensaje,clave)) +else: + print("Opción inválida") \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/gonsomito.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/gonsomito.py" new file mode 100644 index 0000000000..ee10f4db52 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/gonsomito.py" @@ -0,0 +1,45 @@ +""" + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. +""" + +#En esta función recibo texto y clave para realizar la transcripción/cifrado. +#Hago uso de la funcion char()y ord() para sumar con valor ASCII. Devuelve el resultado +def caesar_palace_cyph(texto, clave): + resultado = "" + for char in texto: + if ord(char) >= 65 and ord(char) <= 90: + resultado += chr((ord(char) - 65 + clave) % 26 + 65) + else: + resultado += char + return resultado + +#Para no repetir código, uso esta función que pide texto y clave de codificación. +def dame_texto(): + texto = input("Introduce texto: ").upper() + clave = int(input("Qué clave numérica quieres usar: ")) + return texto, clave + +#Este menú controla las opciones de cifrado en ambas direcciones. Salir si no se marca una válida. +def menu(): + print("BIENVENIDO AL CIFRADOR / DESCIFADROR <>\n¿Qué quieres hacer?") + print("1. Cifrar texto") + print("2. Descifrar texto") + print("") + opcion = input("Ingrese una opción (1 o 2). Cualquier otra opción para SALIR: ") + if opcion == "1": + texto, clave = dame_texto() + resultado = caesar_palace_cyph(texto, clave) + print("Texto cifrado:", resultado) + elif opcion == "2": + texto, clave = dame_texto() + resultado = caesar_palace_cyph(texto, clave*-1) + print("Texto descifrado:", resultado) + else: + print("Opción NO válida. Adiós muy buenas.") + return False + +menu() diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ingjavierpinilla.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ingjavierpinilla.py" new file mode 100644 index 0000000000..4984df4c29 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ingjavierpinilla.py" @@ -0,0 +1,39 @@ +import string + +ASCII_UPPERCASE = list(string.ascii_uppercase) + + +def encrypt(text: str, shift: int): + return caesar_cipher(text, shift, True) + + +def decrypt(text: str, shift: int): + return caesar_cipher(text, shift, False) + + +def caesar_cipher(text: str, shift: int = 3, operation: bool = True) -> str: + coded_text = "" + text = text.upper() + + for c in text: + if c not in ASCII_UPPERCASE: + coded_text += c + continue + _shift = shift if operation else shift * -1 + new_index = (ASCII_UPPERCASE.index(c) + _shift) % len(ASCII_UPPERCASE) + coded_text += ASCII_UPPERCASE[new_index] + return coded_text + + +if __name__ == "__main__": + text = str(input("Por favor ingrese el texto: ")) + shift = int(input("Por favor ingrese el desplazamiento: ")) + operation = int( + input("Por favor indique la operacion: \n1. Encriptar \n2. Desencriptar\n") + ) + if operation == 1: + print(encrypt(text=text, shift=shift)) + elif operation == 2: + print(decrypt(text=text, shift=shift)) + else: + print("Operación invalida") diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jarkillo.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jarkillo.py" new file mode 100644 index 0000000000..2254a0be2c --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jarkillo.py" @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon Jun 12 21:26:55 2023 + +@author: Jarko +""" + +# Reto MoureDev cifrado Cesar + +# Funcion cifrado + +def cifrado(texto,k, opcion): + + # creamos la variable string cifrado. + + cifrado = "" + + + # Bucle para cada letra del texto + + for letra in texto: + + if letra == letra.lower () : + + alfabeto = "abcdefghijklmnñopqrstuvwxyz" + + if opcion == 2: # En caso de descifrar lo hacemos al reves + + alfabeto = alfabeto[::-1] + + letra_cifrada = alfabeto[(alfabeto.index(letra) + k) % len(alfabeto)] + + cifrado += letra_cifrada + + + + elif letra == letra.upper () : + + alfabeto = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ" + + if opcion == 2: + + alfabeto = alfabeto[::-1] + + cifrado += alfabeto [(alfabeto.index(letra) + k) % len(alfabeto)] + + else: # En caso de usar simbolos o numeros se mantienen igual + + cifrado += letra + + + # Cargamos la clave cifrada/descifrada en salida + + print ("Hasta pronto") + return (cifrado) + + +# Funcion menu para cifrar o descifrar + +def menu(): + + print ("¿Que quieres hacer?") + print () + print ("1. Cifrado") + print ("2. Descifrado") + print ("3. Salir") + print () + + opcion = input ( "Selecciona una opción: ") + opcion = int (opcion) + + if opcion == 1: # Hacemos cifrado + + texto = input ("Introduce el texto a cifrar: ") + + k = int (input ("Introduce el valor de desplazamiento: ")) + + texto_cifrado = cifrado(texto, k, opcion) + + print () + print ("El texto cifrado es: ", texto_cifrado) + print () + + menu () + + elif opcion == 2: # Hacemos descifrado + + texto = input ("Introduce el texto a descifrar: ") + k = int (input ("Introduce el valor de desplazamiento: ")) + + + texto_descifrado = cifrado (texto, k, opcion) + print () + print ("El texto descifrado es: ", texto_descifrado) + print () + + menu () + + elif opcion == 3: # Cerramos el programa + + return + + + else: + + print ("Introduce una opción posible, 1, 2 o 3") + menu () + + +menu() diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jcdm60.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jcdm60.py" new file mode 100644 index 0000000000..72de156b54 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jcdm60.py" @@ -0,0 +1,62 @@ +# Reto #24: Cifrado César +#### Dificultad: Fácil | Publicación: 12/06/23 | Corrección: 19/06/23 + +## Enunciado + +# +# Crea un programa que realize el cifrado César de un texto y lo imprima. +# También debe ser capaz de descifrarlo cuando así se lo indiquemos. +# +# Te recomiendo que busques información para conocer en profundidad cómo +# realizar el cifrado. Esto también forma parte del reto. +# + +class CifradorCesar: + def __init__(self, desplazamiento): + self.desplazamiento = desplazamiento + + def cifrar(self, texto): + resultado = self.transformar_texto(texto, self.desplazamiento) + return resultado + + def descifrar(self, texto): + resultado = self.transformar_texto(texto, -self.desplazamiento) + return resultado + + def transformar_texto(self, texto, desplazamiento): + resultado = "" + for caracter in texto: + if caracter.isalpha(): + codigo = ord(caracter) + desplazamiento + if caracter.isupper(): # Letras mayúsculas + codigo = (codigo - 65) % 26 + 65 + else: # Letras minúsculas + codigo = (codigo - 97) % 26 + 97 + caracter_transformado = chr(codigo) + resultado += caracter_transformado + else: + resultado += caracter + return resultado + + +class ConsolaUsuario: + def ejecutar(self): + texto = input("Ingrese el texto: ") + desplazamiento = int(input("Ingrese el desplazamiento: ")) + modo = input("Ingrese 'cifrar' o 'descifrar': ") + + cifrador = CifradorCesar(desplazamiento) + + if modo.lower() == "cifrar": + resultado = cifrador.cifrar(texto) + elif modo.lower() == "descifrar": + resultado = cifrador.descifrar(texto) + else: + resultado = "Modo inválido. Ingrese 'cifrar' o 'descifrar'." + + print("Resultado:", resultado) + + +if __name__ == "__main__": + consola_usuario = ConsolaUsuario() + consola_usuario.ejecutar() diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jose0912.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jose0912.py" new file mode 100644 index 0000000000..e654809044 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jose0912.py" @@ -0,0 +1,58 @@ +import string + +lower = list(string.ascii_lowercase) +upper = list(string.ascii_uppercase) +digits = list(string.digits) +alph = list(string.ascii_letters) + digits + +def change_index(_list, n): + encrypt = '' + + for x in _list: + index = _list.index(x) + n + if index >= len(_list): + multi = 1 + if index >= len(_list)*2: + multi = round(index/len(_list)) + + index = index - (len(_list) * multi) + + encrypt+= _list[index] + + return encrypt + +def alph_crypt(n): + lower_crypt = change_index(lower, n) + upper_crypt = change_index(upper, n) + digits_crypt = change_index(digits, n) + alph_crypt = lower_crypt + upper_crypt + digits_crypt + + return alph_crypt + +def procces(word, alph1, alph2): + new_text = '' + for letter in word: + if letter in alph1: + index_letter = alph1.index(letter) + new_text+= alph2[index_letter] + else: + new_text+=letter + + return new_text + +def encrypt(word, n): + return procces(word, alph, alph_crypt(n)) + +def decrypt(word, n): + return procces(word, alph_crypt(n), alph) + +_type = int(input("(ENCRYPT=1, DECRYPT=2): ")) +disp = int(input("DISPLACEMENTS: ")) +txt = input("TYPE THE TEXT: ") + +if _type == 1: + print(f'RESULT: {encrypt(txt,disp)}') +elif _type == 2: + print(f'RESULT: {decrypt(txt,disp)}') +else: + print("----") \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jpirulo.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jpirulo.py" new file mode 100644 index 0000000000..cfb09a4b89 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/jpirulo.py" @@ -0,0 +1,75 @@ +from termcolor import colored + + +class CesarCipher: + def __init__(self, shift): + self.shift = shift + + def encrypt(self, plaintext): + encrypted_text = "" + for char in plaintext: + if char.isalpha() or char.isdigit() or char.isspace() or char in [".", ",", "!", "?"]: + if char.isalpha(): + encrypted_char = chr((ord(char.upper()) - 65 + self.shift) % 26 + 65) + encrypted_text += encrypted_char if char.isupper() else encrypted_char.lower() + else: + encrypted_text += char + else: + raise ValueError("Invalid input. Only alphanumeric characters, spaces, and punctuation marks are allowed.") + return encrypted_text + + def decrypt(self, ciphertext): + decrypted_text = "" + for char in ciphertext: + if char.isalpha() or char.isdigit() or char.isspace() or char in [".", ",", "!", "?"]: + if char.isalpha(): + decrypted_char = chr((ord(char.upper()) - 65 - self.shift) % 26 + 65) + decrypted_text += decrypted_char if char.isupper() else decrypted_char.lower() + else: + decrypted_text += char + else: + raise ValueError("Invalid input. Only alphanumeric characters, spaces, and punctuation marks are allowed.") + return decrypted_text + + +def colored_input(prompt, color): + return input(colored(prompt, color)) + + +def cipher_decorator(func): + def wrapper(): + try: + text = colored_input("Enter the text: ", "blue") + shift = int(colored_input("Enter the shift value: ", "magenta")) + cipher = CesarCipher(shift) + result = func(cipher, text) + print(colored("Result: ", "green") + colored(result, "yellow")) + except ValueError as e: + print(colored(str(e), "red")) + except UnicodeDecodeError: + print(colored("Unable to decrypt the text. Please ensure that only alphanumeric characters, spaces, and punctuation marks are used.", "red")) + + return wrapper + + +@cipher_decorator +def encrypt_text(cipher, text): + return cipher.encrypt(text) + + +@cipher_decorator +def decrypt_text(cipher, text): + return cipher.decrypt(text) + + +if __name__ == "__main__": + try: + choice = colored_input("Choose an option (1: Encrypt, 2: Decrypt): ", "cyan") + if choice == "1": + encrypt_text() + elif choice == "2": + decrypt_text() + else: + print(colored("Invalid choice!", "red")) + except KeyboardInterrupt: + print(colored("\nProgram terminated by user.", "yellow")) diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/juanppdev.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/juanppdev.py" new file mode 100644 index 0000000000..4da1537fde --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/juanppdev.py" @@ -0,0 +1,46 @@ +from __future__ import print_function +# The Caesar Cipher Algorithm + +def main(): + message = input("Introducir Mensaje: ") + key = int(input("Key [1-26]: ")) + mode = input("Cifrar o Descifrar [c/d]: ") + + if mode.lower().startswith('c'): + mode = "cifrar" + elif mode.lower().startswith('d'): + mode = "descifrar" + + translated = encdec(message, key, mode) + if mode == "cifrar": + print(("Mensaje Cifrado:", translated)) + elif mode == "descifrar": + print(("Mensaje Descifrado:", translated)) + +def encdec(message, key, mode): + message = message.upper() + translated = "" + LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + for symbol in message: + if symbol in LETTERS: + num = LETTERS.find(symbol) + if mode == "cifrar": + num = num + key + elif mode == "descifrar": + num = num - key + + if num >= len(LETTERS): + num -= len(LETTERS) + elif num < 0: + num += len(LETTERS) + + translated += LETTERS[num] + else: + translated += symbol + return translated + +if __name__ == '__main__': + import doctest + doctest.testmod() + main() + input() \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/klyone.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/klyone.py" new file mode 100644 index 0000000000..097ad8430d --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/klyone.py" @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ" + +def are_arguments_valid(text, n): + if n == 0 or abs(n) >= len(alphabet): + return False + else: + return True + +def prepare_text(text): + return text.upper() + +def translate_text(text, jumps): + translate = "" + + for t in text: + if t in alphabet: + pos = alphabet.find(t) + pos = (pos + jumps) % len(alphabet) + t = alphabet[pos] + + translate += t + return translate + +def encode_cesar(text, n): + if not are_arguments_valid(text, n): + return text + + text = prepare_text(text) + return translate_text(text, n) + +def decode_cesar(text, n): + return encode_cesar(text, -n) + +if __name__ == "__main__": + print(encode_cesar("HELLO WORLD", 2)) + print(decode_cesar(encode_cesar("NICE ONE", 5), 5)) + print(encode_cesar("ThiS Is A WonderFULl PLaCE", 17)) diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ludmila-nus.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ludmila-nus.py" new file mode 100644 index 0000000000..19615a804a --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ludmila-nus.py" @@ -0,0 +1,79 @@ +'''Crea un programa que realize el cifrado César de un texto y lo imprima. +También debe ser capaz de descifrarlo cuando así se lo indiquemos.''' + +# importamos modulo para imprimir por pantalla en color +from termcolor import colored + +# programa saluda al usuario +print('---Bienvenido al sistema de codificación ROT13---') +print('') +# parametros de traduccion - el programa traducira el texto segun cifrado cesar (ROT13) +# sustituyendo cada letra, por la letra que está 13 posiciones por delante en el alfabeto +rot13_min = 'abcdefghijklmnopqrstuvwxyz' +rot13_may = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + +# creamos un ciclo while para que el programa siga funcionando hasta que el usuario no quiera traducir nada mas +continuar = True +while continuar: + # Le pedimos al usuario que seleccione una opcion + accion = input('¿Que accion necesita realizar? \n\t1-Realizar un cifrado a ROT13 \n\t2-Desifrar un texto codificado en ROT13 \n\t3-salir \n\topcion: ') + print('') + # segun la opcion que eliga 1, 2, o 3 + if accion == '1' or accion == '2': + # pedimos por pantalla un texto + texto = input('Ingrese un texto: ') + # copiamos el texto ingresada para no modifical la original + texto_rot13 = texto + # creamos un bucle para que recorra el texto y reemplace las letras + for letra in texto: + # si la letra del texto que escribio esta en minuscula + if letra in rot13_min: + posicion = rot13_min.find(letra) + 13 + # si la posicion en menor a la longitud del abecedario + if posicion < 26: + # reemplazamos la letra de la texto por la letra segun su ubicacion ( 13 lugares mas adelante) + texto_rot13 = texto_rot13.replace(letra,rot13_min[posicion]) + # si la posicion supera la longitud del abecedario + else : + # le restamos a la posicion la longitud del abecedario para que de la posicion correcta + posicion = posicion - 26 + texto_rot13 = texto_rot13.replace(letra,rot13_min[posicion]) + # si la letra del texto que escribio esta en mayuscula + elif letra in rot13_may: + posicion = rot13_may.find(letra) + 13 + # si la posicion en menor a la longitud del abecedario + if posicion < 26: + # reemplazamos la letra de la texto por la letra segun su ubicacion ( 13 lugares mas adelante) + texto_rot13 = texto_rot13.replace(letra,rot13_may[posicion]) + # si la posicion supera la longitud del abecedario + else : + # le restamos a la posicion la longitud del abecedario para que de la posicion correcta + posicion = posicion - 26 + texto_rot13 = texto_rot13.replace(letra,rot13_may[posicion]) + + if accion == '1': + # el programa muestra por pantalla el texto traducido + print(colored(f'Traduccion de texto a cifrado ROT13: \n{texto_rot13}','magenta')) + + elif accion == '2': + # el programa muestra por pantalla el texto traducido + print(colored(f'Desifrado de texto codificado en ROT13: \n{texto_rot13}','green')) + + # preguntamos si quiere volver al menu de inicio de lo contrario el sistema se cierra + print('') + volver = input('¿Quiere volver al menu de inicio? si/no: ') + print('') + if volver == 'no': + print('Gracias por utilizar el sistema de codificacion ROT13') + continuar = False + + elif accion == '3': + print('Gracias por utilizar el sistema de codificacion ROT13') + continuar = False + + else : + print('') + print(colored('¡Opcion invalida! \n--- seleccione una opcion correcta ---','yellow')) + print('') + + diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/majinka10.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/majinka10.py" new file mode 100644 index 0000000000..2588018707 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/majinka10.py" @@ -0,0 +1,42 @@ +alphabet="abcdefghijklmnñopqrstuvwxyz" + +def normalize(s): + replacements = ( + ("á", "a"), + ("é", "e"), + ("í", "i"), + ("ó", "o"), + ("ú", "u"), + ) + for a, b in replacements: + s = s.replace(a, b).replace(a.upper(), b.upper()) + return s + +options=[1,2] + +sentido=input('Ingresa 1 para desplazar hacia la derecha o 2 para desplazar hacia la izquierda\n') + +while int(sentido) not in options: + sentido=input('Ingresa 1 para desplazar hacia la derecha o 2 para desplazar hacia la izquierda\n') + +dezplazamiento=input('Ingresa la cantidad de desplazamientos\n') +texto=input('Ingresa el texto a cifrar\n') +cifrado='' +if int(sentido) == 1: + for letra in normalize(texto.lower()): + if letra in alphabet: + index=alphabet.index(letra) + cifrado+=alphabet[(index+int(dezplazamiento))%27] + else: + cifrado+=letra +elif int(sentido)==2: + for letra in normalize(texto.lower()): + if letra in alphabet: + index=alphabet.index(letra) + cifrado+=alphabet[(index-int(dezplazamiento))%27] + else: + cifrado+=letra + +print(cifrado) + + diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/maurighar.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/maurighar.py" new file mode 100644 index 0000000000..4eb5efe936 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/maurighar.py" @@ -0,0 +1,34 @@ +alfabeto_normal = 'abcdefghijklmnopqrstuvwxyz 1234567890' + +def encode_cesar(message:str, shift:int) -> str: + message = message.lower() + message_cifer = '' + for string in message: + index = alfabeto_normal.find(string) + if index >= 0: + message_cifer += alfabeto_normal[index + shift] + else: + message_cifer += '#' + + return message_cifer + +def decode_cesar(message:str, shift:int) -> str: + message = message.lower() + message_clear = '' + for string in message: + index = alfabeto_normal.find(string) + if index >= 0: + message_clear += alfabeto_normal[index - shift] + else: + message_clear += '#' + + return message_clear + +if __name__ == "__main__": + mensaje = 'te recomiendo que busques informacion para conocer en profundidad' + mensaje = 'prueba 234, si (?/7Ú\),\n MAYUSCULAS' + print(encode_cesar(mensaje, 3)) + + mensaje = 'wh3uhfrplhqgr3txh3exvtxhv3lqirupdflrq3sdud3frqrfhu3hq3surixqglgdg' + mensaje = 'suxhed3567#3vl3###0####3pd1xvfxodv' + print(decode_cesar(mensaje, 3)) diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/mouredev.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/mouredev.py" new file mode 100644 index 0000000000..934600addd --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/mouredev.py" @@ -0,0 +1,22 @@ +import string + +def caesar_cipher(text: str, decrypt = False, shift = 3): + + alphabet = list(string.ascii_lowercase) + alphabet.insert(alphabet.index("n") + 1, "ñ") + + caesar_text = "" + + for value in text.lower(): + if value in alphabet: + index = (alphabet.index(value) + (-shift if decrypt else shift)) % len(alphabet) + caesar_text += alphabet[index] + else: + caesar_text += value + + print(caesar_text) + +caesar_cipher("Mi nombre es MoureDev.") +caesar_cipher("ol proeuh hv orxuhghy.", True) +caesar_cipher("Mi nombre es MoureDev.", shift=5) +caesar_cipher("qn rtqgwj jx qtzwjija.", True, 5) \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/nlarrea.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/nlarrea.py" new file mode 100644 index 0000000000..471a02f7ce --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/nlarrea.py" @@ -0,0 +1,44 @@ +""" + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. +""" + +alphabet = [char for char in 'abcdefghijklmnñopqrstuvwxyz'] + +def cesar_cipher(text, number = 3, cipher = True): + text_list = [char for char in text.lower()] + + def map_func(char): + try: + current_position = alphabet.index(char) + + if cipher: + position = current_position + number + + if position >= len(alphabet): + position = abs(len(alphabet) - position) + + return alphabet[position] + else: + position = current_position - number + + if position < 0: + position = len(alphabet) + position + + return alphabet[position] + except ValueError: + return char + + ciphered_text = list(map((lambda x: map_func(x)), text_list)) + + return ''.join(ciphered_text) + + +print(cesar_cipher('Hola mundo!')) # krñd oxpgr! +print(cesar_cipher('abcdefghijklmnñopqrstuvwxyz')) # defghijklmnñopqrstuvwxyzabc +print(cesar_cipher('abcdefghijklmnñopqrstuvwxyz', 5)) # fghijklmnñopqrstuvwxyzabcde + +print(cesar_cipher('krñd oxpgr!', 3, False)) # hola mundo! \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/pyramsd.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/pyramsd.py" new file mode 100644 index 0000000000..531bcde79c --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/pyramsd.py" @@ -0,0 +1,42 @@ +# No estoy usando la letra ñ +print("Cifrado Cesar") + +TAM_MAX = 26 # total de letras + +def Mensaje(): + print("Introduzca mensaje: ") + return input("-> ").lower() + + +def ObtenerRot(): + rot = 0 + while True: + print(f"Ingrese ROT (1 - {TAM_MAX})") + rot = int(input("-> ")) + if rot >= 1 and rot <= TAM_MAX: + return rot + + +def MensajeTraducido(mensaje, rot): + traduccion = "" + + for letra in mensaje: + if letra.isalpha(): + num = ord(letra) + num += rot + + if num > ord("z"): + num -= 26 + elif num < ord("a"): + num += 26 + + traduccion += chr(num) + else: + traduccion += letra + + print(f"Traduccion: {traduccion}") + +mensaje = Mensaje() +rot = ObtenerRot() + +MensajeTraducido(mensaje, rot) diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ycanas.py" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ycanas.py" new file mode 100644 index 0000000000..4b62d5f5dd --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/python/ycanas.py" @@ -0,0 +1,24 @@ +def cipher(text, decrypt, n): + alphabet = "abcdefghijklmnñopqrstuvwxyz" + output = "" + + for letter in text: + is_upper = letter.isupper() + letter = letter.lower() + + if letter in alphabet: + index = (alphabet.index(letter) + ( - n if decrypt else n)) % len(alphabet) + output = output + (alphabet[index].upper() if is_upper else alphabet[index]) + + else: + output = output + letter + + return output + + +text = "Yair Cañas" + +cipher_text = cipher(text, False, 2) +decrypt_text = cipher(cipher_text, True, 2) + +print(cipher_text + '\n' + decrypt_text) diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/ruby/test0n3.rb" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/ruby/test0n3.rb" new file mode 100644 index 0000000000..52159ca156 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/ruby/test0n3.rb" @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +# class CaesarCypher +class CaesarCipher + attr_accessor :input + + ALPHABET = { 'a' => 0, 'b' => 1, 'c' => 2, 'd' => 3, 'e' => 4, 'f' => 5, 'g' => 6, 'h' => 7, + 'i' => 8, 'j' => 9, 'k' => 10, 'l' => 11, 'm' => 12, 'n' => 13, 'ñ' => 14, 'o' => 15, + 'p' => 16, 'q' => 17, 'r' => 18, 's' => 19, 't' => 20, 'u' => 21, 'v' => 22, + 'w' => 23, 'x' => 24, 'y' => 25, 'z' => 26 }.freeze + + SWIFT_DIRECTIONS = { 'positive' => 1, 'negative' => -1 }.freeze + + def initialize(input = { text: nil, action: nil }) + @input = input + @text = input[:text] + @action = input[:action] + @swift_direction = SWIFT_DIRECTIONS['positive'] + @swift_number = 3 + end + + def act + return 'input missing' if @action.nil? || @input.nil? + + process_text + end + + def process_text + @text.chars.map do |letter| + pos = ALPHABET[letter.downcase] + if pos.nil? + letter + else + new_value = ALPHABET.key(new_position(pos)).dup + upcase?(letter) ? new_value.upcase! : new_value + end + end.join + end + + private + + def upcase?(character) + character == character.upcase + end + + def new_position(position) + offset = @swift_direction * @swift_number + offset *= -1 if @action == 'decipher' + + (position + offset) % ALPHABET.size + end +end + +# puts CaesarCipher.new({ text: 'The quick brown fox jumps over the lazy dog.', action: 'cipher' }).act +# puts CaesarCipher.new({ text: 'Wkh txlfn eurzp ira mxosv ryhu wkh ñdcb grj.', action: 'decipher' }).act +# puts CaesarCipher.new.act diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/rust/vbayarri.rs" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/rust/vbayarri.rs" new file mode 100644 index 0000000000..6ace8f17f2 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/rust/vbayarri.rs" @@ -0,0 +1,105 @@ +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + */ + +/* + * Información sobre el cifrado César: https://es.wikipedia.org/wiki/Cifrado_C%C3%A9sar + * Función de módulo para no utilizar dos arrays visto en ejercicio de fegorama.c con referencia + * a https://stackoverflow.com/questions/14997165/fastest-way-to-get-a-positive-modulo-in-c-c/14997413#14997413 + */ + +// Constantes +const ALPHABET: &str = "abcdefghijklmnopqrstuvwxyz"; + +fn main() { + + // Se comprueban los argumentos de entrada. + let args: Vec = std::env::args().collect(); + + // Validar el número de argumentos. + if args.len() != 4 { + println!("Uso: vbayarri -e|-d number texto"); + println!(" -e: cifrar"); + println!(" -d: descifrar"); + println!(" number: número de posiciones a desplazar"); + println!(" texto: texto a cifrar o descifrar"); + return; + } + + // Validar la opción. + if args[1] != "-e" && args[1] != "-d" { + println!("Opción no válida."); + return; + } + let option = &args[1]; + + // Validar el número de posiciones. + let number: i32 = match args[2].parse() { + Ok(n) => n, + Err(_) => { + println!("Número de posiciones no válido."); + return; + } + }; + + // Validar el texto y convertirlo a minúsculas. + let text = &args[3]; + let text = text.to_lowercase(); + + // Mostrar la información por consola. + println!("Opción: {}", option); + println!("Número de posiciones: {}", number); + println!("Texto entrada: {}", text); + + // Cifrar o descifrar el texto. + let result = match option.as_str() { + "-e" => encrypt(text, number), + "-d" => decrypt(text, number), + _ => { + println!("Opción no válida."); + return; + } + }; + + // Mostrar el resultado. + println!("Texto salida: {}", result); +} + +// Función para cifrar un texto. +fn encrypt(text: String, number: i32) -> String { + cesar(text, number) +} + +// Función para descifrar un texto. +fn decrypt(text: String, number: i32) -> String { + cesar(text, -number) +} + +// Función base para cifrar y descifrar una cadena de texto. +fn cesar(text: String, number: i32) -> String { + let mut result = String::new(); + for c in text.chars() { + let index = ALPHABET.find(c); + match index { + Some(i) => { + let new_index = modulo(i as i32 + number, ALPHABET.len() as u32); + result.push(ALPHABET.chars().nth(new_index as usize).unwrap()); + }, + None => result.push(c) + } + } + result +} + +// Función de módulo para calcular el desplazamiento. +fn modulo(value: i32, m: u32) -> i32 { + let mut modu = value % (m as i32); + if modu < 0 { + modu += m as i32; + } + modu +} \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/swift/allbertoMD.swift" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/swift/allbertoMD.swift" new file mode 100644 index 0000000000..64747e1fda --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/swift/allbertoMD.swift" @@ -0,0 +1,49 @@ + +import Foundation + +let abc: [Character] = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "ñ", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] + +var text = """ + El sol brillaba en el cielo despejado mientras las aves revoloteaban entre los árboles. El aroma fresco de la hierba recién cortada llenaba el aire. Los niños jugaban en el parque, riendo y corriendo felices. En el centro de la ciudad, las calles estaban llenas de vida, con gente apresurada de un lado a otro. En los cafés, las personas disfrutaban de su taza de café matutina. Mientras tanto, en un rincón tranquilo de la biblioteca, un estudiante se sumergía en sus libros, absorbido por el conocimiento. El mundo seguía girando, lleno de momentos cotidianos que hacen que la vida sea maravillosa. +""" + +func cesarCipher(transport: Int, text: String) { + var textArray: [Character] = [] + + let moveIndex = transport + + for i in text { + textArray.append(i) + } + + for n in 0..= (abc.count - moveIndex) { + textArray[n] = abc[(m - abc.count) + moveIndex] + break + } + textArray[n] = abc[m + moveIndex] + break + } + } + if checkUppercase { + textArray[n] = Character(textArray[n].uppercased()) + } + } + + var newText = "" + for i in textArray { + newText.append(i) + } + + print(newText) +} + +cesarCipher(transport: 3, text: text) diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/swift/franpua.swift" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/swift/franpua.swift" new file mode 100644 index 0000000000..e3376c053f --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/swift/franpua.swift" @@ -0,0 +1,22 @@ +import Foundation + +func caesarCipher(text: String, decrypt: Bool = false, shift: Int = 3) { + let alphabet = Array("abcdefghijklmnopqrstuvwxyz") + var caesarText = "" + + for value in text.lowercased() { + if let index = alphabet.firstIndex(of: value) { + let newIndex = ((index + (decrypt ? -shift: shift) + alphabet.count) % alphabet.count) + caesarText.append(alphabet[newIndex]) + } else { + caesarText += value.description + } + + } + print(caesarText) +} + +caesarCipher(text: "Paco") +caesarCipher(text: "sdfr", decrypt: true) +caesarCipher(text: "estoy cansado de vivir en zaragoza") +caesarCipher(text: "hvwrb fdqvdgr gh ylylu hq cdudjrcd", decrypt: true) \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/typescript/Mod8124.ts" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/typescript/Mod8124.ts" new file mode 100644 index 0000000000..5d2fdb6c2b --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/typescript/Mod8124.ts" @@ -0,0 +1,35 @@ +/* + * Crea un programa que realize el cifrado César de un texto y lo imprima. + * También debe ser capaz de descifrarlo cuando así se lo indiquemos. + * + * Te recomiendo que busques información para conocer en profundidad cómo + * realizar el cifrado. Esto también forma parte del reto. + */ +const ENCODING_VALUE = 3; +const alphabet: string[] = [...Array(26).keys()].map((index) => + String.fromCharCode(index + 97) +); + +const textToCesarEncrypt = (text: string): string => { + const rgx_keys_encrypt = new RegExp(/[a-z]/gi); + const textToArray = text.toLowerCase(); + const lastLetter = alphabet.length - 1; // start over if the letter is z + return textToArray.replace(rgx_keys_encrypt, (word) => { + const found = alphabet.indexOf(word); + const indexAl = (found === lastLetter ? -1 : found) + ENCODING_VALUE; + return alphabet[indexAl]; + }); +}; +// holaza buenas -> krodcd exhqdv + +const textToCesarDecrypt = (text: string): string => { + const rgx_keys_decrypt = new RegExp(/[a-z]/gi); + const textToArray = text.toLowerCase(); + const lastLetter = alphabet.length - 1; // start over if the letter is z + return textToArray.replace(rgx_keys_decrypt, (word) => { + const found = alphabet.indexOf(word); + const indexAl = (found === 0 ? lastLetter + 1 : found) - ENCODING_VALUE; + return alphabet[indexAl < 0 ? lastLetter : indexAl]; + }); +}; +// krodcd exhqdv -> holaza buenas \ No newline at end of file diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/typescript/Qv1ko.ts" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/typescript/Qv1ko.ts" new file mode 100644 index 0000000000..98a6869841 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/typescript/Qv1ko.ts" @@ -0,0 +1,20 @@ +encrypt("Lorem ipsum dolor sit amet.", 6) +decrypt("gjmzh dknph yjgjm ndo vhzo.", 21) + +function encrypt(text: string, numberEncrypt: number): void { + let result = "" + const letters = text.toLowerCase().split("") + letters.forEach((letter: string) => { + result += (letter < "a" || letter > "z")? letter : (letter.charCodeAt(0) + numberEncrypt > 122) ? String.fromCharCode(letter.charCodeAt(0) + numberEncrypt - 26) : String.fromCharCode(letter.charCodeAt(0) + numberEncrypt) + }) + console.log(result) +} + +function decrypt(cesar: string, numberDecrypt: number): void { + let result = "" + const letters = cesar.toLowerCase().split("") + letters.forEach((letter: string) => { + result += (letter < "a" || letter > "z")? letter : (letter.charCodeAt(0) - numberDecrypt < 97) ? String.fromCharCode(letter.charCodeAt(0) - numberDecrypt + 26) : String.fromCharCode(letter.charCodeAt(0) - numberDecrypt) + }) + console.log(result) +} diff --git "a/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/typescript/albertovf.ts" "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/typescript/albertovf.ts" new file mode 100644 index 0000000000..b94ecc4895 --- /dev/null +++ "b/Retos/Reto #24 - CIFRADO C\303\211SAR [F\303\241cil]/typescript/albertovf.ts" @@ -0,0 +1,30 @@ +const cifradoCesar = (texto: string, desplazamiento: number): string => { + let resultado = ''; + + if (-26 > desplazamiento || desplazamiento > 26) return resultado; + + for (let caracter of texto) { + if (caracter.match(/[A-Z]/i)) { + const ascii = caracter.charCodeAt(0); + let asciiDesplazado = ascii + desplazamiento; + + if (caracter.match(/[A-Z]/)) { + if (asciiDesplazado > 90) asciiDesplazado = 65 + (asciiDesplazado - 91); + else asciiDesplazado = 90 - (64 - asciiDesplazado); + } else { + if (asciiDesplazado > 122) asciiDesplazado = 97 + (asciiDesplazado - 123); + else asciiDesplazado = 122 - (96 - asciiDesplazado); + } + caracter = String.fromCharCode(asciiDesplazado); + } + resultado += caracter; + } + + console.log(`Texto original: ${texto}`); + console.warn(`Texto cifrado: ${resultado}`); + return resultado; +} + +const textoOriginal = "\n/*\n * Crea un programa que realize el cifrado César de un texto y lo imprima. \n * También debe ser capaz de descifrarlo cuando así se lo indiquemos. \n * \n * Te recomiendo que busques información para conocer en profundidad cómo \n * realizar el cifrado. Esto también forma parte del reto. \n */" +const desplazamiento = -12; +cifradoCesar(textoOriginal, desplazamiento); diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/c#/JonAFernan.cs" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/c#/JonAFernan.cs" new file mode 100644 index 0000000000..c9c009bcbf --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/c#/JonAFernan.cs" @@ -0,0 +1,31 @@ +using System.Text; +using System.Text.RegularExpressions; + +/* + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido correctamente + * desde el teclado. Si sucede esto, debe notificarse mostrando un mensaje en la terminal. + */ + +namespace reto25; +class Program +{ + static void Main(string[] args) + { + string konamiCode = "UpArrowUpArrowDownArrowDownArrowLeftArrowRightArrowLeftArrowRightArrowAB"; + var userInput = new StringBuilder(); + bool konamiCodeInsert = true; + while(!Regex.IsMatch(userInput.ToString(),konamiCode)) + { + ConsoleKeyInfo push = Console.ReadKey(true); + if(push.Key== ConsoleKey.Escape) + { + konamiCodeInsert= false; + break; + } + userInput.Append(push.Key); + } + + System.Console.WriteLine(konamiCodeInsert ? "You have entered the Konami Code": "Game over"); + } + +} diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/c#/borazuwarah.cs" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/c#/borazuwarah.cs" new file mode 100644 index 0000000000..d708f8ee9f --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/c#/borazuwarah.cs" @@ -0,0 +1,36 @@ + + +int[] konamiCode = { (int)ConsoleKey.UpArrow,(int)ConsoleKey.UpArrow, (int)ConsoleKey.DownArrow, (int)ConsoleKey.DownArrow, + (int)ConsoleKey.LeftArrow, (int)ConsoleKey.RightArrow, (int)ConsoleKey.LeftArrow, (int)ConsoleKey.RightArrow, + (int)ConsoleKey.B, (int)ConsoleKey.A }; + +int[] userInput = new int[10]; +int currentIndex = 0; + +Console.WriteLine("Introduce el Código Konami:"); + +while (currentIndex < 10) +{ + ConsoleKeyInfo key = Console.ReadKey(true); + userInput[currentIndex] = (int)key.Key; + + if (userInput[currentIndex] != konamiCode[currentIndex]) + { + currentIndex = 0; + Console.Clear(); + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("Código incorrecto. Inténtalo de nuevo."); + continue; + } + + currentIndex++; + + if (currentIndex == 10) + { + Console.Clear(); + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine("¡Código Konami introducido correctamente!"); + } +} + +Console.ReadKey(); diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/c++/kevin05m.cpp" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/c++/kevin05m.cpp" new file mode 100644 index 0000000000..788c47133b --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/c++/kevin05m.cpp" @@ -0,0 +1,33 @@ +#include +#include + +using namespace std; + +int validarCodigo(string konami, int i){ + const string codigoKonami[] = {"arriba", "arriba", "abajo", "abajo", "izquierda", "derecha", "izquierda", "derecha", "B", "A"}; + int cont = 0; + if(konami == codigoKonami[i]){ + cont = cont + 1; + } + return cont; +} + +int main(){ + string codKonami, konami[10]; + int cont=0, i=0; + cout << "Ingrese el código Konami completo (EJ: arriba-izquierda-etc): "; + cin >> codKonami; + stringstream input_stringstream(codKonami); + while(getline(input_stringstream, konami[i], '-')){ + cont = cont + validarCodigo(konami[i], i); + i++; + } + if(cont == 10){ + cout << "Código Kunami correcto!"; + } else { + cout << "Código Kunami incorrecto!"; + } + return 0; +} + +// input test: arriba-arriba-abajo-abajo-izquierda-derecha-izquierda-derecha-B-A \ No newline at end of file diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/dart/marchdz.dart" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/dart/marchdz.dart" new file mode 100644 index 0000000000..68f6760471 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/dart/marchdz.dart" @@ -0,0 +1,21 @@ +import 'dart:io'; + +void main() { + final List konamiCode = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65]; + int konamiCodeIndex = 0; + + stdin.echoMode = false; + stdin.lineMode = false; + + stdin.listen((keyCode) { + if (keyCode[0] == konamiCode[konamiCodeIndex]) { + konamiCodeIndex++; + if (konamiCodeIndex == konamiCode.length) { + print('Código Konami detectado'); + exit(0); + } + } else { + konamiCodeIndex = 0; + } + }); +} diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/ejercicio.md" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/ejercicio.md" new file mode 100644 index 0000000000..03b87f70ac --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/ejercicio.md" @@ -0,0 +1,16 @@ +# Reto #25: El Código Konami +#### Dificultad: Media | Publicación: 19/06/23 | Corrección: 26/06/23 + +## Enunciado + +``` +/* + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido correctamente + * desde el teclado. Si sucede esto, debe notificarse mostrando un mensaje en la terminal. + */ +``` +#### Tienes toda la información extendida sobre los retos de programación semanales en **[retosdeprogramacion.com/semanales2023](https://retosdeprogramacion.com/semanales2023)**. + +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/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/go/blackriper.go" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/go/blackriper.go" new file mode 100644 index 0000000000..9c12a2c429 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/go/blackriper.go" @@ -0,0 +1,120 @@ +package main + +/* + 1.- go mod init nombre_del_modulo + 2.- go get github.com/nsf/termbox-go libreria para escuhar la entrada del teclado + 3.- happy coding +*/ +import ( + "fmt" + + "github.com/nsf/termbox-go" +) + +// definir tipos de datos e interface +type Konami interface { + Get() []rune + Size() int +} + +type Keyboard interface { + ReadKeys() []rune + IsKonamiCode(keys []rune) bool + Notification(find bool) string +} + +type Code struct{} + +// obtener codigo Konami en formato keycode +func (c *Code) Get() []rune { + return []rune{38, 38, 40, 40, 37, 39, 37, 39, 66, 65} + +} + +// obtener el tamaño del arreglo +func (c *Code) Size() int { + return len(c.Get()) +} + +type FindCode struct { + Konami +} + +// Leer entrada de teclado y deterse cuando este tenga diez caracteres para evaluar code +func (f *FindCode) ReadKeys() []rune { + var inputUser []rune + err := termbox.Init() + if err != nil { + panic(err) + } + defer termbox.Close() + + fmt.Println("You need more lifes introduce a magic command: ") + +loop: + for { + switch ev := termbox.PollEvent(); ev.Type { + case termbox.EventKey: + termbox.Sync() + inputUser = append(inputUser, GetKeyCode(&ev)) + fmt.Println(inputUser) + if len(inputUser) == f.Konami.Size() { + break loop + } + } + } + return inputUser + +} + +// comparar slices de rune para saber si hay un konami code +func (f *FindCode) IsKonamiCode(keys []rune) bool { + for k := range keys { + if keys[k] != f.Konami.Get()[k] { + return false + } + } + return true +} + +// funcion para notificar el resultado ha sido correcto o no en caso de no volver a intentar +func (f *FindCode) Notification(find bool) string { + var option string + if find { + fmt.Println("congratulations you obtained 30 lives correct konami code commad ") + option = "N" + } else { + fmt.Println("Command wrong do you want try again Y/N ") + fmt.Scanf("%s", &option) + } + return option +} + +// funcion para obtener key code de arrows +func GetKeyCode(ev *termbox.Event) rune { + var key rune + switch ev.Key { + case termbox.KeyArrowUp: + key = 38 + case termbox.KeyArrowDown: + key = 40 + case termbox.KeyArrowLeft: + key = 37 + case termbox.KeyArrowRight: + key = 39 + default: + key = ev.Ch + } + return key +} + +func main() { + var option string + konami := Code{} + var program Keyboard = &FindCode{Konami: &konami} + for option != "N" { + keys := program.ReadKeys() + isCode := program.IsKonamiCode(keys) + option = program.Notification(isCode) + } +} diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/java/Cflorezp.java" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/java/Cflorezp.java" new file mode 100644 index 0000000000..5712d436c0 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/java/Cflorezp.java" @@ -0,0 +1,85 @@ +package reto25codigoKonami; + +import javax.swing.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.util.ArrayList; +import java.util.List; + +/* + * Crea un programa que detecte cuando el famoso "Código Konami (↑ ↑ ↓ ↓ ← → ← → B A)" + * se ha introducido correctamente desde el teclado. Si sucede esto, debe notificarse + * mostrando un mensaje en la terminal. + */ +public class Cflorezp extends JFrame { + + private JLabel mensajeLabel; + private List teclas = new ArrayList<>(); + + public Cflorezp() { + setTitle("Detectar Tecla Pulsada"); + setSize(400, 300); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + mensajeLabel = new JLabel("Presiona una tecla"); + mensajeLabel.setHorizontalAlignment(SwingConstants.CENTER); + mensajeLabel.setVerticalAlignment(SwingConstants.CENTER); + add(mensajeLabel); + setLocationRelativeTo(null); + + addKeyListener(new MiKeyListener()); + + setFocusable(true); + requestFocus(); + } + + private class MiKeyListener extends KeyAdapter { + @Override + public void keyPressed(KeyEvent e) { + int tecla = e.getKeyCode(); + switch (tecla) { + case KeyEvent.VK_UP: + teclas.add("U"); + mensajeLabel.setText("Se presiono: ↑"); + break; + case KeyEvent.VK_DOWN: + teclas.add("D"); + mensajeLabel.setText("Se presiono: ↓"); + break; + case KeyEvent.VK_LEFT: + teclas.add("L"); + mensajeLabel.setText("Se presiono: ←"); + break; + case KeyEvent.VK_RIGHT: + teclas.add("R"); + mensajeLabel.setText("Se presiono: →"); + break; + case KeyEvent.VK_B: + teclas.add("B"); + mensajeLabel.setText("Se presiono: B"); + break; + case KeyEvent.VK_A: + teclas.add("A"); + mensajeLabel.setText("Se presiono: A"); + break; + default: + teclas.add("X"); + mensajeLabel.setText("Se presiono: " + e.getKeyChar()); + } + + if (e.getKeyChar() == 'a' || e.getKeyChar() == 'A' && teclas.size() >= 10) { + String secuenciaCadena = String.join("", teclas); + String secuenciaEvaluar = secuenciaCadena.substring(secuenciaCadena.length() - 10); + if (secuenciaEvaluar.equalsIgnoreCase("uuddlrlrba")) { + mensajeLabel.setText("¡CODIGO KONAMI ENCONTRADO! ↑ ↑ ↓ ↓ ← → ← → B A "); + } + } + } + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> { + Cflorezp konami = new Cflorezp(); + konami.setVisible(true); + }); + } +} diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/java/EspinoLeandroo.java" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/java/EspinoLeandroo.java" new file mode 100644 index 0000000000..0787714321 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/java/EspinoLeandroo.java" @@ -0,0 +1,68 @@ +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +public class EspinoLeandroo implements KeyListener { + private static final int[] KONAMI_CODE = {KeyEvent.VK_UP, KeyEvent.VK_UP, KeyEvent.VK_DOWN, + KeyEvent.VK_DOWN, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, KeyEvent.VK_LEFT, + KeyEvent.VK_RIGHT, KeyEvent.VK_B, KeyEvent.VK_A}; + + private int konamiIndex; + + public EspinoLeandroo() { + konamiIndex = 0; + } + + public static void main(String[] args) { + EspinoLeandroo detector = new EspinoLeandroo(); + detector.start(); + } + + public void start() { + System.out.println("Ingrese el Código Konami:"); + java.util.Scanner scanner = new java.util.Scanner(System.in); + while (scanner.hasNext()) { + int keyCode = convertToKeyCode(scanner.next()); + System.out.println(keyCode); + if (keyCode == KONAMI_CODE[konamiIndex]) { + konamiIndex++; + if (konamiIndex == KONAMI_CODE.length) { + System.out.println("¡Código Konami detectado!"); + konamiIndex = 0; + } + } else { + konamiIndex = 0; + } + } + } + + private int convertToKeyCode(String input) { + switch (input.toUpperCase()) { + case "UP": + return KeyEvent.VK_UP; + case "DOWN": + return KeyEvent.VK_DOWN; + case "LEFT": + return KeyEvent.VK_LEFT; + case "RIGHT": + return KeyEvent.VK_RIGHT; + case "B": + return KeyEvent.VK_B; + case "A": + return KeyEvent.VK_A; + default: + return KeyEvent.VK_UNDEFINED; + } + } + + @Override + public void keyTyped(KeyEvent e) { + } + + @Override + public void keyPressed(KeyEvent e) { + } + + @Override + public void keyReleased(KeyEvent e) { + } +} diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/java/Qv1ko.java" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/java/Qv1ko.java" new file mode 100644 index 0000000000..6e84e01200 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/java/Qv1ko.java" @@ -0,0 +1,54 @@ +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.util.ArrayList; + +import javax.swing.JFrame; + +public class Qv1ko implements KeyListener { + + private final int[] KONAMICODE = { KeyEvent.VK_UP, KeyEvent.VK_DOWN, KeyEvent.VK_UP, KeyEvent.VK_DOWN, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, KeyEvent.VK_B, KeyEvent.VK_A }; + private ArrayList userInput = new ArrayList(); + + public static void main(String[] args) { + Qv1ko detector = new Qv1ko(); + JFrame frame = new JFrame("Konami Detector"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.addKeyListener(detector); + frame.setFocusable(true); + frame.requestFocus(); + frame.setSize(10, 10); + frame.setVisible(true); + } + + public void keyPressed(KeyEvent e) { + int key = e.getKeyCode(); + if (key != KeyEvent.VK_ENTER) { + userInput.add(key); + } else { + checkKonamiCode(); + } + } + + private void checkKonamiCode() { + if (userInput.size() == KONAMICODE.length) { + boolean correctCode = true; + for (int i = 0; i < KONAMICODE.length; i++) { + if (userInput.get(i) != KONAMICODE[i]) { + correctCode = false; + break; + } + } + if (correctCode) { + System.out.println("Konami code entered correctly!"); + } + } + userInput.clear(); + } + + public void keyTyped(KeyEvent e) { + } + + public void keyReleased(KeyEvent e) { + } + +} diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/LucasSantillan.js" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/LucasSantillan.js" new file mode 100644 index 0000000000..9a4fb70316 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/LucasSantillan.js" @@ -0,0 +1,42 @@ +/* + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido + * correctamente desde el teclado. + * Si sucede esto, debe notificarse mostrando un mensaje en la terminal. + * + * ESTE ES UN SCRIPT QUE DEBE INSERTARSE EN UN DOCUMENTO HTML +*/ +let tecla = ''; +let caracter = ''; +document.write('

Comienza a escribir, y haber si encuentras el código oculto:

'); + +window.addEventListener("keydown", function(event) { + tecla += event.which; + if (tecla === '38' || + tecla === '3838' || + tecla === '383840' || + tecla === '38384040' || + tecla === '3838404037' || + tecla === '383840403739' || + tecla === '38384040373937' || + tecla === '3838404037393739' || + tecla === '383840403739373966' || + tecla === '38384040373937396665' + ){ + if (tecla === '38384040373937396665') + alert('¡Re Grox, has introducido el "Código Konami" 🥚'); + } else { + if ((event.which >= 48 && event.which <= 90) || + (event.which >= 96 && event.which <= 111) || + (event.which >= 186 && event.which <= 222) || + event.which == 32 || event.which == 226 + ){ + if((event.ctrlKey && event.altKey && event.which == 186) || (event.ctrlKey && event.altKey && event.which == 222)) { + caracter += event.key; + } else if (event.which != 186 && event.which != 222) { + caracter += event.key; + } + } + document.querySelector('#escribir').innerHTML = caracter; + tecla = ''; + } +}); diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/RodriJOk.js" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/RodriJOk.js" new file mode 100644 index 0000000000..d480d53f73 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/RodriJOk.js" @@ -0,0 +1,15 @@ +/* + * ENUNCIADO A RESOLVER + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido correctamente + * desde el teclado. Si sucede esto, debe notificarse mostrando un mensaje en la terminal. +*/ + +const konami_code = ["ArrowUp", "ArrowUp", "ArrowDown", "ArrowDown", "ArrowLeft", "ArrowRight", "ArrowLeft", "ArrowRight", "b", "a"]; +let cursor = 0; +document.addEventListener("keydown", (e) => { + e.key === konami_code[cursor] ? cursor++ : cursor = 0; + if (cursor === konami_code.length) { + console.log('Konami!'); + cursor = 0; + } +}); \ No newline at end of file diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/cesar-ch.js" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/cesar-ch.js" new file mode 100644 index 0000000000..6ed7130a58 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/cesar-ch.js" @@ -0,0 +1,16 @@ +/* + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido correctamente + * desde el teclado. Si sucede esto, debe notificarse mostrando un mensaje en la terminal. + */ + +const konamiCode = ["ArrowUp", "ArrowUp", "ArrowDown", "ArrowDown", "ArrowLeft", "ArrowRight", "ArrowLeft", "ArrowRight", "KeyB", "KeyA"]; +let i = 0 + +document.addEventListener("keydown", (e) => { + e.code === konamiCode[i] ? i++ : i = 0; + if (i === konamiCode.length) { + console.log("🎉 GANASTE 🎉") + i = 0 + } + +}); \ No newline at end of file diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/marcode24.js" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/marcode24.js" new file mode 100644 index 0000000000..626ab11ca5 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/marcode24.js" @@ -0,0 +1,26 @@ +/* + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido + * correctamente desde el teclado. + * Si sucede esto, debe notificarse mostrando un mensaje en la terminal. + */ + +const readline = require('readline'); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +const konami = ['u', 'u', 'd', 'd', 'l', 'r', 'l', 'r', 'b', 'a']; + +let index = 0; + +rl.on('line', (input) => { + index = input.replace(/\s+/g, '').trim() === konami[index] ? index + 1 : 0; + if (index === konami.length) { + console.log('Konami code!'); + rl.close(); + } +}); + +// Visita mi repo en GitHub para ver y correr los tests de este código --> https://github.com/marcode24/weekly-challenges diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/nlarrea.js" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/nlarrea.js" new file mode 100644 index 0000000000..d06055ee59 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/nlarrea.js" @@ -0,0 +1,41 @@ +/* + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido correctamente + * desde el teclado. Si sucede esto, debe notificarse mostrando un mensaje en la terminal. + */ + +const readline = require('readline'); + +const konami = [ + 'up', 'up', + 'down', 'down', + 'left', 'right', + 'left', 'right', + 'b', 'a' +]; + +const userPressed = []; + +readline.emitKeypressEvents(process.stdin); + +if (process.stdin.isTTY) { + process.stdin.setRawMode(true); +} + +console.log('press any key ("ESC" to exit):\n'); + +process.stdin.on('keypress', (_, key) => { + if (key && key.name == 'escape') { + process.exit(); + } + + userPressed.push(key.name); + console.log(key.name); + + if (userPressed.every((userKey, index) => userKey === konami[index])) { + console.log('\nKONAMI CODE!\n'); + } + + if (userPressed.length === konami.length) { + userPressed.shift(); + } +}); \ No newline at end of file diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/othamae.js" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/othamae.js" new file mode 100644 index 0000000000..ac7df93fb6 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/othamae.js" @@ -0,0 +1,37 @@ +/* + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido correctamente + * desde el teclado. Si sucede esto, debe notificarse mostrando un mensaje en la terminal. + */ + +// ↑ ↑ ↓ ↓ ← → ← → B A + +const readline = require('readline') + +const KonamiCode = ['u', 'u', 'd', 'd', 'l', 'r', 'l', 'r', 'b', 'a'] + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }) + +rl.on('line', (input) => { + let inputCode = input.trim() + let code =inputCode.split('') + if(code.length >= KonamiCode.length){ + if (code.join('') === KonamiCode.join('')){ + console.log('Konami code has been entered correctly') + rl.close() + } + } + + }) + + + + + + + + + + diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/piterxusDev.js" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/piterxusDev.js" new file mode 100644 index 0000000000..3f6fccfb67 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/javascript/piterxusDev.js" @@ -0,0 +1,31 @@ +/* + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido correctamente + * desde el teclado. Si sucede esto, debe notificarse mostrando un mensaje en la terminal. + */ + +let readline = require('readline'); + +readline.emitKeypressEvents(process.stdin); + +if (process.stdin.isTTY) + process.stdin.setRawMode(true); +let test = [] +let konami = ['up', 'up', 'down', 'down', 'left', 'right', 'left', 'right', 'b', 'a'] +console.log("Introduce el código (10 caracteres): ") +process.stdin.on('keypress', (chunk, key) => { + test.push(key.name) + + console.log(key.name) + + if (test.length === 10) { + if (test.toString() === konami.toString()) { + console.log('¡Conseguido!') + console.log(test.toString()) + process.exit(); + } else { + console.log('El código es incorrecto. Vuelve a intentarlo: ') + test = [] + } + } +}); + diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/kotlin/pisanowp.kt" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/kotlin/pisanowp.kt" new file mode 100644 index 0000000000..fcccda524d --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/kotlin/pisanowp.kt" @@ -0,0 +1,81 @@ +import java.awt.event.KeyEvent +import java.awt.event.KeyListener +import javax.swing.JFrame + + +fun main() { + + /* + * + * Reto #25 19/06/2023 EL CÓDIGO KONAMI + * + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido correctamente + * desde el teclado. Si sucede esto, debe notificarse mostrando un mensaje en la terminal. + * + * ↑ ↑ ↓ ↓ ← → ← → B A + * + * + */ + + println("RETO #25 - El código Konami") + + + val frame = JFrame("Capturando pulsaciones de teclado") + val keyListener = MyKeyListener() + + frame.addKeyListener(keyListener) + frame.defaultCloseOperation = JFrame.EXIT_ON_CLOSE + frame.setSize(300, 300) + frame.isVisible = true + + +} + + + +class MyKeyListener : KeyListener { + val codigoKonami = "38384040373937396665" //↑ ↑ ↓ ↓ ← → ← → B A + var historialScreen :String = "" + var historial :String = "" + + override fun keyPressed(e: KeyEvent) { + // Capturar la tecla presionada + val keyCode = e.keyCode + //println("Tecla presionada: $keyCode") + historial += keyCode + + when (keyCode) { + 38 -> historialScreen += "↑" + 40 -> historialScreen += "↓" + 37 -> historialScreen += "←" + 39 -> historialScreen += "→" + 66 -> historialScreen += "B" + 65 -> historialScreen += "A" + else -> historialScreen = "" + + } + println("> $historialScreen") + + if (codigoKonami == historial){ + println ("¡¡¡ CODIGO KONAMI INTRODUCIDO !!!") + + } else if (codigoKonami.contains(historial)){ + // null, aún hay posiblidades + + } else { + // Ya se ha hechado a perder la secuncia + println (" ¡¡¡ SECUENCIA ERRÓNEA !!!") + historial = "" + historialScreen = "" + } + } + + override fun keyReleased(e: KeyEvent) { + // Acción cuando se suelta la tecla + } + + override fun keyTyped(e: KeyEvent) { + // Acción cuando se pulsa y se suelta una tecla + } +} + diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/php/daom89.php" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/php/daom89.php" new file mode 100644 index 0000000000..9761c1044b --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/php/daom89.php" @@ -0,0 +1,60 @@ + "", Interceptor::KEY_DOWN => "", + Interceptor::KEY_LEFT => "", Interceptor::KEY_RIGHT => "", + 98 => "b", 97 => "a", +]; + +$keys = Interceptor::I(); +echo "\033[31m\e[1mKonami Code \e[32m presione q para salir \n"; + +if ($keys->init()) { + while (true) { + $key = $keys->intercept(); + if (in_array($key, [113, 81])) { + Interceptor::eprintln("\e[7;34;40mSalida registrada\e[0m"); + exit(0); + } + if (!on_press($key)) { + exit(0); + } + } +} + +function on_press($key) +{ + global $key_position, $last_key, $KONAMI_CODE, $ICONS; + echo (in_array($key, $KONAMI_CODE)) ? "$ICONS[$key]" : chr($key); + if ($key == $KONAMI_CODE[$key_position]) { + $key_position += 1; + } elseif ($key == $KONAMI_CODE[0]) { + $key_position = ($last_key == $KONAMI_CODE[0]) ? 2 : 1; + } else { + $key_position = 0; + } + + if ($key_position == count($KONAMI_CODE)) { + echo "\n\e[39m"; + echo "\e[41m╦╔═╔═╗╔╗╔╔═╗╔╦╗╦ ╔═╗╔═╗╔╦╗╔═╗\n"; + echo "\e[41m╠╩╗║ ║║║║╠═╣║║║║ ║ ║ ║ ║║║╣ \n"; + echo "\e[41m╩ ╩╚═╝╝╚╝╩ ╩╩ ╩╩ ╚═╝╚═╝═╩╝╚═╝\n"; + echo "\e[0m"; + return false; + } + $last_key = $key; + return true; +} diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/Bryan112094.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/Bryan112094.py" new file mode 100644 index 0000000000..85d365e9b2 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/Bryan112094.py" @@ -0,0 +1,22 @@ +from pynput.keyboard import Key, KeyCode, Listener + +codeKonami = [Key.up, Key.up, Key.down, Key.down, Key.left, Key.right, + Key.left, Key.right, KeyCode.from_char("b"), KeyCode.from_char("a")] +codePress = [] + +def codeGenerated(key): + if Key.esc == key: + print("Código incorrecto") + return False + else: + codePress.append(key) + if codeKonami == codePress: + print("Código Konami encontrado") + return False + +if __name__ == "__main__": + print("Ingrese codigo: ") + + codigo = Listener(codeGenerated) + codigo.start() + codigo.join() \ No newline at end of file diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/ClarkCodes.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/ClarkCodes.py" new file mode 100644 index 0000000000..5c8d2a4c1f --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/ClarkCodes.py" @@ -0,0 +1,95 @@ +""" +Retos Semanales ‘23 +Reto #25: EL CÓDIGO KONAMI +MEDIA | Publicación: 19/06/23 | Resolución: 26/06/23 + + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido + * correctamente desde el teclado. + * Si sucede esto, debe notificarse mostrando un mensaje en la terminal. +""" + +# Autor: Clark - @ClarkCodes +# Fecha de Resolución: 25/07/2023 + +# Imports +import typer +from rich import print +import random +from pynput.keyboard import Key, KeyCode, Listener + +# Constantes +PHRASES = [ "Ok... interesante... cuéntame más.", "Muy bien, suena cool... ¿qué más?", "Bien, bien... qué curioso... sigue contandome :)", "Cool!, te sigo leyendo...", "Me gusta leerte :) ... continua por favor..." ] +KONAMI_CODE = ( Key.up, Key.up, Key.down, Key.down, Key.left, Key.right, Key.left, Key.right, KeyCode.from_char( "b" ), KeyCode.from_char( "a" ) ) +KONAMI_CODE_LETTERING = f"""[bold yellow] +██╗ ██╗ ██████╗ ███╗ ██╗ █████╗ ███╗ ███╗██╗ ██████╗ ██████╗ ██████╗ ███████╗ +██║ ██╔╝██╔═══██╗████╗ ██║██╔══██╗████╗ ████║██║ ██╔════╝██╔═══██╗██╔══██╗██╔════╝ +█████╔╝ ██║ ██║██╔██╗ ██║███████║██╔████╔██║██║ ██║ ██║ ██║██║ ██║█████╗ +██╔═██╗ ██║ ██║██║╚██╗██║██╔══██║██║╚██╔╝██║██║ ██║ ██║ ██║██║ ██║██╔══╝ +██║ ██╗╚██████╔╝██║ ╚████║██║ ██║██║ ╚═╝ ██║██║ ╚██████╗╚██████╔╝██████╔╝███████╗ +╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝ +""" + +# Variables Globales +welcomePending = True +consecutiveCodeKeysPressed = 0 +_exit = False + +# Funciones +def main_menu(): + global welcomePending + + if( welcomePending ): + print( "[green]\nBienvenido al Script de [yellow]El Código Konami[/yellow], esto es algo similar a un diario, un espacion donde me puedes contar acerca de ti, de tu día, y de todo lo que quieras, o presiona la tecla ESCAPE para salir.[/green] 😀" ) + welcomePending = False + else: + print( f"[dodger_blue2]\n{random.choice( PHRASES )}" ) # Frases mostradas aleatoriamente + +def key_listener( key ): + global _exit + global consecutiveCodeKeysPressed + + if( key == KONAMI_CODE[consecutiveCodeKeysPressed] ): # Solo si se empieza a introducir el código Konami en orden se va sumando 1 al contador + consecutiveCodeKeysPressed += 1 + else: # Si no se completa el código Konami en orden se reestablece el valor del contador a 0 + if( consecutiveCodeKeysPressed > 0 ): + consecutiveCodeKeysPressed = 0 + + if( consecutiveCodeKeysPressed == len( KONAMI_CODE ) ): # Si el contador es igual a la longitud del Código Konami, significa que se ha introducido toda la secuencia en orden y se muestra el mensaje correspondiente + print( f"\n\n[yellow]Ha ingresado el Código Konami!, se ha desbloqueado una funcionalidad secreta :)" ) + print( KONAMI_CODE_LETTERING ) + consecutiveCodeKeysPressed = 0 + + if key == Key.esc: # Si el usuario presiona la tecla ESCAPE en el siguiente enter cuando salga del input se termina el programa + print( f"\n\n[yellow]Has presionado la tecla ESCAPE, el programa terminará cuando presiones ENTER.\n" ) + _exit = True + return False + +def main(): + global _exit + print( "[bold green]\n*** Reto #25: EL CÓDIGO KONAMI - By @ClarkCodes ***" ) + + listener = Listener( on_release = key_listener ) # Listener, importantisimo, funcionalidad core, se le pasa la función callback que tiene la lógica + listener.start() # Se lo ejecuta en otro hilo para no bloquear el input del usuario y que se vea el texto que se introduce, se lo hace una sola vez y esta escuchando en todo momento. + + while True: + main_menu() + + print( "\n[bold green]Respuesta: ", end = "" ) + + try: + user_answer = input( "" ) + + if( _exit ): # Condición de Salida + print( "[green]\n✅ Esto ha sido todo por hoy.\n❤ Muchas gracias por ejecutar este Script, hasta la próxima...💻 Happy Coding!,👋🏼 bye :D\n😎 Clark." ) + break + + except ValueError as ve: + print( "\n❌ Opción ingresada no disponible, solo se admiten números enteros positivos mayores o iguales a 2, o la letra 'q' si deseas salir, verifique nuevamente." ) + print( ve ) + except Exception as ex: + print( "\n❌ Oops... algo no ha salido bien, revise nuevamente por favor." ) + print( ex ) + +# Llamada a la Función Principal usando typer +if __name__ == "__main__": + typer.run( main ) diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/EspinoLeandroo.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/EspinoLeandroo.py" new file mode 100644 index 0000000000..7bb30c1fb4 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/EspinoLeandroo.py" @@ -0,0 +1,31 @@ +import keyboard + +# Código Konami a detectar +konami_code = ['up', 'up', 'down', 'down', 'left', 'right', 'left', 'right', 'b', 'a'] + +# Lista para almacenar las teclas ingresadas por el usuario +user_input = [] + +# Función para verificar si se ingresó el Código Konami +def check_konami_code(): + if user_input == konami_code: + print("¡Código Konami detectado!") + +# Función para manejar las teclas presionadas +def on_key_press(event): + key = event.name.lower() + + # Agregar la tecla a la lista de entrada del usuario + user_input.append(key) + + # Verificar si se ingresó el Código Konami + check_konami_code() + + # Limitar la lista de entrada del usuario al tamaño del Código Konami + user_input[:] = user_input[-len(konami_code):] + +# Registrar el manejador de eventos para las teclas presionadas +keyboard.on_press(on_key_press) + +# Mantener el programa en ejecución +keyboard.wait() \ No newline at end of file diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/Hugovrc.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/Hugovrc.py" new file mode 100644 index 0000000000..a717b144b8 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/Hugovrc.py" @@ -0,0 +1,18 @@ +from pynput.keyboard import Key, KeyCode, Listener + +codigo_ingresado = [] +codigo_konami = [Key.up, Key.up, Key.down, Key.down, Key.left, Key.right, Key.left, Key.right, KeyCode.from_char("b"), KeyCode.from_char("a")] + +def pulsa(tecla): + + codigo_ingresado.append(tecla) + if tecla == Key.esc: + return False + elif codigo_ingresado == codigo_konami: + print("Codigo introducido correctamente!!!") + listener.stop() +listener = Listener(pulsa) + +listener.start() + +listener.join() \ No newline at end of file diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/JuanLuM.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/JuanLuM.py" new file mode 100644 index 0000000000..d3898ea95d --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/JuanLuM.py" @@ -0,0 +1,100 @@ +from pynput import keyboard + +state=0 #Guarda el estado del AFD + +def checkAFD(tecla): + + global state + + prev_state = state + + match state: + case 0: #Estado inicial + if tecla == keyboard.Key.up: + state=1 + case 1: + if tecla == keyboard.Key.up: + state=2 + else: + state=0 + case 2: + if tecla == keyboard.Key.down: + state=3 + elif tecla != keyboard.Key.up: + state=0 + case 3: + if tecla == keyboard.Key.down: + state=4 + elif tecla == keyboard.Key.up: + state=1 + else: + state=0 + case 4: + if tecla == keyboard.Key.left: + state=5 + elif tecla == keyboard.Key.up: + state=1 + else: + state=0 + case 5: + if tecla == keyboard.Key.right: + state=6 + elif tecla == keyboard.Key.up: + state=1 + else: + state=0 + case 6: + if tecla == keyboard.Key.left: + state=7 + elif tecla == keyboard.Key.up: + state=1 + else: + state=0 + case 7: + if tecla == keyboard.Key.right: + state=8 + elif tecla == keyboard.Key.up: + state=1 + else: + state=0 + case 8: + if tecla == keyboard.KeyCode.from_char('b'): + state=9 + elif tecla == keyboard.Key.up: + state=1 + else: + state=0 + case 9: + if tecla == keyboard.KeyCode.from_char('a'): + state=10 + elif tecla == keyboard.Key.up: + state=1 + else: + state=0 + case 10: #Estado final + if tecla == keyboard.Key.enter: + print("CODIGO KONAMY INTRODUCIDO. MENSAJE DESBLOQUEADO!!!!!!") + print(" .----------------. .----------------. .-----------------. .----------------. .----------------. .----------------.") + print("| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |") + print("| | ___ ____ | || | ____ | || | ____ _____ | || | __ | || | ____ ____ | || | _____ | |") + print("| | |_ ||_ _| | || | .' `. | || ||_ \|_ _| | || | / \ | || ||_ \ / _|| || | |_ _| | |") + print("| | | |_/ / | || | / .--. \ | || | | \ | | | || | / /\ \ | || | | \/ | | || | | | | |") + print("| | | __'. | || | | | | | | || | | |\ \| | | || | / ____ \ | || | | |\ /| | | || | | | | |") + print("| | _| | \ \_ | || | \ `--' / | || | _| |_\ |_ | || | _/ / \ \_ | || | _| |_\/_| |_ | || | _| |_ | |") + print("| | |____||____| | || | `.____.' | || ||_____|\____| | || ||____| |____|| || ||_____||_____|| || | |_____| | |") + print("| | | || | | || | | || | | || | | || | | |") + print("| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |") + print(" '----------------' '----------------' '----------------' '----------------' '----------------' '----------------' ") + state=0 + elif tecla == keyboard.Key.up: + state=1 + else: + state=0 + print("\u03B4("+str(prev_state)+", "+str(tecla)+") = "+str(state)) #imprime la función de transición + +def exit(tecla): + if tecla == keyboard.KeyCode.from_char('q'): + return False + +with keyboard.Listener(checkAFD, exit) as listener: + listener.join() diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/KMBMarcos.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/KMBMarcos.py" new file mode 100644 index 0000000000..dce948fb5a --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/KMBMarcos.py" @@ -0,0 +1,35 @@ +''' + Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido + correctamente desde el teclado. + Si sucede esto, debe notificarse mostrando un mensaje en la terminal. +''' + +import keyboard as kb +# Definimos algunos codigos +codeKonamiHealth = ["up","down", "a","b"] +codeKonamiAtk = ["up","up","a","a"] +codeKonameDef = ["down","down","b","b"] + +# Creamos las funciones para verificar los codigos +keyPressed = [] +def verifyCode(): + if keyPressed == codeKonameDef: + print("Defense Up!") + elif keyPressed == codeKonamiAtk: + print("Atack Up!") + elif keyPressed == codeKonamiHealth: + print("Health Up!") + + +def on_key_press(event): + key = event.name + keyPressed.append(key) + print(f"The key pressed is: {key}") + verifyCode() + +kb.on_press(on_key_press) + + +# Presionamos la tecla "esc" para interrumpir el programa +kb.wait('esc') + diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/KevinED11.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/KevinED11.py" new file mode 100644 index 0000000000..e11cd34e38 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/KevinED11.py" @@ -0,0 +1,39 @@ +from pynput.keyboard import Key, Listener, KeyCode +from functools import lru_cache + + +@lru_cache(maxsize=100) +def konami_sequence() -> list[Key | KeyCode]: + return [ + Key.up, Key.up, Key.down, Key.down, + Key.left, Key.right, Key.left, Key.right, + KeyCode.from_char('b'), KeyCode.from_char('a') + ] + + +current_keys = [] + + +def show(key: Key) -> bool: + current_keys.append(key) + + print(f"\nYou entered: {key}") + + slice_keys = current_keys[-10:] if len(current_keys) > 9 else current_keys + if len(slice_keys) > 9 and all(command == slice_keys[i] for i, command in enumerate(konami_sequence())): + print("\nSecuencia Konami detectada!") + print("¡Felicidades!") + return False + + if key in (Key.esc,): + print("Adiós, nos vemos pronto") + return False + +def main() -> None: + print("--- Intenta adivinar la secuencia konami ---") + with Listener(on_press=show) as listener: + listener.join() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/edgarmejiav.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/edgarmejiav.py" new file mode 100644 index 0000000000..82967f247c --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/edgarmejiav.py" @@ -0,0 +1,16 @@ +codigo_konami = ['arriba', 'arriba', 'abajo', 'abajo', 'izquierda', 'derecha', 'izquierda', 'derecha', 'B', 'A'] + +def validar_codigo_konami(entrada_usuario): + return entrada_usuario == codigo_konami + +def recibir_entrada_usuario(): + entrada = input("Ingrese el código Konami completo (separado por espacios): ").split() + print(entrada) + if validar_codigo_konami(entrada): + print("¡Código Konami válido!") + else: + print("Código Konami inválido.") + +recibir_entrada_usuario() + +# input test: arriba arriba abajo abajo izquierda derecha izquierda derecha B A \ No newline at end of file diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/ingjavierpinilla.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/ingjavierpinilla.py" new file mode 100644 index 0000000000..a8c608fdf9 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/ingjavierpinilla.py" @@ -0,0 +1,30 @@ +from pynput.keyboard import Key, KeyCode, Listener + +CODIGO_KONAMI = [ + Key.up, + Key.up, + Key.down, + Key.down, + Key.left, + Key.right, + Key.left, + Key.right, + KeyCode.from_char("b"), + KeyCode.from_char("a"), +] + +posicion_actual = 0 + + +def show(key): + global posicion_actual + + if key == CODIGO_KONAMI[posicion_actual]: + posicion_actual += 1 + if posicion_actual == len(CODIGO_KONAMI): + print("\n\n Codigo Konami introducido correctamente") + posicion_actual = 0 + + +with Listener(on_press=show) as listener: + listener.join() diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/jcdm60.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/jcdm60.py" new file mode 100644 index 0000000000..4e5237abf5 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/jcdm60.py" @@ -0,0 +1,46 @@ +# Reto #25: El Código Konami +#### Dificultad: Media | Publicación: 19/06/23 | Corrección: 26/06/23 + +## Enunciado + +# +# Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido correctamente +# desde el teclado. Si sucede esto, debe notificarse mostrando un mensaje en la terminal. +# +import keyboard + + +class KonamiDetector: + def __init__(self): + self.konami_code = [ + "up", + "up", + "down", + "down", + "left", + "right", + "left", + "right", + "b", + "a", + ] + self.current_keys = [] + + def check_konami_code(self): + if self.current_keys == self.konami_code: + print("KONAMI ENCONTRADO!!!!") + + def on_key_press(self, event): + key = event.name + self.current_keys.append(key) + self.current_keys = self.current_keys[-10:] + self.check_konami_code() + + def start(self): + keyboard.on_press(self.on_key_press) + keyboard.wait() + + +if __name__ == "__main__": + konami_detector = KonamiDetector() + konami_detector.start() diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/jpirulo.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/jpirulo.py" new file mode 100644 index 0000000000..b5089d574b --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/jpirulo.py" @@ -0,0 +1,43 @@ +import keyboard +from termcolor import colored + +class KonamiDetector: + def __init__(self): + self.konami_code = ['up', 'up', 'down', 'down', 'left', 'right', 'left', 'right', 'b', 'a'] + self.current_keys = [] + + def konami_check_decorator(func): + def wrapper(self, key): + self.current_keys.append(key.name) + if self.current_keys[-len(self.konami_code):] == self.konami_code: + success_msg = colored("¡Código Konami introducido correctamente!", "green") + print(success_msg) + self.current_keys = [] # Reinicia la lista de teclas actuales + elif self.current_keys[-len(self.konami_code):] != self.konami_code[:len(self.current_keys)]: + error_msg = colored("Código incorrecto. Intenta de nuevo.", "red") + print(error_msg) + self.current_keys = [] # Reinicia la lista de teclas actuales + func(self, key) + return wrapper + + @konami_check_decorator + def key_press(self, key): + pass + + def start_listening(self): + try: + keyboard.on_press(self.key_press) + keyboard.wait() + except KeyboardInterrupt: + error_msg = colored("\nSe ha interrumpido la ejecución.", "red") + print(error_msg) + +if __name__ == '__main__': + try: + detector = KonamiDetector() + start_msg = colored("Introduce el Código Konami:", "blue") + print(start_msg) + detector.start_listening() + except Exception as e: + error_msg = colored(f"\nHa ocurrido un error: {str(e)}", "red") + print(error_msg) diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/juanppdev.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/juanppdev.py" new file mode 100644 index 0000000000..ce4ab498b2 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/juanppdev.py" @@ -0,0 +1,18 @@ +import keyboard + +codigo_konami = ["up", "up", "down", "down", "left", "right", "left", "right", "B", "A"] +progreso = 0 + +def comprobar_codigo(e): + global progreso + + if e.name == codigo_konami[progreso]: + progreso += 1 + if progreso == len(codigo_konami): + print("Codigo Konami introducido correctamente") + progreso = 0 + else: + progreso = 0 + +keyboard.on_press(comprobar_codigo) +keyboard.wait('esc') \ No newline at end of file diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/klyone.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/klyone.py" new file mode 100644 index 0000000000..ab567f0988 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/klyone.py" @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 + +import sys +import tty +import os +import termios + +def configure_stdin(): + stdin_settings = termios.tcgetattr(sys.stdin) + tty.setcbreak(sys.stdin.fileno()) + return stdin_settings + +def restore_stdin(stdin_settings): + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, stdin_settings) + +def check_konami_code(key, partial_code): + konami_code = ["up", "up", "down", "down", "left", "right", "left", "right", "B", "A"] + + partial_code.append(key) + + for i in range(len(partial_code)): + if konami_code[i] != partial_code[i]: + partial_code = [] + return [partial_code, False] + + if len(konami_code)-1 == i: + found = True + else: + found = False + + return [partial_code, found] + +def is_control_code(key): + if len(key) == 3: + return True + else: + return False + +def read_key(): + + arrow_keys = { + 65: "up", + 66: "down", + 67: "right", + 68: "left" + } + + character = os.read(sys.stdin.fileno(), 3).decode() + key_name = "Unknown" + if is_control_code(character): + character = ord(character[2]) + if character in arrow_keys: + key_name = arrow_keys[character] + else: + character = ord(character) + key_name = chr(character) + + return key_name + +if __name__ == "__main__": + + settings = configure_stdin() + partial_code = [] + + while True: + key = read_key() + [partial_code, found] = check_konami_code(key, partial_code) + if found: + print("Congratullations: Konami code introduced!") + break + + restore_stdin(settings) diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/majinka10.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/majinka10.py" new file mode 100644 index 0000000000..e7871c7e1a --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/majinka10.py" @@ -0,0 +1,29 @@ +import msvcrt + +konami = ['up', 'up', 'down', 'down', 'left', 'right', 'left', 'right', 'a', 'b', 'enter'] +current_sequence = [] + +while True: + if msvcrt.kbhit(): + key = msvcrt.getch() + if key == b'\xe0': + # Tecla especial, leer siguiente byte + key = msvcrt.getch() + if key == b'H': + current_sequence.append('up') + elif key == b'P': + current_sequence.append('down') + elif key == b'M': + current_sequence.append('right') + elif key == b'K': + current_sequence.append('left') + elif key in (b'a', b'A'): + current_sequence.append('a') + elif key in (b'b', b'B'): + current_sequence.append('b') + elif key == b'\r': + current_sequence.append('enter') + + if current_sequence[-len(konami):] == konami: + print('Código Konami ingresado correctamente!') + break diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/mouredev.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/mouredev.py" new file mode 100644 index 0000000000..46827ea8e1 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/mouredev.py" @@ -0,0 +1,45 @@ +from pynput.keyboard import Key, KeyCode, Listener + +KONAMI_CODE = [ + Key.up, Key.up, Key.down, Key.down, + Key.left, Key.right, Key.left, Key.right, + KeyCode.from_char("b"), KeyCode.from_char("a") +] + +key_position = 0 +last_key = Key.esc + +def on_press(key): + + global key_position, last_key + + if key == Key.esc: + print("Exit") + return False + + if key == KONAMI_CODE[key_position]: + key_position += 1 + elif key == KONAMI_CODE[0]: + # Se controla que se falle con la primera tecla válida + if last_key == KONAMI_CODE[0]: + # Se controla que se escriba varias veces la primera tecla válida + key_position = 2 + else: + key_position = 1 + else: + key_position = 0 + + if key_position == len(KONAMI_CODE): + print(""" + \n + ╦╔═╔═╗╔╗╔╔═╗╔╦╗╦ ╔═╗╔═╗╔╦╗╔═╗ + ╠╩╗║ ║║║║╠═╣║║║║ ║ ║ ║ ║║║╣ + ╩ ╩╚═╝╝╚╝╩ ╩╩ ╩╩ ╚═╝╚═╝═╩╝╚═╝ + \n + """) + return False + + last_key = key + +with Listener(on_press=on_press) as listener: + listener.join() diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/nlarrea.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/nlarrea.py" new file mode 100644 index 0000000000..69fe6669d4 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/nlarrea.py" @@ -0,0 +1,43 @@ +from pynput.keyboard import Key, Listener, KeyCode + +KONAMI = [ + Key.up, Key.up, + Key.down, Key.down, + Key.left, Key.right, + Key.left, Key.right, + KeyCode.from_char('b'), + KeyCode.from_char('a') +] + +user_pressed = [] + +def on_press(key): + try: + user_pressed.append(key) + print(f"pressed key: {key}") + + if all(list(map( + lambda user_key, konami_key: user_key == konami_key, + user_pressed, KONAMI + ))): + print("\nKONAMI CODE!\n") + + if len(user_pressed) == len(KONAMI): + user_pressed.pop(0) + except: + pass + +def on_release(key): + if key == Key.esc: + # stop listener + return False + + + + +if __name__ == "__main__": + print("Enter ESC to quit at any time.\n") + + # collect events untill released + with Listener(on_press=on_press, on_release=on_release) as listener: + listener.join() \ No newline at end of file diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/pyramsd.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/pyramsd.py" new file mode 100644 index 0000000000..5545494ba2 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/pyramsd.py" @@ -0,0 +1,44 @@ +# escribir sin espacios +# en caso de presionar una tecla no correspondiente se saltará a otra línea +# si lo prueban en pycharm los simbolos se imprimen al momento de apretarlas, en VSCode no sé porque no + +import keyboard + +KONAMI_CODE = "↑ ↑ ↓ ↓ ← → ← → B A".lower().split() + +userInput = [] + + +def on_press(event): + global userInput + if event.name == "flecha arriba": + print("↑", end="") + userInput.append("↑") + elif event.name == "flecha abajo": + print("↓", end="") + userInput.append("↓") + elif event.name == "flecha izquierda": + print("←", end="") + userInput.append("←") + elif event.name == "flecha derecha": + print("→", end="") + userInput.append("→") + elif event.name == "a": + print("a", end="") + userInput.append("a") + elif event.name == "b": + print("b", end="") + userInput.append("b") + else: + print(f"\n{event.name}") + + +keyboard.on_press(on_press) + +keyboard.wait('esc') + + +if userInput == KONAMI_CODE: + print("\nIngresaste correctamente el código konami") +else: + print("\nIngresaste incorrectamente el código konami") diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/rusian69.py" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/rusian69.py" new file mode 100644 index 0000000000..77aeabd50d --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/python/rusian69.py" @@ -0,0 +1,40 @@ +""" + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido + * correctamente desde el teclado. + * Si sucede esto, debe notificarse mostrando un mensaje en la terminal. +""" +import keyboard + +class konami: + def __init__(self): + self.code = [ + "up", + "up", + "down", + "down", + "left", + "right", + "left", + "right", + "b", + "a", + ] + self.inport_keys = [] + + def konami_code (self): + if self.inport_keys == self.code: + print ("KONAMI: he si sabes esto ya andas viejo") + + def keys_press (self, event): + key = event.key + self.inport_keys.append(key) + self.inport_keys = self.inport_keys[-10:] + self.konami_code() + + def star(self): + keyboard.on_press(self.keys_press) + keyboard.wait() + +if __name__ == "__main__": + konami_code = konami() + konami_code.star() diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/ruby/test0n3.rb" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/ruby/test0n3.rb" new file mode 100644 index 0000000000..c26b861bd1 --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/ruby/test0n3.rb" @@ -0,0 +1,140 @@ +# frozen_string_literal: true + +require 'io/console' + +# Reads keypresses from the user including 2 and 3 escape character sequences. +# def read_char +# $stdin.echo = false +# $stdin.raw! + +# input = $stdin.getc.chr +# if input == "\e" +# begin +# input << $stdin.read_nonblock(3) +# rescue StandardError +# nil +# end +# begin +# input << $stdin.read_nonblock(2) +# rescue StandardError +# nil +# end +# end +# ensure +# $stdin.echo = true +# $stdin.cooked! + +# return input +# end + +# # original case statement from: +# # http://www.alecjacobson.com/weblog/?p=75 +# def show_single_key +# c = read_char + +# case c +# when ' ' +# print ' ' +# when "\t" +# print ' ' +# when "\r" +# puts "\r" +# when "\n" +# puts "\n" +# when "\e" +# puts 'Esc' +# when "\e[A" +# print '⇧' +# when "\e[B" +# print '⇩' +# when "\e[C" +# print '⇨' +# when "\e[D" +# print '⇦' +# when "\177" +# print "\177" +# when "\004" +# print "\004" +# when "\e[3~" +# print 'ALTERNATE DELETE' +# when "\u0003" +# print 'CONTROL-C' +# exit 0 +# # when /^.$/ +# # print "SINGLE CHAR HIT: #{c.inspect}" +# when /^.$/ +# print c.upcase +# else +# print "SOMETHING ELSE: #{c.inspect}" +# end +# end + +# show_single_key while true + +# class to read keyboard input +class KeyboardReader + KEYBOARD_MAP = { "\t" => "\t", "\n" => '↲', "\e" => 'Esc', "\e[A" => '⇧', "\e[B" => '⇩', "\e[C" => '⇨', "\e[D" => '⇦', + "\u0003" => "\u0003", ' ' => ' ', ',' => ',', '.' => '.' }.freeze + + def initialize + @continue_input = true + @char_collector = '' + end + + def start + while @continue_input + show_single_key + check_char_collector + end + end + + def read_char + $stdin.echo = false + $stdin.raw! + + input = $stdin.getc.chr + if input == "\e" + begin + input << $stdin.read_nonblock(3) + rescue StandardError + nil + end + begin + input << $stdin.read_nonblock(2) + rescue StandardError + nil + end + end + ensure + $stdin.echo = true + $stdin.cooked! + + return input + end + + def show_single_key + char = read_char + # puts "char: #{char}, @char_collector: #{@char_collector}" + if KEYBOARD_MAP[char].nil? + @char_collector += char.upcase + print char.upcase + else + @char_collector += KEYBOARD_MAP[char] + print KEYBOARD_MAP[char] + end + end + + def check_char_collector + if /(⇧⇧⇩⇩⇦⇨⇦⇨BA)/.match?(@char_collector) + puts "\nKonami Code!!" + @continue_input = false + end + + if /(EscEsc)|(\u0003)/.match?(@char_collector) + puts "\nExiting" + @continue_input = false + end + end +end + +KeyboardReader.new.start diff --git "a/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/swift/kontroldev.swift" "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/swift/kontroldev.swift" new file mode 100644 index 0000000000..2c9106ec2a --- /dev/null +++ "b/Retos/Reto #25 - EL C\303\223DIGO KONAMI [Media]/swift/kontroldev.swift" @@ -0,0 +1,50 @@ +/* + * Crea un programa que detecte cuando el famoso "Código Konami" se ha introducido correctamente + * desde el teclado. Si sucede esto, debe notificarse mostrando un mensaje en la terminal. + */ + +import Foundation + +// Secuencia del código Konami +let konamiCode: [String] = ["⬆️", "⬆️", "⬇️", "⬇️", "⬅️", "➡️", "⬅️", "➡️", "B", "A"] + +// Variables para realizar el seguimiento del código ingresado +var currentInput: [String] = [] +var currentIndex = 0 + +// Función para verificar si se ha ingresado el código completo +func checkKonamiCode() { + if currentInput == konamiCode { + print("¡Código Konami introducido correctamente!") + } else { + print("Código incorrecto. Inténtalo de nuevo.") + currentInput.removeAll() + currentIndex = 0 + } +} + +// Función para procesar las teclas ingresadas por el usuario +func processKey(_ key: String) { + if key == konamiCode[currentIndex] { + currentInput.append(key) + currentIndex += 1 + + if currentIndex == konamiCode.count { + checkKonamiCode() + } + } else { + print("Código incorrecto. Inténtalo de nuevo.") + currentInput.removeAll() + currentIndex = 0 + } +} + +// Iniciar la lectura de teclas +print("Introduce el Código Konami:") + +while currentIndex < konamiCode.count { + if let key = readLine(strippingNewline: true) { + processKey(key) + } +} + diff --git a/Retos/Reto #26 - TESTING [Media]/c#/JonAFernan.cs b/Retos/Reto #26 - TESTING [Media]/c#/JonAFernan.cs new file mode 100644 index 0000000000..3f2626888a --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/c#/JonAFernan.cs @@ -0,0 +1,47 @@ +using Xunit; + +/* + * Crea tres test sobre el reto 12: "Viernes 13". + * - Puedes copiar una solución ya creada por otro usuario en + * el lenguaje que estés utilizando. + * - Debes emplear un mecanismo de ejecución de test que posea + * el lenguaje de programación que hayas seleccionado. + * - Los tres test deben de funcionar y comprobar + * diferentes situaciones (a tu elección). + */ + +namespace reto26; + +public class TestReto13 + { + [Fact] + public static void TrueTest() + { + Assert.True(IsFriday13(5,2022)); + } + + [Fact] + public static void FalseTest() + { + Assert.False(IsFriday13(7,2022)); + } + + [Fact] + public static void CorrectFormatMonth() + { + int [] months = Enumerable.Range(1,12).ToArray(); + int [] years = Enumerable.Range(1,9999).ToArray(); + + + foreach (int month in months) Assert.InRange(month, 1 , 12); + foreach (int year in years) Assert.InRange(year, 1 , 9999); + } + + + public static bool IsFriday13(int month, int year) + { + DateTime dateToCheck = new DateTime(year, month, 13); + + return dateToCheck.DayOfWeek == DayOfWeek.Friday; + } + } \ No newline at end of file diff --git a/Retos/Reto #26 - TESTING [Media]/ejercicio.md b/Retos/Reto #26 - TESTING [Media]/ejercicio.md new file mode 100644 index 0000000000..cc88c07663 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/ejercicio.md @@ -0,0 +1,21 @@ +# Reto #26: Testing +#### Dificultad: Media | Publicación: 26/06/23 | Corrección: 03/07/23 + +## Enunciado + +``` +/* + * Crea tres test sobre el reto 12: "Viernes 13". + * - Puedes copiar una solución ya creada por otro usuario en + * el lenguaje que estés utilizando. + * - Debes emplear un mecanismo de ejecución de test que posea + * el lenguaje de programación que hayas seleccionado. + * - Los tres test deben de funcionar y comprobar + * diferentes situaciones (a tu elección). + */ +``` +#### Tienes toda la información extendida sobre los retos de programación semanales en **[retosdeprogramacion.com/semanales2023](https://retosdeprogramacion.com/semanales2023)**. + +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/Retos/Reto #26 - TESTING [Media]/go/blackriper.go b/Retos/Reto #26 - TESTING [Media]/go/blackriper.go new file mode 100644 index 0000000000..3cee8d047f --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/go/blackriper.go @@ -0,0 +1,56 @@ +package main + +import ( + "testing" +) + +/* codigo de testing obtenido del ejercicio 12 de carxofeta gracias por tu contribucion +go tiene su propia libreria para testing solo si quieres mas funciones puedes usar alguna libreria +go permite evaluar varios casos de uso en forma de array o como el lo llama table driven testing por lo tanto cada caso de uso es como un testing individual +si vas a probar este testing el nombre del archivo tiene que tener al final _test.go para poder ejecutar el comando go test*/ + +// 1.-testing function friday13 +type fridayTest struct { + month, year int + expected bool +} + +// definir casos de uso el ultimo caso comentado nos daria un eror +var caseUses = []fridayTest{ + {5, 2023, false}, + {1, 2023, true}, + //{1, 2023, false} +} + +// funcion para testing de friday13 funcion +func TestFriday13(t *testing.T) { + for _, test := range caseUses { + if output := friday13(test.month, test.year); output != test.expected { + t.Errorf("Output %v not equal expected %v \n", output, test.expected) + } + } +} + +// 2.-testing funcion Parse data funcion agegada para poder hacer testing +type parseTest struct { + month, year string + expected_one int + expected_two error + expected_tree int + expected_four error +} + +var inputs = []parseTest{ + {"1", "2023", 1, nil, 2023, nil}, + {"2", "2022", 2, nil, 2022, nil}, + //{"aw", "2023", 3, nil, 2023, nil}, +} + +func TestParseData(t *testing.T) { + for _, input := range inputs { + out1, out2, out3, out4 := parseData(input.month, input.year) + if out1 != input.expected_one || out2 != input.expected_two || out3 != input.expected_tree || out4 != input.expected_four { + t.Errorf("Ouputs %v, %v ,%v ,%v not equals %v ,%v ,%v ,%v", out1, out2, out3, out4, input.expected_one, input.expected_two, input.expected_tree, input.expected_four) + } + } +} diff --git a/Retos/Reto #26 - TESTING [Media]/java/LaijieJi.java b/Retos/Reto #26 - TESTING [Media]/java/LaijieJi.java new file mode 100644 index 0000000000..090830abb4 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/java/LaijieJi.java @@ -0,0 +1,27 @@ +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.util.*; + +public class LaijieJi { + public static void main(String[] args) { + int year = 2023; + int month = 1;//On 13, January of 2023 there is a Friday 13th, but in the next two months there is not. + for(int i = 0; i < 3; i++){ + if(checkFriday(year, month) == true){ + System.out.println("Case #" + i + ": Passed"); + } else { + System.out.println("Case #" + i + ": Wrong"); + } + ++month; + } + } + //Shortened version of the code for Checking if a date was Friday 13th. The input part was eliminated + public static boolean checkFriday(int year, int month){ + LocalDate date = LocalDate.of(year, month, 13); + if(date.getDayOfWeek() == DayOfWeek.FRIDAY) { + return true; + }else { + return false; + } + } +} diff --git a/Retos/Reto #26 - TESTING [Media]/java/Qv1ko.java b/Retos/Reto #26 - TESTING [Media]/java/Qv1ko.java new file mode 100644 index 0000000000..8ecbed0576 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/java/Qv1ko.java @@ -0,0 +1,26 @@ +import org.junit.Test; +import static org.junit.Assert.*; + +import java.time.DayOfWeek; +import java.time.LocalDate; + +public class Qv1ko { + + @Test + public void testing() { + assertTrue(isFridayThirteenth(10, 2023)); + assertFalse(isFridayThirteenth(6, 2023)); + assertNotNull(isFridayThirteenth(8, 2023)); + } + + private static boolean isFridayThirteenth(int month,int year) { + + try { + return LocalDate.of(year, month, 13).getDayOfWeek() == DayOfWeek.FRIDAY; + } catch (Exception exc) { + return false; + } + + } + +} diff --git a/Retos/Reto #26 - TESTING [Media]/java/asjordi.java b/Retos/Reto #26 - TESTING [Media]/java/asjordi.java new file mode 100644 index 0000000000..31a6291aff --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/java/asjordi.java @@ -0,0 +1,30 @@ +import static facil.reto12.Friday13.check; +import org.junit.Test; +import static junit.framework.TestCase.assertTrue; +import static junit.framework.TestCase.assertFalse; + +public class Friday13Test { + + @Test + public void friday13Exists(){ + assertTrue(check(2023, 1)); + } + + @Test + public void friday13DoesNotExists(){ + assertFalse(check(2023, 2)); + assertFalse(check(2023, 11)); + } + + @Test + public void multipleFriday13(){ + assertTrue(check(2017, 1)); + assertTrue(check(2017, 10)); + assertTrue(check(2018, 7)); + assertTrue(check(2019, 12)); + assertTrue(check(2020, 3)); + assertTrue(check(2021, 8)); + assertTrue(check(2022, 5)); + } + +} diff --git a/Retos/Reto #26 - TESTING [Media]/javascript/cesar-ch.js b/Retos/Reto #26 - TESTING [Media]/javascript/cesar-ch.js new file mode 100644 index 0000000000..355db71f3f --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/javascript/cesar-ch.js @@ -0,0 +1,31 @@ +/* + * Crea tres test sobre el reto 12: "Viernes 13". + * - Puedes copiar una solución ya creada por otro usuario en + * el lenguaje que estés utilizando. + * - Debes emplear un mecanismo de ejecución de test que posea + * el lenguaje de programación que hayas seleccionado. + * - Los tres test deben de funcionar y comprobar + * diferentes situaciones (a tu elección). + */ + +import { describe, expect, it, } from "vitest"; + +function itsFridayThirteenth(month, year) { + return new Date(`${month} 13, ${year}`).getDay() === 5 +} + + + +describe('itsFridayThirteenth', () => { + it('should return true for friday the 13th', () => { + expect(itsFridayThirteenth('January', 2023)).toBe(true) + }) + + it('should return false for friday the 13th', () => { + expect(itsFridayThirteenth('May', 2022)).toBe(true) + }) + + it('should return false for friday the 13th', () => { + expect(itsFridayThirteenth('July', 2023)).toBe(false) + }) +}) \ No newline at end of file diff --git a/Retos/Reto #26 - TESTING [Media]/javascript/marcode24.js b/Retos/Reto #26 - TESTING [Media]/javascript/marcode24.js new file mode 100644 index 0000000000..a617b4707e --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/javascript/marcode24.js @@ -0,0 +1,68 @@ +/* + * Crea tres test sobre el reto 12: "Viernes 13". + * - Puedes copiar una solución ya creada por otro usuario en + * el lenguaje que estés utilizando. + * - Debes emplear un mecanismo de ejecución de test que posea + * el lenguaje de programación que hayas seleccionado. + * - Los tres test deben de funcionar y comprobar + * diferentes situaciones (a tu elección). + */ + +// Visita mi repo en GitHub para ver y correr los tests de este código --> https://github.com/marcode24/weekly-challenges + +const includesFriday13 = require('../12-viernes-13/solution'); + +describe('Challenge 12: Viernes 13', () => { + const testCases = [ + { + input: [2, 2016], + output: false, + }, + { + input: [4, 1990], + output: true, + }, + { + input: [7, 1990], + output: true, + }, + { + input: [11, 2009], + output: true, + }, + { + input: [8, 2010], + output: true, + }, + { + input: [5, 2011], + output: true, + }, + { + input: [1, 1985], + output: false, + }, + { + input: [8, 2021], + output: true, + }, + { + input: [1, 2023], + output: true, + }, + { + input: [10, 2023], + output: true, + }, + ]; + + it('should return a boolean type', () => { + expect(typeof includesFriday13(1, 2023)).toBe('boolean'); + }); + + it.each(testCases)('should return $output', (testCase) => { + expect(includesFriday13(...testCase.input)).toBe(testCase.output); + }); +}); + +// Visita mi repo en GitHub para ver y correr los tests de este código --> https://github.com/marcode24/weekly-challenges diff --git a/Retos/Reto #26 - TESTING [Media]/javascript/othamae.js b/Retos/Reto #26 - TESTING [Media]/javascript/othamae.js new file mode 100644 index 0000000000..450a276a61 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/javascript/othamae.js @@ -0,0 +1,39 @@ +/* + * Crea tres test sobre el reto 12: "Viernes 13". + * - Puedes copiar una solución ya creada por otro usuario en + * el lenguaje que estés utilizando. + * - Debes emplear un mecanismo de ejecución de test que posea + * el lenguaje de programación que hayas seleccionado. + * - Los tres test deben de funcionar y comprobar + * diferentes situaciones (a tu elección). + */ + +const assert = require('assert') + +// Function to test +const isFriday13th = (month, year) => { + const date = new Date(year, month - 1, 13) + return date.getDay() === 5 +} + +// Examples +console.log(isFriday13th(8, 2021)) // true +console.log(isFriday13th(10, 2021)) // false +console.log(isFriday13th(5, 2022)) // true +console.log(isFriday13th(1, 2023)) // true +console.log(isFriday13th(6, 2022)) // false +console.log(isFriday13th(10, 2023)) // true + +// Test 1: Check a month with Fridat 13th +assert.strictEqual(isFriday13th(8, 2021), true) + +// Test 2: Check a month that doesnt have Friday 13th +assert.strictEqual(isFriday13th(10, 2021), false) + +// Test 3: Ckeck that the response is not null +const result = isFriday13th(1, 2023) +assert.ok(result !== null) +assert.notStrictEqual(result, null) +assert.notStrictEqual(result, undefined) + +console.log("Tests passed") \ No newline at end of file diff --git a/Retos/Reto #26 - TESTING [Media]/kotlin/Mariopolonia0.kt b/Retos/Reto #26 - TESTING [Media]/kotlin/Mariopolonia0.kt new file mode 100644 index 0000000000..4638e6543f --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/kotlin/Mariopolonia0.kt @@ -0,0 +1,46 @@ +package EjercicioKotlin.Mouredev + +import java.lang.Exception + +fun main(){ + Testing() +} + +class Testing{ + + init { + testingOne() + testingTwo() + testingThree() + } + + //Testing con los valores negativos + private fun testingOne(){ + try { + Reto12(-9,-2015) + println("paso el testing") + }catch (e:Exception){ + println("no paso el testing") + } + } + + //Testing con los valores fuera de rango + private fun testingTwo(){ + try { + Reto12(50,2015) + println("paso el testing") + }catch (e:Exception){ + println("no paso el testing") + } + } + + //Testing con los valores mu grande + private fun testingThree(){ + try { + Reto12(20595059,20595959) + println("paso el testing") + }catch (e:Exception){ + println("no paso el testing") + } + } +} diff --git a/Retos/Reto #26 - TESTING [Media]/kotlin/pisanowp.kt b/Retos/Reto #26 - TESTING [Media]/kotlin/pisanowp.kt new file mode 100644 index 0000000000..90d576d1d7 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/kotlin/pisanowp.kt @@ -0,0 +1,49 @@ +/* +* Reto #26 26/06/2023 +* +* Crea tres test sobre el reto 12: "Viernes 13". +* - Puedes copiar una solución ya creada por otro usuario en +* el lenguaje que estés utilizando. +* - Debes emplear un mecanismo de ejecución de test que posea +* el lenguaje de programación que hayas seleccionado. +* - Los tres test deben de funcionar y comprobar +* diferentes situaciones (a tu elección). +* +*/ + + +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.Assertions.* + +internal class Reto26_viernes_13KtTest { + + @Test + fun hasViernes13() { + /* Relación de Viernes de 13 desde 2022 a 2025 + MAY de 2022 tiene un VIERNES 13 + JANUARY de 2023 tiene un VIERNES 13 + OCTOBER de 2023 tiene un VIERNES 13 + SEPTEMBER de 2024 tiene un VIERNES 13 + DECEMBER de 2024 tiene un VIERNES 13 + JUNE de 2025 tiene un VIERNES 13 */ + + val viernes13 = listOf( Pair(5, 2022), Pair(1, 2023), Pair(10, 2023), Pair(9, 2024), Pair(12, 2024), Pair(6, 2025)) + + viernes13.forEach() { + assertEquals(true, hasViernes13(it.first, it.second) ) + + } + + } + + @Test + fun hasNotViernes13(){ + /* Fechas que NO son viernes 13 */ + val viernes13 = listOf( Pair(1, 2022), Pair(2, 2023), Pair(11, 2023), Pair(6, 2024)) + + viernes13.forEach() { + assertNotEquals(true, hasViernes13(it.first, it.second) ) + + } + } +} \ No newline at end of file diff --git a/Retos/Reto #26 - TESTING [Media]/python/Hugovrc.py b/Retos/Reto #26 - TESTING [Media]/python/Hugovrc.py new file mode 100644 index 0000000000..2d33188cc6 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/Hugovrc.py @@ -0,0 +1,24 @@ +from datetime import datetime +import unittest + +def FridayThe13th(month, year): + date = datetime(year, month, 13) + + return True if date.weekday() == 4 else False + +class test_viernes_13(unittest.TestCase): + def test_1(self): + self.assertTrue(FridayThe13th(1,2023)) + def test_2(self): + self.assertEqual(FridayThe13th(1,2025),False) + def test_3(self): + with self.assertRaises(TypeError): + FridayThe13th("01","2026") + def test_4(self): + self.assertEqual(FridayThe13th("1","2023"),True) + + +if __name__ == '__main__': + unittest.main() + + diff --git a/Retos/Reto #26 - TESTING [Media]/python/KevinED11.py b/Retos/Reto #26 - TESTING [Media]/python/KevinED11.py new file mode 100644 index 0000000000..80cc09b6c8 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/KevinED11.py @@ -0,0 +1,34 @@ +import unittest +from datetime import date + + +def is_friday_13(year: int, month: int) -> bool: + if not isinstance(year, int) or not isinstance(month, int): + raise TypeError("Invalid year or month, enter a valid integer number") + + return date(year=year, + month=month, + day=13).weekday() == 4 + + +class TestIsFriday13(unittest.TestCase): + def setUp(self): + self.valid_friday_13 = is_friday_13(year=2023, month=1) + self.invalid_friday_13 = is_friday_13(year=2023, month=2) + + def test_valid_expected_return_type(self): + self.assertIsInstance(self.valid_friday_13, bool) + + def test_valid_friday_13(self): + self.assertIs(self.valid_friday_13, True) + + def test_invalid_friday_13(self): + self.assertIsNot(self.invalid_friday_13, True) + + def test_expected_error(self): + with self.assertRaises(TypeError): + is_friday_13(year=2023, month="2") + + +if __name__ == "__main__": + unittest.main() diff --git a/Retos/Reto #26 - TESTING [Media]/python/Lemito66.py b/Retos/Reto #26 - TESTING [Media]/python/Lemito66.py new file mode 100644 index 0000000000..c07a044034 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/Lemito66.py @@ -0,0 +1,26 @@ +""" +* Crea tres test sobre el reto 12: "Viernes 13". + * - Puedes copiar una solución ya creada por otro usuario en + * el lenguaje que estés utilizando. + * - Debes emplear un mecanismo de ejecución de test que posea + * el lenguaje de programación que hayas seleccionado. + * - Los tres test deben de funcionar y comprobar + * diferentes situaciones (a tu elección). +""" + +import datetime +#Lemito66 +def friday_thirteen(year: int, month: int) -> bool: + try: + return datetime.date(year,month,13).weekday() == 4 # weekday() return day of the week, where Monday == 0 ... Sunday == 6. + except: + return False + +def test_one_friday_thirteen(): + assert friday_thirteen(2022, 5) == True + +def test_two_friday_thirteen(): + assert friday_thirteen(2022, 4) == False + +def test_three_friday_thirteen(): + assert friday_thirteen(-1, 5) == False \ No newline at end of file diff --git a/Retos/Reto #26 - TESTING [Media]/python/ingjavierpinilla.py b/Retos/Reto #26 - TESTING [Media]/python/ingjavierpinilla.py new file mode 100644 index 0000000000..e573d6ae4a --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/ingjavierpinilla.py @@ -0,0 +1,56 @@ +import unittest +from datetime import datetime + + +def has_friday_13(year: int, month: int) -> bool: + """Esta funcion retorna verdadero si para un año y mes dado existe un viernes 13 + + Args: + year (int): + month (int): + + Returns: + bool: + """ + if not isinstance(year, int): + raise TypeError("Year invalid, enter a valid integer number") + if not isinstance(month, int): + raise TypeError("Month invalid, enter a valid integer number") + + return datetime(year, month, 13).weekday() == 4 + + +class TestIsFriday13(unittest.TestCase): + def setUp(self): + self.is_friday_13 = {"year": 2023, "month": 10} + self.not_friday_13 = {"year": 2023, "month": 7} + + def test_invalid_year(self): + with self.assertRaises(TypeError): + has_friday_13(year="1520", month=7) + + def test_invalid_month(self): + with self.assertRaises(TypeError): + has_friday_13(year=1520, month=(1520, 1)) + + def test_expected_return(self): + self.assertIsInstance(has_friday_13(year=1520, month=7), bool) + + def test_valid_friday_13(self): + self.assertIs( + has_friday_13( + year=self.is_friday_13["year"], month=self.is_friday_13["month"] + ), + True, + ) + + def test_invalid_friday_13(self): + self.assertIsNot( + has_friday_13( + year=self.not_friday_13["year"], month=self.not_friday_13["month"] + ), + True, + ) + +if __name__ == "__main__": + unittest.main() diff --git a/Retos/Reto #26 - TESTING [Media]/python/jcdm60.py b/Retos/Reto #26 - TESTING [Media]/python/jcdm60.py new file mode 100644 index 0000000000..e756457653 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/jcdm60.py @@ -0,0 +1,45 @@ +# Reto #26: Testing +#### Dificultad: Media | Publicación: 26/06/23 | Corrección: 03/07/23 + +## Enunciado + +# +# Crea tres test sobre el reto 12: "Viernes 13". +# - Puedes copiar una solución ya creada por otro usuario en +# el lenguaje que estés utilizando. +# - Debes emplear un mecanismo de ejecución de test que posea +# el lenguaje de programación que hayas seleccionado. +# - Los tres test deben de funcionar y comprobar +# diferentes situaciones (a tu elección). +# + +import unittest +import datetime + + +def is_friday_13(month, year): + # Creamos un objeto datetime para el 13 del month y año indicados + date = datetime.date(year, month, 13) + + # Comprobamos si es viernes (el número 4 representa el día viernes) + if date.weekday() == 4: + return True + else: + return False + + +class Friday13TestCase(unittest.TestCase): + def test_friday_13(self): + self.assertTrue(is_friday_13(1, 2023)) # Enero 2023, viernes 13 + self.assertFalse(is_friday_13(2, 2023)) # Febrero 2023, no es viernes 13 + + + def test_month_range(self): + self.assertRaises(ValueError, is_friday_13, 0, 2023) # Mes < 1 + self.assertRaises(ValueError, is_friday_13, 13, 2023) # Mes > 12 + + def test_year_type(self): + self.assertRaises(TypeError, is_friday_13, 1, "2023") # Año no es un número entero + +if __name__ == "__main__": + unittest.main() diff --git a/Retos/Reto #26 - TESTING [Media]/python/juanppdev.py b/Retos/Reto #26 - TESTING [Media]/python/juanppdev.py new file mode 100644 index 0000000000..87e3c3874e --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/juanppdev.py @@ -0,0 +1,23 @@ +import unittest +import datetime + +def es_viernes_13(mes, año): + fecha = datetime.datetime(año, mes, 13) + return fecha.weekday() == 4 + +class TestViernes13(unittest.TestCase): + + def test_viernes_13_valido(self): + # Prueba para un viernes 13 válido + self.assertTrue(es_viernes_13(3, 2023)) # Marzo de 2023 es un viernes 13 válido + + def test_viernes_13_no_valido(self): + # Prueba para un viernes 13 no válido + self.assertFalse(es_viernes_13(5, 2022)) # Mayo de 2022 no es un viernes 13 válido + + def test_viernes_13_limite(self): + # Prueba para el límite de los años + self.assertTrue(es_viernes_13(1, 2100)) # Enero de 2100 es un viernes 13 válido + +if __name__ == '__main__': + unittest.main() diff --git a/Retos/Reto #26 - TESTING [Media]/python/klyone.py b/Retos/Reto #26 - TESTING [Media]/python/klyone.py new file mode 100644 index 0000000000..2862691982 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/klyone.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 + +import pytest +import calendar +import datetime + +# Run tests with pytest + +def is_there_13_friday(month, year, debug=False): + cal = calendar.Calendar() + + if debug: + print(calendar.month(year, month)) + + for day in cal.itermonthdays2(year, month): + if day[0] == 13: + break + + if day[1] == calendar.FRIDAY: + return True + else: + return False + +def test_nothing(): + pass + +def test_invalid_year(): + assert not is_there_13_friday(1,-1500000) + +def test_invalid_year2(): + assert not is_there_13_friday(1, datetime.MINYEAR-1) + +def test_invalid_year3(): + assert not is_there_13_friday(1, datetime.MAXYEAR+1) + +def test_invalid_month(): + with pytest.raises(calendar.IllegalMonthError): + is_there_13_friday(-5, 1900) + +def test_no_friday_13nd(): + assert not is_there_13_friday(1, 1900) + assert not is_there_13_friday(3, 1988) + assert not is_there_13_friday(3, 1991) + assert not is_there_13_friday(6, 2023) + +def test_friday_13nd(): + assert is_there_13_friday(1, 2012) + assert is_there_13_friday(4, 2012) + assert is_there_13_friday(7, 2012) + assert is_there_13_friday(3, 2020) diff --git a/Retos/Reto #26 - TESTING [Media]/python/majinka10.py b/Retos/Reto #26 - TESTING [Media]/python/majinka10.py new file mode 100644 index 0000000000..023d747921 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/majinka10.py @@ -0,0 +1,30 @@ +from datetime import datetime + +meses={'Enero':'01','Febrero':'02','Marzo':'03','Abril':'04','Mayo':'05' + ,'Junio':'06','Julio':'07','Agosto':'08','Septiembre':'09','Octubre':'10','Noviembre':'11','Diciembre':'12'} + +def viernes13(mes:str,año): + try: + date_str=f'{13}/{meses[mes]}/{año}' + date = datetime.strptime(date_str, '%d/%m/%Y') + return date.strftime('%A') == 'Friday' + except: + return False + +def test_viernes13_true_date(): + assert viernes13('Enero',2023) + +def test_viernes13_false_date(): + assert not viernes13('Febrero',2020) + +def test_viernes13_invalid_year(): + assert not viernes13('Enero', -2023) + assert not viernes13('Marzo', "-2020") + assert not viernes13('Junio', "Juan") + +def test_viernes13_invalid_month(): + assert not viernes13(12, 2020) + assert not viernes13('dos', 2015) + +def test_viernes13_invalid_data(): + assert not viernes13('Hola','Chao') \ No newline at end of file diff --git a/Retos/Reto #26 - TESTING [Media]/python/mouredev.py b/Retos/Reto #26 - TESTING [Media]/python/mouredev.py new file mode 100644 index 0000000000..d6f6c08211 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/mouredev.py @@ -0,0 +1,26 @@ +import datetime + +def friday_13(year: int, month: int) -> bool: + try: + return datetime.date(year, month, 13).weekday() == 4 + except: + return False + +def test_friday_13_true_date(): + assert friday_13(2023, 1) + +def test_friday_13_false_date(): + assert not friday_13(2023, 3) + +def test_friday_13_invalid_year(): + assert not friday_13("2023", 1) + assert not friday_13("MoureDev", 1) + assert not friday_13(-2023, 1) + +def test_friday_13_invalid_month(): + assert not friday_13(2023, "1") + assert not friday_13(2023, "one") + assert not friday_13(2023, -1) + +def test_friday_13_invalid_data(): + assert not friday_13("Brais", "Moure") \ No newline at end of file diff --git a/Retos/Reto #26 - TESTING [Media]/python/nlarrea.py b/Retos/Reto #26 - TESTING [Media]/python/nlarrea.py new file mode 100644 index 0000000000..5e27a33005 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/nlarrea.py @@ -0,0 +1,50 @@ +""" + * Crea tres test sobre el reto 12: "Viernes 13". + * - Puedes copiar una solución ya creada por otro usuario en + * el lenguaje que estés utilizando. + * - Debes emplear un mecanismo de ejecución de test que posea + * el lenguaje de programación que hayas seleccionado. + * - Los tres test deben de funcionar y comprobar + * diferentes situaciones (a tu elección). +""" + +import unittest +from datetime import datetime + + +def is_friday_thirteen(month, year): + if not isinstance(month, int) or not isinstance(year, int): + assert TypeError("Invalid month or year. Use integer numbers.") + + if month < 1 or month > 12: + return "Month is out of range." + + date = datetime(year, month, 13) + return date.weekday() == 4 + + +class TestReto12(unittest.TestCase): + def test_number_month(self): + is_friday_13th = is_friday_thirteen(1, 2023) + self.assertTrue(is_friday_13th) + + is_friday_13th = is_friday_thirteen(3, 2022) + self.assertFalse(is_friday_13th) + + def test_month_out_of_range(self): + is_friday_13th = is_friday_thirteen(14, 2023) + self.assertEqual(is_friday_13th, "Month is out of range.") + + is_friday_13th = is_friday_thirteen(-1, 2023) + self.assertEqual(is_friday_13th, "Month is out of range.") + + def test_not_numeric_values(self): + with self.assertRaises(TypeError): + is_friday_thirteen("6", 1998) + + with self.assertRaises(TypeError): + is_friday_thirteen(6, "1998") + + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/Retos/Reto #26 - TESTING [Media]/python/pyramsd.py b/Retos/Reto #26 - TESTING [Media]/python/pyramsd.py new file mode 100644 index 0000000000..c67aabaecc --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/pyramsd.py @@ -0,0 +1,28 @@ +import datetime + + +def viernes_trece(year, month): + + date = datetime.date(year, month, 13) + + if date.weekday() == 4: + return True + else: + return False + + +# se espera un resultado falso de la fecha datetime.MAXYEAR(9999) y el mes 1(enero) +def test_invalid_year_1(): + assert not viernes_trece(datetime.MAXYEAR, 1) + + +# se espera un resultado falso de la fecha 1900 de enero +def test_no_viernes_trece(): + assert not viernes_trece(1900, 1) + + +# se espera un resultado verdadero de la fecha 2023 de enero +def test_si_viernes_trece(): + assert viernes_trece(2023, 1) + +# --!! run: pytest pyramsd.py diff --git a/Retos/Reto #26 - TESTING [Media]/python/tecfer.py b/Retos/Reto #26 - TESTING [Media]/python/tecfer.py new file mode 100644 index 0000000000..29bb345ce1 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/tecfer.py @@ -0,0 +1,27 @@ +import unittest +from datetime import date + +def friday_13(month, year) -> bool : + try: + return date(year, month, 13).isoweekday() == 5 + except: + return False + +class FridayTestCase(unittest.TestCase): + + def test_is_friday_13(self): + day = friday_13(1,2023) + self.assertTrue(day) + + def test_is_not_friday_13(self): + day = friday_13(2,2023) + self.assertFalse(day) + + def test_invalid_date(self): + day = friday_13(13,2023) + self.assertFalse(day) + + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/Retos/Reto #26 - TESTING [Media]/python/test0n3.py b/Retos/Reto #26 - TESTING [Media]/python/test0n3.py new file mode 100644 index 0000000000..5295f4c3aa --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/python/test0n3.py @@ -0,0 +1,37 @@ +# código de la función le pertenece a @jcdm60 +# disponible en: https://github.com/mouredev/retos-programacion-2023/blob/main/Retos/Reto%20%2312%20-%20VIERNES%2013%20%5BF%C3%A1cil%5D/python/jcdm60.py + +import datetime + + +def is_friday_13(month, year): + + # Creamos un objeto datetime para el 13 del month y año indicados + date = datetime.date(year, month, 13) + + # Comprobamos si es viernes (el número 4 representa el día viernes) + if date.weekday() == 4: + return True + else: + return False + + +def test_is_friday_13(): + tests = {'input': [[4, 2022], [8, 2024], [5, 2022], [ + 9, 2024]], 'output': [False, False, True, True]} + errors = 0 + + for index, test in enumerate(tests['input']): + resp = is_friday_13(test[0], test[1]) + expected = tests['output'][index] + if resp != expected: + errors += 1 + print(f"\n\noriginal: {test}") + print(resp) + print(f"expected: {expected}") + + print( + f"\nTests{' not ' if errors != 0 else ' '}passed, {errors} errors\n") + + +test_is_friday_13() diff --git a/Retos/Reto #26 - TESTING [Media]/ruby/test0n3.rb b/Retos/Reto #26 - TESTING [Media]/ruby/test0n3.rb new file mode 100644 index 0000000000..2909854655 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/ruby/test0n3.rb @@ -0,0 +1,72 @@ +# Hay dos formas de probar esta función: +# - sin usar alguna librería/framework para las pruebas +# - usando alguna librería/framework para las pruebas +# +# lo relevante es tener claro los inputs y las respuestas esperadas. +# en este caso se prueban las siguientes datos: +# - fecha pasada sin viernes 13 +# - fecha futura sin viernes 13 +# - fecha pasada con viernes 13 +# - fecha futura con viernes 13 + +# frozen_string_literal: true + +require_relative '../../Reto #12 - VIERNES 13 [Fácil]/ruby/test0n3' +# importando código con la función para probar. + +# ----------------- Sin usar librerías/framework ----------------- + +SOME_TESTS = { 'input' => [[2022, 4], [2024, 8], [2022, 5], [2024, 9]], + 'output' => [false, false, true, true] }.freeze + +errors = 0 + +SOME_TESTS['input'].each_with_index do |test, index| + resp = friday13?(test) + expected = SOME_TESTS['output'][index] + next if resp == expected + + errors += 1 + puts "\n\noriginal: #{test}" + puts resp + puts "expected: #{expected}" +end + +puts "\nTests#{errors != 0 ? ' not ' : ' '}passed, #{errors} errors\n" + +# ----------------- Usando librerías/framework ----------------- + +# gem 'minitest', '~> 5.4' +# require 'minitest/autorun' +# require 'minitest/pride' + +# # class to test friday13 +# class Fridat13Test < Minitest::Test +# def test_past_not_friday13 +# # skip +# input = [2022, 4] +# expected = false +# assert_equal expected, friday13?(input) +# end + +# def test_future_not_friday13 +# # skip +# input = [2024, 8] +# expected = false +# assert_equal expected, friday13?(input) +# end + +# def test_past_friday13 +# # skip +# input = [2022, 5] +# expected = true +# assert_equal expected, friday13?(input) +# end + +# def test_future_friday13 +# # skip +# input = [2024, 9] +# expected = true +# assert_equal expected, friday13?(input) +# end +# end diff --git a/Retos/Reto #26 - TESTING [Media]/swift/allbertoMD.swift b/Retos/Reto #26 - TESTING [Media]/swift/allbertoMD.swift new file mode 100644 index 0000000000..b8a4ac3735 --- /dev/null +++ b/Retos/Reto #26 - TESTING [Media]/swift/allbertoMD.swift @@ -0,0 +1,40 @@ +import Foundation +import XCTest + +// Se aconseja usar el script en Playground para poder usar XCTest + +func isFriday13th(month: Int, year: Int) -> Bool { + + let calendar = Calendar.current + var components = DateComponents() + + components.year = year + components.month = month + components.day = 13 + + if let date = calendar.date(from: components) { + let weekday = calendar.component(.weekday, from: date) + return weekday == 6 + } + + return false +} + +class IsFriday13thTests: XCTestCase { + + func testIsFriday13th() { + + XCTAssertTrue(isFriday13th(month: 8, year: 2021)) + XCTAssertTrue(isFriday13th(month: 1, year: 2023)) + + + XCTAssertFalse(isFriday13th(month: 5, year: 2023)) + XCTAssertFalse(isFriday13th(month: 7, year: 2025)) + } +} + +IsFriday13thTests.defaultTestSuite.run() + + + + diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/c#/JonAFernan.cs" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/c#/JonAFernan.cs" new file mode 100644 index 0000000000..fc07b58745 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/c#/JonAFernan.cs" @@ -0,0 +1,40 @@ +namespace reto27; + +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ +class Program +{ + static void Main(string[] args) + { + CountdownAsync(15,1); + CountdownAsync(4,2); + + Console.ReadKey(); + } + + static async void CountdownAsync(int countNum, int seconds) + { + + if (countNum <=0) + { + System.Console.WriteLine("Error. Insert a non-negative number that is greater than zero"); + return; + } + if (seconds < 0) + { + System.Console.WriteLine("Error. Insert a non-negative number"); + return; + } + for (int i = countNum ; i >= 0; i--) + { + await Task.Delay(seconds * 1000); + System.Console.WriteLine(i); + } + } +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/c++/kevin05m.cpp" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/c++/kevin05m.cpp" new file mode 100644 index 0000000000..5a38e87694 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/c++/kevin05m.cpp" @@ -0,0 +1,23 @@ +#include +#include + +using namespace std; + +void cuentaAtras(int start, int second){ + for (int i = start; i >= 0; i--){ + cout << i << endl; + if(i == 0){ + return; + } + usleep(second); + } + +} + +int main(){ + int start, second; + cin >> start >> second; + second = second * 1e6; + cuentaAtras(start, second); + return 0; +} \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/ejercicio.md" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/ejercicio.md" new file mode 100644 index 0000000000..a54e1c8229 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/ejercicio.md" @@ -0,0 +1,20 @@ +# Reto #27: Cuenta atrás +#### Dificultad: Media | Publicación: 03/07/23 | Corrección: 10/07/23 + +## Enunciado + +``` +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ +``` +#### Tienes toda la información extendida sobre los retos de programación semanales en **[retosdeprogramacion.com/semanales2023](https://retosdeprogramacion.com/semanales2023)**. + +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/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/go/KevinED11.go" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/go/KevinED11.go" new file mode 100644 index 0000000000..10c6f2136c --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/go/KevinED11.go" @@ -0,0 +1,52 @@ +package main + +import ( + "errors" + "fmt" + "time" +) + +type ICounter interface { + Start() +} + +type CounterDown struct { + InitialCount int + PauseDuration int +} + +func (c *CounterDown) Start() { + for c.InitialCount >= 0 { + fmt.Println(c.InitialCount) + + if c.InitialCount == 0 { + break + } + + time.Sleep(time.Duration(c.PauseDuration) * time.Second) + + c.InitialCount -= 1 + } + +} + +func NewCounterDown(initialCount, pauseDuration int) (*CounterDown, error) { + if initialCount <= 0 || pauseDuration <= 0 { + return nil, errors.New("Enter a valid positive number") + } + + return &CounterDown{InitialCount: initialCount, PauseDuration: pauseDuration}, nil +} + +func main() { + fmt.Println("Hello world") + + counterDown, err := NewCounterDown(10, 1) + + if err != nil { + panic(err) + } + + counterDown.Start() + +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/go/blackriper.go" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/go/blackriper.go" new file mode 100644 index 0000000000..712017d051 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/go/blackriper.go" @@ -0,0 +1,49 @@ +package main + +import ( + "fmt" + "time" +) + +// declarar tipos de datos y logica a utilizar + +type CounterDown interface { + ReadData() + StartCounterDown() +} + +type Down struct { + Number int + Seconds int +} + +// implementar metodos de la interface +func (d *Down) ReadData() { + for d.Number <= 0 || d.Seconds <= 0 { + fmt.Println("enter a number for the counter") + fmt.Scanf("%d", &d.Number) + + fmt.Println("enters a period of time to decrease") + fmt.Scanf("%d", &d.Seconds) + + if d.Number < 0 || d.Seconds < 0 { + fmt.Println("only positive numbers are allowed") + } + } + +} + +func (d *Down) StartCounterDown() { + fmt.Println(d.Number) + for d.Number > 0 { + time.Sleep(time.Duration(d.Seconds) * time.Second) + d.Number-- + fmt.Println(d.Number) + } +} + +func main() { + var counterdown CounterDown = &Down{} + counterdown.ReadData() + counterdown.StartCounterDown() +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/go/jassoncu.go" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/go/jassoncu.go" new file mode 100644 index 0000000000..7aa99a98dd --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/go/jassoncu.go" @@ -0,0 +1,23 @@ +package main + +import ( + "fmt" + "time" +) + +func countdown(start int, seconds int) { + for start > 0 { + fmt.Println(start) + time.Sleep(time.Duration(seconds) * time.Second) + start-- + } + + fmt.Println("¡Cuenta atrás finalizada!") +} + +func main() { + start := 10 + seconds := 1 + + countdown(start, seconds) +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/EspinoLeandroo.java" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/EspinoLeandroo.java" new file mode 100644 index 0000000000..57b1be5f34 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/EspinoLeandroo.java" @@ -0,0 +1,27 @@ +import java.util.Scanner; + +public class EspinoLeandroo { + + public static void main(String[] args) { + EspinoLeandroo espinoLeandroo = new EspinoLeandroo(); + + Scanner sc = new Scanner(System.in); + + System.out.println("¿Desde que numero iniciara la cuenta regresiva? "); + int start = sc.nextInt(); + System.out.println("¿Cuantos segundos seran de pausa entre cada numero? "); + int pause = sc.nextInt(); + + while (start >= 0) { + System.out.println(start--); + try { + Thread.sleep(pause * 1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + +} \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/Fhera.java" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/Fhera.java" new file mode 100644 index 0000000000..2b2d416fc3 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/Fhera.java" @@ -0,0 +1,25 @@ +import java.util.concurrent.TimeUnit; + +public class Fhera { + + public static void main(String[] args) { + countDown(5, 2); + } + + private static void countDown(Integer startNumber, Integer intervalSeconds) { + if (startNumber < 0 || intervalSeconds < 0) { + System.out.println("No se aceptan números negativos."); + } else { + while (startNumber != 0) { + System.out.println(startNumber); + try { + Thread.sleep(TimeUnit.SECONDS.toMillis(intervalSeconds)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + startNumber--; + } + System.out.println(startNumber); + } + } +} \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/GerardoVillla.java" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/GerardoVillla.java" new file mode 100644 index 0000000000..3f06b903e4 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/GerardoVillla.java" @@ -0,0 +1,20 @@ + +package retos; + +public class GerardoVillla { + public static void main(String[] args) { + countdown(12, 1); + countdown(3, 2); + } + + public static void countdown(int start, int duration){ + for (int i = start; i >= 0; i--){ + System.out.println("Countdown = " + i); + try{ + Thread.sleep(duration * 1000); + }catch(InterruptedException e){ + e.printStackTrace(); + } + } + } +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/Qv1ko.java" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/Qv1ko.java" new file mode 100644 index 0000000000..5d408d1c30 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/Qv1ko.java" @@ -0,0 +1,22 @@ +import java.util.concurrent.TimeUnit; + +public class Qv1ko { + + public static void main(String[] args) { + countdown(9, 3); + } + + private static void countdown(int startNumber, int waitingTime) { + if (startNumber >= 0) { + for (int i = startNumber; i >= 0; i--) { + System.out.println(i); + try { + TimeUnit.SECONDS.sleep((i != 0) ? waitingTime : 0); + } catch (InterruptedException exc) { + System.out.println("Waiting time has failed"); + } + } + } + } + +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/asjordi.java" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/asjordi.java" new file mode 100644 index 0000000000..9600fb7ef2 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/asjordi.java" @@ -0,0 +1,23 @@ +public class Countdown { + + public static void main(String[] args) { + execute(10, 6); + } + + public static void execute(int start, int seconds) { + if (start > 0 && seconds > 0){ + for (int i = start; i >= 0; i--) { + System.out.println(i); + if (i == 0) break; + try{ + Thread.sleep(seconds * 1000); + } catch (Exception e){ + System.out.println("There was an error: " + e.getMessage()); + } + } + } else{ + throw new RuntimeException("Los parámetros tienen que ser enteros positivos mayores a 0"); + } + } + +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/jesusWay69.java" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/jesusWay69.java" new file mode 100644 index 0000000000..6bda1fe745 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/jesusWay69.java" @@ -0,0 +1,38 @@ +package reto_27; + +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + * + * + * @author jesus + */ +public class jesusWay69 { + + public static void main(String[] args) { + + intervalo(5, 1); + } + + public static void intervalo(int cantidadnum, int segundos) { + for (int i = cantidadnum; i >= 0; i--) { + + System.out.println(i); + try { + + Thread.sleep(segundos * 1000); + + } catch (Exception e) { + System.out.println(e); + + } + + } + + } + +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/masdos.java" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/masdos.java" new file mode 100644 index 0000000000..520d6b77e9 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/java/masdos.java" @@ -0,0 +1,20 @@ +import java.time.LocalDateTime; + +public class masdos { + + public static void main(String[] args) { + countDown(10, 1); + } + + private static void countDown(int startNumber, int secondsBetweenNumbers) { + if (startNumber > 0 && secondsBetweenNumbers > 0) { + LocalDateTime timeValid = LocalDateTime.now().plusSeconds(secondsBetweenNumbers); + while (startNumber > 0) { + if (LocalDateTime.now().isAfter(timeValid)) { + System.out.println(--startNumber); + timeValid = timeValid.plusSeconds(secondsBetweenNumbers); + } + } + } + } +} \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/HectorIglesias.js" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/HectorIglesias.js" new file mode 100644 index 0000000000..3155913a82 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/HectorIglesias.js" @@ -0,0 +1,15 @@ +function cuenta_atras(numero, intervalo){ + let tiempo = intervalo*1000; + + console.log(numero) + + if(numero > 0){ + numero = numero - 1 + if(numero != 0){ + setTimeout(cuenta_atras, tiempo, numero, intervalo) + } + } + +} + +cuenta_atras(3,1); \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/LucasSantillan.js" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/LucasSantillan.js" new file mode 100644 index 0000000000..00dab0918a --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/LucasSantillan.js" @@ -0,0 +1,21 @@ +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. +*/ + +function theFinalCountdown(num, intervalo) { + console.log(num); + if (num == 0) { + return; + } else { + num = num - 1; + let inter = intervalo * 1000; + setTimeout(theFinalCountdown, inter, num, intervalo); + } +} + +theFinalCountdown(5, 1); diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/RodriJOk.js" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/RodriJOk.js" new file mode 100644 index 0000000000..756fd52246 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/RodriJOk.js" @@ -0,0 +1,26 @@ +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ + +function cuenta_atras(inicio, segundos){ + if(typeof(inicio) != "number" || typeof(segundos) != "number" || inicio < 0 || segundos < 0 || + Number.isInteger(inicio) == false || Number.isInteger(segundos) == false){ + console.log("Por favor, ingrese un número entero positivo"); + } + + setTimeout(() => { + console.log(inicio); + if(inicio > 0) cuenta_atras(inicio - 1, segundos); + }, segundos * 1000); +} + +console.log(cuenta_atras(10, 5)); +// console.log(cuenta_atras(10, 5)); +// console.log(cuenta_atras(-5, 10)); +// console.log(cuenta_atras(0, 10)); +// console.log(cuenta_atras(4.6, 5)); \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/cesar-ch.js" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/cesar-ch.js" new file mode 100644 index 0000000000..0f720b397c --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/cesar-ch.js" @@ -0,0 +1,23 @@ +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ + + +function countdown(number, seconds) { + let time = number; + let intervalId = setInterval(function () { + console.log(time); + time--; + if (time < 0) { + clearInterval(intervalId); + } + }, seconds * 1000); +} + + +console.log(countdown(10, 2)) diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/gaizkadvlp.js" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/gaizkadvlp.js" new file mode 100755 index 0000000000..23ef7cbddb --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/gaizkadvlp.js" @@ -0,0 +1,26 @@ +// Desde el movil usando vim +// Hay que ejecutar el fichero y pasarle dos argumentos, +// el primero, desde donde iniciamos la cuenta atrás; +// el segundo, el intervalo. Por ejemplo: +// node gaizkadvlp.js 5 3 +// Por defecto coge 3 y 1 + +const inicio = isNaN(+process.argv[2]) ? 3 : +process.argv[2] +const pausa = isNaN(+process.argv[3]) ? 1 : +process.argv[3] +const error = "\n\tError: sólo se admiten enteros positivos !=0 \n\t******"; + +function cuentaAtras(desde, intervalo){ + if (!Number.isInteger(desde) || !Number.isInteger(intervalo)) return console.log(error); + if (desde < 1 || intervalo < 1) return console.log(error); + + console.log(desde) + const delay = parseInt(intervalo)*1000; + const temp = setInterval(() => { + desde-- + console.log(desde) + if (desde <= 0) clearInterval(temp) + }, delay) +} + +cuentaAtras(inicio, pausa); + diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/marcode24.js" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/marcode24.js" new file mode 100644 index 0000000000..78e454b3a0 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/marcode24.js" @@ -0,0 +1,25 @@ +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ + +const countBack = (start, interval) => { + if (start <= 0 || interval <= 0 || !Number.isInteger(start) + || !Number.isInteger(interval)) { + return; + } + const counter = setInterval(() => { + console.log(start); + start--; + if (start <= 0) { + clearInterval(counter); + console.log('Termino!!!'); + } + }, interval); +}; + +// Visita mi repo en GitHub para ver y correr los tests de este código --> https://github.com/marcode24/weekly-challenges diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/nlarrea.js" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/nlarrea.js" new file mode 100644 index 0000000000..4e98f942f3 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/nlarrea.js" @@ -0,0 +1,31 @@ +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ + +function countDown(start, step=1) { + if ( + start < 0 || step < 0 || + !Number.isInteger(start) || !Number.isInteger(step) + ) { + throw new TypeError('The function only takes two positive integers as parameters!'); + } + + let count = start; + + console.log(count); + count--; + + if (count >= 0) { + setTimeout(() => { + countDown(count, step); + }, step * 1000) + } +} + + +countDown(5, 1); \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/othamae.js" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/othamae.js" new file mode 100644 index 0000000000..a1e2a45e73 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/othamae.js" @@ -0,0 +1,26 @@ +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ + +function countdown(number, seconds) { + if (!Number.isInteger(number) || !Number.isInteger(seconds) || number < 0 || seconds < 0) { + console.log('Only positive integers are accepted') + return + } + if (number >= 0) { + setTimeout(() => { + console.log(number) + if (number > 0) { + countdown(number-1, seconds) + } + }, seconds*1000) + } +} + + +countdown(5,3) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/pcelman.js" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/pcelman.js" new file mode 100644 index 0000000000..7713effe1f --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/pcelman.js" @@ -0,0 +1,19 @@ +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ + +function countBack(startingNumber, interval) { + let eachStep = startingNumber; + + while (eachStep >= 0) { + console.log(eachStep); + eachStep -= interval; + } + } + + countBack(20, 2); \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/test0n3.js" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/test0n3.js" new file mode 100644 index 0000000000..cf1eaac3a0 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/javascript/test0n3.js" @@ -0,0 +1,24 @@ +const startCountDown = (start, shift) => { + if (start < 1 || shift < 1) { + console.log("Invalid input"); + return 0; + } + + let currentTime = Math.floor(Date.now() / 1000); + let control = currentTime; + + while (start >= 0) { + control = Math.floor(Date.now() / 1000); + if (control == currentTime) { + console.log(start); + currentTime += shift; + start -= 1; + } + } +}; + +startCountDown(5, 3); +startCountDown(5, -1); +startCountDown(-4, 3); +startCountDown(0, 3); +startCountDown(3, 10); diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/kotlin/Mariopolonia0.kt" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/kotlin/Mariopolonia0.kt" new file mode 100644 index 0000000000..2a3248c98b --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/kotlin/Mariopolonia0.kt" @@ -0,0 +1,26 @@ +package EjercicioKotlin.Mouredev + +fun main() { + cuenta_atras(5,1000) + cuenta_atras(3,5000) +} + +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ + +fun cuenta_atras(desde:Int , tiempo:Long){ + println("\nStart\n") + + for (it in desde.downTo(0)){ + println("$it") + Thread.sleep(tiempo) + } + + println("\nEnd\n") +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/kotlin/marchdz.kt" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/kotlin/marchdz.kt" new file mode 100644 index 0000000000..a1586e7cb2 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/kotlin/marchdz.kt" @@ -0,0 +1,13 @@ +fun countdown(seconds: Int, delay: Int) { + if (seconds >= 0 && delay >= 0) { + print(seconds) + for (number in seconds - 1 downTo 0) { + Thread.sleep((delay * 1000).toLong()) + print(", $number") + } + } else println("Sólo se aceptan números enteros positivos") +} + +fun main() { + countdown(10, 1) +} \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/kotlin/pisanowp.kt" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/kotlin/pisanowp.kt" new file mode 100644 index 0000000000..69d422ef0b --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/kotlin/pisanowp.kt" @@ -0,0 +1,60 @@ +fun main() { + + /* + * Reto #27 03/07/2023 CUENTA ATRÁS + * + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + * + */ + + val start = pideNumeroPositivo( "Valor inicial") + val interval = pideNumeroPositivo( "Intervalo en segundos") + + initCountDown(start, interval) + +} + +fun initCountDown(start:Int, interval:Int) { + println("Inicio cuenta atrás ...") + + (start downTo 0).forEach { + print("\r${it}") + Thread.sleep((interval*1000).toLong()) + + } + println() + println("Fin") + +} + + + +fun pideNumeroPositivo( etiqueta : String): Int { + var numero: Int? = null + var valido = false + + while (!valido) { + print("Introduce $etiqueta >") + val input = readLine() + + try { + numero = input?.toInt() + if (numero != null) { + if (numero > 0){ + valido = true + } else { + println("Entrada inválida. Debes ingresar un número entero positivo.") + } + } + + } catch (e: NumberFormatException) { + println("Entrada inválida. Debes ingresar un número entero positivo.") + } + } + return numero!! +} \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/AnzurezDev.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/AnzurezDev.py" new file mode 100644 index 0000000000..0239c61f82 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/AnzurezDev.py" @@ -0,0 +1,11 @@ +import time + +def cuenta_regresiva(comienzo: int, segundos:int): + if isinstance(comienzo, int)>=0 and isinstance(segundos, int)>=0 : + for i in range(comienzo, -1, -1): + print(i) + if i == 0 : + break + time.sleep(segundos) + +cuenta_regresiva(5, 2) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/DevKaliper.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/DevKaliper.py" new file mode 100644 index 0000000000..55f072dfd0 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/DevKaliper.py" @@ -0,0 +1,22 @@ + + +#This code makes a reverse count. The user can choose the number to begin and the seconds to wait between each number. + +from time import sleep + +number_to_count = input("Give me the number wich you want to begin: ") +seconds_to_wait = input("Give the seconds that you want to wait between each number: ") + +def reverse_Count(number, seconds): + cont=number + + if number < 0: + return print("The number must be positive") + + for x in range(number+1): ## plus 1 in order to show 0 at last position + print(cont) + sleep(seconds) + cont=cont-1 + +reverse_Count(number_to_count, seconds_to_wait) + diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/EspinoLeandroo.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/EspinoLeandroo.py" new file mode 100644 index 0000000000..54f8199eda --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/EspinoLeandroo.py" @@ -0,0 +1,9 @@ +import time + +start = int(input("¿Desde qué número iniciará la cuenta regresiva? ")) +pause = int(input("¿Cuántos segundos serán de pausa entre cada número? ")) + +while start >= 0: + print(start) + start -= 1 + time.sleep(pause) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/Hugovrc.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/Hugovrc.py" new file mode 100644 index 0000000000..cf0f989fd2 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/Hugovrc.py" @@ -0,0 +1,19 @@ +import time + +def cuenta_atras(inicio: int, segundos: int): + contador = 0 + try: + if segundos < 0 or inicio < 0 : + print("Solo se aceptan Numeros Enteros Positivos") + else: + while inicio >= 0: + contador = inicio + print(contador) + inicio -= 1 + if contador == 0: + break + time.sleep(segundos) + except: + print("Solo se aceptan Numeros Enteros Positivos") + +cuenta_atras(5,3) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/JoaquinMateosBarroso.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/JoaquinMateosBarroso.py" new file mode 100644 index 0000000000..86ed8c0c36 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/JoaquinMateosBarroso.py" @@ -0,0 +1,18 @@ +import time +import threading + +def countdown(init: int, space: int) -> None: + """Crea una función que reciba dos parámetros para crear una cuenta atrás. + - El primero, representa el número en el que comienza la cuenta. + - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + - Sólo se aceptan números enteros positivos. + - El programa finaliza al llegar a cero. + - Debes imprimir cada número de la cuenta atrás.""" + for i in range(init, -1, -space): + print(i) + time.sleep(space) + + + +if __name__ == "__main__": + threading.Thread(target=countdown, args=(10, 1)).start() \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/KevinED11.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/KevinED11.py" new file mode 100644 index 0000000000..92e59ed810 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/KevinED11.py" @@ -0,0 +1,34 @@ +import time + + +class NegativeNumberError(Exception): + def __init__(self, message: str) -> None: + super().__init__(message) + + +def countdown(initial_count: int = 10, pause_duration: int = 1) -> None: + if not isinstance(initial_count, int) or not isinstance(pause_duration, int): + raise TypeError("Only integers numbers are allowed") + + if initial_count <= 0 or pause_duration <= 0: + raise NegativeNumberError("Negative numbers are not allowed") + + while initial_count >= 0: + print(initial_count) + if initial_count == 0: + break + + initial_count -= 1 + + time.sleep(pause_duration) + + +def main() -> None: + try: + countdown(initial_count=10, pause_duration=2) + except (NegativeNumberError, TypeError) as e: + print(e) + + +if __name__ == "__main__": + main() diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/Lemito66.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/Lemito66.py" new file mode 100644 index 0000000000..c134396c8a --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/Lemito66.py" @@ -0,0 +1,25 @@ +""" + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. +""" + +import time + +def count_down(start: int, seconds: int): + numbers = [] + if isinstance(start, int) and isinstance(seconds, int) and start > 0 and seconds > 0: + for i in range(start, 0, -1): + numbers.append(i) + return numbers + else: + raise Exception("Los parámetros tienen que ser enteros positivos") + +print("Cuenta atrás") + +for number in count_down(10, 1): + print(number) + time.sleep(1) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/Rusian69.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/Rusian69.py" new file mode 100644 index 0000000000..e3cb59a773 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/Rusian69.py" @@ -0,0 +1,26 @@ +""" +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ +""" +import time as t + +def regresive_count (number: int, time: int): + try: + if isinstance(number, int) > 0 or isinstance(time, int) > 0: + while number > -1: + t.sleep(time) + print(number) + number -= 1 + if number < 0: + print("funcion exitosa") + except: + print("Uno de los valores no es valido\nReinicie la funcion con valores enteros") + +if __name__=="__main__": + regresive_count(12,4) diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/ShinMugenNoKabe.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/ShinMugenNoKabe.py" new file mode 100644 index 0000000000..d25d67c405 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/ShinMugenNoKabe.py" @@ -0,0 +1,20 @@ +import time + + +def countdown(start: int, seconds: int): + if start < 0 or seconds < 0: + raise ValueError("Introduce un número válido") + + for i in range(start, -1, -1): + print(i) + + if i != 0: + time.sleep(seconds) + + +if __name__ == "__main__": + countdown(10, 1) + print("----------") + countdown(7, 3) + print("----------") + countdown(20, 0) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/alberba.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/alberba.py" new file mode 100644 index 0000000000..ae6880b103 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/alberba.py" @@ -0,0 +1,24 @@ +import time + +def temporizador(numInicio, intervalo = 1): + # Estos loops no finalizarán hasta que el usuario introduzca unos valores correctos + while numInicio <= 0: + numInicio = int(input("Error al introducir el número con el que comienza la cuenta.\n Debes introducir un número mayor a 0: ")) + while intervalo <= 0: + intervalo = int(input("Error al introducir el intervalo de tiempo.\n Debes introducir un número mayor a 0: ")) + + # Bucle hasta que el temporizador llegue a 0 + while numInicio > 0: + print(numInicio) + numInicio -= 1 + time.sleep(intervalo) + +# Recolección de datos +try: + numInicio = int(input("Introduce el número de inicio: ")) + intervalo = int(input("Introduce el intervalo del temporizador: ")) +except ValueError: + print("Error. Solo se puede escribir un número") + +# Llamada a la función +temporizador(numInicio, intervalo) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/albertovf.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/albertovf.py" new file mode 100644 index 0000000000..c2ffe81f1c --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/albertovf.py" @@ -0,0 +1,12 @@ +import time + +def reto(inicio:int,tiempo:int): + + if (inicio <= 0 or tiempo <= 0): + return None + + for i in range(inicio,-1,-1): + print(i) + time.sleep(tiempo) + +reto(5,2) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/dotero-dev.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/dotero-dev.py" new file mode 100644 index 0000000000..a80944c0ff --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/dotero-dev.py" @@ -0,0 +1,15 @@ +import time +parametro1 = int(input("")) +parametro2 = int(input("")) +while True: + if not parametro1 > parametro2: + parametro1 = int(input("")) + parametro2 = int(input("")) + else: + break +cuenta = parametro1 +for i in range(parametro1): + print(cuenta) + time.sleep(parametro2) + cuenta-=1 +print(cuenta) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/drifterDev.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/drifterDev.py" new file mode 100644 index 0000000000..72528c4a4f --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/drifterDev.py" @@ -0,0 +1,19 @@ +import time + + +def main(begin, steps): + print(begin) + for i in range(begin - 1, 0, -1): + time.sleep(steps) + print(i) + + +if __name__ == "__main__": + begin = int( + input("Ingrese el número desde el cual comenzara la cuenta regresiva: ") + ) + steps = int(input("Ingrese el numero de segundos a esperar en cada paso: ")) + if begin > 0 and steps >= 0: + main(begin, steps) + else: + print("Entradas invalidas") diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/gonsomito.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/gonsomito.py" new file mode 100644 index 0000000000..08fc956c41 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/gonsomito.py" @@ -0,0 +1,38 @@ +""" + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. +""" +# Importamos la librería "time" para controlar las pausas de intervalos +import time + +# la función "lapso" solicita al usuario el número desde el cual empezar a contar. Controlamos que solo salgan enteros positivos +def lapso(): + while True: + cont_lapso = input("Cuenta atrás desde: ") + if cont_lapso.isdigit(): + return int(cont_lapso) + else: + print("Vuleve a introducir desde que número empezar\n\n") + +# la función "segundero" solicita al usuario el tiempo de espera entre cada número. Controlamos que solo salgan enteros positivos +def segundero(): + while True: + cont_segundos = input("Tiempo de espera entre : ") + if cont_segundos.isdigit(): + return int(cont_segundos) + else: + print("Vuleve a introducir tiempo de espera\n\n") + +# la función "the_final_countdown" realiza la cuenta regresiva con los valores ingresados por el usuario. +def the_final_countdown(num_desde, num_seg): + print("\n\n") + while num_desde >= 0: + print(num_desde) + time.sleep(num_seg) + num_desde = num_desde - 1 + +the_final_countdown(lapso(), segundero()) diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/ingjavierpinilla.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/ingjavierpinilla.py" new file mode 100644 index 0000000000..360f108ebd --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/ingjavierpinilla.py" @@ -0,0 +1,24 @@ +import time + + +def cuenta_atras(inicio, intervalo): + # Verificar que los parámetros sean enteros positivos + if ( + not isinstance(inicio, int) + or not isinstance(intervalo, int) + or inicio <= 0 + or intervalo <= 0 + ): + print("Error: Los parámetros deben ser enteros positivos.") + return + + # Ciclo de cuenta regresiva utilizando un for + for i in range(inicio, 0, -1): + print(i) # Imprimir el número actual + time.sleep(intervalo) # Esperar el intervalo de tiempo especificado en segundos + + print("¡Cuenta regresiva finalizada!") + + +if __name__ == "__main__": + cuenta_atras(10, 1) diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/jaliagag.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/jaliagag.py" new file mode 100644 index 0000000000..7ba81d98ee --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/jaliagag.py" @@ -0,0 +1,28 @@ +#/* +# * Crea una función que reciba dos parámetros para crear una cuenta atrás. +# * - El primero, representa el número en el que comienza la cuenta. +# * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. +# * - Sólo se aceptan números enteros positivos. +# * - El programa finaliza al llegar a cero. +# * - Debes imprimir cada número de la cuenta atrás. +# */ + +def reg(orig, secs): + if check(orig,secs): + print(orig) + while orig > 0: + print(orig - secs) + orig -= secs + else: + print("solo números positivos please") + +def check(uno, dos): + if uno < 0 or dos < 0: + return False + else: + return True + +a = int(input("comenzamos en? ")) +b = int(input("cada cuanto? ")) + +reg(a,b) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/jcdm60.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/jcdm60.py" new file mode 100644 index 0000000000..64d2caeee0 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/jcdm60.py" @@ -0,0 +1,44 @@ +# Reto #27: Cuenta atrás +#### Dificultad: Media | Publicación: 03/07/23 | Corrección: 10/07/23 + +## Enunciado + + +# +# Crea una función que reciba dos parámetros para crear una cuenta atrás. +# - El primero, representa el número en el que comienza la cuenta. +# - El segundo, los segundos que tienen que transcurrir entre cada cuenta. +# - Sólo se aceptan números enteros positivos. +# - El programa finaliza al llegar a cero. +# - Debes imprimir cada número de la cuenta atrás. +# + +import time + +class CuentaAtras: + def __init__(self, numero_inicial, segundos_entre_cuentas): + + if not isinstance(numero_inicial, int) or not isinstance(segundos_entre_cuentas, int): + raise ValueError("Ambos parámetros deben ser números enteros.") + if numero_inicial <= 0 or segundos_entre_cuentas <= 0: + raise ValueError("Ambos parámetros deben ser enteros positivos.") + if isinstance(numero_inicial, str) or isinstance(segundos_entre_cuentas, str): + raise ValueError("Ambos parámetros no pueden ser cadenas de caracteres.") + + + + self.numero_inicial = numero_inicial + self.segundos_entre_cuentas = segundos_entre_cuentas + + def iniciar_cuenta_atras(self): + + while self.numero_inicial > 0: + print(self.numero_inicial) + time.sleep(self.segundos_entre_cuentas) + self.numero_inicial -= 1 + + print("Cuenta atrás finalizada...") + +if __name__ == "__main__": + cuenta = CuentaAtras(5, 3) + cuenta.iniciar_cuenta_atras() \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/jpirulo.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/jpirulo.py" new file mode 100644 index 0000000000..bcaac3d131 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/jpirulo.py" @@ -0,0 +1,26 @@ +import time +from colorama import init, Fore +import random + +init() # Inicializar Colorama + +class CuentaAtras: + def __init__(self, inicio, segundos): + self.inicio = inicio + self.segundos = segundos + + def cuenta_regresiva(self): + for numero in range(self.inicio, 0, -1): + color = random.choice([Fore.RED, Fore.GREEN, Fore.BLUE, Fore.YELLOW, Fore.MAGENTA]) # Colores aleatorios + print(color + str(numero) + Fore.RESET) + time.sleep(self.segundos) + +if __name__ == '__main__': + inicio = int(input("Ingresa el número de inicio: ")) + segundos = int(input("Ingresa los segundos entre cada cuenta: ")) + + if inicio > 0 and segundos > 0: + cuenta = CuentaAtras(inicio, segundos) + cuenta.cuenta_regresiva() + else: + print("Error: Solo se aceptan números enteros positivos.") diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/juanppdev.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/juanppdev.py" new file mode 100644 index 0000000000..ddf465705b --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/juanppdev.py" @@ -0,0 +1,21 @@ +import time + +def cuenta_atras(inicio, segundos): + if not isinstance(inicio, int) or not isinstance(segundos, int): + raise ValueError("Ambos parametros deben ser numeros enteros") + + if inicio <= 0 or segundos <= 0: + raise ValueError("Ambos parametros deben ser numeros enteros positivos") + + while inicio > 0: + print(inicio) + time.sleep(segundos) + inicio -= 1 + + +try: + inicio = int(input("ingrese el numero incial de la cuenta atras: ")) + intervalo = int(input("Ingrese los segundos entre cada cuenta: ")) + cuenta_atras(inicio, intervalo) +except ValueError as e: + print("Error: ", e) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/klyone.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/klyone.py" new file mode 100644 index 0000000000..ca84efb36d --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/klyone.py" @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +import time + +class Countdown: + def __init__(self, init_value, interval_in_secs): + if init_value <= 0 or interval_in_secs <= 0: + raise Exception() + + self.init_value = init_value + self.interval_in_secs = interval_in_secs + + def start(self): + self.current_value = self.init_value + + while self.current_value > 0: + print(self.current_value) + time.sleep(self.interval_in_secs) + self.current_value = self.current_value - 1 + print("Countdown finished!") + +if __name__ == "__main__": + counter = Countdown(10, 1) + counter.start() + + counter = Countdown(100, 2) + counter.start() diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/lozada07.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/lozada07.py" new file mode 100644 index 0000000000..ff4b922844 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/lozada07.py" @@ -0,0 +1,30 @@ +import time + +# Reto #27: Cuenta atrás +#### Dificultad: Media | Publicación: 03/07/23 | Corrección: 10/07/23 + +## Enunciado + +""" +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ +""" +#### Tienes toda la información extendida sobre los retos de programación semanales en **[retosdeprogramacion.com/semanales2023](https://retosdeprogramacion.com/semanales2023)**. + + +def cuenta_atras(numero, segundos): + while numero >= 0: + print(numero) + time.sleep(segundos) + numero -= 1 + + +if __name__ == "__main__": + cuenta_atras(10, 3) + diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/majinka10.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/majinka10.py" new file mode 100644 index 0000000000..448d186544 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/majinka10.py" @@ -0,0 +1,13 @@ +import time + +def cuenta_atras(inicio:int,intervalo:int): + while inicio: + m, s = divmod(inicio, 60) + min_sec_format = '{:02d}:{:02d}'.format(m,s) + print(min_sec_format) + time.sleep(intervalo) + inicio-=1 + print('Cuenta atrás finalizada!') + +cuenta_atras(10,1) +cuenta_atras(5,2) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/maurighar.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/maurighar.py" new file mode 100644 index 0000000000..9d4336217e --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/maurighar.py" @@ -0,0 +1,17 @@ +from time import sleep + + +def countdown(init:int, delay=1): + if init < 0: + print('El numero tiene que ser positivo') + + for number in range(init, -1, -1): + sleep(delay) + print(number) + + +if __name__ == "__main__": + countdown(-1) + countdown(3) + countdown(3,2) + diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/mouredev.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/mouredev.py" new file mode 100644 index 0000000000..b7ee8fa1d8 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/mouredev.py" @@ -0,0 +1,19 @@ +import time +import threading + +def countdown(start: int, seconds: int): + + if type(start) == int and type(seconds) == int and start > 0 and seconds > 0: + for number in range(start, -1, -1): + print(number) + time.sleep(seconds) + else: + raise Exception("Los parámetros tienen que ser enteros positivos") + +# Asíncrono +threading.Thread(target=countdown, args=(10, 1)).start() + +# Síncrono +# countdown(10, 1) + +print("Boom!!! 💥") \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/nlarrea.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/nlarrea.py" new file mode 100644 index 0000000000..f7088809fd --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/nlarrea.py" @@ -0,0 +1,27 @@ +""" + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. +""" + +import time + +def count_down(start, step=1): + if start < 0 or step < 0 or type(start) is not int or type(step) is not int: + print('Error: The function only takes two positive integers as parameters!') + return + + count = start + + print(count) + count -= 1 + + if count >= 0: + time.sleep(step) + count_down(count, step) + + +count_down(5, 1) \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/pyramsd.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/pyramsd.py" new file mode 100644 index 0000000000..ab8f48ff20 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/pyramsd.py" @@ -0,0 +1,28 @@ +import time +from colorama import Fore + +def countDown(n:int, s:int): + + while True: + + if n < 0 : + n = int(input("\nIngrese numero POSITIVO de conteo atras!: ")) + elif s < 0: + s = int(input("\nIngrese numero POSITIVO de segundos a transcurrir!: ")) + + else: + #print(Fore.GREEN + f"{n}", end="\r") + print(Fore.GREEN + f"{n}") + time.sleep(s) + n -= 1 + + if n == 0: + print(Fore.RED + f"{n}") + break + + print("Tiempo acabado!!!" + Fore.RESET) + +n = int(input("Ingrese numero de conteo atras: ")) +s = int(input("Ingrese numero de segundos a transcurrir: ")) + +countDown(n, s) diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/tauron85.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/tauron85.py" new file mode 100644 index 0000000000..4a65d30ad1 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/tauron85.py" @@ -0,0 +1,23 @@ +""" + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. +""" + +import time + +def countdown(total_time, split_time): + if total_time <= 0 or split_time <= 0: + raise ValueError("Los parámetros de entrada deben ser positivos") + while total_time > 0: + print(total_time) + time.sleep(split_time) + total_time -= split_time + print("¡La cuenta ha llegado a 0!") + + +countdown(int(input("Introduce el tiempo total de la cuenta atrás: ")), int(input("Introduce los segundos que tienen que transcurrir entre cada cuenta: "))) + \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/tecfer.py" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/tecfer.py" new file mode 100644 index 0000000000..2bae0ee926 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/python/tecfer.py" @@ -0,0 +1,31 @@ +''' +Crea una función que reciba dos parámetros para crear una cuenta atrás. +- El primero, representa el número en el que comienza la cuenta. +- El segundo, los segundos que tienen que transcurrir entre cada cuenta. +- Sólo se aceptan números enteros positivos. +- El programa finaliza al llegar a cero. +- Debes imprimir cada número de la cuenta atrás. +''' +import threading +import time + +def count_down_pause(start:int, pause:int) -> None: + start = max(start, 0) + pause = max(pause, 0) + for x in range(start,-1,-1): + print(x) + if x==0: + return + time.sleep(pause) + + +def main() -> None: + t = threading.Thread(target=count_down_pause, args=(5, 1)) + t.start() + + t.join() + print("Finalizado") + + +if __name__=='__main__': + main() \ No newline at end of file diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/ruby/test0n3.rb" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/ruby/test0n3.rb" new file mode 100644 index 0000000000..466d8fdefd --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/ruby/test0n3.rb" @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +# Class for counting down +class CountDown + attr_reader :start, :shift + + def initialize(start, shift) + @start_point = start + @shift = shift + end + + def start_countdown + if @start_point < 1 || @shift < 1 + puts 'Invalid Input' + return 0 + end + + # final_time = Time.now.to_i + (@start_point * @shift) + # current_time = Time.now.to_i + # until current_time > final_time + # next unless Time.now.to_i == current_time + + # puts @start_point + # @start_point -= 1 + # current_time += shift + # end + + while @start_point >= 0 + puts @start_point + sleep @shift unless @start_point.zero? + @start_point -= 1 + end + end +end + +CountDown.new(5, 3).start_countdown +CountDown.new(5, -1).start_countdown +CountDown.new(-4, 3).start_countdown +CountDown.new(0, 3).start_countdown +CountDown.new(3, 10).start_countdown diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/rust/CharlyEstudio.rs" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/rust/CharlyEstudio.rs" new file mode 100644 index 0000000000..ee90cfb4c5 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/rust/CharlyEstudio.rs" @@ -0,0 +1,8 @@ +pub fn decrementar(comienza: u8, segundos: u64) { + for i in (0..=comienza).rev() { + println!("{:?}", i); + if i != 0 { + thread::sleep(time::Duration::from_secs(segundos)); + } + } +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/rust/ingjavierpinilla.rs" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/rust/ingjavierpinilla.rs" new file mode 100644 index 0000000000..beba27b1f1 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/rust/ingjavierpinilla.rs" @@ -0,0 +1,22 @@ +use std::thread; +use std::time::Duration; + +fn cuenta_atras(inicio: u32, intervalo: u64) { + // Verificar que los parámetros sean enteros positivos + if inicio == 0 || intervalo == 0 { + println!("Error: Los parámetros deben ser enteros positivos."); + return; + } + + // Ciclo de cuenta regresiva utilizando un for y Range + for i in (0..inicio).rev() { + println!("{}", i); // Imprimir el número actual + thread::sleep(Duration::from_secs(intervalo)); // Esperar el intervalo de tiempo especificado en segundos + } + + println!("¡Cuenta regresiva finalizada!"); +} + +fn main() { + cuenta_atras(10, 1); +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/rust/vbayarri.rs" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/rust/vbayarri.rs" new file mode 100644 index 0000000000..43289dc625 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/rust/vbayarri.rs" @@ -0,0 +1,41 @@ +/* + * Crea una función que reciba dos parámetros para crear una cuenta atrás. + * - El primero, representa el número en el que comienza la cuenta. + * - El segundo, los segundos que tienen que transcurrir entre cada cuenta. + * - Sólo se aceptan números enteros positivos. + * - El programa finaliza al llegar a cero. + * - Debes imprimir cada número de la cuenta atrás. + */ + + // Importar la función flush para asegurar que se muestra el número sin esperar + // a que se llene el buffer de salida + use std::io::Write; + + // Función que recibe dos parámetros para crear una cuenta atrás + fn countdown(start: u32, seconds: u32) { + // Validar que los parámetros sean números enteros positivos + if start > 0 && seconds > 0 { + // Iniciar la cuenta atrás y limpiar la pantalla + print!("{}[2J", 27 as char); + + // Recorrer el rango de números en orden descendente + for i in (1..=start).rev() { + // Imprimir el número y asegurar que se muestra. + // El bloqueo del thread impide que se muestre el número en caso contrario + print!("{}..", i); + std::io::stdout().flush().unwrap(); + // Esperar los segundos indicados + std::thread::sleep(std::time::Duration::from_secs(seconds as u64)); + } + // Imprimir el mensaje final + println!("💥") + } else { + // Imprimir el mensaje de error + println!("Los parámetros deben ser números enteros positivos"); + } + } + +fn main() { + // Iniciar la cuenta atrás + countdown(10, 1); +} diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/swift/allbertoMD.swift" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/swift/allbertoMD.swift" new file mode 100644 index 0000000000..9ae66e74d5 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/swift/allbertoMD.swift" @@ -0,0 +1,18 @@ + +import Foundation + +func countdown(from: UInt32, withIntervals intervals: UInt32) { + + for number in (0...from).reversed() { + print(number) + if number == 0 { + break + } + sleep(intervals) + } + print("El programa terminó") +} + +countdown(from: 3, withIntervals: 4) + + diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/swift/kontroldev.swift" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/swift/kontroldev.swift" new file mode 100644 index 0000000000..194664b3eb --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/swift/kontroldev.swift" @@ -0,0 +1,21 @@ +import Foundation + +func cuentaAtras(inicio: Int, intervalo: Int) { + guard inicio >= 0 && intervalo >= 0 else { + print("Error: Solo se aceptan números enteros positivos.") + return + } + + var contador = inicio + + while contador > 0 { + print(contador) + contador -= 1 + sleep(UInt32(intervalo)) + } + + print("¡Cuenta atrás finalizada!") +} + + +cuentaAtras(inicio: 15, intervalo: 2) diff --git "a/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/typescript/AnzurezDev.ts" "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/typescript/AnzurezDev.ts" new file mode 100644 index 0000000000..aab08eb490 --- /dev/null +++ "b/Retos/Reto #27 - CUENTA ATR\303\201S [Media]/typescript/AnzurezDev.ts" @@ -0,0 +1,13 @@ +const sleep = (seconds:number) => new Promise(resolve => setTimeout(resolve, seconds*1000)); + +async function cuenta_regresiva(inicio:number, segundos:number) { + if (inicio>=0 && segundos>=0) { + for (let index=inicio; index>=0; index--) { + console.log(index); + if (index==0) return; + await sleep(segundos); + } + } +} + +cuenta_regresiva(10, 1); \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/c#/JonAFernan.cs" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/c#/JonAFernan.cs" new file mode 100644 index 0000000000..7ee0693494 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/c#/JonAFernan.cs" @@ -0,0 +1,32 @@ +using System.Text.RegularExpressions; + +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + +namespace reto; +class Program +{ + static void Main(string[] args) + { + Console.WriteLine(IsMathematicalExpressions("5 + 6 / 7 - 4"));//true + Console.WriteLine(IsMathematicalExpressions("3 + 4 * -2 * 8 % 10 - -4.6589 + 25 * 7.66666"));// true + Console.WriteLine(IsMathematicalExpressions("5 a 6.9"));// false + + } + + static bool IsMathematicalExpressions(string input) + { + return Regex.IsMatch(input,@"^\A(-?\d*\.{0,1}\d+)(\s[+,\-,*,/,%]\s\-?\d*\.{0,1}\d+)+$"); + } +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/c++/ubbeck.cpp" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/c++/ubbeck.cpp" new file mode 100644 index 0000000000..37cc14154f --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/c++/ubbeck.cpp" @@ -0,0 +1,53 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + +#include +#include +#include +#include + + +bool mathExpression(std::string expression); +bool isOperator (char c); + +int main(){ + + std::cout << mathExpression("5 + 6 / 7 - 4") << std::endl; //Expected 1 + std::cout << mathExpression("5 a 6") << std::endl; //Expected 0 + std::cout << mathExpression("5 * 6 //") << std::endl; // 0 + std::cout << mathExpression("5+ 6 - 3+1 *7 /1") << std::endl; // 1 + std::cout << mathExpression("+ 6 - 3+1 *7") << std::endl; // 0 + + return 0; +} + +bool mathExpression(std::string expression){ + + expression.erase(remove(expression.begin(), expression.end(), ' '), expression.end()); + + if(!isdigit(expression[0]) || !isdigit(expression[expression.length() - 1])){ + return false; + } + + for(int i = 2, j = 1; i < expression.length(); i += 2, j += 2){ + if(!isdigit(expression[i]) || !isOperator(expression[j])){ + return false; + } + } + return true; +} + +bool isOperator (char c){ + return c == '+' || c == '-' || c == '*' || c == '/' || c == '%'; +} \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/c/sebatimur.c" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/c/sebatimur.c" new file mode 100644 index 0000000000..a9ab1bb952 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/c/sebatimur.c" @@ -0,0 +1,64 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + +#include + +int main() +{ + double num1, num2, calculo; + char operador; + + printf("Ingrese un numero para realizar un calculo matematico: "); + scanf("%lf", &num1); + + printf("Ingrese otro numero para realizar el calculo matematico: "); + scanf("%lf", &num2); + + printf("Ingrese un operador (+, -, *, /): "); + scanf(" %c", &operador); + + if (operador == '+') + { + calculo = num1 + num2; + printf("El resultado de la suma es: %.2lf\n", calculo); + } + else if (operador == '-') + { + calculo = num1 - num2; + printf("El resultado de la resta es: %.2lf\n", calculo); + } + else if (operador == '*') + { + calculo = num1 * num2; + printf("El resultado de la multiplicacion es: %.2lf\n", calculo); + } + else if (operador == '/') + { + if (num2 != 0) + { + calculo = num1 / num2; + printf("El resultado de la division es: %.2lf\n", calculo); + } + else + { + printf("No se puede dividir por cero.\n"); + } + } + else + { + printf("Operador invalido.\n"); + } + + return 0; +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/dart/Infinius00.dart" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/dart/Infinius00.dart" new file mode 100644 index 0000000000..053b076790 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/dart/Infinius00.dart" @@ -0,0 +1,61 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + +import 'dart:io'; + +void main() { + // función que evalúa si el valor es uno de los operadores posibles + bool isOperator(String valor) { + if ((valor == "+") || + (valor == "-") || + (valor == "*") || + (valor == "/") || + (valor == "%")) { + return true; + } else { + return false; + } + } + + /* función que evalúa si la expresión es correcta recorriendo el arreglo + considera si es el valor es un número + o bien si es un operador y está precedido por un número + */ + + bool expresionCorrecta(List expresion) { + for (int i = 0; i < expresion.length; i++) { + if ((expresion[i] is num) || + (isOperator(expresion[i]) & (expresion[i--] is num))) { + continue; + } else { + return false; + } + } + return true; + } + + // se lee la entrada por teclado de una expresión + print("Ingrese la expresion matemática a evaluar"); + var expresionConEspacios = stdin.readLineSync(); + + // se eliminan los espacios de la expresión + String expresionSinEspacios = expresionConEspacios!.replaceAll(" ", ""); + + // se divide la expresión por caracteres dentro de un arreglo y se la evalúa + if (expresionCorrecta(expresionSinEspacios.split(""))) { + print("La expresión matemática ingesada es correcta"); + } else { + print("La expresión matemática ingesada es incorrecta"); + } +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/ejercicio.md" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/ejercicio.md" new file mode 100644 index 0000000000..711125dd21 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/ejercicio.md" @@ -0,0 +1,25 @@ +# Reto #28: Expresión matemática +#### Dificultad: Media | Publicación: 10/07/23 | Corrección: 17/07/23 + +## Enunciado + +``` +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ +``` +#### Tienes toda la información extendida sobre los retos de programación semanales en **[retosdeprogramacion.com/semanales2023](https://retosdeprogramacion.com/semanales2023)**. + +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/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/go/KevinED11.go" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/go/KevinED11.go" new file mode 100644 index 0000000000..aa4818b23f --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/go/KevinED11.go" @@ -0,0 +1,53 @@ +package main + +import ( + "fmt" + "strconv" +) + +func isNumber(character string) bool { + if _, err := strconv.Atoi(character); err != nil { + return false + } + return true +} + +func isOperator(character string) bool { + validOperators := []string{"-", "+", "*", "/", "%"} + + for _, op := range validOperators { + if op == character { + return true + } + } + return false + +} + +func validateExpression(expression string, isExpression *bool) { + whiteSpace := " " + for _, c := range expression { + character := string(c) + if isNumber(character) || isOperator(character) || character == whiteSpace { + *isExpression = true + continue + } + + *isExpression = false + break + } +} + +func main() { + expression1 := "5 + 6 / 7 - 4" + expression2 := "5 a 6" + + var isExpression1, isExpression2 bool + + validateExpression(expression1, &isExpression1) + validateExpression(expression2, &isExpression2) + + fmt.Printf("The expression1 '%s' is valid - %t\n", expression1, isExpression1) + fmt.Printf("The expression2 '%s' is not valid - %t\n", expression2, isExpression2) + +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/go/blackriper.go" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/go/blackriper.go" new file mode 100644 index 0000000000..cf36aa2a63 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/go/blackriper.go" @@ -0,0 +1,51 @@ +package main + +import ( + "fmt" + "strconv" +) + +// funcion para comprobar si es un numero +func IsNumber(n string) bool { + _, err := strconv.Atoi(n) + if err != nil { + return false + } + return true +} + +// funcion para validar si tiene algun operador +func IsOperator(n string) bool { + validOperators := []string{"+", "-", "*", "/", "%"} + for _, exp := range validOperators { + if n == exp { + return true + } + } + return false +} + +// funcion para validar la expresion +func ValidExpression(express string, isexpr *bool) { + for _, cr := range express { + if IsNumber(string(cr)) || IsOperator(string(cr)) || string(cr) == " " { + *isexpr = true + } else { + *isexpr = false + break + } + } +} + +func main() { + express := "5 + 6 / 7 * 8" + var isexpr bool + + ValidExpression(express, &isexpr) + + if isexpr { + fmt.Printf("the expression %v is a math expression \n", express) + } else { + fmt.Printf("the expression %v is not math expression \n", express) + } +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/go/jassoncu.go" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/go/jassoncu.go" new file mode 100644 index 0000000000..6c18718b12 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/go/jassoncu.go" @@ -0,0 +1,74 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + +package main + +import ( + "fmt" + "strings" + "strconv" +) + +func esExpresionCorrecta(expresion string) bool { + // Dividir la expresión en tokens separados por espacios + tokens := strings.Fields(expresion) + + // Verificar que la cantidad de tokens sea impar (número, operación, número, operación, ...) + if len(tokens)%2 != 1 { + return false + } + + // Iterar sobre los tokens en pasos de 2 para verificar número y operación + for i := 0; i < len(tokens); i += 2 { + // Verificar si el token actual es un número válido + _, err := strconv.ParseFloat(tokens[i], 64) + if err != nil { + return false + } + + // Verificar si hemos llegado al último token + if i == len(tokens)-1 { + break + } + + // Verificar si el token siguiente es una operación válida + if !esOperacionValida(tokens[i+1]) { + return false + } + } + + return true +} + +func esOperacionValida(operacion string) bool { + operacionesValidas := map[string]bool{ + "+": true, + "-": true, + "*": true, + "/": true, + "%": true, + } + + // Verificar si la operación está en el mapa de operaciones válidas + _, existe := operacionesValidas[operacion] + return existe +} + +func main() { + expresion := "5 + 6 / 7 - 4" + fmt.Printf("¿La expresión \"%s\" es correcta? %v\n", expresion, esExpresionCorrecta(expresion)) + + expresion = "5 a 6" + fmt.Printf("¿La expresión \"%s\" es correcta? %v\n", expresion, esExpresionCorrecta(expresion)) +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/GerardoVillla.java" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/GerardoVillla.java" new file mode 100644 index 0000000000..a6f29a5947 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/GerardoVillla.java" @@ -0,0 +1,33 @@ + +package retos; + +import java.util.regex.Pattern; +import java.util.regex.Matcher; +/** + * + * @author luism + */ +public class GerardoVillla { + public static void main(String[] args) { + System.out.println("Status = " + isValidExpression("2 a 2")); + System.out.println("Status = " + isValidExpression("5 + 6 / 7 - 4")); + System.out.println("Status = " + isValidExpression("2 + ..22")); + System.out.println("Status = " + isValidExpression("-2 * -1.22")); + + } + + public static boolean isValidExpression(String s){ + + String regex = "-?\\d+(?:\\.\\d+)?\\s*[+\\-*/%]\\s*-?\\d+(?:\\.\\d+)?"; + + + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(s); + + if(matcher.find()){ + return true; + }else{ + return false; + } + } +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/JesusWay69.java" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/JesusWay69.java" new file mode 100644 index 0000000000..6acc40ec7f --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/JesusWay69.java" @@ -0,0 +1,39 @@ +package reto_28; + +import java.util.Scanner; + +/** + * Crea una función que reciba una expresión matemática (String) y compruebe si + * es correcta. -Retornará true o false. + * -Para que una expresión matemática sea + * correcta debe poseer un número, una operación y otro número separados por + * espacios. + * + * -Tantos números y operaciones como queramos. + * + * -Números positivos, negativos, enteros o decimales. + * + * -Operaciones soportadas: + - * / % + * + * Ejemplos: "5 + 6 / 7 - 4" -> true "5 a 6" -> false + * + * @author jesus + */ + +public class JesusWay69 { + + public static void main(String[] args) { + + Scanner sc = new Scanner(System.in, "ISO-8859-1"); + String operacion; + System.out.print("Introduzca operación: "); + operacion = sc.nextLine().trim(); + System.out.println(operacion + " --> " + operacionCorrecta(operacion)); + + } + + public static boolean operacionCorrecta(String er) { + return er.matches("(^-?[0-9]+\\.[0-9]+|-?[0-9]+)[\\s]+(.+|-|.*|/|%)[\\s]+(-?[0-9]+\\.[0-9]+|-?[0-9]+$)*"); + } + +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/Qv1ko.java" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/Qv1ko.java" new file mode 100644 index 0000000000..8a9c2d4361 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/Qv1ko.java" @@ -0,0 +1,28 @@ +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Qv1ko { + + public static void main(String[] args) { + System.out.println(isMathExpression("5 + 6 / 7 - 4")); + } + + private static boolean isMathExpression(String expression) { + + boolean result = true; + Pattern regex = Pattern.compile("-?\\d+|-?\\d+\\.\\d+|[+\\-*/%]"); + Matcher check; + + for (String element : expression.split(" ")) { + check = regex.matcher(element); + if (!check.find()) { + result = false; + break; + } + } + + return result; + + } + +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/SoleSasia.java" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/SoleSasia.java" new file mode 100644 index 0000000000..328167e21a --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/SoleSasia.java" @@ -0,0 +1,11 @@ +public class SoleSasia { + + public static void main(String[] args) { + System.out.println(esExpresionMatematica("5 + 6 / 7 - 4")); + } + + private static boolean esExpresionMatematica(String expresionMatematica) { + return expresionMatematica.matches("(-*\\d+.*\\d*\\s+[-+*/%]\\s+-*\\d+.*\\d*\\s*)+"); + } + +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/masdos.java" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/masdos.java" new file mode 100644 index 0000000000..e04d167acd --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/java/masdos.java" @@ -0,0 +1,25 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ +public class masdos { + + public static void main(String[] args) { + System.out.println(isValidMathOperation("5 + 6 / 7 - 4")); + System.out.println(isValidMathOperation("5 a 6")); + System.out.println(isValidMathOperation("-5.45 + 6.5 / 7 - 4.5")); + } + + public static boolean isValidMathOperation(String operation) { + return operation.matches("^(-?\\d(.\\d)?)+(\\s[-+*/%]\\s(-?\\d(.\\d)?)+)+$"); + } +} \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/Galemari.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/Galemari.js" new file mode 100644 index 0000000000..acae5f4ae9 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/Galemari.js" @@ -0,0 +1,27 @@ +const readline = require("readline"); + +function checkExpression(expression) { + const validOperators = ["+", "-", "*", "/", "%"]; + const expressionArray = expression.split(" "); + + if (expressionArray.length < 3) return false; + + for (const char of expressionArray) { + if (!validOperators.includes(char) && !/^([0-9])*$/.test(char)) { + return false; + } + } + + return true; +} + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +rl.question("Ingrese una expresión matemática: ", (expression) => { + rl.close(); + const isCorrect = checkExpression(expression); + console.log(`La expresión es ${isCorrect ? "correcta" : "incorrecta"}`); +}); diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/LucasSantillan.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/LucasSantillan.js" new file mode 100644 index 0000000000..1f9625fdd6 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/LucasSantillan.js" @@ -0,0 +1,29 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false +*/ + +function corectaExprecion(expresion) { + let comprobador1 = /(\s[+-/\*%]\s)/g; + let comprobador2 = /-?\d+\.?\d*/g; + let reduccion1 = expresion.replace(comprobador1, ''); + let reduccion2 = reduccion1.replace(comprobador2, ''); + if(!reduccion2) { + console.log(true); + } else { + console.log(false); + } +} + +corectaExprecion('2 + 254 - -5.2 * 6 / 2 % 3'); /* true */ +corectaExprecion('2 + 254 - -5.2 * 6 / 2 %3'); /* false */ +corectaExprecion('2 + 254 - -5.2 a 6 / 2 % 3'); /* false */ diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/RodriJOk.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/RodriJOk.js" new file mode 100644 index 0000000000..b3aff7dd20 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/RodriJOk.js" @@ -0,0 +1,28 @@ +/* Crea una función que reciba una expresión matemática (String) +* y compruebe si es correcta. Retornará true o false. +* - Para que una expresión matemática sea correcta debe poseer +* un número, una operación y otro número separados por espacios. +* Tantos números y operaciones como queramos. +* - Números positivos, negativos, enteros o decimales. +* - Operaciones soportadas: + - * / % +* +* Ejemplos: +* "5 + 6 / 7 - 4" -> true +* "5 a 6" -> false +*/ + +function expresionMatematica(expresion){ + const regex = /^(\d+\.?\d*|\.\d+)\s[+\-*/%]\s(\d+\.?\d*|\.\d+)(\s[+\-*/%]\s(\d+\.?\d*|\.\d+))*$/; + return regex.test(expresion); +} + +console.log(expresionMatematica("5 + 6 / 7 - 4")); // true +console.log(expresionMatematica("5 a 6")); // false +console.log(expresionMatematica("5 5 5")); // false +console.log(expresionMatematica("%")); // false +console.log(expresionMatematica("5 + ")); // false +console.log(expresionMatematica()); // false +console.log(expresionMatematica("55")); //false +console.log(expresionMatematica("5*5")); //false +console.log(expresionMatematica(1)); //false +console.log(expresionMatematica("10 * 10")); //true \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/cesar-ch.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/cesar-ch.js" new file mode 100644 index 0000000000..5d30defbf5 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/cesar-ch.js" @@ -0,0 +1,44 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + + +function isMathExpression(str) { + const operations = ['+', '-', '*', '/', '%'] + const mathExpression = str.split(' ') + if (mathExpression.length < 3 || mathExpression.length % 2 == 0) { + return false + } + + let isMathExpression = true + mathExpression.map((e, i) => { + if (!Number(e) && i % 2 == 0) { + isMathExpression = false + } + + if (!operations.includes(e) && i % 2 != 0) { + isMathExpression = false + } + } + ) + return isMathExpression + +} + +console.log(isMathExpression("3 + 5")) +console.log(isMathExpression("3 a 5")) +console.log(isMathExpression("-3 + 5")) +console.log(isMathExpression("- 3 + 5")) +console.log(isMathExpression("-3 a 5")) +console.log(isMathExpression("-3+5")) +console.log(isMathExpression("3 + 5 - 1 / 4 % 8")) \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/gaizkadvlp.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/gaizkadvlp.js" new file mode 100644 index 0000000000..906ad9d61b --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/gaizkadvlp.js" @@ -0,0 +1,26 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + +const regex = new RegExp('([-]?\\d+(,\\d+)?)(([ ][+|\\-|*|\\/|%][ ])([-]?\\d+(,\\d+)?))+', 'g'); + +const ejemploA = "5 + 6 / 7 - 4"; +const ejemploB = "5 a 6"; +const ejemploC = "-5 + 3,25 * -23,12 / 12 % 2 - 1 + 23"; + +const isExpresionMatematica = expresion => regex.test(expresion); + +console.log(isExpresionMatematica(ejemploA)); //true +console.log(isExpresionMatematica(ejemploB)); //false +console.log(isExpresionMatematica(ejemploC)); //true + diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/jmedinac1987.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/jmedinac1987.js" new file mode 100644 index 0000000000..18060bff55 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/jmedinac1987.js" @@ -0,0 +1,19 @@ +function mathExpression(operation) { + if (typeof operation !== "string") + `type of: the operation ${operation} is false`; + + let lengthOperation = operation.trim().split(/\s+/); + if (lengthOperation.length < 3) return `length: the operation ${operation} is false`; + + let regex = + /^-?(\d+\.?\d*|\.\d+)\s[+\-*/%]\s-?(\d+\.?\d*|\.\d+)(\s[+\-*/%]\s-?(\d+\.?\d*|\.\d+))*$/; + let isOperationInfoValid = regex.test(operation); + if (!isOperationInfoValid) + return `operanding: the operation ${operation} is false`; + + if (eval(operation) == 0 || eval(operation)) + return `the operation ${operation} is true`; + return `result: the operation ${operation} is false`; +} + +console.log(mathExpression("-2 + -2 + -2 / -3 * -3 - 3 + -8")); diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/jmlopezt.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/jmlopezt.js" new file mode 100644 index 0000000000..d08c91fb99 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/jmlopezt.js" @@ -0,0 +1,66 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + +function evaluate(expression) { + if (typeof expression !== 'string') { + return false; + } + + const chars = expression.split(' '); + const firstChar = chars[0]; + const lastChar = chars[chars.length - 1]; + if (!isValidNumber(firstChar) || !isValidNumber(lastChar)) { + return false; + } + + let prevIsOperator = false; + for (const char of chars) { + if (isValidNumber(char)) { + prevIsOperator = false; + } else if (isValidOperator(char)) { + if (prevIsOperator) { + return false; + } + prevIsOperator = true; + } else { + return false; + } + } + return true; +} + +function isValidNumber(input){ + const numberRegex = /^-?\d+(\.\d+)?$/; + return numberRegex.test(input); +} + +function isValidOperator(input){ + const operatorRegex = /^[+\-*\/%]$/; + return operatorRegex.test(input); +} + +// Test cases + +console.log(evaluate("5 + 6 / 7 - 4")); // true +console.log(evaluate("5 a 6")); // false +console.log(evaluate("10 * -2")); // true +console.log(evaluate("5.5 + 6.6 - 6.6 * 6.6 / 1.1 % 13.3")); // true +console.log(evaluate("3.3 + 3.3.3")); // false (Invalid number with multiple decimal points) +console.log(evaluate("33.3 + 34.7 /")); // false (Incomplete expression) +console.log(evaluate("/ 3.3 + 4.4")); // false (Incomplete expression) +console.log(evaluate("5 * (6 - 4)")); // false (Unsupported characters) +console.log(evaluate("5 * + / 9")); // false (Multiple consecutive operators) +console.log(evaluate("")); // false (Empty expression) +console.log(evaluate(123)); // false (Invalid input type) +console.log(evaluate(null)); // false (Invalid input type) \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/marcode24.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/marcode24.js" new file mode 100644 index 0000000000..8dd3822555 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/marcode24.js" @@ -0,0 +1,21 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + +const isMathExpresion = (str) => { + str = str.replace(/\s+/g, ' ').split(' ').join(''); + const regex = /^(\d+[\\+\-\\*\\/%]?)+\d+$/; + return regex.test(str); +}; + +// Visita mi repo en GitHub para ver y correr los tests de este código --> https://github.com/marcode24/weekly-challenges diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/nlarrea.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/nlarrea.js" new file mode 100644 index 0000000000..38c31073e1 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/nlarrea.js" @@ -0,0 +1,100 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + + +function checkExpression(expression) { + const operators = ['+', '-', '*', '/', '%']; + const expressionArray = expression.trim().split(/\s+/); + + + // if no 3 elements -> NOK + + if (expressionArray.length < 3) { + console.log('There must be at least 3 elements in the expression.'); + return false; + } + + + // if no operators at all -> NOK + + if (!operators.some(operator => expression.includes(operator))) { + console.log('There are no operators in this expression.'); + return false; + } + + + // if expression starts or ends with operator -> NOK + // * expression can start with '-' or '+' + + if ( + operators.includes(expressionArray[0]) && expressionArray[0] !== '-' && expressionArray[0] !== '+' || + operators.includes(expressionArray[expressionArray.length - 1]) + ) { + console.log( + 'Expressions can not start with operators (except "-" or "+").\nExpressions can not end with operators.' + ); + return false; + } + + + // check operators between numbers + + let lastElement; + + for (let element of expressionArray) { + // if two operators together (no space between them) -> NOK + if (element.length > 1 && !/^\d+$/.test(element)) { + console.log('This expression has more than one operator without spacing.'); + return false; + } + + // if no operators between numbers -> NOK + if (/^\d+$/.test(lastElement) && /^\d+$/.test(element)) { + console.log('Missing operator between numbers.'); + return false; + } + + // if two operators between numbers -> NOK + if ( + operators.includes(lastElement) && operators.includes(element) && + element !== '-' // allowed for the number sign + ) { + console.log('Missing number between operators.'); + return false; + } + + // if not allowed operator -> NOK + if (/(?!-|\+|\/|%|\*)[\W]/.test(element)) { + console.log('There is a not allowed operator in this expression.'); + return false; + } + + lastElement = element; + } + + + // if no errors -> OK + + return true; +} + + +console.log(checkExpression('5 + 6 / 7 - 4')); // true +console.log(checkExpression('a + b / c - d')); // true -> letters can be considered numbers +console.log(checkExpression('5 / - 6')); // true -> '-' operator allowed after another operator (number sign) + +console.log(checkExpression('5 a 6')); // false -> no operators +console.log(checkExpression('+ 5 - 6 8')); // false -> missing operator between numbers +console.log(checkExpression('+ 5 - 6 / % 8')); // false -> missing number between operators +console.log(checkExpression('5 & - 6')); // false -> not allowed operator \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/othamae.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/othamae.js" new file mode 100644 index 0000000000..26af161493 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/othamae.js" @@ -0,0 +1,37 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + +const checkExpression = (expression) => { + const validOperators = ["+", "-", "*", "/", "%"] + const expressionArray = expression.split(" ") + if (expressionArray.length < 3) return false + for (const char of expressionArray) { + if (!validOperators.includes(char) && (!/^([0-9])*$/.test(char))) { + return false + } + } + return true +} + + +console.log(checkExpression("5 + 6 / 7 - 4")) //true +console.log(checkExpression("5 a 6")) //false +console.log(checkExpression("85 a 6")) //false +console.log(checkExpression("957 - 6")) //true +console.log(checkExpression("- 6 +5")) //false +console.log(checkExpression("83 -+ 6")) //false +console.log(checkExpression("597-6")) //false +console.log(checkExpression("95 - 66 + 7 / 2")) //true + + diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/pcelman.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/pcelman.js" new file mode 100644 index 0000000000..080176d5b7 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/pcelman.js" @@ -0,0 +1,43 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + + + +function mathCheck(expression) { + if (typeof expression !== "string") { + return false; + } + + const expressionElements = expression.trim().split(" "); + const numbers = expressionElements.filter((_, index) => index % 2 === 0); + const symbols = expressionElements.filter((_, index) => index % 2 !== 0); + const allSymbols = ["+", "-", "*", "/", "%"]; + + const areNumbers = numbers.every((e) => !isNaN(e)); + const areSymbols = symbols.every((e) => allSymbols.includes(e)); + + const endsWithSymbol = symbols.includes( + expressionElements[expressionElements.length - 1] + ); + + return areNumbers && areSymbols && !endsWithSymbol; +} + + + + +console.log(mathCheck("2 + 4 - 3 - 2 / 2 * 7")); // true +console.log(mathCheck("2 + 4 - 3 - 2 / 2 7")); // false +console.log(mathCheck("5.25 + 10 / 3")); // true +console.log(mathCheck("8 - 2 / 2 * 4 +")); // false diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/test0n3.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/test0n3.js" new file mode 100644 index 0000000000..5e26880ab6 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/test0n3.js" @@ -0,0 +1,64 @@ +// +// Crea una función que reciba una expresión matemática (String) +// y compruebe si es correcta. Retornará true o false. +// - Para que una expresión matemática sea correcta debe poseer +// un número, una operación y otro número separados por espacios. +// Tantos números y operaciones como queramos. +// - Números positivos, negativos, enteros o decimales. +// - Operaciones soportadas: + - * / % +// +// Ejemplos: +// "5 + 6 / 7 - 4" -> true +// "5 a 6" -> false +// + +const validOperation = (operation) => { + let operationArray = operation.split(" "); + if (invalid(operationArray)) { + return false; + } + + for (let i = 0; i < operationArray.length; i++) { + if (!isNumber(operationArray[i]) && !isOperator(operationArray[i])) { + console.log("inside conditional"); + return false; + } + } + return true; +}; + +const invalid = (operationArray) => { + const operationLength = operationArray.length; + return operationLength < 3 || operationLength % 2 === 0; +}; + +const isNumber = (value) => { + return !isNaN(value); +}; + +const isOperator = (value) => { + return value.match(/[+\-*\/%]/) && value.length == 1; +}; + +const tests = { + input: ["-5 + 12%3", "-5", "5 / 3", "5 / -3 * 2"], + expecteds: [false, false, true, true], +}; + +let errors = 0; +tests.input.forEach((test, index) => { + const result = validOperation(test); + if (result == tests.expecteds[index]) { + console.log( + `Success - input: ${test}, expected: ${tests.expecteds[index]}` + ); + } + if (result != tests.expecteds[index]) { + errors += 1; + console.log( + `Error - input: ${test}, expected: ${tests.expecteds[index]}, result: ${result}` + ); + } +}); + +console.log(`Errors: ${errors}`); diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/veykor.js" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/veykor.js" new file mode 100644 index 0000000000..f95f942253 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/javascript/veykor.js" @@ -0,0 +1,5 @@ +function verifyMathExpresion(s) { + //Check if input is empty or there is any match with the mathematical expression structure and verify if the length between the input and the match is equal + var a; + return !( !s || !(a = s.match(/(((-?\d+(\.\d+)? ?)([+/*%-] ))+)(-?\d+(\.\d+)?)/)) || a[0].length != s.length ); +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/kotlin/IsTheMartin.kt" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/kotlin/IsTheMartin.kt" new file mode 100644 index 0000000000..9ee6290d38 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/kotlin/IsTheMartin.kt" @@ -0,0 +1,77 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + * + * Algunos casos testeados: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + * "-10.2.1 * 10" -> false + * "20.0 * -1.01" -> true + * "1.000001 * / 1000" -> false + * "*10 + 29" -> false + * "/ 10" -> false + * "-20 * 32 *" -> false + * "30 *" -> false + * "20 20" -> false + */ + +private val operators = listOf("+", "-", "*", "/", "%") +private val separator = " " + +fun main() { + val expression = "5 + 6 / 7 - 4" + val isValidExpression = mathExpression(expression) + println("Expresion valida? $expression -> $isValidExpression") +} + +fun mathExpression(input: String): Boolean { + val splitExpression = input.split(separator) + return if (splitExpression.count() > 2 && + !startsOrEndsWithOperator(splitExpression.first(), splitExpression.last())) { + var previousOperator = "" + var previousNumber = "" + var isValidExpression = true + splitExpression.forEach { expression -> + if(expression.isNumber() && previousNumber.isEmpty()) { + previousNumber = expression + previousOperator = "" + return@forEach + } + if (expression.isOperator() && previousOperator.isEmpty()) { + previousOperator = expression + previousNumber = "" + return@forEach + } + isValidExpression = false + } + isValidExpression + } else { + false + } +} + +private fun startsOrEndsWithOperator(first: String, last: String): Boolean { + return operators.contains(first) || operators.contains(last) +} + +private fun String.isNumber(): Boolean { + return try { + this.toDouble() + true + } catch (e: NumberFormatException) { + false + } +} + +private fun String.isOperator(): Boolean { + return operators.contains(this) +} diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/kotlin/marchdz.kt" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/kotlin/marchdz.kt" new file mode 100644 index 0000000000..1cf146624d --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/kotlin/marchdz.kt" @@ -0,0 +1,13 @@ +fun validateMathExpression(mathExpression: String) { + val regex = """^-?\d+(\.\d+)?\s[+\-*/%]\s-?\d+(\.\d+)?(\s[+\-*/%]\s-?\d+(\.\d+)?)*$""".toRegex() + println("$mathExpression -> ${regex.matches(mathExpression)}") +} + +fun main() { + validateMathExpression("5 + 6 / 7 - 4") // true + validateMathExpression("5 a 6") // false + validateMathExpression("5 + 600.06 / 70 - 4.4") // true + validateMathExpression("5 + 6 /7 - 4") // false + validateMathExpression("5 +") // false + validateMathExpression("5 + 600.06 / 70 - ") // false +} \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/kotlin/pisanowp.kt" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/kotlin/pisanowp.kt" new file mode 100644 index 0000000000..f7909eba6e --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/kotlin/pisanowp.kt" @@ -0,0 +1,70 @@ +fun main() { + + /* + * Reto #28 10/07/2023 EXPRESIÓN MATEMÁTICA + * + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + + print("Introduce expresión matemática a validar >") + val expresionMatematica = readLine() + if (expresionMatematica != null){ + if (validaExpresionMatematica(expresionMatematica)){ + println("LA EXPRESIÓN ${expresionMatematica} ES VÁLIDA") + } else { + println("LA EXPRESIÓN ${expresionMatematica} NO ES VÁLIDA") + } + + } + + /* + Descomentar para prebas + val expresiones = listOf( + "5 + 6 / 7 - 4", + "1 + 2", "4 - 3", "5 * 6", "8 / 4", + "1 +2", "4 -3", "5 *6", "8 /4", + "5 a 6", "3 + 4 r 8", + "22 + 34 / 33", + "2+3", "25 + 3", + "5 a ", + "5 + ", "+ 3" + ) + expresiones.forEach { + if (validaExpresionMatematica(it)){ + println("${it} => VÁLIDA") + } else { + println("${it} => NO VÁLIDA") + } + } + */ + + + + + + + +} + +fun validaExpresionMatematica(expresionMatematica: String): Boolean { + // Expresion regular, + // ^[0-9]+ Debe empezar por número + // y luego se debe repetir 1 o más veces la siguiente cadena + // espacio (\s), operador (+|-|*|/), otro espacio (\s) y un número + // (\\s(\\+|-|\\*|/)\\s[0-9]+)+$" + val pattern = "^[0-9]+(\\s(\\+|-|\\*|/)\\s[0-9]+)+$" + + return Regex(pattern).matches(expresionMatematica) + +} + diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/AnzurezDev.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/AnzurezDev.py" new file mode 100644 index 0000000000..d64a575832 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/AnzurezDev.py" @@ -0,0 +1,12 @@ +import re + +def math_ex( expression ): + match = re.search("^(-?\d+(\.\d+)?\s+[-+*/%]\s+)*-?\d+(\.\d+)?$", expression) + validator = True if match else False + return validator + +test1 = math_ex( "5 + 6 / 7 - 4" ) # false +test2 = math_ex( "5 a 6" ) # false + +print( test1 ) +print( test2 ) \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/Hugovrc.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/Hugovrc.py" new file mode 100644 index 0000000000..28de773148 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/Hugovrc.py" @@ -0,0 +1,18 @@ +import re + +def comprobar_matematica(expresion: str): + #expresion_matematica = (r"((\d+[.]\d|\d|\-\d)\s*(\+|\-|\*|\/|\%)?\s*){1,}") + expresion_matematica = (r"((\d+[.]\d|\d|\-\d)\s?((\+|\-|\*|\/|\%)\s)?){1,}") + #expresion_matematica = "^(\d+[.]\d|\d|\-\d) [\+|-|*|/|%] (\d+[.]\d|\d|\-\d)" + result = re.fullmatch(expresion_matematica, expresion) + + if result: + return True + else: + return False + + +print(comprobar_matematica("-5 + 5.9 / 10 a 13 * 15")) +print(comprobar_matematica("-5 + 5.9 / 10.0 % 13 * 90")) +print(comprobar_matematica("-5 p -89")) +print(comprobar_matematica("-5 - -89")) \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/JoaquinMateosBarroso.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/JoaquinMateosBarroso.py" new file mode 100644 index 0000000000..022032cab2 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/JoaquinMateosBarroso.py" @@ -0,0 +1,24 @@ +import re + +def checkMathExpression(expresion: str) -> bool: + """Crea una función que reciba una expresión matemática (String) + y compruebe si es correcta. Retornará true o false. + - Para que una expresión matemática sea correcta debe poseer + un número, una operación y otro número separados por espacios. + Tantos números y operaciones como queramos. + - Números positivos, negativos, enteros o decimales. + - Operaciones soportadas: + - * / % + Ejemplos: + "5 + 6 / 7 - 4" -> true + "5 a 6" -> false""" + return re.match(r'[+-]?[0-9]*[.]?[0-9]*\ [+-\/\*]\ [0-9]*[.]?[0-9]*', expresion) != None + + + +print(checkMathExpression("3 + 5")) +print(checkMathExpression("3 a 5")) +print(checkMathExpression("-3 + 5")) +print(checkMathExpression("- 3 + 5")) +print(checkMathExpression("-3 a 5")) +print(checkMathExpression("-3+5")) +print(checkMathExpression("3 + 5 - 1 / 4 % 8")) \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/JoelFH23.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/JoelFH23.py" new file mode 100644 index 0000000000..4512d5dffe --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/JoelFH23.py" @@ -0,0 +1,60 @@ +import re + + +def split_list_by(value: int, list_of_words: list) -> list: + if not isinstance(value, int) or value <= 0: + raise ValueError("value must be a positive integer") + if not isinstance(list_of_words, list): + raise ValueError("list_of_words must be a list") + + temp_list = list() + for i in range(0, len(list_of_words), value): + temp_list.append(list_of_words[i : i + value]) + return temp_list + + +def mathematical_expression(expression: str) -> bool: + if not isinstance(expression, str) or not len(expression): + return False + + list_of_words = re.findall(r"\S+|\s", expression) + + if len(list_of_words) < 5: + return False + + number_pattern = r"^[-+]?(\d+|\d+(\.\d+)?)$" + operator_pattern = r"^[-+*/%]$" + + split_list = split_list_by(4, list_of_words) + filtered_array = [row for row in split_list if len(row) == 4] + + for row in filtered_array: + for i in range(0, len(row), 2): + if ( + not re.match(number_pattern, row[0]) + or not re.match(operator_pattern, row[2]) + or row[i + 1] != " " + ): + return False + + last_item = split_list[-1] + if len(last_item) == 1 and re.match(number_pattern, last_item[0]): + return True + return False + + +""" +expression = "+5 + 6 / 7 - 4" # -> True +expression = "+ 5 + 6 / 7 - 4" # -> False +expression = "5 + 6 / 7 - -4 / -2" # -> True +expression = " 5 + 6 / 7 - 4 " # -> False +expression = "-5 + 6 / 7 - 4" # -> True + + """ +expression = "5 + 6 / 7 - -4 / -2" + +print(mathematical_expression(expression)) + +while True: + expression = input("Expression: ") + print(mathematical_expression(expression)) diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/Nicolaslaslass.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/Nicolaslaslass.py" new file mode 100644 index 0000000000..65513e9506 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/Nicolaslaslass.py" @@ -0,0 +1,66 @@ + +#Primer reto de programación realizado ;) + +#empecé a estudiar python en Abril de 2023, +#y ha sido una gran viaje! + +# por ahora el programa no hace todo, haré comentarios sobre qué mejorar +######################### + +#creación de lista verificación +n = 999 #quedo pendiente de buscar una libreria que rescate números +check_list = [] +for i in range(1, n+1): + check_list.append(i) + +check_list_ope =['+', '-', '/', '*'] + +#fin de creación de listas de verificación + +requeriment = input('Ingresa tu operación:') +lista = requeriment.split(' ') +print(lista) +converted_list = [str(num) if index % 2 != 0 else int(num) for index, num in enumerate(lista)] +#esta creación de lista de comprensión tiene un problema: en caso de que se ingrese +#un carácter que no pueda ser convertido a número, crashea, por ejemplo un / + +#además, se debe incluir eventualmente que acepte números negativos y decimales. + +print(converted_list) #validación de creación. + +def validacion(converted_list): + g = 0 + for i in converted_list: + if (type(i) == int) and (i in check_list): #falta agregar que la conversión sea + g += 1 + elif (type(i) == str) and (i in check_list_ope): + g += 1 + if g == len(converted_list): + return True + else: + return False + +if validacion(converted_list): + print('True') +else: + print('False') + + + + + + + + + + + + + + + + + + + + diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/SantiALS.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/SantiALS.py" new file mode 100644 index 0000000000..fb19fd28f5 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/SantiALS.py" @@ -0,0 +1,71 @@ +''' +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + + *''' + + +def reto_23(ecuetion: str): # La función fuerza a que el parámetro de entrada sea un str + + terms = ecuetion.split() # Separo los términos de la ecuación en una lista para analizarlos individualmente. + + if len(terms) < 3 or '**' in terms or '//' in terms: # Si la cantidad de elementos de la lista es menor a 3 quiere decir que la ecuación es del tipo ('1 +') ó ('1 ') ó ('1') + veredicto = 'False' + else: + + aprobado=[] + contador = 0 + + find_alpha = [caracter.isalpha() for caracter in ecuetion] #Busca si hay letras en la ecuación, si las hay devuelve un true para invalidar la ecuación. + check = any(find_alpha) + + if check == True: # Si hay letras en la ecuación sale de la función con veredicto FALSO + veredicto = 'False' + + else: + for x in terms: # Analiza cada término de la ecuación para corroborar que sean todos números ó solamente un signo de operación + + if '+' in x or '-' in x or '*' in x or '/' in x or '%' in x: # Analiza si el término tiene signos + aprobado.append(False) # Si el término tiene signo se le asigna un valor FALSE a la lista de "aprobado" + else: + aprobado.append(True) # Si el término no tiene signo se le asigna un valor TRUE a la lista de "aprobado" + + if any(caracter.isnumeric() for caracter in x): # Si el término tiene algún número se mantiene el valor asignado en el análisis de signo del la línea:21, + # lo que indica que es un término que tiene signo y número sin espacio intercalado entre ellos. + pass + else: + aprobado[contador] = True #Si no contiene números según el análisis de la línea:26, entonces es un término de sólo signo y toma el valor de TRUE + + contador += 1 + + check = all(aprobado) # Si todos los valores de la lista aprobados son TREU, la ecuación se corresponde con el enunciado. + if check == False: + veredicto = 'False' + else: + veredicto = 'True' + + return print (f'{ecuetion} --> {veredicto}') + + +reto_23('10 + 56') +reto_23('10.5 + 56 - 2 / 2 * 5') +reto_23('10.5 + 56- 2') +reto_23('10.5a + 56- 2') +reto_23('6') +reto_23('10.5 + 56 ** 2 - 2') +reto_23('10.5 + 56 // 2 - 2') +reto_23('10.5 + 56** 2 - 2') +reto_23('10.5 + 56// 2 - 2') + + + diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/alberba.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/alberba.py" new file mode 100644 index 0000000000..d2d18352d0 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/alberba.py" @@ -0,0 +1,12 @@ +import re + +def is_expression(expression: str) -> bool: + if re.fullmatch(r'([0-9]+\s?[+-/*%^]\s?)*[0-9]+', expression): + return True + else: + return False + +print(is_expression("6+5+43")) +print(is_expression("6 +5")) +print(is_expression("6 + 555487")) +print(is_expression("6 +")) \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/drifterDev.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/drifterDev.py" new file mode 100644 index 0000000000..e5d218d11a --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/drifterDev.py" @@ -0,0 +1,19 @@ +def analizar_expresion(expresion: str) -> bool: + simbolos = "+-*/%" + expresion = expresion.split() + for i in range(len(expresion)): + if i % 2 == 0: + try: + numero = int(expresion[i]) + except: + return False + else: + if not expresion[i] in simbolos: + return False + return True + + +if __name__ == "__main__": + expresion = input("Introducir la expresion a analizar: ") + res = "true" if analizar_expresion(expresion) else "false" + print("Es una expresion valida? " + res) diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/gmespasa.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/gmespasa.py" new file mode 100644 index 0000000000..bb9a5e7fa2 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/gmespasa.py" @@ -0,0 +1,51 @@ +math_expressions = [ + "2 + ", + "2 + 3", + "2 + 3.6", + "2 + 3.6 * 9", + "2 + 3.6 * 9", + "2 + 3.6 % 9", + "2 + 3.6 * 9 ", + "2 +- 3.6 * 9", + "-2 + 3.6 * 9", + "2 + 3.6 * 9 + 3", + "2 + 3.6 / i + 6", + "2 + 3.6 / 9 a 3 * 5", + " 2 + 3.6 + 9 + 3", + " 2 + 3.6 v 9 + 3"] + +operations = ["+", "-", "*", "/", "%"] + +def randomExpression() -> str: + import random + """ Devuelve una expresión matemática aleatoria.""" + return random.choice(math_expressions) + +def checkExpression(expression: str) -> bool: + """ + Comprueba si la expresión matemática es correcta. + Retorna true o false. + Para que sea correcta debe poseer como mínimo un número, una operación y otro número separados por un espacio. + Puede contener números positivos, negativos, enteros o decimales. + Operaciones soportadas: + - * / % + """ + split_expression = expression.split(" ") + if len(split_expression) < 3: + return False + + for i in range(0, len(split_expression), 2): + try: + float(split_expression[i]) + except ValueError: + return False + for i in range(1, len(split_expression), 2): + if split_expression[i] not in operations: + return False + return True + +try: + expression = randomExpression() + print(f"La expresión matemática: '{expression}' es {checkExpression(expression)}") +except Exception as e: + print(f"Ha ocurrido un error: {str(e)}") + diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/gonsomito.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/gonsomito.py" new file mode 100644 index 0000000000..cc499e27d1 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/gonsomito.py" @@ -0,0 +1,40 @@ +""" +Crea una función que reciba una expresión matemática (String) +y compruebe si es correcta. Retornará true o false. +- Para que una expresión matemática sea correcta debe poseer un número, + una operación y otro número separados por espacios. +Tantos números y operaciones como queramos. +- Números positivos, negativos, enteros o decimales. +- Operaciones soportadas: + - * / % +""" +import re + +def exp_math(ecuacion): +#iniciar variables y trocear ecuación + simbolos = ("+", "-", "*", "/", "%") + elementos=ecuacion.split(" ") + x = 0 + +#Si no da la talla o no hay suficientes elementos, no continuamos + if len(elementos) < 3 or len(elementos)%2 == 0: + return False + +#recorre la lista para diferenciar números de simbolos (número símbolo número ...) + while x < len(elementos): + if x==0 or x%2 == 0: + if elementos[x].replace(".","").isdigit() == False: + return False + else: + if not(elementos[x] in simbolos) : + return False + x = x + 1 + return True + +print(exp_math("1 + 2")) #True +print(exp_math("1 x 2")) #False +print(exp_math("1 + ")) #False +print(exp_math("+ 2")) #False +print(exp_math("1 + 2 - 3 + 4 * 5 / 6 % 7")) #True +print(exp_math("1+2")) #False +print(exp_math("1,5 + 2")) #False +print(exp_math("1 + 0.2")) #True diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/ingjavierpinilla.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/ingjavierpinilla.py" new file mode 100644 index 0000000000..d25b667c68 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/ingjavierpinilla.py" @@ -0,0 +1,22 @@ +SUPPORTED_OPERATIONS = "+-*/%" + + +def verify_expression(operation: str) -> bool: + operation_lst = operation.split() + if len(operation_lst) % 2 == 0: + return False + for i, v in enumerate(operation_lst): + if i % 2 == 0: + try: + int(v) + except: + return False + else: + if v not in SUPPORTED_OPERATIONS: + return False + return True + + +if __name__ == "__main__": + operation = input("Ingrese una operacion: ") + print(verify_expression(operation)) diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/jaliagag.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/jaliagag.py" new file mode 100644 index 0000000000..9740f82071 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/jaliagag.py" @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys +import argparse + +parser = argparse.ArgumentParser() + +print('uso correcto: python3 jaliagag.py "4 + 5 / 6 - -4"\n') + +op = ['+','-','*','/','%'] + +args = sys.argv[1] +inp = args.split() +no_paren = [] + +for i in inp: + if i == '(' or i == ')': + pass + else: + if '(' in i: + b = i.replace('(','') + no_paren.append(b) + elif ')' in i: + b = i.replace(')','') + no_paren.append(b) + else: + no_paren.append(i) + + +def check_string(sth): + for idx, i in enumerate(sth): + if idx % 2 == 0: + try: + a = int(i) + if isinstance(a,int): + continue + except: + return False + else: + if i in op: + continue + else: + return False + return True + + +if __name__ == '__main__': + if check_string(no_paren): + print('true') + else: + print('false') diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/javierperezmanzanaro.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/javierperezmanzanaro.py" new file mode 100644 index 0000000000..fc3fdaee24 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/javierperezmanzanaro.py" @@ -0,0 +1,60 @@ +"""/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */""" + + + + +def expresion(expresion: str)-> bool: + """Revisa si la expresión es una función matematica del tipo: + numero + esp + operación + ... + + Args: + expresion (str): expresion a analizar + + Returns: + bool: Es o no una expresión matematica + + + python3 -m doctest -v expresion.py + + >>> expresion("5 + 6 / 7 - 4") + True + >>> expresion("5 a 6") + False + """ + lista = expresion.split() + salida_operacion = False + salida_numero = True + #for caracter in lista: + for i in range(len(lista)): + if i % 2 == 0: + try: + valor = float(lista[i]) + except: + salida_numero = False + else: + if lista[i] in '+-*/%': + salida_operacion = True + # print(f'{salida_operacion=} ; {salida_numero=}') + if salida_operacion == True and salida_numero == True: + return True + else: + return False + + +if __name__ == '__main__': + import doctest + doctest.testmod() #verbose=True + formula = input('¿Qué expresión matematica quieres analizar? ') + print(f'La expresión: "{formula}" es: {expresion(formula)}') \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/jcdm60.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/jcdm60.py" new file mode 100644 index 0000000000..cd9ff8725f --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/jcdm60.py" @@ -0,0 +1,65 @@ +# Reto #28: Expresión matemática +#### Dificultad: Media | Publicación: 10/07/23 | Corrección: 17/07/23 + +## Enunciado + + +# +# Crea una función que reciba una expresión matemática (String) +# y compruebe si es correcta. Retornará true o false. +# - Para que una expresión matemática sea correcta debe poseer +# un número, una operación y otro número separados por espacios. +# Tantos números y operaciones como queramos. +# - Números positivos, negativos, enteros o decimales. +# - Operaciones soportadas: + - # / % +# +# Ejemplos: +# "5 + 6 / 7 - 4" -> true +# "5 a 6" -> false +# + +import re + +class ExpresionMatematica: + def __init__(self, expresion): + self.expresion = expresion + self.componentes = re.findall(r'[-+]?\d*\.\d+|[-+]?\d+|\S', expresion) + + def validar_expresion(self): + if len(self.componentes) < 3 or len(self.componentes) % 2 != 1: + return False + + for i in range(0, len(self.componentes), 2): + numero = self.componentes[i] + if not self.es_numero_valido(numero): + return False + + operaciones_permitidas = ['+', '-', '*', '/', '%'] + for i in range(1, len(self.componentes), 2): + operacion = self.componentes[i] + if operacion not in operaciones_permitidas: + return False + + return True + + def es_numero_valido(self, numero): + try: + float(numero) + return True + except ValueError: + return False + + +if __name__ == "__main__": + exp1 = ExpresionMatematica("5.66 + 6 / 7 - 4") + print(exp1.validar_expresion()) # True + + exp2 = ExpresionMatematica("5 a 6") + print(exp2.validar_expresion()) # False + + exp3 = ExpresionMatematica("8 * 2 * 3 - 4 / -2") + print(exp3.validar_expresion()) # True + + exp4 = ExpresionMatematica("8 % 3 - 99") + print(exp4.validar_expresion()) # True + diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/jpirulo.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/jpirulo.py" new file mode 100644 index 0000000000..696479e12a --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/jpirulo.py" @@ -0,0 +1,45 @@ +class ValidadorExpresion: + def __init__(self, expresion): + self.expresion = expresion + self.elementos = self.expresion.split() + self.operadores = ['+', '-', '*', '/', '%'] + + def validar_expresion(self): + for elemento in self.elementos: + if elemento.isdigit() or elemento.replace('.', '', 1).isdigit(): + continue + elif elemento not in self.operadores: + return False + return True + + +def validar_decorador(func): + def wrapper(expresion): + elementos = expresion.split() + operadores = ['+', '-', '*', '/', '%'] + for elemento in elementos: + if elemento.isdigit() or elemento.replace('.', '', 1).isdigit(): + continue + elif elemento not in operadores: + return False + return func(expresion) + return wrapper + + +@validar_decorador +def validar_expresion(expresion): + return True + + +if __name__ == '__main__': + expresion_1 = "5 + 6 / 7 - 4" + expresion_2 = "5 a 6" + expresion_3 = "5 $ 6" + + + validador = ValidadorExpresion(expresion_1) + + validador.expresion = expresion_2 + print(validar_expresion(expresion_1)) # Output: True + print(validar_expresion(expresion_2)) # Output: False + print(validar_expresion(expresion_3)) # Output: False diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/juanppdev.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/juanppdev.py" new file mode 100644 index 0000000000..92e7302fd3 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/juanppdev.py" @@ -0,0 +1,23 @@ +"import re + +def es_expresion_correcta(expresion): + # Expresión regular para validar la estructura de la expresión matemática + patron = r'^\s*([-+]?\d+(\.\d+)?(\s*[-+*/%]\s*[-+]?\d+(\.\d+)?)*\s*)$' + + # Comprobar si la expresión coincide con el patrón + if re.match(patron, expresion): + try: + # Intentar evaluar la expresión para detectar errores de sintaxis + eval(expresion) + return True + except: + return False + else: + return False + +# Ejemplos de uso: +expresion1 = "5 + 6 / 7 - 4" +expresion2 = "5 a 6" + +print(es_expresion_correcta(expresion1)) # Output: True +print(es_expresion_correcta(expresion2)) # Output: False \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/klyone.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/klyone.py" new file mode 100644 index 0000000000..fe52845e96 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/klyone.py" @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +import re + +def is_expr(expr): + if re.fullmatch("\s*[+-]?\d+\.?\d*\s*([+-/*%]\s*[+-]?\d+\.?\d*\s*){0,}", expr) != None: + return True + return False + +if __name__ == "__main__": + print(is_expr("-4 + 5.8 % 0.3 - 4")) + print(is_expr("5 + 6 / 7 - 4")) + print(is_expr("4 a 6")) diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/mouredev.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/mouredev.py" new file mode 100644 index 0000000000..b624485280 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/mouredev.py" @@ -0,0 +1,30 @@ +def checkMathExp(expression: str) -> bool: + + components = expression.split(" ") + + if len(components) < 3 or len(components) % 2 == 0: + return False + + check = True + + for index, component in enumerate(components): + if index % 2 == 0: + try: + float(component) + except: + check = False + else: + check = component in ["+", "-", "*", "/", "%"] + + if not check: + return False + + return check + +print(checkMathExp("3 + 5")) +print(checkMathExp("3 a 5")) +print(checkMathExp("-3 + 5")) +print(checkMathExp("- 3 + 5")) +print(checkMathExp("-3 a 5")) +print(checkMathExp("-3+5")) +print(checkMathExp("3 + 5 - 1 / 4 % 8")) \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/nlarrea.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/nlarrea.py" new file mode 100644 index 0000000000..67ff7f7e60 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/nlarrea.py" @@ -0,0 +1,92 @@ +""" + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará True o False. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> True + * "5 a 6" -> False +""" + +import re + +def check_expression(expression): + OPERATORS = ["+", "-", "*", "/", "%"] + expression_list = re.split("\s+", expression.strip()) + + + # if no 3 elements -> NOK + + if len(expression_list) < 3: + print("\nThere must be at least 3 elements in the expression.") + return False + + + # if no operators at all -> NOK + + if not any([element for element in expression_list if element in OPERATORS]): + print("\nThere are no operators in this expression.") + return False + + + # if expression starts or ends with operator -> NOK + # * expression can start with "-" or "+" + + if ( + expression_list[0] in OPERATORS and expression_list[0] != "-" and expression_list[0] != "+" or + expression_list[len(expression_list) - 1] in OPERATORS + ): + print( + "\nExpressions can not start with operators (except "-" or "+").\nExpressions can not end with operators." + ) + return False + + + # check operators between numbers + + last_element = "" + + for element in expression_list: + # if two operators together (no space between them) -> NOK + if len(element) > 1 and not re.match(r"^\d+$", element): + print("\nThis expression has more than one operator without spacing.") + return False + + # if no operators between numbers -> NOK + if re.match(r"^\d+$", last_element) and re.match(r"^\d+$", element): + print("\nMissing operator between numbers.") + return False + + # if two operators between numbers -> NOK + if ( + last_element in OPERATORS and element in OPERATORS and + element != "-" # allowed for the number sign + ): + print("\nMissing number between operators.") + return False + + # if not allowed operator -> NOK + if re.match(r"(?!-|\+|\/|%|\*)[\W]", element): + print("\nThere is a not allowed operator in this expression.") + return False + + last_element = element + + + # if no errors -> OK + + return True + + +print(check_expression("5 + 6 / 7 - 4")) # True +print(check_expression("a + b / c - d")) # True -> letters can be considered numbers +print(check_expression("5 / - 6")) # True -> "-" operator allowed after another operator (number sign) + +print(check_expression("5 a 6")) # False -> no operators +print(check_expression("+ 5 - 6 8")) # False -> missing operator between numbers +print(check_expression("+ 5 - 6 / % 8")) # False -> missing number between operators +print(check_expression("5 & - 6")) # False -> not allowed operator \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/pyramsd.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/pyramsd.py" new file mode 100644 index 0000000000..a278198582 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/pyramsd.py" @@ -0,0 +1,10 @@ +import re + +def expression(expression): + if re.fullmatch(r'([0-9]+\s?[+-/*%^]\s?)*[0-9]+', expression): + return True + else: + return False + + +print(expression("3+2+3+2/4-2")) diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/sebatimur.py" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/sebatimur.py" new file mode 100644 index 0000000000..ccced94a92 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/python/sebatimur.py" @@ -0,0 +1,21 @@ +num1 = float(input("Ingrese un número: ")) +num2 = float(input("Ingrese otro número: ")) +operacion = input("Ingrese la operación que desea realizar (+, -, * o /): ") + +if operacion == '+': + resultado = num1 + num2 + print("El resultado de la suma de", num1, "+", num2, "es:", resultado) +elif operacion == '-': + resultado = num1 - num2 + print("El resultado de la resta de", num1, "-", num2, "es:", resultado) +elif operacion == '*': + resultado = num1 * num2 + print("El resultado de la multiplicación de", num1, "*", num2, "es:", resultado) +elif operacion == '/': + if num2 == 0: + print("No se puede dividir por 0") + else: + resultado = num1 / num2 + print("El resultado de la división de", num1, "/", num2, "es:", resultado) +else: + print("Operador inválido") \ No newline at end of file diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/ruby/test0n3.rb" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/ruby/test0n3.rb" new file mode 100644 index 0000000000..8208590f21 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/ruby/test0n3.rb" @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +# +# Crea una función que reciba una expresión matemática (String) +# y compruebe si es correcta. Retornará true o false. +# - Para que una expresión matemática sea correcta debe poseer +# un número, una operación y otro número separados por espacios. +# Tantos números y operaciones como queramos. +# - Números positivos, negativos, enteros o decimales. +# - Operaciones soportadas: + - * / % +# +# Ejemplos: +# "5 + 6 / 7 - 4" -> true +# "5 a 6" -> false +# + +# class Calculator, check if string is a valid operation +class Calculator + attr_accessor :operation + + def initialize(operation) + @operation = operation.split(' ') + end + + def valid_operation + return false if invalid? + + @operation.each do |item| + return false unless number?(item) || operator?(item) + end + true + end + + def invalid? + operation_length = @operation.length + operation_length < 3 || operation_length.even? + end + + def number?(string) + !Float(string).nil? + rescue StandardError + false + end + + def operator?(string) + string.match?(%r{[+\-*/%]}) && string.length == 1 + end +end + +# puts Calculator.new('-5 + 12%3').valid_operation +# puts Calculator.new('-5').valid_operation +# puts Calculator.new('5 / 3').valid_operation +# puts Calculator.new('5 / -3 * 2').valid_operation diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/rust/vbayarri.rs" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/rust/vbayarri.rs" new file mode 100644 index 0000000000..c4d9fd7ce9 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/rust/vbayarri.rs" @@ -0,0 +1,47 @@ +/* + * Crea una función que reciba una expresión matemática (String) + * y compruebe si es correcta. Retornará true o false. + * - Para que una expresión matemática sea correcta debe poseer + * un número, una operación y otro número separados por espacios. + * Tantos números y operaciones como queramos. + * - Números positivos, negativos, enteros o decimales. + * - Operaciones soportadas: + - * / % + * + * Ejemplos: + * "5 + 6 / 7 - 4" -> true + * "5 a 6" -> false + */ + + // Se utiliza la librería regex para validar la expresión matemática + use regex::Regex; + + // Se define la expresión regular para validar la expresión matemática +const EXPRESION_REGULAR: &str = r"^(\s*\-?\d+(\.\d+)?\s*[\+\-\*\/\%]\s*)+\-?\d+(\.\d+)?\s*$"; + +// Función que recibe una expresión matemática y retorna true si es correcta +fn check_math_exp(expresion: &str) -> bool { + // Se crea la expresión regular + let re = Regex::new(EXPRESION_REGULAR).unwrap(); + // Se retorna el resultado de la validación + re.is_match(expresion) +} + +// Validación de la función con un ejemplo complejo +fn main() { + let result : bool = check_math_exp("3 + 5 - 1 / 4 % 8"); + println!("Result: {}", result); +} + +#[test] +// Test de la función con los casos de ejemplo de MoureDev +fn test() { + assert_eq!(check_math_exp("3 + 5"), true); + assert_eq!(check_math_exp("3 a 5"), false); + assert_eq!(check_math_exp("-3 + 5"), true); + assert_eq!(check_math_exp("- 3 + 5"), false); + assert_eq!(check_math_exp("-3 a 5"), false); + assert_eq!(check_math_exp("-3+5"), true); + assert_eq!(check_math_exp("3 a 5"), false); + assert_eq!(check_math_exp("3 + 5 - 1 / 4 % 8"), true); +} + diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/swift/kontroldev.swift" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/swift/kontroldev.swift" new file mode 100644 index 0000000000..645c6292c6 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/swift/kontroldev.swift" @@ -0,0 +1,48 @@ +/* + Crea una función que reciba una expresión matemática (String) + y compruebe si es correcta. Retornará true o false. + - Para que una expresión matemática sea correcta debe poseer + un número, una operación y otro número separados por espacios. + Tantos números y operaciones como queramos. + - Números positivos, negativos, enteros o decimales. + - Operaciones soportadas: + - * / % + + Ejemplos: + "5 + 6 / 7 - 4" -> true + "5 a 6" -> false + */ + +import Foundation + +func verificarExpresionMatematica(_ expresion: String) -> Bool { + let operaciones: Set = ["+", "-", "*", "/", "%"] + let componentes = expresion.components(separatedBy: .whitespaces) + + if componentes.count % 2 == 0 { + return false // La cantidad de componentes debe ser impar (número-op- número-op-...- número) + } + + for (indice, componente) in componentes.enumerated() { + if indice % 2 == 0 { + if let _ = Double(componente) { + continue // Componente es un número válido, continuar al siguiente + } else { + return false // Componente no es un número válido + } + } else { + if operaciones.contains(componente.first ?? Character("")) { + continue // Componente es una operación válida, continuar al siguiente + } else { + return false // Componente no es una operación válida + } + } + } + + return true // La expresión es correcta +} + +let expresion1 = "5 + 6 / 7 - 4" +let expresion2 = "5 a 6" + +print(verificarExpresionMatematica(expresion1)) // true +print(verificarExpresionMatematica(expresion2)) // false diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/typescript/albertovf.ts" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/typescript/albertovf.ts" new file mode 100644 index 0000000000..e47e835bc3 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/typescript/albertovf.ts" @@ -0,0 +1,14 @@ +const reto = (operacion: string): boolean => { + let v = false; + try { + let resultado = eval(operacion); + v = true; + } catch (error) { + v = false; + } + console.log(`${operacion} -> ${v}`); + return v; +}; + +reto("5 + 6 / 7 - 4"); +reto("5 a 6"); diff --git "a/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/typescript/miquelangelamengual.ts" "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/typescript/miquelangelamengual.ts" new file mode 100644 index 0000000000..1bcbce94b4 --- /dev/null +++ "b/Retos/Reto #28 - EXPRESI\303\223N MATEM\303\201TICA [Media]/typescript/miquelangelamengual.ts" @@ -0,0 +1,11 @@ +const checkMathExpression = (expression: string): boolean => { + try { + eval(expression); + return true; + } catch (error) { + return false; + } +}; + +console.log(checkMathExpression("5 + 6 / 7 - 4")); +console.log(checkMathExpression("5 a 6")); diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/c#/CarlosDPabon.cs" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/c#/CarlosDPabon.cs" new file mode 100644 index 0000000000..3ce683e8dd --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/c#/CarlosDPabon.cs" @@ -0,0 +1,10 @@ +string txtOriginal = "mi nombre es grilloneithor"; +string txtAlterado = "mI nombro es gri110neith0r"; +List caracteres = new List(); + +for (int i = 0; i < txtOriginal.Length; i++) +{ + if (txtOriginal.Substring(i, 1) != txtAlterado.Substring(i, 1)) caracteres.Add(txtAlterado.Substring(i, 1)); +} + +Console.WriteLine(string.Concat(txtOriginal, " / ", txtAlterado, " -> ", string.Concat(caracteres))); \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/c#/JonAFernan.cs" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/c#/JonAFernan.cs" new file mode 100644 index 0000000000..3490379e36 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/c#/JonAFernan.cs" @@ -0,0 +1,64 @@ +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + + +namespace reto; +class Program +{ + static void Main(string[] args) + { + + FindDifferences("Me llamo mouredev" , "Me llamo mouredev"); // No differences found + FindDifferences("Me llamo mouredev" , "Me llamo Paco"); // Error. Different length. + FindDifferences("Me llamo brais moure" , "Me llamo.Brais Moure"); // [".", "B", "M"] + + } + + static void FindDifferences(string originalInput , string inputToCheck ) + { + List differences = new List(); + bool firstDifference = true; + + if(originalInput.Length != inputToCheck.Length) + { + + Console.WriteLine("Error. Different length."); + return; + + } + + for (int i = 0; i < originalInput.Length; i++) + { + if(originalInput[i] != inputToCheck[i]) differences.Add(inputToCheck[i]); + } + + if(differences.Count != 0) + { + Console.Write("["); + foreach(char item in differences) + { + Console.Write(firstDifference ? "" : ", "); + Console.Write($"\"{item}\""); + firstDifference = false; + + } + Console.Write("]"); + } + + else Console.WriteLine("No differences found"); + + + + } +} diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/c++/ubbeck.cpp" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/c++/ubbeck.cpp" new file mode 100644 index 0000000000..44db34c933 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/c++/ubbeck.cpp" @@ -0,0 +1,73 @@ +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + +#include +#include +#include +using namespace std; + +vector stringCheck(const string &str1, const string &str2); +void printVector(const vector &vec); + +int main(){ + + string str1 = "Me llamo mouredev"; + string str2 = "Me llemo mouredov"; + + vector result = stringCheck(str1, str2); + printVector(result); + + str1 = "Me llamo.Brais Moure"; + str2 = "Me llamo brais moure"; + result.clear(); + result = stringCheck(str1, str2); + printVector(result); + + str1 = "Me llamo brais moure"; + str2 = "Me llamo brais"; + result.clear(); + result = stringCheck(str1, str2); + printVector(result); + + return 0; +} + +vector stringCheck(const string &str1, const string &str2){ + + vector arr; + + if(str1.length() != str2.length()){ + cout << "Strings are not the same length" << endl; + return arr; + } + + for(unsigned int i = 0; i < str1.length(); i++){ + if(str1[i] != str2[i]){ + arr.push_back(str2[i]); + } + } + return arr; +} + +void printVector(const vector &vec){ + + cout << "["; + for (unsigned int i = 0; i < vec.size(); ++i) { + cout << " '" << vec[i] << "'"; + if (i < vec.size() - 1) { + cout << ","; + } + } + cout << " ]" << endl; +} \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/cobol/fernandoomarinn.cbl" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/cobol/fernandoomarinn.cbl" new file mode 100644 index 0000000000..5e917389c6 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/cobol/fernandoomarinn.cbl" @@ -0,0 +1,61 @@ + ****************************************************************** + * Author: Fernando Marin + * Date: 22/07/2023 + * Purpose: Retro de programacion 29 MoureDev + * Tectonics: cobc + ****************************************************************** + IDENTIFICATION DIVISION. + PROGRAM-ID. RETO29. + DATA DIVISION. + FILE SECTION. + WORKING-STORAGE SECTION. + + 01 TABLA. + 03 REPETIDAS PIC X(1) VALUE '*' OCCURS 140 . + + 01 FRASE1 PIC X(140). + 01 FRASE2 PIC X(140). + + 01 INDICE PIC 9(3). + 01 INDICE-TABLA PIC 9(2) VALUE 1. + PROCEDURE DIVISION. + MAIN-PROCEDURE. + + * COMO COBOL ES UN POQUITO ESPECIAL NO PUEDO DEVOLVER + * EL RESULTADO EN UN ARRAY, ASI QUE LO DEVUELVO EN UNA + * TABLA DE COBOL, QUE SERIA LO MAS PARECIDO QUE HAY A UN ARRAY. + + + * SE ACEPTAN AMBAS FRASES. + DISPLAY "Introduce una frase de 140 caracteres." + ACCEPT FRASE1 + + DISPLAY "Introduce la otra frase parecida." + ACCEPT FRASE2 + + *--------------------------------------------------------------- + * SE COMPRUEBA LETRA A LETRA SI SON IGUALES. + * SI NO LO SON, SE GUARDA EL VALOR EN LA TABLA + PERFORM VARYING INDICE + FROM 1 BY 1 + + UNTIL INDICE = 140 + + IF FRASE1(INDICE:1) NOT = FRASE2(INDICE:1) THEN + MOVE FRASE1(INDICE:1) TO REPETIDAS(INDICE-TABLA) + ADD 1 TO INDICE-TABLA + END-IF + + END-PERFORM + + *----------------------------------------------------------------- + * AL FINAL, SE IMPRIMEN LOS VALORES DE LA TABLA + MOVE 1 TO INDICE-TABLA + + PERFORM UNTIL REPETIDAS(INDICE-TABLA) = '*' + DISPLAY REPETIDAS(INDICE-TABLA) + ADD 1 TO INDICE-TABLA + END-PERFORM + + STOP RUN. + END PROGRAM RETO29. diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/ejercicio.md" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/ejercicio.md" new file mode 100644 index 0000000000..1f2223f8a6 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/ejercicio.md" @@ -0,0 +1,25 @@ +# Reto #29: El carácter infiltrado +#### Dificultad: Fácil | Publicación: 17/07/23 | Corrección: 24/07/23 + +## Enunciado + +``` +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ +``` +#### Tienes toda la información extendida sobre los retos de programación semanales en **[retosdeprogramacion.com/semanales2023](https://retosdeprogramacion.com/semanales2023)**. + +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/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/go/KevinED11.go" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/go/KevinED11.go" new file mode 100644 index 0000000000..4011a93a7d --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/go/KevinED11.go" @@ -0,0 +1,27 @@ +package main + +import ( + "fmt" + "log" +) + +func differenceBetweenStrings(s1, s2 string) []string { + if len(s1) != len(s2) { + log.Fatal("the strings must have the same length") + } + + var diference []string + for i := 0; i < len(s1); i++ { + if s1[i] != s2[i] { + diference = append(diference, string(s2[i])) + } + } + + return diference + +} + +func main() { + fmt.Println(differenceBetweenStrings("abc", "abd")) + +} diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/go/blackriper.go" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/go/blackriper.go" new file mode 100644 index 0000000000..34b3d81dd6 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/go/blackriper.go" @@ -0,0 +1,52 @@ +package main + +import ( + "fmt" + "errors" + ) + +// metodos para resolver el ejercicio +type Infiltrate interface{ + IsSame() (bool,error) + FindInfilters() +} + +// tipo de dato para trabajar +type Format struct{ + Text1 string + Text2 string +} + +// metodo para saber si ambos textos tienen la misma longitud +func (f *Format) IsSame() (bool,error){ + if len(f.Text1) != len(f.Text2){ + return false,errors.New("the texts must have the same length") + } + return true,nil +} + +// metodo para encontrar las diferencias convirtiendo los textos a char o rune +func (f *Format) FindInfilters(){ + var formatErrors []string + text2:=[]rune(f.Text2) + + for indx,t1:= range f.Text1{ + if string(t1)!= string(text2[indx]){ + formatErrors= append(formatErrors,string(text2[indx])) + } + } + + fmt.Printf("%v / %v -> %v \n",f.Text1,f.Text2,formatErrors) +} + + +func main() { + var infl Infiltrate=&Format{Text1:"Me llamo mouredev ",Text2:"Me llemo mouredov "} + same,err:=infl.IsSame() + if err!=nil{ + panic(err) + } + if same{ + infl.FindInfilters() + } +} diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/go/jassoncu.go" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/go/jassoncu.go" new file mode 100644 index 0000000000..f081f09b39 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/go/jassoncu.go" @@ -0,0 +1,49 @@ +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + +package main + +import ( + "fmt" +) + +func findDifferentCharacters(str1, str2 string) []string { + if len(str1) != len(str2) { + return nil + } + + differentCharacters := []string{} + + for i := 0; i < len(str1); i++ { + if str1[i] != str2[i] { + differentCharacters = append(differentCharacters, string(str1[i])) + } + } + + return differentCharacters +} + +func main() { + str1 := "Me llamo-Jasson" + str2 := "Me llamo Jasson" + + result := findDifferentCharacters(str1, str2) + fmt.Println(result) + + str1 = "Me llamo.Jasson Cu" + str2 = "Me llamo Jasson Cu" + + result = findDifferentCharacters(str1, str2) + fmt.Println(result) +} \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/java/Qv1ko.java" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/java/Qv1ko.java" new file mode 100644 index 0000000000..17de4f27cb --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/java/Qv1ko.java" @@ -0,0 +1,29 @@ +import java.util.ArrayList; + +public class Qv1ko { + + public static void main(String[] args) { + infiltrating("The infiltrated character", "The infiltr4ted-character"); + } + + private static void infiltrating(String base, String str) { + + ArrayList infiltrators = new ArrayList(); + + if (base.length() == str.length()) { + + for (int i = 0; i < base.length(); i++) { + + if (base.charAt(i) != str.charAt(i)) { + infiltrators.add(Character.toString(str.charAt(i))); + } + + } + + } + + System.out.println(infiltrators); + + } + +} diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/java/SoleSasia.java" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/java/SoleSasia.java" new file mode 100644 index 0000000000..a1f28b49fb --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/java/SoleSasia.java" @@ -0,0 +1,43 @@ +import java.util.ArrayList; + +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + +public class Main { + public static void main(String[] args) { + + System.out.println(infiltratingCharacters("A que no me encuentras", "A qu3-no me encuentres")); // [3, -, e] + + } + + public static Object infiltratingCharacters(String text1, String text2) { + ArrayList infiltratingCharacters = new ArrayList<>(); + + //comprobar longitud + if (text1.length() != text2.length()) { + return "Las cadenas de texto no tienen la misma longitud"; + } else { + //comparar caracteres + char[] charText1 = text1.toCharArray(); + char[] charText2 = text2.toCharArray(); + for (int i = 0; i < charText1.length; i++) { + if (charText1[i] != charText2[i]) { + String str = String.valueOf(charText2[i]); + infiltratingCharacters.add(str); + } + } + return infiltratingCharacters; + } + } +} diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/java/magdielina.java" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/java/magdielina.java" new file mode 100644 index 0000000000..7b62968524 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/java/magdielina.java" @@ -0,0 +1,22 @@ +import java.util.*; +import java.lang.String; + +class Magdielina { + + public static void main(String[] args) { + System.out.println(getInfiltratorChacarters("Me llamo Magdiel Linares","Me llamo Magdiel Linares")); + } + + private static List getInfiltratorChacarters(String text1, String text2){ + List infiltratorCharacters = new ArrayList<>(); + if(text1 != null && text2 != null && text1.length() == text2.length()) { + int length = text1.length(); + for (int i = 0; i < length; i++){ + if (text1.charAt(i) != text2.charAt(i)){ + infiltratorCharacters.add(text1.charAt(i)); + } + } + } + return infiltratorCharacters; + } +} \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/HectorIglesias.js" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/HectorIglesias.js" new file mode 100644 index 0000000000..0e36e07625 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/HectorIglesias.js" @@ -0,0 +1,30 @@ +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + +function comparar_cadenas(cadena_1, cadena_2){ + let aux= new Array + if(cadena_1.length == cadena_2.length){ + for(let i=0; i ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + +const cadena1 = "Me llamo mouredev"; +const cadena2 = "Me llemo mouredov"; +const cadena3 = "Me llamo.Brais Moure"; +const cadena4 = "Me llamo brais moure"; + +const buscaDif = (str1, str2) => { + console.log("\n"); + console.log(str1); + console.log(str2); + if (str1.length !== str2.length) return "No tienen la misma longitud\n" + let i = 0; + let arr = []; + while (i < str1.length) { + if (str1.charAt(i) !== str2.charAt(i)) {arr.push(str2.charAt(i))} + i++; + } + return arr +} + +console.log(buscaDif(cadena1, cadena2)); //["e","o"] +console.log(buscaDif(cadena3, cadena4)); //[" ", "b", "m"] +console.log(buscaDif(cadena1, cadena4)); //No tienen la misma longitud + diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/jmedinac1987.js" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/jmedinac1987.js" new file mode 100644 index 0000000000..5c457aa570 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/jmedinac1987.js" @@ -0,0 +1,22 @@ +function AreTheyTheSameText(textOne, textTwo) { + let arrayTextOne = textOne.split(""); + let arrayTextTwo = textTwo.split(""); + let arrayResult = []; + + if (arrayTextOne.length !== arrayTextTwo.length) + return "they are texts with different lengths"; + + for (let i = 0; i < arrayTextOne.length; i++) { + if (arrayTextOne[i] !== arrayTextTwo[i]) { + arrayResult.push(arrayTextTwo[i]); + } + } + + if (arrayResult.length == 0) return "the texts are the same"; + + return arrayResult; +} + +console.log(AreTheyTheSameText("Me llamo mouredev", "Me llemo mouredov")); +console.log(AreTheyTheSameText("Me llamo.Brais Moure", "Me llamo brais moure")); +console.log(AreTheyTheSameText("Me llamo George y está es mi historia", "Me llamo George y está es mi historia")); diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/marcode24.js" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/marcode24.js" new file mode 100644 index 0000000000..7b77a660a2 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/marcode24.js" @@ -0,0 +1,30 @@ +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + +const findCharInfiltrated = (str1, str2) => { + if (str1.length !== str2.length) { + return 'Las cadenas no tienen la misma longitud'; + } + + const charInfiltrated = []; + str1.split('').forEach((char, index) => { + if (char !== str2[index]) { + charInfiltrated.push(str2[index]); + } + }); + + return charInfiltrated; +}; + +// Visita mi repo en GitHub para ver y correr los tests de este código --> https://github.com/marcode24/weekly-challenges diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/nlarrea.js" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/nlarrea.js" new file mode 100644 index 0000000000..ef3d5af5f0 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/nlarrea.js" @@ -0,0 +1,49 @@ +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + +/** + * Function that receives two texts of the same length and returns the + * different characters of the second one. + * + * @param {String} textOne Main text to compare + * @param {String} textTwo Second text to compare + * @returns {Array} Array containing the different characters + */ +function infiltratedCharacters(textOne, textTwo) { + const infiltratedChars = []; + const lengthOne = textOne.length; + + if (lengthOne !== textTwo.length) { + console.log("Both texts must be equal in length!"); + return []; + } + + for (let i=0; i prints: Both texts must be equal in length! +console.log(infiltratedCharacters("Me llamo Brais Moure", "Me llamo Brais Moure")); // [] -> prints: Both texts are the same! \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/othamae.js" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/othamae.js" new file mode 100644 index 0000000000..8944648846 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/othamae.js" @@ -0,0 +1,32 @@ +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + + + +const findDifferentChars = (str1, str2) => { + if (str1.length !== str2.length) { + return "The strings must have the same length" + } + const differentChars = []; + for (let i = 0; i < str1.length; i++) { + if (str1[i] !== str2[i]) { + differentChars.push(str2[i]) + } + } + + return differentChars +} + +console.log(findDifferentChars("Me llamo mouredev", "Me llemo mouredov")) +console.log(findDifferentChars("Me llamo.Brais Moure", "Me llamo brais moure")) \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/pcelman.js" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/pcelman.js" new file mode 100644 index 0000000000..6fd1aab874 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/pcelman.js" @@ -0,0 +1,27 @@ +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + + +function findChangingCharacters(string1, string2) { + let changingCharacters = []; + for (let i = 0; i < string1.length; i++) { + if (string1[i] !== string2[i]) { + changingCharacters.push(string2[i]); + } + } + return changingCharacters; + } + + console.log(findChangingCharacters("hello paula", "hello Paule")); + \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/pepegonzale.js" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/pepegonzale.js" new file mode 100644 index 0000000000..d94ef1448d --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/pepegonzale.js" @@ -0,0 +1,42 @@ +/* # Reto #29: El carácter infiltrado +#### Dificultad: Fácil | Publicación: 17/07/23 | Corrección: 24/07/23 + +## Enunciado + +``` +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + +const caracter_infiltrado = (primera_palabra, segunda_palabra) => { + const caracteres = [] + + if (primera_palabra.length === segunda_palabra.length) { + for (var i = 0; i < primera_palabra.length; i++) { + if (primera_palabra[i] !== segunda_palabra[i]) { + caracteres.push(segunda_palabra[i]) + } + } + + } + else { + return "La longitud de ambas cadenas tiene que ser la misma" + } + + return caracteres; +} + + + +console.log(caracter_infiltrado("Hola mundo", "hola.Mundo")) +console.log(caracter_infiltrado('Me llamo.Brais Moure', 'Me llamo brais moure')); \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/test0n3.js" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/test0n3.js" new file mode 100644 index 0000000000..0bf7049d6d --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/javascript/test0n3.js" @@ -0,0 +1,44 @@ +const findDiff = (sentence1, sentence2) => { + let diff = []; + if (sentence1.length != sentence2.length) { + return false; + } + for (let i = 0; i < sentence1.length; i++) { + if (sentence1[i] != sentence2[i]) { + diff.push(sentence2[i]); + } + } + return diff; +}; + +const tests = { + input: [ + ["Me llamo mouredev", "Me llemo mouredov"], + ["Me llamo.Brais Moure", "Me llamo brais moure"], + ["first sentence", "second sentence"], + ["first sentence", "second sentence"], + ], + expecteds: [ + ["e", "o"], + [" ", "b", "m"], + false, + ["s", "e", "c", "o", "n", "d"], + ], +}; + +let errors = 0; +tests.input.forEach((test, index) => { + const result = findDiff(test[0], test[1]); + if (JSON.stringify(result) == JSON.stringify(tests.expecteds[index])) { + console.log( + `Success - input: ${test[0]}, ${test[1]}, expected: ${tests.expecteds[index]}` + ); + } + if (JSON.stringify(result) != JSON.stringify(tests.expecteds[index])) { + errors += 1; + console.log( + `Error - input: ${test[0]},${test[1]}, expected: ${tests.expecteds[index]}, result: ${result}` + ); + } +}); +console.log(`Errors: ${errors}`); diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/kotlin/marchdz.kt" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/kotlin/marchdz.kt" new file mode 100644 index 0000000000..a846cfc729 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/kotlin/marchdz.kt" @@ -0,0 +1,20 @@ +fun findDistinctChars(firstString: String, secondString: String): Any { + val distinctChars = mutableListOf() + return if (firstString.length == secondString.length) { + for (index in firstString.indices) { + if (firstString[index] != secondString[index]) { + distinctChars += secondString[index] + } + } + distinctChars.ifEmpty { "Las cadenas de texto son iguales" } + } else { + distinctChars.ifEmpty { "Las cadenas de texto deben tener la misma longitud" } + } +} + +fun main() { + println(findDistinctChars("Me llamo mouredev", "Me llemo mouredov")) // [e, o] + println(findDistinctChars("Me llamo.Brais Moure", "Me llamo brais moure")) // [ , b, m] + println(findDistinctChars("Me llamo.Brais Moure", "Me llamo brais moure ")) // Las cadenas de texto deben tener la misma longitud + println(findDistinctChars("Me llamo mouredev", "Me llamo mouredev")) // Las cadenas de texto son iguales +} \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/kotlin/pisanowp.kt" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/kotlin/pisanowp.kt" new file mode 100644 index 0000000000..b731edd0bb --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/kotlin/pisanowp.kt" @@ -0,0 +1,53 @@ +fun main() { + + /* + * Reto #29 17/07/2023 EL CARÁCTER INFILTRADO + * + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + + + //val cadena1 = "Me llamo mouredev" + //val cadena2 = "Me llemo mouredov" + + val cadena1 = "Me llamo.Brais Moure" + val cadena2 = "Me llamo brais moure" + + val infiltrados = buscaCaracteresInfiltrados(cadena1, cadena2) + println(infiltrados) + +} + +fun buscaCaracteresInfiltrados(cadena1: String, cadena2: String): List { + val infiltrados = mutableListOf() + + if (cadena1.length != cadena2.length) { + println("¡¡¡ LAS CADENAS NO TIENEN LA MISMA LONGITUD !!!") + + } else { + + cadena1.forEachIndexed { index, c1 -> + + val c2 = cadena2[index] + //println("[${index}] => $c1 $c2") + if (c1 != c2) { + infiltrados.add(c2) + } + + } + + } + + return infiltrados + +} \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/objective-C/AngelZC790347.m" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/objective-C/AngelZC790347.m" new file mode 100644 index 0000000000..903caafd7e --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/objective-C/AngelZC790347.m" @@ -0,0 +1,31 @@ +#import + +// clang -framework Foundation AngelZC790347.m && ./a.out && rm a.out <- Ejecutar + +NSArray* filtrarCaracteres(NSString* frase1 ,NSString* frase2){ + NSMutableArray* result = [NSMutableArray new]; + if (frase1.length != frase2.length) + { + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Las frases deben ser de la misma longitud" userInfo:nil]; + } + for (int i = 0; i < frase1.length; ++i) + { + if ([frase1 characterAtIndex:i] != [frase2 characterAtIndex:i]) + { + unichar a = [frase2 characterAtIndex:i]; + [result addObject:[NSString stringWithCharacters:&a length:1]]; + } + } + return result; +} + +int main() +{ + @try{ + NSArray* res = filtrarCaracteres(@"Me llamo.Brais Moure", @"Me llamo brais moure"); + NSLog(@"%@",[res description]); + }@catch(NSException* e){ + NSLog(@"%@",e.reason); + } + return 0; +} \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/php/LucasSantillan.php" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/php/LucasSantillan.php" new file mode 100644 index 0000000000..fc702aa658 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/php/LucasSantillan.php" @@ -0,0 +1,19 @@ + diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/AnzurezDev.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/AnzurezDev.py" new file mode 100644 index 0000000000..d47fe2f53c --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/AnzurezDev.py" @@ -0,0 +1,24 @@ +def getinfiltrate(text_one:str, text_two:str): + lenOne = len(text_one) + lenTwo = len(text_two) + result = [] + + if lenOne!=lenTwo: + return "The text strings must have the same length" + + for i in range(lenOne): + if text_one[i] != text_two[i]: + result.append(text_two[i]) + + differences = len(result) + difference_percentage = int(differences*100 / lenOne) + + if difference_percentage>50: + return f"The text strings are {difference_percentage}% different" + + return result + +print( getinfiltrate("This is a text", "This is the tex") ) # The text strings must have the same length +print( getinfiltrate("This is a test", "This is a test") ) # [] +print( getinfiltrate("I'm AnzurezDev", "I.m AnzurezDEV") ) # ['.', 'E', 'V'] +print( getinfiltrate("This my test 1", "The first test") ) # The text strings are 78% different \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Engleonardorm7.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Engleonardorm7.py" new file mode 100644 index 0000000000..4f58074e47 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Engleonardorm7.py" @@ -0,0 +1,11 @@ + +def characters(first, second): + char = [] + if len(first) == len(second): + for index in range(0, len(first)): + if first[index] != second[index]: + char.append(second[index]) + + return char + +print(characters("anita lava la tina", "anito lavo la tina")) diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Hugovrc.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Hugovrc.py" new file mode 100644 index 0000000000..37deca0490 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Hugovrc.py" @@ -0,0 +1,13 @@ +def caracter_infiltrado(cadena: str, cadena2: str): + lista_caracteres = [] + + size = min(len(cadena), len(cadena2)) + + for indice in range(size): + if cadena[indice] != cadena2[indice]: + lista_caracteres.append(cadena2[indice]) + + print(lista_caracteres) + +caracter_infiltrado("hola meure gracias por los retos", "hola.moure gracias por los retos") +caracter_infiltrado("me,llamo Hugo", "me llamo+hugo") diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/KevinED11.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/KevinED11.py" new file mode 100644 index 0000000000..fca1253bdb --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/KevinED11.py" @@ -0,0 +1,29 @@ +from functools import lru_cache +from typing import Optional + +class InvalidLengthError(Exception): + def __init__(self, message: str) -> None: + super().__init__(message) + + +@lru_cache() +def difference_between_strings(first_text: str, second_text: str) -> list[Optional[str]]: + if len(first_text) != len(second_text): + raise InvalidLengthError("The length of the texts must be equal") + + return [b for a, b in zip(first_text, second_text) if a != b] + + +def main() -> None: + first_text = "Hola me llamo kevin" + second_text = "hola Me llamo kevin" + + try: + diference = difference_between_strings(first_text=first_text, second_text=second_text) + print(diference) + except InvalidLengthError as err: + print(err) + +if __name__ == "__main__": + main() + diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Lemito66.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Lemito66.py" new file mode 100644 index 0000000000..c64087f03c --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Lemito66.py" @@ -0,0 +1,30 @@ +""" + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] +""" + +def find_difference(string_one: str , string_two: str) -> list: + difference = [] + if len(string_one) != len(string_two): + return "Ambas cadenas de texto deben ser iguales en longitud." + + for word in range(len(string_one)): + if string_one[word] != string_two[word]: + difference.append(string_two[word]) + return difference + +print(find_difference("Me llamo mouredev", "Me llemo mouredov")) +print(find_difference("Me llamo.Brais Moure", "Me llamo brais moure")) + +print(find_difference('abc', 'abc')) +print(find_difference('abc', 'abcd')) +print(find_difference('a!b@c#', 'a!b@d#')) \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/ORomero227.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/ORomero227.py" new file mode 100644 index 0000000000..3614095feb --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/ORomero227.py" @@ -0,0 +1,33 @@ +""" +Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] +""" + + +def search_infiltred(cadena_1=str, cadena_2=str): + """Funcion para buscar el caracter infiltrado""" + original = list(cadena_1) + verificar = list(cadena_2) + infiltrados = list() + + if len(original) == len(verificar): + for i in range(1, len(original)): + if original[i] != verificar[i]: + infiltrados += verificar[i] + return infiltrados + else: + return "La longitud entre ambas no es la misma!" + + +print(search_infiltred("Me llamo mouredev", "Me llemo mouredov")) +print(search_infiltred("Me llamo.Brais Moure", "Me llamo brais moure")) +print(search_infiltred("Juan", "Juan del Pueblo")) diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Rusian69.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Rusian69.py" new file mode 100644 index 0000000000..1ad13dff8f --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/Rusian69.py" @@ -0,0 +1,31 @@ +""" + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] +""" +#string_1:str, string_2:str +def indentificator (string_1:str, string_2:str): + try: + vaule = 0 + list_result = [] + if len(string_1) == len(string_2): + for index in string_1: + if index != string_2[vaule]: + list_result.append(index) + vaule += 1 + elif len(string_1) > len(string_2): + return(f"la longitud del string_1 es de {len(string_1)} la cual es superior a la del string_2 que es de {len(string_2)}") + else: + return(f"la longitud del string_1 es de {len(string_2)} la cual es superior a la del string_2 que es de {len(string_1)}") + return(list_result) + except: + return("ERROR") +print(indentificator("Hola como.estas", "hoLa como estas?")) diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/SantiALS.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/SantiALS.py" new file mode 100644 index 0000000000..d420555742 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/SantiALS.py" @@ -0,0 +1,44 @@ +''' +* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + * +''' + +def matching (string_one: str, string_two: str): + + equals = [] + + if len(string_one) != len(string_two): + + return print('Las cadenas son de distinto largo') + else: + count = 0 + + for caracter in string_two: + + if caracter != string_one[count]: + equals.append(caracter) + + count += 1 + + + return equals + +if __name__ == '__main__': + + string_one = 'Me llamo mouredev' + string_two = 'Me llemo mouredov' + print(matching(string_one,string_two)) + string_one = 'Me llamo.Brais Moure' + string_two = 'Me llamo brais moure' + print(matching(string_one,string_two)) \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/alberba.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/alberba.py" new file mode 100644 index 0000000000..d1a861a324 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/alberba.py" @@ -0,0 +1,11 @@ +def same_text(text1: str, text2: str): + if len(text1) != len(text2): + return "Tiene que tener la misma longitud" + else: + diff_characters= [] + for i in range(0, len(text1)): + if text1[i] != text2[i]: + diff_characters.append(text2[i]) + return text1 + " / " + text2 + " -> " + str(diff_characters) + +print(same_text("Hola.me llamo Lucas", "Hola me llamo Lucas")) \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/alvaruncio.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/alvaruncio.py" new file mode 100644 index 0000000000..7009688004 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/alvaruncio.py" @@ -0,0 +1,32 @@ +""" + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + """ + + +def infiltrated_character(string_1, string_2): + different_characters = [] + if len(string_1) != len(string_2): + return "Las cadenas de texto no son del mismo tamaño" + else: + for i in range(len(string_1)): + character_1 = string_1[i] + character_2 = string_2[i] + if character_1 == character_2: + continue + else: + different_characters.append(character_2) + return different_characters + +print(infiltrated_character("Me llamo.Brais Moure", "Me llamo brais moure")) + + \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/drifterDev.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/drifterDev.py" new file mode 100644 index 0000000000..ffee8dfba7 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/drifterDev.py" @@ -0,0 +1,24 @@ +def comparar_cadenas(cadena1: str, cadena2: str) -> list[str]: + n = len(cadena1) + m = len(cadena2) + s = min(n, m) + letras_diferentes = [] + for i in range(s): + if cadena1[i] != cadena2[i]: + letras_diferentes.append(cadena2[i]) + if n > m: + for k in range(m, n): + letras_diferentes.append("") + elif m > n: + for j in range(n, m): + letras_diferentes.append(cadena2[j]) + return letras_diferentes + + +# Se debe ingresar primero la cadena original +# y luego la cadena a comparar, ambas separadas por un salto de linea. +if __name__ == "__main__": + cadena1 = input().strip() + cadena2 = input().strip() + letras_diferentes = comparar_cadenas(cadena1, cadena2) + print(letras_diferentes) diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/fjgonzalezbarea.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/fjgonzalezbarea.py" new file mode 100644 index 0000000000..0ba8fea0a5 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/fjgonzalezbarea.py" @@ -0,0 +1,53 @@ +""" + Crea una función que reciba dos cadenas de texto casi iguales, a excepción de uno o varios caracteres. + La función debe encontrarlos y retornarlos en formato lista/array. + - Ambas cadenas de texto deben ser iguales en longitud. + - Las cadenas de texto son iguales elemento a elemento. + - No se pueden utilizar operaciones propias del lenguaje + que lo resuelvan directamente. + + Ejemplos: + - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + + Ejecutar tests: + python -m fjgonzalezbarea "test" + + Ejecutar función con argumentos + python -m fjgonzalezbarea "Me llamo mouredev" "Me llemo mouredov" +""" +import sys + + +def find_differences(str1, str2): + return [str2[index] for index in range(len(str1)) if str1[index] != str2[index]] + + +def main(str1, str2): + if len(str1) != len(str2): + raise ValueError(f"Strings must have same length, however first string length is {len(str1)} and second string length is {len(str2)}") + + differences_list = find_differences(str1, str2) + print(f"The list of different characters is: {differences_list}") + +# Better in a separate file, but to accomplish rules for Pull Request :-) +def test_find_difference(): + str1 = "Me llamo mouredev" + str2 = "Me llemo mouredov" + difference = find_differences(str1, str2) + assert difference == ["e", "o"] + + str3 = "Me llamo.Brais Moure" + str4 = "Me llamo brais moure" + difference_2 = find_differences(str3, str4) + assert difference_2 == [" ", "b", "m"] + print("Tests successfully executed!") + + +if __name__ == "__main__": + if sys.argv[1] == "test": + test_find_difference() + elif len(sys.argv[1:]) == 2: + main(sys.argv[1], sys.argv[2]) + else: + raise ValueError("Unexpected arguments.") diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/francisco-88.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/francisco-88.py" new file mode 100644 index 0000000000..a935b2d97e --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/francisco-88.py" @@ -0,0 +1,32 @@ +def busca_caracteres_distintos(s1, s2): + caracteres_distintos = [] # lista para almacenar los caracteres diferentes + + # Recorrer las cadenas de texto + for c1, c2 in zip(s1, s2): + if c1 != c2: + caracteres_distintos.append(c2) + + return caracteres_distintos + +# Contador de intentos +intentos = 0 + +while intentos < 3: + # Solicitar las cadenas al usuario + s1 = input("Por favor, ingresa la primera cadena de texto: ") + s2 = input("Por favor, ingresa la segunda cadena de texto: ") + + # Verificar si las cadenas tienen la misma longitud + if len(s1) != len(s2): + print("Las cadenas deben tener la misma longitud. Inténtalo de nuevo.") + intentos += 1 + continue + + # Calcular y mostrar los caracteres diferentes + caracteres_distintos = busca_caracteres_distintos(s1, s2) + print("Los caracteres diferentes en las cadenas de texto son:", caracteres_distintos) + break # Salir del bucle si todo salió bien + +# En caso de agotar los intentos +if intentos == 3: + print("Has superado el número máximo de intentos.") \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/gonsomito.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/gonsomito.py" new file mode 100644 index 0000000000..1fb10be7eb --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/gonsomito.py" @@ -0,0 +1,50 @@ +""" + Crea una función que reciba dos cadenas de texto casi iguales, a excepción de uno o varios caracteres. + La función debe encontrarlos y retornarlos en formato lista/array. + - Ambas cadenas de texto deben ser iguales en longitud. + - Las cadenas de texto son iguales elemento a elemento. + - No se pueden utilizar operaciones propias del lenguaje que lo resuelvan directamente. + + Ejemplos:Reto #29 - EL CARÁCTER INFILTRADO + - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] +""" + +def compara_cadena(cadena1, cadena2): + #iniciamos variables: i para movernos por el array/string lista_diferencias para almacenar diferecias + i=0 + lista_diferencias=[] + #compara tamaños por si no fueran iguales. Si no coincide nos vamos. + if len(cadena1) != len(cadena2): + return "El tamaño es incorrecto" + #recorrer ambas cadenas con el mismo index y comprobar cada carácter. + while i list: + diffs = [] + + one_list = [*sone] + two_list = [*stwo] + + if len(one_list) == len(two_list): + for index,char in enumerate(one_list): + if char == two_list[index]: + continue + else: + diffs.append(two_list[index]) + print(diffs) + return diffs + else: + print(f'Ambas cadenas de texto deben ser iguales en longitud. En este caso, la primera cadena tenía {len(one_list)} y la segunda {len(two_list)}') + + +if __name__ == '__main__': + check_string("hola","hoalii") + check_string("hola","hola") + check_string("Me llamo mouredev","Me llemo mouredov") + check_string("Me llamo.Brais Moure","Me llamo brais moure") + diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/javierfiestasbotella.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/javierfiestasbotella.py" new file mode 100644 index 0000000000..dc765cb364 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/javierfiestasbotella.py" @@ -0,0 +1,9 @@ + +def sherlok(st_1,st_2): + solution=[] + for i in range(len(st_1)): + if st_1[i]!=st_2[i]: + solution.append(st_2[i]) + return solution + + diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/jcdm60.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/jcdm60.py" new file mode 100644 index 0000000000..b817963ff9 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/jcdm60.py" @@ -0,0 +1,41 @@ +# Reto #29: El carácter infiltrado +#### Dificultad: Fácil | Publicación: 17/07/23 | Corrección: 24/07/23 + +## Enunciado + +# +# Crea una función que reciba dos cadenas de texto casi iguales, +# a excepción de uno o varios caracteres. +# La función debe encontrarlos y retornarlos en formato lista/array. +# - Ambas cadenas de texto deben ser iguales en longitud. +# - Las cadenas de texto son iguales elemento a elemento. +# - No se pueden utilizar operaciones propias del lenguaje +# que lo resuelvan directamente. +# +# Ejemplos: +# - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] +# - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + +class StringComparator: + def __init__(self, string1, string2): + self.string1 = string1 + self.string2 = string2 + + def find_differences(self): + if len(self.string1) != len(self.string2): + raise ValueError("Las cadenas deben tener la misma longitud") + + differences = [] + for i in range(len(self.string1)): + if self.string1[i] != self.string2[i]: + differences.append(self.string2[i]) + + return differences + + +if __name__ == "__main__": + string1 = "Me llamo.Brais Moure" + string2 = "Me llamo brais moure" + comparator = StringComparator(string1, string2) + result = comparator.find_differences() + print(result) diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/jpirulo.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/jpirulo.py" new file mode 100644 index 0000000000..8cf2303989 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/jpirulo.py" @@ -0,0 +1,34 @@ +from termcolor import colored + +class ComparadorCadenas: + def __init__(self, cadena1, cadena2): + self.cadena1 = cadena1 + self.cadena2 = cadena2 + self.longitud = len(cadena1) + self.diferencias = [] + + def encontrar_diferencias(self): + for i in range(self.longitud): + if self.cadena1[i] != self.cadena2[i]: + self.diferencias.append(colored(self.cadena2[i], 'red')) + else: + self.diferencias.append(self.cadena2[i]) + + def mostrar_diferencias(self): + print("Diferencias: " + " ".join(self.diferencias)) + +def resaltar_diferencias(func): + def wrapper(*args, **kwargs): + comparador = func(*args, **kwargs) + comparador.encontrar_diferencias() + comparador.mostrar_diferencias() + return wrapper + +@resaltar_diferencias +def obtener_cadenas(): + cadena1 = input("Ingrese la primera cadena de texto: ") + cadena2 = input("Ingrese la segunda cadena de texto: ") + return ComparadorCadenas(cadena1, cadena2) + +if __name__ == "__main__": + obtener_cadenas() diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/juanppdev.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/juanppdev.py" new file mode 100644 index 0000000000..a110c7a47f --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/juanppdev.py" @@ -0,0 +1,22 @@ +def encontrar_diferentes(cadena1, cadena2): + if len(cadena1) != len(cadena2): + raise ValueError("Las cadenas de texto deben tener la misma longitud") + + caracteres_diferentes = [] + + for i in range(len(cadena1)): + if cadena1[i] != cadena2[i]: + caracteres_diferentes.append(cadena1[i]) + + return caracteres_diferentes + +# Ejemplos de uso +cadena1 = "Me llamo juanppdev" +cadena2 = "Me lleno juanppdev" +resultado1 = encontrar_diferentes(cadena1, cadena2) +print(resultado1) + +cadena3 = "Me llamo Juan Pablo" +cadena4 = "Me lleno Juan Pablo" +resultado2 = encontrar_diferentes(cadena3, cadena4) +print(resultado2) \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/klyone.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/klyone.py" new file mode 100644 index 0000000000..4cb983e87c --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/klyone.py" @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 + +def calculate_string_diff(str1, str2): + if len(str1) != len(str2): + return [] + + diff = [] + for index in range(len(str1)): + if str1[index] != str2[index]: + diff.append(str2[index]) + + return diff + +if __name__ == "__main__": + print(calculate_string_diff("hola", "heqa")) + print(calculate_string_diff("Me llamo mouredev", "Me llemo mouredov")) + print(calculate_string_diff("Me llamo.Brais Moure", "Me llamo brais moure")) diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/mouredev.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/mouredev.py" new file mode 100644 index 0000000000..2e4585aed2 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/mouredev.py" @@ -0,0 +1,15 @@ +def infiltrated_characters(first_text: str, second_text:str) -> list: + + characters = [] + + if len(first_text) == len(second_text): + for index in range(0, len(first_text)): + if first_text[index] != second_text[index]: + characters.append(second_text[index]) + + return characters + +print(infiltrated_characters("Me llamo mouredev", "Me llemo mouredov")) +print(infiltrated_characters("Me llamo.Brais Moure", "Me llamo brais moure")) +print(infiltrated_characters("Me llamo.Brais Moure", "Me llamo brais moure ")) +print(infiltrated_characters("", "")) \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/nlarrea.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/nlarrea.py" new file mode 100644 index 0000000000..3aba57a5ab --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/nlarrea.py" @@ -0,0 +1,36 @@ +""" + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] +""" + + +def infiltrated_characters(text_one:str, text_two:str) -> list: + """ Function that receives two texts of the same length and returns the + different characters of the second one. """ + + if len(text_one) != len(text_two): + print("Both texts must be equal in length!") + return [] + + infiltrated_chars = [char for index, char in enumerate(text_two) + if char != text_one[index]] + + if len(infiltrated_chars) == 0: + print("Both texts are the same!") + + return infiltrated_chars + + +print(infiltrated_characters("Me llamo mouredev", "Me llemo mouredov")) # ['e', 'o'] +print(infiltrated_characters("Me llamo.Brais Moure", "Me llamo brais moure")) # [' ', 'b', 'm'] +print(infiltrated_characters("Me llamoBrais Moure", "Me llamo brais moure")) # [] -> prints: Both texts must be equal in length! +print(infiltrated_characters("Me llamo Brais Moure", "Me llamo Brais Moure")) # [] -> prints: Both texts are the same! \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/pyramsd.py" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/pyramsd.py" new file mode 100644 index 0000000000..af19930163 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/python/pyramsd.py" @@ -0,0 +1,26 @@ +def diferencia(arg1:str, arg2:str) -> list: + """Resumen + + Args: + arg1: (str) + arg2: (str) + + Raises: + ValueError: Si la longitud de los argumentos no son iguales + + Returns: + list: lista de diferencias entre los argumentos + """ + + if len(arg1) != len(arg2): + raise ValueError("Los argumentos deben ser de la misma longitud") + + lista_diferencia = [] + for i in range(len(arg1)): + if arg1[i] != arg2[i]: + lista_diferencia.append(arg2[i]) + + print(lista_diferencia) + + +diferencia("Me llamo mouredev", "Me llemo mouredov") diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/ruby/test0n3.rb" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/ruby/test0n3.rb" new file mode 100644 index 0000000000..f9ee5d27d3 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/ruby/test0n3.rb" @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +# +# Crea una función que reciba dos cadenas de texto casi iguales, +# a excepción de uno o varios caracteres. +# La función debe encontrarlos y retornarlos en formato lista/array. +# - Ambas cadenas de texto deben ser iguales en longitud. +# - Las cadenas de texto son iguales elemento a elemento. +# - No se pueden utilizar operaciones propias del lenguaje +# que lo resuelvan directamente. +# +# Ejemplos: +# - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] +# - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] +# + +# class Sentence get different characters between two sentences +class Sentence + attr_accessor :sentence1, :sentence2 + + def initialize(sentence1, sentence2) + @sentence1 = sentence1 + @sentence2 = sentence2 + @diff = [] + end + + def find_diff + return false if @sentence1.length != @sentence2.length + + @sentence1.length.times do |i| + @diff << @sentence2[i] if sentence1[i] != sentence2[i] + end + @diff + end +end + +p Sentence.new('Me llamo mouredev', 'Me llemo mouredov').find_diff +p Sentence.new('Me llamo.Brais Moure', 'Me llamo brais moure').find_diff +p Sentence.new('first sentence', 'second sentence').find_diff +p Sentence.new('first sentence', 'second sentence').find_diff diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/rust/vbayarri.rs" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/rust/vbayarri.rs" new file mode 100644 index 0000000000..d5825b7c8f --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/rust/vbayarri.rs" @@ -0,0 +1,85 @@ +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ + +// Funcion que recibe dos cadenas de texto casi iguales y retorna un Vector con los caracteres diferentes +fn find_differences(first_text: &str, second_text: &str) -> Vec { + + // Creamos un vector para almacenar los caracteres diferentes + let mut differences: Vec = Vec::new(); + + // Convertimos las cadenas de texto en vectores de caracteres + let first_text: Vec = first_text.chars().collect(); + let second_text: Vec = second_text.chars().collect(); + + // Recorremos los vectores de caracteres + for i in 0..first_text.len() { + // Si los caracteres son diferentes, lo añadimos al vector de diferencias + if first_text[i] != second_text[i] { + differences.push(second_text[i]); + } + } + + // Retornamos el vector de diferencias + differences.into_iter().collect() +} + +// Funcion para validar las cadenas de texto introducidas por el usuario +fn validate_strings(first_text: &str, second_text: &str) -> bool { + // Comprobamos que las cadenas de texto tengan la misma longitud + if first_text.len() != second_text.len() { + println!("Las cadenas de texto deben tener la misma longitud"); + return false; + } + + // Comprobamos que las cadenas de texto sean iguales + if first_text == second_text { + println!("Las cadenas de texto deben ser diferentes"); + return false; + } + + // Retornamos true si las cadenas de texto son válidas + true +} + +// Funcion para validar las dos cadenas de texto introducidas por el usuario y retornar el vector de diferencias +fn caracter_infiltrado(first_text: &str, second_text: &str) -> Vec { + // Validamos las cadenas de texto + if validate_strings(first_text, second_text) { + // Retornamos el vector de diferencias + find_differences(first_text, second_text) + } else { + // Retornamos un vector vacío + Vec::new() + } +} + +#[test] +fn test1() { + assert_eq!(caracter_infiltrado("Me llamo mouredev", "Me llemo mouredov"), ['e', 'o']); +} + +#[test] +fn test2() { + assert_eq!(caracter_infiltrado("Me llamo.Brais Moure", "Me llamo brais moure"), [' ', 'b', 'm']); +} + +#[test] +fn test3() { + assert_eq!(caracter_infiltrado("Me llamo mouredev", "Me llamo mouredev"), Vec::::new()); +} + +#[test] +fn test4() { + assert_eq!(caracter_infiltrado("Me llamo mouredev", "Me llamo mouredevv"), Vec::::new()); +} \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/swift/kontroldev.swift" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/swift/kontroldev.swift" new file mode 100644 index 0000000000..e9b5306a74 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/swift/kontroldev.swift" @@ -0,0 +1,34 @@ +/* + * Crea una función que reciba dos cadenas de texto casi iguales, + * a excepción de uno o varios caracteres. + * La función debe encontrarlos y retornarlos en formato lista/array. + * - Ambas cadenas de texto deben ser iguales en longitud. + * - Las cadenas de texto son iguales elemento a elemento. + * - No se pueden utilizar operaciones propias del lenguaje + * que lo resuelvan directamente. + * + * Ejemplos: + * - Me llamo mouredev / Me llemo mouredov -> ["e", "o"] + * - Me llamo.Brais Moure / Me llamo brais moure -> [" ", "b", "m"] + */ +import Foundation + +func encontrarCaracteresDiferentes(_ cadena1: String, _ cadena2: String) -> [Character] { + var caracteresDiferentes: [Character] = [] + + let cadena1Array = Array(cadena1) + let cadena2Array = Array(cadena2) + + for i in 0.. { + let diferencias = new Array(); + + try { + if (cadena1.length != cadena2.length) throw new Error("Las cadenas tienen que ser de la misma longitud") + if (typeof (cadena1) != typeof (cadena2)) throw new Error("Las cadenas deben ser del mismo tipo"); + } catch (error) { + console.error(error.message); + return error; + } + + for (let i = 0; i < cadena1.length; i++) { + if (cadena1[i] != cadena2[i]) { + diferencias.push(cadena2[i]) + } + } + + console.log(diferencias); + return diferencias +} + +reto("Me llamo mourdev", "Me llemo mouredov") +reto("Me llamo.Brais Moure", "Me llamo brais moure") \ No newline at end of file diff --git "a/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/typescript/mxtrar23.ts" "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/typescript/mxtrar23.ts" new file mode 100644 index 0000000000..763653c763 --- /dev/null +++ "b/Retos/Reto #29 - EL CAR\303\201CTER INFILTRADO [F\303\241cil]/typescript/mxtrar23.ts" @@ -0,0 +1,37 @@ + +/** + * Funcion para encontrar El carácter infiltrado + * @param {string} firstText + * @param {string} secondText + */ +const getFilteredCharacters = (firstText:string, secondText:string) =>{ + let results : Array = [] + + if(!isLongSame(firstText,secondText)) throw Error ('Los textos son muy diferentes') + + for (let index = 0; index < firstText.length; index++) { + if(firstText[index] !== secondText[index]){ + results.push(secondText[index]) + } + } + + printResults(firstText,secondText,results) +} + + +const isLongSame = (firstText:string, secondText:string) : boolean =>{ + const difference = Math.abs(firstText.length-secondText.length) + if(difference>5) return false + return true +} + +const printResults = (firstText:string, secondText:string, results : Array) => { + if(results.length === 0) console.log('No hay caracteres filtrados ✅'); + + console.log(`${firstText} / ${secondText} -> [${results}]`) +} + + + +getFilteredCharacters('Hola a Todos, saludos desde Colombia','Hola a Todes, salados desda Columbia') +//Hola a Todos, saludos desde Colombia / Hola a Todes, salados desda Columbia -> [e,a,a,u] \ No newline at end of file diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c#/iggict.cs" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c#/iggict.cs" new file mode 100644 index 0000000000..9434a42562 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c#/iggict.cs" @@ -0,0 +1,101 @@ + +using System; + +Console.Write("\nGENERADOR ALEATORIO DE CONTRASEAS"); +Console.Write("\n----------------------------------\n"); + +Console.Write("\nParametros de entrada:\n"); + +Console.Write("\n* Nmero de caracteres (8-16)"); +Console.Write("\n* Permitir mayusculas (s/n)"); +Console.Write("\n* Permitir dgitos (s/n)"); +Console.Write("\n* Permitir smbolos (s/n)\n"); + +Console.Write("\nEjemplos:\n"); + +Console.Write("\nEj01 => 8,s,s,n"); +Console.Write("\nEj02 => 9,n,s,n\n"); + +do +{ + PasswordGenerator pwGenerator; + + Console.Write("\nIntroduce los parmetros separados por comas: "); + + string paramString = Console.ReadLine() ?? ""; + + var paramArray = paramString.Split(','); + + try + { + pwGenerator = new PasswordGenerator( + length: (paramArray.Length >= 1 ? Int32.Parse(paramArray[0]) : 8), + isCaseAllowed: paramArray.Length >= 2 && paramArray[1].Equals("s", StringComparison.OrdinalIgnoreCase), + isDigitAllowed: paramArray.Length >= 3 && paramArray[2].Equals("s", StringComparison.OrdinalIgnoreCase), + isSpecialCharAllowed: paramArray.Length >= 4 && paramArray[3].Equals("s", StringComparison.OrdinalIgnoreCase) + ); + } + catch (Exception) + { + Console.WriteLine($"\nERROR: Los parmetros de entrada no son vlidos"); + continue; + } + + Console.WriteLine($"\nPASSWORD: {pwGenerator.CreatePassword()}"); + +} while (true); + +public class PasswordGenerator +{ + + const int MIN_LENGTH = 8; + const int MAX_LENGTH = 16; + + private readonly int length; + private readonly bool isCaseAllowed; + private readonly bool isDigitAllowed; + private readonly bool isSpecialCharAllowed; + + public PasswordGenerator(int length, bool isCaseAllowed = false, bool isDigitAllowed = false, bool isSpecialCharAllowed = false) + { + + if (length < MIN_LENGTH) + this.length = MIN_LENGTH; + else if (length > MAX_LENGTH) + this.length = MAX_LENGTH; + else + this.length = length; + + this.isCaseAllowed = isCaseAllowed; + this.isDigitAllowed = isDigitAllowed; + this.isSpecialCharAllowed = isSpecialCharAllowed; + + Console.WriteLine($"\nLongitud={this.length}, Maysculas={this.isCaseAllowed}, Nmeros={this.isDigitAllowed}, Smbolos={this.isSpecialCharAllowed} "); + } + + public string CreatePassword() + { + const string CHARS = "abcdefghijklmnopqrstuvwxyz"; + const string DIGITS = "1234567890"; + const string SPECIAL_CHARS = "!@#$%&*+-?()<>"; + + string allowedChars = CHARS + + (this.isCaseAllowed ? CHARS.ToUpper() : "") + + (this.isDigitAllowed ? DIGITS : "") + + (this.isSpecialCharAllowed ? SPECIAL_CHARS : ""); + + string pw = string.Empty; + + Random random = new(); + + for (int i = 0; i < this.length; i++) + { + int idx = random.Next(0, allowedChars.Length); + pw += allowedChars[idx]; + } + + return pw; + } + +} + diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c++/6d61726b.cpp" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c++/6d61726b.cpp" new file mode 100644 index 0000000000..b1d267c58d --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c++/6d61726b.cpp" @@ -0,0 +1,40 @@ +#include +#include +#include + +std::string generarContrasenia(int longitud = 8, bool mayusculas = false, bool numeros = false, bool simbolos = false); + +int main() +{ + std::cout << generarContrasenia(32, true, true, true) << std::endl; + return 0; +} + +std::string generarContrasenia(int longitud, bool mayusculas, bool numeros, bool simbolos) { + std::random_device rd; + std::mt19937 gen(rd()); + + std::string caracteresPermitidos = "abcdefghijklmnopqrstuvwxyz"; + + if (longitud < 8) + longitud = 8; + else if (longitud > 16) + longitud = 16; + + if (mayusculas) + caracteresPermitidos += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + if (numeros) + caracteresPermitidos += "0123456789"; + + if (simbolos) + caracteresPermitidos += "!\"#$%&'()*+,-./"; + + std::uniform_int_distribution dis(0, caracteresPermitidos.length() - 1); + + std::string contrasenia; + for (int i = 0; i < longitud; i++) + contrasenia += caracteresPermitidos[dis(gen)]; + + return contrasenia; +} \ No newline at end of file diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c++/pyramsd.cpp" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c++/pyramsd.cpp" new file mode 100644 index 0000000000..2ae7b06aaa --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c++/pyramsd.cpp" @@ -0,0 +1,41 @@ +#include +#include +#include +using namespace std; + + +string generatePassword(int tam){ + string characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_=+[]{};:'\",.<>/?"; + string paswd; + + // se encarga de obtener una semilla aleatoria + random_device rd; + // utiliza esa semilla para generar la secuencia de números aleatorios + mt19937 generator(rd()); + + // Establece un rango de numeros + uniform_int_distribution distribution(0, characters.length() -1); + + for (int i = 0; i < tam; i++){ + int randomIndex = distribution(generator); + paswd += characters[randomIndex]; + } + + return paswd; +} + + +int main(){ + random_device rd; + mt19937 generator(rd()); + + int min = 8, max = 16; + + uniform_int_distribution tamDitribution(min, max); + // 'generator' sigue la regla de tamDitribution que es un numero entre 'min' y 'max' + int tamPaswd = tamDitribution(generator); + + string paswd = generatePassword(tamPaswd); + + cout << paswd; +} diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c/fegorama.c" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c/fegorama.c" new file mode 100644 index 0000000000..c0dc19a86a --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/c/fegorama.c" @@ -0,0 +1,135 @@ +/* + * Escribe un programa que sea capaz de generar contraseñas de forma aleatoria. + * Podrás configurar generar contraseñas con los siguientes parámetros: + * - Longitud: Entre 8 y 16. + * - Con o sin letras mayúsculas. + * - Con o sin números. + * - Con o sin símbolos. + * (Pudiendo combinar todos estos parámetros entre ellos) + */ + +#include +#include +#include +#include +#include +#include +#include + +#define UPPER 1 +#define NUMBERS 2 +#define SYMBOLS 4 + +const char alpha_lower[] = "abcdefghijklmnopqrstuvwxyz"; +const char alpha_upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +const char numbers[] = "0123456789"; +const char symbols[] = "!$%&/()=?^*¨Ç;:_<>|@#~[]{}"; + +void build_passwd(const unsigned int conf, unsigned char *str_passwd) +{ + unsigned int max_str = 16; + unsigned int x, c; + time_t t; + + if ((conf >> 8) != 0) + max_str = conf >> 8; + + srand((unsigned)time(&t)); + + unsigned int i; + for (i = 0; i < max_str; i++) + { + x = rand() % 2; + if (conf == 0 || x == 0) + c = alpha_lower[rand() % 26]; + else + switch (conf & 15) + { + case UPPER | NUMBERS | SYMBOLS: + x = rand() % 3 + 1; + if (x == 2) + c = alpha_upper[rand() % 26]; + else if (x == 3) + c = numbers[rand() % 10]; + else + c = symbols[rand() % 26]; + break; + case SYMBOLS | NUMBERS: + x = rand() % 2 + 1; + if (x == 1) + c = symbols[rand() % 26]; + else + c = numbers[rand() % 10]; + break; + case UPPER | SYMBOLS: + x = rand() % 2 + 1; + if (x == 1) + c = alpha_upper[rand() % 26]; + else + c = symbols[rand() % 26]; + break; + case SYMBOLS: + c = symbols[rand() % 26]; + break; + case UPPER | NUMBERS: + x = rand() % 2 + 1; + if (x == 1) + c = alpha_upper[rand() % 26]; + else + c = numbers[rand() % 10]; + break; + case NUMBERS: + c = numbers[rand() % 10]; + break; + case UPPER: + c = alpha_upper[rand() % 26]; + break; + } + + str_passwd[i] = c; + } + + str_passwd[i] = '\0'; +} + +int main(int argc, char **argv) +{ + unsigned int conf = 0; + int c, v, len_passwd = 0; + unsigned char str_passwd[17]; + + while ((c = getopt(argc, argv, "l:uns?")) != -1) + switch (c) + { + case 'l': + v = atoi(optarg); + if (v < 8 || v > 16) + { + fprintf(stderr, "La longitud del password es de 8 a 16.\n"); + abort(); + } + len_passwd = atoi(optarg) << 8; + conf = conf + len_passwd; + break; + case 'u': + conf = conf | UPPER; + break; + case 'n': + conf = conf | NUMBERS; + break; + case 's': + conf = conf | SYMBOLS; + break; + case '?': + printf("Sintaxis: pass [-l 8..16] [-u|-n|-s]\n"); + return EXIT_SUCCESS; + default: + printf("default: c = %d", c); + abort(); + } + + build_passwd(conf, str_passwd); + printf("%s", str_passwd); + + return EXIT_SUCCESS; +} diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/java/asjordi.java" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/java/asjordi.java" new file mode 100644 index 0000000000..806ba39f3e --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/java/asjordi.java" @@ -0,0 +1,77 @@ +import java.util.List; +import java.util.Random; + +public class GeneratePassword { + + private final int length; + private final boolean withUppercase; + private final boolean withNumbers; + private final boolean withSymbols; + private final Random random; + + public GeneratePassword(int length, boolean withUppercase, boolean withNumbers, boolean withSymbols) { + + this.length = length < 8 ? 8 : Math.min(length, 16); + this.withUppercase = withUppercase; + this.withNumbers = withNumbers; + this.withSymbols = withSymbols; + this.random = new Random(); + + } + + public String generate() { + + StringBuilder password = new StringBuilder(); + + while (password.length() < length) { + + password.append(getLowercaseLetter()); + if (this.withUppercase) password.append(getUppercaseLetter()); + if (this.withNumbers) password.append(getNumber()); + if (this.withSymbols) password.append(getSymbol()); + + } + + return password.toString(); + + } + + public String getUppercaseLetter() { + + List uppercaseLetter = List.of( + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", + "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" + ); + + return uppercaseLetter.get(random.nextInt(uppercaseLetter.size())); + + } + + public String getLowercaseLetter() { + + List lowercaseLetter = List.of( + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", + "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" + ); + + return lowercaseLetter.get(random.nextInt(lowercaseLetter.size())); + + } + + public String getNumber() { + + List numbers = List.of("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); + + return numbers.get(random.nextInt(numbers.size())); + + } + + public String getSymbol() { + + List symbols = List.of("!", "@", "#", "$", "%", "&", "*", "+", "-", "=", "^"); + + return symbols.get(random.nextInt(symbols.size())); + + } + +} diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/javascript/AlinaBernardez.js" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/javascript/AlinaBernardez.js" new file mode 100644 index 0000000000..ce67fa63a7 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/javascript/AlinaBernardez.js" @@ -0,0 +1,24 @@ +// program to generate random Password + +const characters ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!"·$%&/()=?'; + +function generateString(length) { + let randomPassword = ' '; + const passLength = characters.length; + for ( let i = 0; i < length; i++ ) { + randomPassword += characters.charAt(Math.floor(Math.random() * passLength)); + } + return randomPassword; +} + +function getPassLength() { + let randomLength; + do { + randomLength = Math.round(Math.random() * 10); + } + while (randomLength < 8 && randomLength <= 16); + + return randomLength; +} + +generateString(getPassLength()); diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/javascript/ernestoalbarez.js" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/javascript/ernestoalbarez.js" new file mode 100644 index 0000000000..a48e149c60 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/javascript/ernestoalbarez.js" @@ -0,0 +1,47 @@ +function generarContrasena(longitud, mayusculas = true, numeros = true, simbolos = true) { + let cadena = 'abcdefghijklmnopqrstuvwxyz'; + if (mayusculas) cadena += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + if (numeros) cadena += '0123456789'; + if (simbolos) cadena += '!@#$%^&*()_-+=[]{};:,./?'; + + if (longitud < 8 || longitud > 16) { + throw new Error("La longitud debe estar entre 8 y 16."); + } + + let pwd = ''; + for (let i = 0; i < longitud; i++) { + const indiceAleatorio = Math.floor(Math.random() * cadena.length); + pwd += cadena.charAt(indiceAleatorio); + } + return pwd; + } + + function obtenerEntradaUsuario(pregunta) { + const readline = require('readline').createInterface({ + input: process.stdin, + output: process.stdout + }); + + return new Promise((resolve) => { + readline.question(pregunta, (respuesta) => { + readline.close(); + resolve(respuesta); + }); + }); + } + + async function main() { + try { + const longitud = parseInt(await obtenerEntradaUsuario("Ingrese la longitud deseada para la contraseña (entre 8 y 16): ")); + const mayusculas = (await obtenerEntradaUsuario("Incluir letras mayúsculas? (Sí/No): ")).trim().toLowerCase() === 'si'; + const numeros = (await obtenerEntradaUsuario("Incluir números? (Sí/No): ")).trim().toLowerCase() === 'si'; + const simbolos = (await obtenerEntradaUsuario("Incluir símbolos? (Sí/No): ")).trim().toLowerCase() === 'si'; + + const contrasenaGenerada = generarContrasena(longitud, mayusculas, numeros, simbolos); + console.log("Contraseña generada:", contrasenaGenerada); + } catch (error) { + console.log("Error:", error.message); + } + } + + main() \ No newline at end of file diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/kotlin/marchdz.kt" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/kotlin/marchdz.kt" new file mode 100644 index 0000000000..e22c2003d0 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/kotlin/marchdz.kt" @@ -0,0 +1,36 @@ +import kotlin.random.Random + +fun passwordGenerator( + passwordLength: Int, + addUpperCase: Boolean = false, + addNumbers: Boolean = false, + addSymbols: Boolean = false, +) { + var charsToUse = "abcdefghijklmnopqrstuvwxyz" + val upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + val numbers = "0123456789" + val symbols = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" + var password = "" + + if (addUpperCase) charsToUse += upperCase + if (addNumbers) charsToUse += numbers + if (addSymbols) charsToUse += symbols + + val passwordLengthWithinRange = when { + passwordLength < 8 -> 8 + passwordLength > 16 -> 16 + else -> passwordLength + } + + for (position in 1..passwordLengthWithinRange) { + password += charsToUse[Random.nextInt(0, charsToUse.length)] + } + + println(password) +} + +fun main() { + passwordGenerator(12, true, true, true) + passwordGenerator(18, false, true, false) + passwordGenerator(6) +} \ No newline at end of file diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/PedroOrtix.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/PedroOrtix.py" new file mode 100644 index 0000000000..e4cf1f3b10 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/PedroOrtix.py" @@ -0,0 +1,49 @@ +import numpy as np + +ABECEDARIO = "abcdefghijklmnopqrstuvwxyz" +ABECEDARIO_MAYUSCULAS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +NUMEROS = "0123456789" +SIMBOLOS = r"!#$%&'()*+,-./:;<=>?@[\]^_`{|}~" + +def generacion_contra(longitud: int, mayuscula: bool, numeros: bool, simbolos: bool) -> str: + conjunto = ABECEDARIO + if mayuscula: + conjunto = conjunto + ABECEDARIO_MAYUSCULAS + if numeros: + conjunto = conjunto + NUMEROS + if simbolos: + conjunto = conjunto + SIMBOLOS + contra = "" + for _ in range(longitud): + contra = contra + np.random.choice(list(conjunto)) + return contra + + +def main(): + longitud = int(input("Introduce la longitud de la contraseña (8/16): ")) + assert longitud == 8 or longitud == 16, "Solo se aceptan 8 o 16" + + pre_mayus = str(input("Mayusculas y/n: ")) + assert pre_mayus == 'y' or pre_mayus == 'n', "Solo se aceptan y/n" + mayuscula = False + if pre_mayus == "y": + mayuscula = True + + pre_num = str(input("Numeros y/n: ")) + assert pre_num == 'y' or pre_num == 'n', "Solo se aceptan y/n" + numeros = False + if pre_num == "y": + numeros = True + + pre_simb = str(input("Simbolos y/n: ")) + assert pre_simb == 'y' or pre_simb == 'n', "Solo se aceptan y/n" + simbolos = False + if pre_simb == "y": + simbolos = True + + print("Tu contraseña es: ") + print(generacion_contra(longitud, mayuscula, numeros, simbolos)) + +if __name__ == '__main__': + main() + diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/ShinMugenNoKabe.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/ShinMugenNoKabe.py" new file mode 100644 index 0000000000..f826f02bf2 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/ShinMugenNoKabe.py" @@ -0,0 +1,43 @@ +from secrets import choice +import string + + +def generate_password( + length: int, + include_caps=False, + include_numbers=False, + include_symbols=False, +) -> str: + if length < 8 or length > 16: + raise ValueError("La longitud debe ser entre 8 y 16") + + characters = string.ascii_lowercase + + if include_caps: + characters += string.ascii_uppercase + + if include_numbers: + characters += string.digits + + if include_symbols: + characters += string.punctuation + + return "".join(choice(characters) for _ in range(length)) + + +if __name__ == "__main__": + password_16 = generate_password(length=16, include_caps=True, include_numbers=True, include_symbols=True) + assert len(password_16) == 16 + print(password_16) + + password_8 = generate_password(length=8, include_caps=True) + assert len(password_8) == 8 + print(password_8) + + password_11 = generate_password(length=11, include_caps=True, include_numbers=True) + assert len(password_11) == 11 + print(password_11) + + password_15 = generate_password(length=15, include_symbols=True) + assert len(password_15) == 15 + print(password_15) \ No newline at end of file diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/alberba.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/alberba.py" new file mode 100644 index 0000000000..c79ea97d21 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/alberba.py" @@ -0,0 +1,32 @@ +import random + +def password_generator(length = 8, capital = False, numbers = False, symbol = False): + characters = list() + + characters += list(range(97, 123)) + + if capital: + characters += list(range(65, 91)) + if numbers: + characters += list(range(48, 58)) + if symbol: + characters += list(range(58, 65)) + list(range(33, 48)) + \ + list(range(123, 127)) + list(range(91,97)) + + length = 8 if length < 8 else 16 if length > 16 else length + + password = str() + for i in range(length): + password += chr(random.choice(characters)) + + return password + +print(password_generator()) +print(password_generator(length=16)) +print(password_generator(length=1)) +print(password_generator(length=22)) +print(password_generator(length=12, capital=True)) +print(password_generator(length=12, capital=True, numbers=True)) +print(password_generator(length=12, capital=True, numbers=True, symbol=True)) +print(password_generator(length=12, capital=True, symbol=True)) + diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/callmeGustavo.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/callmeGustavo.py" new file mode 100644 index 0000000000..06cdb5a1eb --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/callmeGustavo.py" @@ -0,0 +1,52 @@ +import random + +## Numeros +numeros = [] +for i in range(48,58): + numeros.append(chr(i)) +#print(numeros) + +## Mayusculas +mayusculas = [] +for i in range(65,91): + mayusculas.append(chr(i)) +#print(mayusculas) + +## Minuscula +minusculas = [] +for i in range(97,123): + minusculas.append(chr(i)) +#print(minusculas) + +## Signos +signos = [] +for i in range(33,48): + signos.append(chr(i)) +for ii in range(58,65): + signos.append(chr(ii)) +for iii in range(91,97): + signos.append(chr(iii)) +#print(signos) + +longitud = int(input("Ingrese longitud del password: ")) + +if longitud < 8 or longitud > 16: + raise ValueError('Longitud inválida') + +password = "" +for i in range(longitud): + password += numeros[random.randint(0,len(numeros)-1)] + #breakpoint() + password += mayusculas[random.randint(0,len(mayusculas)-1)] + password += minusculas[random.randint(0,len(minusculas)-1)] + password += signos[random.randint(0, len(signos)-1)] + +print(password[:longitud]) +# for i in longitud: +# password += chr(longitud) +# # elif type(longitud) != int: +# # raise ValueError("No es un int") + + + + diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/dsrojo1155.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/dsrojo1155.py" new file mode 100644 index 0000000000..df8fcc8023 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/dsrojo1155.py" @@ -0,0 +1,44 @@ +import argparse +import string +import random +# Autor DsRojo1155 +parser = argparse.ArgumentParser(description="[+] Uso Passwords Generator") +parser.add_argument('-l', '--length',type=int, help='Determine the password length\n python3 .\passwords_generator.py -l 17') +parser.add_argument('-w', '--words', action='store_true', help="Specify if you want uppercase letters") +parser.add_argument('-d', '--digits', action='store_true', help="Specify if you want digits") +parser.add_argument('-s', '--symbols', action='store_true', help="Specify if you want symbols") +args = parser.parse_args() + +def password_generate(length, characters): + length = int(length) + print("[+] Generating password") + password = "" + for i in range(length): + password += random.choice(characters) + + print(f"[+] Generated password: {password}") + +if __name__ == '__main__': + # Validar que la longitud esté dentro de los límites + if args.length and args.length >= 8 and args.length <= 16 : + print(f"Set the password length: {args.length}") + + # Verificar si se seleccionó alguna opción + if not args.words and not args.digits and not args.symbols and args: + print("Error: At least one option (words, digits, symbols) must be enabled.") + exit(1) + + # Definir caracteres disponibles + characters = "" + if args.words: + characters += string.ascii_uppercase + if args.digits: + characters += string.digits + if args.symbols: + characters += string.punctuation + + + + password_generate(args.length, characters) + else: + print("Error: Invalid length. Password length should be between 8 and 16.") diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/ernestoalbarez.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/ernestoalbarez.py" new file mode 100644 index 0000000000..380f8d3aea --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/ernestoalbarez.py" @@ -0,0 +1,28 @@ +import random +import string + +def generar_contrasena(longitud, mayusculas=True, numeros=True, simbolos=True): + cadena = string.ascii_letters + if mayusculas: + cadena += string.ascii_uppercase + if numeros: + cadena += string.digits + if simbolos: + cadena += string.punctuation + + if longitud < 8 or longitud > 16: + raise ValueError("La longitud debe estar entre 8 y 16.") + + return ''.join(random.choice(cadena) for _ in range(longitud)) + +if __name__ == "__main__": + try: + longitud = int(input("Ingrese la longitud deseada para la contraseña (entre 8 y 16): ")) + mayusculas = input("Incluir letras mayúsculas? (Sí/No): ").strip().lower() == 'si' + numeros = input("Incluir números? (Sí/No): ").strip().lower() == 'si' + simbolos = input("Incluir símbolos? (Sí/No): ").strip().lower() == 'si' + + contrasena_generada = generar_contrasena(longitud, mayusculas, numeros, simbolos) + print("Contraseña generada:", contrasena_generada) + except ValueError as e: + print("Error:", e) diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/fedecoronado.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/fedecoronado.py" new file mode 100644 index 0000000000..71098ec50f --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/fedecoronado.py" @@ -0,0 +1,64 @@ +''' +/* + * Escribe un programa que sea capaz de generar contraseñas de forma aleatoria. + * Podrás configurar generar contraseñas con los siguientes parámetros: + * - Longitud: Entre 8 y 16. + * - Con o sin letras mayúsculas. + * - Con o sin números. + * - Con o sin símbolos. + * (Pudiendo combinar todos estos parámetros entre ellos) + */ +''' +# tabla ascii +# minusculas --> 97 a 122 +# mayusculas -->65 a 90 +# numeros --> 48 a 57 +# symbol --> 33 a 47 y 58 a 64 y 91 a 96 y 123 a 126 +import random + +while True: + numero = int(input("cantidad de caracteres 8 a 16")) + if numero <=16 and numero >= 8: + break + else: + print("el numero debe ser netre 8 y 16. por favor reintente") + +posibles = [] +for i in range(97, 123): + posibles.append(i) + +while True: + mayusc = input("contiene Mayusculas [y/n]") + if mayusc == "y": + for i in range(65, 91): + posibles.append(i) + break + elif mayusc == "n": + break + +while True: + numeros = input("contiene numeros [y/n]") + if numeros == "y": + for i in range(48, 58): + posibles.append(i) + break + elif numeros == "n": + break +while True: + symbol = input("contiene symbol [y/n]") + if symbol == "y": + for i in range(33, 48): + posibles.append(i) + for i in range(58, 65): + posibles.append(i) + break + elif symbol == "n": + break + +password="" +for i in range(0, numero): + letra = random.randrange(0, len(posibles)) + password = password + chr(posibles[letra]) + + +print(password) \ No newline at end of file diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/javierfiestasbotella.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/javierfiestasbotella.py" new file mode 100644 index 0000000000..2341f6c851 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/javierfiestasbotella.py" @@ -0,0 +1,19 @@ +'''/* + * Escribe un programa que sea capaz de generar contraseñas de forma aleatoria. + * Podrás configurar generar contraseñas con los siguientes parámetros: + * - Longitud: Entre 8 y 16. + * - Con o sin letras mayúsculas. + * - Con o sin números. + * - Con o sin símbolos. + * (Pudiendo combinar todos estos parámetros entre ellos) + */''' + +from random import randint +password='' +while len(password)<8 or len(password)>16: + letra = randint(48,91) + password+=chr(letra) +print(password) + + + diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/josevegas27.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/josevegas27.py" new file mode 100644 index 0000000000..9962289769 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/josevegas27.py" @@ -0,0 +1,52 @@ +# Reto #3: EL GENERADOR DE CONTRASEÑAS +#### Dificultad: Media | Publicación: 16/01/23 | Corrección: 23/01/23 + +## Enunciado + +''' +/* + * Escribe un programa que sea capaz de generar contraseñas de forma aleatoria. + * Podrás configurar generar contraseñas con los siguientes parámetros: + * - Longitud: Entre 8 y 16. + * - Con o sin letras mayúsculas. + * - Con o sin números. + * - Con o sin símbolos. + * (Pudiendo combinar todos estos parámetros entre ellos) + */ + ''' +import numpy as np + + +def generador_contraseña(Longitud,mayus:bool,number:bool,symbol:bool): + + symbols = ['!','"','#','$','%','&','/','(',')','=','?','.','-','_'] + numeros = list(range(0,10)) + letras = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] + Letras = [letter.upper() for letter in letras] + + if mayus == 'True': + letras += Letras + if number == 'True': + letras += numeros + if symbol == 'True': + print(symbol) + letras += symbols + + if Longitud <8 or Longitud >16: + print('La contraseña debe tener una longitud entre 8 y 16 caracteres') + return None + else: + char = '' + for i in np.random.choice(letras,Longitud): + char += str(i) + return char + + +print('GENERADOR DE CONTRASEÑAS:\n') + +longitud = int(input('Longitud de la contraseña: ')) +mayus = input('¿Incluye Mayusculas? (True/False): ') +numbers = input('¿Incluye Numeros? (True/False): ') +symbols = input('¿Incluye Simbolos? (True/False): ') + +print('La contraseña es: ',generador_contraseña(longitud,mayus,numbers,symbols)) diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/julenf14.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/julenf14.py" index a82f919bea..0bc4a407ff 100644 --- "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/julenf14.py" +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/julenf14.py" @@ -1,11 +1,3 @@ -# Escribe un programa que sea capaz de generar contraseñas de forma aleatoria. -# Podrás configurar generar contraseñas con los siguientes parámetros: -# - Longitud: Entre 8 y 16. -# - Con o sin letras mayúsculas. -# - Con o sin números. -# - Con o sin símbolos. -# (Pudiendo combinar todos estos parámetros entre ellos) - import random __letters_lower = "abcdefghijklmnopqrstuvwxyz" @@ -30,7 +22,7 @@ def PasswordGenerator(length: int, uppercase: bool = False, numbers: bool = Fals if uppercase: characters += __letters_upper - + if numbers: characters += __numbers diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/klimyflorez.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/klimyflorez.py" new file mode 100644 index 0000000000..3562f33919 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/klimyflorez.py" @@ -0,0 +1,45 @@ +# Escribe un programa que sea capaz de generar contraseñas de forma aleatoria. +# Podrás configurar generar contraseñas con los siguientes parámetros: +# - Longitud: Entre 8 y 16. +# - Con o sin letras mayúsculas. +# - Con o sin números. +# - Con o sin símbolos. +# (Pudiendo combinar todos estos parámetros entre ellos) + +import random + +def passwordGenerator(): + characters = "abcdefghijklmnopqrstuvwxyz" + length = 0 + + while (length < 8 or length > 16): + length = int(input("Digite la longitud que desea que tenga la constraseña entre 8 y 16 caracteres:\n")) + + password = " " * length + + upperCaseletters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + numbers = "0123456789" + symbols = "!$%&()=/?¿¡:,_-|@#+*{}[]^\\ñ" + + containsLetters = input("¿Desea que su contraseña contenga letras mayúsculas?" + + "\n s) si" + + "\n n) no \n").lower().strip()[0] + characters += upperCaseletters if containsLetters == 's' else "" + + containsNumbers = input("¿Desea que su contraseña contenga números?" + + "\n s) si" + + "\n n) no \n").lower().strip()[0] + characters += numbers if containsNumbers == 's' else "" + + containsSymbols = input("¿Desea que su contraseña contenga símbolos?" + + "\n s) si" + + "\n n) no \n").lower().strip()[0] + characters += symbols if containsSymbols == 's' else "" + + if (len(characters) == 0): + print("No se puede generar una contraseña sin caracteres") + return "" + + return list(map(lambda letter: characters[random.randint(0, len(characters))], [*password])) + +print("".join(passwordGenerator())) \ No newline at end of file diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/marcoatrs.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/marcoatrs.py" new file mode 100644 index 0000000000..3fb9a180df --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/marcoatrs.py" @@ -0,0 +1,32 @@ +import random +from string import ascii_lowercase, ascii_uppercase, digits, punctuation + + +def generate_password( + length: int, + lc: bool = True, + uc: bool = True, + nums: bool = True, + special: bool = True, +) -> str: + if not 16 >= length >= 8: + print("La contraseña debe ser de entre 8 y 16 caracteres") + return + pwd_str = "" + if lc: + pwd_str += ascii_lowercase + if uc: + pwd_str += ascii_uppercase + if nums: + pwd_str += digits + if special: + pwd_str += punctuation + if not pwd_str: + print("Seleccione al menos un tipo de caracter") + return + return "".join([random.choice(pwd_str) for _ in range(length)]) + + +print(generate_password(16, lc=True, uc=True, nums=True, special=True)) +print(generate_password(8, lc=True, uc=True, nums=False, special=True)) +print(generate_password(3, lc=True, uc=True, nums=False, special=True)) diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/rafaelramirez150.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/rafaelramirez150.py" new file mode 100644 index 0000000000..c550fef04c --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/rafaelramirez150.py" @@ -0,0 +1,40 @@ +''' +/* + * Escribe un programa que sea capaz de generar contraseñas de forma aleatoria. + * Podrás configurar generar contraseñas con los siguientes parámetros: + * - Longitud: Entre 8 y 16. + * - Con o sin letras mayúsculas. + * - Con o sin números. + * - Con o sin símbolos. + * (Pudiendo combinar todos estos parámetros entre ellos) + */ + ''' + +import random +import string + +def generaPassword(longitud, mayusculas=True, numeros=True, simbolos=True): + caracteres = string.ascii_lowercase + if mayusculas: + caracteres += string.ascii_uppercase + if numeros: + caracteres += string.digits + if simbolos: + caracteres += string.punctuation + + contrasena = ''.join(random.choice(caracteres) for _ in range(longitud)) + return contrasena + +# Pedir al usuario que configure los parámetros +longitud = int(input("Longitud de la contraseña (entre 8 y 16): ")) +mayusculas = input("Incluir letras mayúsculas (S/N): ").lower() == "s" +numeros = input("Incluir números (S/N): ").lower() == "s" +simbolos = input("Incluir símbolos (S/N): ").lower() == "s" + +# Validar la longitud de la contraseña +if longitud < 8 or longitud > 16: + print("Longitud inválida. La longitud debe estar entre 8 y 16.") +else: + # Generar la contraseña + contrasena = generaPassword(longitud, mayusculas, numeros, simbolos) + print("Contraseña generada:", contrasena) diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/rafaelramireza.py" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/rafaelramireza.py" new file mode 100644 index 0000000000..63b211e01a --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/python/rafaelramireza.py" @@ -0,0 +1,38 @@ +''' +/* + * Escribe un programa que sea capaz de generar contraseñas de forma aleatoria. + * Podrás configurar generar contraseñas con los siguientes parámetros: + * - Longitud: Entre 8 y 16. + * - Con o sin letras mayúsculas. + * - Con o sin números. + * - Con o sin símbolos. + * (Pudiendo combinar todos estos parámetros entre ellos) + */ + ''' + +import random +import string + +def generar_contrasena(longitud, incluir_mayusculas, incluir_numeros, incluir_simbolos): + caracteres = string.ascii_lowercase # Genera un string con todas las letras minúsculas + if incluir_mayusculas: # Si se incluyen mayúsculas, se añaden al string + caracteres += string.ascii_uppercase # Genera un string con todas las letras mayúsculas + if incluir_numeros: # Si se incluyen números, se añaden al string + caracteres += string.digits # Genera un string con todos los números + if incluir_simbolos: # Si se incluyen símbolos, se añaden al string + caracteres += string.punctuation # Genera un string con todos los símbolos + + contrasena = ''.join(random.choice(caracteres) for _ in range(longitud)) # Genera una contraseña aleatoria + return contrasena # Devuelve la contraseña generada + +def main(): + longitud = random.randint(8, 16) # Genera un número aleatorio entre 8 y 16 + incluir_mayusculas = random.choice([True, False]) # Genera un booleano aleatorio + incluir_numeros = random.choice([True, False]) # Genera un booleano aleatorio + incluir_simbolos = random.choice([True, False]) # Genera un booleano aleatorio + + contrasena = generar_contrasena(longitud, incluir_mayusculas, incluir_numeros, incluir_simbolos) # Genera la contraseña + print(f"Contraseña generada: {contrasena}") + +if __name__ == "__main__": # Permite ejecutar este script directamente + main() # Ejecuta la función main diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/ruby/ernestoalbarez.rb" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/ruby/ernestoalbarez.rb" new file mode 100644 index 0000000000..ccdf0b54f9 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/ruby/ernestoalbarez.rb" @@ -0,0 +1,33 @@ +def generar_contrasena(longitud, mayusculas=true, numeros=true, simbolos=true) + cadena = ('a'..'z').to_a + cadena += ('A'..'Z').to_a if mayusculas + cadena += ('0'..'9').to_a if numeros + cadena += %w[! @ # $ % ^ & * ( ) - _ = + [ ] { } ; : , . / ?] if simbolos + + raise ArgumentError, "La longitud debe estar entre 8 y 16." if longitud < 8 || longitud > 16 + + contrasena = Array.new(longitud) { cadena.sample }.join +end + +if __FILE__ == $0 + begin + print "Ingrese la longitud deseada para la contraseña (entre 8 y 16): " + longitud = gets.chomp.to_i + + print "Incluir letras mayúsculas (Sí/No): " + mayusculas = gets.chomp.strip.downcase == 'si' + + print "Incluir números (Sí/No): " + numeros = gets.chomp.strip.downcase == 'si' + + print "Incluir símbolos (Sí/No): " + simbolos = gets.chomp.strip.downcase == 'si' + + contrasena_generada = generar_contrasena(longitud, mayusculas, numeros, simbolos) + puts "Contraseña generada: #{contrasena_generada}" + + rescue ArgumentError => e + puts "Error: #{e.message}" + end +end + \ No newline at end of file diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/sql/darubiano.sql" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/sql/darubiano.sql" new file mode 100644 index 0000000000..4e3d169df0 --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/sql/darubiano.sql" @@ -0,0 +1,104 @@ +/* + Escribe un programa que sea capaz de generar contraseñas de forma aleatoria. + Podrás configurar generar contraseñas con los siguientes parámetros: + - Longitud: Entre 8 y 16. + - Con o sin letras mayúsculas. + - Con o sin números. + - Con o sin símbolos. + (Pudiendo combinar todos estos parámetros entre ellos) +*/ +---------------------------------------------------------------------------------------------------- +---------------------------------------------------------------------------------------------------- +-- POSTGRES -- +CREATE OR REPLACE FUNCTION pg_temp.GeneratePassword(mayuscula BOOL, num BOOL, carac BOOL, len INT) +RETURNS TABLE (result TEXT) +LANGUAGE plpgsql +AS $$ +DECLARE resultado TEXT; +BEGIN + RETURN QUERY + WITH letras AS ( + SELECT * FROM (VALUES + ('a'),('b'),('c'),('d'),('e'),('f'),('g'),('h'),('i'), + ('j'),('k'),('l'),('m'),('n'),('o'),('p'),('q'),('r'), + ('s'),('t'),('u'),('v'),('w'),('x'),('y'),('z') + ) AS dh(letra) + ), + numeros AS ( + SELECT * FROM (VALUES + ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9') + ) AS dh(numero) + ), + caracteres AS ( + SELECT * FROM (VALUES + ('!'),('#'),('$'),('%'),('&'),('/'), + ('('),(')'),('='),(','),('.'),('-'), + ('_'),('+'),('*'),(';'),(':'),('|') + ) AS dh(caracter) + ), + seleccion AS ( + SELECT * FROM ( + SELECT CASE WHEN mayuscula THEN letra + ELSE letra END AS letra + FROM letras + UNION ALL + SELECT * FROM numeros WHERE num + UNION ALL + SELECT * FROM caracteres WHERE carac + ) AS result + ORDER BY RANDOM() LIMIT 18 + ) + SELECT STRING_AGG(letra, '') AS contrasena + FROM ( + SELECT letra,ROW_NUMBER() OVER () AS row_num + FROM seleccion + ) AS result + WHERE row_num <= CASE WHEN len<8 THEN 8 ELSE len END; +END +$$; +-- Llamar a la función GeneratePassword longitud minima 8 y maxima 18 +SELECT * FROM pg_temp.GeneratePassword(TRUE, TRUE, TRUE, 10) AS contrasena; + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- BIGQUERY -- +CREATE TEMP FUNCTION GeneratePassword(mayuscula BOOL, num BOOL, carac BOOL, len INT64) +AS ( + ( + WITH letras AS ( + SELECT * FROM UNNEST([ + ('a'),('b'),('c'),('d'),('e'),('f'),('g'),('h'),('i'), + ('j'),('k'),('l'),('m'),('n'),('o'),('p'),('q'),('r'), + ('s'),('t'),('u'),('v'),('w'),('x'),('y'),('z')]) AS letra + ), + numeros AS ( + SELECT * FROM UNNEST([('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9')]) AS numero + ), + caracteres AS ( + SELECT * FROM UNNEST([ + ('!'),('#'),('$'),('%'),('&'),('/'), + ('('),(')'),('='),(','),('.'),('-'), + ('_'),('+'),('*'),(';'),(':'),('|')]) AS caracter + ), + seleccion AS ( + SELECT * FROM ( + SELECT IF(mayuscula, UPPER(letras.letra), letras.letra) AS letra + FROM letras + UNION ALL + SELECT * FROM numeros WHERE num + UNION ALL + SELECT * FROM caracteres WHERE carac + ) ORDER BY RAND() LIMIT 18 + ) + SELECT STRING_AGG(letra, '') AS contrasena + FROM ( + SELECT letra,ROW_NUMBER() OVER () AS row_num + FROM seleccion + ) + WHERE row_num <= IF(len<8, 8, len) + ) +); +-- Llamar a la función GeneratePassword longitud minima 8 y maxima 18 +SELECT GeneratePassword(TRUE, TRUE, TRUE, 10) AS contrasena; + + + diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/typescript/Qv1ko.ts" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/typescript/Qv1ko.ts" new file mode 100644 index 0000000000..1df5b265cd --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/typescript/Qv1ko.ts" @@ -0,0 +1,32 @@ +passGen(10, true, false, true) + +function passGen(len: number, upper: boolean, num: boolean, simb: boolean) { + + let password = "" + + let chars = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] + const upperLetters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] + const numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] + const simbols = ["`", "~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "[", "{", "]", "}", "\\", "|", ";", ":", "'", "\"", ",", "<", ".", ">", "/", "?"] + + len = (len < 8)? 8 : (len > 16)? 16 : len; + + if (upper) { + chars.push(...upperLetters) + } + + if (num) { + chars.push(...numbers) + } + + if (simb) { + chars.push(...simbols) + } + + for (let i = 0; i < len; i++) { + password += chars[Math.floor(Math.random() * chars.length)] + } + + console.log(password) + +} diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/typescript/freddoOswaldo.ts" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/typescript/freddoOswaldo.ts" new file mode 100644 index 0000000000..0e468c0ebd --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/typescript/freddoOswaldo.ts" @@ -0,0 +1,100 @@ +/* + * Escribe un programa que sea capaz de generar contraseñas de forma aleatoria. + * Podrás configurar generar contraseñas con los siguientes parámetros: + * - Longitud: Entre 8 y 16. + * - Con o sin letras mayúsculas. + * - Con o sin números. + * - Con o sin símbolos. + * (Pudiendo combinar todos estos parámetros entre ellos) + */ + + +class PasswordBuilder { + private readonly CHARACTERS = { + letters: "abcdefghijklmnopqrstuvwxyz", + numbers: "0123456789", + symbols: "!@#$%^&*()_+~`|}{[]:;?><,./-=", + }; + + private validateLength(length: number) { + return length >= 8 && length <= 16; + } + + private generateWithLowerCase() { + return this.CHARACTERS.letters.charAt( + Math.floor(Math.random() * this.CHARACTERS.letters.length) + ); + } + + private generateWithUpperCase() { + return this.CHARACTERS.letters + .toUpperCase() + .charAt(Math.floor(Math.random() * this.CHARACTERS.letters.length)); + } + + private generateWithNumbers() { + return this.CHARACTERS.numbers.charAt( + Math.floor(Math.random() * this.CHARACTERS.numbers.length) + ); + } + + private generateWithSymbols() { + return this.CHARACTERS.symbols.charAt( + Math.floor(Math.random() * this.CHARACTERS.symbols.length) + ); + } + + private validateOptions( + withUpperCase = true, + withWithNumbers = true, + withSymbols = true + ) { + let option = Math.floor(Math.random() * 4); + + if (!withUpperCase && option === 1) + option = this.validateOptions(withUpperCase, withWithNumbers, withSymbols); + if (!withWithNumbers && option === 2) + option = this.validateOptions(withUpperCase, withWithNumbers, withSymbols); + if (!withSymbols && option === 3) + option = this.validateOptions(withUpperCase, withWithNumbers,withSymbols); + + return option; + } + + build({ + length = 16, + withUpperCase = true, + withWithNumbers = true, + withSymbols = true, + } = {}) { + if (!this.validateLength(length)) { + throw new Error("Invalid length"); + } + + const password = Array.from({ length }) + .map(() => { + const option = this.validateOptions( + withUpperCase, + withWithNumbers, + withSymbols + ); + + switch (option) { + case 0: + return this.generateWithLowerCase(); + case 1: + return this.generateWithUpperCase(); + case 2: + return this.generateWithNumbers(); + case 3: + return this.generateWithSymbols(); + default: + return this.generateWithLowerCase(); + } + }) + .join(""); + console.log(password); + } +} + +new PasswordBuilder().build(); diff --git "a/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/typescript/miguelriosoliveira.ts" "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/typescript/miguelriosoliveira.ts" new file mode 100644 index 0000000000..03a2e2e63d --- /dev/null +++ "b/Retos/Reto #3 - EL GENERADOR DE CONTRASE\303\221AS [Media]/typescript/miguelriosoliveira.ts" @@ -0,0 +1,99 @@ +/* + * Escribe un programa que sea capaz de generar contraseñas de forma aleatoria. + * Podrás configurar generar contraseñas con los siguientes parámetros: + * - Longitud: Entre 8 y 16. + * - Con o sin letras mayúsculas. + * - Con o sin números. + * - Con o sin símbolos. + * (Pudiendo combinar todos estos parámetros entre ellos) + */ + +function randInt(min_: number, max_: number): number { + const min = Math.ceil(min_); + const max = Math.floor(max_); + return min + Math.floor(Math.random() * (max - min + 1)); +} + +function generatePassword(size: number, allowedChars: string): string { + return Array.from({ length: size }, () => allowedChars[randInt(0, allowedChars.length - 1)]).join( + '', + ); +} + +const LOWERCASE_CHARS = 'abcdefghijklmnopqrstuvwxyz'; +const UPPERCASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; +const NUMBERS = '0123456789'; +const SYMBOLS = '!@#$%^&*()_+-={}[]|:;\\"\'`>,.?/'; + +function generateAllowedCharsChecker(allowedChars: string) { + return (received: string) => received.split('').some(char => allowedChars.includes(char)); +} + +interface Props { + size?: number; + uppercase?: boolean; + numbers?: boolean; + symbols?: boolean; +} + +function passwordGenerator({ + size = 8, + uppercase = true, + numbers = true, + symbols = true, +}: Props = {}): string { + if (size < 8 || size > 16) { + throw new Error('Invalid size. Must have between 8 and 16 characters (both inclusive).'); + } + const conditions = [generateAllowedCharsChecker(LOWERCASE_CHARS)]; + let allowedChars = LOWERCASE_CHARS; + + if (uppercase) { + allowedChars += UPPERCASE_CHARS; + conditions.push(generateAllowedCharsChecker(UPPERCASE_CHARS)); + } + + if (numbers) { + allowedChars += NUMBERS; + conditions.push(generateAllowedCharsChecker(NUMBERS)); + } + + if (symbols) { + allowedChars += SYMBOLS; + conditions.push(generateAllowedCharsChecker(SYMBOLS)); + } + + let randomChars = generatePassword(size, allowedChars); + while (!conditions.every(condition => condition(randomChars))) { + randomChars = generatePassword(size, allowedChars); + } + + return randomChars; +} + +function test() { + // Arrange + // Act + const received = passwordGenerator(); + console.log({ received }); + + // Assert + const conditions = [ + (received: string) => received.length === 8, + generateAllowedCharsChecker(LOWERCASE_CHARS), + generateAllowedCharsChecker(UPPERCASE_CHARS), + generateAllowedCharsChecker(NUMBERS), + generateAllowedCharsChecker(SYMBOLS), + ]; + conditions.every(condition => { + const hasPassed = condition(received); + if (hasPassed) { + console.log('✅ PASSED'); + } else { + console.log('❌ FAILED', condition.toString()); + } + return hasPassed; + }); +} + +test(); diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/bash/luisgulo.sh b/Retos/Reto #30 - EL TECLADO T9 [Media]/bash/luisgulo.sh new file mode 100755 index 0000000000..d0e0e1eab4 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/bash/luisgulo.sh @@ -0,0 +1,111 @@ +#!/bin/bash +< tecladoT9 = new Dictionary() { + { "2", "A"}, + { "22", "B"}, + { "222", "C"}, + { "3", "D"}, + { "33", "E"}, + { "333", "F"}, + { "4", "G"}, + { "44", "H"}, + { "444", "I"}, + { "5", "J"}, + { "55", "K"}, + { "555", "L"}, + { "6", "M"}, + { "66", "N"}, + { "666", "O"}, + { "7", "P"}, + { "77", "Q"}, + { "777", "R"}, + { "7777", "S"}, + { "8", "T"}, + { "88", "U"}, + { "888", "V"}, + { "9", "W"}, + { "99", "X"}, + { "999", "Y"}, + { "9999", "Z"}, + { "0", " "} +}; + +string[] mensaje = Console.ReadLine().Split("-"); + +for (int i = 0; i < mensaje.Length; i++) +{ + texto = texto + tecladoT9[mensaje[i]]; +} + +Console.WriteLine(texto); \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/ejercicio.md b/Retos/Reto #30 - EL TECLADO T9 [Media]/ejercicio.md new file mode 100644 index 0000000000..7d3ae46c55 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/ejercicio.md @@ -0,0 +1,26 @@ +# Reto #30: El teclado T9 +#### Dificultad: Media | Publicación: 24/07/23 | Corrección: 31/07/23 + +## Enunciado + +``` +/* + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV + */ +``` +#### Tienes toda la información extendida sobre los retos de programación semanales en **[retosdeprogramacion.com/semanales2023](https://retosdeprogramacion.com/semanales2023)**. + +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/Retos/Reto #30 - EL TECLADO T9 [Media]/go/blackriper.go b/Retos/Reto #30 - EL TECLADO T9 [Media]/go/blackriper.go new file mode 100644 index 0000000000..1e16293c77 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/go/blackriper.go @@ -0,0 +1,121 @@ +package main + +import ( + "fmt" +) + +// definir funciones para trabajar +type KeyboardT9 interface { + DecodeT9() string +} + +// tipo de dato a recibir +type Block struct { + T9 string +} + +// funcion para decodificar los numeros +func (b *Block) DecodeT9() string { + var before string + var text string + var count int + + for idx, lett := range b.T9 { + + car := string(lett) + + if car == "-" { + text = text + NumberToText(before, count) + count = 0 + } else { + if before == car { + count++ + } else { + count = 1 + } + before = car + if idx == len(b.T9)-1 { + text = text + NumberToText(before, count) + break + } + } + } + + return text +} + +// funcion auxilar para obtener las letras +func NumberToText(num string, count int) string { + var letter string + switch { + case num == "0": + letter = " " + case num == "2" && count == 1: + letter = "a" + case num == "2" && count == 2: + letter = "b" + case num == "2" && count == 3: + letter = "c" + case num == "3" && count == 1: + letter = "d" + case num == "3" && count == 2: + letter = "e" + case num == "3" && count == 3: + letter = "f" + case num == "4" && count == 1: + letter = "g" + case num == "4" && count == 2: + letter = "h" + case num == "4" && count == 3: + letter = "i" + case num == "5" && count == 1: + letter = "j" + case num == "5" && count == 2: + letter = "k" + case num == "5" && count == 3: + letter = "l" + case num == "6" && count == 1: + letter = "m" + case num == "6" && count == 2: + letter = "n" + case num == "6" && count == 3: + letter = "o" + case num == "6" && count == 4: + letter = "ñ" + case num == "7" && count == 1: + letter = "p" + case num == "7" && count == 2: + letter = "q" + case num == "7" && count == 3: + letter = "r" + case num == "7" && count == 4: + letter = "s" + case num == "8" && count == 1: + letter = "t" + case num == "8" && count == 2: + letter = "u" + case num == "8" && count == 3: + letter = "v" + case num == "9" && count == 1: + letter = "w" + case num == "9" && count == 2: + letter = "x" + case num == "9" && count == 3: + letter = "y" + case num == "9" && count == 4: + letter = "z" + } + return letter +} + +func main() { + // salida mouredev + //entry := "6-666-88-777-33-3-33-888" + //salida hola soy goku + entry := "44-666-555-2-0-7777-666-999-0-4-666-55-88" + var key KeyboardT9 = &Block{T9: entry} + text := key.DecodeT9() + fmt.Printf("Entrada: %v \n", entry) + fmt.Printf("Salida: %v \n", text) + +} diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/go/timetravel-1010.go b/Retos/Reto #30 - EL TECLADO T9 [Media]/go/timetravel-1010.go new file mode 100644 index 0000000000..e4e4b69507 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/go/timetravel-1010.go @@ -0,0 +1,48 @@ +package main + +import ( + "fmt" + "strings" +) + +var keyboard = map[string][]string{ + "1": {",", ".", "?", "!"}, + "2": {"A", "B", "C"}, + "3": {"D", "E", "F"}, + "4": {"G", "H", "I"}, + "5": {"J", "K", "L"}, + "6": {"M", "N", "O"}, + "7": {"P", "Q", "R", "S"}, + "8": {"T", "U", "V"}, + "9": {"W", "X", "Y", "Z"}, + "0": {" "}, +} + +func read_input(input string) string { + numbers := strings.Split(input, "-") + output := "" + counter := 0 + + for _, c := range numbers { + if len(c) > 1 { + for _, cc := range c { // Para numeros repetidos. + counter++ + if counter > len(keyboard[string(cc)]) { // Para evitar error con cosas como 6666 + counter = 1 + } + } + counter-- + c = string(c[0]) + } + output += keyboard[c][counter] + counter = 0 + } + return output +} + +func main() { + i := "6-666-88-777-33-3-33-888" + //i := "6666-666666-88-777-33-0-3-33-888" + //i := "222222-2222-8888888-0-333333-444444444-77777777-44444" + fmt.Println(read_input(i)) +} diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/java/Ghuaynamontes.java b/Retos/Reto #30 - EL TECLADO T9 [Media]/java/Ghuaynamontes.java new file mode 100644 index 0000000000..6ed98711ee --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/java/Ghuaynamontes.java @@ -0,0 +1,55 @@ +import javax.swing.JOptionPane; +import java.util.HashMap; +import java.util.Map; + +public class Ghuaynamontes { + + public static void main(String[] args) { + String entrada = JOptionPane.showInputDialog("Ingrese la combinación de pulsaciones T9 separadas por guiones:"); + String resultado = t9ToTexto(entrada); + JOptionPane.showMessageDialog(null, "Salida: " + resultado); + } + + public static String t9ToTexto(String entrada) { + Map t9ToTextoMap = getT9ToTextoMap(); + + StringBuilder texto = new StringBuilder(); + String[] bloques = entrada.split("-"); + for (String bloque : bloques) { + texto.append(t9ToTextoMap.get(bloque)); + } + + return texto.toString(); + } + + public static Map getT9ToTextoMap() { + Map t9ToTextoMap = new HashMap<>(); + t9ToTextoMap.put("2", "A"); + t9ToTextoMap.put("22", "B"); + t9ToTextoMap.put("222", "C"); + t9ToTextoMap.put("3", "D"); + t9ToTextoMap.put("33", "E"); + t9ToTextoMap.put("333", "F"); + t9ToTextoMap.put("4", "G"); + t9ToTextoMap.put("44", "H"); + t9ToTextoMap.put("444", "I"); + t9ToTextoMap.put("5", "J"); + t9ToTextoMap.put("55", "K"); + t9ToTextoMap.put("555", "L"); + t9ToTextoMap.put("6", "M"); + t9ToTextoMap.put("66", "N"); + t9ToTextoMap.put("666", "O"); + t9ToTextoMap.put("7", "P"); + t9ToTextoMap.put("77", "Q"); + t9ToTextoMap.put("777", "R"); + t9ToTextoMap.put("7777", "S"); + t9ToTextoMap.put("8", "T"); + t9ToTextoMap.put("88", "U"); + t9ToTextoMap.put("888", "V"); + t9ToTextoMap.put("9", "W"); + t9ToTextoMap.put("99", "X"); + t9ToTextoMap.put("999", "Y"); + t9ToTextoMap.put("9999", "Z"); + return t9ToTextoMap; + } +} diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/java/Magdielina.java b/Retos/Reto #30 - EL TECLADO T9 [Media]/java/Magdielina.java new file mode 100644 index 0000000000..ae52bb1f1b --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/java/Magdielina.java @@ -0,0 +1,41 @@ +import java.util.regex.*; +class Magdielina { + public static void main(String[] args) { + System.out.println(getMessage("6-2-4-3-444-33-555-0-55-33-999-22-666-2-777-3")); + } + + public static String getMessage(String numbers){ + char c = ' '; + String[] blocks = numbers.split("-"); + StringBuilder message = new StringBuilder(); + + for (String block : blocks) { + char character = block.charAt(0); + Pattern pattern = Pattern.compile("[^"+ character +"]"); + Matcher matcher = pattern.matcher(block); + if(matcher.find()) { + return "Invalid block found"; + } + + int add = block.length() - 1; + if(add < 3 || (add == 3 && character == '9')){ + switch (character) { + case '2': c = 'A'; break; + case '3': c = 'D'; break; + case '4': c = 'G'; break; + case '5': c = 'J'; break; + case '6': c = 'M'; break; + case '7': c = 'P'; break; + case '8': c = 'T'; break; + case '9': c = 'W'; break; + case '0': c = ' '; break; + default: return "Invalid character found!"; + } + message.append((char)(c + add)); + } else { + return "Invalid block found"; + } + } + return message.toString(); + } +} \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/java/Qv1ko.java b/Retos/Reto #30 - EL TECLADO T9 [Media]/java/Qv1ko.java new file mode 100644 index 0000000000..4cd2869a6f --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/java/Qv1ko.java @@ -0,0 +1,50 @@ +import java.util.HashMap; +import java.util.Map; + +public class Qv1ko { + + public static void main(String[] args) { + System.out.println(t9Translator("66-666-55-444-2")); + } + + private static String t9Translator(String numbers) { + + String result = ""; + Map t9Keyboard = new HashMap(); + t9Keyboard.put("2", "A"); + t9Keyboard.put("3", "D"); + t9Keyboard.put("4", "G"); + t9Keyboard.put("5", "J"); + t9Keyboard.put("6", "M"); + t9Keyboard.put("7", "P"); + t9Keyboard.put("8", "T"); + t9Keyboard.put("9", "W"); + t9Keyboard.put("0", " "); + t9Keyboard.put("22", "B"); + t9Keyboard.put("33", "E"); + t9Keyboard.put("44", "H"); + t9Keyboard.put("55", "K"); + t9Keyboard.put("66", "N"); + t9Keyboard.put("77", "Q"); + t9Keyboard.put("88", "U"); + t9Keyboard.put("99", "X"); + t9Keyboard.put("222", "C"); + t9Keyboard.put("333", "F"); + t9Keyboard.put("444", "I"); + t9Keyboard.put("555", "L"); + t9Keyboard.put("666", "O"); + t9Keyboard.put("777", "R"); + t9Keyboard.put("888", "V"); + t9Keyboard.put("999", "Y"); + t9Keyboard.put("7777", "S"); + t9Keyboard.put("9999", "Z"); + + for(String str : numbers.split("-")) { + result += (t9Keyboard.containsKey(str)) ? t9Keyboard.get(str) : ""; + } + + return result; + + } + +} diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/java/SoleSasia.java b/Retos/Reto #30 - EL TECLADO T9 [Media]/java/SoleSasia.java new file mode 100644 index 0000000000..fe001d753c --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/java/SoleSasia.java @@ -0,0 +1,78 @@ +import java.util.HashMap; +import java.util.Map; + +public class Main { + public static void main(String[] args) { + System.out.println(T9toText("44-666-555-2-0-3-33-888-7777-1111")); //HOLA DEVS! + } + + public static String T9toText(String inputT9) { + + String[] inputT9Blocks = inputT9.split("-"); + + if(!isCorrectFormat(inputT9Blocks)){ + return "Existen campos diferentes en un mismo bloque"; + }; + + Map T9Map = getT9Map(); + + String text = ""; + for (String block : inputT9Blocks) { + text += T9Map.get(block).toUpperCase(); + } + + return text; + }; + + private static boolean isCorrectFormat(String[] inputT9Blocks) { + for (String block : inputT9Blocks) { + if (block.length() > 1 && block.length() < 5) { + char character = block.charAt(0); + for (int i = 0; i < block.length(); i++) { + if (character != block.charAt(i)) { + return false; + } + } + } + } + return true; + } + + private static Map getT9Map() { + Map T9Map = new HashMap<>(); + + T9Map.put("1", ","); + T9Map.put("11", "."); + T9Map.put("111", "?"); + T9Map.put("1111", "!"); + T9Map.put("2", "a"); + T9Map.put("22", "b"); + T9Map.put("222", "c"); + T9Map.put("3", "d"); + T9Map.put("33", "e"); + T9Map.put("333", "f"); + T9Map.put("4", "g"); + T9Map.put("44", "h"); + T9Map.put("444", "i"); + T9Map.put("5", "j"); + T9Map.put("55", "k"); + T9Map.put("555", "l"); + T9Map.put("6", "m"); + T9Map.put("66", "n"); + T9Map.put("666", "o"); + T9Map.put("7", "p"); + T9Map.put("77", "q"); + T9Map.put("777", "r"); + T9Map.put("7777", "s"); + T9Map.put("8", "t"); + T9Map.put("88", "u"); + T9Map.put("888", "v"); + T9Map.put("9", "w"); + T9Map.put("99", "x"); + T9Map.put("999", "y"); + T9Map.put("9999", "z"); + T9Map.put("0", " "); + + return T9Map; + } +} diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/HectorIglesias.js b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/HectorIglesias.js new file mode 100644 index 0000000000..6b8a1f7cef --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/HectorIglesias.js @@ -0,0 +1,147 @@ +/* + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV + * + * 2 --> A,B,C + * 3 --> D,E,F + * 4 --> G,H,I + * 5 --> J,K,L + * 6 --> M,N,O + * 7 --> P,Q,R,S + * 8 --> T,U,V + * 9 --> W,X,Y,Z + */ + +function teclado_t9(entrada){ + let salida= "" + let aux= entrada.split("-") + + if(aux.length > 0){ + for(let i=0; i { + if (teclado[valor]) { + resuldato += teclado[valor]; + } + }); + return resuldato; +} + +console.log(t9('7777-666-999-0-555-88-222-2-7777')); +console.log(t9('6-666-88-777-33-3-33-888')); diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/adri-0311.js b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/adri-0311.js new file mode 100644 index 0000000000..7b8a445173 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/adri-0311.js @@ -0,0 +1,22 @@ +const entrada = "6-666-88-777-33-3-33-888"; +const plantilla = { + 2: "ABC", + 3: "DEF", + 4: "GHI", + 5: "JKL", + 6: "MNO", + 7: "PQRS", + 8: "TUV", + 9: "WXYZ", +}; + +const process = (entrada) => { + const entradaSplit = entrada.split("-"); + let result = ""; + for (const n of entradaSplit) { + result += plantilla[n[0]][n.length - 1]; + } + return result; +}; + +console.log(process(entrada)); diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/gaizkadvlp.js b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/gaizkadvlp.js new file mode 100644 index 0000000000..b408ed7bb5 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/gaizkadvlp.js @@ -0,0 +1,48 @@ +/* + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV + */ + +const TECLADO = [ + [',','.','!','?'], + ['A','B','C'], + ['D','E','F'], + ['G','H','I'], + ['J','K','L'], + ['M','N','O'], + ['P','Q','R','S'], + ['T','U','V'], + ['W','X','Y','Z'], + [' '] +]; + +const ENTRADA = "6-666-88-777-33-3-33-888"; + +function transformaPulsaciones(cadena) { + console.log("Entrada: ", cadena) + + let posX = posY = ''; + let temp = cadena.split('-'); + let salida = ""; + + for (let i=0; i { + let arrayElement = element.split(""); + if (arrayElement.length >= 2) { + for (let i = 0; i < arrayElement.length; i++) { + if (typeof arrayElement[i + 1] === "undefined") { + if (arrayElement[i] != arrayElement[i - 1]) { + isNumberBlockValid = false; + break; + } + } else if (arrayElement[i] != arrayElement[i + 1]) { + isNumberBlockValid = false; + break; + } + } + } + }); + + return { TrueOrFalse: isNumberBlockValid, ArrayTest: arrayNumberBlock }; +} + +function decodeMessage(numberBlock) { + let responseValidateNumberBlock = validateNumberBlock(numberBlock); + if (!responseValidateNumberBlock.TrueOrFalse) + return "We're sorry, but your number block is invalid"; + + let message = ""; + const decode = { + 2: "a", 22: "b", 222: "c", + 3: "d", 33: "e", 333: "f", + 4: "g", 44: "h", 444: "i", + 5: "j", 55: "k", 555: "l", + 6: "m", 66: "n", 666: "o", + 7: "p", 77: "q", 777: "r", 7777: "s", + 8: "t", 88: "u", 888: "v", + 9: "w", 99: "x", 999: "y", 9999: "z", + }; + + responseValidateNumberBlock.ArrayTest.forEach((element) => { + if (typeof decode[element] === "undefined"){ + message += " "; + } else { + message += decode[element]; + } + }); + + return message.toUpperCase(); +} + +console.log(decodeMessage("6-666-88-777-33-3-33-888")); diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/jmlopezt.js b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/jmlopezt.js new file mode 100644 index 0000000000..71bed82e3d --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/jmlopezt.js @@ -0,0 +1,70 @@ +/* + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV + */ + +const keyPadMap = new Map([ + ['2', 'ABC'], + ['3', 'DEF'], + ['4', 'GHI'], + ['5', 'JKL'], + ['6', 'MNO'], + ['7', 'PQRS'], + ['8', 'TUV'], + ['9', 'WXYZ'], + ['0', ' '], + ]); + +function evaluate(expression) { + let decoded = ''; + if (typeof expression !== 'string') { + throw new Error(`Invalid input: ${expression}`); + } + + const chars = expression.split('-'); + for (const char of chars) { + if (isValidSequence(char)) { + decoded += multitapDecode(char); + } else { + throw new Error(`Found Invalid sequence: ${char}`); + } + } + return decoded; +} + +function isValidSequence(input){ + const sequenceRegex = /^(\d)\1*$/; + return sequenceRegex.test(input); +} + +function multitapDecode(sequence){ + let decoded = ''; + if (keyPadMap.has(sequence[0])) { + const mapValueSplitted = keyPadMap.get(sequence[0]).split(''); + decoded = mapValueSplitted.length >= sequence.length ? + mapValueSplitted[sequence.length-1] : + '?'; + } else { + throw new Error(`Invalid character: ${sequence[0]}`); + } + return decoded; +} + +// Test cases + +console.log(evaluate('2-22-222')); // Output: ABC +console.log(evaluate('999-444-33')); // Output: YIE +console.log(evaluate('2-ccc-3')); // Output: Found Invalid sequence +console.log(evaluate('7-111')); // Output: Invalid character +console.log(evaluate('2-3333-44')); // Output: A?H +console.log(evaluate(33)); // Output: Invalid input \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/nlarrea.js b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/nlarrea.js new file mode 100644 index 0000000000..5a94c3ed0d --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/nlarrea.js @@ -0,0 +1,46 @@ +/* + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV + */ + + +const t9Keyboard = { + 0: ' ', + 1: ',.?!', + 2: 'ABC', + 3: 'DEF', + 4: 'GHI', + 5: 'JKL', + 6: 'MNO', + 7: 'PQRS', + 8: 'TUV', + 9: 'WXYZ' +}; + + +function decodeT9Keyboard(text) { + const chars = text.split('-'); + + let decodedText = ''; + for (let char of chars) { + const times = char.length - 1; + + decodedText += t9Keyboard[parseInt(char[0])][times]; + } + + return decodedText; +} + + +console.log(decodeT9Keyboard('6-666-88-777-3-33-888')); // MOUREDEV +console.log(decodeT9Keyboard('444-0-2-6-0-66-555-2-777-777-33-2')); // I AM NLARREA \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/noehum7.js b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/noehum7.js new file mode 100644 index 0000000000..6e7ebf059c --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/noehum7.js @@ -0,0 +1,17 @@ +function conversionT9(cadena) { + map = { + 2: "ABC", + 3: "DEF", + 4: "GHI", + 5: "JKL", + 6: "MNO", + 7: "PQRS", + 8: "TUV", + 9: "WXYZ", + } + const cadenaArray = cadena.split("-"); + const resultado = cadenaArray.map(pulsacion => map[pulsacion.charAt(0)]?.charAt(pulsacion.length - 1)).join("").toLowerCase(); + return resultado; +} + +console.log(conversionT9("6-666-88-777-33-3-33-888")); diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/npminit-dev.js b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/npminit-dev.js new file mode 100644 index 0000000000..b26b24378b --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/npminit-dev.js @@ -0,0 +1,39 @@ + +// En este ejemplo utilizare la tabla ascii para convertir los numeros +// del teclado T9 a su salida de texto correspondiente + +const example = '6-666-88-777-33-3-33-888' // esperado: mouredev +const example2 = '66-7-6-444-66-444-8-3-33-888' // esperado: npminitdev +const example3 = '2-22-222-3-33-333-4-44-444-5-55-555-6-66-666-7-77-777-7777-8-88-888-9-99-999-9999' + +function normalizeT9Entry(t9entry){ + let result = '' // resultado final + let t9letters = t9entry.split('-') // dividimos los numeros en un array separando por el caracter '-' + for(let i = 0; i < t9letters.length; i++) { // recorremos cada numero/s + let num = parseInt(t9letters[i][0]); // obtenemos numero individual, pasado a number + let numCode = t9letters[i][0].charCodeAt(0); // codigo ascii del numero + let Ascii = + numCode + 47 + /* 1 */ + ((num - 2) * 2) + /* 2 */ + (t9letters[i].length - 1); /* 3 */ + /* + esta suma se resume asi: + 1 - Al codigo ASCII del numero le suma 47 (47 es la distancia entre el codigo del caracter 2 y el caracter 'a') + 2 - Le sumamos: el numero menos 2 y al resultado lo multiplicamos por 2 + esto es para obtener el codigo ASCII de la primer letra correspondiente al numero del teclado T9 + (en el caso del numero 7 el codigo de la primera letra (p) es 112) + 3 - Le sumamos: la longitud de la cadena (por ejemplo 777) menos 1 + resultado: el codigo ascii de la letra esperada (para 777 obtenemos 114) + */ + if(num >= 8) Ascii += 1 // como el numero 7 del teclado T9 tiene 4 letras tenemos que movernos +1 a partir de ahi + result += String.fromCharCode(Ascii) // concatenamos la letra resultado, y asi con todas las iteraciones + } + return result +} + +console.log(normalizeT9Entry(example)); // obtenido: mouredev +console.log(normalizeT9Entry(example2)); // obtenido: npminitdev +console.log(normalizeT9Entry(example3)); // obtenido: abcdefghijklmnopqrstuvwxyz + +// Nota: esta solucion asume que las entradas siempre son validas, la serie 6666 imprimira 'p' que pertenece al numero 7 del teclado T9 +// Mi idea era utilizar la minima cantidad de variables posibles pero para clarificar use mas de las esperadas \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/othamae.js b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/othamae.js new file mode 100644 index 0000000000..eab5b41d38 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/othamae.js @@ -0,0 +1,42 @@ +/* + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV + */ + +const T9 = { + 0: ' ', + 2: 'ABC', + 3: 'DEF', + 4: 'GHI', + 5: 'JKL', + 6: 'MNO', + 7: 'PQRS', + 8: 'TUV', + 9: 'WXYZ' +} + +const pulseTranslation = (pulsations) => { + let result = '' + const numbers = pulsations.split('-') + for (let i = 0; i < numbers.length; i++) { + const puls = numbers[i].length + const letters = T9[numbers[i][0]].split('') + result += letters[puls - 1] + } + return result +} + +console.log(pulseTranslation('6-666-88-777-33-3-33-888')) + + +console.log(pulseTranslation('666-8-44-2-6-2-33')) diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/pepegonzale.js b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/pepegonzale.js new file mode 100644 index 0000000000..c4efd7fbda --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/pepegonzale.js @@ -0,0 +1,28 @@ + +const teclado_t9 = (bloque_pulsaciones) => { + const dictionary = [ + [".", ",", "?", "!"], + ["A", "B", "C"], + ["D", "E", "F"], + ["G", "H", "I"], + ["J", "K", "L"], + ["M", "N", "O"], + ["P", "Q", "R", "S"], + ["T", "U", "V"], + ["W", "X", "Y", "Z"] + ] + const seccion_numeros = bloque_pulsaciones.split("-") + let result = ''; + + for (var i = 0; i < seccion_numeros.length; i++) { + let num = seccion_numeros[i] + let zone = num[0] -1 + let howMany = num.length - 1 + result += dictionary[zone][howMany] + } + return result + } + + + + teclado_t9("6-666-88-777-33-3-33-888") \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/s0alken.js b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/s0alken.js new file mode 100644 index 0000000000..55c61fe2a7 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/s0alken.js @@ -0,0 +1,26 @@ +const decodeMessage = (pressed) => { + + keys = [ + ' 0', + '.?!1', + 'ABC2', + 'DEF3', + 'GHI4', + 'JKL5', + 'MNO6', + 'PQRS7', + 'TUV8', + 'WXYZ9', + ] + + return pressed.split('-').reduce((message, sequence) => { + const number = Number(sequence[0]); + const char = sequence.length - 1; + message += keys[number][char]; + return message; + }, '') +} + +console.log(decodeMessage('6-666-88-777-33-3-33-888')) + + diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/test0n3.js b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/test0n3.js new file mode 100644 index 0000000000..fbc8546ebe --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/javascript/test0n3.js @@ -0,0 +1,61 @@ +// +// Los primeros dispositivos móviles tenían un teclado llamado T9 +// con el que se podía escribir texto utilizando únicamente su +// teclado numérico (del 0 al 9). +// +// Crea una función que transforme las pulsaciones del T9 a su +// representación con letras. +// - Debes buscar cuál era su correspondencia original. +// - Cada bloque de pulsaciones va separado por un guión. +// - Si un bloque tiene más de un número, debe ser siempre el mismo. +// - Ejemplo: +// Entrada: 6-666-88-777-33-3-33-888 +// Salida: MOUREDEV +// + +const cellphoneDial = (input) => { + const dial = { + 1: "1", + 2: "ABC2", + 3: "DEF3", + 4: "GHI4", + 5: "JKL5", + 6: "MNO6", + 7: "PQRS7", + 8: "TUV8", + 9: "WXYZ9", + 0: " 0", + "*": "*", + "#": "#", + }; + + return input + .split("-") + .map((char) => { + let char_pos = (char.length % dial[char[0]].length) - 1; + return dial[char[0]].slice(char_pos)[0]; + }) + .join(""); +}; + +const tests = { + inputs: [ + "6-666-88-777-33-3-33-888", + "8-444-6-33-0-8-666-0-7777-555-33-33-7", + "6-999-0-66-88-6-22-33-777-0-444-7777-0-99999-4444-77777-0-4444-2222-2222-0-3333-2222-4444", + "6-99999999-0-8-33-777777777-8", + ], + outputs: ["MOUREDEV", "TIME TO SLEEP", "MY NUMBER IS 947 422 324", "MY TEST"], +}; + +let errors = 0; +tests.inputs.forEach((input, index) => { + const result = cellphoneDial(input); + if (result != tests.outputs[index]) { + errors += 1; + console.log( + `Error - input: ${input}, expected: ${tests.outputs[index]}, result: ${result}` + ); + } +}); +console.log(`Errors: ${errors}`); diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/kotlin/marchdz.kt b/Retos/Reto #30 - EL TECLADO T9 [Media]/kotlin/marchdz.kt new file mode 100644 index 0000000000..39b0e87756 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/kotlin/marchdz.kt @@ -0,0 +1,19 @@ +fun t9ToText(input: String) { + + val t9Map = mapOf( + "2" to 'A', "22" to 'B', "222" to 'C', "3" to 'D', "33" to 'E', "333" to 'F', "4" to 'G', "44" to 'H', + "444" to 'I', "5" to 'J', "55" to 'K', "555" to 'L', "6" to 'M', "66" to 'N', "666" to 'O', "7" to 'P', + "77" to 'Q', "777" to 'R', "7777" to 'S', "8" to 'T', "88" to 'U', "888" to 'V', "9" to 'W', "99" to 'X', + "999" to 'Y', "9999" to 'Z', "0" to " " + ) + + val output = input.split("-").mapNotNull { t9Map[it] }.joinToString("") + + println(output) +} + +fun main() { + t9ToText("6-666-88-777-33-3-33-888") // MOUREDEV + t9ToText("333-88-66-222-444-666-66-2-0-666-55") // FUNCIONA OK + t9ToText("H2O-333-88-66-222-88888-444-666-66-2-0-666-55-1") // FUNCIONA OK +} diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/kotlin/pisanowp.kt b/Retos/Reto #30 - EL TECLADO T9 [Media]/kotlin/pisanowp.kt new file mode 100644 index 0000000000..f15007d509 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/kotlin/pisanowp.kt @@ -0,0 +1,90 @@ +fun main() { + + /* + * Reto #30 24/07/2023 EL TECLADO T9 + * + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV + * + * 1 .,?! 2 ABC 3 DEF + * 4 GHI 5 JKL 6 MNO + * 7 PRS 8 TUV 9 WXYZ + * + */ + + var input = "6-666-88-777-33-3-33-888" + println( "${input} => ${t9InputToString(input)}") + + print("Introduce entrada >") + input = readLine().toString() + println( "${input} => ${t9InputToString(input)}") + +} + +fun t9InputToString(input : String):String{ + val listaPulsaciones = input.split('-') + var resultado = ""; + listaPulsaciones.forEach { + val letra = t9Transform(it) + println("$it => $letra" ) + resultado += letra + } + + return resultado; +} + +fun t9Transform(bloque:String):Char{ + return when (bloque) { + "1" -> '.' + "11" -> ',' + "111" -> '?' + "1111" -> '!' + + "2" -> 'A' + "22" -> 'B' + "222" -> 'C' + + "3" -> 'D' + "33" -> 'E' + "333" -> 'F' + + "4" -> 'G' + "44" -> 'H' + "444" -> 'I' + + "5" -> 'J' + "55" -> 'K' + "555" -> 'L' + + "6" -> 'M' + "66" -> 'N' + "666" -> 'O' + + "7" -> 'P' + "77" -> 'Q' + "777" -> 'R' + "7777" -> 'S' + + "8" -> 'T' + "88" -> 'U' + "888" -> 'V' + + "9" -> 'W' + "99" -> 'X' + "999" -> 'Y' + "9999" -> 'Z' + + else -> ' ' + } + +} \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/objective-c/AngelZC790347.m b/Retos/Reto #30 - EL TECLADO T9 [Media]/objective-c/AngelZC790347.m new file mode 100644 index 0000000000..d0d98abf59 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/objective-c/AngelZC790347.m @@ -0,0 +1,30 @@ +#import +NSString* t9_transform(NSString*input){ + NSDictionary *dictionary = @{ + @0 : @"¬", + @1 : @"@", + @2 : @"abc", + @3 : @"def", + @4 : @"ghi", + @5 : @"jkl", + @6 : @"mno", + @7 : @"pqrs", + @8 : @"tuv", + @9 : @"wxyz", + }; + NSArray * pattern = [input componentsSeparatedByString:@"-"]; + NSMutableString * message = [[NSMutableString alloc] init]; + for (int i = 0; i < pattern.count; ++i) + { + NSString * value= pattern[i]; + NSNumber * key = [NSNumber numberWithInt:[[value substringToIndex:1] integerValue]]; + [message appendFormat:@"%c",[dictionary[key] characterAtIndex:value.length-1]]; + } + return message; +} + +int main(int argc, char const *argv[]) +{ + NSLog(@"%@",t9_transform(@"6-666-88-777-33-3-33-888")); + return 0; +} \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/php/LucasSantillan.php b/Retos/Reto #30 - EL TECLADO T9 [Media]/php/LucasSantillan.php new file mode 100644 index 0000000000..1c68590c6c --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/php/LucasSantillan.php @@ -0,0 +1,48 @@ +" ", + "2"=>"A", + "22"=>"B", + "222"=>"C", + "3"=>"D", + "33"=>"E", + "333"=>"F", + "4"=>"G", + "44"=>"H", + "444"=>"I", + "5"=>"J", + "55"=>"K", + "555"=>"L", + "6"=>"M", + "66"=>"N", + "666"=>"O", + "7"=>"P", + "77"=>"Q", + "777"=>"R", + "7777"=>"S", + "8"=>"T", + "88"=>"U", + "888"=>"V", + "9"=>"W", + "99"=>"X", + "999"=>"Y", + "9999"=>"Z" +]; + +function t9($mensaje) { + global $teclado; + $decod_mensaje = explode("-", $mensaje); + $resultado = ""; + + foreach ($decod_mensaje as $valor) { + if (isset($teclado[$valor])) { + $resultado .= $teclado[$valor]; + } + } + + return $resultado; +} + +echo t9("7777-666-999-0-555-88-222-2-7777"); +echo "\n" . t9("6-666-88-777-33-3-33-888"); +?> diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/CambiaNombres.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/CambiaNombres.py new file mode 100644 index 0000000000..538f585c64 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/CambiaNombres.py @@ -0,0 +1,45 @@ +''' + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). +''' +# Crea una función que transforme las pulsaciones del T9 a su representación con letras. +def t9(entrada: str) -> str: + + salida = "" + +# - Debes buscar cuál era su correspondencia original. + teclas = [[".", ",", "'", "1"], ["a", "b", "c", "2"], ["d", "e", "f", "3"], + ["g", "h", "i", "4"], ["j", "k", "l", "5"], ["m", "n", "o", "6"], + ["p", "q", "r", "s", "7"], ["t", "u", "v", "8"], ["w", "x", "y", "z", "9"], + [" ", "0"]] + + block = "" + + if entrada == "": # Si está vacía + return salida # Se retorna "" + else: +# - Cada bloque de pulsaciones va separado por un guión. + lista = entrada.split("-") # Se guarda en una lista donde se divide la entrada por cada "-" + for block in lista: + added = False + if block.isdigit(): # Si es un dígito + for number in block: +# - Si un bloque tiene más de un número, debe ser siempre el mismo. + if len(block) == block.count(str(number)): # Si son iguales todos los digitos + if not added: # Si no ha sido agregado + salida += teclas[int(number) - 1][len(block) - 1] + added = True + else: + return "" + else: + return "" + + return salida +''' + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV +''' +print(t9("6-666-88-777-33-3-33-888")) +print(t9("44-666-555-2")) # Salida = hola \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/CarlxsCanx.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/CarlxsCanx.py new file mode 100644 index 0000000000..2d8b4132d2 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/CarlxsCanx.py @@ -0,0 +1,52 @@ +""" +Enunciado + + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV + +""" + + +lst = [[], ['a', 'b', 'c'],['d','e','f'],['g','h','i'], ['j','k','l'], ['m','n','o'],['p','q','r','s'],['t','u','v'],['w','x','y','z']] + +def input_chain(chain): # only return a list with the string split with '-' + return chain.split('-') + +def is_valid_block(chain): # Select a valid block with only one character in the string if there have two or more characters + for block in chain: + num = len(set(block)) + if num >= 2: + print('Inserte una cadena valida') + return False + else: + continue + return True + +def join_a_word(chain): + lst_tup = [] + word = [] + if is_valid_block(chain): + for ch in chain: + if ch.isnumeric(): + tup = (int(ch[0])-1, len(ch)-1) # The tuple contains a number and stimes pulse the number. + lst_tup.append(tup) + for tup in lst_tup: + if tup: + k,j = tup + word.append(lst[k][j]) + word = ''.join(word) + print(word) + +chain = "6-666-88-777-33-3-33-888" +chain = input_chain(chain) +chain = join_a_word(chain) diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/Hugovrc.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/Hugovrc.py new file mode 100644 index 0000000000..017ba750ad --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/Hugovrc.py @@ -0,0 +1,15 @@ +def teclado_T9(pulsaciones: str): + teclado = {"2":"ABC", "3":"DEF", "4":"GHI", "5":"JKL", "6":"MNO", "7":"PQRS", "8":"TUV", "9":"WXYZ"} + #print(teclado.get("2")[0]) + #print(teclado["2"][0]) + letra = [] + palabra = "" + + letra = pulsaciones.split("-") + for tecla in letra: + if tecla[0] in teclado.keys(): + palabra += teclado[tecla[0]][len(tecla)- 1]# + print(palabra) + +teclado_T9("6-666-88-777-33-3-33-888") +teclado_T9("44-88-4-656") \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/KevinED11.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/KevinED11.py new file mode 100644 index 0000000000..45792a6d3e --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/KevinED11.py @@ -0,0 +1,41 @@ +from functools import lru_cache + + +T9Keyboard = dict[str, str] + + +class InvalidT9Key(Exception): + def __init__(self, message: str) -> None: + super().__init__(message) + + +@lru_cache(maxsize=120) +def get_t9_keyboard() -> T9Keyboard: + return {str(n): (" ", ",.?!", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ")[n] for n in range(10)} + + +def convert_t9_key_to_character(key: str) -> str: + if (num_pressed := key[0]) not in get_t9_keyboard(): + raise InvalidT9Key("Enter a valid t9 key") + + return get_t9_keyboard()[num_pressed][len(key) - 1] + + +@lru_cache(maxsize=120) +def t9_to_text(keys: str) -> str: + if not isinstance(keys, str) or not keys: + raise ValueError("Enter a T9 secuence string") + + return "".join(convert_t9_key_to_character(key=key) for key in keys.split("-")) + + +def main() -> None: + try: + mouredev = t9_to_text("6-666-88-777-33-3-33-888") + print(mouredev) + except (ValueError, InvalidT9Key) as err: + print(err) + + +if __name__ == "__main__": + main() diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/Rusian69.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/Rusian69.py new file mode 100644 index 0000000000..3143b2e5ca --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/Rusian69.py @@ -0,0 +1,41 @@ +# Los primeros dispositivos móviles tenían un teclado llamado T9 +# con el que se podía escribir texto utilizando únicamente su +# teclado numérico (del 0 al 9). + +# Crea una función que transforme las keystrokes del T9 a su +# representación con letras. + +# - Debes buscar cuál era su correspondencia original. +# - Cada bloque de keystrokes va separado por un guión. +# - Si un bloque tiene más de un número, debe ser siempre el mismo. +# - Ejemplo: +# Entrada: 6-666-88-777-33-3-33-888 +# Salida: MOUREDEV + +teclado = {"1":[".",",","?","!"], "2":["a","b","c"], + "3":["d","f","g"], "4":["h","i","j"], + "5":["k","l","m"], "6":["n","o","p"], + "7":["q","r","s"], "8":["t","u","v"], + "9":["w","x","y","z"], "0": [" "] + } + +def keyboar_t9 (numb:str): + try: + actual_num = "" + number_long = 0 + result = "" + for index in numb: + if index == "-": + result += teclado[actual_num][number_long-1] + number_long = 0 + else: + actual_num = index + number_long += 1 + index = "" + if index == "": + result += teclado[actual_num][number_long-1] + return result + except: + return {"ERROR": "ERROR UNEPEXT"} + +print(keyboar_t9("4-66-55-2")) diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/SantiALS.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/SantiALS.py new file mode 100644 index 0000000000..78fc5fda2e --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/SantiALS.py @@ -0,0 +1,37 @@ +''' + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV +''' + + +def traductorT9(texto): + + t9 = {"1": ".", "11": ",", "111": "?", "1111": "!", "2": "A", "22": "B", "222": "C", "3": "D", "33": "E", + "333": "F", "4": "G", "44": "H", "444": "I", "5": "J", "55": "K", "555": "L", "6": "M", + "66": "N", "666": "O", "7": "P", "77": "Q", "777": "R", "7777": "S", "8": "T", "88": "U", "888": "V", + "9": "W", "99": "X", "999": "Y", "9999": "Z", "0": " "} + + texto = texto.split('-') + texto_T9 = '' + + for clave in texto: + + if clave in t9.keys(): + texto_T9 += t9[clave] + else: + texto_T9 += clave + + return texto_T9 + +print(traductorT9("6-666-88-777-33-3-33-888")) +print(traductorT9(input("Pulsaciones a traducir: "))) diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/ShinMugenNoKabe.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/ShinMugenNoKabe.py new file mode 100644 index 0000000000..e55c64c14a --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/ShinMugenNoKabe.py @@ -0,0 +1,56 @@ +# Los primeros dispositivos móviles tenían un teclado llamado T9 +# con el que se podía escribir texto utilizando únicamente su +# teclado numérico (del 0 al 9). + +# Crea una función que transforme las keystrokes del T9 a su +# representación con letras. + +# - Debes buscar cuál era su correspondencia original. +# - Cada bloque de keystrokes va separado por un guión. +# - Si un bloque tiene más de un número, debe ser siempre el mismo. +# - Ejemplo: +# Entrada: 6-666-88-777-33-3-33-888 +# Salida: MOUREDEV + + +T9_KEYBOARD = { + "1": [",", ".", "?", "!"], + "2": ["A", "B", "C"], + "3": ["D", "E", "F"], + "4": ["G", "H", "I"], + "5": ["J", "K", "L"], + "6": ["M", "N", "O"], + "7": ["P", "Q", "R", "S"], + "8": ["T", "U", "V"], + "9": ["W", "X", "Y", "Z"], + "0": [" "] +} + + +def get_character(keystroke: str) -> str: + num_pressed = keystroke[0] + times_pressed = len(keystroke) + + if not num_pressed in T9_KEYBOARD: + raise ValueError("Invalid number") + + return T9_KEYBOARD[num_pressed][times_pressed - 1] + + +def get_t9_text(keystrokes: str) -> str: + if not keystrokes: + raise ValueError("Please type something in your keyboard") + + keystrokes_secuence = keystrokes.split("-") + + return "".join([get_character(keystroke) for keystroke in keystrokes_secuence]) + + +if __name__ == "__main__": + mouredev = get_t9_text("6-666-88-777-33-3-33-888") + assert mouredev == "MOUREDEV" + print(mouredev) + + saludos_amigos = get_t9_text("7777-2-555-88-3-666-7777-0-2-6-444-4-666-7777-1111-1111") + assert saludos_amigos == "SALUDOS AMIGOS!!" + print(saludos_amigos) \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/alberba.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/alberba.py new file mode 100644 index 0000000000..6045b8fb34 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/alberba.py @@ -0,0 +1,19 @@ +def t9_to_text (t9: str) -> str: + teclado = [(" "), (".", ",", "?", "!"), ("A", "B", "C"), ("D", "E", "F"), + ("G", "H", "I"), ("J", "K", "L"), ("M", "N", "O"), + ("P", "Q", "R", "S"), ("T", "U", "V"), ("W", "X", "Y", "Z")] + texto = "" + caracteres = t9.split("-") + for caracter in caracteres: + cantidad = 0 + for number in caracter: + if number == caracter[0]: + cantidad += 1 + else: + return "Cada bloque debe tener el mismo número" + if len(teclado[int(caracter[0])]) < cantidad: + return f"No existe ninguna letra que tenga tantos {caracter[0]}" + texto += teclado[int(caracter[0])][cantidad - 1] + return texto + +print(t9_to_text("6-33-0-555-555-2-6-666-0-555-88-222-2-7777")) \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/carsevilla.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/carsevilla.py new file mode 100644 index 0000000000..611793f501 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/carsevilla.py @@ -0,0 +1,4 @@ +keys = ' -,.?!-ABC-DEF-GHI-JKL-MNO-PQRS-TUV-WXYZ' + +def T9(input: str) -> str: + return ''.join([keys.split('-')[int(v[0])][len(v)-1] for v in input.split('-')]) diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/drifterDev.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/drifterDev.py new file mode 100644 index 0000000000..e32b528125 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/drifterDev.py @@ -0,0 +1,22 @@ +def teclado_t9(input_nums: list[str]) -> str: + letters = { + "1": ",.?!", + "2": "ABC", + "3": "DEF", + "4": "GHI", + "5": "JKL", + "6": "MNO", + "7": "PQRS", + "8": "TUV", + "9": "WXYZ", + "0": " ", + } + res = [] + for string in input_nums: + res.append(letters[string[0]][len(string) - 1]) + return "".join(res) + + +if __name__ == "__main__": + input_nums = input().split("-") + print(teclado_t9(input_nums)) diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/fjgonzalezbarea.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/fjgonzalezbarea.py new file mode 100644 index 0000000000..1ede3eb9d2 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/fjgonzalezbarea.py @@ -0,0 +1,51 @@ +""" + Los primeros dispositivos móviles tenían un teclado llamado T9 + con el que se podía escribir texto utilizando únicamente su + teclado numérico (del 0 al 9). + + Crea una función que transforme las pulsaciones del T9 a su + representación con letras. + - Debes buscar cuál era su correspondencia original. + - Cada bloque de pulsaciones va separado por un guión. + - Si un bloque tiene más de un número, debe ser siempre el mismo. + - Ejemplo: + Entrada: 6-666-88-777-33-3-33-888 + Salida: MOUREDEV +""" + +t9_keyboard = [' ', ',.?!', 'ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ'] + + +def validate_block_content(block: str) -> bool: + characters_set = set(block) # Remove duplicated. Therefore, there should be just 1 element + all_numeric = all(character.isnumeric() for character in characters_set) # Check all are numeric + return len(characters_set) == 1 and all_numeric + + +def translate_block_to_letter(block: str) -> str: + if not validate_block_content(block): + raise ValueError(f"Wrong block. Each block should contain 1 single number that may be repeated 1 or more times. Received {block}") + t9_number = int(block[0]) + letters_for_number = t9_keyboard[t9_number] + + # We need to be aware that the user may send more clicks than letters in the position. E.g. 22222 => 'B' + number_of_clicks = len(block) % len(letters_for_number) + return letters_for_number[number_of_clicks - 1] + + +def main(chain: str): + translated_text = "".join([translate_block_to_letter(block) for block in chain.split("-")]) + print(f"Translated text: {translated_text}") + + +""" +Examples: +- Input: 6-666-88-777-33-3-33-888 + Output: MOUREDEV + +- Input: 6666-666666-88888-7777777-33333-3333-33333-888888 --> More clicks than letters in the keyboard number + Output: MOUREDEV +""" +if __name__ == '__main__': + t9_input = input("Please, introduce a t9 valid chain: ") + main(t9_input) diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/gonsomito.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/gonsomito.py new file mode 100644 index 0000000000..90c8b05801 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/gonsomito.py @@ -0,0 +1,41 @@ +""" + * Crea una función que transforme las pulsaciones del T9 a su representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV +""" + +def teclado_9(secuencia): +#compruebo que entra un bloque con elementos y si entra vacío me voy + if len(secuencia) == 0: + return "" + +#declaro variables + dict_teclado={"1":",", "11":".", "111":"?", "1111":"!", "11111":"@", + "2":"A", "22":"B","222":"C","3":"D","33":"E","333":"F", + "4":"G", "44":"H", "444":"I", "5":"J", "55":"K", "555":"L", + "6":"M", "66":"N", "666":"O", "6666":"Ñ", "7":"P", "77":"Q", "777":"R", "7777":"S", + "8":"T", "88":"U", "888":"V", "9":"W", "99":"X", "999":"Y", "9999":"Z", "0":" "} + secuencia=secuencia.split("-") + traduccion="" + print(secuencia) +#reviso cada nuevo bloque. me quedo con el primer valor de cada bloque para que no haya diferencias + for bloque in secuencia: + if len(bloque) > 0: + bloque=bloque[0]*len(bloque) + if bloque in dict_teclado: + traduccion= traduccion + dict_teclado[bloque] + else: + traduccion= traduccion + "_" + return traduccion + +print(teclado_9("6-666-88-777-33-3-33-888")) #MOUREDEV +print(teclado_9("44-666-555-2-1-0-22-88-33-66-2-7777-0-8-2-777-3-33-7777-1111")) #HOLA, BUENAS TARDES! +print(teclado_9("6-656-88-757-33-3-33-858")) #MOUREDEV pero forzando bloques con numeros mal +print("problemas:") +print(teclado_9("")) #PROBLEMA 0 - SIN ELEMENTOS +print(teclado_9("68866-00-66-66666-1-1111111")) #PROBLEMA 1 - DUPLICADO NÚMEROS +print(teclado_9("666-0--66-666--1111")) #PROBLEMA 2 - DUPLICADO guión (-) diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/ivanespinola.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/ivanespinola.py new file mode 100644 index 0000000000..b0582530b0 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/ivanespinola.py @@ -0,0 +1,67 @@ +phone_codes_list = { + 2: 'a', + 22: 'b', + 222: 'c', + 3: 'd', + 33: 'e', + 333: 'f', + 4: 'g', + 44: 'h', + 444: 'i', + 5: 'j', + 55: 'k', + 555: 'l', + 6: 'm', + 66: 'n', + 666: 'o', + 7: 'p', + 77: 'q', + 777: 'r', + 7777: 's', + 8: 't', + 88: 'u', + 888: 'v', + 9: 'w', + 99: 'x', + 999: 'y', + 9999: 'z' +} + +input_code = input('Entrada: ').split('-') + +def verify_input(input_code): + for code in input_code: + if not code.isnumeric(): + print('Los códigos tienen que ser numéricos.') + return False + + code_to_int = int(code) + if code_to_int not in phone_codes_list: + print('Hay un código que no es válido.') + return False + + if len(code) > 1: + number_to_verify = code[0] + for number in code: + if number != number_to_verify: + print('Si un bloque tiene más de un número, debe ser siempre el mismo.') + return False + return True + + + +def print_text(input_code, phone_codes_list, verify_input): + if verify_input(input_code): + print('Salida: ', end='') + for code in input_code: + code_to_int = int(code) + print((phone_codes_list[code_to_int]).upper(), end='') + print() + print('¡¡ Todo salió perfecto !!') + else: + print('¡¡ Algo ha salido mal !!') + + + +print_text(input_code, phone_codes_list, verify_input) + diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/javierfiestasbotella.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/javierfiestasbotella.py new file mode 100644 index 0000000000..fc11a89624 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/javierfiestasbotella.py @@ -0,0 +1,19 @@ +def teclado_t9(): + letra='' + palabra='' + t9={'a':2,'b':22,'c':222,'d':3,'e':33,'f':333,'g':4,'h':44,'i':444,'j':5,'k':55,'l':555,'m':6,'n':66,'o':666,'p':7,'q':77,'r':777,'s':7777,'t':8,'u':88,'v':888,'w':9,'x':99,'y':999,'z':9999} + teclas=input('Teclea separando con un guion: ') + for i in teclas: + if i!='-' or i==teclas[-1]: + letra+=i + else: + for clave,valor in t9.items(): + if valor==int(letra): + palabra+=clave.upper() + letra='' + for clave, valor in t9.items(): + if valor == int(letra): + palabra += clave.upper() + return palabra + + diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/jcdm60.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/jcdm60.py new file mode 100644 index 0000000000..e0b261ce02 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/jcdm60.py @@ -0,0 +1,55 @@ +# Reto #30: El teclado T9 +#### Dificultad: Media | Publicación: 24/07/23 | Corrección: 31/07/23 + +## Enunciado + + +# +# Los primeros dispositivos móviles tenían un teclado llamado T9 +# con el que se podía escribir texto utilizando únicamente su +# teclado numérico (del 0 al 9). +# +# Crea una función que transforme las pulsaciones del T9 a su +# representación con letras. +# - Debes buscar cuál era su correspondencia original. +# - Cada bloque de pulsaciones va separado por un guión. +# - Si un bloque tiene más de un número, debe ser siempre el mismo. +# - Ejemplo: +# Entrada: 6-666-88-777-33-3-33-888 +# Salida: MOUREDEV +# + +class T9Converter: + def __init__(self): + self.t9_mapping = { + '0': ' ', + '2': 'ABC', + '3': 'DEF', + '4': 'GHI', + '5': 'JKL', + '6': 'MNO', + '7': 'PQRS', + '8': 'TUV', + '9': 'WXYZ' + } + + def t9_to_letters(self, keypresses): + result = [] + keypresses = keypresses.split('-') + + for block in keypresses: + num = block[0] + times = len(block) + letter = self.t9_mapping[num][times - 1] + result.append(letter) + + return ''.join(result) + +if __name__ == "__main__": + input_sequence1 = "6-666-88-777-33-3-33-888" + input_sequence2 = "5-88-2-66-0-222-2-777-555-666-7777" + t9_converter = T9Converter() + output = t9_converter.t9_to_letters(input_sequence1) + print(output) # "MOUREDEV" + output = t9_converter.t9_to_letters(input_sequence2) + print(output) # "JUAN CARLOS" \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/jpirulo.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/jpirulo.py new file mode 100644 index 0000000000..3a847f545f --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/jpirulo.py @@ -0,0 +1,44 @@ +from termcolor import colored +def uppercase_decorator(func): + def wrapper(*args, **kwargs): + result = func(*args, **kwargs) + return colored(result.upper(), 'green') + return wrapper + +class T9Converter: + def __init__(self, input_t9): + self.input_t9 = input_t9 + self.t9_mapping = { + '2': 'ABC', '3': 'DEF', '4': 'GHI', + '5': 'JKL', '6': 'MNO', '7': 'PQRS', + '8': 'TUV', '9': 'WXYZ' + } + + @uppercase_decorator + def convert(self): + result_text = '' + blocks = self.input_t9.split('-') + + for block in blocks: + if block and block.isdigit(): + digit = block[0] + count = len(block) + if digit in self.t9_mapping: + index = (count - 1) % len(self.t9_mapping[digit]) + result_text += self.t9_mapping[digit][index] + else: + result_text += digit + + return result_text + +if __name__ == "__main__": + input_t9 = "6-2-66-88-33-555" + + t9_converter = T9Converter(input_t9) + converted_text = t9_converter.convert() + + print("Salida:", converted_text) + + + + diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/juanppdev.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/juanppdev.py new file mode 100644 index 0000000000..ec806b61f9 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/juanppdev.py @@ -0,0 +1,23 @@ +def t9_to_text(pulsaciones): + t9_mapping = { + '2': 'ABC', '3': 'DEF', '4': 'GHI', + '5': 'JKL', '6': 'MNO', '7': 'PQRS', + '8': 'TUV', '9': 'WXYZ', '0': ' ' + } + + palabras = pulsaciones.split('-') + texto = '' + bloque_actual = '' + + for bloque in palabras: + if bloque.isdigit(): + bloque_actual = bloque + else: + texto += t9_mapping[bloque_actual][len(bloque) - 1] + + return texto + +# Ejemplo de uso: +entrada = "6-666-88-777-33-3-33-888" +salida = t9_to_text(entrada) +print(salida) # Salida: "MOUREDEV" diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/klyone.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/klyone.py new file mode 100644 index 0000000000..e49c008dec --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/klyone.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 + +t9_dict = { + "2" : "A", + "22" : "B", + "222" : "C", + "3" : "D", + "33" : "E", + "333" : "F", + "4" : "G", + "44" : "H", + "444" : "I", + "5" : "J", + "55" : "K", + "555" : "L", + "6" : "M", + "66" : "N", + "666" : "O", + "7" : "P", + "77" : "Q", + "777" : "R", + "7777" : "S", + "8" : "T", + "88" : "U", + "888" : "V", + "9" : "W", + "99" : "X", + "999" : "Y", + "9999" : "Z" +} + +def convert_t9_to_word(code): + word = "" + chars = code.split("-") + + for c in chars: + if c in t9_dict: + word += t9_dict[c] + else: + raise Exception() + + return word + +if __name__ == "__main__": + print(convert_t9_to_word("6-666-88-777-33-3-33-888")) diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/nlarrea.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/nlarrea.py new file mode 100644 index 0000000000..db03a5271a --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/nlarrea.py @@ -0,0 +1,44 @@ +""" + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV +""" + + +T9_KEYBOARD = { + 0: ' ', + 1: ',.?!', + 2: 'ABC', + 3: 'DEF', + 4: 'GHI', + 5: 'JKL', + 6: 'MNO', + 7: 'PQRS', + 8: 'TUV', + 9: 'WXYZ' +} + + +def decodeT9Keyboard(text:str): + chars = text.split('-') + + decodedText = '' + for char in chars: + times = len(char) - 1 + + decodedText += T9_KEYBOARD[int(char[0])][times] + + return decodedText + + +print(decodeT9Keyboard('6-666-88-777-3-33-888')) # MOUREDEV +print(decodeT9Keyboard('444-0-2-6-0-66-555-2-777-777-33-2')) # I AM NLARREA \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/python/pyramsd.py b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/pyramsd.py new file mode 100644 index 0000000000..48c8d55ec9 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/python/pyramsd.py @@ -0,0 +1,39 @@ +DICTIONARY = { + "0": [" "], + "1": [".", ",", "?", "!"], + "2": ["A", "B", "C"], + "3": ["D", "E", "F"], + "4": ["G", "H", "I"], + "5": ["J", "K", "L"], + "6": ["M", "N", "O"], + "7": ["P", "Q", "R", "S"], + "8": ["T", "U", "V"], + "9": ["W", "X", "Y", "Z"] +} + + +def get_letter(key): + num = key[0] + times_num = len(key) + + if not num in DICTIONARY: + raise ValueError("Número inválido") + + return DICTIONARY[num][times_num - 1] + + +def t9_2_text(t9): + if not t9: + raise ValueError("Error: cadena vacía, escriba algo") + + t9_list = t9.split("-") + + text = "" + for i in t9_list: + letter = get_letter(i) + text += letter + + return text.title() + + +print(t9_2_text("44-666-555-2-0-99-3")) diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/ruby/test0n3.rb b/Retos/Reto #30 - EL TECLADO T9 [Media]/ruby/test0n3.rb new file mode 100644 index 0000000000..a1ff6bcd8c --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/ruby/test0n3.rb @@ -0,0 +1,40 @@ +# +# Los primeros dispositivos móviles tenían un teclado llamado T9 +# con el que se podía escribir texto utilizando únicamente su +# teclado numérico (del 0 al 9). +# +# Crea una función que transforme las pulsaciones del T9 a su +# representación con letras. +# - Debes buscar cuál era su correspondencia original. +# - Cada bloque de pulsaciones va separado por un guión. +# - Si un bloque tiene más de un número, debe ser siempre el mismo. +# - Ejemplo: +# Entrada: 6-666-88-777-33-3-33-888 +# Salida: MOUREDEV +# + +# frozen_string_literal: true + +# class cellphone dial +class CellphoneDial + attr_reader :input, :translated + + DIAL = { '1' => '1', '2' => 'ABC2', '3' => 'DEF3', '4' => 'GHI4', '5' => 'JKL5', + '6' => 'MNO6', '7' => 'PQRS7', '8' => 'TUV8', '9' => 'WXYZ9', + '0' => ' 0', '*' => '*', '#' => '#' }.freeze + + def initialize(input) + @input = input.split('-') + @translated = translate + end + + def translate + @input.map do |char| + char_pos = (char.length % DIAL[char[0]].length) - 1 + DIAL[char[0]][char_pos] + end.join('') + end +end + +puts "cellphone dial: #{CellphoneDial.new('6-666-88-777-33-3-33-888').translated}" +puts "cellphone dial: #{CellphoneDial.new('6-99999999-0-8-33-777777777-8').translated}" diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/rust/SergioRibera.rs b/Retos/Reto #30 - EL TECLADO T9 [Media]/rust/SergioRibera.rs new file mode 100644 index 0000000000..df114fc7a0 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/rust/SergioRibera.rs @@ -0,0 +1,176 @@ +/* + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV + */ + +// +// Solution by @SergioRibera +// +// Without external dependency +// + +// +// Algorithm of compliance with the statement +// +fn from_numbers(keys: &[&str], input: &str) -> String { + // input: 6-666-88-777-33-3-33-888 + // + // The main idea is to separate the text into letters using the character - + // assuming that we will always receive the text in this format. + // + // input after split: + // ["6","666","88","777","33","3","33","888"] + // i: 0 1 2 3 4 5 6 7 + // + // + // i: 3 => "777": len = 3 + // ^ + // first character + // + // keys[7] = "PQRS" + // + // then the idea is to grab the first element of each separate element + // that corresponds to the first character, this is a number and that number + // corresponds to the index of our keys vector + // + // keys[7] = "PQRS" + // + // "PQRS": len = 4 + // "777": len = 3 + // + // "PQRS" + // ^^^ + // => R + // + // "777" = R + // Once we have the index parameter we have to fetch the index element based on + // the size of the split-element we had, this will tell us how many times the button + // was pressed to display that character. + input + .split('-') // Split the input + // We choose the first character of each separation, only in case it exists, i.e. Some(_), + // we pass it to the next stage after mapping it into a tuple that will store + // (len of the separation, first character). + .filter_map(|c| c.chars().next().map(|x| (c.len(), x))) + // In this step we convert the character to a number and only in case of success we map + // it to the same tuple as before, but now it looks like this + // (len of the separation, character as usize) + // this is to be able to follow the idea I mentioned above, also we filter only the success cases. + .filter_map(|(l, c)| char_to_usize(c).map(|c| (l, c))) + // Here we convert all input separations into letters or characters. + .map(|(l, key)| { + let letter = l - 1; + // we capture the element i from the list of keys (based on the first character) + // and only select the nth that corresponds to the number of times the number has been pressed. + keys[key].chars().nth(letter).unwrap().to_string() + }) + // At the end we put everything together in a single string using the collect + .collect() +} + +// +// Extra algorithm for inverse operation +// +fn to_numbers(keys: &[&str], input: &str) -> String { + // input: SERGIO RIBERA + // + // character: I + // + // Here the idea is reversed, having the text we will iterate between all the characters it contains, + // + // keys: + // 4: "GHI" + // ^ ^ + // pos character + // + // then we iterate between all the keys to see in which one is present that character to obtain the position of the text. + // + // 4: "GHI" + // ^^^ + // 3 times + // + // knowing the position of the key and of the letter the rest is simple + input + // We obtain all the characters + .chars() + // we filter and map only the existing characters + .filter_map(|c| { + keys.iter() + // We search in the keys for one that contains the character + // we are in and we get its position + .position(|g| g.contains(c)) + // we convert the position number into text and repeat it the number of times + // before we find the character we need + //plus 1 because the machine counts from 0 + .map(|p| p.to_string().repeat(keys[p].find(c).unwrap() + 1)) + }) + .collect::>() + // we collect and unite all with the character - + .join("-") +} + +// +// Helper function +// +fn char_to_usize(c: char) -> Option { + c.to_digit(10).map(|digit| digit as usize) +} + +// +// ********************************************** +// * * +// * No Relevante, puede ignorar * +// * * +// ********************************************** +// + +// +// In application usage example +// +fn main() { + let keys = vec![ + // 0 + " ", + // 1 2 3 + ",.?!", "ABC", "DEF", + // 4 5 6 + "GHI", "JKL", "MNO", + // 7 8 9 + "PQRS", "TUV", "WXYZ", + ]; + + println!("This program can detect if you're put a text sentence or encoded number sentence\n"); + let input = user_input::get_input("Write your sentence: "); + let output = if input.contains('-') { + from_numbers(&keys, &input) + } else { + to_numbers(&keys, &input) + }; + println!("\nOutput: {output}"); +} + +// +// Module helper for capture user input +// +mod user_input { + use std::io::{self, Write}; + pub fn get_input(prompt: &str) -> String { + print!("{}", prompt); + io::stdout().flush().expect("Failed to print prompt"); + let mut input = String::new(); + io::stdin() + .read_line(&mut input) + .expect("Failed to read input"); + input.trim().to_string() + } +} diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/swift/kontroldev.swift b/Retos/Reto #30 - EL TECLADO T9 [Media]/swift/kontroldev.swift new file mode 100644 index 0000000000..b4b1dde370 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/swift/kontroldev.swift @@ -0,0 +1,48 @@ +/* + * Los primeros dispositivos móviles tenían un teclado llamado T9 + * con el que se podía escribir texto utilizando únicamente su + * teclado numérico (del 0 al 9). + * + * Crea una función que transforme las pulsaciones del T9 a su + * representación con letras. + * - Debes buscar cuál era su correspondencia original. + * - Cada bloque de pulsaciones va separado por un guión. + * - Si un bloque tiene más de un número, debe ser siempre el mismo. + * - Ejemplo: + * Entrada: 6-666-88-777-33-3-33-888 + * Salida: MOUREDEV + */ +import Foundation + +func t9ToLetters(_ input: String) -> String { + let t9Mapping: [Character: String] = [ + "2": "ABC", "3": "DEF", "4": "GHI", + "5": "JKL", "6": "MNO", "7": "PQRS", + "8": "TUV", "9": "WXYZ" + ] + + var result = "" + var currentDigits = [Character]() + + for char in input { + if char.isNumber { + currentDigits.append(char) + } else if char == "-" { + if let digit = currentDigits.first, let letters = t9Mapping[digit] { + result += String(letters[letters.index(letters.startIndex, offsetBy: currentDigits.count - 1)]) + } + currentDigits.removeAll() + } + } + + if let digit = currentDigits.first, let letters = t9Mapping[digit] { + result += String(letters[letters.index(letters.startIndex, offsetBy: currentDigits.count - 1)]) + } + + return result +} + + +let input = "6-666-88-777-33-3-33-888" +let output = t9ToLetters(input) +print(output) diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/typescript/Qv1ko.ts b/Retos/Reto #30 - EL TECLADO T9 [Media]/typescript/Qv1ko.ts new file mode 100644 index 0000000000..8384448a03 --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/typescript/Qv1ko.ts @@ -0,0 +1,14 @@ +t9Translator("66-666-55-444-2") + +function t9Translator(str: string) { + + let result: string = "" + let keyboard = {"2":"A", "3":"D", "4":"G", "5":"J", "6":"M", "7":"P", "8":"T", "9":"W", "0":" ", "22":"B", "33":"E", "44":"H", "55":"K", "66":"N", "77":"Q", "88":"U", "99":"X", "222":"C", "333":"F", "444":"I", "555":"L", "666":"O", "777":"R", "888":"V", "999":"Y", "7777":"S", "9999":"Z"} + + str.split("-").forEach(number => { + result += keyboard[number.toString()] + }) + + console.log(result) + +} diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/typescript/albertovf.ts b/Retos/Reto #30 - EL TECLADO T9 [Media]/typescript/albertovf.ts new file mode 100644 index 0000000000..d3a3b7654a --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/typescript/albertovf.ts @@ -0,0 +1,26 @@ + +const reto = (pulsaciones: string): string => { + let resultado = "" + const teclado = [ + [' ', '.', ',', '0'], + ['A', 'B', 'C', '1'], + ['D', 'E', 'F', '2'], + ['G', 'H', 'I', '3'], + ['J', 'K', 'L', '4'], + ['M', 'N', 'O', '5'], + ['P', 'Q', 'R', 'S', '6'], + ['T', 'U', 'V', '7'], + ['W', 'X', 'Y', 'Z', '8'], + ] + + for (let tecla of pulsaciones.split('-')) { + let numero = parseInt(tecla.charAt(0)) + let letra = teclado[numero - 1][tecla.length - 1] + resultado += letra + } + + console.log(resultado); + return resultado +} + +reto("6-666-88-777-33-3-33-888") \ No newline at end of file diff --git a/Retos/Reto #30 - EL TECLADO T9 [Media]/typescript/johanrestrepo19.ts b/Retos/Reto #30 - EL TECLADO T9 [Media]/typescript/johanrestrepo19.ts new file mode 100644 index 0000000000..dff67f0c2d --- /dev/null +++ b/Retos/Reto #30 - EL TECLADO T9 [Media]/typescript/johanrestrepo19.ts @@ -0,0 +1,40 @@ +const KEYBOARD = { + 1: [",", ".", "?", "!"], + 2: ["A", "B", "C"], + 3: ["D", "E", "F"], + 4: ["G", "H", "I"], + 5: ["J", "K", "L"], + 6: ["M", "N", "O"], + 7: ["P", "Q", "R", "S"], + 8: ["T", "U", "V"], + 9: ["W", "X", "Y", "Z"], + 0: [" "], +}; + +const isHomogeneousString = (input: string): boolean => { + const firstChar = input.charAt(0); + for (let index = 0; index < input.length; index++) + if (input.charAt(index) !== firstChar) return false; + return true; +}; + +const transformT9ToString = (input: string, separator = "-"): string => { + const sections = input.split(separator); + const result: string[] = []; + for (let index = 0; index < sections.length; index++) { + const section = sections[index]; + if (!isHomogeneousString(section)) return ""; + const char = Number(section.charAt(0)) as keyof typeof KEYBOARD; + const letter = (section.length - 1) % KEYBOARD[char].length; + result.push(KEYBOARD[char][letter]); + } + return result.join(""); +}; + +console.log(transformT9ToString("6-666-88-777-33-3-33-888-1111")); +console.log( + transformT9ToString("5 666 44 2 66 0 777 33 7777 8 777 33 7 666 1111", " ") +); +console.log( + transformT9ToString("5 666 44 2 66 0 777 33 7777 8 777 33 7 666 1111") +); diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/c#/iggict.cs b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/c#/iggict.cs new file mode 100644 index 0000000000..bc8d70cf26 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/c#/iggict.cs @@ -0,0 +1,64 @@ +/* Reto #4: PRIMO, FIBONACCI Y PAR + * + * Enunciado: + * + * Escribe un programa que, dado un nmero, compruebe y muestre si es primo, fibonacci y par. + * Ejemplos: + * - Con el nmero 2, nos dir: "2 es primo, fibonacci y es par" + * - Con el nmero 7, nos dir: "7 es primo, no es fibonacci y es impar" + */ + +using System; + +Console.Write("\nReto #4: PRIMO, FIBONACCI Y PAR"); +Console.Write("\n-------------------------------\n"); + +do +{ + Console.Write("\nIntroduce un nmero: "); + + int userInt = 0; + + try + { + userInt = Int32.Parse(Console.ReadLine() ?? "0"); + } + catch (Exception) + { + Console.WriteLine($"\nERROR: Los parmetros de entrada no son vlidos"); + continue; + } + + Console.WriteLine($"{userInt} " + + $"{(IsPrime(userInt) ? "es" : "no es")} primo, " + + $"{(IsFibo(userInt) ? "" : "no es")} fibonacci y " + + $"{(IsEven(userInt) ? "es par" : "es impar")}"); + +} while (true); + +bool IsEven(int value) => value % 2 == 0; + +//bool IsPrime(int value) => !Enumerable.Range(2,value-1).Any(i => value % i == 0 ); + +static bool IsPrime(int value) +{ + if (value <= 0) + return false; + + for (int i = 2; iUn nmero n es Fibonacci si (5*n 2 + 4) o (5*n 2 4) es un cuadrado perfecto +/// +bool IsFibo(int n) +{ + bool isPerfectSquare(int x) => (int)Math.Sqrt(x) * (int)Math.Sqrt(x) == x; + + return isPerfectSquare(5 * n * n + 4) || isPerfectSquare(5 * n * n - 4); +} \ No newline at end of file diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/c++/pyramsd.cpp b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/c++/pyramsd.cpp new file mode 100644 index 0000000000..7e9825f2b3 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/c++/pyramsd.cpp @@ -0,0 +1,62 @@ +#include +using namespace std; + +bool es_fibonacci(int n){ + int a = 0, b = 1; + + while (b < n) + { + int varTemp = a; + a = b; + b = varTemp + b; + } + + return b == n; +} + +bool es_par(int n){ + return n % 2 == 0; +} + +bool es_primo(int n){ + if (n < 2){ + return false; + } + for (int i = 2; i < n; i++){ + if (n % i == 0){ + return false; + } + } + return true; +} + + +int main(){ + + int num; + cout << "Ingrese un numero: "; + cin >> num; + + string res_final = ""; + + if (es_primo(num)){ + res_final += "es primo, "; + }else{ + res_final += "no es primo, "; + } + + if (es_fibonacci(num)){ + res_final += "fibonacci, "; + }else{ + res_final += "no es fibonacci, "; + } + + if (es_par(num)){ + res_final += "y es par."; + }else{ + res_final += "y es impar."; + } + + cout << res_final; + +} diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/c/fegorama.c b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/c/fegorama.c new file mode 100644 index 0000000000..2334713225 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/c/fegorama.c @@ -0,0 +1,99 @@ +/* + * Escribe un programa que, dado un número, compruebe y muestre si es primo, fibonacci y par. + * Ejemplos: + * - Con el número 2, nos dirá: "2 es primo, fibonacci y es par" + * - Con el número 7, nos dirá: "7 es primo, no es fibonacci y es impar" + */ +#include +#include +#include + +/* + * Devuelve 1 si es primo, usando iteratividad + */ +int isPrime(unsigned long n) +{ + if (n < 3 || n == 4) + return 0; + + int max = sqrt(n) + 1; + + for (int i = 2; i < max; i++) + if (n % i == 0) + return 0; + + return 1; +} + +/* + * Devuelve 1 si está dentro de los valores de la suceción de Fibonacci, usando iteratividad + */ +int isFibonacci(unsigned long n) +{ + // 0, 1, 2 y 3 son números de la sucesión de Fibonacci + if (n < 4) + return 1; + + unsigned long current = 2; + unsigned long temporal = 0; + unsigned long next = 3; + + // Se realiza un recorrido para localizar si está dentro de la sucesión + // y si coincide se devuelve 1, pero si el valor siguiente se pasa de + // n, se sale del bucle porque no es de la sucesión + while (next < n) + { + temporal = current; + current = next; + next += temporal; + if (next == n) + return 1; + } + + // Si llega al final y no se ha localizado, no está en la sucesión + // y se devuelve 0 + return 0; +} + +/* + * Función principal + */ +int main() +{ + unsigned char s[11]; // Cadena de texto entrada por teclado + unsigned long n; // Número a verificar + + // Se solicita entrada por teclado + printf("Introduzca un número: "); + fgets(s, 5, stdin); + + // Limpieza de la cadena entrada por teclado + s[strcspn(s, "\r\n")] = 0; + + // Se transforma a largo sin signo + if ((n = strtoul(s, NULL, 10)) == 0) + { + fprintf (stderr, "Error en la conversión del número introducido.\n"); + return 1; + } + + // Verificación e impresión de los resultados + printf("%d ", n); + + if (isPrime(n)) + printf ("es primo"); + else + printf ("no es primo"); + + if (isFibonacci(n)) + printf (", es fibonnacci"); + else + printf (", no es fibonnacci"); + + if ((n % 2) == 0) + printf (" y es par\n"); + else + printf (" y es impar\n"); + + return 0; +} \ No newline at end of file diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/java/asjordi.java b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/java/asjordi.java new file mode 100644 index 0000000000..29bc8c9f9f --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/java/asjordi.java @@ -0,0 +1,86 @@ +public class PrimeFibonacciEven { + + public static void main(String[] args) { + + PrimeFibonacciEven p = new PrimeFibonacciEven(); + + System.out.println(p.checkNumber(2)); + System.out.println(p.checkNumber(7)); + System.out.println(p.checkNumber(0)); + + } + + public String checkNumber(int n) { + + StringBuilder msg = new StringBuilder(); + + msg.append(n); + + if (isPrime(n)) msg.append(" es primo,"); + else msg.append(" no es primo,"); + + if (isFibonacci(n)) msg.append(" es fibonacci"); + else msg.append(" no es fibonacci"); + + if (isEven(n)) msg.append(" y es par"); + else msg.append(" y es impar"); + + return msg.toString(); + } + + public boolean isEven(int n) { + + return n % 2 == 0; + + } + + public boolean isPrime(int n) { + + if (n <= 1) return false; + + for (int i = 2; i <= Math.sqrt(n); i++) { + if (n % i == 0) return false; + } + + return true; + + } + + public boolean isFibonacci(int n) { + + if (n == 0) return false; + + return isPerfectSquare(5 * n * n + 4) || isPerfectSquare(5 * n * n - 4); + + } + + public boolean isPerfectSquare(int n) { + + int sqrt = (int) Math.sqrt(n); + + return sqrt * sqrt == n; + + } + + public boolean isFibonacciNumber(int n) { + + if (n == 0) return false; + + int prev = 0; + int current = 1; + + while (current <= n) { + int temp = current; + current = prev + current; + prev = temp; + + if (current == n) { + return true; + } + } + + return false; + + } + +} diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/javascript/AlinaBernardez.js b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/javascript/AlinaBernardez.js new file mode 100644 index 0000000000..18904a8429 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/javascript/AlinaBernardez.js @@ -0,0 +1,43 @@ +// Función para comprobar si el número es primo: +function checkPrimo(number) { + let isPrime = true; + if(number === 1) { + return 'Introducir un número mayor que 1' + } + else if(number > 1) { + for(let i = 2; i < number; i++) { + if(number % i == 0) { + isPrime = false; + return `${number} no es primo,` + } + else { + return `${number} es primo,` + } + } + } +} + +//Función para comprobar si el número es Fibonacci (primero si es cuadrado perfecto): +function checkSquare(x) { + let s = parseInt(Math.sqrt(x)); + return (s * s == x); +} + +function checkFibo(number) { + return checkSquare(5 * number * number + 4) || + checkSquare(5 * number * number - 4) ? + ' fibonacci ' : + ' no es fibonacci '; +} + +//Función para comprobar si el número es par o impar: +function checkPar(number) { + return number % 2 == 0 ? 'y es par.' : 'y es impar.'; +} + + +function checkNumber(number) { + return `${checkPrimo(number)}${checkFibo(number)}${checkPar(number)}` +} + +checkNumber(13); \ No newline at end of file diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/javascript/FabianCristancho.js b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/javascript/FabianCristancho.js new file mode 100644 index 0000000000..4888899c61 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/javascript/FabianCristancho.js @@ -0,0 +1,53 @@ +/* + * Escribe un programa que, dado un número, compruebe y muestre si es primo, fibonacci y par. + * Ejemplos: + * - Con el número 2, nos dirá: "2 es primo, fibonacci y es par" + * - Con el número 7, nos dirá: "7 es primo, no es fibonacci y es impar" + */ + +function isFibonacci(number){ + if (number === 0 || number === 1) { + return true; + } + + let previous = 0; + let current = 1; + + while (current <= number) { + const next = previous + current; + if (next === number) { + return true; + } + previous = current; + current = next; + } + return false; +} + +function isPar(number){ + return number%2==0; +} + +function isPrime(number){ + if (number <= 1) { + return false; + } + for (let i = 2; i <= Math.sqrt(number); i++) { + if (number % i === 0) { + return false; + } + } + return true; +} + +const sample1 = 2 +const sample2 = 7 +const sample3 = 21 +const sample4 = 13 +const sample5 = 54 + +console.log(`1. El número ${sample1} ${!isPrime(sample1)?'no':''} es primo, ${!isFibonacci(sample1)?'no':''} es fibonacci y ${!isPar(sample1)?'no':''} es par`) +console.log(`2. El número ${sample2} ${!isPrime(sample2)?'no':''} es primo, ${!isFibonacci(sample2)?'no':''} es fibonacci y ${!isPar(sample2)?'no':''} es par`) +console.log(`3. El número ${sample3} ${!isPrime(sample3)?'no':''} es primo, ${!isFibonacci(sample3)?'no':''} es fibonacci y ${!isPar(sample3)?'no':''} es par`) +console.log(`4. El número ${sample4} ${!isPrime(sample4)?'no':''} es primo, ${!isFibonacci(sample4)?'no':''} es fibonacci y ${!isPar(sample4)?'no':''} es par`) +console.log(`5. El número ${sample5} ${!isPrime(sample5)?'no':''} es primo, ${!isFibonacci(sample5)?'no':''} es fibonacci y ${!isPar(sample5)?'no':''} es par`) \ No newline at end of file diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/DCRael.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/DCRael.py new file mode 100644 index 0000000000..6bb18fa44e --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/DCRael.py @@ -0,0 +1,35 @@ +import math + +class Tipo_number(): + + def isperfectsquare(self, x): + s = int(math.sqrt(x)) + if s * s == x: + return 'Es fibonacci' + else: + return 'No es fibannaci' + + def isfibo(self, n): + return self.isperfectsquare(5*n*n + 4) or self.isperfectsquare(5*n*n - 4) + + def is_par(self, n): + if n % 2 == 0: + return 'Es par' + else: + return 'Es impar' + + + def is_primo(self, n): + if n <= 1: + return 'No es primo' + for i in range(2, int(math.sqrt(n)) + 1): + if n % i == 0: + return 'No es primo' + return 'Es primo' + +try: + num = int(input('Ingresa un numero: ')) + n = Tipo_number() + print(f'{num}: {n.isfibo(num)}, {n.is_par(num)},y {n.is_primo(num)}') +except: + print('numero ingresado invalido') diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/PedroOrtix.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/PedroOrtix.py new file mode 100644 index 0000000000..e3609dee44 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/PedroOrtix.py @@ -0,0 +1,29 @@ +# ``` +# /* +# * Escribe un programa que, dado un número, compruebe y muestre si es primo, fibonacci y par. +# * Ejemplos: +# * - Con el número 2, nos dirá: "2 es primo, fibonacci y es par" +# * - Con el número 7, nos dirá: "7 es primo, no es fibonacci y es impar" +# */ +# ``` + +def is_prime(n): + if n <= 1: + return "no primo" + for i in range(2, int(n**0.5)+1): + if n % i == 0: + return "no primo" + return "primo" + +def is_fibonacci(n): + a, b = 0, 1 + while a < n: + a, b = b, a+b + return "fibonacci" if a == n else "no fibonacci" + +def is_even(n): + return "par" if n % 2 == 0 else "impar" + +if __name__ == "__main__": + n = int(input("Ingrese un numero: ")) + print(f"El numero {n} es {is_prime(n)}, {is_fibonacci(n)} y {is_even(n)}") \ No newline at end of file diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/ShinMugenNoKabe.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/ShinMugenNoKabe.py new file mode 100644 index 0000000000..81fe3d154f --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/ShinMugenNoKabe.py @@ -0,0 +1,52 @@ +import math + + +def is_prime_number(n: int) -> bool: + for i in range(2, n): + if n % i == 0: + return False + + return True + + +def is_fibonacci_number(n: int) -> bool: + """ + n is in the Fibonacci sequence if ((5 * n^2) + 4) or ((5 * n^2) - 4) is a perfect square + """ + + def is_perfect_square(x: int) -> bool: + """ + Returns wheter this number is a perfect square + + """ + s = int(math.sqrt(x)) + return s * s == x + + to_eval = (5 * n * n) + + return is_perfect_square(to_eval + 4) or is_perfect_square(to_eval - 4) + + +def is_even_number(n: int) -> bool: + return n % 2 == 0 + + +def evaluate_number(n: int) -> bool: + is_prime = is_prime_number(n) + is_fibonacci = is_fibonacci_number(n) + is_even = is_even_number(n) + + result = f"{n} " + result += "es primo, " if is_prime else "no es primo, " + result += "es fibonacci, " if is_fibonacci else "no es fibonacci, " + result += "es par" if is_even else "es impar" + + print(result) + + + +if __name__ == "__main__": + evaluate_number(2) + evaluate_number(7) + evaluate_number(8) + evaluate_number(9) \ No newline at end of file diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/alberba.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/alberba.py new file mode 100644 index 0000000000..c958b291c5 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/alberba.py @@ -0,0 +1,28 @@ +def es_fibo(num: int) -> bool: + a, b = 0, 1 + while b < num: + a, b = b, a + b + return b == num + +def es_par(num: int) -> bool: + return num % 2 == 0 + +def es_primo(num: int) -> bool: + if num < 2: + return False + for i in range(2, int(num ** 0.5) + 1): + if num % i == 0: + return False + + return True + + +try: + num = int(input("Introduce un número: ")) + result = "" + str(num) + result += " es primo, " if es_primo(num) else " no es primo, " + result += "es fibonacci y" if es_fibo(num) else "no es fibonacci y" + result += " es par" if es_par(num) else " es impar" + print(result) +except ValueError: + print("Introduce un número") \ No newline at end of file diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/alvaruncio.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/alvaruncio.py new file mode 100644 index 0000000000..b7db224eeb --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/alvaruncio.py @@ -0,0 +1,39 @@ +def es_primo_fibonnaci_par(number): + + mensaje_final = f"{number} " + + #Primo + if number > 1: + for i in range(2, number): + if (number % i) == 0: + mensaje_final += "no es primo, " + break + else: + mensaje_final += "es primo, " + else: + mensaje_final += "no es primo, " + + #Fibonnaci + first_number = 1 + second_number = 1 + fibonnaci = 0 + while fibonnaci < number: + fibonnaci = first_number + second_number + first_number = second_number + second_number = fibonnaci + if fibonnaci != number: + mensaje_final += "no es fibonacci y " + else: + mensaje_final += "fibonacci y " + #Par + + if number % 2 == 0: + mensaje_final += "es par." + else: + mensaje_final += "es impar." + + print(mensaje_final) + + + +print(es_primo_fibonnaci_par(1)) diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/callmeGustavo.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/callmeGustavo.py new file mode 100644 index 0000000000..09467a7696 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/callmeGustavo.py @@ -0,0 +1,52 @@ + +numero = 13 + + +def is_fibo(number): + x = 0 + y = 1 + z = 0 + lista = [] + resultado = "" + for i in range(0,number+1): + z = x + y + x = y + y = z + lista.append(z) + + if number in lista: + resultado += "es fibonacci" + return resultado + else: + resultado += "no es fibonacci" + + return resultado + + +def is_pair(number): + resultado = "" + if number % 2 == 0: + resultado += "es par" + return resultado + else: + resultado += "es impar" + + return resultado + + + +def is_prime(number): + resultado = "" + c = 0 + for i in range(2,number): + if number % i == 0: + c += 1 + if c > 0: + resultado += 'no es primo' + return resultado + else: + resultado += 'es primo' + + return resultado + +print(f"{numero}, {is_prime(numero)}, {is_fibo(numero)} y {is_pair(numero)} ") diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/fedecoronado.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/fedecoronado.py new file mode 100644 index 0000000000..75653b4e71 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/fedecoronado.py @@ -0,0 +1,64 @@ +''' +/* + * Escribe un programa que, dado un número, compruebe y muestre si es primo, fibonacci y par. + * Ejemplos: + * - Con el número 2, nos dirá: "2 es primo, fibonacci y es par" + * - Con el número 7, nos dirá: "7 es primo, no es fibonacci y es impar" + */ +''' + +# HAcer una funcion que genere todos los fibo hasta el numero +# hacer una funicòn que diga si es fibo +# hacer una funcion que genere los primos + +def es_fibo(n): + fibo = [1,2] + for i in range(1, n+1): + fibo.append(fibo[i]+fibo[i-1]) + if fibo[i]>n: + break + if n in fibo: + return True + else: + return False + +def es_primo(n): + primos=[] + for i in range(1, n +1): + primo = 1 + for j in range(2,i): + if i % j == 0: + primo = 0 + if primo == 1: + primos.append(i) + if n in primos: + return True + else: + return False + +def es_par(n): + if n%2 == 0: + return True + else: + return False + +def staus(n): + if es_primo(n): + primo = "es primo" + else: + primo = "no es primo" + + if es_fibo(n): + fibo = "es fibonacci" + else: + fibo = "no es fibonacci" + + if es_par(n): + par = "es par" + else: + par = "no es par" + return (str(n) + " - " + primo + ", " + fibo + " y " + par) +print(staus(5)) +print(staus(18)) +print(staus(2)) +print(staus(3)) \ No newline at end of file diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/javierfiestasbotella.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/javierfiestasbotella.py new file mode 100644 index 0000000000..06c13d4106 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/javierfiestasbotella.py @@ -0,0 +1,35 @@ +'''/* + * Escribe un programa que, dado un número, compruebe y muestre si es primo, fibonacci y par. + * Ejemplos: + * - Con el número 2, nos dirá: "2 es primo, fibonacci y es par" + * - Con el número 7, nos dirá: "7 es primo, no es fibonacci y es impar" + */''' + +def fibonacci(n): + f = [0, 1] + j = 0 + for i in range(n): + j += f[-1] + f[-2] + f.append(j) + j = 0 + if n not in f: + return 'no es fibonacci' + else: + return 'fibonacci' + +def es_par(n): + if n % 2 != 0: + return 'no es par' + else: + return 'es par' + +def es_primo(n): + lista = [1, 2, 3, 5, 7, 11] + if n not in lista or (n % 2 == 0 and n % 3 == 0 and n % 5 == 0 and n % 7 == 0 and n % 11 == 0): + return 'no es primo' + else: + return 'es primo' + +n = int(input('Introduce un numero: ')) + +print(f'{n} {es_primo(n)}, {fibonacci(n)} y {es_par(n)}') diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/josevegas27.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/josevegas27.py new file mode 100644 index 0000000000..3f39b30f4d --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/josevegas27.py @@ -0,0 +1,41 @@ +''' + Reto #4: PRIMO, FIBONACCI Y PAR +/* + * Escribe un programa que, dado un número, compruebe y muestre si es primo, fibonacci y par. + * Ejemplos: + * - Con el número 2, nos dirá: "2 es primo, fibonacci y es par" + * - Con el número 7, nos dirá: "7 es primo, no es fibonacci y es impar" + */ + ''' + +# Funcio que verifica si es primo +def primo(number,div=2): + if div == number: return 'es primo' + return 'no es primo' if (number%div == 0) else primo(number,div+1) + +# Verifica si es fibonacci +def fibonacci(number): + fib_1 = 0 + fib_2 = 1 + while fib_2 != number: + fib_3 = fib_1 + fib_2 + if fib_3 > number: + return 'no es fibonacci' + + fib_1,fib_2 = fib_2,fib_3 + + return 'es fibonacci' + +# Verifica si es par +def par(number): + return 'es par' if (number%2 == 0) else 'es impar' + +def pri_fib_par(number: int): + return f'{number} {primo(number)}, {fibonacci(number)} y {par(number)}' + +try: + number = int(input('Introduzca un numero: ')) + print(pri_fib_par(number)) + +except ValueError as error: + print(f'\nEl numero no es entero.\nValueError: {error}') \ No newline at end of file diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/klimyflorez.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/klimyflorez.py new file mode 100644 index 0000000000..6b5961afae --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/klimyflorez.py @@ -0,0 +1,62 @@ +""" +Reto 4: Primo, Fibonacci y Par +Escribe un programa que, dado un número, compruebe y muestre si es primo, +fibonacci y par. +Ejemplos: +- Con el número 2, nos dirá: "2 es primo, fibonacci y es par" +- Con el número 7, nos dirá: "7 es primo, no es fibonacci y es impar" +""" + +def is_prime(number): + if number > 1: + for i in range(2, number): + if (number % i) == 0: + return False + + else: + return True + + else: + return False + +def is_even(number): + if (number % 2 )== 0: + return True + + else: + return False + +def is_fibonacci(number): + n1, n2 = 0, 1 + + is_in_fibo = False + + while number > n2: + n1 = n1 + n2 + n2 = n1 + n2 + + if n2 == number or n1 == number: + is_in_fibo = True + + else: + is_in_fibo = False + return is_in_fibo + +if __name__ == "__main__": + while True: + number = 0 + try: + number = int(input('Inserta un numero a verificar: ')) + + except ValueError: + print("Inserta un valor valido!") + + if number < 1: + break + + is_prime_txt = f"{number} es primo" if is_prime(number) else f"{number} no es primo" + is_fibo_txt = f", fibonacci" if is_fibonacci(number) else f", no es fibonacci" + is_even_txt = f"y es par" if is_even(number) else f"y es impar" + text = f"{is_prime_txt} {is_fibo_txt} {is_even_txt}" + print(text) + number = 0 \ No newline at end of file diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/rafaelramirez150.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/rafaelramirez150.py new file mode 100644 index 0000000000..f1e7161385 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/rafaelramirez150.py @@ -0,0 +1,49 @@ +''' +/* + * Escribe un programa que, dado un número, compruebe y muestre si es primo, fibonacci y par. + * Ejemplos: + * - Con el número 2, nos dirá: "2 es primo, fibonacci y es par" + * - Con el número 7, nos dirá: "7 es primo, no es fibonacci y es impar" + */ + ''' +def primo(numero): + if numero < 2: + return False + for i in range(2, int(numero ** 0.5) + 1): + if numero % i == 0: + return False + return True + +def fibonacci(numero): + a, b = 0, 1 + while a < numero: + if a == numero: + return True + a, b = b, a + b + return False + +def par(numero): + return numero % 2 == 0 + +# Pedir al usuario que ingrese un número +numero = int(input("Ingresa un número: ")) + +# Verificar si el número es primo +if primo(numero): + print(numero, "es primo.") +else: + print(numero, "no es primo.") + +# Verificar si el número pertenece a la secuencia de Fibonacci +if fibonacci(numero): + print(numero, "pertenece a la secuencia de Fibonacci.") +else: + print(numero, "no pertenece a la secuencia de Fibonacci.") + +# Verificar si el número es par +if par(numero): + print(numero, "es par.") +else: + print(numero, "no es par.") + + diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/rafaelramireza.py b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/rafaelramireza.py new file mode 100644 index 0000000000..e4871d93de --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/python/rafaelramireza.py @@ -0,0 +1,43 @@ +''' +/* + * Escribe un programa que, dado un número, compruebe y muestre si es primo, fibonacci y par. + * Ejemplos: + * - Con el número 2, nos dirá: "2 es primo, fibonacci y es par" + * - Con el número 7, nos dirá: "7 es primo, no es fibonacci y es impar" + */ +''' + +def esPrimo(num): + if num < 2: + return False + for i in range(2, num): + if num%i == 0: + return False + return True + +def esFibonacci(num): + a, b = 0, 1 + while a < num: + a, b = b, a+b + return a == num + +def esPar(num): + return num%2 == 0 + +def main(): + num = int(input("Ingrese un número: ")) + if esPrimo(num): + print(f"{num} es primo") + else: + print(f"{num} no es primo") + if esFibonacci(num): + print(f"{num} es fibonacci") + else: + print(f"{num} no es fibonacci") + if esPar(num): + print(f"{num} es par") + else: + print(f"{num} es impar") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/rust/marcoatrs.rs b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/rust/marcoatrs.rs new file mode 100644 index 0000000000..10912a9b58 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/rust/marcoatrs.rs @@ -0,0 +1,66 @@ +fn is_prime(num: i32) -> bool { + if num == 2 { + return true; + } + if num < 2 || is_even(num) { + return false; + } + for n in (3..num).step_by(2) { + if num % n == 0 { + return false; + } + } + return true; +} + +fn is_fibonacci(number: i32) -> bool { + let x = 5 * number.pow(2); + let psr = f64::sqrt((x + 4) as f64); + let nsr = f64::sqrt((x - 4) as f64); + if psr == psr.floor() { + return true; + } else if nsr == nsr.floor() { + return true; + } + return false; +} + +fn is_even(num: i32) -> bool { + let res: bool; + if num % 2 == 0 { + res = true; + } else { + res = false; + }; + return res; +} + +fn pfe(num: i32) { + let prime: &str; + let fibo: &str; + let even: &str; + if is_prime(num) { + prime = "es primo"; + } else { + prime = "no es primo"; + } + + if is_fibonacci(num) { + fibo = "fibonacci"; + } else { + fibo = "no es fibonacci"; + } + + if is_even(num) { + even = "es par"; + } else { + even = "es impar"; + } + + println!("{} {}, {} y {}", num, prime, fibo, even); +} + +fn main() { + pfe(2); + pfe(7); +} diff --git a/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/typescript/miguelriosoliveira.ts b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/typescript/miguelriosoliveira.ts new file mode 100644 index 0000000000..2de58d4a74 --- /dev/null +++ b/Retos/Reto #4 - PRIMO, FIBONACCI Y PAR [Media]/typescript/miguelriosoliveira.ts @@ -0,0 +1,74 @@ +/* + * Escribe un programa que, dado un número, compruebe y muestre si es primo, fibonacci y par. + * Ejemplos: + * - Con el número 2, nos dirá: "2 es primo, fibonacci y es par" + * - Con el número 7, nos dirá: "7 es primo, no es fibonacci y es impar" + */ + +function isPrime(num: number): boolean { + if (num <= 1) { + return false; + } + + for (let i = 2; i <= num / i; i++) { + if (num % i === 0) { + return false; + } + } + + return true; +} + +function isPerfectSquare(num: number): boolean { + const sqrt = Math.floor(Math.sqrt(num)); + return sqrt * sqrt === num; +} + +function isFibonacci(num: number): boolean { + return isPerfectSquare(5 * num * num + 4) || isPerfectSquare(5 * num * num - 4); +} + +function isEven(num: number): boolean { + return num % 2 === 0; +} + +function isPrimeFibonacciAndEven(num: number): string { + let message = `${num} `; + + if (!isPrime(num)) { + message += 'no '; + } + message += 'es primo, '; + + if (!isFibonacci(num)) { + message += 'no es '; + } + message += 'fibonacci y es '; + + if (!isEven(num)) { + message += 'im'; + } + message += 'par'; + + return message; +} + +function test() { + [ + { input: 2, expected: '2 es primo, fibonacci y es par' }, + { input: 7, expected: '7 es primo, no es fibonacci y es impar' }, + { input: 8, expected: '8 no es primo, fibonacci y es par' }, + { input: 9, expected: '9 no es primo, no es fibonacci y es impar' }, + ].every(({ input, expected }) => { + const received = isPrimeFibonacciAndEven(input); + const hasPassed = received === expected; + if (received === expected) { + console.log('✅ PASSED'); + } else { + console.log('❌ FAILED', { expected, received }); + } + return hasPassed; + }); +} + +test(); diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/abap/FabianCristancho.abap" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/abap/FabianCristancho.abap" new file mode 100644 index 0000000000..67edd1da9a --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/abap/FabianCristancho.abap" @@ -0,0 +1,2 @@ +data: message(20) VALUE '!Hola Mundo!'. +WRITE: message. \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/actionscript/FabianCristancho.as" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/actionscript/FabianCristancho.as" new file mode 100644 index 0000000000..5c56b560cf --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/actionscript/FabianCristancho.as" @@ -0,0 +1,3 @@ +var m:TextField=new TextField(); +m.text="!Hello World!"; +addChild(m); \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ada/FabianCristancho.adb" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ada/FabianCristancho.adb" new file mode 100644 index 0000000000..4684ae34fa --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ada/FabianCristancho.adb" @@ -0,0 +1,6 @@ +with Ada.Text_IO; + +procedure Hello_World is +begin + Ada.Text_IO.Put_Line("!Hola mundo!"); +end Hello_World; \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/algol/FabianCristancho.a68" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/algol/FabianCristancho.a68" new file mode 100644 index 0000000000..526eee4fb1 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/algol/FabianCristancho.a68" @@ -0,0 +1,4 @@ +main: +( + printf($"!Hola Mundo!"l$) +) \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/alice/FabianCristancho.aml" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/alice/FabianCristancho.aml" new file mode 100644 index 0000000000..b6473d1842 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/alice/FabianCristancho.aml" @@ -0,0 +1,5 @@ +fun iter i 0 f = () + | iter i n f = (f i; iter (i+1) (n-1) f) +do print "!Hola Mundo!\n" +do iter 1 10 (fn i => print(Int.toString i^"\n")) +do OS.Process.exit OS.Process.success \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/applescript/FabianCristancho.applescript" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/applescript/FabianCristancho.applescript" new file mode 100644 index 0000000000..9c652270dc --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/applescript/FabianCristancho.applescript" @@ -0,0 +1,3 @@ +tell application "Finder" + "Hello World" +end tell \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/arduino/FabianCristancho.ino" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/arduino/FabianCristancho.ino" new file mode 100644 index 0000000000..8faca6b637 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/arduino/FabianCristancho.ino" @@ -0,0 +1,7 @@ +void setup() { + Serial.begin(9600); +} +void loop() { + Serial.println("!Hola Mundo!"); + delay(1000); +} diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/assembly/FabianCristancho.asm" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/assembly/FabianCristancho.asm" new file mode 100644 index 0000000000..e453f62fb5 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/assembly/FabianCristancho.asm" @@ -0,0 +1,17 @@ +SECTION .DATA + hello: db '!Hola mundo!',10 + helloLen: equ $-hello + +SECTION .TEXT + GLOBAL _start + +_start: + mov eax,4 ; 'write' system call = 4 + mov ebx,1 ; file descriptor 1 = STDOUT + mov ecx,hello ; string to write + mov edx,helloLen ; length of string to write + int 80h ; call the kernel + + mov eax,1 ; 'exit' system call + mov ebx,0 ; exit with error code 0 + int 80h ; call the kernel \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/awk/FabianCristancho.awk" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/awk/FabianCristancho.awk" new file mode 100644 index 0000000000..72ff495a31 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/awk/FabianCristancho.awk" @@ -0,0 +1,5 @@ +#!/usr/bin/awk -f +BEGIN { + print "!Hola Mundo!" + exit +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ballerina/FabianCristancho.bal" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ballerina/FabianCristancho.bal" new file mode 100644 index 0000000000..50708535f2 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ballerina/FabianCristancho.bal" @@ -0,0 +1,5 @@ +import ballerina/io; + +public function main() { + io:println("!Hola Mundo!"); +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/bash/FabianCristancho.sh" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/bash/FabianCristancho.sh" new file mode 100644 index 0000000000..dc558a2774 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/bash/FabianCristancho.sh" @@ -0,0 +1,2 @@ +#!/bin/bash +echo "!Hola Mundo!" \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/basic/FabianCristancho.bas" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/basic/FabianCristancho.bas" new file mode 100644 index 0000000000..2f3b57fefa --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/basic/FabianCristancho.bas" @@ -0,0 +1,2 @@ +100 PRINT "!Hola Mundo!" +110 END \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/batch/FabianCristancho.bat" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/batch/FabianCristancho.bat" new file mode 100644 index 0000000000..0feba1548f --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/batch/FabianCristancho.bat" @@ -0,0 +1,2 @@ +@echo off +echo "Hola Mundo!" \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/FabianCristancho.cs" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/FabianCristancho.cs" new file mode 100644 index 0000000000..0b876f5f83 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/FabianCristancho.cs" @@ -0,0 +1,6 @@ +using System; +public class MyClass{ + public static void Main(){ + Console.WriteLine("!Hola Mundo!"); + } +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/iggict.cs" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/iggict.cs" new file mode 100644 index 0000000000..3b945d7a4e --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/iggict.cs" @@ -0,0 +1,34 @@ +/* Reto #5: HOLA MUNDO + * + * Enunciado: + * + * Escribe un !Hola Mundo! en todos los lenguajes de programacin que puedas + * + */ + +using System.Linq; +using System; + +Console.Write("\nReto #5: HOLA MUNDO"); +Console.Write("\n-------------------------------\n\n"); + +Console.Write(HelloWorldExotico() + "\n"); // Salida -> "hello world!" + +string HelloWorldExotico() +{ + string lorem = "Lorem ipsum dolor sit amet, consectetur | adipiscing elit. Donec tempus dui mi, viverra vulputate | dolor hendrerit ac. Curabitur porttitor enim | nec turpis porttitor, eget egestas | ligula mattis. Nullam nec augue purus. | Morbi maximus et libero at posuere. Nunc sodales nisi | non diam ultrices, sed facilisis enim | aliquam. Sed et nisl sed arcu accumsan volutpat eu | quis sem. Vestibulum consectetur tempor quam, | id commodo risus | aliquam in. || Nulla rhoncus risus vitae tortor hendrerit, vel | bibendum nibh facilisis. Sed aliquet, nisl eu | euismod tincidunt, purus arcu elementum massa, | vel ullamcorper ex | ipsum a lectus. Quisque id magna vel | ipsum sollicitudin | vulputate vitae vel ante. Suspendisse nulla | dolor, condimentum ut rutrum vel, pulvinar non odio. Duis | scelerisque nibh quis diam maximus rhoncus. | Lorem ipsum dolor sit | amet, consectetur | adipiscing."; + + return new string( + String.Concat( + String.Concat( + lorem + .Split('|') + .Select(x => x.Trim()) + .Select(x => x.Length > 0 ? x.Split().Count() : 0) + .Select(x => x == 3 ? "f" : x == 9 ? "c" : x.ToString())) + .Chunk(2) + .Select(x => $@"\u00{String.Concat(x)}")) + .Split(new[] { @"\u" }, StringSplitOptions.RemoveEmptyEntries) + .Select(c => (char)Convert.ToInt32(c, 16)) + .ToArray()); +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/rafael.ramirez150.cs" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/rafael.ramirez150.cs" new file mode 100644 index 0000000000..2760dbb70c --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/rafael.ramirez150.cs" @@ -0,0 +1,7 @@ +using System; + +class HelloWorld { + static void Main() { + Console.WriteLine("¡Hola Mundo!"); + } +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/rafaelramireza.cs" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/rafaelramireza.cs" new file mode 100644 index 0000000000..7764a6e261 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c#/rafaelramireza.cs" @@ -0,0 +1,7 @@ +using System; + +class Program { + static void Main() { + Console.WriteLine("¡Hola Mundo!"); + } +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/FabianCristancho.cpp" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/FabianCristancho.cpp" new file mode 100644 index 0000000000..01db19ea03 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/FabianCristancho.cpp" @@ -0,0 +1,8 @@ +#include + +using namespace std; + +int main() { + cout << "!Hola mundo!"; + return 0; +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/pyramsd.cpp" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/pyramsd.cpp" new file mode 100644 index 0000000000..94c64138b3 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/pyramsd.cpp" @@ -0,0 +1,6 @@ +#include +using namespace std; + +int main(){ + cout << "!Hola Mundo!"; +} diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/rafaelramirez150.cpp" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/rafaelramirez150.cpp" new file mode 100644 index 0000000000..a1451e138d --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/rafaelramirez150.cpp" @@ -0,0 +1,7 @@ +#include +using namespace std; + +int main() { + cout << "¡Hola Mundo!" << endl; + return 0; +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/rafaelramireza.cpp" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/rafaelramireza.cpp" new file mode 100644 index 0000000000..828e77d394 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c++/rafaelramireza.cpp" @@ -0,0 +1,6 @@ +#include + +int main() { + std::cout << "¡Hola Mundo!" << std::endl; + return 0; +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c/FabianCristancho.c" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c/FabianCristancho.c" new file mode 100644 index 0000000000..2dad35f7b7 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/c/FabianCristancho.c" @@ -0,0 +1,6 @@ +#include + +int main(){ + printf("!Hola Mundo!\n"); + return 0; +}; \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/cobol/FabianCristancho.cbl" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/cobol/FabianCristancho.cbl" new file mode 100644 index 0000000000..d889b04175 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/cobol/FabianCristancho.cbl" @@ -0,0 +1,21 @@ + + identification division. + program-id. helloworld. + + environment division. + configuration section. + input-output section. + + data division. + + file section. + + working-storage section. + + 77 mensaje picture x(32) value '!Hola Mundo!'. + + procedure division. + + display mensaje. + + stop run. \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/crystal/FabianCristancho.cr" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/crystal/FabianCristancho.cr" new file mode 100644 index 0000000000..f1514fbbc0 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/crystal/FabianCristancho.cr" @@ -0,0 +1 @@ +puts "!Hola Mundo!" \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/dart/FabianCristancho.dart" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/dart/FabianCristancho.dart" new file mode 100644 index 0000000000..1909686715 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/dart/FabianCristancho.dart" @@ -0,0 +1,3 @@ +void main() { + print("!Hola Mundo!"); +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/delphi/FabianCristancho.dpr" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/delphi/FabianCristancho.dpr" new file mode 100644 index 0000000000..cc0b560899 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/delphi/FabianCristancho.dpr" @@ -0,0 +1,5 @@ +Program HelloWorld; +{$APPTYPE CONSOLE} +begin + WriteLn ('!Hola Mundo!'); +end. \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/fortran/FabianCristancho.f90" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/fortran/FabianCristancho.f90" new file mode 100644 index 0000000000..d17682e4b7 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/fortran/FabianCristancho.f90" @@ -0,0 +1,3 @@ +program hola + print *, '!Hola Mundo!' +end program hola \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/go/FabianCristancho.go" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/go/FabianCristancho.go" new file mode 100644 index 0000000000..6db55a6f1b --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/go/FabianCristancho.go" @@ -0,0 +1,5 @@ +package main +import "fmt" +func main() { + fmt.Println("!Hola Mundo!") +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/go/rafael.ramirez150.go" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/go/rafael.ramirez150.go" new file mode 100644 index 0000000000..1eca881d0c --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/go/rafael.ramirez150.go" @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("¡Hola Mundo!") +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/go/rafaelramireza.go" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/go/rafaelramireza.go" new file mode 100644 index 0000000000..1eca881d0c --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/go/rafaelramireza.go" @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("¡Hola Mundo!") +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/html/FabianCristancho.html" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/html/FabianCristancho.html" new file mode 100644 index 0000000000..c560572d32 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/html/FabianCristancho.html" @@ -0,0 +1,12 @@ + + + + + + + Hola Mundo + + +

!Hola Mundo!

+ + \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/FabianCristancho.java" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/FabianCristancho.java" new file mode 100644 index 0000000000..294c5a0b9b --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/FabianCristancho.java" @@ -0,0 +1,5 @@ +public class FabianCristancho { + public static void main(String[] args) { + System.out.println("!Hola mundo!"); + } +} diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/Raul1551.java" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/Raul1551.java" new file mode 100644 index 0000000000..c17a1c0651 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/Raul1551.java" @@ -0,0 +1,5 @@ +public class HelloWorld{ + public static void main(String[] args){ + System.out.println("Hello World!"); + } +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/asjordi.java" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/asjordi.java" new file mode 100644 index 0000000000..9450176875 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/asjordi.java" @@ -0,0 +1,7 @@ +public class HelloWorld { + + public static void main(String[] args) { + System.out.println("!Hola Mundo!"); + } + +} diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/rafaelramirez150.java" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/rafaelramirez150.java" new file mode 100644 index 0000000000..24a68368c4 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/rafaelramirez150.java" @@ -0,0 +1,5 @@ +public class HelloWorld { + public static void main(String[] args) { + System.out.println("¡Hola Mundo!"); + } +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/rafaelramireza.java" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/rafaelramireza.java" new file mode 100644 index 0000000000..52781ecede --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/java/rafaelramireza.java" @@ -0,0 +1,5 @@ +public class HolaMundo { + public static void main(String[] args) { + System.out.println("¡Hola Mundo!"); + } +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/FabianCristancho.js" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/FabianCristancho.js" new file mode 100644 index 0000000000..db8566ad25 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/FabianCristancho.js" @@ -0,0 +1 @@ +console.log("!Hola Mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/Raul1551.js" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/Raul1551.js" new file mode 100644 index 0000000000..825acf770f --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/Raul1551.js" @@ -0,0 +1,9 @@ +/* + * Escribe un !Hola Mundo! en todos los lenguajes de programación que puedas. + * Seguro que hay algún lenguaje que te llama la atención y nunca has utilizado, + * o quizás quieres dar tus primeros pasos... ¡Pues este es el momento! + * + * A ver quién se atreve con uno de esos lenguajes que no solemos ver por ahí... + */ + +console.log("Hello World!"); \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/rafaelramirez150.js" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/rafaelramirez150.js" new file mode 100644 index 0000000000..3c81d56c40 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/rafaelramirez150.js" @@ -0,0 +1 @@ +console.log("¡Hola Mundo!"); \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/rafaelramireza.js" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/rafaelramireza.js" new file mode 100644 index 0000000000..3c81d56c40 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/javascript/rafaelramireza.js" @@ -0,0 +1 @@ +console.log("¡Hola Mundo!"); \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/julia/FabianCristancho.jl" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/julia/FabianCristancho.jl" new file mode 100644 index 0000000000..8011cf888f --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/julia/FabianCristancho.jl" @@ -0,0 +1 @@ +println("!Hola Mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/kotlin/FabianCristancho.kt" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/kotlin/FabianCristancho.kt" new file mode 100644 index 0000000000..acb067fa11 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/kotlin/FabianCristancho.kt" @@ -0,0 +1,3 @@ +fun main() { + println("!Hola Mundo!") +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/kotlin/rafaelramirez150.kt" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/kotlin/rafaelramirez150.kt" new file mode 100644 index 0000000000..ec7b93f9d9 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/kotlin/rafaelramirez150.kt" @@ -0,0 +1,3 @@ +fun main() { + println("¡Hola Mundo!") +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/lua/FabianCristancho.lua" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/lua/FabianCristancho.lua" new file mode 100644 index 0000000000..40fcab2840 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/lua/FabianCristancho.lua" @@ -0,0 +1 @@ +print("!Hola Mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/matlab/FabianCristancho.m" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/matlab/FabianCristancho.m" new file mode 100644 index 0000000000..02eb52bc59 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/matlab/FabianCristancho.m" @@ -0,0 +1 @@ +disp("!Hola Mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/matlab/rafaelramirez150.m" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/matlab/rafaelramirez150.m" new file mode 100644 index 0000000000..d6a215927f --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/matlab/rafaelramirez150.m" @@ -0,0 +1 @@ +disp('¡Hola Mundo!'); \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/mojo/amacsmith.mojo" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/mojo/amacsmith.mojo" new file mode 100644 index 0000000000..e3095b2229 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/mojo/amacsmith.mojo" @@ -0,0 +1,2 @@ +def main(): + print("hello world") diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/perl/FabianCristancho.pl" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/perl/FabianCristancho.pl" new file mode 100644 index 0000000000..b97b388fd0 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/perl/FabianCristancho.pl" @@ -0,0 +1 @@ +print "!Hola Mundo!"; \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/php/FabianCristancho.php" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/php/FabianCristancho.php" new file mode 100644 index 0000000000..01e57b8f84 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/php/FabianCristancho.php" @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/php/rafaelramirez.php" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/php/rafaelramirez.php" new file mode 100644 index 0000000000..508e76469b --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/php/rafaelramirez.php" @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/php/rafaelramireza.php" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/php/rafaelramireza.php" new file mode 100644 index 0000000000..508e76469b --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/php/rafaelramireza.php" @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/FabianCristancho.py" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/FabianCristancho.py" new file mode 100644 index 0000000000..40fcab2840 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/FabianCristancho.py" @@ -0,0 +1 @@ +print("!Hola Mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/Raul1551.py" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/Raul1551.py" new file mode 100644 index 0000000000..1dc45ac136 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/Raul1551.py" @@ -0,0 +1 @@ +print("Hello World!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/alberba.py" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/alberba.py" new file mode 100644 index 0000000000..2c20486e8a --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/alberba.py" @@ -0,0 +1 @@ +print("Hola mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/josevegas27.py" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/josevegas27.py" new file mode 100644 index 0000000000..7458aa35c1 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/josevegas27.py" @@ -0,0 +1 @@ +print('¡Hola mundo!') \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/klimyflorez.py" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/klimyflorez.py" new file mode 100644 index 0000000000..fdbe287e08 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/klimyflorez.py" @@ -0,0 +1,4 @@ +""" +Escribe un !Hola Mundo! +""" +print("!Hola Mundo!") diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/rafaelramirez150.py" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/rafaelramirez150.py" new file mode 100644 index 0000000000..75d16e0ba6 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/rafaelramirez150.py" @@ -0,0 +1 @@ +print("¡Hola Mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/rafaelramireza.py" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/rafaelramireza.py" new file mode 100644 index 0000000000..75d16e0ba6 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/python/rafaelramireza.py" @@ -0,0 +1 @@ +print("¡Hola Mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/r/FabianCristancho.r" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/r/FabianCristancho.r" new file mode 100644 index 0000000000..4bcba1ed91 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/r/FabianCristancho.r" @@ -0,0 +1 @@ +print('!Hola Mundo!') \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/r/rafaelramirez150.r" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/r/rafaelramirez150.r" new file mode 100644 index 0000000000..75d16e0ba6 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/r/rafaelramirez150.r" @@ -0,0 +1 @@ +print("¡Hola Mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ruby/FabianCristancho.rb" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ruby/FabianCristancho.rb" new file mode 100644 index 0000000000..f1514fbbc0 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ruby/FabianCristancho.rb" @@ -0,0 +1 @@ +puts "!Hola Mundo!" \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ruby/rafaelramirez150.rb" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ruby/rafaelramirez150.rb" new file mode 100644 index 0000000000..f2cdc6bd99 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ruby/rafaelramirez150.rb" @@ -0,0 +1 @@ +puts "¡Hola Mundo!" \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ruby/rafaelramireza.rb" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ruby/rafaelramireza.rb" new file mode 100644 index 0000000000..f2cdc6bd99 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/ruby/rafaelramireza.rb" @@ -0,0 +1 @@ +puts "¡Hola Mundo!" \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/FabianCristancho.rs" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/FabianCristancho.rs" new file mode 100644 index 0000000000..89eda59fe3 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/FabianCristancho.rs" @@ -0,0 +1,3 @@ +fn main() { + println!("!Hola Mundo!"); +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/marcoatrs.rs" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/marcoatrs.rs" new file mode 100644 index 0000000000..89eda59fe3 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/marcoatrs.rs" @@ -0,0 +1,3 @@ +fn main() { + println!("!Hola Mundo!"); +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/rafaelramirez150.rs" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/rafaelramirez150.rs" new file mode 100644 index 0000000000..311ec7895e --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/rafaelramirez150.rs" @@ -0,0 +1,3 @@ +fn main() { + println!("¡Hola Mundo!"); +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/rafaelramireza.rs" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/rafaelramireza.rs" new file mode 100644 index 0000000000..311ec7895e --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/rust/rafaelramireza.rs" @@ -0,0 +1,3 @@ +fn main() { + println!("¡Hola Mundo!"); +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/scala/FabianCristancho.scala" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/scala/FabianCristancho.scala" new file mode 100644 index 0000000000..1aae93a7bc --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/scala/FabianCristancho.scala" @@ -0,0 +1,3 @@ +object HolaMundo extends App { + println("!Hola Mundo!") +} \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/sql/FabianCristancho.sql" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/sql/FabianCristancho.sql" new file mode 100644 index 0000000000..e10427531e --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/sql/FabianCristancho.sql" @@ -0,0 +1 @@ +SELECT "!Hola Mundo!" \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/swift/FabianCristancho.swift" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/swift/FabianCristancho.swift" new file mode 100644 index 0000000000..dbb2acae5f --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/swift/FabianCristancho.swift" @@ -0,0 +1,3 @@ +import Foundation + +print("!Hola Mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/swift/rafaelramirez150.swift" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/swift/rafaelramirez150.swift" new file mode 100644 index 0000000000..75d16e0ba6 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/swift/rafaelramirez150.swift" @@ -0,0 +1 @@ +print("¡Hola Mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/swift/rafaelramireza.swift" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/swift/rafaelramireza.swift" new file mode 100644 index 0000000000..2762fcf5ee --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/swift/rafaelramireza.swift" @@ -0,0 +1,3 @@ +import Swift + +print("¡Hola Mundo!") \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/typescript/FabianCristancho.ts" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/typescript/FabianCristancho.ts" new file mode 100644 index 0000000000..d98fd298c1 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/typescript/FabianCristancho.ts" @@ -0,0 +1 @@ +console.log('!Hola Mundo!') \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/typescript/miguelriosoliveira.ts" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/typescript/miguelriosoliveira.ts" new file mode 100644 index 0000000000..56e7e2616d --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/typescript/miguelriosoliveira.ts" @@ -0,0 +1,8 @@ +/* + * Escribe un !Hola Mundo! en todos los lenguajes de programación que puedas. + * Seguro que hay algún lenguaje que te llama la atención y nunca has utilizado, + * o quizás quieres dar tus primeros pasos... ¡Pues este es el momento! + * + * A ver quién se atreve con uno de esos lenguajes que no solemos ver por ahí... + */ +console.log('¡Hola Mundo!'); diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/typescript/rafaelramirez150.ts" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/typescript/rafaelramirez150.ts" new file mode 100644 index 0000000000..3c81d56c40 --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/typescript/rafaelramirez150.ts" @@ -0,0 +1 @@ +console.log("¡Hola Mundo!"); \ No newline at end of file diff --git "a/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/visualbasic/FabianCristancho.vb" "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/visualbasic/FabianCristancho.vb" new file mode 100644 index 0000000000..6e3d4266bd --- /dev/null +++ "b/Retos/Reto #5 - HOLA MUNDO [F\303\241cil]/visualbasic/FabianCristancho.vb" @@ -0,0 +1,6 @@ +Module HelloWorld + Sub Main() + ' The classic "Hello, World!" demonstration program + Console.WriteLine("!Hola Mundo!") + End Sub +End Module \ No newline at end of file diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/c#/iggict.cs b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/c#/iggict.cs new file mode 100644 index 0000000000..2e9b9a683e --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/c#/iggict.cs @@ -0,0 +1,124 @@ +/* Reto #6: Piedra, Papel, Tijera, Lagarto, Spock + * + * Enunciado: + * + * Crea un programa que calcule quien gana más partidas al piedra, + * papel, tijera, lagarto, spock. + * + * - El resultado puede ser: "Player 1", "Player 2", "Tie" (empate) + * - La función recibe un listado que contiene pares, representando cada jugada. + * - El par puede contener combinaciones de "🗿" (piedra), "📄" (papel), + * "✂️" (tijera), "🦎" (lagarto) o "🖖" (spock). + * - Ejemplo. Entrada: [("🗿","✂️"), ("✂️","🗿"), ("📄","✂️")]. Resultado: "Player 2". + * + * Reglas: + * + * ✂️ cortan 📄 + * 📄 cubre 🗿 + * 🗿 aplasta 🦎 + * 🦎 envenena 🖖 + * 🖖 destruye ✂️ + * ✂️ decapita 🦎 + * 🦎 come 📄 + * 📄 desaprueba 🖖 + * 🖖 vaporiza 🗿 + * 🗿 aplasta ✂️ + */ + +using System.Collections.Generic; +using System; +using System.Globalization; +using System.Linq; + +Console.WriteLine("Reto #5: PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK"); +Console.WriteLine("----------------------------------------------\n"); + +var EmojiDict = new Dictionary() { + { '0', "🗿" }, + { '1', "📄" }, + { '2', "✂️" }, + { '3', "🦎" }, + { '4', "🖖" } +}; + +Console.WriteLine("Cómo se juega:\n"); + +Console.Write("El usuario debe introducir una cadena de texto con parejas de valores separados por comas. "); +Console.Write("El primer valor de cada pareja corresponde a una jugada del jugador 1. "); +Console.WriteLine("El segundo valor de cada pareja corresponde a una jugada del jugador 2."); + +Console.WriteLine("\nValores:\n"); +Console.WriteLine(" 0 -> Piedra:"); +Console.WriteLine(" 1 -> Papel:"); +Console.WriteLine(" 2 -> Tijera:"); +Console.WriteLine(" 3 -> Lagarto:"); +Console.WriteLine(" 4 -> Spock:"); + +Console.WriteLine("\nEjemplo: 00, 01, 21, 02 --> Gana jugador 1"); + +do +{ + Console.Write("\nIntroduce las jugadas separadas por comas: "); + + string userText = Console.ReadLine() ?? ""; + + var Score = new ScoreBoard(); + + try + { + string[] inputPlays = string.Concat(userText.Select(x => EmojiDict.ContainsKey(x) ? EmojiDict[x] : x.ToString())).Split(','); + Console.WriteLine(Score.EvaluatePlays(inputPlays)); + + } + catch + { + Console.WriteLine("Se ha producido un error"); + } + +} while (true); + + +// string[] inputPlays = new string[] { "📄📄", "🗿🦎", "🦎🗿" }; // Simula Console.Read(); + +class ScoreBoard +{ + private int _player1Score = 0; + private int _player2Score = 0; + + public string Result + { + get => _player1Score > _player2Score ? "Player 1" : + _player1Score < _player2Score ? "Player 2" : + "Tie"; + } + + public string EvaluatePlays(string[] plays) + { + plays.ToList().ForEach(x => EvaluatePlay(x.Trim())); + return Result; + } + + public void EvaluatePlay(string play) + { + string[] winnerPlays = { "✂️📄", "📄🗿", "🗿🦎", "🦎🖖", "🖖✂️", "✂️🦎", "🦎📄", "📄🖖", "🖖🗿", "🗿✂️" }; + + if (Array.IndexOf(winnerPlays, play) >= 0) + _player1Score++; + else if (Array.IndexOf(winnerPlays, string.Concat(SplitEmojis(play).Reverse())) >= 0) + _player2Score++; + } + + static string[] SplitEmojis(string input) + { + var emojiList = new List(); + var enumerator = StringInfo.GetTextElementEnumerator(input); + while (enumerator.MoveNext()) + { + string element = enumerator.GetTextElement(); + emojiList.Add(element); + } + + return emojiList.ToArray(); + } + +} \ No newline at end of file diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/c++/pyramsd.cpp b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/c++/pyramsd.cpp new file mode 100644 index 0000000000..50ceefa002 --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/c++/pyramsd.cpp @@ -0,0 +1,45 @@ +#include +#include +#include +#include +using namespace std; + +string game(const vector>& players){ + int p1 = 0; + int p2 = 0; + int tie = 0; + + unordered_map> dic_moves_win{ + {"piedra", {"tijeras", "lagarto"}}, + {"papel", {"piedra", "spock"}}, + {"tijeras", {"papel", "lagarto"}}, + {"lagarto", {"papel", "spock"}}, + {"spock", {"tijeras", "piedra"}} + }; + + for (const auto& i : players){ + if (i.first == i.second) tie++; + else if (find(dic_moves_win[i.second].begin(), dic_moves_win[i.second].end(), i.first) != dic_moves_win[i.second].end()) p2++; + else p1++; + } + + string r; + if (p1 > p2) r = "Player 1"; + else if (p1 == p2) r = "Tie"; + else r = "Player 2"; + + return r; + +} + +int main(){ + + vector> game1 = {{"piedra", "spock"}, {"lagarto", "piedra"}, {"lagarto", "tijeras"}}; + vector> game2 = {{"lagarto", "papel"}, {"tijeras", "papel"}, {"papel", "spock"}}; + vector> game3 = {{"tijeras", "lagarto"}, {"papel", "tijeras"}}; + + cout << game(game1) << endl; + cout << game(game2) << endl; + cout << game(game3) << endl; + +} diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/java/asjordi.java b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/java/asjordi.java new file mode 100644 index 0000000000..67d8a7b06b --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/java/asjordi.java @@ -0,0 +1,50 @@ +import java.util.*; + +public class RockPaperScissorsLizardSpock { + + public static void main(String[] args) { + + RockPaperScissorsLizardSpock r = new RockPaperScissorsLizardSpock(); + + String[][] games = new String[][]{{"piedra", "tijera"}, {"tijera", "piedra"}, {"papel", "tijera"}}; +// String[][] games = new String[][]{{"piedra", "piedra"}}; +// String[][] games = new String[][]{{"piedra", "piedra"}, {"piedra", "piedra"}, {"piedra", "piedra"}, {"piedra", "piedra"}}; +// String[][] games = new String[][]{{"spock", "piedra"}, {"tijeras", "papel"}, {"piedra", "piedra"}, {"lagarto", "spock"}}; + + } + + public String playGame(String[][] games) { + + int winsPlayerOne = 0; + int winsPlayerTwo = 0; + + Map rules = new HashMap<>(); + rules.put("piedra", new String[] {"tijera", "lagarto"}); + rules.put("papel", new String[] {"piedra", "spock"}); + rules.put("tijera", new String[] {"papel", "lagarto"}); + rules.put("lagarto", new String[] {"spock", "papel"}); + rules.put("spock", new String[] {"piedra", "tijera"}); + + for (String[] g : games){ + + String p1 = g[0]; + String p2 = g[1]; + + if (!Objects.equals(p1, p2)) { + + String res = Arrays.toString(rules.get(p1)); + + if (res != null && res.contains(p2)) { + winsPlayerOne ++; + } else { + winsPlayerTwo ++; + } + } + + } + + return winsPlayerOne == winsPlayerTwo ? "Tie": winsPlayerOne > winsPlayerTwo ? "Player 1" : "Player 2"; + + } + +} diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/DCRael.py b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/DCRael.py new file mode 100644 index 0000000000..4fa02ac11d --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/DCRael.py @@ -0,0 +1,40 @@ +class Game(): + def __init__(self): + self.jugadas_ganadoras = { + "🗿" : ("✂️", "🦎"), + "📄" : ("🗿", "🖖"), + "✂️" : ("📄", "🦎"), + "🦎" : ("📄", "🖖"), + "🖖" : ("🗿", "✂️") + } + self.win1 = 0 + self.win2 = 0 + + def historial_partida(self, partida : list) -> str: + + resultados = [] + for i, intento in enumerate(partida): + j1, j2 = intento + + if j2 in self.jugadas_ganadoras[j1]: + self.win1 += 1 + resultados.append(f"Partida {i+1}: Player 1 {j1} vs{j2}") + elif j1 == j2: + resultados.append(f"Partida {i+1}: Empate {j1} vs{j2}") + else: + self.win2 += 1 + resultados.append(f"Partida {i+1}: Player 2 {j1} vs{j2}") + + resultados.append(f'Resultado final: {self.ganador()}') + return resultados + + def ganador(self) -> str: + return "Player 1" if self.win1 > self.win2 else "player 2" if self.win2 > self.win1 else 'Tie' + + +game = Game() +intentos = [("✂️", "✂️"), ("✂️", "🗿"), ("✂️", "📄")] +print("Historial de partidas:") +resultados = game.historial_partida(intentos) +for resultado in resultados: + print(f"{resultado}") \ No newline at end of file diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/PedroOrtix.py b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/PedroOrtix.py new file mode 100644 index 0000000000..da669ed046 --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/PedroOrtix.py @@ -0,0 +1,47 @@ +def quien_gana(partidas): + reglas = { + ("🗿", "✂️"): 1, # Piedra gana a tijera + ("🗿", "🦎"): 1, # Piedra gana a lagarto + ("📄", "🗿"): 1, # Papel gana a piedra + ("📄", "🖖"): 1, # Papel gana a spock + ("✂️", "📄"): 1, # Tijera gana a papel + ("✂️", "🦎"): 1, # Tijera gana a lagarto + ("🦎", "📄"): 1, # Lagarto gana a papel + ("🦎", "🖖"): 1, # Lagarto gana a spock + ("🖖", "🗿"): 1, # Spock gana a piedra + ("🖖", "✂️"): 1, # Spock gana a tijera + ("🗿", "🗿"): 0, # Empate + ("📄", "📄"): 0, + ("✂️", "✂️"): 0, + ("🦎", "🦎"): 0, + ("🖖", "🖖"): 0 + } + + # Contadores de victorias + victorias_1 = 0 + victorias_2 = 0 + + # Iteramos sobre las partidas + for jugada_1, jugada_2 in partidas: + # Si las jugadas son iguales, es un empate + if jugada_1 == jugada_2: + continue + + # Comprobamos quién gana según las reglas + if (jugada_1, jugada_2) in reglas: + victorias_1 += reglas[(jugada_1, jugada_2)] + else: + victorias_2 += reglas[(jugada_2, jugada_1)] + + # Devolvemos el resultado + if victorias_1 > victorias_2: + return "Player 1" + elif victorias_2 > victorias_1: + return "Player 2" + else: + return "Tie" + + +if __name__ == "__main__": + ganador = quien_gana([("🗿","✂️"), ("✂️","🗿"), ("📄","✂️")]) + print(ganador) \ No newline at end of file diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/ShinMugenNoKabe.py b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/ShinMugenNoKabe.py new file mode 100644 index 0000000000..82d057ff06 --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/ShinMugenNoKabe.py @@ -0,0 +1,38 @@ +BEATINGS = { + "✂️": ["📄", "🦎"], + "📄": ["🗿", "🖖"], + "🗿": ["✂️", "🦎"], + "🦎": ["📄", "🖖"], + "🖖": ["✂️", "🗿"] +} + +def game(plays: list[tuple]) -> str: + p1_points = 0 + p2_points = 0 + + for p1_play, p2_play in plays: + if p2_play in BEATINGS[p1_play]: + p1_points += 1 + elif p1_play in BEATINGS[p2_play]: + p2_points += 1 + + if p1_points > p2_points: + return "Player 1" + elif p2_points > p1_points: + return "Player 2" + + return "Empate" + + +if __name__ == "__main__": + first_play = game(plays=[("🗿", "✂️"), ("✂️", "🗿"), ("📄", "✂️")]) + assert first_play == "Player 2" + print(first_play) + + second_play = game(plays=[("🦎", "✂️"), ("🦎", "📄"), ("📄", "🖖"), ("✂️", "✂️")]) + assert second_play == "Player 1" + print(second_play) + + third_play = game(plays=[("✂️", "🦎"), ("🗿", "🦎"), ("🗿", "🗿"), ("🗿", "🖖"), ("📄", "🦎")]) + assert third_play == "Empate" + print(third_play) \ No newline at end of file diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/alberba.py b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/alberba.py new file mode 100644 index 0000000000..dfe5927e30 --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/alberba.py @@ -0,0 +1,18 @@ +def game(games: list): + reglas = {"🗿": "✂️🦎", "✂️": "🦎📄", "🦎": "🖖📄", "📄": "🗿🖖", + "🖖": "✂️🗿"} + wins_p1 = 0 + wins_p2 = 0 + for round in games: + p1, p2 = round + if p1 not in reglas.keys() or p2 not in reglas.keys(): + raise ValueError + if p2 in reglas[p1]: + wins_p1 += 1 + else: + wins_p2 += 1 + + print("Player 1") if wins_p1 > wins_p2 else print("Player 2") \ + if wins_p2 > wins_p1 else print("Empate") + +game([("🗿","✂️"), ("✂️","🗿"), ("📄","✂️")]) \ No newline at end of file diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/jaicarra.py b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/jaicarra.py new file mode 100644 index 0000000000..8cb37360d8 --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/jaicarra.py @@ -0,0 +1,91 @@ + +import random +winner = { +#(UserSlection,Machinaselection) -----> key : Value + ("Rock","Rock"):"Even", + ("Rock","Paper"):"User", + ("Rock","Scissors"):"User", + ("Rock","Lizard"):"User", + ("Rock","Spock"):"Machine", + + ("Paper","Rock"):"Machine", + ("Paper","Paper"):"Even", + ("Paper","Scissors"):"Machine", + ("Paper","Lizard"):"Machine", + ("Paper","Spock"):"User", + + ("Scissors","Paper"):"User", + ("Scissors","Rock"):"Machine", + ("Scissors","Scissors"):"Even", + ("Scissors","Lizard"):"User", + ("Scissors","Spock"):"Machine", + + ("Lizard","Paper"):"User", + ("Lizard","Rock"):"Machine", + ("Lizard","Scissors"):"Machine", + ("Lizard","Lizard"):"Even", + ("Lizard","Spock"):"User", + + ("Spock","Rock"):"Even", + ("Spock","Paper"):"Machine", + ("Spock","Scissors"):"User", + ("Spock","Lizard"):"Machine", + ("Spock","Spock"):"Even" + } + + +######## PRIMERA OPERACION ########### +def chosee_option (): + while True: + options = ("Rock", "Paper", "Scissors", "Lizard", "Spock") + user_option = input("Please make an input => Rock, Paper, Scissors, Lizard, Spock ") + user_selection = user_option.capitalize() + print(user_selection) + if user_selection not in options: + print("Invalid input. Please choose from Rock, Paper, Scissors, Lizard, or Spock.") + + else: + break + + maquina_selection = random.choice(options) + print("User input --> :",user_selection) + print("Maquina input --> :",maquina_selection) + + return user_selection,maquina_selection + +def check_rules(user_selection,maquina_selection,round,user_wins,maquina_wins): + if (user_selection, maquina_selection) in winner: + result = winner[(user_selection, maquina_selection)] + #retrieves the value associated with the key + # (user_selection, maquina_selection) from the winner dictionary. + # The value represents the winner of the round ("User", "Machine", or "Even"). + print("The round is for ", result) + if result == "User": + user_wins += 1 + elif result == "Machine": + maquina_wins += 1 + else: + print("It's a tie!") + round += 1 + return user_wins,maquina_wins + +def game_start(): + round = 1 + user_wins=0 + maquina_wins=0 + while user_wins !=2 and maquina_wins!=2: + print("*" *10) + print("Welcome to the ROUND",round) + print("*"*10) + print("Computer wins",maquina_wins) + print("Computer wins",user_wins) + user_selection,maquina_selection = chosee_option () + user_wins,maquina_wins = check_rules(user_selection,maquina_selection,round,user_wins,maquina_wins) + + if user_wins == 2: + print("Congratulations! You won the game!") + else: + print("Sorry, the computer won the game!") + +game_start() + diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/jaliagag.py b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/jaliagag.py new file mode 100644 index 0000000000..5474b29621 --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/jaliagag.py @@ -0,0 +1,115 @@ +## +## Crea un programa que calcule quien gana más partidas al piedra, +## papel, tijera, lagarto, spock. +## - El resultado puede ser: "Player 1", "Player 2", "Tie" (empate) +## - La función recibe un listado que contiene pares, representando cada jugada. +## - El par puede contener combinaciones de "🗿" (piedra), "📄" (papel), +## "✂️" (tijera), "🦎" (lagarto) o "🖖" (spock). +## - Ejemplo. Entrada: [("🗿","✂️"), ("✂️","🗿"), ("📄","✂️")]. Resultado: "Player 2". +## - Debes buscar información sobre cómo se juega con estas 5 posibilidades. +##/ + +result = 0 + +def check(data): + e = [data['player1'],data['player2']] + if e[0] == e[1]: + print('Tie') + return 0 + if e[0] == 2 and e[1] == 1 \ + or e[0] == 1 and e[1] == 2: + print('tijera corta papel') + if e[0] == 2: + print('Player 1') + else: + print('Player 2') + return 1 + if e[0] == 1 and e[1] == 0 \ + or e[0] == 0 and e[1] == 1: + print('piedra cubre papel') + if e[0] == 1: + print('Player 1') + else: + print('Player 2') + return 1 + if e[0] == 0 and e[1] == 3 \ + or e[0] == 3 and e[1] == 0: + print('piedra aplasta lagarto') + if e[0] == 1: + print('Player 1') + else: + print('Player 2') + return 1 + if e[0] == 3 and e[1] == 4 \ + or e[0] == 4 and e[1] == 3: + print('lagarto envenena a spock') + if e[0] == 1: + print('Player 1') + else: + print('Player 2') + return 1 + if e[0] == 4 and e[1] == 2 \ + or e[0] == 2 and e[1] == 4: + print('spock destroza tijeras') + if e[0] == 1: + print('Player 1') + else: + print('Player 2') + return 1 + if e[0] == 2 and e[1] == 3 \ + or e[0] == 3 and e[1] == 2: + print('tijeras decapita lagarto') + if e[0] == 1: + print('Player 1') + else: + print('Player 2') + return 1 + if e[0] == 3 and e[1] == 1 \ + or e[0] == 1 and e[1] == 3: + print('lagarto come papel') + if e[0] == 1: + print('Player 1') + else: + print('Player 2') + return 1 + if e[0] == 1 and e[1] == 4 \ + or e[0] == 4 and e[1] == 1: + print('papel desacredita a spock') + if e[0] == 1: + print('Player 1') + else: + print('Player 2') + return 1 + if e[0] == 4 and e[1] == 0 \ + or e[0] == 0 and e[1] == 4: + print('spock vaporiza piedra') + if e[0] == 1: + print('Player 1') + else: + print('Player 2') + return 1 + if e[0] == 0 and e[1] == 2 \ + or e[0] == 2 and e[1] == 0: + print('piedra aplasta tijeras') + if e[0] == 1: + print('Player 1') + else: + print('Player 2') + return 1 + return 0 + +def play(): + opciones = {0: 'piedra', 1: 'papel', 2: 'tijera', 3: 'lagarto', 4: 'spock'} + print('opciones numéricas:', opciones) + a = int(input('jugada: ')) + return a + +while result == 0: + data = {'player1': '', 'player2': ''} + data['player1'] = play() + data['player2'] = play() + + result = check(data) + + +#if __name__ == '__main__': \ No newline at end of file diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/josevegas27.py b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/josevegas27.py new file mode 100644 index 0000000000..9afd5088d2 --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/josevegas27.py @@ -0,0 +1,43 @@ +''' Reto #6 Piedra, papel, tijera, lagarto, spock + + * Crea un programa que calcule quien gana más partidas al piedra, + * papel, tijera, lagarto, spock. + * - El resultado puede ser: "Player 1", "Player 2", "Tie" (empate) + * - La función recibe un listado que contiene pares, representando cada jugada. + * - El par puede contener combinaciones de "🗿" (piedra), "📄" (papel), + * "✂️" (tijera), "🦎" (lagarto) o "🖖" (spock). + * - Ejemplo. Entrada: [("🗿","✂️"), ("✂️","🗿"), ("📄","✂️")]. Resultado: "Player 2". + * - Debes buscar información sobre cómo se juega con estas 5 posibilidades. +''' + +manos = ['Piedra','Papel','Tijera','Spock','Lagarto'] + +def game__(opctions): + + dif = manos.index(opctions[1]) - manos.index(opctions[0]) + + if (dif == 2) | (dif == 4) | (dif == -1) | (dif == -3): + return 1 + elif dif == 0: + return 0 + else: + return -1 + +def game(jugadas): + win_player_1 = 0 + + for game in jugadas: + win_player_1 += game__(game) + + return 'Player 1' if win_player_1 > 0 else 'Player 2' if win_player_1 < 0 else 'Tie' + +lista = [] +while True: + a = input('Introduce la opcion de Player 1 --> ') + b = input('Introduce la opcion de Player 2 --> ') + lista.append((a,b)) + + if input('¿Fin del juego? (y/n) --> ') == 'y': + break + +print(game(lista)) \ No newline at end of file diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/klimyflorez.py b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/klimyflorez.py new file mode 100644 index 0000000000..f2fe8f4a18 --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/klimyflorez.py @@ -0,0 +1,41 @@ +''' +/* + * Crea un programa que calcule quien gana más partidas al piedra, + * papel, tijera, lagarto, spock. + * - El resultado puede ser: "Player 1", "Player 2", "Tie" (empate) + * - La función recibe un listado que contiene pares, representando cada jugada. + * - El par puede contener combinaciones de "🗿" (piedra), "📄" (papel), + * "✂️" (tijera), "🦎" (lagarto) o "🖖" (spock). + * - Ejemplo. Entrada: [("🗿","✂️"), ("✂️","🗿"), ("📄","✂️")]. Resultado: "Player 2". + * - Debes buscar información sobre cómo se juega con estas 5 posibilidades. + */ +''' +def rock_paper_scissor_lizard_spock(games): + rules = {"🗿": ["✂️", "🦎"], + "📄": ["🗿", "🖖"], + "✂️": ["📄", "🦎"], + "🦎": ["🖖", "📄"], + "🖖": ["🗿", "✂️"]} + + player_one = 0 + player_two = 0 + + for game in games: + player_one_game = game[0] + player_two_game = game[1] + if player_one_game != player_two_game: + if player_two_game in rules[player_one_game]: + player_one += 1 + else: + player_two += 1 + + return "Tie" if player_one == player_two else "Player 1" if player_one > player_two else "Player 2" + + +print(rock_paper_scissor_lizard_spock([("🗿", "🗿")])) +print(rock_paper_scissor_lizard_spock([("🗿", "✂️")])) +print(rock_paper_scissor_lizard_spock([("✂️", "🗿")])) +print(rock_paper_scissor_lizard_spock( + [("🗿", "🗿"), ("🗿", "🗿"), ("🗿", "🗿"), ("🗿", "🗿")])) +print(rock_paper_scissor_lizard_spock( + [("🖖", "🗿"), ("✂️", "📄"), ("🗿", "🗿"), ("🦎", "🖖")])) \ No newline at end of file diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/marcoatrs.py b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/marcoatrs.py new file mode 100644 index 0000000000..5c6cc2f61e --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/marcoatrs.py @@ -0,0 +1,40 @@ +from typing import List + +options = { + "🗿": ("✂️", "🦎"), + "📄": ("🗿", "🖖"), + "✂️": ("📄", "🦎"), + "🦎": ("📄", "🖖"), + "🖖": ("🗿", "✂️"), +} + +def check_round(p1: str, p2: str) -> tuple: + if (p1 not in options.keys()) or (p2 not in options.keys()): + print("Option invalida") + return (0, 0) + + if p1 == p2: + return (0, 0) + + if p2 in options[p1]: + return (1, 0) + + return (0, 1) + +def game(options_list: List[tuple]): + p1, p2 = 0, 0 + for _p1, _p2 in options_list: + round = check_round(_p1, _p2) + p1 += round[0] + p2 += round[1] + + if p1 == p2: + print("Tie") + elif p1 > p2: + print("Player 1") + else: + print("Player 2") + + +game([("🗿","✂️"), ("✂️","🗿"), ("📄","✂️")]) +game([("🗿","🗿"), ("🖖","✂️"), ("🦎","📄")]) \ No newline at end of file diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/rafaelramirez150.py b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/rafaelramirez150.py new file mode 100644 index 0000000000..f412398a7d --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/rafaelramirez150.py @@ -0,0 +1,61 @@ +''' +/* + * Crea un programa que calcule quien gana más partidas al piedra, + * papel, tijera, lagarto, spock. + * - El resultado puede ser: "Player 1", "Player 2", "Tie" (empate) + * - La función recibe un listado que contiene pares, representando cada jugada. + * - El par puede contener combinaciones de "🗿" (piedra), "📄" (papel), + * "✂️" (tijera), "🦎" (lagarto) o "🖖" (spock). + * - Ejemplo. Entrada: [("🗿","✂️"), ("✂️","🗿"), ("📄","✂️")]. Resultado: "Player 2". + * - Debes buscar información sobre cómo se juega con estas 5 posibilidades. + */ + ''' + +def get_winner(player1, player2): + if player1 == player2: + return "Empate" + elif ( + (player1 == "piedra" and (player2 == "tijera" or player2 == "lagarto")) or + (player1 == "papel" and (player2 == "piedra" or player2 == "spock")) or + (player1 == "tijera" and (player2 == "papel" or player2 == "lagarto")) or + (player1 == "lagarto" and (player2 == "papel" or player2 == "spock")) or + (player1 == "spock" and (player2 == "piedra" or player2 == "tijera")) + ): + return "Player 1" + else: + return "Player 2" + +def play_game(): + scores = {"Player 1": 0, "Player 2": 0} + + while True: + player1 = input("Player 1 - Elige: piedra, papel, tijera, lagarto o spock: ").lower() + player2 = input("Player 2 - Elige: piedra, papel, tijera, lagarto o spock: ").lower() + + if player1 not in ["piedra", "papel", "tijera", "lagarto", "spock"] or player2 not in ["piedra", "papel", "tijera", "lagarto", "spock"]: + print("Opción inválida. Intenta de nuevo.") + continue + + winner = get_winner(player1, player2) + if winner == "Empate": + print("¡Empate en la partida!") + else: + scores[winner] += 1 + print("¡", winner, "gana la partida!") + + play_again = input("¿Quieren jugar de nuevo? (S/N): ").lower() + if play_again != "s": + break + + print("Puntuación final:") + for player, score in scores.items(): + print(player, "-", score, "partidas ganadas") + + if scores["Player 1"] > scores["Player 2"]: + print("¡Player 1 gana más partidas!") + elif scores["Player 2"] > scores["Player 1"]: + print("¡Player 2 gana más partidas!") + else: + print("Empate en el número de partidas ganadas.") + +play_game() diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/rafaelramireza.py b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/rafaelramireza.py new file mode 100644 index 0000000000..bacdcff461 --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/python/rafaelramireza.py @@ -0,0 +1,56 @@ +''' +* Crea un programa que calcule quien gana más partidas al piedra, + * papel, tijera, lagarto, spock. + * - El resultado puede ser: "Player 1", "Player 2", "Tie" (empate) + * - La función recibe un listado que contiene pares, representando cada jugada. + * - El par puede contener combinaciones de "🗿" (piedra), "📄" (papel), + * "✂️" (tijera), "🦎" (lagarto) o "🖖" (spock). + * - Ejemplo. Entrada: [("🗿","✂️"), ("✂️","🗿"), ("📄","✂️")]. Resultado: "Player 2". + * - Debes buscar información sobre cómo se juega con estas 5 posibilidades. +''' + +def obtener_ganador(jugador1, jugador2): + if jugador1 == jugador2: + return "Tie" + + if (jugador1 == "piedra" and (jugador2 == "tijera" or jugador2 == "lagarto")) or \ + (jugador1 == "papel" and (jugador2 == "piedra" or jugador2 == "spock")) or \ + (jugador1 == "tijera" and (jugador2 == "papel" or jugador2 == "lagarto")) or \ + (jugador1 == "lagarto" and (jugador2 == "papel" or jugador2 == "spock")) or \ + (jugador1 == "spock" and (jugador2 == "piedra" or jugador2 == "tijera")): + return "Player 1" + else: + return "Player 2" + +def main(): + partidas = int(input("Ingrese el número de partidas a jugar: ")) + + jugador1_victorias = 0 + jugador2_victorias = 0 + + for i in range(partidas): + jugador1 = input("Jugador 1 - Elige: piedra, papel, tijera, lagarto o spock: ") + jugador2 = input("Jugador 2 - Elige: piedra, papel, tijera, lagarto o spock: ") + + ganador = obtener_ganador(jugador1, jugador2) + + if ganador == "Player 1": + jugador1_victorias += 1 + elif ganador == "Player 2": + jugador2_victorias += 1 + + print(f"Ganador de la partida {i+1}: {ganador}") + + print("----- Resultado Final -----") + print(f"Jugador 1: {jugador1_victorias} victorias") + print(f"Jugador 2: {jugador2_victorias} victorias") + + if jugador1_victorias == jugador2_victorias: + print("Empate en el total de partidas") + elif jugador1_victorias > jugador2_victorias: + print("¡Jugador 1 es el ganador!") + else: + print("¡Jugador 2 es el ganador!") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/typescript/miguelriosoliveira.ts b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/typescript/miguelriosoliveira.ts new file mode 100644 index 0000000000..8427d3580a --- /dev/null +++ b/Retos/Reto #6 - PIEDRA, PAPEL, TIJERA, LAGARTO, SPOCK [Media]/typescript/miguelriosoliveira.ts @@ -0,0 +1,96 @@ +/* + * Crea un programa que calcule quien gana más partidas al piedra, + * papel, tijera, lagarto, spock. + * - El resultado puede ser: "Player 1", "Player 2", "Tie" (empate) + * - La función recibe un listado que contiene pares, representando cada jugada. + * - El par puede contener combinaciones de "🗿" (piedra), "📄" (papel), + * "✂️" (tijera), "🦎" (lagarto) o "🖖" (spock). + * - Ejemplo. Entrada: [("🗿","✂️"), ("✂️","🗿"), ("📄","✂️")]. Resultado: "Player 2". + * - Debes buscar información sobre cómo se juega con estas 5 posibilidades. + */ + +const TYPES = { + ROCK: '🗿', + PAPER: '📄', + SCISSORS: '✂️', + LIZARD: '🦎', + SPOCK: '🖖', +} as const; + +type Keys = keyof typeof TYPES; +type Type = (typeof TYPES)[keyof typeof TYPES]; + +const DOMINANCE = { + [TYPES.ROCK]: [TYPES.SCISSORS, TYPES.LIZARD], + [TYPES.PAPER]: [TYPES.ROCK, TYPES.SPOCK], + [TYPES.SCISSORS]: [TYPES.PAPER, TYPES.LIZARD], + [TYPES.LIZARD]: [TYPES.SPOCK, TYPES.PAPER], + [TYPES.SPOCK]: [TYPES.SCISSORS, TYPES.ROCK], +}; + +type Match = [Type, Type]; +type Winner = 'Player 1' | 'Player 2' | 'Tie'; + +function calculateWinner(matches: Match[]): Winner { + const { p1: p1Count, p2: p2Count } = matches + .map(([p1, p2]) => { + if (DOMINANCE[p1].includes(p2 as never)) { + return 'p1'; + } + if (DOMINANCE[p2].includes(p1 as never)) { + return 'p2'; + } + return 'p0'; + }) + .reduce((acc, winner) => ({ ...acc, [winner]: acc[winner] + 1 }), { + p0: 0, + p1: 0, + p2: 0, + }); + + return p1Count > p2Count ? 'Player 1' : p2Count > p1Count ? 'Player 2' : 'Tie'; +} + +function test() { + const testCases: { input: Match[]; expected: Winner }[] = [ + { + input: [ + ['🗿', '✂️'], + ['✂️', '🗿'], + ['📄', '✂️'], + ], + expected: 'Player 2', + }, + { + input: [ + ['🗿', '✂️'], + ['✂️', '🗿'], + ['📄', '✂️'], + ['🦎', '📄'], + ['🖖', '🗿'], + ], + expected: 'Player 1', + }, + { + input: [ + ['✂️', '🗿'], + ['📄', '✂️'], + ['🦎', '📄'], + ['🖖', '🗿'], + ], + expected: 'Tie', + }, + ]; + testCases.every(({ input, expected }) => { + const received = calculateWinner(input); + const hasPassed = received === expected; + if (received === expected) { + console.log('✅ PASSED'); + } else { + console.log('❌ FAILED', { expected, received }); + } + return hasPassed; + }); +} + +test(); diff --git a/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/c++/pyramsd.cpp b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/c++/pyramsd.cpp new file mode 100644 index 0000000000..6c6d100298 --- /dev/null +++ b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/c++/pyramsd.cpp @@ -0,0 +1,91 @@ +#include +#include +#include +#include + +using namespace std; + +int main() { + unordered_map casas = { + {'a', "Gryffindor"}, + {'b', "Hufflepuff"}, + {'c', "Slytherin"}, + {'d', "Ravenclaw"} + }; + + vector>> preguntas_y_alternativas = { + { + {"pregunta", {"1. ¿Cuál de las siguientes opciones odiaría más que la gente lo llamara?"}}, + {"alternativas", {"a) Cobarte", "b) Egoísta", "c) Ordinario", "d) Ignorante"}} + }, + { + {"pregunta", {"2. Después de su muerte ¿qué es lo que más le gustaría que hiciera la gente cuando escuche su nombre?"}}, + {"alternativas", {"a) Pide mas historias sobre tus aventuras", "b) Te extraña, pero sonríe", "c) Piensa con admiración tus logros", "d) No me importa lo que la gente piense de mí después de mi muerte, es lo que piensan de mi mientras estoy vivo lo que cuenta"}} + }, + { + {"pregunta", {"3. Dada la opción, preferirías inventar una poción que garantizara:"}}, + {"alternativas", {"a) Gloria", "b) Amor", "c) Poder", "d) Sabiduría"}} + }, + { + {"pregunta", {"4. ¿Cómo le gustaría ser conocido en la historia?"}}, + {"alternativas", {"a) El gran", "b) El bueno", "c) El audaz", "d) El sabio"}} + }, + { + {"pregunta", {"5. Tú y dos amigos deben cruzar un puente custodiado por un troll de río que insiste en luchar contra uno de ustedes antes de que los deje pasar a todos. Tú:"}}, + {"alternativas", {"a) ¿Sugiere que los tres deben luchar? (sin decírselo al troll)", "b) Te ofreces como voluntario", "c) ¿Intentas confundir al troll para que te deje pasar a los tres sin luchar?", "d) Sugerir sorteo para decidir quién de ustedes peleará"}} + } + }; + + unordered_map pnts{ + {'a', 0}, + {'b', 0}, + {'c', 0}, + {'d', 0} + }; + + cout << "\t\t\t\t\t\tBienvenido a Hogwarts!" << endl; + cout << "\t\t\t\t\t\t---------------------" << endl; + cout << "El sombrero seleccionador se encargará de seleccionar tu casa de Hogwarts" << endl; + cout << "--------------------------------------------------------------------------"; + + bool r_valida = false; + + while (!r_valida) + { + try{ + for (const auto& pregunta : preguntas_y_alternativas) { + const string& texto_pregunta = pregunta.at("pregunta").at(0); + cout << endl << texto_pregunta << endl; + + const vector& alternativas = pregunta.at("alternativas"); + for (const string& alternativa : alternativas){ + cout << alternativa << endl; + } + + char r; + cout << "Respuesta (a, b, c, d): "; + cin >> r; + r = tolower(r); + + if (pnts.find(r) == pnts.end()){ + throw invalid_argument("Alternativa no válida"); + } + pnts[r]++; + } + + r_valida = true; + + }catch (const exception& e){ + cout << "Intentelo de nuevo" << endl; + + } + } + + char max_pnts = max_element(pnts.begin(), pnts.end(), [](const pair& a, const pair& b) { + return a.second < b.second; + })->first; + + string casa_final = casas[max_pnts]; + cout << endl << "Eres " << casa_final << "!" << endl; + +}; diff --git a/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/PedroOrtix.py b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/PedroOrtix.py new file mode 100644 index 0000000000..72ea146db7 --- /dev/null +++ b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/PedroOrtix.py @@ -0,0 +1,72 @@ +PROMPT_VALENTIA = """ +Valentía: +Te encuentras en el bosque prohibido y escuchas gritos de auxilio provenientes de una zona oscura y peligrosa. ¿Qué haces? +1. Te acercas sin dudar para ayudar, enfrentando cualquier peligro que pueda surgir. +2. Te preparas mentalmente y decides ir a investigar, pero pidiendo ayuda a un amigo antes de adentrarte. +3. Decides pedir ayuda a un profesor o adulto antes de enfrentar la situación. +4. Evitas acercarte y regresas al castillo buscando a un adulto para que maneje la situación. +Opción: +""" + +PROMPT_INTELIGENCIA = """ +Inteligencia: +El profesor Snape te ha asignado una poción complicada que requiere de una gran precisión. ¿Qué enfoque tomas? +1. Te enfrentas al reto con confianza y resuelves la poción usando tus conocimientos mágicos. +2. Buscas en la biblioteca información adicional sobre la poción antes de proceder con la tarea. +3. Consultas con tus compañeros de clase para obtener consejos y orientación. +4. Te sientes abrumado y tienes dificultades para entender la complejidad de la poción. +Opción: +""" + +PROMPT_LIDERAZGO = """ +Liderazgo: +En el club de duelo, te han nombrado líder del equipo en un importante torneo. ¿Cómo lideras al equipo? +1. Tomas la iniciativa, das instrucciones claras y motivas a tus compañeros para lograr la victoria. +2. Escuchas las ideas y estrategias de tus compañeros, tomando decisiones en consenso. +3. Prefieres dejar que otro compañero tome el liderazgo y sigues sus instrucciones. +4. Intentas tomar el control, pero tus decisiones generan desacuerdos y confusión en el equipo. +Opción: +""" + +PROMPT_HONESTIDAD = """ +Honestidad: +Entras a la sala común y encuentras una cartera olvidada con una gran cantidad de galeones. ¿Qué haces? +1. Confiesas inmediatamente que encontraste la cartera y la entregas al jefe de tu casa. +2. Decides buscar al dueño de la cartera, pero antes sacas solo una pequeña cantidad de galeones para ti. +3. Decides quedarte con la cartera y no decir nada, justificándolo como un premio inesperado. +4. Guardas la cartera en tu mochila sin mencionar nada a nadie. +""" + +PROMPT_CONFIANZA = """ +Confianza: +1. Tienes confianza en tus habilidades mágicas y crees que puedes enfrentar cualquier desafío. +2. Te sientes seguro en la mayoría de las situaciones, pero a veces tienes dudas sobre ti mismo. +3. Tienes inseguridades y te cuesta confiar en tus propias habilidades. +4. Te sientes constantemente inseguro y sin confianza en tus capacidades mágicas. +Opción: +""" + +if __name__ == '__main__': + # Pedir al usuario que puntúe cada cualidad en una escala del 1 al 4 + print("¡Bienvenido al sombrero seleccionador!") + print("Para determinar tu casa de Hogwarts, necesito que me ayudes a calificar algunas situaciones.") + print("Recuerda que debes calificar cada situación con un número del 1 al 4.") + valentia = int(input(PROMPT_VALENTIA)) + inteligencia = int(input(PROMPT_INTELIGENCIA)) + liderazgo = int(input(PROMPT_LIDERAZGO)) + honestidad = int(input(PROMPT_HONESTIDAD)) + confianza = int(input(PROMPT_CONFIANZA)) + + puntaje_total = valentia + inteligencia + liderazgo + honestidad + confianza + print("¡Resultados!") + print(f"Puntaje total: {puntaje_total}") + + # Determinar la casa de Hogwarts + if puntaje_total >= 15: + print("¡Eres un Gryffindor!") + elif puntaje_total >= 11: + print("¡Eres un Ravenclaw!") + elif puntaje_total >= 8: + print("¡Eres un Hufflepuff!") + else: + print("¡Eres un Slytherin!") diff --git a/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/alberba.py b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/alberba.py new file mode 100644 index 0000000000..34a1c981a9 --- /dev/null +++ b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/alberba.py @@ -0,0 +1,65 @@ +import random + +def get_answer(): + resp = int(input("Responda con 1, 2, 3 o 4: ")) + if resp in range(1,5): + return resp + return get_answer() + +questions_and_answer = [["¿Cómo te definirías?", [ + ("1. Valiente", "gryffindor"), + ("2. Leal", "hufflepuff"), + ("3. Sabio", "ravenclaw"), + ("4. Ambicioso", "slytherin")]], + ["¿Cuál es tu clase favorita?", [ + ("1. Vuelo", "gryffindor"), + ("2. Pociones", "ravenclaw"), + ("3. Defensa contra las artes oscuras", "slytherin"), + ("4. Animales fantásticos", "hufflepuff")]], + ["¿Dónde pasarías más tiempo?", [ + ("1. Invernadero", "hufflepuff"), + ("2. Biblioteca", "ravenclaw"), + ("3. En la sala común", "slytherin"), + ("4. Explorando", "gryffindor")]], + ["¿Cuál es tu color favorito?", [ + ("1. Rojo", "gryffindor"), + ("2. Azul", "ravenclaw"), + ("3. Verde", "slytherin"), + ("4. Amarillo", "hufflepuff")]], + ["¿Cuál es tu mascota?", [ + ("1. Sapo", "ravenclaw"), + ("2. Lechuza", "gryffindor"), + ("3. Gato", "hufflepuff"), + ("4. Serpiente", "slytherin")]]] + +houses = { + "gryffindor": 0, + "hufflepuff": 0, + "ravenclaw": 0, + "slytherin": 0 +} +if __name__ == "__main__": + for question_and_answers in questions_and_answer: + print(question_and_answers[0]) + for answer in question_and_answers[1]: + print(answer[0]) + house = question_and_answers[1][get_answer() - 1][1] + houses[house] += 1 + + print() + + selected_house = [] + max_points = 0 + + for house, points in houses.items(): + if points > max_points: + selected_house.clear() + selected_house.append(house) + max_points = points + elif points == max_points: + selected_house.append(house) + + if len(selected_house) == 1: + print(f'Ha sido facil...¡{selected_house[0].capitalize()}!') + else: + print(f'Ha sido dificil...¡{random.choice(selected_house).capitalize()}!') \ No newline at end of file diff --git a/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/jaliagag.py b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/jaliagag.py new file mode 100644 index 0000000000..ebdf90e004 --- /dev/null +++ b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/jaliagag.py @@ -0,0 +1,96 @@ +puntos = { + 'gryffindor': 0, + 'slytherin': 0, + 'hufflepuff': 0, + 'ravenclaw': 0 +} + +ans = [] + +def run_me(input,question): + if question == 0: + if input == 3: + puntos['gryffindor'] += 1 + if input == 2: + puntos['slytherin'] += 1 + if input == 1: + puntos['hufflepuff'] += 1 + if input == 4: + puntos['ravenclaw'] += 1 + if question == 1: + if input == 1: + puntos['gryffindor'] += 1 + if input == 3: + puntos['slytherin'] += 1 + if input == 2: + puntos['hufflepuff'] += 1 + if input == 4: + puntos['ravenclaw'] += 1 + if question == 2: + if input == 2: + puntos['gryffindor'] += 1 + if input == 4: + puntos['slytherin'] += 1 + if input == 3: + puntos['hufflepuff'] += 1 + if input == 1: + puntos['ravenclaw'] += 1 + if question == 3: + if input == 4: + puntos['gryffindor'] += 1 + if input == 1: + puntos['slytherin'] += 1 + if input == 3: + puntos['hufflepuff'] += 1 + if input == 2: + puntos['ravenclaw'] += 1 + if question == 4: + if input == 1: + puntos['gryffindor'] += 1 + if input == 3: + puntos['slytherin'] += 1 + if input == 4: + puntos['hufflepuff'] += 1 + if input == 2: + puntos['ravenclaw'] += 1 + +arr = ['¿Qué característica te describe mejor?', + 'Tu amigo tiene un problema; ¡Lo están acosando! ¿Qué haces?', + '¿Cuál sería la mejor mascota del mundo?', + 'Si ves un cartel que dice "no entrar - ¡Peligro! ¡Peligro!", ¿Qué harías?', + '¿Cuál diría tu familia que es tu peor característica?' + ] +counter = 0 + +while counter < 4: + try: + print(f'{counter+1} - {arr[counter]}') + if counter == 0: + resp = int(input('\t1) leal 2) astuto 3) valiente 4) inteligente\n')) + if counter == 1: + resp = int(input('\t1) ¡Meterme sin pensar y defenderlo! 2) Rápidamente formular un plan para ayudar 3) Consider cuidadosamente… ¿Cómo me puedo beneficiar de esta situación? 4) Buscar un profesor; alguno podrá ayudar más que vos\n')) + if counter == 2: + resp = int(input('\t1) Un buho o un fénix; que sea inteligente 2) Un hipogrifo: feroz, rápido e intrépido 3) Un gato o perro: leal y amable 4) Una serpiente o lagarto\n')) + if counter == 3: + resp = int(input('\t1) Reirme del cartel y entregar. Como si fuera que alguien o algo me pueda llegar a decir qué puedo hacer 2) Marcharme. Rápidamente y no mirar atrás 3) Dejarlo en su lugar. Tiene que haber una buena razón para el cartel 4) ¡Entrar! Si están ahuyentando a la gente es porque hay algo increíble\n')) + if counter == 4: + resp = int(input('\t1) Imprudente - no pienso antes de actuar 2) Un sabelotodo 3) ¿Peor qué? No tengo malas cualidades 4) Soy demasiado amable\n')) + if resp > 4 or resp < 1: + print('¡Las respuestas tienen que ser entre 1 y 4!\n') + pass + else: + ans.append(resp) + counter += 1 + except ValueError: + print("Oops! Solo números del 1 al 4...") + except KeyboardInterrupt: + print('Saliendo de la ejecución...') + exit() + +counter = 0 +for i in ans: + run_me(i,counter) + counter += 1 + +print(puntos) +print(max(puntos,key=puntos.get)) diff --git a/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/klimyflorez.py b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/klimyflorez.py new file mode 100644 index 0000000000..45360c2679 --- /dev/null +++ b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/klimyflorez.py @@ -0,0 +1,44 @@ +""" +* Crea un programa que simule el comportamiento del sombrero seleccionador del universo mágico de Harry Potter. + * - De ser posible realizará 5 preguntas (como mínimo) a través de la terminal. + * - Cada pregunta tendrá 4 respuestas posibles (también a selecciona una a través de terminal). + * - En función de las respuestas a las 5 preguntas deberás diseñar un algoritmo que + * coloque al alumno en una de las 4 casas de Hogwarts (Gryffindor, Slytherin , Hufflepuff y Ravenclaw) + * - Ten en cuenta los rasgos de cada casa para hacer las preguntas y crear el algoritmo seleccionador. + * Por ejemplo, en Slytherin se premia la ambición y la astucia. +""" +def sorting_hat(): + + answers = { + 'a': 0, + 'b': 0, + 'c': 0, + 'd': 0 + } + + questions = { + 1: "¿Cuál es tu mayor fortaleza? \na. Coraje \nb. Ambición \nc. Lealtad \nd. Inteligencia", + 2: "¿Qué habilidad te gustaría tener? \na. Ser un buen luchador \nb. Ser persuasivo/a y lograrlo que quiero \nc. Tener un gran corazón y ayudar a los demás \nd. Ser muy astuto y resolver problemas complejos", + 3: "¿Cuál es tu mayor debilidad? \na. Ser muy valiente y arriesgado \nb. Ser muy ambicioso y egoísta \nc. Ser muy leal y no saber decir que no \nd. Ser muy inteligente y no saber decir que no", + 4: "¿Qué opinas de los desafíos? \na. Me encantan, siempre estoy buscando nuevos desafíos \nb. Son necesarios para llegar a la cima \nc. Pueden ser difíciles, pero los superaré con la ayuda de mis amigos \nd. Me gustan los desafíos que me permiten pensar y resolver problemas", + 5: "¿Qué valoras más en un amigo? \na. Coraje \nb. Ambición \nc. Lealtad \nd. Inteligencia", + } + + for i in questions: + print( + f'Responde la pregunta {i} con la letra de la respuesta que más te identifique') + print(questions[i]) + answer = input('Respuesta: ') + + if answer.lower() != 'a' and answer.lower() != 'b' and answer.lower() != 'c' and answer.lower() != 'd': + print('Respuesta no válida') + exit() + else: + answers[answer.lower()] += 1 + + maximun_answer = max(answers, key=answers.get) + + return 'Gryffindor' if maximun_answer == 'a' else 'Slytherin' if maximun_answer == 'b' else 'Hufflepuff' if maximun_answer == 'c' else 'Ravenclaw' + + +print(sorting_hat()) \ No newline at end of file diff --git a/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/marcoatrs.py b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/marcoatrs.py new file mode 100644 index 0000000000..64c08184e4 --- /dev/null +++ b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/marcoatrs.py @@ -0,0 +1,57 @@ +pregunta_1 = """ +Si pudieras tener algún poder, ¿Cuál elegirias? +a) Poder de invisibilidad. +b) Poder de cambiar la apariencia. +c) Fuerza sobrehumana. +d) Poder de cambiar el pasado. +""" + +pregunta_2 = """ +¿Qué camino te tienta más? +a) El camino serpenteante y cubierto de hojas a través del bosque. +b) La calle adoquinada bordeada de edificios antiguos. +c) El camino ancho, soleado y cubierto de hierba. +d) El callejón estrecho, oscuro e iluminado con linternas. +""" + +pregunta_3 = """ +¿Cuál es lo que más esperas aprender en Hogwarts? +a) Secretos sobre el castillo. +b) Transformaciones y todas las áreas de la magia. +c) Criaturas mágicas. +d) Maleficios. +""" + +pregunta_4 = """ +¿Qué tipo de instrumento agrada más a tu oido? +a) El tambor +b) El piano +c) La trompeta +d) El violín +""" + +pregunta_5 = """ +¿Cuál de los siguientes odiarías más que la gente te llame? +a) Cobarde +b) Ignorante +c) Egoísta +d) Ordinario +""" + +scores = [0, 0, 0, 0] +houses = ["Gryffindor", "Ravenclaw", "Hufflepuff", "Slytherin"] + +for pregunta in (pregunta_1, pregunta_2, pregunta_3, pregunta_4, pregunta_5): + res = '' + while res not in ("a", "b", "c", "d", "d"): + res = input(pregunta) + if res == "a": + scores[0] += 1 + elif res == "b": + scores[1] += 1 + elif res == "c": + scores[2] += 1 + else: + scores[3] += 1 + +print("Te toca en: ", houses[scores.index(max(scores))]) diff --git a/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/rafaelramirez150.py b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/rafaelramirez150.py new file mode 100644 index 0000000000..85a3981b54 --- /dev/null +++ b/Retos/Reto #7 - EL SOMBRERO SELECCIONADOR [Media]/python/rafaelramirez150.py @@ -0,0 +1,58 @@ +''' +/* + * Crea un programa que simule el comportamiento del sombrero selccionador del + * universo mágico de Harry Potter. + * - De ser posible realizará 5 preguntas (como mínimo) a través de la terminal. + * - Cada pregunta tendrá 4 respuestas posibles (también a selecciona una a través de terminal). + * - En función de las respuestas a las 5 preguntas deberás diseñar un algoritmo que + * coloque al alumno en una de las 4 casas de Hogwarts (Gryffindor, Slytherin , Hufflepuff y Ravenclaw) + * - Ten en cuenta los rasgos de cada casa para hacer las preguntas y crear el algoritmo seleccionador. + * Por ejemplo, en Slytherin se premia la ambición y la astucia. + */ + ''' + +def realizar_pregunta(pregunta, respuestas): + print(pregunta) + for i, respuesta in enumerate(respuestas): + print(f"{i + 1}. {respuesta}") + seleccion = int(input("Selecciona tu respuesta (1-4): ")) + return seleccion + +def seleccionar_casa(respuestas): + puntajes = {"Gryffindor": 0, "Slytherin": 0, "Hufflepuff": 0, "Ravenclaw": 0} + + # Realizar preguntas y sumar puntajes + preguntas = [ + "¿Qué cualidad valoras más en ti mismo?", + "¿Cuál es tu materia favorita en la escuela?", + "¿Qué tipo de animal te gusta más?", + "¿En qué tipo de ambiente te sientes más cómodo?", + "¿Qué te gustaría hacer en tu tiempo libre?" + ] + opciones = [ + ["Valentía", "Astucia", "Lealtad", "Inteligencia"], + ["Defensa Contra las Artes Oscuras", "Pociones", "Cuidado de Criaturas Mágicas", "Adivinación"], + ["León", "Serpiente", "Tejón", "Águila"], + ["Lugares con acción y aventura", "Lugares oscuros y misteriosos", "Lugares acogedores y tranquilos", "Lugares intelectuales y creativos"], + ["Practicar deportes mágicos", "Investigar secretos oscuros", "Ayudar a otros", "Leer y estudiar"] + ] + + for i in range(5): + respuesta = realizar_pregunta(preguntas[i], opciones[i]) + puntajes["Gryffindor"] += respuesta == 1 + puntajes["Slytherin"] += respuesta == 2 + puntajes["Hufflepuff"] += respuesta == 3 + puntajes["Ravenclaw"] += respuesta == 4 + + # Determinar la casa ganadora + casa_ganadora = max(puntajes, key=puntajes.get) + return casa_ganadora + +# Ejecutar el programa +print("¡Bienvenido al Sombrero Seleccionador de Hogwarts!") +print("Responde las siguientes preguntas para determinar tu casa en Hogwarts.") + +casa_seleccionada = seleccionar_casa(["Gryffindor", "Slytherin", "Hufflepuff", "Ravenclaw"]) + +print("¡El Sombrero ha decidido!") +print("Tu casa en Hogwarts es:", casa_seleccionada) \ No newline at end of file diff --git a/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/java/asjordi.java b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/java/asjordi.java new file mode 100644 index 0000000000..275db69fd8 --- /dev/null +++ b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/java/asjordi.java @@ -0,0 +1,22 @@ +import java.time.LocalTime; + +public class PseudoRandomGenerator { + + private final LocalTime lt = LocalTime.now(); + private int seed = (int) System.currentTimeMillis(); + + private int generateRandomNumber() { + + seed = (seed * 1103515245 + 12345) & Integer.MAX_VALUE; + + return seed % 101; + + } + + public int generateWithNano() { + + return (lt.getNano() + 1) / 10000000; + + } + +} diff --git a/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/javascript/dieramirezma.js b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/javascript/dieramirezma.js new file mode 100644 index 0000000000..40740d962f --- /dev/null +++ b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/javascript/dieramirezma.js @@ -0,0 +1,84 @@ +/* + Generador pseudoaleatorio: + Mi solución se basa en realizar operaciones usando las unidades de tiempo + para generar números pseudoaleatorios. + + El generador tomará los valores de minuto, segundo y milisegundo actuales. + Teniendo estos datos, el número a generar (X) sigue la siguiente fórmula: + + X = m * s * ms * sqrt(ms) + donde: + m: minuto + ms: milisegundos + s: segundo + + Esta operación nos retornará un número positivo real. + + Ej: 77.04889751979387 + + Dado que nos interesa un valor entre 0-100, vamos a considerar únicamente + los valores decimales, para ello, restaremos el valor entero quedándonos únicamente + la parte decimal. + + 77.04889751979387 - 77 = 0.04889751979387 + + Ahora, de este resultado nos interesará únicamente sus dos primeros dígitos por lo cual + multiplicaremos por 100 y truncamos el número a su parte entera. Hecho esto garantizamos + que el número obtenido siempre estará entre el rango establecido (0-100) + + 0.04889751979387 * 100 = 4.889751979387 + 4 + + +*/ + +function getValues() { + const currentDate = new Date() + const milliseconds = currentDate.getMilliseconds() + const seconds = currentDate.getSeconds() + const minutes = currentDate.getMinutes() + + return {ms:milliseconds, s:seconds, m:minutes} +} + +function numberGenerator() { + const values = getValues() + + X = Math.abs( + ((values.m * values.s * values.ms) / Math.sqrt(values.ms)) + ) + + const generatedNumber = Math.trunc((X - Math.trunc(X)) * 100) + + return generatedNumber +} + +// Puesto que la implementación usa unidades de tiempo, es necesario +// realizar esperas entre generación, para garantizar que los números +// sean diferentes. El valor de delay se puede modificar a conveniencia del usuario + + + +const delay = -1 +const numOfRandomNumbers = 10 +let randomNumbers = [] + +async function delayedPrint() { + console.log(`Generando ${numOfRandomNumbers} números pseudoaleatorios ...`) + for (let i = 0; i < numOfRandomNumbers; i++) { + const number = numberGenerator() + randomNumbers.push(number) + await new Promise(resolve => setTimeout(resolve, delay)) + } + console.log(`Números pseudoaleatorios generados: ${randomNumbers}`) +} + +delayedPrint(); + + + + + + + + diff --git a/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/DCRael.py b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/DCRael.py new file mode 100644 index 0000000000..2941246cd5 --- /dev/null +++ b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/DCRael.py @@ -0,0 +1,16 @@ +def pseudo_random(seed, a, c, m): + x = seed + while True: + x = (a * x + c) % m + yield x + +a = 1664525 +c = 1013904223 +m = 2**32 +seed = 1234 + +generator = pseudo_random(seed, a, c, m) +for i in range(10): + num = (next(generator) % 100) + 1 + print(num) + \ No newline at end of file diff --git a/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/alberba.py b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/alberba.py new file mode 100644 index 0000000000..929c9d6b81 --- /dev/null +++ b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/alberba.py @@ -0,0 +1,10 @@ +from datetime import datetime + +def random() -> int: + time_st = str(int(datetime.timestamp(datetime.now()) * 1000000)) + + time_1 = int(time_st[: int(len(time_st) / 2)]) + time_2 = int(time_st[int(len(time_st) / 2) :]) + return int((time_1 * time_2) % 101) + +print(random()) \ No newline at end of file diff --git a/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/fedecoronado.py b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/fedecoronado.py new file mode 100644 index 0000000000..ec87386541 --- /dev/null +++ b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/fedecoronado.py @@ -0,0 +1,18 @@ +import time + +def prandom(min:int, max:int): + a = time.time()*10000 #multiplico *10000 para tomar los utlimos decimales de contador de tiempo y variar más el resultado + rnd = a - int(a) + '''si se llama 2 veces seguidas a la funcion da el mismo resultado, + si se agrega esta linea es muy lenta para se soluciona el problema''' + time.sleep(0.51) + return int(rnd * (max - min + 1))+ min + + +min =0 +max = 100 + + +for i in range(0,1000): + a = prandom(min,max) + print(i,a) diff --git a/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/jaliagag.py b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/jaliagag.py new file mode 100644 index 0000000000..37610e1d8d --- /dev/null +++ b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/jaliagag.py @@ -0,0 +1,26 @@ +# +#Crea un generador de números pseudoaleatorios entre 0 y 100. +#No puedes usar ninguna función "random" (o semejante) del lenguaje de programación seleccionado. +# +# + +import datetime +import time + +a = int(input('Cuántos números: ')) +def my_random(q: int) -> int: + final = 0 + i = 0 + while i < q: + now = str(datetime.datetime.now()) + uno = [*now.split(' ')[1].split('.')[1][-1]] + time.sleep(0.0003) + dos = [*now.split(' ')[1].split('.')[1][-2]] + final = int(uno[0]+dos[0]) + print(final) + i += 1 + return final + + +if __name__ == '__main__': + my_random(a) \ No newline at end of file diff --git a/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/josevegas27.py b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/josevegas27.py new file mode 100644 index 0000000000..968c7f7865 --- /dev/null +++ b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/josevegas27.py @@ -0,0 +1,23 @@ +''' + Reto #8: El generador pseudoaleatorio +/* + * Crea un generador de números pseudoaleatorios entre 0 y 100. + * - No puedes usar ninguna función "random" (o semejante) del lenguaje de programación seleccionado. + * + * Es más complicado de lo que parece... +*/ +''' + +from datetime import datetime + +lista = [] +def pseudo_random(start=0,finish=100, size=1): + for i in range(0,size): + a = datetime.now() + lista.append(int(str(a)[-5:-3])) + a = 2**(1000000 + i) # Para ralentizar calculos y hacer que avance el tiempo + + print(lista) + +randoms = int(input('Introduzca cuantos numeros aleatorios quiere. \n--> ')) +pseudo_random(size=randoms) \ No newline at end of file diff --git a/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/klimyflorez.py b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/klimyflorez.py new file mode 100644 index 0000000000..6862670a22 --- /dev/null +++ b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/klimyflorez.py @@ -0,0 +1,10 @@ +""" +Crea un generador de números pseudoaleatorios entre 0 y 100. +- No puedes usar ninguna función "random" (o semejante) del lenguaje de programación seleccionado. + +Es más complicado de lo que parece... +""" +from datetime import datetime + +if __name__ == '__main__': + print(datetime.now().microsecond % 101) \ No newline at end of file diff --git a/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/marcoatrs.py b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/marcoatrs.py new file mode 100644 index 0000000000..72531278e0 --- /dev/null +++ b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/marcoatrs.py @@ -0,0 +1,8 @@ +import time + + +def random() -> int: + return (time.time_ns()) % 101 + + +print(random()) diff --git a/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/rafaelramirez150.py b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/rafaelramirez150.py new file mode 100644 index 0000000000..73090791db --- /dev/null +++ b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/python/rafaelramirez150.py @@ -0,0 +1,24 @@ +''' + /* + * Crea un generador de números pseudoaleatorios entre 0 y 100. + * - No puedes usar ninguna función "random" (o semejante) del lenguaje de programación seleccionado. + * + * Es más complicado de lo que parece... + */ + ''' + +class PseudoRandomGenerator: + def __init__(self, seed): + self.seed = seed + + def generate(self): + self.seed = (self.seed * 32719 + 3) % 32749 + return self.seed % 101 # Genera números entre 0 y 100 + +# Ejemplo de uso +generator = PseudoRandomGenerator(5) # Selecciona una semilla inicial + +for _ in range(10): + random_number = generator.generate() + print(random_number) + diff --git a/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/typescript/Qv1ko.ts b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/typescript/Qv1ko.ts new file mode 100644 index 0000000000..096e516d4c --- /dev/null +++ b/Retos/Reto #8 - EL GENERADOR PSEUDOALEATORIO [Media]/typescript/Qv1ko.ts @@ -0,0 +1,3 @@ +const now = new Date(); + +console.log(now.getMilliseconds() % 101) diff --git "a/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/java/asjordi.java" "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/java/asjordi.java" new file mode 100644 index 0000000000..a16787845b --- /dev/null +++ "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/java/asjordi.java" @@ -0,0 +1,78 @@ +import java.util.*; + +public class Words { + + public boolean isHeterogram(String str) { + + str = sanitizeString(str); + HashSet letters = new HashSet<>(); + + for (int i = 0; i < str.length(); i++) { + if (letters.contains(str.charAt(i))) return false; + letters.add(str.charAt(i)); + } + + return true; + + } + + public boolean isIsogram(String str) { + + str = sanitizeString(str); + + int ref = 0; + boolean areEquals = true; + HashMap words = new HashMap<>(); + + for (int i = 0; i < str.length(); i++) { + + if (words.containsKey(str.charAt(i))) { + int value = words.get(str.charAt(i)); + words.replace(str.charAt(i), value + 1); + continue; + } + + words.put(str.charAt(i), 1); + } + + for (int value : words.values()) { + if (ref == 0) { + ref = value; + } else if (ref != value) { + areEquals = false; + } + } + + return areEquals; + + } + + public boolean isPangram(String str) { + + str = sanitizeString(str); + + HashSet letters = new HashSet(); + + for(int i = 0; i< str.length(); i++) { + char l = str.charAt(i); + if (Character.toString(l).matches("[a-z]")) + letters.add(String.valueOf(l)); + } + + return letters.size() == 26; + + } + + public String sanitizeString(String str) { + + str = str.replace(" ", "") + .replace("//d", "") + .replace(".", "") + .replace(",", "") + .toLowerCase(); + + return str; + + } + +} diff --git "a/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/javascript/Qv1ko.js" "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/javascript/Qv1ko.js" new file mode 100644 index 0000000000..d03a8bd682 --- /dev/null +++ "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/javascript/Qv1ko.js" @@ -0,0 +1,51 @@ +heterogram("the big dwarf only jumps") +isogram("copycopycopy") +pangram("Waxy and quivering, jocks fumble the pizza") + +function heterogram(str) { + let isHeterogram = true; + Array.from(lettersCounter(str).values()).forEach(letterNumber => { + if (letterNumber !== 1) { + isHeterogram = false; + return; + } + }); + console.log((isHeterogram) ? "The string \"" + str + "\" is a heterogram" : "The string \"" + str + "\" is not a heterogram"); +} + +function isogram(str) { + let isIsogram = true; + let lettersValue = 0; + Array.from(lettersCounter(str).values()).forEach(letterNumber => { + lettersValue = (lettersValue === 0) ? letterNumber : lettersValue; + if (letterNumber !== lettersValue) { + isIsogram = false; + return; + } + }); + console.log((isIsogram) ? "The string \"" + str + "\" is an isogram" : "The string \"" + str + "\" is not an isogram"); +} + +function pangram(str) { + let isPangram = (lettersCounter(str).size !== 26) ? false : true; + console.log((isPangram) ? "The string \"" + str + "\" is a pangram" : "The string \"" + str + "\" is not a pangram"); +} + +function lettersCounter(str) { + str = str.toLowerCase(); + let letters = new Map(); + for (let i = 0; i < str.length; i++) { + if (isLetter(str.charAt(i))) { + if (letters.has(str.charAt(i))) { + letters.set(str.charAt(i), letters.get(str.charAt(i)) + 1); + } else { + letters.set(str.charAt(i), 1); + } + } + } + return letters; +} + +function isLetter(char) { + return char.match(/[a-z]/i); +} diff --git "a/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/alberba.py" "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/alberba.py" new file mode 100644 index 0000000000..171596cd47 --- /dev/null +++ "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/alberba.py" @@ -0,0 +1,37 @@ +import string + +def is_heterograma(text: str) -> bool: + uses = dict() + text = text.strip().lower() + for letra in text: + if uses.get(letra, 0) == 0: + uses[letra] = 1 + else: + return False + return True + +def is_isograma(text: str) -> bool: + uses = dict() + text = text.strip().lower() + for letra in text: + uses_ultima_letra = uses.get(letra, 0) + 1 + uses[letra] = uses_ultima_letra + + for letra in uses.items(): + if letra[1] != uses_ultima_letra: + return False + + return True + +def is_pangrama(text:str) -> bool: + alphabet = list(string.ascii_lowercase) + text = text.strip().lower() + for letra in text: + if letra in alphabet: + alphabet.remove(letra) + return len(alphabet) == 0 + +print(is_heterograma("hiperblanduzcos")) +print(is_heterograma("hiperblanduzcós !!w")) +print(is_isograma("anna")) +print(is_pangrama("Benjamín pidió una bebida de kiwi y fresa. Noé, sin vergüenza, la más exquisita champaña del menú")) \ No newline at end of file diff --git "a/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/klimyflorez.py" "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/klimyflorez.py" new file mode 100644 index 0000000000..4c6a9cd003 --- /dev/null +++ "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/klimyflorez.py" @@ -0,0 +1,96 @@ +""" + * Crea 3 funciones, cada una encargada de detectar si una cadena de + * texto es un heterograma, un isograma o un pangrama. + * - Debes buscar la definición de cada uno de estos términos. +""" +def reemplazar_tildes(word: str): + to_replace = { + 'á': 'a', + 'é': 'e', + 'í': 'i', + 'ó': 'o', + 'ú': 'u', + } + for words in to_replace: + word = word.replace(words, to_replace[words]) + return word + +def heterograma(words: str): + ''' + Un heterograma es una palabra o frase que no contiene ninguna letra repetida. + ''' + diccionary_of_words = {} + response = '' + new_word = reemplazar_tildes(words).lower() + for i in range(len(new_word)): + if new_word[i] in diccionary_of_words: + response += 'No es un heterograma' + return response + else: + diccionary_of_words[new_word[i]] = 1 + response += 'Es un heterograma' + return response + + +def isograma(words: str): + ''' + Un isograma es una palabra o frase en la que cada letra aparece el mismo número de veces. + ''' + dictionary_of_words = {} + response = '' + new_word = reemplazar_tildes(words).lower() + for i in range(len(new_word)): + if new_word[i] in dictionary_of_words: + dictionary_of_words[new_word[i]] += 1 + else: + dictionary_of_words[new_word[i]] = 1 + + for value in dictionary_of_words.values(): + if value > 1: + response += 'No es un isograma' + return response + response += 'Es un isograma' + return response + + +def pangrama(words: str): + ''' + Un pangrama es una frase en la que aparecen todas las letras del abecedario + ''' + new_word = reemplazar_tildes(words).lower() + alphabet = { + 'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0, + 'g': 0, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 'l': 0, + 'm': 0, 'n': 0, 'ñ': 0, 'o': 0, 'p': 0, 'q': 0, + 'r': 0, 's': 0, 't': 0, 'u': 0, 'v': 0, 'w': 0, + 'x': 0, 'y': 0, 'z': 0 + } + response = '' + for word in range(len(new_word)): + if new_word[word] in alphabet: + alphabet[new_word[word]] += 1 + for value in alphabet.values(): + if value == 0: + response += 'No es un pangrama' + return response + response += 'Es un pangrama' + return response + +print(pangrama("El veloz murciélago hindú comía feliz cardillo y kiwi. La cigüeña tocaba el saxofón detrás del palenque de paja")) +print(pangrama("Jovencillo emponzoñado de whisky, qué figurota exhibe. Cadáveres de ñus, paz y asombro, ¿qué más añadir?")) +print(pangrama("El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y frío, añoraba a su querido cachorro.")) +print(pangrama("Victimá")) + + +print(isograma("Víctima")) +print(isograma("Políglota")) +print(isograma("Abstemio")) +print(isograma("Desoxirribonucleico")) +print(isograma("Hipopótamo")) +print(isograma("Benzodiacepina")) + +print(heterograma("Víctima")) +print(heterograma("Wágner")) +print(heterograma("Queso")) +print(heterograma("Néctar")) +print(heterograma("Lánguido")) diff --git "a/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/marcoatrs.py" "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/marcoatrs.py" new file mode 100644 index 0000000000..4e48933d2e --- /dev/null +++ "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/marcoatrs.py" @@ -0,0 +1,42 @@ +from string import ascii_lowercase + + +def is_heterograma(text: str) -> bool: + "Ninguna letra repetida" + text = text.replace(" ", "").lower() + chars = {} + for t in text: + if t in chars: + return False + chars[t] = 0 + return True + + +def is_isograma(text: str) -> bool: + "Las letras aparecen el mismo numero de veces" + text = text.replace(" ", "").lower() + chars = {} + for t in text: + if not t in chars: + chars[t] = 0 + chars[t] += 1 + value = list(chars.values())[0] + for v in chars.values(): + if value != v: + return False + return True + + +def is_pangrama(text: str) -> bool: + "Aparecen todas las letras del abecedario" + text = text.replace(" ", "").lower() + for letter in ascii_lowercase: + if not letter in text: + return False + return True + + +text = "nononono" +print(is_heterograma(text)) +print(is_isograma(text)) +print(is_pangrama(text)) diff --git "a/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/rafaelramirez150.py" "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/rafaelramirez150.py" new file mode 100644 index 0000000000..e7bef95f7f --- /dev/null +++ "b/Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [F\303\241cil]/python/rafaelramirez150.py" @@ -0,0 +1,55 @@ +''' + * Crea 3 funciones, cada una encargada de detectar si una cadena de + * texto es un heterograma, un isograma o un pangrama. + * - Debes buscar la definición de cada uno de estos términos. +''' + +import string + +def heterograma(texto): + texto = texto.lower() + letras = set() + + for caracter in texto: + if caracter.isalpha(): + if caracter in letras: + return False + letras.add(caracter) + + return True + +def isograma(texto): + texto = texto.lower() + letras = set() + + for caracter in texto: + if caracter.isalpha(): + if caracter in letras: + return False + letras.add(caracter) + + return True + +def pangrama(texto): + texto = texto.lower() + letras = set(texto) + + for letra in string.ascii_lowercase: + if letra not in letras: + return False + + return True + +def verificaTexto(texto): + if heterograma(texto): + print("El texto ingresado es un heterograma.") + elif isograma(texto): + print("El texto ingresado es un isograma.") + elif pangrama(texto): + print("El texto ingresado es un pangrama.") + else: + print("El texto ingresado no es un heterograma, isograma ni pangrama.") + +# Programa principal +textoIngresado = input("Ingresa un texto: ") +verificaTexto(textoIngresado) \ No newline at end of file