Leser: 22
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 @all = (<DATA>); my @all_cp = @all; foreach my $row (@all) { chomp $row; my @target_line = split ' ', $row; print "\nTarget:\t\t$row\n"; foreach my $line (@all_cp) { chomp $line; my @line_to_comp = split ' ', $line; next if $line_to_comp[0] eq $target_line[0]; # do not compare the same line with each other my ($digits, $dashes) = (0,0); for my $index ( 1 .. $#target_line ) { # ignore column 0 # both are digits and they are equal if ( 2 == grep( { /^\d/ } $target_line[$index], $line_to_comp[$index] ) and $target_line[$index] == $line_to_comp[$index] ) { $digits++; } elsif ( $line_to_comp[$index] eq "-" ) { $dashes++; } else { last; } } if ( $dashes != (scalar @target_line - 1) and ($digits + $dashes) == (scalar @target_line - 1)) { # -1 because of column 0 print "Subset:\t\t$line\n"; } else { # print "Not a subset:\t$line\n"; } } } __DATA__ row18 - 0 0 1 0 0 - - - 0 0 - - - - - - - - - - - - - - - - row19 - 0 0 0 - - - - 1 0 0 - - - - - - - - - - - - - - - - row20 - 0 0 - - - - 1 - 0 0 - - - - - - - - - - - - - - - - row21 - 0 0 - - - - - - 0 0 - - - - 1 0 0 - - - - - - - - - row22 - 0 0 - - - - - - 0 0 - - - - 0 - - - 1 - - - - - - - row23 - 0 0 - - - - - - 0 0 - - - - - - - - - 1 - - - - - - row24 - 0 0 - - - - - - 0 0 - - - - - - - - - - 1 0 0 - - - row25 - 0 0 - - - - - - 0 0 - - - - - - - - - - 0 - - - 1 - row26 - 0 0 - - - - - - 0 0 - - - - - - - - - - - - - - - 1 row27 - 0 0 - - - - - - 1 0 0 - - - - - - - - - - - - - - - row28 - 0 0 - - - - - - 0 - - - - 1 - - - - - - - - - - - - row29 - 0 0 - - - - - - - - - 1 - - - - - - - - - - - - - - row30 1 0 0 - 1 - - - - 0 0 - - - - - - 1 - - - - - - - - - row31 1 0 0 - 1 - - - - 0 0 - - - - - - - - - - - 1 - - - - row32 1 0 0 - 1 - - - - 0 0 - - - - - - 1 - - - - 1 - - - - row33 1 0 0 - - - 1 - - 0 0 - - - - - - - - - - - - - - - - row34 1 0 0 - - - - - - 0 0 - - - - - - - 1 - - - - - - - - row35 1 0 0 - - - - - - 0 0 - - - - - - - - - - - - - 1 - - row36 1 0 0 - - - - - - 0 0 - - - - - - 1 - - - - 1 - - - - row37 1 0 0 - 1 - - - - - 1 - - - - - - 1 - - - - - - - - - row38 1 0 0 - 1 - - - - - 1 - - - - - - - - - - - 1 - - - - row39 1 0 0 - 1 - - - - - 1 - - - - - - 1 - - - - 1 - - - - row40 1 0 0 - - - 1 - - - 1 - - - - - - - - - - - - - - - - row41 1 0 0 - - - - - - - 1 - - - - - - - 1 - - - - - - - - row42 1 0 0 - - - - - - - 1 - - - - - - - - - - - - - 1 - - row43 1 0 0 - - - - - - - 1 - - - - - - 1 - - - - 1 - - - - row44 1 0 0 - - - - - - - - 1 - 1 - - - - - - - - - - - - - row45 - 1 - - - - - - - 1 0 0 - - - - - - - - - - - - - - - row46 - 1 - - - - - - - 0 - - - - 1 - - - - - - - - - - - - row47 - 1 - - - - - - - - - - 1 - - - - - - - - - - - - - - row48 - - 1 - - - - - - 1 0 0 - - - - - - - - - - - - - - - row49 - - 1 - - - - - - 0 - - - - 1 - - - - - - - - - - - - row50 - - 1 - - - - - - - - - 1 - - - - - - - - - - - - - - row51 - 1 0 - - - - - - - - - 0 - - - - - - - - - - - - - - row52 - 0 1 - - - - - - - - - 0 - - - - - - - - - - - - - - row53 - 1 0 - - - - - - - - - - - 0 - - - - - - - - - - - - row54 - 0 1 - - - - - - - - - - - 0 - - - - - - - - - - - - row55 - 1 0 - - - - - - 0 0 - - - - - - - - - - - - - - - - row56 - 0 1 - - - - - - 0 0 - - - - - - - - - - - - - - - -
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 use strict; use warnings; my %index=(); my $pos=0; while(my $line=<DATA>) { chomp($line); (my $compare=$line)=~s/^.+?\s+//; # EDIT: # zeilen sollen identisch sein... #$compare=~s/\d+/1/g; $compare=~s/\s+//g; push(@{$index{$compare}},[$pos,$line]); $pos++; } # Ausgabe for my $lines (values(%index)) { print "Subsets:\n"; for my $line (@$lines) { print " Line: $line->[0] => $line->[1]\n"; } } __DATA__ row18 - 0 0 1 0 0 - - - 0 0 - - - - - - - - - - - - - - - - row19 - 0 0 0 - - - - 1 0 0 - - - - - - - - - - - - - - - - row20 - 0 0 - - - - 1 - 0 0 - - - - - - - - - - - - - - - - row21 - 0 0 - - - - - - 0 0 - - - - 1 0 0 - - - - - - - - - row22 - 0 0 - - - - - - 0 0 - - - - 0 - - - 1 - - - - - - - row23 - 0 0 - - - - - - 0 0 - - - - - - - - - 1 - - - - - - row24 - 0 0 - - - - - - 0 0 - - - - - - - - - - 1 0 0 - - - row25 - 0 0 - - - - - - 0 0 - - - - - - - - - - 0 - - - 1 - row26 - 0 0 - - - - - - 0 0 - - - - - - - - - - - - - - - 1 row27 - 0 0 - - - - - - 1 0 0 - - - - - - - - - - - - - - - row28 - 0 0 - - - - - - 0 - - - - 1 - - - - - - - - - - - - row29 - 0 0 - - - - - - - - - 1 - - - - - - - - - - - - - - row30 1 0 0 - 1 - - - - 0 0 - - - - - - 1 - - - - - - - - - row31 1 0 0 - 1 - - - - 0 0 - - - - - - - - - - - 1 - - - - row32 1 0 0 - 1 - - - - 0 0 - - - - - - 1 - - - - 1 - - - - row33 1 0 0 - - - 1 - - 0 0 - - - - - - - - - - - - - - - - row34 1 0 0 - - - - - - 0 0 - - - - - - - 1 - - - - - - - - row35 1 0 0 - - - - - - 0 0 - - - - - - - - - - - - - 1 - - row36 1 0 0 - - - - - - 0 0 - - - - - - 1 - - - - 1 - - - - row37 1 0 0 - 1 - - - - - 1 - - - - - - 1 - - - - - - - - - row38 1 0 0 - 1 - - - - - 1 - - - - - - - - - - - 1 - - - - row39 1 0 0 - 1 - - - - - 1 - - - - - - 1 - - - - 1 - - - - row40 1 0 0 - - - 1 - - - 1 - - - - - - - - - - - - - - - - row41 1 0 0 - - - - - - - 1 - - - - - - - 1 - - - - - - - - row42 1 0 0 - - - - - - - 1 - - - - - - - - - - - - - 1 - - row43 1 0 0 - - - - - - - 1 - - - - - - 1 - - - - 1 - - - - row44 1 0 0 - - - - - - - - 1 - 1 - - - - - - - - - - - - - row45 - 1 - - - - - - - 1 0 0 - - - - - - - - - - - - - - - row46 - 1 - - - - - - - 0 - - - - 1 - - - - - - - - - - - - row47 - 1 - - - - - - - - - - 1 - - - - - - - - - - - - - - row48 - - 1 - - - - - - 1 0 0 - - - - - - - - - - - - - - - row49 - - 1 - - - - - - 0 - - - - 1 - - - - - - - - - - - - row50 - - 1 - - - - - - - - - 1 - - - - - - - - - - - - - - row51 - 1 0 - - - - - - - - - 0 - - - - - - - - - - - - - - row52 - 0 1 - - - - - - - - - 0 - - - - - - - - - - - - - - row53 - 1 0 - - - - - - - - - - - 0 - - - - - - - - - - - - row54 - 0 1 - - - - - - - - - - - 0 - - - - - - - - - - - - row55 - 1 0 - - - - - - 0 0 - - - - - - - - - - - - - - - - row56 - 0 1 - - - - - - 0 0 - - - - - - - - - - - - - - - -
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
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @index=(); my $pos=0; while(my $line=<DATA>) { chomp($line); next unless($line); (my $compare=$line)=~s/^.+?\s+//; $compare=~s/\s+$//; push(@index,[$pos,$line,[split(/\s+/,$compare)]]); $pos++; } for my $test (@index) { print "TEST: $test->[1]\n"; for my $comp (@index) { # mindestens ein Zahl next unless( grep{$_ ne '-'}@{$comp->[2]} ); # nicht die selbe Zeile next if($test->[0] == $comp->[0]); my $cnt=0; for my $p (0..$#{$test->[2]}) { my $sval=$test->[2]->[$p]; my $dval=$comp->[2]->[$p]; # verkürzte Bedingung :-) $cnt++ if($dval eq $sval || $dval eq '-'); } print " SUBSET: $comp->[1]\n" if($cnt==@{$test->[2]}) } } __DATA__ row18 - 0 0 1 0 0 - - - 0 0 - - - - - - - - - - - - - - - - row19 - 0 0 0 - - - - 1 0 0 - - - - - - - - - - - - - - - - row20 - 0 0 - - - - 1 - 0 0 - - - - - - - - - - - - - - - - row21 - 0 0 - - - - - - 0 0 - - - - 1 0 0 - - - - - - - - - row22 - 0 0 - - - - - - 0 0 - - - - 0 - - - 1 - - - - - - - row23 - 0 0 - - - - - - 0 0 - - - - - - - - - 1 - - - - - - row24 - 0 0 - - - - - - 0 0 - - - - - - - - - - 1 0 0 - - - row25 - 0 0 - - - - - - 0 0 - - - - - - - - - - 0 - - - 1 - row26 - 0 0 - - - - - - 0 0 - - - - - - - - - - - - - - - 1 row27 - 0 0 - - - - - - 1 0 0 - - - - - - - - - - - - - - - row28 - 0 0 - - - - - - 0 - - - - 1 - - - - - - - - - - - - row29 - 0 0 - - - - - - - - - 1 - - - - - - - - - - - - - - row30 1 0 0 - 1 - - - - 0 0 - - - - - - 1 - - - - - - - - - row31 1 0 0 - 1 - - - - 0 0 - - - - - - - - - - - 1 - - - - row32 1 0 0 - 1 - - - - 0 0 - - - - - - 1 - - - - 1 - - - - row33 1 0 0 - - - 1 - - 0 0 - - - - - - - - - - - - - - - - row34 1 0 0 - - - - - - 0 0 - - - - - - - 1 - - - - - - - - row35 1 0 0 - - - - - - 0 0 - - - - - - - - - - - - - 1 - - row36 1 0 0 - - - - - - 0 0 - - - - - - 1 - - - - 1 - - - - row37 1 0 0 - 1 - - - - - 1 - - - - - - 1 - - - - - - - - - row38 1 0 0 - 1 - - - - - 1 - - - - - - - - - - - 1 - - - - row39 1 0 0 - 1 - - - - - 1 - - - - - - 1 - - - - 1 - - - - row40 1 0 0 - - - 1 - - - 1 - - - - - - - - - - - - - - - - row41 1 0 0 - - - - - - - 1 - - - - - - - 1 - - - - - - - - row42 1 0 0 - - - - - - - 1 - - - - - - - - - - - - - 1 - - row43 1 0 0 - - - - - - - 1 - - - - - - 1 - - - - 1 - - - - row44 1 0 0 - - - - - - - - 1 - 1 - - - - - - - - - - - - - row45 - 1 - - - - - - - 1 0 0 - - - - - - - - - - - - - - - row46 - 1 - - - - - - - 0 - - - - 1 - - - - - - - - - - - - row47 - 1 - - - - - - - - - - 1 - - - - - - - - - - - - - - row48 - - 1 - - - - - - 1 0 0 - - - - - - - - - - - - - - - row49 - - 1 - - - - - - 0 - - - - 1 - - - - - - - - - - - - row50 - - 1 - - - - - - - - - 1 - - - - - - - - - - - - - - row51 - 1 0 - - - - - - - - - 0 - - - - - - - - - - - - - - row52 - 0 1 - - - - - - - - - 0 - - - - - - - - - - - - - - row53 - 1 0 - - - - - - - - - - - 0 - - - - - - - - - - - - row54 - 0 1 - - - - - - - - - - - 0 - - - - - - - - - - - - row55 - 1 0 - - - - - - 0 0 - - - - - - - - - - - - - - - - row56 - 0 1 - - - - - - 0 0 - - - - - - - - - - - - - - - -
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
use strict; use warnings; use Data::Dumper; sub bin2num($) { my $v = 0; foreach my $b (split(//,shift)) { $v <<= 1; $v += $b; } $v; } sub prepare_line($) { my $line = shift; chomp $line; my $l = $line; $l =~ s/^row(\d+)\s+//; $l =~ s/\s+//g; # Leerzeichen entfernen; my $mask = $l; $mask =~ tr/-01/011/; $mask = bin2num($mask); # Ziffer => bit gesetzt my $pattern = $l; $pattern =~ tr/-01/001/; $pattern = bin2num($pattern); # '1' => bit gesetzt return { line => $line, mask => $mask,pattern => $pattern}; } my @all = map {prepare_line($_)} (<DATA>); foreach my $target (@all) { print "\nTarget:\t\t",$target->{line},"\n"; foreach my $comp (@all) { next if $target->{line} eq $comp->{line}; # gleiche Zeile # numerischer Vergleich der in $comp gesetzten Ziffern, erst '0' dann '1' if (($comp->{mask} & $target->{mask} & ~$target->{pattern}) == ($comp->{mask} & ~$comp->{pattern}) and ($comp->{mask} & $target->{pattern}) == ($comp->{mask} & $comp->{pattern})) { print "Subset:\t\t",$comp->{line},"\n"; } } }
2010-10-19T19:06:34 topegIrgendwo komm eich mit den Vergleichsbedingungen in deinem Code nicht klar.
1 2 3
print "Subset:\t\t",$comp->{line},"\n" unless ($comp->{mask} & ($target->{pattern} ^ $comp->{pattern})) || ($comp->{mask} & ~$target->{mask});
bin2num($) { return pack("B*",shift) }
1 2 3 4 5 6 7
bin2num($) { my $bin=shift; # gültige 32 Bit Zahl daraus machen. $bin=( '0'x( 32-length $bin ) ).$bin; return unpack("L", pack("B*",$bin)); }
2010-10-19T21:47:52 topegÜbrigens das Binärkodieren geht einfacher:
1 2 3 4 5
sub bin2num($) { my $n = 0; ($n <<= 1) += $_ foreach split(//,shift); $n; }
2010-10-20T08:55:40 pqfrag doch einfach =)
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
sub prepare_line($) { my $line = shift; chomp $line; my $l = $line; $l =~ s/^row\d+\s+//; $l =~ s/\s+//g; # Leerzeichen entfernen; $l =~ tr/-/ /; # '-' durch ' ' ersetzen, wg. Bitfilter my $mask = $l; $mask =~ tr/0/1/; # alle Ziffern => '1' return { line => $line, mask => $mask,pattern => $l}; } my @all = map {prepare_line($_)} (<DATA>); foreach my $target (@all) { print "\nTarget:\t\t",$target->{line},"\n"; foreach my $comp (@all) { next if $target->{line} eq $comp->{line}; # gleiche Zeile print "Subset:\t\t",$comp->{line},"\n" if ($target->{pattern} & $comp->{mask}) eq $comp->{pattern}, } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#!/usr/bin/perl use strict; use warnings; sub bin2num($) { my $bin=shift; # gültige 32 Bit Zahl daraus machen. $bin=( '0'x( 32-length $bin ) ).$bin; return unpack("N", pack("B*",$bin)); } sub num2bin($) { unpack("B*",pack("N",shift)); } my $bin=num2bin(22); print $bin."->".bin2num($bin)."\n";