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
mdweb
Dio maturo
Dio maturo


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

MessaggioInviato: 21 Dic 2008 15:33    Oggetto: * Contest:Il numero palindromo successivo Rispondi citando

Da qui.

Problema:
Dato un input trovare il numero palidromo più vicino che sia però maggiore del numero dato.

Esempio se l'input è 32 l'output dovrà essere 33.

Postate le vostre soluzioni con i linguaggi che preferite.Ecco la mia soluzione python:
Codice:
def reverse(x):
    i=-1
    lunghezza=len(x)
    rit=""
    while i>= -lunghezza:
        rit=rit+x[i]
        i=i-1
    return rit



def palindromo(x):
    return x==reverse(x)

def programma(x):
   if palindromo(x):
     print x,"e' polindromo"
     return
   else:
     programma(str(int(x)+1))

programma("119")


Vi consiglio di dare un'occhiata a questi siti
Lista di problemi classici

Altra lista
Top
Profilo Invia messaggio privato
mdweb
Dio maturo
Dio maturo


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

MessaggioInviato: 21 Dic 2008 15:40    Oggetto: Rispondi citando

C'era un return che non c'entrava niente:
Codice:

def reverse(x):
    i=-1
    lunghezza=len(x)
    rit=""
    while i>= -lunghezza:
        rit=rit+x[i]
        i=i-1
    return rit



def palindromo(x):
    return x==reverse(x)

def programma(x):
   if palindromo(x):
     print x,"e' polindromo"
     
   else:
     programma(str(int(x)+1))

programma("119")
Top
Profilo Invia messaggio privato
mdweb
Dio maturo
Dio maturo


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

MessaggioInviato: 21 Dic 2008 16:08    Oggetto: Rispondi citando

Risolto un bug:


Codice:
X=raw_input("Inserisci un numero: ")

def reverse(x):
    i=-1
    lunghezza=len(x)
    rit=""
    while i>= -lunghezza:
        rit=rit+x[i]
        i=i-1
    return rit



def palindromo(x):
    return x==reverse(x)

def programma(x):
   if palindromo(x):
     print x,"e' polindromo"
     
   else:
     programma(str(int(x)+1))

programma(str(int(X)+1))


Come chiesto nell'esercizio questo programma trova il palindromo successivo anche se è un nuermo è già palindromo.

Ecco la schermata:

Top
Profilo Invia messaggio privato
Mark89
Comune mortale
Comune mortale


Registrato: 21/12/08 23:48
Messaggi: 2

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

Ciao, ecco la mia soluzione in C#

Codice:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Palindromo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Questo programma trova il numero palindromo appena superiore al numero dato");
            Console.Write("Scrivi un numero :");
            string numero = Console.ReadLine();
            string stringainvertita;
            bool palindromo=false;
            while (palindromo == false)
            {
                numero = Convert.ToString(Convert.ToInt32(numero) + 1);//aggiunge di uno alla stringa
                char[] charArray = numero.ToCharArray();//trasforma in caratteri
                Array.Reverse(charArray);//inverte i caratteri
                stringainvertita = new string(charArray);//ritrasformata in stringa
                if (string.Compare(numero, stringainvertita) == 0) palindromo = true;
            }
            Console.Write("Il numero palindromo più vicino è: ");
            Console.WriteLine(numero);         
            Console.ReadKey();
        }
    }
}

Top
Profilo Invia messaggio privato
mdweb
Dio maturo
Dio maturo


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

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

Ciao Mark89 benvenuto nel forum.
E' bello vedere la semplicità di Python e soprattutto l'eleganza di python.
In poche righe (una 15ina) sono riuscito a fare quello che C# in 30 righe?

Comunque il programma funziona benissimo.Non so se si può migliorare qualcosa dal punto di vista della velocità.

P.S Se vuoi presentati qui
Top
Profilo Invia messaggio privato
mdweb
Dio maturo
Dio maturo


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

MessaggioInviato: 22 Dic 2008 11:42    Oggetto: Rispondi citando

Come richiesto posto le indicazione.

Generare un palindromo è facile.Io ho trattato il numero come una stringa.
Poi con una funzione (reverse) l'ho confrontato restituendo un True o False.Ricorsione e ciclo while funzionano bene.

Ricordate però che se il numero è 808 l'output dovrà essere 818:Il numero palindromo successivo più piccolo,anche se l'input è già palindromo.


@freemind[OT]:
L'algortimo per genererare palindromo è:
Codice:
 79 + 97 => 176 + 671 => 847 + 748 => 1595 + 5951 =>
=> 7546 + 6457 => 14003 + 30041 => 44044


Nel nostro caso non è utile però.

Puoi trovare qualcosa qua
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


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

MessaggioInviato: 22 Dic 2008 14:06    Oggetto: Rispondi citando

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


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

MessaggioInviato: 22 Dic 2008 14:45    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.

su internet non c'è niente ma comunque la cose che dici tu non capita mai..penso
Top
Profilo Invia messaggio privato
chemicalbit
Dio maturo
Dio maturo


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

MessaggioInviato: 22 Dic 2008 16:48    Oggetto: Re: Contest:Il numero palindromo successivo Rispondi citando

mdweb ha scritto:
.Ecco la mia soluzione python:
[code]def reverse(x):
i=-1
lunghezza=len(x)
rit=""
while i>= -lunghezza:
rit=rit+x[i]
i=i-1
return rit
Non conosco il pyton,
x[i] è un elemento di un vettore (array)?

In tal caso, visto che i è sempre negativo (parte da -1, e man mano viene sottratto 1), che elemento è x[i] ?
Top
Profilo Invia messaggio privato
mdweb
Dio maturo
Dio maturo


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

MessaggioInviato: 22 Dic 2008 19:38    Oggetto: Re: Contest:Il numero palindromo successivo Rispondi citando

chemicalbit ha scritto:
mdweb ha scritto:
.Ecco la mia soluzione python:
[code]def reverse(x):
i=-1
lunghezza=len(x)
rit=""
while i>= -lunghezza:
rit=rit+x[i]
i=i-1
return rit
Non conosco il pyton,
x[i] è un elemento di un vettore (array)?

In tal caso, visto che i è sempre negativo (parte da -1, e man mano viene sottratto 1), che elemento è x[i] ?

In python se abbiamo :
[code]
s="stringa"
print s[-1]
[/code]

stampa l'ultima lettera "a"
Top
Profilo Invia messaggio privato
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

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