es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C# Buscar todas las opciones posibles

Hay la siguiente opción para escribir una línea:

"1X2;12;X;2;X;X;1;X;1;1;X;X;1;2;1"

a partir de ella necesitas obtener todas las variaciones:

"1;1;X;2;X;X;1;X;1;1;X;X;1;2;1"
"1;2;X;2;X;X;1;X;1;1;X;X;1;2;1"
"X;1;X;2;X;X;1;X;1;1;X;X;1;2;1"
"X;2;X;2;X;X;1;X;1;1;X;X;1;2;1"
"2;1;X;2;X;X;1;X;1;1;X;X;1;2;1"
"2;2;X;2;X;X;1;X;1;1;X;X;1;2;1"

Entiendo el algoritmo en sí, pero algo no funciona con la implementación. Estaría muy agradecido si alguien pudiera decirme cómo se puede hacer un método universal que produzca todas las opciones posibles.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, puedo sugerir el enfoque que implica dividir la línea dada utilizando el delimitador “;” en un arreglo de elementos. Luego, reemplazar todos los valores “X” con opciones 1, 2 y X. Finalmente, iterar sobre todas las combinaciones del arreglo actualizado y concatenar cada elemento con punto y coma en una cadena resultante. Aquí hay un ejemplo de código en C#:

    using System;
    using System.Linq;
    
    public class Program
    {
        public static void Main()
        {
            var input = "1X2;12;X;2;X;X;1;X;1;1;X;X;1;2;1";
            var elements = input.Split(';');
            var updated = elements.Select(e => e == "X" ? new[] { "1", "2", "X" } : new[] { e }).ToArray();
            var combinations = CartesianProduct(updated);
            var results = combinations.Select(c => string.Join(";", c));
            foreach (var result in results)
                Console.WriteLine(result);
        }
    
        static T[][] CartesianProduct<t>(params T[][] sequences)
        {
            // Créditos a https://stackoverflow.com/a/9809419/3927409
            var result = new T[sequences.Length][];
            for (int i = 0; i < result.Length; i++)
                result[i] = sequences[i];
            var indices = new int[result.Length];
            for (int i = 0; i < indices.Length; i++)
                indices[i] = -1;
            return CartesianProduct(result, indices);
        }
    
        static T[][] CartesianProduct<t>(T[][] sequences, int[] indices)
        {
            var index = indices.Length - 1;
            if (index < 0)
                return new[] { new T[0] };
            var head = sequences[index];
            var rest = CartesianProduct(sequences, indices.Take(index).ToArray());
            var result = new T[head.Length * rest.Length][];
            for (int i = 0; i < head.Length; i++)
                for (int j = 0; j < rest.Length; j++)
                {
                    result[i + j * head.Length] = new T[indices.Length];
                    indices.CopyTo(result[i + j * head.Length], 0);
                    result[i + j * head.Length][index] = i;
                }
            for (int i = 0; i < result.Length; i++)
                result[i] = result[i].Select((x, j) => sequences[j][x]).ToArray();
            return result;
        }
    }
    

    Al ejecutar este código, deberías obtener las mismas seis variaciones que en el ejemplo. Ten en cuenta que el método CartesianProduct es solo una implementación genérica para enumerar todas las combinaciones de todas las secuencias. Podrías utilizar una implementación más especializada o una biblioteca de combinatoria en su lugar.

Comments are closed.