Schrift
[thread]8465[/thread]

Buchstaben generieren: Bruteforce-aehnlich (Seite 2)



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
topeg
 2006-11-04 21:09
#71322 #71322
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Nun das ganze mal von "Hand" :-)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/perl
use strict;
use warnings;

my ($stellen,@elemente)=@ARGV;
die "Aufruf:\n $0 stellen element_a [element_b [element_c [ ...]]]\n" if(@elemente==0 || $stellen!~/^\d+$/);

sub permutation($@)
{
my ($st,@arr) = @_;
my @ret=();
my @cnt=map{$_=0}(1..$st);
ende:while(1)
{
push(@ret,join('',map{$_=$arr[$_]}@{[@cnt]}));
for my $i (0..$st-1)
{
if($cnt[$i]<@arr-1)
{
$cnt[$i]++;
last;
}
else
{
$cnt[$i]=0;
last(ende) unless( exists($cnt[$i+1]) );
}
}
}
return @ret;
}

print "Elemente: ".join('; ', @elemente)."\n";
print "Stellen: $stellen\n";
print "Variantionen:\n";
print join("\n",&permutation($stellen,@elemente)),"\n";
docsnyder
 2006-11-06 14:04
#71323 #71323
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Oder einfach so (warum immer so lange?):
Code: (dl )
1
2
3
4
5
6
7
sub mkPerms {
my($n, @arr) = @_;

return($n ? map { my $item = $_; map { $item . $_ } mkPerms($n-1, @arr) } @arr : "");
}

print $_ . "\n" for ( mkPerms(3, 'A'..'C') );

;o)

Gruß, Doc\n\n

<!--EDIT|docsnyder|1162815982-->
Taulmarill
 2006-11-06 17:38
#71324 #71324
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
spass mit rekursion, sehr schön gemacht, doc. aber ich würde die liste @arr als referenz übergeben.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
docsnyder
 2006-11-06 17:47
#71325 #71325
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Taulmarill

Danke für's Kompli! Natürlich hast Du Recht, sowas sollte man mit Referenzen machen:

Code: (dl )
1
2
3
4
5
6
7
sub mkPerms {
my($n, $arr) = @_;

return($n ? map { my $item=$_; map { $item . $_ } mkPerms($n-1, $arr) } @$arr : "");
}

print $_ . "\n" for ( mkPerms(3, [ 'A'..'C' ]) );


Gruß, Doc
Ronnie
 2006-11-14 17:59
#71326 #71326
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Hier noch eine etwas aufgepumpte OOPerl Variante:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/perl

use strict;
use warnings;

package Wheel;

sub new {
my $class = shift;
my @items = @_;
my $self = {
items => \@items,
position => 0,
notch => [],
};
bless $self, $class;
return $self;
}

sub on_notch {
my $self = shift;
my $call = shift || sub { print "Notch!\n" };
push @{$self->{notch}}, $call;
}

sub succ {
my $self = shift;
if ($self->{position}++ < $#{$self->{items}}) {
$self->{position} and return $self->{items}->[$self->{position}];
} else {
$self->{position} = 0;
$_->() for @{$self->{notch}};
return $self->{items}->[$self->{position}];
}

}

sub to_s {
my $self = shift;
return $self->{items}->[$self->{position}];
}

package Odometer;
use Data::Dumper;

my $DONE = 0;

sub new {
my $class = shift;
my $self = [];
return bless $self, $class;
}

sub add_wheel {
my $self = shift;
my @items = @_;
my $w = Wheel->new(@items);
push @$self, $w;
$self->[$#$self-1]->on_notch(sub {$w->succ}) if $#$self > 0;
}

sub succ {
my $self = shift;
my $temp = $self->to_s;
$self->[0]->succ;

if ($DONE == 2) {
return undef;
} else {
$DONE++ if $DONE;
return $temp;
}
}

sub to_s {
my $self = shift;
return join ' ', map { $_->to_s } reverse @$self;
}

sub add_termination {
my $self = shift;
$self->[-1]->on_notch( sub { $DONE = 1} );
}

package main;

my $o = Odometer->new;
#$o->add_wheel(qw/red green blue yellow/);
$o->add_wheel(1, 3, 5) for (1..3);
#$o->add_wheel(2, 4);
$o->add_termination;
while (my $cur = $o->succ) {
print $cur . "\n";
};
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2006-11-03 00:46.