Precedente :: Successivo |
Autore |
Messaggio |
chemicalbit Dio maturo
Registrato: 01/04/05 17:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 22 Dic 2008 19:49 Oggetto: |
|
|
Ah , capito, è un indice che parte dal fondo. ( -2 ad es. è la penultima lettera della stringa, giusto?) |
|
Top |
|
|
mdweb Dio maturo
Registrato: 18/12/07 15:59 Messaggi: 4412
|
Inviato: 22 Dic 2008 20:00 Oggetto: |
|
|
chemicalbit ha scritto: | Ah , capito, è un indice che parte dal fondo. ( -2 ad es. è la penultima lettera della stringa, giusto?) |
si |
|
Top |
|
|
mdweb Dio maturo
Registrato: 18/12/07 15:59 Messaggi: 4412
|
Inviato: 22 Dic 2008 20:21 Oggetto: |
|
|
Possiamo anche usare:
Codice: |
x="ciao"
l=len(x)
print x[l-1]
|
Ovviamente la forma usata prima è più compatta e concisa. |
|
Top |
|
|
dany88 Dio maturo
Registrato: 12/02/09 11:14 Messaggi: 1300
|
Inviato: 12 Feb 2009 11:22 Oggetto: |
|
|
potreste migliorare notevolmente la velocità dell'algoritmo in questa maniera (ve lo scrivo in pseudocodice)
function palindromo(x):boolean
if x mod 11 <> 0 then return false
if x=reverse(x) return true else return false
end function
il reverse (che non ho scritto) può essere ulteriormente migliorato facendo ritornare false alla prima incongruenza e si può ottenere ancora qualcosa in più utilizzando per la gestione della stringa, algoritmi particolari od oggetti messi a disposizione dal linguaggio scelto.
Avete citato il python, ecco alcuni esempi di concatenazioni veloci
http://skymind.com/~ocrow/python_string/
e per il C# vi posto un interessante funzione di reverse veloce basata su XOR
http://weblogs.sqlteam.com/mladenp/archive/2006/03/19/9350.aspx |
|
Top |
|
|
dameunfiasco Comune mortale
Registrato: 12/02/09 19:28 Messaggi: 4
|
Inviato: 12 Feb 2009 19:31 Oggetto: |
|
|
E perché non usare il caro Bash
Codice: |
#!/bin/bash
echo -n "Inserisci numero? "
read NUMERO
let NUMERO=$NUMERO+1
while : ; do
[[ $NUMERO == $(echo $NUMERO | rev) ]] && echo $NUMERO && exit
let NUMERO=$NUMERO+1
done
|
[/code] |
|
Top |
|
|
mdweb Dio maturo
Registrato: 18/12/07 15:59 Messaggi: 4412
|
Inviato: 12 Feb 2009 19:49 Oggetto: |
|
|
Ciao dameunfiasco benvenuto nel forum.
Citazione: | E perché non usare il caro Bash |
Forse perchè non è il più usato.
Dacci tu le motivazioni per usarlo! |
|
Top |
|
|
chemicalbit Dio maturo
Registrato: 01/04/05 17:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 12 Feb 2009 19:53 Oggetto: |
|
|
mdweb ha scritto: | Ciao dameunfiasco benvenuto nel forum.
Citazione: | E perché non usare il caro Bash |
Forse perchè non è il più usato.
Dacci tu le motivazioni per usarlo! | Scusa mdweb, e le motivazioni per non usarlo?
Secondo te va usato solo il linguaggio di programmazione è "il più usato"?! |
|
Top |
|
|
Scrigno Semidio
Registrato: 26/07/09 04:32 Messaggi: 313
|
Inviato: 16 Set 2009 00:31 Oggetto: L'Algoritmo Più Breve :-P |
|
|
freemind ha scritto: | Ciao,
questo algoritmo lo conoscevo però come hai detto tu non è utili per il problema proposto.
Dato che la densità dei numeri palindromi è nota, sarebbe bello riuscire a sfruttarla per evitare dei cicli inutili su numeri che sicuramente non sono palindromi.
Ad esempio, supponiamo che dato x intero, il successivo palindromo sia dopo 3000 numeri ossia x+3000, se esistesse qualche proprietà che permettesse di restringere lo spazio di ricerca, si eviterebbero molte iterazioni comprese tra x+1 e x+2999. |
Lo scrivo in italiano perchè a programmazione sono ancora una schiappa ;-P
Analisi:
- i numeri sono formati da un certo numero di cifre (pari O dispari)
- se sono pari possono essere spezzati in due parti
- se dispari hanno la stessa peculiarità ma hanno una cifra solitaria al centro.
Esempio
- 12345 ha numero di cifre dispari quindi ha una cifra centrale (3) e partendo dal centro leggiamo prima (2) poi (1) e (4) (5) - 12345678 ha numero di cifre pari quindi al centro non troviamo cifre e da li leggiamo (4)(3)(2)(1) e (5)(6)(7)(8 )
Non c'ho ragionato molto sopra però sono pronto a scommettere che:
Definizioni:
Spezzando il numero come sopra otterremo:
Un appendice di destra
Un appendice di sinistra
Un eventuale centrale
Ad esempio: 13458 darà Appendice di Sx (31); Centrale (4); Appendice di Dx(58 )
Lo scelto a caso e mentre scrivo sono pronto a dire che il palindromo successivo dovrebbe essere 13|5|31
Algoritmo:
- Distinguere se un numero ha parte centrale o meno perchè bisognerà operare in modo leggermente differente.
- Caso con numero di cifre pari:
- Confrontare le cifre del lato Sx con le rispettive del lato Dx e procedere fino a che non si incontra che NON sono identiche.
- determinare quale appendice ha la cifra più alta fra quelle in esame.
- Se la cifra è parte di Sx allora il palindromo sara formato dall' appendice di Sx e di conseguenza l' appendice Dx sarà a lei speculare
- se la cifra più alta è parte di Dx allora aggiungere 1 alla cifra inmeno significativa di Sx considerando anche gli eventuali resti e costruire la Dx dalla Nuova Sx
-in caso di Dx = Sx il palindromo si ha sempre aggiungendo 1 alla meno significativa di Sx e dalla nuova Sx si crea Dx
ESEMPIO:
1993 --> 19 | 93 --> (3 ) è maggiore di 1 quindi:
Sx = Sx + 1 = 20 --> 20 | 02
il primo palindromo dopo 1993 è 2002
Altro esempio:
1423 -- > 14 | 23 --> 4 è maggiore di 2 quindi:
Sx = Sx = 14 --> 14 | 41
il primo palindromo dopo 1423 è 1441
Infine:
1441 --> 14 | 41 --> è palindromo quindi
Sx = Sx + 1 = 15 --> 15 | 51
il primo palindromo dopo 1441 è 1551
...
per quanto riguarda i formati da un numero di cifre dispari Bisogna tener conto della parte centrale nel senso che nella formula Sx + 1 Sx avra come cifr ameno significativa la parte centrale e nella costruzione della Dx questa parte centrale non dovrà esser ripetuta
Esempio:
123 --> 1 | 2 | 3
3 > 1 quindi
sx = sx + 1 = 12 + 1 = 13
sx sarà 1
Centro sarà 3
Dx sarà lo specchio di Sx e quindi 1
dopo 123 il primo palindromo è 131
Altro esempio:
14325 --> 14 | 3 | 25
4 > 2 quindi Sx = sx
14 | 3 | 41
dopo il 14325 il primo palindromo è 14341
8)
Spero possiate provare quanto ho appena trovato perchè gioisco al solo scriverlo
Perdonatemi se mi gongolo
Anche se scommetto che avrò sicuramente cannato qualcosa |
|
Top |
|
|
Scrigno Semidio
Registrato: 26/07/09 04:32 Messaggi: 313
|
Inviato: 19 Set 2009 01:16 Oggetto: |
|
|
freemind ha scritto: | Ciao,
questo algoritmo lo conoscevo però come hai detto tu non è utili per il problema proposto.
Dato che la densità dei numeri palindromi è nota, sarebbe bello riuscire a sfruttarla per evitare dei cicli inutili su numeri che sicuramente non sono palindromi.
Ad esempio, supponiamo che dato x intero, il successivo palindromo sia dopo 3000 numeri ossia x+3000, se esistesse qualche proprietà che permettesse di restringere lo spazio di ricerca, si eviterebbero molte iterazioni comprese tra x+1 e x+2999. |
Raga spero di farvi cosa gradita nel postare il mio duro lavoro con PAIT ... ho perso 4 anni di vita ma mi pare non ci siano errori.. però, come al solito gli errori li vedono sempre gli altri
Comunque sia... eccovi lo schema a blocchi di quello che ho cercato di spiegare sopra...
|
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 20 Set 2009 16:32 Oggetto: |
|
|
Ciao Scrigno,
cercherò con calma di guardare sia l'algoritmo da te proposto che anche il flow chart.
Solo un consiglio però: la prossima volta lo schema fallo con DIA, così non diventi matto a disegnare i blocchi! |
|
Top |
|
|
Scrigno Semidio
Registrato: 26/07/09 04:32 Messaggi: 313
|
Inviato: 21 Set 2009 00:06 Oggetto: |
|
|
freemind ha scritto: | Ciao Scrigno,
cercherò con calma di guardare sia l'algoritmo da te proposto che anche il flow chart.
Solo un consiglio però: la prossima volta lo schema fallo con DIA, così non diventi matto a disegnare i blocchi! |
Prima che tu me ne parlassi e poi facessi un apiccola ricerca, DIA non sapevo nemmeno cosa fosse se non quella riguardante l' edilizia
Comunque grazie mille del consiglio... PAINT non va bene nemmeno per andare in bagno
Ho anche abbozzato il codice VB.Net e mi pare che non dia problemi... Naturalmenta non so fare il debug e quindi il mio modo di debuggare è stato quello di provare con alcune immissioni.
Premettendo che non c'è un controllo sul tipo di tasti digitati per ora si consiglia solo l' immissione di cifre numeriche....
Per chi volesse utilizzarlo non ricordo se il compilatore VBC.exe è gia compreso nei file di Windows.. chissa, provate a cercarlo sul vostro Pc.
Se ci fosse vi basterebbe copiare questo codice su un foglio di testo e passarlo al compilatore... purtroppo non ricordo
Citazione: |
LINK al codice sottoforma di immagine
Volevo postarlo ma perdeva la formattazione ed i colori e poi non so aplicare lo SPOILER nel forum e quindi avrei occupato un mucchio di spazio.
|
|
|
Top |
|
|
|