Oppure

Loading
13/03/14 8:59
yaroze61
Ciao a tutti, non riesco a trovare un algoritmo che mi faccia questa riduzione, faccio un esempio:

ho una strina di questo tipo

cdabababababcdababababab

vorrei ridurla in questo modo: cd5(ab)cd5(ab) il top sarebbe 2(cd5(ab))

Spero essere stato chiaro:

cd ababababab cd ababababab

cd poi ho ab ripetuto 5 volte il tutto ripetuto 2 volte

Quanche idea....!?!?!?!?!?!?!?!?

Grazieeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee:):):):)
aaa
13/03/14 9:03
nessuno
Cominciamo dal capire cosa è una strina ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
13/03/14 13:03
yaroze61
Ciao,
dai ho sbagliato a scrivere 'Riduzione di una stringa' :asd::asd::asd:
aaa
13/03/14 13:10
yaroze61
Una funzione che fa più o meno questa cosa, l'ho fatta!!! Ha dei limiti, funzionando sempre sul calcolo della metà della stringa, piramidale, la stringa risultante a volte non è ottimizzata. La funzione che ho fatto non calcola il secondo livello di parentesi. Si potrebbe utilizzare la ricorsività, ma non so come fare...
Basterebbe un'idea....

Grazieeeeeeeeee:):):)
aaa
13/03/14 13:20
nessuno
Postato originariamente da yaroze61:

Ciao,
dai ho sbagliato a scrivere 'Riduzione di una stringa' :asd::asd::asd:


Sì ma hai scritto

"ho una strina di questo tipo"

a questo punto penso che ti manchi la g nella tastiera ...

Non c'è nessun bisogno della ricorsività ma prova a mostrare la tua funzione e ne parliamo ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
13/03/14 14:55
yaroze61
Allora entriamo nel serio della funzione:

la mia stringa iniziale è: 1C1D1A1B1A1B1A1B1A1B

Il valore 1 prima della lettera indica quante colte è ripetuta la lettera, per usare la mia funzione converto la mia stringa in: 0001C0001D0001A0001B0001A0001B0001A0001B0001A0001B

la stringa di uscita dalla mia funzione sarà:
1C1D
4(1A1B)

ma se io raddoppio la stringa iniziale: 1C1D1A1B1A1B1A1B1A1B1C1D1A1B1A1B1A1B1A1B la converto come sopra, la stringa di uscita sarà:

2(1C1D1A1B1A1B1A1B1A1B)

invece sarebbe più corretto: 2(1C1D4(1A1B)))

Spero di essere stato chiaro, ecco il codice:



Ingresso: sNota = 0001C0001D0001A0001B0001A0001B0001A0001B0001A0001B

Uscita: CompattaStringa = 1C1D
4(1A1B)



Public Function CompattaStringa(ByVal sNota As String) As String

    Dim sNewRigaNot    As String
    Dim fValue         As Single
    Dim sRiga          As String
    Dim sRgNota        As String
    Dim bFind          As Boolean
    Dim fIncr          As Single
    Dim fConta         As Single
    Dim sNotaCalcolata As String
    Dim sNoRip         As String
    Dim lPos1          As Long
    Dim lPos2          As Long
    Dim fId            As Single
    Dim fVolte         As Single
    Dim sNume          As String
    Dim fIncremento    As Single
    Dim sParte         As String

    fIncremento = 5
   
    sRgNota = sNota & Space$(fIncremento)
       
    sRiga = ""
    fConta = 1
    
    fIncr = fIncremento
    Do
      Do
        If Mid$(sRgNota, 1, fIncr) = Mid$(sRgNota, (fConta * fIncremento) + 1, fIncr) Then
           bFind = True
        Else
           fIncr = fIncr + fIncremento
           fConta = fConta + 1
        End If
      Loop Until fIncr > Int((Len(sRgNota)) / 2) Or bFind
    
      If bFind = False Then
         sParte = Mid$(sRgNota, 1, fIncremento)
         sNoRip = sNoRip & CStr(Val(Left(sParte, 4))) & Right$(sParte, 1)
         sRgNota = Mid$(sRgNota, fIncremento + 1)
      End If
      
      If bFind And Len(sNoRip) <> 0 Then
         sNotaCalcolata = sNotaCalcolata & sNoRip & vbCrLf
         sNoRip = ""
      End If
      
      If bFind Then
         sRiga = Left(sRgNota, fIncr)
         fVolte = 1
         Do
           fVolte = fVolte + 1
         Loop Until Mid$(sRgNota, (fVolte * fIncr) + 1, fIncr) <> sRiga
    
         sRgNota = Mid$(sRgNota, (fVolte * fIncr) + 1)
         
         sNume = sRiga
         sRiga = ""
         For fId = gnControllo To Len(sNume) - 1 Step fIncremento
             sParte = Mid$(sNume, fId + 1, fIncremento)
             sRiga = sRiga & CStr(Val(Left(sParte, 4))) & Right$(sParte, 1)
         Next
    
         sNotaCalcolata = sNotaCalcolata & CStr(fVolte) & "(" & sRiga & ")" & vbCrLf
         
      End If
      
      fIncr = fIncremento
      bFind = False
      fConta = 1
    
    Loop Until StrClean(sRgNota) = ""
    
    If Len(sNoRip) <> 0 Then
       sNotaCalcolata = sNotaCalcolata & sNoRip & vbCrLf
       sNoRip = ""
    End If
    
    CompattaStringa = sNotaCalcolata
       
End Function











aaa
13/03/14 14:56
yaroze61
Il codice è per VB6...
aaa
16/03/14 21:45
yaroze61
Ciaooo,
capisco la difficoltà, ma possibile che nessuno abbia una idea, non chiedo il codice, bhe se ci fosse meglio, ma una piccola idea per lo sviluppo. Devo risolvero questo problema per fine settimana...

Grazieeeeeeeeeeeeeeeeeeeee:(:(:(:(:(:(:(
aaa