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
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: Perl Solution to Spotify Programming Puzzle
by repellent (Priest) on Aug 28, 2011 at 08:42 UTC | |
by BrowserUk (Patriarch) on Aug 28, 2011 at 12:00 UTC | |
by repellent (Priest) on Aug 28, 2011 at 18:23 UTC | |
by BrowserUk (Patriarch) on Aug 28, 2011 at 18:49 UTC |