|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#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... |
|
|
|
|
|
#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. |
|
|
|
|
|
#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
|
|
|
|
|
|
#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 |
|
|
|
|
|
|
#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. |
|
|
|
|
|
#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. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 1502
|
|
|
|
|
|
|
#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..
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#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
end
Sempre 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 |
|
|
|
|
|
#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? |
|
|
|
|
|
#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. |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#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. |
|
|
|
|
|
#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 ?
|
|
|
|
|
|
#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! |
|
|
|
|
|
#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: 00:02.





















