Newsgroup: it.comp.lang.perl
Titolo: Generazione stringhe

Ciao a tutti
c'è un metodo semplice per generare tutte le stringhe a partire da una
radice? (chiaramente fino ad una stringa di lunghezza specificata).
Possibilmente vorrei non utilizzare classi già fatte.
Esempio:
radice = aba
lunghezza max = 5
abaa
abab
abac
.
.
abaz
abaaa
abaab
.
.
abaaz
ababa
.
.
abaza
.
.
e così via fino a 
abazz
Grazie

 Possibilmente vorrei non utilizzare classi già fatte.
So che non vuoi usare moduli già fatti, ma ti consiglio cmq di dare
un'occhiata a Math::Combinatorics [1]. Io ti consiglio di usarlo, ma la
lettura del suo codice può essere un punto di partenza per sviluppare un
algoritmo tuo.
La butto lì, penso si potrebbe fare anhce in modo ricorsivo. Stasera quando
arrivo a casa prendo il mio fido HOP e gli do' una letta.
HTH,
[1] 
http://search.cpan.org/~allenday/Math-Combinatorics-0.05/
-- 
.           .  | 
| , ,-. ,-. |  | "In girum imus nocte et consumimur igni."
|<  |   ,-| |  |                               -- Virgilio
' ` '   `-^ `' |

 print $string; 
uhm.. e se volessi includere i simboli?

 radice? (chiaramente fino ad una stringa di lunghezza specificata).
Metodo ricorsivo: definisci una funzione F che, data una stringa R e un
insieme I di N caratteri, produce le N stringhe composte ciascuna da R
seguita da uno degli elementi I e passa ciascuna di queste stringhe a F
come argomento R.
Max

ehm.. ci ho capito poco.. un esempio no?


 sub F
 {
 my( $R, $I, $max_i, $i ) = @_;
 return if $i == $max_i;
 for my $c ( @$I )
 {
  my $s = $R . $c;
  print $s, "\n";
  F( $s, $I, $max_i, $i+1 );
 }
 }
 my $max_len = 3;
 my $radix = "abc";
 F( $radix, , [ map { chr } ( ord('a')..ord('z') ) ] , $max_len );
MM

 arrivo a casa prendo il mio fido HOP e gli do' una letta.
Ecco la mia soluzione in modo ricorsivo:
---8<---8<---8<---8<---8<---8<---8<---8<---
#!/usr/bin/perl -w
use strict;
my $len = 7;
my $root = "abc";
my @chars = ('a' ... 'z');
stampa_stringhe( $len - length($root), $root );
sub stampa_stringhe {
  my( $len, $root ) = @_;
  if( $len == 0 ) { print $root ."\n"; return; }
 
  foreach( @chars ) {
    my $tmp = $root . $_;
    stampa_stringhe( $len - 1, $tmp );
  }
}
---8<---8<---8<---8<---8<---8<---8<---8<---
Non č molto diversa da quella proposta da MaxM, cmq, forse leggermente
piů perlish.
Commenti e domande al solito ben accetti.
Saluti,
-- 
.           .  |"in girum imus nocte et consumimur igni"
| , ,-. ,-. |  |                             -- Virgilio
|<  |   ,-| |  |
' ` '   `-^ `' |<uggc://jjj.gurqvenpfrn.bet>

Grazie Max M. era quello che cercavo..
kral il tuo script è molto intuitivo però non è esattamente quello
che cercavo in quanto genera stringhe tutte di lunghezza $len mentre io
volevo stringhe di massima lunghezza $len quindi anche di un
carattere..
Grazie a tutti... ciao

 carattere..
In effetti, rileggendo il tuo post mi sono accorto di aver inteso male. Cmq
basta aggiungere giusto _un_ print al mio script per fare esattamente
quello che volevi.
Tanto per curiosità, a te interessa imparare il Perl?
Saluti,


se posso evitare evito :-) lo script mi serve per un casino che ho
fatto sul server ma per il momento non mi interessa




ma io ho detto per il momento non mi interessa.. il sito che gestisco
è completamente in java.. i cgi non li uso perchè non mi servono..
non vedo perchè imparare un altro linguaggio.. (che tra l'altro potrei
imparare in poco tempo).. ah.. ho fatto un contatore visite in perl ;-)