logo contest preliminary result

Hi, Thanks to Kalin who did the initial tallies and Jason Hise who wrote the IRV tallying program, we have a winner: Simeon Nasilowski, entry number 67. The winning variation is 67b. Unless there are some more objections, or if someone can spot a bug in Jason Hise's program, we have a winner. Attached here is Jason's IRV program and the input file. I'd like to invite boosters to go check it out. Alas, it was noted that there are probably trademark problems with the winning logo. If entry 67 gets eliminated due to non compliance with the contest rule: "The logo must be free of any copyright or other intellectual property claims", then the winner will have to be 75: Zoltan "cad" Juhasz, who placed second in the tallies. Regards, -- Joel de Guzman http://www.boost-consulting.com http://spirit.sf.net #include <string> #include <vector> #include <list> #include <map> #include <iostream> using namespace std; int main ( ) { string s; list < string > vote; vector < list < string > > votes; map < string, size_t > candidates; while ( true ) { getline ( cin, s ); if ( cin.eof ( ) ) { if ( !vote.empty ( ) ) votes.push_back ( vote ); break; } if ( s == "vote:" ) { if ( !vote.empty ( ) ) { votes.push_back ( vote ); vote.clear ( ); } } else { candidates.insert ( map < string, size_t >::value_type ( s, 0 ) ); vote.push_back ( s ); } } bool winner = false; size_t min_votes; map < string, size_t >::iterator c_iter, c_next; vector < list < string > >::iterator vl_iter; while ( !winner ) { c_iter = candidates.begin ( ); while ( c_iter != candidates.end ( ) ) { cout << "clearing votes for " << c_iter->first << endl; c_iter->second = 0; ++c_iter; } vl_iter = votes.begin ( ); while ( vl_iter != votes.end ( ) ) { list < string >::iterator v_iter ( vl_iter->begin ( ) ); while ( v_iter != vl_iter->end ( ) ) { c_iter = candidates.find ( *v_iter ); if ( c_iter != candidates.end ( ) ) { ++( c_iter->second ); break; } ++v_iter; } ++vl_iter; } c_iter = candidates.begin ( ); min_votes = c_iter->second; winner = true; while ( c_iter != candidates.end ( ) ) { cout << c_iter->first << " has a total of " << c_iter->second << " votes" << endl; if ( c_iter->second != min_votes ) { winner = false; } if ( c_iter->second < min_votes ) { min_votes = c_iter->second; } ++c_iter; } if ( winner ) { if ( candidates.size ( ) > 1 ) { cout << endl << "TIE, WINNERS WERE:" << endl; } else { cout << endl << "WINNER:" << endl; } } c_iter = candidates.begin ( ); while ( c_iter != candidates.end ( ) ) { c_next = c_iter; ++c_next; if ( winner ) { cout << c_iter->first << endl; } else if ( c_iter->second == min_votes ) { cout << c_iter->first << " has been removed from the running" << endl; candidates.erase ( c_iter ); } c_iter = c_next; } } return 0; } vote: 87 39 50 67 74 vote: 87 39 50 67 74 vote: 75 92 98 52 67 vote: 61 98 92 21 29 vote: 92 38 18 39 67 vote: 50 61 86 95 21 vote: 37 37 37 37 37 vote: 38 39 75 1 44 vote: 67 83 75 39 88 vote: 18 60 67 52 75 vote: 83 52 67 68 18 vote: 67 17 21 83 92 vote: 50 vote: 50 50 7 88 24 vote: 83 38 75 5 17 vote: 83 38 75 5 17 vote: 67 92 69 74 20 vote: 50 70 27 38 49 vote: 25 68 43 17 69 vote: 38 67 52 75 83 vote: 38 39 50 29 4 vote: 50 95 85 76 51 vote: 1 31 21 vote: 68 39 17 46 85 vote: 68 67 68 68 75 vote: 92 39 27 86 vote: 28 67 39 75 54 vote: 67 39 38 17 6 vote: 50 36 75 60 99 vote: 67 vote: 52 75 50 83 vote: 50 50 83 83 75 vote: 39 38 46 43 54 vote: 60 20 67 29 18 vote: 69 68 38 60 19 vote: 20 85 50 92 97 vote: 75 75 39 38 1 vote: 67 67 68 75 75 vote: 68 83 20 38 67 vote: 38 67 68 69 20 vote: 39 75 68 92 83 vote: 18 75 29 1 vote: 0 75 75 38 1 vote: 83 68 38 75 23 vote: 50 58 63 40 53 vote: 91 56 57 85 88 vote: 39 6 3 32 98 vote: 50 85 98 91 93 vote: 50 75 81 38 97 vote: 3 50 88 75 99 vote: 75 20 39 60 83 vote: 39 60 4 67 83 vote: 18 67 68 83 43 vote: 50 50 51 58 76 vote: 68 83 95 85 21 vote: 50 50 50 50 50 vote: 20 92 71 33 5 vote: 2 68 68 68 2 vote: 75 67 39 83 29 vote: 42 6 46 44 20 vote: 20 86 25 36 18 vote: 38 5 2 92 29 vote: 46 17 66 85 27 vote: 61 50 25 76 60 vote: 60 42 92 27 18 vote: 67 67 43 46 43 vote: 38 38 77 76 10 vote: 3 67 52 38 1 vote: 20 88 97 18 48 vote: 97 6 92 50 57 vote: 3 5 67 88 50 vote: 75 68 85 98 60 vote: 50 50 67 20 75 vote: 39 20 92 67 99 vote: 85 75 67 17 60 vote: 2 19 67 75 18 vote: 75 68 12 38 83 vote: 96 85 92 83 88 vote: 75 52 60 47 50 vote: 83 67 75 20 17 vote: 38 5 50 67 39 vote: 92 69 48 68 20 vote: 86 23 20 18 17 vote: 39 38 5 75 19 vote: 92 19 29 75 77 vote: 68 67 85 46 38 vote: 3 17 18 68 10 vote: 50 63 68 84 96 vote: 25 67 6 99 68 vote: 38 39 38 39 67 vote: 5 18 20 3 4 vote: 67 67 20 20 75 vote: 83 67 39 5 29 vote: 83 50 6 38 75 vote: 21 15 29 10 67 vote: 61 20 67 50 92 vote: 17 36 5 33 42 vote: 29 29 30 68 75 vote: 87 87 87 62 52 vote: 38 39 75 20 92 vote: 67 83 92 50 vote: 21 29 20 67 92 vote: 13 5 46 20 42 vote: 19 28 33 39 71 vote: 23 39 39 5 6 vote: 19 7 38 29 99 vote: 60 39 50 48 25 vote: 67 50 52 75 83 vote: 46 20 39 75 92 vote: 39 75 50 60 68 vote: 51 17 38 49 75 vote: 61 39 20 46 97 vote: 85 68 83 75 67 vote: 1 vote: 50 75 20 92 87 vote: 75 52 68 67 83 vote: 52 28 75 83 67 vote: 3 6 18 47 5 vote: 67 67 87 49 63 vote: 97 50 68 6 29 vote: 99 75 20 1 vote: 21 21 68 85 99 vote: 38 75 5 17 20 vote: 91 52 83 29 94 vote: 92 75 38 60 52 vote: 67 83 49 21 38 vote: 67 83 74 38 3 vote: 18 61 92 5 39 vote: 92 83 68 6 67 vote: 5 20 19 60 92 vote: 75 75 75 38 97 vote: 39 68 83 75 17 vote: 67 50 75 92 38 vote: 68 83 5 67 23 vote: 39 3 17 43 67 vote: 61 92 19 95 50 vote: 74 56 57 58 59 vote: 38 5 83 6 67 vote: 50 92 39 69 39 vote: 67 7 75 20 68 vote: 67 38 92 75 46 vote: 50 vote: 85 69 68 101 92 vote: 85 67 43 75 5 vote: 67 83 29 1 39 vote: 18 23 68 68 67 vote: 75 60 21 38 67 vote: 50 50 38 92 81 vote: 42 98 20 23 85 vote: 30 30 69 85 2 vote: 38 92 5 24 67 vote: 52 75 83 68 29 vote: 75 52 75 52 52 vote: 68 52 85 80 22 vote: 68 67 17 51 85 vote: 68 75 83 38 1 vote: 50 50 10 88 23 vote: 52 75 50 83 vote: 50 75 97 61 83 vote: 62 43 46 19 5 vote: 85 31 38 38 38 vote: 83 38 75 28 20 vote: 43 85 7 37 97 vote: 75 60 67 20 49 vote: 75 68 39 21 98 vote: 85 68 23 89 31 vote: 20 3 5 17 91 vote: 48 83 21 67 75 vote: 61 60 20 75 68 vote: 50 97 88 46 75

