none
Disporre casualmente i dati [VB.Net] RRS feed

  • Domanda

  • Framework di destinazione .Net 2.0. (non posso usare LINQ)
    Ho una LISTA di LISTE strutturata in questo modo:

    elemento 0 della 1^ lista -> contiene 7 elementi della 2^ lista -> a b c d e f g
    elemento 1 della 1^ lista -> contiene 7 elementi della 2^ lista -> a b c d e f g
    elemento 2 della 1^ lista -> contiene 7 elementi della 2^ lista -> a c d e f g h
    elemento 3 della 1^ lista -> contiene 7 elementi della 2^ lista -> h i l m n o p
    elemento 4 della 1^ lista -> contiene 6 elementi della 2^ lista -> h n o p q r
    ...

    Come potete notare alcuni elementi della 2^ lista sono ripetuti (a, b,c,d...) e alcuni di essi si trovano sempre nella stessa posizione:
    "a" è sempre in prima posizione;
    "b" è sempre in seconda posizione;
    ...
    "h" si trova due volte in prima posizione e una volta in settima...

    Ho bisogno di sparpagliare TUTTI gli elementi in modo tale che nessuno di essi venga mai a trovarsi per più di una volta in una stessa posizione mantenendo intatta la composizione degli elementi della lista 1. Nell'esempio precedente devo spostare gli elementi [a b c d e f g h]


    Una soluzione potrebbe essere questa:
    elemento 0 della 1^ lista -> contiene 7 elementi della 2^ lista -> a b c d e f g
    elemento 1 della 1^ lista -> contiene 7 elementi della 2^ lista -> g a b c d e f
    elemento 2 della 1^ lista -> contiene 7 elementi della 2^ lista -> f g d a c h e
    elemento 3 della 1^ lista -> contiene 7 elementi della 2^ lista -> p h i l m n o
    elemento 4 della 1^ lista -> contiene 6 elementi della 2^ lista -> h n o p q r

    Avete qualche suggerimento?
    sabato 26 marzo 2011 15:16

