Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
* Contest:Il numero palindromo successivo
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
chemicalbit
Dio maturo
Dio maturo


Registrato: 01/04/05 17:59
Messaggi: 18597
Residenza: Milano

MessaggioInviato: 22 Dic 2008 19:49    Oggetto: Rispondi citando

Ah , capito, è un indice che parte dal fondo. ( -2 ad es. è la penultima lettera della stringa, giusto?)
Top
Profilo Invia messaggio privato
mdweb
Dio maturo
Dio maturo


Registrato: 18/12/07 15:59
Messaggi: 4412

MessaggioInviato: 22 Dic 2008 20:00    Oggetto: Rispondi citando

chemicalbit ha scritto:
Ah , capito, è un indice che parte dal fondo. ( -2 ad es. è la penultima lettera della stringa, giusto?)

si
Top
Profilo Invia messaggio privato
mdweb
Dio maturo
Dio maturo


Registrato: 18/12/07 15:59
Messaggi: 4412

MessaggioInviato: 22 Dic 2008 20:21    Oggetto: Rispondi citando

Possiamo anche usare:
Codice:

x="ciao"
l=len(x)
print x[l-1]


Ovviamente la forma usata prima è più compatta e concisa.
Top
Profilo Invia messaggio privato
dany88
Dio maturo
Dio maturo


Registrato: 12/02/09 11:14
Messaggi: 1300

MessaggioInviato: 12 Feb 2009 11:22    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
dameunfiasco
Comune mortale
Comune mortale


Registrato: 12/02/09 19:28
Messaggi: 4

MessaggioInviato: 12 Feb 2009 19:31    Oggetto: Rispondi citando

E perché non usare il caro Bash Smile

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
Profilo Invia messaggio privato
mdweb
Dio maturo
Dio maturo


Registrato: 18/12/07 15:59
Messaggi: 4412

MessaggioInviato: 12 Feb 2009 19:49    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
chemicalbit
Dio maturo
Dio maturo


Registrato: 01/04/05 17:59
Messaggi: 18597
Residenza: Milano

MessaggioInviato: 12 Feb 2009 19:53    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
Scrigno
Semidio
Semidio


Registrato: 26/07/09 04:32
Messaggi: 313

MessaggioInviato: 16 Set 2009 00:31    Oggetto: L'Algoritmo Più Breve :-P Rispondi citando

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 Razz

Perdonatemi se mi gongolo
Anche se scommetto che avrò sicuramente cannato qualcosa Smile
Top
Profilo Invia messaggio privato
Scrigno
Semidio
Semidio


Registrato: 26/07/09 04:32
Messaggi: 313

MessaggioInviato: 19 Set 2009 01:16    Oggetto: Rispondi citando

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 Shocked ... ho perso 4 anni di vita ma mi pare non ci siano errori.. però, come al solito gli errori li vedono sempre gli altri Laughing

Comunque sia... eccovi lo schema a blocchi di quello che ho cercato di spiegare sopra...

Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 20 Set 2009 16:32    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
Scrigno
Semidio
Semidio


Registrato: 26/07/09 04:32
Messaggi: 313

MessaggioInviato: 21 Set 2009 00:06    Oggetto: Rispondi

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!



Laughing Prima che tu me ne parlassi e poi facessi un apiccola ricerca, DIA non sapevo nemmeno cosa fosse se non quella riguardante l' edilizia Razz

Comunque grazie mille del consiglio... PAINT non va bene nemmeno per andare in bagno Smile

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 Sad

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
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Vai a 1, 2  Successivo
Pagina 1 di 2

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi