Thread RDW #2 - Rätsel der Woche Nr. 2 (155 answers)
Opened by renee at 2004-07-16 12:08

Crian
 2004-07-19 12:36
#84452 #84452
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Wenn ich es richtig sehe, sind die drei Tage jetzt gerade um. Ich werde deshalb die Lösungen hier posten und später auch auf die Wiki-Seite stellen (wenn ich sie dann mal hochgeladen habe, wird heute bestimmt nichts, siehe oben).

Die Lösungen poste ich nach Datum sortiert nach dem alter meiner Dateien, nicht böse sein, wenn das nicht mit der Reihenfolge des Abschickens übereinstimmt.

Betterworld:

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
#!/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";



Ronnie:

Code: (dl )
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;


Renee:

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
#! /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;
}


ptk:

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;

# 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;
}
}
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite

View full thread RDW #2 - Rätsel der Woche Nr. 2