in reply to Re: Perl Solution to Spotify Programming Puzzle
in thread Perl Solution to Spotify Programming Puzzle

Attempt 3:

#! perl -slw use strict; use Algorithm::Combinatorics qw[ combinations ]; my $favourite = 1009; my $n = <>; my %pairings; push( @{ $pairings{ $_->[0] } }, $_->[1] ), push( @{ $pairings{ $_->[1] } }, $_->[0] ), while @{ $_ = [split ' ', <> ] }; my @ids = keys %pairings; my %idPos; @idPos{ @ids } = 0 .. @ids; my %posId; @posId{ values %idPos } = keys %idPos; my @masks; for my $id ( @ids ) { $masks[ $idPos{ $id } ] = ''; vec( $masks[ $idPos{ $id } ], $idPos{ $id }, 1 ) = 1; vec( $masks[ $idPos{ $id } ], $idPos{ $_ }, 1 ) = 1 for @{ $pairings{ $id } }; } my @hits; for my $k ( 1 .. $n ) { my $iter = combinations( [0 .. $#ids], $k ); while( my $c = $iter->next ) { my $ored = ''; $ored |= $masks[ $_ ] for @$c; my $count = unpack '%32b*', $ored; push @hits, [ $k, @$c ] if $count >= @ids; } last if @hits; } if( @hits > 1 ) { @hits = sort{ $a->[0] <=> $b->[0] } @hits; my $min = $hits[0][0]; my $i = $#hits; --$i while $hits[ $i ][0] > $min; $#hits = $i; if( @hits > 1 ) { my $first = $hits[ 0 ]; @hits = grep { scalar grep{ $posId{ $_ } == $favourite; } @$_[ 0 .. $#{ $_ } ]; } @hits; @hits = @hits >= 1 ? $hits[ 0 ] : $first; } } print @{ $hits[0] } -1; print $posId{ $_ } for @{ $hits[0] }[ 1 .. $#{ $hits[ 0 ] } ];

A run:

C:\test>Bilateral2.pl 20 1001 2000 1002 2000 1009 2000 1011 2010 1012 2010 1013 2010 1021 2020 1022 2020 1023 2020 1031 2030 1032 2030 1033 2030 1041 2040 1042 2040 1043 2040 1100 2000 1100 2010 1100 2020 1100 2030 1100 2040 ^Z 5 2020 2030 2000 2010 2040

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^3: Perl Solution to Spotify Programming Puzzle
by repellent (Priest) on Aug 28, 2011 at 08:42 UTC
    Actual:
    > Bilateral2.pl 7 71 34 71 1001 72 1002 73 1003 1001 2000 1002 2000 1003 2000 ^D 3 1002 71 1003

    Expected:
    4 1001 1002 1003 71 or 34

      Sorry, but I think you are wrong here and that my actual solution is correct.

      / 1001 - 71 - 34 2000 - 1002 - 72 \ 1003 - 73

      If you have 1003, you don't need 73 or 2000.

      If you have 1002, you don't need 72 (or 2000).

      If you have 71, you don't need 34 or 1001.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        From my interpretation of the problem, we need a representative from each project:

          The situation is that each of the many but small projects is handled by a two-person team ...

          However, money is tight and a new policy has been created: the CEO wants at least one person from each project, ...

        Given the input, Bilateral2.pl hasn't considered project [1001 2000]. The output has no representative from that team. (The output did include members that worked with team [1001 2000] though).