Joel wrote:
Hi,
Thanks to Kalin who did the initial tallies and Jason Hise who wrote the IRV tallying program, we have a winner: Simeon Nasilowski, entry number 67. The winning variation is 67b.
Unless there are some more objections, or if someone can spot a bug in Jason Hise's program, we have a winner. Attached here is Jason's IRV program and the input file. I'd like to invite boosters to go check it out.
I'm not sure about votes like: vote: 37 37 37 37 37 and votes like: vote: 50 50 83 83 75 Does the IRV voting allows listing the same candidate several times? Will this skew the resuls? Also: vote: 0 75 75 38 1 Does not look correct. Don't we number candidates from 1? OTOH, the attached Python script I've just wrote by looking at http://www.electionmethods.org/IRVexample.htm produces the same results: '67' is the winner and '75' is the runner-up. - Volodya

Vladimir Prus wrote:
I'm not sure about votes like:
vote: 37 37 37 37 37
This did indeed get sent, all 37, with no variations. :)
and votes like:
vote: 50 50 83 83 75
Does the IRV voting allows listing the same candidate several times? Will this skew the resuls?
I believe this was probably multiple variations being chosen. Couldn't find the exact email at a cursory glance, but quite a few were like this, with multiple variations voted for.
Also:
vote: 0 75 75 38 1
Does not look correct. Don't we number candidates from 1?
There was one vote for no logo at all, and it was numbered 0, so I still wrote it down. :)

