| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  13-12-2008, 00:07 | #1 | 
| Senior Member Iscritto dal: May 2004 Città: Londra (Torino) 
					Messaggi: 3692
				 | 
				
				[vari] Contest 10: Numeri palindormi (Semplice)
			 
		Poiche' mi e' stato chiesto di provare a mettere in gioco anche i non esperti, propongo questo contest per i piu' JUNIOR Sta al singolo decidere se si sente parte degli Junior oppure no (Junior in senso di skill. Potrebbe anche essere 90anni...) Problema: Sia dato un elenco di numeri. Per ciascuno dei numeri letti, stampare il numero palindromo piu' piccolo che sia pero' maggiore del numero dato. Palindromo significa che, date le cifre in base decimale, il numero si puo' leggere allo stesso modo sia leggendolo da sinistra a destra, sia leggendolo da destra a sinistra Es: Se si avesse come input i numeri Codice: 119 115434 576 1024 Codice: 121 115511 585 1111 http://www.usaupload.net/d/mnp0jyk2kt8 Posto qui di seguito anche il Codice C# per generare i file di prova, per eventuali futuri utilizzi Codice: class Program
{
    static void Main(string[] args)
    {
        Generator.Generate(@"C:\temp\File1.dat", 1000, 7);
        Generator.Generate(@"C:\temp\File2.dat", 100, 30);           
    }
}
public static class Generator
{
    static Random rnd = new Random(155452);
    public static void Generate(string FileName,int nValori,int nCifre)
    {
        nCifre -= 3;
        StreamWriter sw = new StreamWriter(FileName);
        for (int t = 0; t < nValori; t++)
        {
            int rndcif = 3+rnd.Next(nCifre);
            bool first = true;
            for (int u = 0; u < rndcif; u++)
            {
                int cifra;
                if (first) cifra = rnd.Next(9) + 1;
                else cifra = rnd.Next(10);
                first = false;
                sw.Write(cifra);
            }
            sw.WriteLine();
        }
        sw.Close();
    }
}
				__________________ Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 13-12-2008 alle 01:19. Motivo: Errore. Come al solito almeno 1 negli esempi... | 
|   |   | 
|  13-12-2008, 00:56 | #2 | 
| Senior Member Iscritto dal: Jul 2002 Città: Reggio Calabria -> London 
					Messaggi: 12112
				 | 
		palindormi?   mi sa che è ora che tu vada a letto in effetti  P.S. comunque il contest potrebbe anche essere carino per i senior, anche se mi sa che ad occhio la soluzione + efficiente non è poi così difficile da trovare   
				__________________   Ultima modifica di ^TiGeRShArK^ : 13-12-2008 alle 00:58. | 
|   |   | 
|  13-12-2008, 01:12 | #3 | 
| Senior Member Iscritto dal: Oct 2006 Città: Roma 
					Messaggi: 1383
				 | 
		ma il palindromo immediatamente successivo a 115434 non dovrebbe essere 115511? nel primo post c'é scritto 116611
		 | 
|   |   | 
|  13-12-2008, 01:14 | #4 | |
| Senior Member Iscritto dal: Jan 2007 Città: Martinsicuro (Te) 
					Messaggi: 4803
				 | Quote: 
   
				__________________ Trattative ok con piu' di 100 utenti, cercate tra i miei messaggi! EVITATE VALERIAA   | |
|   |   | 
|  13-12-2008, 01:17 | #5 | 
| Senior Member Iscritto dal: May 2004 Città: Londra (Torino) 
					Messaggi: 3692
				 | 
		
Sisi',errore mio. Correggo.
		 
				__________________ Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. | 
|   |   | 
|  13-12-2008, 01:22 | #6 | |
| Senior Member Iscritto dal: May 2004 Città: Londra (Torino) 
					Messaggi: 3692
				 | Quote: 
   
				__________________ Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. | |
|   |   | 
|  13-12-2008, 13:10 | #7 | 
| Senior Member Iscritto dal: Dec 2007 
					Messaggi: 1501
				 | |
|   |   | 
|  13-12-2008, 13:42 | #8 | 
| Senior Member Iscritto dal: Oct 2006 Città: milano 
					Messaggi: 1439
				 | 
		ma li trattereste come interi o come stringhe?? nel secondo caso sarebbe molto più semplice ma non so se più veloce..
		 | 
|   |   | 
|  13-12-2008, 13:59 | #10 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | |
|   |   | 
|  13-12-2008, 14:24 | #12 | 
| Senior Member Iscritto dal: Oct 2001 
					Messaggi: 11471
				 | 
		Se il numero da cercare è già palindromo come ci si deve comportare? Possiamo ritornare direttamente il numero oppure dobbiamo cercare il palindromo successivo? Implementazione banale: Codice: def search_nearest_palindrome(n)
  n+=1 until n.to_s == n.to_s.reverse
  n
end
File.open('File1.txt', 'r') do |file|
  while line = file.gets
    puts line.chop + " -> " + search_nearest_palindrome(line.to_i).to_s
  end
