in reply to Perl Solution to Spotify Programming Puzzle

NOTE: The solution below is incorrect. Please refer to the latest attempt instead.

Here's my shot at it:
use List::Util qw(reduce); my (@teams, %emp); my $n = <>; for my $i (0 .. $n - 1) { my ($e1, $e2) = (split ' ', scalar <>); push @{ $emp{$e1} }, $i; push @{ $emp{$e2} }, $i; $teams[$i] = 1; } my @picks; sub pick { my $pick = shift; push @picks, $pick; $teams[$_] = 0 for @{ $emp{$pick} }; delete $emp{$pick}; } my @favorites = (1002, 2001); $emp{$_} and pick($_) for @favorites; while (1) { my $max = reduce { $a->[1] > $b->[1] ? $a : $b } map [ $_ => scalar(grep $teams[$_], @{ $emp{$_} }) ], keys %emp; my ($winner, $cnt) = @{ $max }; last if $cnt == 0; pick($winner); } local $\ = "\n"; print scalar(@picks); print for @picks;

Update: Now with favorites!

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

    I think you're over favouring. Fed this set:

    10 1001 2002 1003 2002 1003 2005 1003 2005 1005 2002 1005 2002 1008 2002 1009 2005 1010 2002 1010 2002

    Yours outputs:

    3 1009 2002 1003

    where this is possible and (to my interpretation of the rules) therefore better:

    2 2002 2005

    Mine's broken in the reverse way in that it ignores (actually, doesn't even consider), equally valid solutions that would use the favoured employee.


    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.
      Thanks :) I attempted again given what you said, also considering the eye-opener that argggh pointed out. I tried hard using some comparison heuristic approach before resigning to the fact that this is really a combinatorial problem.