+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Eliminare gli elementi più corti da una list

  1. #1
    kar64 non è in linea Scolaretto
    Post
    136

    Eliminare gli elementi più corti da una list

    Salve a tutti.
    Rieccomi qua.

    Ho una <list of string> che alimento inserendovi lo storico dei tentativi che il mio programma fa per cercare di trovare le soluzioni al mio cruciverba.

    La lista diventa, per quanto ovvio, lunghissima ....

    Avrei bisogni di capire come posso fare per cancellarne tutti gli elementi più corti.
    Esempio (la list contiene):

    BARI*
    BARI*AMO*
    BARI*TER*
    CARA*
    CARA*TER*
    CARA*AMO*
    CARA*AMO*ACIDO*ECO*
    CASA*
    CASA*TER*
    CASA*AMO*
    CASA*AMO*ACIDO*
    CASA*AMO*AMORE*
    CASA*AMO*RICCO*
    CASA*AMO*RICCO*MAI*
    CASO*AMO*RICCO*VAI*


    In questo esempio dovrei avere la lista composta da:

    CARA*AMO*ACIDO*ECO*
    CASA*AMO*RICCO*MAI*
    CASO*AMO*RICCO*VAI*

    ovvero i tentativi più profondi a cui sono giunto.

    Come si risolve ?

    Ho ordinato la list in modo da avere i più lunghi in coda, ma poi come cancello tutti i precedenti ?

    Grazie.

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,310
    Blogs
    5
    Prima parli di elementi più corti da eliminare, poi di tenere gli elementi più profondi ...

    Che intendi con "profondi"? Se intendi i più lunghi, quanti dovrebbero essere? 1 2 3 o 1000 ?

    Se non precisi dei criteri non puoi avere risposte complete.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    patel45 non è in linea Scolaretto Ultimo blog: recupero dati da pagina html
    Post
    316
    Blogs
    1
    capisco eliminare le stringhe già contenute in altre più lunghe, ma tu hai eliminato anche bari*, perché ?
    comunque non le ordinerei per lunghezza, ma in ordine alfabetico e poi controllerei se la stringa corrente è contenuta nella seguente, se sì la eliminerei

  4. #4
    L'avatar di glak
    glak non è in linea Scribacchino
    Post
    806
    Basta che utilizzi la opzione delle liste (.Distinct) e ti elimina tutti i doppioni....

  5. #5
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,310
    Blogs
    5
    Non si sta parlando di doppioni ...
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  6. #6
    kar64 non è in linea Scolaretto
    Post
    136
    Ho scritto questa soluzione:

    codice:
    Private Sub RisPulisciLista()
            Dim finoa As Integer = 0
            If flusso.Count > 0 Then
                flusso = flusso.OrderBy(Function(x) x.Length).ToList()
                Dim ultima As Integer = flusso.Last.Length
                For Each p As String In flusso
                    finoa += 1
                    If p.Length = ultima Then
                        Exit For
                    End If
                Next
                If finoa > 0 Then flusso.RemoveRange(0, finoa)
            End If
        End Sub
    non so se è migliorabile, ma funziona cancellando gli "x" elementi della lista fino al primo più lungo.

    Ora cerco di implementare il suggerimento datomi da patel45 per vedere se sia funzionale alla mia strategia di risoluzione.

    Ma già mi viene un dubbio: come rimuovo gli elementi che sono contenuti nell'elemento successivo all'interno di un ciclo ? Ho fatto altro prove, ma mi pare di capire che non si possa fare in quanto appena elimino un elemento la lista si modifica è il for each non va .....

  7. #7
    patel45 non è in linea Scolaretto Ultimo blog: recupero dati da pagina html
    Post
    316
    Blogs
    1
    però non hai risposto alle domande

  8. #8
    kar64 non è in linea Scolaretto
    Post
    136
    Alle domande di AntonioG non ho risposto, ma avevo postato un esempio che pensavo fosse esplicativo.

    Ad essere "profondi" sono i tentativi che vengono trascritti in stringhe e, nelle mie intenzioni, profondo era sinonimo si lungo. D'altro canto, una volta ordinati per lunghezza, i più lunghi diventano i più profondi, ovvero gli ultimi. Capisco, comunque di non essermi spiegato bene. Pardon.

    Questo, per esempio,

    CARA*AMO*ACIDO*ECO*

    è un "tentativo" composto da quattro parole che ha una lunghezza di 18 caratteri.

    Io non so a priori se devo estrarre 1, 2 3 o 1000 stringhe, io so che devo estrarre le più lunghe e la sub che ho approntato fa questo.


    Con riferimento al tuo suggerimento, la spiegazione è abbastanza lunga. Cerco di sintetizzarla.

    Lo sviluppo di un cruciverba va per tentativi.
    Scrivo la prima parola dello schema (che nel caso mio è la prima disponibile, ma si potrebbe pensare di iniziare dalla più lunga dello schema, per esempio).
    Verifico se quella parola, rispetto a tutte le parole che incrocia presenti nel dizionario, produce soluzioni valide e passo alla prossima.
    Se la parola scritta non da esito positivo su almeno un incrocio, la sostituisco con un altra e se finisco l'elenco di parole da provare, allora torno indietro di una posizione, sostituisco la parola già scritta e ricomincio.

    Tutto semplice se non fosse che non è detto che la parola che non fa produrre risultati validi sia la precedente, in teoria potrebbe essere anche la terzultima o addirittura una ancora prima, e quindi spostandomi di solo una parola indietro, entrerei in un loop che non mi porta a nulla.
    L'idea, quindi, è di registrare in una lista tutti i tentativi fatti.
    Se ho scritto più di una certa percentuale dello schema (ad esempio 50%) allora posso dedurre che quello è un percorso che potrebbe portare a soluzione più di altri.
    Quindi prendo la stringa più lunga (ovvero il tentativo che ha dato maggiori risultati come profondità di analisi) e la considero come base di partenza (ovvero cancello lo schema, riscrivo le parole del tentativo più profondo ed incomincio a sviluppare tentativi su una base più o meno consolidata). Questo, ovviamente non da certezza di trovare una soluzione, ma mi evita di dover ricominciare da zero la ricerca fin dalla prima parola.

    La soluzione che mi hai fornito tu, ovvero quella che mi estrae dalla lista la stringa più lunga di parole comuni, non penso (ma come dicevo devo testarla) che restituisca una lista di parole che sistemate nello schema creino incroci validi (ma sto provando anche questa strada).

    Grazie ancora.

    P.S. Ovviamente suggerimenti per il tentativo di risoluzione del problema (che mi dicono essere un NP completo) sono ben accettati...

  9. #9
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,310
    Blogs
    5
    Personalmente non sono convinto che tu stia seguendo la strada giusta per il tuo programma. Secondo me dovresti avere una struttura tipo LIFO (uno stack) per il backtracking e non questa strana 'lista di liste'.

    Quindi mi astengo da altri suggerimenti.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  10. #10
    Dev-01 non è in linea Scolaretto
    Post
    468
    [OT] Scusa ma quando scarti una soluzione temporanea come fai ad essere sicuro che non sia valida in un altro punto dello schema? [/OT]

    Secondo me comunque ha ragione Antonio: devi rivedere l'algoritmo e i tempi di generazione da te indicati rappresentano un'ottima motivazione per farlo.

    Inoltre, a parte la lunghezza della parola da incrociare con quelle già inserite, dovresti cercare anche quelle che hanno le lettere già presenti nello schema in una determinata posizione.

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi