Jump to content
UnitySpain
Sign in to follow this  
unit3ro

Generar todas las combinaciones posibles

Recommended Posts

Hola comunidad

Me he visto en la necesidad de solicitar la ayuda de ustedes, pues me encuentro atascado en un script que necesito.

Adjunto dejo el codigo, no esta probado y seguro tiene algunas palabras mal escritas, pero es la idea que tengo. en los comentarios describo el problema plateado esta en la funcion "generarLibros", no doy con los bucles esos para repetir cada revision de datos. No se si trabajar con string es la mejor manera, cualquier consejo me vendria muy bien.

Una ayudita por favor.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
	
public class generadordelibros : MonoBehaviour {
	/*las letras seria lo encerrado en comas (cada letra seguida de numero)y las hojas serian cada
    parte del string separado por slash (/), mas adelante se crearan arrays de strings a parir
    de este usando string.split 
    */
	private string strData = "a1,a2,c1,z2/d6,f6,s4/s5,r2,k6" 
	
	public struct libro {		
		public hoja[] hojas;
		public libro(hoja[] hojas) {  
			this.hojas = hojas; 
		}
	}
	public class hoja {		
		public string[] letras;
	}
	
	void Start () {
		
		hojas = procesarHojas(strData);
		libros = generarLibros(hojas); 
	}
	private hoja[] procesarHojas(string strData)  {

		hoja[] hojasTemp = new hoja[strData.Length];
        //separar cada hoja por (/)
		strData = strData[s].Split(new char[] {'/'});
		
		for(int s=0; s<strData.Length; s++) {
			
			hoja nuevaHoja = new hoja();
            //separar cada letra por (,)
			nuevaHoja.letras = strData.Split(new char[] {','});
			hojasTemp[s] = nuevaHoja;
		}
		return hojasTemp;
	}
	public libro[] generarLibros(string[] hojas) {
		
		List<libro> libros = new List<libro>();
			
		for (int k; k<hojas.Length; k++){
			/*por cada hoja comparar las letras dentro de ella con 
			las de dentro de cada hoja en cada libro, si existe almenos
			una crear otro libro y añadirle las hojas, si no existen en el 
			actual libro (ni siguiera una) añadirlas al libro. la idea es queue
			se generen todas las combinaciones posibles de libros para que cada 
			grupo de hojas esten en libros diferentes sin repetirse en el mismo
			libro.
			*/			
		}
		return libros.ToArray();
	}
}

 

Share this post


Link to post
Share on other sites

no se entiende bien lo que quieres hacer, parece que estas haciendo un parser, que tienes los grupos de páginas en una cadena y cada grupo forma un libro. es eso?

Share this post


Link to post
Share on other sites

He hecho el script nuevamente y lo probe, este lee a partir de un archivo y crea las hojas/items, pero no puede crear los libros y almacenarles las hojas.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

//=================================//
public class BooksGenerator3: MonoBehaviour {
	
	public TextAsset TextData = null;
	private string[] strData; // = "book1+102+M7,M8,M9,I15,I16,I17,I18,J8,J9,J10/book2+103+I14,I15,I16,I17,V14,V15,V16,V17,V18/";
	
	[System.Serializable]
	public class ITEM {		
		public string[] itemData = new string[2];
		public string[] words;
	}
	[System.Serializable]
	public class BOOK {		
		public ITEM[] items;
	}	
	public BOOK[] inventory;
	public ITEM[] items;
	
	//=================================//
	void Start () { 
		
		strData = TextData.text.Split(new char[] {'/'});
		items = processItems(strData);
		inventory = generateBooks(items);
		
		for(int x=0; x<inventory.Length; x++) {
			
			print("curBook: " + inventory[x].ITEM.itemData);
		}		
	}
	//=================================//
	public ITEM[] processItems(string[] strData)  {
		
		ITEM[] tempItems = new ITEM[strData.Length];		
		
		for(int s=0; s<strData.Length; s++) {
			string[] curData = strData[s].Split(new char[] {'+'});
		
			ITEM newItem = new ITEM();
			newItem.itemData[0] = curData[0];
			newItem.itemData[1] = curData[1];
			newItem.words = curData[2].Split(new char[] {','});
			tempItems[s] = newItem;
			
		}
		return tempItems;
	}
	//=================================//
	public BOOK[] generateBooks(ITEM[] Items) {

		ArrayList firstBooks = new ArrayList();

		for(int i=0; i<Items.Length; i++) {			
			BOOK tempBook = new BOOK();
			tempBook.items[i] = Items[i];
			firstBooks.Add(tempBook);
		}
		return firstBooks.ToArray(typeof(BOOK)) as BOOK[];	
	}
}
Edited by unit3ro

Share this post


Link to post
Share on other sites

Lo se pero tengo tres dias en eso, y no logro dar con la solucion.

El problema esta aqui cuando quiero almacenar el item a un librolibro temporal creado para despues guardarlo en el arraylist de libros 

BOOK tempBook = new BOOK();
tempBook.items[i] = Items[i];

Share this post


Link to post
Share on other sites

El Problema es que nunca le dijiste al arreglo ÍTEMS que tamaño tenia, no lo inicializamos...

Posible Solución...  

public BOOK[] generateBooks(ITEM[] Items) 
{
	ArrayList firstBooks = new ArrayList();
    int ItemsLength = Items.Length;
   
	for(int i=0; i<Items.Length; i++) 
	{	
	    BOOK tempBook = new BOOK();
	    if(i == 0)
	    {
	        //Inicializamos ítems.
	        tempBook.items = new ITEM[ItemsLength];
	    }
		tempBook.items[i] = Items[i];
		firstBooks.Add(tempBook);
	}
	
	return firstBooks.ToArray(typeof(BOOK)) as BOOK[];	
}

Saludos..

Share this post


Link to post
Share on other sites

Aqui esta un codigo que esta en C++ pero espero que guiandote por ahi te valla bien pues es para generar convinaciones desde un string leido:

#include <cstdio>
#include <string>

#define RANG 30
#define p (1 << lW)
using namespace std;

int lWz;
string S;
char W[RANG];

main() {
    freopen ("AC.in", "r", stdin);
    freopen ("AC.ou", "w", stdout);

    scanf ("%s\n", W);

    lW = strlen (W);
    printf ("%d\n", p - 1);
    for (int i = 1; i < p; i++) {
        S = "";
        for (int j = 0; j < lW; j++)
            if (i & 1 << j)
                S += W[j];
        printf ("%s\n", S.c_str());
    }
}

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...