|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#41 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#42 | |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 1525
|
Quote:
il risultato di un numero come 226611 lo risolvi a 226622? e 226622? @ tiger shark se metti t0 prima di quando richiami il file i tempi cambiano di molto? bio |
|
|
|
|
|
|
#43 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
quindi diventa 227722
__________________
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. |
|
|
|
|
|
|
#44 |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 1525
|
|
|
|
|
|
|
#45 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#46 |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 505
|
Ora provo a ragionare ditemi se è giusto cosi proverò a stilare il mio python(Considerate che ancora non so prendere file in input ma solo numeri in stringhe):
-Prendo un numero in input - Per calcolare il palindromo uso questo: Codice:
78+87=etc... Codice:
Numero Inverso 440044 -------->440044 121 --------->121 Questa è solo un parte dell'esercizio dell'altra non nè ho proprio la minima idea..uffi..
__________________
Giochi:Fallout 3,Civilitation IV,Call of Duty-World at War,Far Cry 2,Crysis,Age of Empires III. BLOG Non ricordo niente ma non lo dimenticherò mai |
|
|
|
|
|
#47 |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 1525
|
questo errore l'ho visto facendo il file piccolo
per questo controllo se il centrale è maggiore o minore del centrale +1 e se sono uguali leggo tutto il numero per capire se la parte + a destra di quella pari è maggiore (quindi numero a metà +1) o minore uguale (quindi il palindromo giusto è semplicemente l'inverso della prima parte).. bio Ultima modifica di bio82 : 13-12-2008 alle 19:45. |
|
|
|
|
|
#48 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
ora ho sistemato un pò il codice e corretto un buggettino con dei numeri dispari: Codice:
from __future__ import with_statement
import time
numbers = []
with open('../Downloads/Contest10/File2.dat') as f:
for number in f:
number = number.rstrip()
numbers.append(number)
t0 = time.time()
for number in numbers:
palyndrome = list(number)
length = len(palyndrome)
halfIndex = length / 2
if length % 2 == 0:
halfIndex = halfIndex - 1
i = halfIndex
needUpdate = False
while i >= 0 and palyndrome[length -i -1] >= palyndrome[i]:
if length -i -1 != i:
needUpdate = True
i = i -1
if needUpdate:
palyndrome[halfIndex] = str(int(number[halfIndex]) + 1)
for i in range(halfIndex, -1, -1):
palyndrome[length -i -1] = palyndrome[i]
print 'Elapsed time:', time.time() - t0
Elapsed time: 0.00817394256592 senza calcolarlo è: Elapsed time: 0.00750613212585 ah.. e sono col portatile a batteria per ora, quindi non so se infuisce sulle prestazioni
__________________
|
|
|
|
|
|
|
#49 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Avevo un paio di bug, uno nel controllo se potevo o meno rendere direttamente palindroma la stringa.
E l'altro si presentava con i numeri che contengono tutti 9, come 9999. Devo allungare la stringa, aggiungere uno 0 in mezzo e un 1 in testa. Ho messo qualche commento Codice:
void mirrorString(char *s)
{
int i = 0;
int j = strlen(s) - 1;
//copio la parte sinistra in quella destra invertendo gli indici
while(i < j)
{
s[j--] = s[i++];
}
}
int canMirror(char *s)
{
int i = strlen(s) / 2;
int j = strlen(s) - i - 1;
//confronto fra loro le rispettive posizioni:
//se la parte sinistra è maggiore di quella allora posso invertire direttamente
//se la parte sinistra è minore di quella destra allora non posso invertire
int diff = 0;
while(j >= 0 && diff == 0)
{
diff = s[i++] - s[j--];
}
return diff;
}
void addOneToMiddleNumber(char *s)
{
//aggiungo 1 all'elemento centrale,
unsigned int i = strlen(s) / 2 + strlen(s) % 2 - 1;
if(s[i] != '9')
{
s[i]++;
return;
}
//se l'elemento ha valore '9', inserisco '0' e continuo così fino a quando trovo '9' andando a sinistra (faccio il riporto)
while(s[i]++ == '9')
{
s[i] = '0';
if(i-- == 0)
break;
}
//gestisco il caso particolare con la stringa composta da tutti 9
if(s[0] == '0')
{
s[0] = '1';
s[strlen(s) / 2 + strlen(s) % 2] = '0';
s[strlen(s) + 1] = '\0';
s[strlen(s)] = '0';
}
}
void findNextPalindrome(char *s)
{
if(strlen(s) < 2)
{
return;
}
if(canMirror(s))
{
mirrorString(s);
return;
}
addOneToMiddleNumber(s);
mirrorString(s);
}
Ultima modifica di cionci : 13-12-2008 alle 20:12. |
|
|
|
|
|
#50 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
con un milione di stringhe fino a 4miliardi ci impiega circa 8 secondi però..
![]() Codice:
numbers = []
for i in range(0, 1000000):
numbers.append(str(random.randint(0,4000000000)))
t0 = time.time()umbers = []
for i in range(0, 1000000):
numbers.append(str(random.randint(0,4000000000)))
t0 = time.time()
__________________
|
|
|
|
|
|
#52 |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 505
|
Chi è che mi aiuto allora procedo cosi io:
Codice:
a="142" def inverso(x): n = len(x) inv = "" while(n > 0): inv = inv + x[n - 1] n = n - 1 return inv Ora devo verificare se questo valore più l'altro dà un unmero polidromo: Codice:
def verifica(): return inverso(a)+a==inverso(a+inverso(a)) lo chiamo cosi: Codice:
if verifica():
print ...
else:
Codice:
c=int(a)+1 a=str(c) Codice:
inverso(c) devo gestire con un while?.. Codice:
while verifica()!=True: ... Critiche sono ben gradie
__________________
Giochi:Fallout 3,Civilitation IV,Call of Duty-World at War,Far Cry 2,Crysis,Age of Empires III. BLOG Non ricordo niente ma non lo dimenticherò mai |
|
|
|
|
|
#53 |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 505
|
forse dico un baggianate:
Codice:
while verifica() !=True: Però io non posso sapere qunte varibiali occorrono creare il palindromo..Qundi potrei salvarli in una lista o tuple.. Che confusione! aiuto!
__________________
Giochi:Fallout 3,Civilitation IV,Call of Duty-World at War,Far Cry 2,Crysis,Age of Empires III. BLOG Non ricordo niente ma non lo dimenticherò mai |
|
|
|
|
|
#54 | |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 1525
|
Quote:
Codice:
Dim watch As New System.Diagnostics.Stopwatch()
Dim risultato As String = ""
Dim numero As String = ""
Dim casuale = New Random
Do
numero = numero & casuale.Next(1000000)
Loop Until numero.Length > 1000000
watch.Start()
risultato = palindromo(numero)
watch.Stop()
text_tempo.Text = watch.ElapsedMilliseconds & " ms - lunghezza stringa = " & numero.Length & " cifre"
text_risultati.Text = risultato
edit: sono un cretino se non salvo i palindromi nella stringa "risultati" scendo a 8 ms... bio Ultima modifica di bio82 : 13-12-2008 alle 22:08. |
|
|
|
|
|
|
#56 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Basta mettere questo: Codice:
import psyco psyco.full() Inoltre al posto di range prova a usare xrange.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
|
#57 |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 505
|
Da solo ci sono riuscito solo a fare il poliandromo a caricare i file devo imparare ancora:
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")
__________________
Giochi:Fallout 3,Civilitation IV,Call of Duty-World at War,Far Cry 2,Crysis,Age of Empires III. BLOG Non ricordo niente ma non lo dimenticherò mai |
|
|
|
|
|
#58 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Ho preso i tempi, su un file da un milione di numeri, della versione di Tiger(con e senza psyco) e di quella di Cionci:
Questa è la mia macchina: Quote:
Codice:
from __future__ import with_statement
import time
import psyco
psyco.full()
numbers = []
#with open('../Downloads/Contest10/File2.dat') as f:
with open('File3.dat') as f:
for number in f:
number = number.rstrip()
numbers.append(number)
t0 = time.time()
for number in numbers:
palyndrome = list(number)
length = len(palyndrome)
halfIndex = length / 2
if length % 2 == 0:
halfIndex = halfIndex - 1
i = halfIndex
needUpdate = False
while i >= 0 and palyndrome[length -i -1] >= palyndrome[i]:
if length -i -1 != i:
needUpdate = True
i = i -1
if needUpdate:
palyndrome[halfIndex] = str(int(number[halfIndex]) + 1)
for i in range(halfIndex, -1, -1):
palyndrome[length -i -1] = palyndrome[i]
print 'Elapsed time:', time.time() - t0
Per creare il file da un milione di punti ho utilizzato la seguente funzione C: Codice:
void CreaFile()
{
FILE *fp;
int i;
int n1, n2, n3, n4, n5;
char szNum1[256];
char szNum2[256];
char szNum3[256];
char szNum4[256];
char szNum5[256];
int range_min = 1;
int range_max = 32767;
fp = fopen("Dati3.dat", "w+");
srand((unsigned)time(NULL));
for ( i = 0; i < 1000000; i++ )
{
//n1 = rand();
//n2 = rand();
n1 = (double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min;
n2 = (double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min;
n3 = (double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min;
n4 = (double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min;
n5 = (double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min;
itoa(n1, szNum1, 10);
itoa(n2, szNum2, 10);
itoa(n3, szNum3, 10);
itoa(n4, szNum4, 10);
itoa(n5, szNum5, 10);
fwrite(szNum1, strlen(szNum1), 1, fp);
fwrite(szNum2, strlen(szNum2), 1, fp);
fwrite(szNum3, strlen(szNum3), 1, fp);
fwrite(szNum4, strlen(szNum4), 1, fp);
fwrite(szNum5, strlen(szNum5), 1, fp);
fwrite("\n", 1, 1, fp);
//printf("record n. %d\n", i);
}
fclose(fp);
}
Ultima modifica di Vincenzo1968 : 21-12-2008 alle 16:15. |
|
|
|
|
|
|
#59 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
La versione di Daniele sembra, invece, beneficiare dell'uso di psyco:
Questo è il codice di Daniele con psyco: Codice:
import psyco
psyco.full()
def numLength(n):
length = 0
while (n != 0):
n /= 10
length += 1
return length
def odd(n):
return (n & 1) != 0
def palindromize(n):
l = numLength(n)
n /= 10**(l/2)
tmp = n
if odd(l):
tmp /= 10
while (tmp != 0):
c = tmp % 10
tmp /= 10
n *= 10
n += c
return n
def nextPalindrome(n):
p = palindromize(n)
if (p >= n):
return p
l = numLength(n)
distance = 0
if (l != 1): distance += 10
if (l != 3): distance += 10**(l-2)
return (p + distance)
def main():
#name = raw_input("Inserisci il nome del file: ")
f = open('File3.dat')
for line in f:
n = int(line)
print n, "->", nextPalindrome(n)
if __name__ == "__main__":
main()
![]() P.S. Ohé Tiger, la tua applicazione non produce output(a parte la stampa dei tempi). |
|
|
|
|
|
#60 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
aggiungi una print e redireziona su file e vedi se cambia qualcosa
__________________
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:52.





















