From 953dc100339b320ceeccfaa5dc4018302cdc8091 Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 23 Oct 2023 00:02:48 +0200 Subject: [PATCH] Reto #38 - c# --- .../c#/IveenNet.cs | 264 ++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 Retos/Reto #38 - LAS SUMAS [Media]/c#/IveenNet.cs diff --git a/Retos/Reto #38 - LAS SUMAS [Media]/c#/IveenNet.cs b/Retos/Reto #38 - LAS SUMAS [Media]/c#/IveenNet.cs new file mode 100644 index 0000000000..8ab4b9c672 --- /dev/null +++ b/Retos/Reto #38 - LAS SUMAS [Media]/c#/IveenNet.cs @@ -0,0 +1,264 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +/* + * Crea una función que encuentre todas las combinaciones de los números + * de una lista que suman el valor objetivo. + * - La función recibirá una lista de números enteros positivos + * y un valor objetivo. + * - Para obtener las combinaciones sólo se puede usar + * una vez cada elemento de la lista (pero pueden existir + * elementos repetidos en ella). + * - Ejemplo: Lista = [1, 5, 3, 2], Objetivo = 6 + * Soluciones: [1, 5] y [1, 3, 2] (ambas combinaciones suman 6) + * (Si no existen combinaciones, retornar una lista vacía) + */ + +namespace EjercicioMoud +{ + public class Reto38 + { + + class ListComparer : IEqualityComparer> + { + public bool Equals(List x, List y) + { + return x.SequenceEqual(y); + } + + public int GetHashCode(List obj) + { + int hashcode = 0; + foreach (int item in obj) + { + hashcode ^= item.GetHashCode(); + } + return hashcode; + } + } + + + private static int preguntarLista() + { + + int numero; + + Console.WriteLine("|Que numero deseas añadir a la lista, escriba 0 para salir|"); + + + if (int.TryParse(Console.ReadLine(), out numero)) + { + + if (numero < 0) + + { + Console.WriteLine("--- Escriba un numero positivo ---"); + } + + + } + else { Console.WriteLine("--- Escriba un numero correcto ---"); numero = -1; } + + + return numero; + + } + + private static int preguntarNumero() + { + + int numero; + + Console.WriteLine("Que numero es el objetivo, debe ser mayor que 0"); + + + if (int.TryParse(Console.ReadLine(), out numero)) + { + + if (numero <= 0) + + { + Console.WriteLine("--- Escriba un numero positivo o mayor que 0 ---"); + } + + + } + else { Console.WriteLine("--- Escriba un numero correcto ---"); numero = -1; } + + + return numero; + + } + + private static string tablasBorrando(ref List cm_listEnteros, ref List cm_listAux, int cm_objetivo) + { + + List fn_listBorrar = new List(); + string devolver = ""; + + cm_listEnteros.Sort((x, y) => y.CompareTo(x)); + + while (cm_listEnteros.Sum() >= cm_objetivo) + { + + cm_listAux.Clear(); + + foreach (var item in cm_listEnteros) + { + + if (cm_listAux.Count == 0) + { + if (item > cm_objetivo) { fn_listBorrar.Add(item); } else { cm_listAux.Add(item); } + } + + else + { + + if ((cm_listAux.Sum() + item) <= cm_objetivo) + { + cm_listAux.Add(item); + } + + } + + } + + if (cm_listAux.Sum() == cm_objetivo) + { + + devolver += "[" + string.Join(",", cm_listAux) + "]\n"; + + foreach (var item in cm_listAux) cm_listEnteros.Remove(item); + + } + + foreach (var item in fn_listBorrar) + { + cm_listEnteros.Remove(item); + } + + + } + + return devolver; + + } + + private static void calcular (HashSet> cm_resultados, List cm_combinacion, List cm_lista, int cm_objetivo, int cm_item) + { + List fn_combinacion = new List(cm_combinacion); + List fn_pasar; + + for (int i = 0; i < cm_lista.Count; i++) + { + + if ((cm_combinacion.Sum() + cm_lista.ElementAt(i)) <= cm_objetivo) + { + + fn_combinacion = new List(cm_combinacion); + fn_combinacion.Add(cm_lista.ElementAt(i)); + + if (fn_combinacion.Sum() == cm_objetivo) + { + cm_resultados.Add(fn_combinacion); + + } + else + { + + fn_pasar = new List(cm_lista); + fn_pasar.RemoveRange(0,i+1); + + calcular(cm_resultados, fn_combinacion, fn_pasar, cm_objetivo, cm_lista.ElementAt(i)); + + } + } + + } + + } + + /// + /// + /// + /// + public static void Main(string[] args) + { + HashSet> resultados = new HashSet>(new ListComparer()); + List combinacion = new List(); + List listEnteros = new List { 7, 5, 4, 4, 3, 3, 3, 2, 1, 1, 1 }; + //List listEnteros = new List(); + //List listEnteros = new List { 1,5,3,2 }; + + + + List listAux = new List(); + + int numero = 0; + int objetivo = 10; + + HashSet> fn_resultados; + string mensaje = ""; + + do + { + + /*do + { + + numero = preguntarLista(); + + if (numero > 0) listEnteros.Add(numero); + + } while (numero != 0); + + do + { + + numero = preguntarNumero(); + + if (numero > 0) objetivo = numero; + + } while (objetivo <= 0);*/ + + + + + if (listEnteros.Sum() < objetivo) + { + + Console.WriteLine($"No hay numero en la lista mas grande que el objetivo, resultado es {objetivo}"); + + } + else + { + + listEnteros.Where(x => (x<=objetivo)).ToList().Sort((x, y) => y.CompareTo(x)); + + calcular(resultados, combinacion, listEnteros, objetivo, 0); + + Console.WriteLine($"Todas las combinaciones para sacar el {objetivo} son :\n "); + + foreach (var item in resultados) + { + + Console.WriteLine($"[{string.Join(",", item)}]"); + + } + + } + + + listEnteros.Clear(); + + Console.ReadKey(); + + } while (true); + + } + + } +}