› Excel e gli applicativi Microsoft Office › Sfida numero 2: numeri palindromi
-
AutoreArticoli
-
Considerato l'aspetto videoludico di questa discussione, ci può stare 🙂
Siamo quasi in dirittura d'arrivo 🙂
La mia versione è questa:
Option Explicit Function pal(ByVal n As Variant) As String Dim middle As Long Dim chmiddle As String Dim sx As String Dim dx As String Dim sxrev As String Dim m As String Dim s As String Dim odd_coeff As Integer s = CStr(Abs(n)) chmiddle = "" odd_coeff = (Len(s) Mod 2) 'casi speciali (una e due cifre) If Len(s) = 1 Or (Len(s) = 2 And mod_ext(n, 11) = 0) Then pal = s Exit Function End If If Len(s) = 2 Then pal = (n \ 11 + 1) * 11 Exit Function End If 'numero da tre cifre in poi middle = Len(s) \ 2 + odd_coeff sx = Left(s, middle - odd_coeff) dx = Right(s, middle - odd_coeff) sxrev = reverse(sx) If odd_coeff = 1 Then chmiddle = Mid(s, middle, 1) If dx < sxrev Then m = sx & chmiddle & sxrev Else If (odd_coeff = 0) Then m = (sx + 1) & Choose(odd_coeff + 1, "", "0") & reverse(sx + 1) ElseIf chmiddle = "9" Then m = (sx + 1) & reverse(sx + 1) Else m = sx & (chmiddle + 1) & sxrev End If End If pal = m End Function Private Function reverse(s As String) As String Dim i As Long Dim m As String For i = Len(s) To 1 Step -1 m = m & Mid(s, i, 1) Next reverse = m End Function Private Function mod_ext(dividendo, divisore) dividendo = Int(Abs(dividendo)) divisore = Int(Abs(divisore)) mod_ext = dividendo - (Int(dividendo / divisore) * divisore) End FunctionNon ho utilizzato StrReverse volutamente, per dargli un gusto un po' GWBasic 😀 e ho implementato la mia funzione di Mod perchè possa lavorare con numeri ultra Long. In questo modo la mia versione accetta un numero come stringa e può superare i limiti imposti dai tipi di dato numerici (perchè manipola stringhe, non numeri).
l'unica osservazione rilevante è che in generale fra tutte solo le ultime due routines di Albatros soffrono qualche rallentamento nell'elaborare alcune conversioni
volevo fare notare, che le mie due routine, a differenza di quelle degli altri utenti, non sfuttano la funzione intrinseca di Excel
StrReversequindi credo che il rallentamento sia dovuto a questo
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Lo considero probabile. Però anch'io mi sono fatto la mia funzione di reversing 🙂 caro mio si vede che apparteniamo a un'altra generazione 😛
GWBasic il mio secondo amore 😀
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Allegati:
You must be logged in to view attached files.Ciao a tutti
@ VF
Luca73 ha scritto:
Giusto per dettagliare.
Grazie Luca! il proponente della sfidaLuca73 ha scritto:
nelle mie macro ho considerato il "superiore" come "uguale o superiore"
Quando mi avevi proposto la sfida non lo avevi precisato, ed è per questo che ho fatto la precisazione a patel. Pertanto a questo punto possiamo accettare e considerare valide le proposte che restituiscono lo stesso numero come "uguale o superiore" se è già palindromo (5555 = 5555).Non volevo dire che la "mia proposta fosse cos' o no....
E' solo che non ci avevo pensato e quando ho poi scritto il codice ho fatto quella assunzione....
Ciao ciao a tutti
PS lezione imparata. dettagliare i casi di uguaglianza...
Ho rifatto il benchmark, con mille generazioni di numeri da elaborare, ripetuto tre volte, e i risultati sono coerenti.
Le tre soluzioni di Albatros sono leggermente più inefficienti delle altre, mentre le performances migliori sono registrate da patel (prima versione), scossa (seconda versione) e luca (seconda versione). Il test comporta la generazione e la conversione di tot numeri, ne calcola il tempo di esecuzione e mostra i millisecondi impiegati. Poi semplicemente eseguo il conteggio dei valori che sono superiri a zero millisecondi e ottengo la percentuale di elaborazioni che hanno impiegato un tempo significativo per l'esecuzione del compito.
Allego il file del benchmark utilizzato 🙂 (mi aspetto che su pc diversi i risultati siano diversi, ma il conteggio delle elaborazioni dovrebbe rimanere grossomodo costante). Tra l'altro trovo interessante l'utilizzo di CallByName per richiamare le routines presenti nel file (a proposito: ho dovuto trasformare le vostre Sub in Function 😛 )
I cicli impostati sono mille, di più meglio non fare perchè tutto l'ambaradan diventa davvero lento, ma se avete mezza giornata da perdere... 😀
Allegati:
You must be logged in to view attached files.Votazioni aperte fino a venerdì 8 marzo ore 12 !
Ho votato
Domanda al popolo: volete visualizzare i risultati dopo aver espresso il voto? Ho previsto che i voti vengano palesati solo dopo la chiusura della discussione per evitare spoiler, ma se preferite altrimenti, basta dirlo
Ultime ore per votare
Votazioni concluse... il vincitore è
A L BA T R O S 5 4
Congratulazioni!
Abbiamo già in cantiere la prossima sfida... quindi pazientate
Congratulazioni Albatros!
Ti consegno ufficialmente la coppa della sfida #2 (vedi sotto avatar
)Che dire,GRAZIE a tutti, non immaginavo di essere il primo nella classifica, in special modo se erano scesi in campo dei GURU del VBA.
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Bravo Albatros! Un plauso all'Admin!
-
AutoreArticoli

