|< 1 ... 5 6 7 8 9 10 11 ... 16 >| | 156 Einträge, 16 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
37
38
39
40
41
42
43
44
#!/usr/bin/perl
# Dieses Skript gibt die Potenzmenge der Liste seiner Parameter aus.
# Loesung von betterworld / perl-community.de
require 5.8.1; # Wegen (??{})
use strict;
use warnings;
use locale; # für [:print:]
use re 'eval';
my %hash;
sub pushit{
my @ar = grep {defined and length } map {eval '$'.$_} 1..@ARGV;
my $cute_list = join ",", @ar;
# An alle Tester: Gibt das bei Euch auch einen Segfault, wenn man diese
# Zeile durch $cute_list =~ s/\n//g ersetzt?
# Und wenn ich beides nehme, passieren noch seltsamere Sachen...
$cute_list =~ y/\n//d;
$hash{$cute_list} = undef if length $cute_list;
return qr/^.^/; # Das sollte nie matchen --> Backtracing
}
my $A = (join "\n", @ARGV)."\n";
my $re = join '(?:^.*\n)*', map {'(^.*\n)?'} 1..@ARGV;
# Hier passiert die eigentliche Arbeit
$A =~ m/$re(??{pushit()})/m;
print "{";
if ("\370" =~ /[[:print:]]/) {
print "\370";
} else {
print "{}";
}
# Hier benutze ich ";" statt ",", damit man durch Zaehlen der Semikola in der
# Ausgabe leicht ueberpruefen kann, dass es 2**n Elemente sind.
print "; {$_}" for sort keys %hash;
print "}\n";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @bulk = (1, 2, 3);
my @mask = map {[split '', $_]} glob "{0,1}" x @bulk;
my @resultset;
foreach my $row (@mask) {
push @resultset, [grep {$_!=0} map {$bulk[$_] * $row->[$_]} (0..$#bulk)];
}
print Dumper \@resultset;
exit;
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
#! /usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @array = qw(1 2 3 4 5);
my $potenz = P(\@array);
print Dumper($potenz);
sub P{
my ($arrayref) = @_;
my $potenzmenge = [];
my $base = [[]];
my $bool = 1;
my $length = 0;
while($bool){
push(@$potenzmenge,@$base);
$base = calc_elems($base,$arrayref,$length);
$length++;
$bool = 0 if($length > scalar(@$arrayref))
}
return $potenzmenge;
}
sub calc_elems{
my ($base,$arrayref,$length) = @_;
my @array = @{$arrayref};
my @new_elems = ();
foreach my $base_elem(@$base){
foreach my $index($length..(scalar(@array) - 1)){
my @tmp_elem = @{$base_elem};
last if($tmp_elem[-1] && ($tmp_elem[-1] >= ($array[-1])) &&
$length > 0);
next if($tmp_elem[-1] && (($tmp_elem[-1] == $array[$index]) ||
$tmp_elem[-1] > $array[$index]));
push(@tmp_elem,$array[$index]);
push(@new_elems,[@tmp_elem]);
}
}
return \@new_elems;
}
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;
# Eingabe
my @array = 1..3;
my %res;
oneless@array;
# Formatierung der Ausgabe
# Key als Array umschreiben
my @res;
whilemy$k = each %res {
push @res, split /,/, $k;
}
# Ergebnisarray schoener sortieren
@res = sort {
my $r = @$a = @$b;
if $r == 0 {
join,, @$a cmp join,, @$b;
} else {
$r;
}
} @res;
require DataDumper;
print DataDumper-new\<@res,'res'-Indent0-Dump, \<n;
sub oneless {
my @array = @_;
$res{ join,,@array } = 1;
return if !@array;
for my $i 0 .. $#array {
onelessmap { $array$_ } 0 .. $i-1, $i+1 .. $#array;
}
}
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
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $A = [ 'a', 'b', 'c', 'd', 'e' ];
my $P = P($A);
print "A = {", join(', ', @$A), "}\n";
print "P(A) = {\n";
for my $p (@$P) {
print " {", join(', ', @$p), "},\n";
}
print " }\n";
sub P {
my ($A) = @_;
my $P = [];
for my $anzahl_elemente (0 .. scalar @$A) {
push @$P, teilmengen($A, $anzahl_elemente);
}
return $P;
}
sub teilmengen {
my ($A, $n) = @_;
my @T = ();
my $N = scalar @$A;
if (0 == $n) {
push @T, [];
}
else {
# $n Elemente aus $N Elementen auswaehlen:
my @Mengen; # Menge mit Nummermengen
for my $element (1..$n) {
my @M;
# Moegliche Nummern fuer Element $element berechnen:
for my $nummer ($element..$N-($n-$element)) {
push @M, $nummer-1;
}
# Bei einelementigen Mengen Mengen mit nur diesem Element
# erzeugen:
unless (@Mengen) {
push @Mengen, [ $_ ] for @M
}
# Anderenfalls Jede bisherige Nummernmenge aus @Mengen
# vervielfachen und an jede Kopie eine der neuen
# moeglichen Nummern anhaengen:
else {
my @TM = @Mengen;
@Mengen = ();
for my $tm (@TM) {
for my $m (@M) {
unless (grep { $_ >= $m } @$tm) {
push @Mengen, [ @$tm, $m ];
}
}
}
}
}
# Umsetzen der Nummern auf die Elemente der Menge:
for my $menge (@Mengen) {
push @T, [ map { $_ = $A->[$_] } @$menge ];
}
}
return @T;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/local/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @maengeA = qw/1 2 3/;
print Dumper funcP(@maengeA);
sub funcP {
return () unless @_;
return ( [ $_[0] ] ) unless @_ >= 1;
map {
my $first = shift @_;
[$first], map { [ $first, @$_ ] } funcP(@_)
} @_;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
sub potset {
my @set = @{shift(@_)};
if (@set == 0) {
return [[]];
}
else {
my @ps = @{potset([@set[1..$#set]])};
return [(map { my @l = @$_; push @l, $set[0]; [@l]; } @ps), @ps];
}
}
print Dumper(potset(\@ARGV));
1
2
3
4
5
(define (potset s)
(if (eqv? s '())
'(())
(let ((ls (potset (cdr s))))
(append ls (map (lambda (l) (cons (car s) l)) ls)))))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
print Dumper P(\@ARGV);
sub P {
my($m,$e,$p)=(@_,[],[]);
!@{$m}and push@{$p},$e or
P(@_=@{$m}and pop and[@_],[@{$e}],$p)and
P(@_=@{$m}and pop and[@_],[sort@{$e},$m->[-1]],$p);
[sort{@{$a}<=>@{$b}}@{$p}]
}
1
2
3
4
5
6
7
8
9
10
#!perl
use strict;
use warnings;
use Data::Dumper;
print Dumper [sort { @$a <=> @$b } &p(@ARGV ? @ARGV : (0,'',undef))];
sub p { my @p = ([]); push @p, map [@$_,$_[0]], @p and shift while @_; @p }
#sub p { @_ || return []; my $e = shift; p(@_),map [@$_,$e], p(@_) }
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
### Eingabe-Menge ausgeben
print "Eingabe-Menge: {"
set S0, ""
set I4, 0
set I5, P5
_print_em:
inc I4
eq I4, I5, _print_em_ende
set S5, P5[I4]
print S0
set S0, ","
print S5
bsr _print_em
_print_em_ende:
print "}\n"
### Programm initialisieren
new P1, .PerlArray # Potenzmenge
new P2, .PerlArray # wird initislisiert mit der "leeren Menge" als einziges Element
set P1[0], P2
### Potenzmenge berechnen
set I4, 0 # aktueller Index für P5
set I5, P5 # Elemente in P5
_p: # while
inc I4
eq I4, I5, _p_ende
set P0, P5[I4] # aktuelles Element der Eingabe-Menge
set I0, 0 # aktueller Index für P1
set I1, P1 # Elemente in P1
_p_map: # map
set P2, P1[I0]
clone P3, P2 # aktuelle Teilmenge aus P1 kopieren,
push P3, P0 # um aktuelles Element der Eingabe-Menge erweitern
push P1, P3 # und wiederum an P1 anhängen
inc I0
ne I0, I1, _p_map
bsr _p
_p_ende:
### Potenzmenge ausgeben
print "Potenzmenge: {"
set S0, ""
set I0, 0
set I1, P1
_print_pm:
print S0
set S0, ","
set P8, P1[I0]
print "{"
set S1, ""
set I7, 0
set I8, P8
unless I8, _print_pm_tm_ende
_print_pm_tm:
set S8, P8[I7]
print S1
set S1, ","
print S8
inc I7
ne I7, I8, _print_pm_tm
_print_pm_tm_ende:
print "}"
inc I0
ne I0, I1, _print_pm
print "}\n"
### Programm beenden
end
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
#!/usr/bin/perl
# RDW 2
# 18.07.2004
# author: pq
# usage: skript.pl 1 2 3 4 ...
package main;
use strict;
use warnings;
my @a = @ARGV;
my @res = p(@a);
print "Die Potenzmenge von (@a):\n";
for (sort {
@$a <=> @$b
} @res) {
print "(@$_)\n";
}
sub p {
my @m = @_;
unless (@m) {
# die Potenzmenge der leeren Menge ist die leere Menge
return [];
}
else {
my $el = shift @m;
# um die Potenzmenge einer Menge M herauszufinden,
# nimmt man sich ein Element e und bildet die Potenzmenge PR
# der Restmenge R
# jede Untermenge U in PR verdoppelt man und fügt
# dem Duplikat das Element e hinzu
my @p = map {([@$_, $el], $_)} p(@m);
return @p;
}
}
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
#!/usr/bin/perl
# Autor: Crian
# RDW 02 - Berechnung der Potenzmenge einer Menge
# Variante 2
use strict;
use warnings;
my $A = [ 'a', 'b', 'c', 'd', 'e' ];
my $P = P($A);
print_A_und_P($A, $P);
sub print_A_und_P {
my ($A, $P) = @_;
print "A = {", join(', ', @$A), "}\n";
print "P(A) = {\n";
for my $p (@$P) {
print " {", join(', ', @$p), "},\n";
}
print " }\n";
}
sub P {
my ($A) = @_;
my $P = [[]];
my $N = scalar @$A;
# In jedem Schleifendurchlauf der folgenden for-Schleife wird
# die Menge der $n elementigen Mengen aus $N Elementen gebildet:
for my $n (1..$N) {
# $n Elemente aus $N Elementen auswaehlen:
my @Mengen; # Menge mit Nummermengen
for my $element (1..$n) {
# Moegliche Nummern fuer Element $element belegen:
my @M = $element-1 .. $N-($n-$element)-1;
# Bei einelementigen Mengen: Mengen mit nur diesem Element
# erzeugen:
unless (@Mengen) {
push @Mengen, [ $_ ] for @M;
}
# Anderenfalls: Jede bisherige Nummernmenge aus @Mengen
# vervielfachen und an jede Kopie eine der neuen
# moeglichen Nummern anhaengen:
else {
my @TM = @Mengen;
@Mengen = ();
for my $tm (@TM) {
for my $m (@M) {
unless (grep { $_ >= $m } @$tm) {
push @Mengen, [ @$tm, $m ];
}
}
}
}
}
# Umsetzen der Nummern auf die Elemente der Menge
# und Abspeichern der sich ergebenden Mengen:
for my $menge (@Mengen) {
push @$P, [ map { $_ = $A->[$_] } @$menge ];
}
}
return $P;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/local/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @mengeA = qw/1 2 3/;
print Dumper funcP(@mengeA);
sub funcP {
return ( [], rec(@_) );
}
sub rec {
return () unless @_;
map {
my $first = shift @_;
[$first], map { [ $first, @$_ ] } rec(@_);
} @_;
}
sub P{sub _{@_?map{my$f=pop@_;[$f],map{[$f,@$_]}_(@_)}@_:()};[],_(@_)}
for$a(1..2**@ARGV){print"{@ARGV[grep$a&2**$_,0..@ARGV]}"}
|< 1 ... 5 6 7 8 9 10 11 ... 16 >| | 156 Einträge, 16 Seiten |