Tutte le risposte

  • ciao

    la matematica non è il mio pane.... quindi se vuoi un algoritmo per avere la condizione di "mai a atrovarsi nella stessa posizione" ci dovrei pensare davvero troppo :)

    invece, perchè non ti basi sul random?

    fai un array in cui metti gli elementi base, poi ciclando copi i valori dove vuoi prendendone l'indice da un random:

    new Random().Next(indice minimo es 0, indice massimo es 6)

    così facendo avrai valori mischiati

    facci sapere


    Antonio Esposito Microsoft Certified Trainer Microsoft MCPD .NET 3.5 Enterprise Application Developer Microsoft MCTS BizTalk Server 2006R2 Custom Application Development Microsoft MCTS .NET 3.5 WCF Application Development Microsoft MCTS .NET 3.5 ASP.NET Application Development Microsoft MCTS .NET 3.5 ADO.NET Application Development Microsoft MCTS .NET 3.5 Windows Application Development Microsoft MCTS .NET 2.0 Distributed Application Development Microsoft Professional .NET VisualBasic & C# Application Development HTML.it s.r.l. WCAG XHTML Certified Expert Web Developer
    giovedì 14 aprile 2011 19:51
  • ciao

    la matematica non è il mio pane.... quindi se vuoi un algoritmo per avere la condizione di "mai a atrovarsi nella stessa posizione" ci dovrei pensare davvero troppo :)

    invece, perchè non ti basi sul random?

    fai un array in cui metti gli elementi base, poi ciclando copi i valori dove vuoi prendendone l'indice da un random:

    new Random().Next(indice minimo es 0, indice massimo es 6)

    così facendo avrai valori mischiati

    facci sapere


    Antonio Esposito Microsoft Certified Trainer Microsoft MCPD .NET 3.5 Enterprise Application Developer Microsoft MCTS BizTalk Server 2006R2 Custom Application Development Microsoft MCTS .NET 3.5 WCF Application Development Microsoft MCTS .NET 3.5 ASP.NET Application Development Microsoft MCTS .NET 3.5 ADO.NET Application Development Microsoft MCTS .NET 3.5 Windows Application Development Microsoft MCTS .NET 2.0 Distributed Application Development Microsoft Professional .NET VisualBasic & C# Application Development HTML.it s.r.l. WCAG XHTML Certified Expert Web Developer


    Non posso fare come suggerisci, poiché HO BISOGNO che sia rispettata la regola indicata.

    Grazie comunque.

    venerdì 15 aprile 2011 03:39
  • bè, sempre matematica a parte

    basta che nel loop quando fai il .Next del random controlli che sullo stesso indice degl altri array non hai il valore, altrimenti fai ancora .Next finchè non esce un valore che non hai


    Antonio Esposito Microsoft Certified Trainer Microsoft MCPD .NET 3.5 Enterprise Application Developer Microsoft MCTS BizTalk Server 2006R2 Custom Application Development Microsoft MCTS .NET 3.5 WCF Application Development Microsoft MCTS .NET 3.5 ASP.NET Application Development Microsoft MCTS .NET 3.5 ADO.NET Application Development Microsoft MCTS .NET 3.5 Windows Application Development Microsoft MCTS .NET 2.0 Distributed Application Development Microsoft Professional .NET VisualBasic & C# Application Development HTML.it s.r.l. WCAG XHTML Certified Expert Web Developer
    venerdì 15 aprile 2011 10:17
  • La tua proposta è una possibile soluzione, ma non è esattamente  molto efficiente...

    La generazione di numeri casuali non conduce propriamanete alla soluzione in tempi brevi: può capitare che inserisci 6 elementii su 7 e poi scoprire che l'ultimo non può stare in quella posizione perché vi è un elemento nella stessa colonna  in una riga precedente, quindi devi tornare indietro e rivalutare tutto dall'inizio.

    Ovviamente trattandosi di un computer i tempi sono brevi ma non è detto che lo siano sempre.

    Grazie.

    venerdì 15 aprile 2011 14:02
  • prova così:

     

    Module Module1
        Sub Main()

            Dim tutti = "abcdefghilmnopqrstuvz".ToCharArray()

            Dim liste = New List(Of Char())

            'prima lista
            For i As Integer = 0 To 20 '21 ripetizioni è il massimo
                liste.Add(Take(tutti, 7, i))
            Next

            For Each s In liste
                Console.WriteLine(New String(s))
            Next
            Console.ReadLine()
        End Sub

        Private Function Take(items As Char(), length As Integer, Optional position As Integer = 0) As Char()
            Dim risp(length - 1) As Char
            For i As Integer = 0 To length - 1
                If Not items.Length > position Then position = 0
                risp(i) = items(position)
                position += 1
            Next
            Return risp
        End Function
    End Module


    Antonio Esposito Microsoft Certified Trainer Microsoft MCPD .NET 3.5 Enterprise Application Developer Microsoft MCTS BizTalk Server 2006R2 Custom Application Development Microsoft MCTS .NET 3.5 WCF Application Development Microsoft MCTS .NET 3.5 ASP.NET Application Development Microsoft MCTS .NET 3.5 ADO.NET Application Development Microsoft MCTS .NET 3.5 Windows Application Development Microsoft MCTS .NET 2.0 Distributed Application Development Microsoft Professional .NET VisualBasic & C# Application Development HTML.it s.r.l. WCAG XHTML Certified Expert Web Developer
    venerdì 15 aprile 2011 14:33
  • Grazie ma non importa.

    Ho già risolto usando un algoritmo simile al tuo, ma più elaborato.

    Il tuo, funziona perfettamente, ma inserisce nella lista 7 volte ciascuna lettera, e come puoi facilmente verificare, non ho scritto che gli elementi debbono essere ripetuti tutti lo stesso numero di volte: ve ne sono alcuni che sono presenti nella lista un numero variabile e altri solo una soltanto.

     

    Io ho fatto in questo modo:

    • ho riunito tutti gli elementi conteggiando quante volte ognuno di essi appare nella griglia
    • ho riordinato tale lista in modo da avere prima quelli con una maggiore presenza
    • ho disposto tali elementi in posizioni diagonali gli uni rispetto agli altri: (1,1); (2,2); (3,3); (4,4) oppure (1,3); (2,4); (3,5)...( similmente a come hai fatto tu!)
    • quando ho finito di inserirli tutti controllo se nella griglia vi sono degli SPAZI VUOTI. In caso affermativo, prendo un elemento dell'ultima riga e verifico se posso spostarlo nella cella vuota, se è possibile effettuo lo spostamento altrimenti procedo con un altro elemento...
    • interrompo i controlli quando ho riempito tutti gli spazi vuoti o non vi sono altri possibili spostamenti.

    Grazie comunque.

    venerdì 15 aprile 2011 16:25