yaroze61 (Normal User)
Newbie
Messaggi: 10
Iscritto: 07/02/2012
|
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
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
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à. |
|
yaroze61 (Normal User)
Newbie
Messaggi: 10
Iscritto: 07/02/2012
|
Ciao,
dai ho sbagliato a scrivere 'Riduzione di una stringa'
|
|
yaroze61 (Normal User)
Newbie
Messaggi: 10
Iscritto: 07/02/2012
|
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
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Postato originariamente da yaroze61:
Ciao,
dai ho sbagliato a scrivere 'Riduzione di una stringa' |
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à. |
|
yaroze61 (Normal User)
Newbie
Messaggi: 10
Iscritto: 07/02/2012
|
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)
Codice sorgente - presumibilmente VB.NET |
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
|
|
|
yaroze61 (Normal User)
Newbie
Messaggi: 10
Iscritto: 07/02/2012
|
Il codice è per VB6...
|
|
yaroze61 (Normal User)
Newbie
Messaggi: 10
Iscritto: 07/02/2012
|
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
|
|
yaroze61 (Normal User)
Newbie
Messaggi: 10
Iscritto: 07/02/2012
|
Ciao a tutti,
dai ragazzi una piccola idea...da solo non riesco... grazieeeeeeeeeeeeeeeeeeee
|
|