endSempre per il primo file mi stavo chiedo se mettendo tutti i palindromi formati da 1 fino a 7 cifre e poi usando una ricerca di qualche tipo in quella lista si potrebbero velocizzare di molto le ricerche. Anche se probabilmente alla fine la generazione dell'array a runtime renderebbe lo sforzo inutile. Peccato che il trucchetto di capovolgi e somma non funzioni in questo caso   | 
|   |   | 
|  13-12-2008, 14:51 | #14 | 
| Senior Member Iscritto dal: Nov 2006 Città: Mantova 
					Messaggi: 468
				 | 
		ho un problemuccio... ho finito... ma non riesco a calcolare il tempo... cioè con start=clock() all'inizio ed end=clock() alla fine mi da lo stesso numero... strano... nel frattempo posto il codice? | 
|   |   | 
|  13-12-2008, 15:01 | #15 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Ve gusta ? Codice: #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
int mirrorInt(char *s)
{
    int i = 0;
    int j = strlen(s) - 1;
    while(i < j)
    {
        s[j--] = s[i++];
    }
    return atoi(s);
}
int findNextPalindrom(int n)
{
    if(n < 10)
    {
        return n;
    }
    char s[11];
    sprintf(s, "%d", n);
    int mirrored = mirrorInt(s);
    if(mirrored > n)
    {
        return mirrored;
    }
    int length = strlen(s);
    int middle = lenght / 2;
    if(length % 2 == 0)
    {
        middle--;
    }
    sprintf(s, "%d", n + (int)pow(10, length - middle - 1));
    return mirrorInt(s);
}Ultima modifica di cionci : 13-12-2008 alle 15:43. | 
|   |   | 
|  13-12-2008, 15:01 | #16 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | |
|   |   | 
|  13-12-2008, 15:16 | #17 | 
| Senior Member Iscritto dal: Nov 2006 Città: Mantova 
					Messaggi: 468
				 | 
		
e come faccio a calcolarlo se ci impiega meno di un secondo   ? un po' lungo... Codice: #include <time.h>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
string strOut(string stringa);
int main()
{
time_t start,end;
ifstream fin("File2.dat");
ofstream fout("Output.txt");
double tempo;
start=clock();
string numero;
char temp[100];
	while(!fin.eof())
	{
		fin.getline(temp,99);
		numero=temp;
		fout<<strOut(numero)<<endl;
	}
end=clock();
tempo=((double)(end-start))/CLOCKS_PER_SEC;
fin.close();
fout.close();
cout<<tempo<<" "<<start<<" "<<end<<" "<<CLOCKS_PER_SEC<<endl;
cin.get();
}
string strOut(string stringa)
{
	int lung=stringa.length();
	bool maggiore=false;
	for(int i=0; i<=(lung/2); i++)
	{
		if(i==(lung-i-2))
		{
			if(stringa[i]>stringa[lung-1-i])
				stringa[lung-1-i]=stringa[i];
			else
			{
				if(stringa[i]<stringa[lung-1-i])
					stringa[i]=stringa[lung-1-i];
				else
					if(maggiore)
					{
						int j=i;
						while(stringa[j]=='9')
							j++;
						stringa[j]+=1;
						stringa[lung-1-j]+=1;
					}
			}
		}
		else
		{
			if(i==(lung-i-1))
			{	
				if(maggiore)
					if(stringa[i]<'9')
						stringa[i]+=1;
					else
					{
						int j=i;
						while(stringa[j]=='9')
							j++;
						stringa[j]+=1;
						stringa[2*i-j]+=1;
					}
			}
			else
			{
				if(stringa[lung-1-i]>=stringa[i])
					maggiore=true;
				else
					maggiore=false;
				stringa[lung-1-i]=stringa[i];
			}
		}
	}
	return stringa;
}Ultima modifica di ..::DAVE::.. : 13-12-2008 alle 15:22. | 
|   |   | 
|  13-12-2008, 15:25 | #18 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Aspe...usi già clock, avevo confuso con time, allora dovrebbe andare, strano. Visivamente quanto ci mette ?
		 | 
|   |   | 
|  13-12-2008, 15:29 | #19 | 
| Senior Member Iscritto dal: Jun 2002 Città: Dublin 
					Messaggi: 5989
				 | 
		
Forte!   Io avevo pensato ad un calcolo puramente matematico, ma è troppo "umano" (via codice dovrei estrarre le varie cifre ogni volta). 
				__________________ C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! | 
|   |   | 
|  13-12-2008, 15:32 | #20 | |
| Senior Member Iscritto dal: Nov 2006 Città: Mantova 
					Messaggi: 468
				 | Quote: 
 in compenso copiando 50 volte i numeri del file 2 (quello da 100) come tempo mi da 0.078 che diviso 50 da 0,00156 Ultima modifica di ..::DAVE::.. : 13-12-2008 alle 15:36. | |
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 06:29.









 
		 
		 
		 
		








 
		






 
  
 



 
                        
                        










