|< 1 2 >| | 15 Einträge, 2 Seiten |
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";
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') );
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' ]) );
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 |