in reply to Perl Solution to Spotify Programming Puzzle

Always choosing the best-connected remaining node isn't always the best strategy. Consider the following problem set:
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
Draw it out as a graph, and it's obvious that the least number of delegates required is 5.

Replies are listed 'Best First'.
Re^2: Perl Solution to Spotify Programming Puzzle
by BrowserUk (Patriarch) on Aug 26, 2011 at 12:58 UTC

    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.
      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.
Re^2: Perl Solution to Spotify Programming Puzzle
by BrowserUk (Patriarch) on Aug 26, 2011 at 10:53 UTC

    Nice example!


    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.
Re^2: Perl Solution to Spotify Programming Puzzle
by ::rml:: (Sexton) on Aug 27, 2011 at 16:48 UTC

    You're right, thanks. Rewriting...

    -- C-x C-c