Middle-square method

Stato
Discussione chiusa ad ulteriori risposte.

Oromis92

Utente Silver
22 Dicembre 2007
102
12
2
84
scrivere un programma che generi x numeri casuali secondo il metodo del "Middle-Square".

ecco il funzionamento:
* il programa deve accettare in input un qualiasi numero
* bisogna elevare al quadrato questo numero
* prendere la parte centrale di questo nuovo numero
* outputtarla
* usare nuovamente il procedimento su quest stringa


regole:
* per prendere la parte centrale della stringa NON dovete usare una funzione già pronta tipo mid()
* se l'input è un numero di X cifre, ogni output deve avere X cifre

ecco la soluzione in perl (evitate di copiare il metodo di estrarre la parte centrale ;) ):
Codice:
$seed = shift or die "usage: $0 <six-digit seed> <number of numbers to generate>\n";
$iter = shift or die "usage: $0 <six-digit seed> <number of numbers to generate>\n";
$length = length($seed);
for (1..$iter) {
$x = length(  (9 x length($seed)) ** 2 );
if ($x%2==1) {$x++};
$seed = $seed ** 2; 
while (length($seed) < $x) {$seed = 0 . "$seed"};
$seed = substr($seed,($x/4),$length);
print "$seed\n";
};

È abbastanza difficile, quindi chi lo risolve per primo vince un lecca-lecca :lol:

ecco un test vector:
Codice:
oromis92@localhost:~/Scrivania/perl$ perl prnga.pl
usage: prnga.pl <six-digit seed> <number of numbers to generate>
oromis92@localhost:~/Scrivania/perl$ perl prnga.pl 123456 5
241383
265752
624125
532015
039960
----------------------------------
oromis92@localhost:~/Scrivania/perl$ perl prnga.pl 987654 5
460423
989338
789678
591343
686543
-----------------------
oromis92@localhost:~/Scrivania/perl$ perl prnga.pl 625000 5
625000
625000
625000
625000
625000

poi usando l'esempio di wikipedia: http://upload.wikimedia.org/wikipedia/commons/9/92/Middle-square_method.svg
Codice:
oromis92@localhost:~/Scrivania/perl$ perl prnga.pl 675248 1
959861
 
Non ho capito una cosa, come si definisce il "centro del numero"?? Cioè va preso ad un numero predefinito di cifre parteno sia da destra che da sinistra? Una volta capito questo non credo sia molto difficile
 
se il numero ha un numero di cifre dispari, metti uno zero davanti. poi tagli uno stesso numero di cifre in testa e in coda, finchè non ti rimane un numero con lo stesso numero di cifre di quello inserito dall'utente.
 
Ahh sisi credo di aver capito, ma non è poi così difficile, basta giocare un pò con gli array xD
 
adesso faccio il cattivo e vi impedisco di usare gli array, visto che non sono necessari ;)
no dai oggi mi sento buono :D
 
xDDD mhm...asp...penso a come dovrei fare senza array e ti dico l'esito xD perchè con gli array sarebbe veramente trooooppo facile xD
 
(nota)
non so se si è capito, ma il programma non deve accettare solo input da 6 cifre, ma un numero con un numero qualunque di cifre
 
Ma che bell'esercizio! Complimenti!
Python:
Codice:
from sys import argv
seed = int(argv[1])
digits = len(argv[1])
togen = int(argv[2])
for i in xrange(togen):
	sq = seed**2
	tc = str(sq)
	sl = len(tc)
	if(sl%2==0): seed = int(tc[((sl-digits)/2):(((sl-digits)/2)+digits)])
	else: 
		sl+=1
		seed = int(('0'+tc)[((sl-digits)/2):(((sl-digits)/2)+digits)])
	print seed
Uso:
Codice:
middlesquare.py 67524 1
 
ehm... alcuni risultati sono sbagliati:
Codice:
oromis92@localhost:~/Scrivania$ python b.py 123456 1
524138

123456^2 = 015241383936
risultato giusto = 015241383936
risultato del tuo script = 015241383936

è leggermente sfasato.
edit:
ho notato che sfasa soltanto quando il quadrato ha dispari di cifre
fix it!

[ot]
Ma che bell'esercizio! Complimenti!
era ironico o dici sul serio ?
[/ot]
 
Stato
Discussione chiusa ad ulteriori risposte.