Excel e gli applicativi Microsoft Office Sfida numero 2: numeri palindromi

Login Registrati
Stai vedendo 15 articoli - dal 26 a 40 (di 40 totali)
  • Autore
    Articoli
  • #13577 Score: 0 | Risposta

    vecchio frac
    Senior Moderator
      272 pts

      Considerato l'aspetto videoludico di questa discussione, ci può stare 🙂

      #13589 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        272 pts

        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 Function

        Non 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).

        #13598 Score: 0 | Risposta

        albatros54
        Moderatore
          89 pts

          vecchio frac ha scritto:

          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 

          StrReverse

          quindi 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 )
          #13601 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            272 pts

            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 😀

            #13602 Score: 0 | Risposta

            albatros54
            Moderatore
              89 pts

               

              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.
              #13605 Score: 0 | Risposta

              Luca73
              Partecipante
                58 pts

                Ciao a tutti

                @ VF

                Luca73 ha scritto:

                Giusto per dettagliare.
                Grazie Luca! il proponente della sfida 

                Luca73 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...

                #13607 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  272 pts

                  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.
                  #13634 Score: 0 | Risposta

                  vecchio frac
                  Senior Moderator
                    272 pts

                    Votazioni aperte fino a venerdì 8 marzo ore 12 !

                    #13646 Score: 0 | Risposta

                    vecchio frac
                    Senior Moderator
                      272 pts

                      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   

                      #13701 Score: 0 | Risposta

                      patel
                      Moderatore
                        51 pts

                        a me sembra giusto così

                        #13703 Score: 0 | Risposta

                        vecchio frac
                        Senior Moderator
                          272 pts

                          Ultime ore per votare   

                          #13707 Score: 0 | Risposta

                          vecchio frac
                          Senior Moderator
                            272 pts

                            Votazioni concluse... il vincitore è

                            A L BA T R O S  5 4

                            Congratulazioni!   

                            Abbiamo già in cantiere la prossima sfida... quindi pazientate   

                            #13708 Score: 0 | Risposta

                            admin
                            Amministratore del forum
                              1 pt

                              Congratulazioni Albatros!

                              Ti consegno ufficialmente la coppa della sfida #2  (vedi sotto avatar    )

                              #13718 Score: 0 | Risposta

                              albatros54
                              Moderatore
                                89 pts

                                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.

                                 

                                Image and video hosting by TinyPic

                                 

                                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 )
                                #13723 Score: 0 | Risposta

                                vecchio frac
                                Senior Moderator
                                  272 pts

                                  Bravo Albatros! Un plauso all'Admin!   

                                Login Registrati
                                Stai vedendo 15 articoli - dal 26 a 40 (di 40 totali)
                                Rispondi a: Sfida numero 2: numeri palindromi
                                Gli allegati sono permessi solo ad utenti REGISTRATI
                                Le tue informazioni: