› Excel e gli applicativi Microsoft Office › Sfida sui numeri palindromi
-
AutoreArticoli
-
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
era giusto per fare una "polemica" inutile

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
Potreste cortesemente sistemarli voi
Sistemo io.
Nel frattempo ho tolto "l'evidenza" a questa discussione ormai esaurita con grande successo
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 SubQui Switch fallisce miseramente perchè il terzo Switch è un errore (avrebbe potuto fermarsi dopo aver valutato il secondo caso).
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 😂
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"
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
Volete vedere subito il codice
Bè direi di sì, c'è sicuramente da imparare. Grazie scossa
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 FunctionI 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`Seguendo il "cattivo esempio" di LucaSR
🥰
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 FunctionAllegati:
You must be logged in to view attached files.Anche se in ritardo posto la mia versione
Grazie Aldo!
comunque poco più di un secondo per un miliardo non è male
Non avevo dubbi
Attendiamo da parte di @albatros54 le arancinE per tutti i partecipanti
le arancinE
blasfemo
! Gli arancinI!blasfemo
! Gli arancinI!Azz ma così andiamo OT di brutto
i moderatori né gioiranno
Sei del Sud anche tu!?
Sei del Sud anche tu!?
Nordico con moglie sicula
Nordico con moglie sicula
Buon intenditore
i moderatori né gioiranno
Nemmeno i moderatori sono immuni alle goliardate
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 )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 gliarancini, vi dovete ARRANGIARE
(Scossa).Per chi fosse interessato alla storia delle
ARANCINE allego un pdfQual è 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.per gli
arancini, vi dovete ARRANGIAREcitazione 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”"

Quindi “arancinu” nel dialetto siciliano era ed è declinato al maschile,
nel dialetto siciliano, non nel dialetto Palermitano
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 )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
-
AutoreArticoli