kalin wrote:
Vladimir Prus wrote:
I'm not sure about votes like:
vote: 37 37 37 37 37
This did indeed get sent, all 37, with no variations. :)
I think this breaks the rules of IRV, which asks for several different options.
and votes like:
vote: 50 50 83 83 75
Does the IRV voting allows listing the same candidate several times? Will this skew the resuls?
I believe this was probably multiple variations being chosen. Couldn't find the exact email at a cursory glance, but quite a few were like this, with multiple variations voted for.
I think this breaks the rules of IRV, too. If in both cases, the votes were required to provide 5 different options, it would have changed the distribution of votes. And there's quite a number of other duplicate selections. However, the only fix would be to ask the original votes to recast the votes. Simply removing duplicates from each preference vector does not change the results.
Also:
vote: 0 75 75 38 1
Does not look correct. Don't we number candidates from 1?
There was one vote for no logo at all, and it was numbered 0, so I still wrote it down. :)
Ok, I see. - Volodya

Joel wrote:
I'm not sure about votes like:
vote: 37 37 37 37 37
and votes like:
vote: 50 50 83 83 75
Does the IRV voting allows listing the same candidate several times? Will this skew the resuls?
Yes, and no, respectively. Only the top vote is counted, and if that candidate is eliminated, all of the votes for the eliminated candidate can no longer be counted. Essentially, that person is forefitting some of their choices.
Also:
vote: 0 75 75 38 1
Does not look correct. Don't we number candidates from 1?
Yes, but since zero is a one time fluke it cannot possibly win. It will be eliminated toward the very beginning of the counting and will really just delay the person's real votes from counting. Can't really hurt the final result at all.
OTOH, the attached Python script I've just wrote by looking at http://www.electionmethods.org/IRVexample.htm produces the same results: '67' is the winner and '75' is the runner-up.
Thanks for taking the time to double check my program's results. Glad to see they came out the same :) -Jason

Hi, This is a tough decision. Based on the IRV program the winner is supposed to be Simeon Nasilowski, entry number 67. However, entry 67 clearly fails to meet one of the requirements: The logo must be free of any copyright or other intellectual property claims. It was noted by Eric Niebler, and confirmed by others that entry 67 has a glaring similarity to the marketing imagery of Visual Studio. See: http://tinyurl.com/6chhn Hence, entry number 75 by Zoltan "cad" Juhasz will have to be the winner. Congratulations Zoltan! Zoltan "cad" Juhasz shall receive: * the Boost Logo Designer T-shirt (printed with the winning logo design), plus, * a signed copy of the MPL book by David Abrahams and Aleksey Gurtovoy, C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond (http://www.awprofessional.com/titles/0321227255 ) I shall now leave it up to the Boost Moderators to decide on whether the winning logo shall replace the current or not. The current consensus, based on recent discussions in the boost-dev list is to hold a second contest given everything we have learned so far. The contest was not as easy at it seemed at first and there's a lot we learned from it. Some people, like Christopher Diggins and Genandiy Rozental proposed some stricter and perhaps better formed guidelines and voting procedures. I shall take this into consideration if and when we hold a second contest. Some folks suggested that entry 67 might be salvagable. That might possible. It might also be possible to come up with a logo based on the top 10 entries, combining the best ideas into one. I am actually contemplating on having a shot at this. I invite others to do as well. Again, thanks to everyone who participated and those who helped out. Special thanks to Jason Hise and Vladimir Prus who independently wrote the IRV programs: see attached irv.cpp see attached irv.py and Kalin who did the initial tallies and collecting the votes: see attached votes.txt Cheers, -- Joel de Guzman http://www.boost-consulting.com http://spirit.sf.net #include <string> #include <vector> #include <list> #include <map> #include <iostream> using namespace std; int main ( ) { string s; list < string > vote; vector < list < string > > votes; map < string, size_t > candidates; while ( true ) { getline ( cin, s ); if ( cin.eof ( ) ) { if ( !vote.empty ( ) ) votes.push_back ( vote ); break; } if ( s == "vote:" ) { if ( !vote.empty ( ) ) { votes.push_back ( vote ); vote.clear ( ); } } else { candidates.insert ( map < string, size_t >::value_type ( s, 0 ) ); vote.push_back ( s ); } } bool winner = false; size_t min_votes; map < string, size_t >::iterator c_iter, c_next; vector < list < string > >::iterator vl_iter; while ( !winner ) { c_iter = candidates.begin ( ); while ( c_iter != candidates.end ( ) ) { cout << "clearing votes for " << c_iter->first << endl; c_iter->second = 0; ++c_iter; } vl_iter = votes.begin ( ); while ( vl_iter != votes.end ( ) ) { list < string >::iterator v_iter ( vl_iter->begin ( ) ); while ( v_iter != vl_iter->end ( ) ) { c_iter = candidates.find ( *v_iter ); if ( c_iter != candidates.end ( ) ) { ++( c_iter->second ); break; } ++v_iter; } ++vl_iter; } c_iter = candidates.begin ( ); min_votes = c_iter->second; winner = true; while ( c_iter != candidates.end ( ) ) { cout << c_iter->first << " has a total of " << c_iter->second << " votes" << endl; if ( c_iter->second != min_votes ) { winner = false; } if ( c_iter->second < min_votes ) { min_votes = c_iter->second; } ++c_iter; } if ( winner ) { if ( candidates.size ( ) > 1 ) { cout << endl << "TIE, WINNERS WERE:" << endl; } else { cout << endl << "WINNER:" << endl; } } c_iter = candidates.begin ( ); while ( c_iter != candidates.end ( ) ) { c_next = c_iter; ++c_next; if ( winner ) { cout << c_iter->first << endl; } else if ( c_iter->second == min_votes ) { cout << c_iter->first << " has been removed from the running" << endl; candidates.erase ( c_iter ); } c_iter = c_next; } } return 0; } vote: 87 39 50 67 74 vote: 87 39 50 67 74 vote: 75 92 98 52 67 vote: 61 98 92 21 29 vote: 92 38 18 39 67 vote: 50 61 86 95 21 vote: 37 37 37 37 37 vote: 38 39 75 1 44 vote: 67 83 75 39 88 vote: 18 60 67 52 75 vote: 83 52 67 68 18 vote: 67 17 21 83 92 vote: 50 vote: 50 50 7 88 24 vote: 83 38 75 5 17 vote: 83 38 75 5 17 vote: 67 92 69 74 20 vote: 50 70 27 38 49 vote: 25 68 43 17 69 vote: 38 67 52 75 83 vote: 38 39 50 29 4 vote: 50 95 85 76 51 vote: 1 31 21 vote: 68 39 17 46 85 vote: 68 67 68 68 75 vote: 92 39 27 86 vote: 28 67 39 75 54 vote: 67 39 38 17 6 vote: 50 36 75 60 99 vote: 67 vote: 52 75 50 83 vote: 50 50 83 83 75 vote: 39 38 46 43 54 vote: 60 20 67 29 18 vote: 69 68 38 60 19 vote: 20 85 50 92 97 vote: 75 75 39 38 1 vote: 67 67 68 75 75 vote: 68 83 20 38 67 vote: 38 67 68 69 20 vote: 39 75 68 92 83 vote: 18 75 29 1 vote: 0 75 75 38 1 vote: 83 68 38 75 23 vote: 50 58 63 40 53 vote: 91 56 57 85 88 vote: 39 6 3 32 98 vote: 50 85 98 91 93 vote: 50 75 81 38 97 vote: 3 50 88 75 99 vote: 75 20 39 60 83 vote: 39 60 4 67 83 vote: 18 67 68 83 43 vote: 50 50 51 58 76 vote: 68 83 95 85 21 vote: 50 50 50 50 50 vote: 20 92 71 33 5 vote: 2 68 68 68 2 vote: 75 67 39 83 29 vote: 42 6 46 44 20 vote: 20 86 25 36 18 vote: 38 5 2 92 29 vote: 46 17 66 85 27 vote: 61 50 25 76 60 vote: 60 42 92 27 18 vote: 67 67 43 46 43 vote: 38 38 77 76 10 vote: 3 67 52 38 1 vote: 20 88 97 18 48 vote: 97 6 92 50 57 vote: 3 5 67 88 50 vote: 75 68 85 98 60 vote: 50 50 67 20 75 vote: 39 20 92 67 99 vote: 85 75 67 17 60 vote: 2 19 67 75 18 vote: 75 68 12 38 83 vote: 96 85 92 83 88 vote: 75 52 60 47 50 vote: 83 67 75 20 17 vote: 38 5 50 67 39 vote: 92 69 48 68 20 vote: 86 23 20 18 17 vote: 39 38 5 75 19 vote: 92 19 29 75 77 vote: 68 67 85 46 38 vote: 3 17 18 68 10 vote: 50 63 68 84 96 vote: 25 67 6 99 68 vote: 38 39 38 39 67 vote: 5 18 20 3 4 vote: 67 67 20 20 75 vote: 83 67 39 5 29 vote: 83 50 6 38 75 vote: 21 15 29 10 67 vote: 61 20 67 50 92 vote: 17 36 5 33 42 vote: 29 29 30 68 75 vote: 87 87 87 62 52 vote: 38 39 75 20 92 vote: 67 83 92 50 vote: 21 29 20 67 92 vote: 13 5 46 20 42 vote: 19 28 33 39 71 vote: 23 39 39 5 6 vote: 19 7 38 29 99 vote: 60 39 50 48 25 vote: 67 50 52 75 83 vote: 46 20 39 75 92 vote: 39 75 50 60 68 vote: 51 17 38 49 75 vote: 61 39 20 46 97 vote: 85 68 83 75 67 vote: 1 vote: 50 75 20 92 87 vote: 75 52 68 67 83 vote: 52 28 75 83 67 vote: 3 6 18 47 5 vote: 67 67 87 49 63 vote: 97 50 68 6 29 vote: 99 75 20 1 vote: 21 21 68 85 99 vote: 38 75 5 17 20 vote: 91 52 83 29 94 vote: 92 75 38 60 52 vote: 67 83 49 21 38 vote: 67 83 74 38 3 vote: 18 61 92 5 39 vote: 92 83 68 6 67 vote: 5 20 19 60 92 vote: 75 75 75 38 97 vote: 39 68 83 75 17 vote: 67 50 75 92 38 vote: 68 83 5 67 23 vote: 39 3 17 43 67 vote: 61 92 19 95 50 vote: 74 56 57 58 59 vote: 38 5 83 6 67 vote: 50 92 39 69 39 vote: 67 7 75 20 68 vote: 67 38 92 75 46 vote: 50 vote: 85 69 68 101 92 vote: 85 67 43 75 5 vote: 67 83 29 1 39 vote: 18 23 68 68 67 vote: 75 60 21 38 67 vote: 50 50 38 92 81 vote: 42 98 20 23 85 vote: 30 30 69 85 2 vote: 38 92 5 24 67 vote: 52 75 83 68 29 vote: 75 52 75 52 52 vote: 68 52 85 80 22 vote: 68 67 17 51 85 vote: 68 75 83 38 1 vote: 50 50 10 88 23 vote: 52 75 50 83 vote: 50 75 97 61 83 vote: 62 43 46 19 5 vote: 85 31 38 38 38 vote: 83 38 75 28 20 vote: 43 85 7 37 97 vote: 75 60 67 20 49 vote: 75 68 39 21 98 vote: 85 68 23 89 31 vote: 20 3 5 17 91 vote: 48 83 21 67 75 vote: 61 60 20 75 68 vote: 50 97 88 46 75 import string f = open("votes.txt") def load_votes(): result = [] f = open("votes.txt") for l in f: if string.strip(l) == "vote:": result.append([]) else: result[-1].append(int(l)) return result def count_first_votes(votes): result = {} for l in votes: if l: first_vote = l[0] if not result.has_key(first_vote): result[first_vote] = 1 else: result[first_vote] = result[first_vote]+1 return result def winner(first_votes): print "Trying to find a winner" total_votes = 0 for l in first_votes: total_votes += first_votes[l] print total_votes, "total votes" for l in first_votes: if first_votes[l] > total_votes/2: return l return None def looser(first_votes): min_votes = None looser = None for l in first_votes: if min_votes == None or first_votes[l] < min_votes: min_votes = first_votes[l] looser = l return looser def drop_looser(raw_votes, looser): for l in raw_votes: if l and l[0] == looser: del l[0] raw = load_votes() print len(raw), "initial votes" for i in raw: print i while 1: counted = count_first_votes(raw) print "First votes:" for i in counted: print i, " --> ", counted[i] w = winner(counted) if w is not None: print "Winner is", w break else: print "No winner yet" l = looser(counted) assert l is not None print "Dropping", l, "which had", counted[l], "votes" drop_looser(raw, l)

Hi again, Ok, here's the updated Boost Logo Contest page: http://www.boost.org/more/logo_contest.htm Cheers, -- Joel de Guzman http://www.boost-consulting.com http://spirit.sf.net Joel wrote:
Hi,
This is a tough decision. Based on the IRV program the winner is supposed to be Simeon Nasilowski, entry number 67. However, entry 67 clearly fails to meet one of the requirements:
The logo must be free of any copyright or other intellectual property claims.
It was noted by Eric Niebler, and confirmed by others that entry 67 has a glaring similarity to the marketing imagery of Visual Studio. See:
Hence, entry number 75 by Zoltan "cad" Juhasz will have to be the winner. Congratulations Zoltan!
Zoltan "cad" Juhasz shall receive:
* the Boost Logo Designer T-shirt (printed with the winning logo design), plus, * a signed copy of the MPL book by David Abrahams and Aleksey Gurtovoy, C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond (http://www.awprofessional.com/titles/0321227255 )
I shall now leave it up to the Boost Moderators to decide on whether the winning logo shall replace the current or not. The current consensus, based on recent discussions in the boost-dev list is to hold a second contest given everything we have learned so far. The contest was not as easy at it seemed at first and there's a lot we learned from it. Some people, like Christopher Diggins and Genandiy Rozental proposed some stricter and perhaps better formed guidelines and voting procedures. I shall take this into consideration if and when we hold a second contest.
Some folks suggested that entry 67 might be salvagable. That might possible. It might also be possible to come up with a logo based on the top 10 entries, combining the best ideas into one. I am actually contemplating on having a shot at this. I invite others to do as well.
Again, thanks to everyone who participated and those who helped out.
Special thanks to Jason Hise and Vladimir Prus who independently wrote the IRV programs: see attached irv.cpp see attached irv.py
and Kalin who did the initial tallies and collecting the votes: see attached votes.txt
participants (5)
-
chaos@ezequal.com
-
Joel
-
kalin
-
Tobias Schwinger
-
Vladimir Prus