Excel e gli applicativi Microsoft Office Sfida sui numeri palindromi

Login Registrati
Stai vedendo 25 articoli - dal 76 a 100 (di 101 totali)
  • Autore
    Articoli
  • #41825 Score: 1 | Risposta

    vecchio frac
    Senior Moderator
      272 pts

      LucaSR ha scritto:

      ieri ho compilato il modulo per contattarvi per delle info. Se ho sbagliato a mandarlo, ci riprovo

      Ti risponderà Onofrio, il nostro Admin, appena lo riceve. Grazie

      #41826 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        272 pts

        Luca73 ha scritto:

        era giusto per fare una "polemica" inutile

        LucaSR ha scritto:

        Hai ragione! C'è stato un po' di confusione nei primi post, poi rettificati in modo corretto   

        Eh già e la colpa è mia perchè non avevo capito bene l'intento originale di Albatros   

        #41827 Score: 1 | Risposta

        vecchio frac
        Senior Moderator
          272 pts

          LucaSR ha scritto:

          Potreste cortesemente sistemarli voi

          Sistemo io.

          Nel frattempo ho tolto "l'evidenza" a questa discussione ormai esaurita con grande successo   

          #41828 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            272 pts

            LucaSR ha scritto:

            ero convinto che il compilatore di Excel eseguisse lo "short....non ricordo", come avviene in C

            Purtroppo non è così in VBA, la "short-circuit evaluation" non è disponibile.

            Lo stesso fenomeno si verifica con Switch (un sostituto in-line del costrutto Select Case) che è un'istruzione sia lenta sia inefficiente dal momento che valuta ogni espressione. 

            Sub test()
            Dim a As Integer
            Dim b As Integer
            Dim j As Integer
            
                a = 0
                b = 4
                j = Switch(a > b, 1, a <= b, 2, Int(b / a), 3)
                Debug.Print j
            End Sub
            

            Qui Switch fallisce miseramente perchè il terzo Switch è un errore (avrebbe potuto fermarsi dopo aver valutato il secondo caso).

            #41829 Score: 0 | Risposta

            LucaSR
            Partecipante
              15 pts

              vecchio frac ha scritto:

              Purtroppo non è così in VBA, la "short-circuit evaluation" non è disponibile.

              Grazie non ricordavo   

              Non conoscevo Switch, ma alquanto vedo non mi sono perso niente 😂

              #41830 Score: 1 | Risposta

              scossa
              Partecipante
                37 pts

                Ciao,

                stimolato da LucaSR, ho  scritto un codice che trova gli unici numeri primi che siano palindromi sia in base 10 che in base 2 con questi tempi:

                `    num.max    secondi
                     99.999   0,004054
                  9.999.999   0,025321
                999.999.999   0,704294`

                oltre va in OverFlow.

                Volete vedere subito il codice o volete provarci voi?

                #41831 Score: 0 | Risposta

                LucaSR
                Partecipante
                  15 pts

                  Da noi si dice "u masthru ié masthru", tradotto "il maestro è il maestro"    cmq ti ho fatto tribolare "non poco"       

                  Lo stimolo è stato reciproco a cercare di migliorarsi ed efficientare le performance. Se così non fosse stato, non avrei scoperto che VBA non permette le "short-circuit evaluation"    

                  #41838 Score: 0 | Risposta

                  vecchio frac
                  Senior Moderator
                    272 pts

                    scossa ha scritto:

                    gli unici numeri primi che siano palindromi sia in base 10 che in base 2

                    Che tra parentesi era la richiesta iniziale. I dati mostrati sono strabilianti. Immagino che hai ottimizzato non poco, e da qui si vede subito che l'amico scossa è stimolato da queste sfide   

                    scossa ha scritto:

                    Volete vedere subito il codice

                    Bè direi di sì, c'è sicuramente da imparare. Grazie scossa   

                    #41840 Score: 0 | Risposta

                    scossa
                    Partecipante
                      37 pts

                      Seguendo il "cattivo esempio" di LucaSR, sono partito dai palindromi in base 10, ma non scremandoli dall'insieme dei numeri naturali (nn) bensì "creandoli": visto che un numero è palindromo quando sNum = strReverse(sNum) ecco che con un paio di cicli For annidati posso creare tutti i numeri palindromi con la semplice formula 

                      sNum = j & dummy & StrReverse(j)

                      dove j è l'indice del ciclo più interno e va da 1 a 9 per i 999 nn (tanto i multipli di 10 non saranno mai né palindromi né primi), da 1 a 99 per i 99.999 nn, da 1 a 999 per i 9.999.999 nn e da 1 a 9999 per  i 999.999.999 nn; dummy è un carattere stringa che assume il valore vuoto o da 0 a 9 in base al valore di x (indice del ciclo esterno); ogni palindromo così generato viene prima verificato che sia un numero primo poi viene convertito in binario e verificato se anche in base 2 è un palindromo:

                      `Sub PalindromiXS()
                        'by scossa
                        Dim j As Long, x As Long, nRow As Long
                        Dim sNum As String, sBin As String, dummy As String, sFound As String
                        Dim nStart As Double
                        Dim nStop As Double
                        
                        nStart = MicroTimer
                      
                        Application.ScreenUpdating = False
                        Application.Calculation = xlCalculationManual
                        dummy = ""
                        nRow = 0
                        For x = -1 To 9
                          For j = 1 To 9999
                            If x >= 0 Then dummy = x
                              sNum = j & dummy & StrReverse(j)
                              If fPrimo(CLng(sNum)) Then
                                sBin = fDecBin(CLng(sNum))
                                If sBin = StrReverse(sBin) Then
                                  nRow = nRow + 1
                                  sFound = sFound & sNum & "/" & sBin & vbCrLf
                                  Range("A" & nRow).Value = sNum
                                  Range("B" & nRow).Value = "'" & sBin
                                End If
                              End If
                          Next j
                        Next x
                        nStop = MicroTimer - nStart
                        Debug.Print Format(sNum, "#,##0") & " in " & Format(nStop, "0.#####0") & " secondi"
                        Range("C1").Value = "Elaborati " & Format(sNum, "0,###") & " numeri"
                        Range("C2").Value = "terminato in "
                        Range("D2").Value = Format(nStop, "0.#####0")
                        Range("E2").Value = "secondi"
                        Application.ScreenUpdating = True
                        Application.Calculation = xlCalculationAutomatic
                        MsgBox "elaborazione terminata in " & Format(nStop, "0.#####0") & " secondi" & vbCrLf & "trovati: " & sFound, vbInformation
                      End Sub`

                      Per eventuali verifiche della corretteza modificare la riga 

                      If sBin = StrReverse(sBin) Then in if True then per avere tutti i palindromi generati.

                      Per comodità riporto anche le funzioni di servizio (da inserire in un modulo a parte):

                      'MicroTimer function
                      'Found on the net
                      '
                      #If VBA7 Then
                      
                        Private Declare PtrSafe Function getFrequency _
                                    Lib "kernel32" _
                                    Alias "QueryPerformanceFrequency" ( _
                                    cyFrequency As Currency) _
                                    As Long
                        
                        
                        Private Declare PtrSafe Function getTickCount _
                                    Lib "kernel32" _
                                    Alias "QueryPerformanceCounter" _
                                    (cyTickCount As Currency) _
                                    As Long
                      #Else
                        Private Declare Function getFrequency _
                                    Lib "kernel32" _
                                    Alias "QueryPerformanceFrequency" ( _
                                    cyFrequency As Currency) _
                                    As Long
                        
                        
                        Private Declare Function getTickCount _
                                    Lib "kernel32" _
                                    Alias "QueryPerformanceCounter" _
                                    (cyTickCount As Currency) _
                                    As Long
                      #End If
                      
                      Public Const SM_CXSCREEN = 0
                      Public Const SM_CYSCREEN = 1
                      
                      Public Function MicroTimer() As Double
                          Dim cyTicks1 As Currency
                          Static cyFrequency As Currency
                          MicroTimer = 0
                          If cyFrequency = 0 Then getFrequency cyFrequency
                          getTickCount cyTicks1
                          If cyFrequency Then MicroTimer = cyTicks1 / cyFrequency
                      End Function
                      
                      Public Function fDecBin(ByVal nDec As Long) As String
                        Do While nDec <> 0
                            fDecBin = Format(nDec - 2 * Int(nDec / 2)) & fDecBin
                            nDec = Int(nDec / 2)
                        Loop
                      End Function
                      
                      Function fPrimo(ByVal nNum As Long) As Boolean
                        Dim j As Long
                        
                        fPrimo = True
                        If nNum Mod 2 = 0 Then
                          fPrimo = False
                        Else
                          For j = 3 To Sqr(nNum) Step 2
                              If nNum Mod j = 0 Then
                                fPrimo = False
                                Exit For
                              End If
                          Next j
                        End If
                      End Function
                      
                      #41841 Score: 1 | Risposta

                      scossa
                      Partecipante
                        37 pts

                        vecchio frac ha scritto:

                        I dati mostrati sono strabilianti

                        In realtà per un refuso (nel codice mi era rimasto uno Step 2 nel ciclo interno che era corretto nella vecchia versione ma in questa escludeva i vari 12 (1221) 14 (1441) etc. Togliendo Step 2 (come da codice corretto del post sopra) i tempi sono un po' meno strabilanti, comunque poco più di un secondo per un miliardo non è male:

                        ` num. max   secondi
                        ----------- --------
                             99.999 0,005806
                          9.999.999 0,047317
                        999.999.999 1,353465`
                        #41842 Score: 0 | Risposta

                        LucaSR
                        Partecipante
                          15 pts

                          scossa ha scritto:

                          Seguendo il "cattivo esempio" di LucaSR

                          🥰

                          #41843 Score: 0 | Risposta

                          Aldo Ercolini
                          Partecipante
                            19 pts

                            Anche se in ritardo posto la mia versione, scusate la mia latitanza, ma in questi ultimi tempi non me ne va una dritta......

                            Option Explicit
                            Dim NumeroDecimale As Long, NumeroPrimo As Long
                            Dim NumeroBinario As String
                            
                            Sub TrovaPalindromiInNumeriPrimiEBinari()
                            Dim x As Long, y As Long
                            
                                x = 2
                                y = 2
                                
                                For NumeroDecimale = 8 To 10000
                                
                                    If ENumeroPrimo(NumeroDecimale) Then
                                        Range("A" & x) = NumeroPrimo
                                        NumeroBinario = DaDecimaleABinario(NumeroPrimo)
                                        Range("B" & x) = NumeroBinario
                                        x = x + 1
                                        
                                        If EPalindromo(CStr(NumeroDecimale)) And EPalindromo(NumeroBinario) Then
                                            Range("C" & y) = CStr(NumeroDecimale) & " - " & NumeroBinario
                                            y = y + 1
                                        End If
                                        
                                    End If
                            
                                Next
                             
                            End Sub
                            
                            Function DaDecimaleABinario(Numero As Long) As String
                            Dim s As String
                                
                                s = ""
                            
                                Do While Numero > 0
                                    s = CStr(Numero Mod 2) & s
                                    Numero = Numero \ 2
                                Loop
                            
                                DaDecimaleABinario = s
                                
                            End Function
                            
                            
                            Function ENumeroPrimo(Numero As Long) As Boolean
                                Dim i As Long
                            
                                If Numero < 2 Then
                                    ' I numeri minori di 2 non sono primi
                                    ENumeroPrimo = False
                                    Exit Function
                                End If
                            
                                For i = 2 To Sqr(Numero)
                                
                                    If Numero Mod i = 0 Then
                                        ' Il numero è divisibile per i, quindi non è primo
                                        ENumeroPrimo = False
                                        Exit Function
                                    End If
                                    
                                Next i
                            
                                ' Se il ciclo non ha trovato nessun divisore, il numero è primo
                                ENumeroPrimo = True
                                NumeroPrimo = Numero
                                
                            End Function
                            
                            Function EPalindromo(Numero As String) As Boolean
                                Dim NumeroInvertito As String
                                Dim i As Long
                                
                                ' Inverte la stringa
                                For i = Len(Numero) To 1 Step -1
                                    NumeroInvertito = NumeroInvertito & Mid(Numero, i, 1)
                                Next i
                            
                                ' Verifica se la stringa originale è uguale alla sua inversione
                                EPalindromo = (Numero = NumeroInvertito)
                                
                            End Function
                            
                            

                             

                            Allegati:
                            You must be logged in to view attached files.
                            #41845 Score: 0 | Risposta

                            vecchio frac
                            Senior Moderator
                              272 pts

                              Aldo Ercolini ha scritto:

                              Anche se in ritardo posto la mia versione

                              Grazie Aldo!

                              scossa ha scritto:

                              comunque poco più di un secondo per un miliardo non è male

                              Non avevo dubbi   

                              #41852 Score: 0 | Risposta

                              LucaSR
                              Partecipante
                                15 pts

                                Attendiamo da parte di @albatros54 le arancinE per tutti i partecipanti     

                                #41853 Score: 0 | Risposta

                                scossa
                                Partecipante
                                  37 pts

                                  LucaSR ha scritto:

                                  le arancinE

                                   blasfemo !  Gli arancinI!

                                  #41860 Score: 0 | Risposta

                                  LucaSR
                                  Partecipante
                                    15 pts

                                    scossa ha scritto:

                                    blasfemo !  Gli arancinI!

                                    Azz ma così andiamo OT di brutto      i moderatori né gioiranno     

                                    Sei del Sud anche tu!? 

                                    #41867 Score: 0 | Risposta

                                    scossa
                                    Partecipante
                                      37 pts

                                      LucaSR ha scritto:

                                      Sei del Sud anche tu!?

                                      Nordico con moglie sicula   

                                      #41868 Score: 0 | Risposta

                                      LucaSR
                                      Partecipante
                                        15 pts

                                        scossa ha scritto:

                                        Nordico con moglie sicula   

                                        Buon intenditore   

                                        #41870 Score: 0 | Risposta

                                        vecchio frac
                                        Senior Moderator
                                          272 pts

                                          LucaSR ha scritto:

                                          i moderatori né gioiranno

                                          Nemmeno i moderatori sono immuni alle goliardate   

                                          #41876 Score: 0 | Risposta

                                          albatros54
                                          Moderatore
                                            89 pts

                                            scossa ha scritto:

                                            blasfemo !  Gli arancinI!

                                            what are arancini? I know ARANCINEEEEEE!!!!!  

                                             

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

                                            albatros54
                                            Moderatore
                                              89 pts

                                              Innanzi tutto vorrei ringraziare tutti i partecipanti che si sono cimentanti in questa sfida, che non era una sfida nel senso stretto della parola, ma un modo come un'altro per condividere assieme delle idee.

                                              Non mi sento di stilare una graduatoria perchè siete stati tutti FANTASTICI!!.

                                              Questa sfida,in collaborazione con Vecchio_frac, l'ho immaginato per giungere a scoprire l'unico numero primo , formato da 3 cifre che fosse palindromo tanto in base 10 come in base 2, e guarda caso , questo numero è il numero di targa della macchina di Zio Paperino, che Scossa ha subito individuato.

                                              Passiamo alle noti dolenti. Molti di voi sia aspettano come premio di consolazione le ARANCINEEEE!!!, virtualmente le invio a tutti, per gli arancini, vi dovete ARRANGIARE  (Scossa).

                                              Per chi fosse interessato alla storia delle ARANCINE allego un pdf

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

                                              scossa
                                              Partecipante
                                                37 pts

                                                 

                                                albatros54 ha scritto:

                                                per gli arancini, vi dovete ARRANGIARE

                                                 

                                                citazione inappellabile (estratto faziosamente parziale):

                                                ".... Seguiamo il ragionamento della Crusca: “Nel dialetto siciliano, come registrano tutti i dizionari dialettali, il frutto dell’arancio è aranciu e nell’italiano regionale diventa arancio”. Quindi “arancinu” nel dialetto siciliano era ed è declinato al maschile, come attestano entrambi i vocabolari ottocenteschi sopra citati. “Del resto, alla distinzione di genere nell’italiano standard, femminile per i nomi dei frutti e maschile per quelli degli alberi, si giunge solo nella seconda metà del Novecento, e molti parlanti di varie regioni italiane – Toscana inclusa – continuano tuttora a usare arancio per dire arancia”"

                                                 

                                                #41883 Score: 0 | Risposta

                                                LucaSR
                                                Partecipante
                                                  15 pts

                                                  Io le preferisco (le arancinE) al femminile       

                                                  #41884 Score: 1 | Risposta

                                                  albatros54
                                                  Moderatore
                                                    89 pts

                                                    scossa ha scritto:

                                                    Quindi “arancinu” nel dialetto siciliano era ed è declinato al maschile,

                                                    nel dialetto siciliano, non nel dialetto Palermitano    

                                                    LucaSR ha scritto:

                                                    Io le preferisco (le arancinE) al femminile 

                                                     

                                                    Comunque ARANCINI o ARANCINE bisogna mangiarle per non capire la differenza  

                                                     

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

                                                    vecchio frac
                                                    Senior Moderator
                                                      272 pts

                                                      albatros54 ha scritto:

                                                      nel dialetto siciliano, non nel dialetto Palermitano

                                                      Se cominciamo coi campanili non la finiamo più   

                                                      Era da parecchio tanto tempo assai che non mi divertivo così. Grazie ragazzi   

                                                    Login Registrati
                                                    Stai vedendo 25 articoli - dal 76 a 100 (di 101 totali)
                                                    Rispondi a: Sfida sui numeri palindromi
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni: