Boost logo

Boost :

From: Joel (joel_at_[hidden])
Date: 2005-04-14 12:44:17


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)

        
    


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk