summaryrefslogtreecommitdiff
path: root/cyganie.py
blob: 7d4a4f5ac82a80f451b4c15510ca11fe07385ab7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/env python
# coding=utf-8

import json, random, sys
from operator import add
from collections import Counter

movements = json.load(open('movements.json'))

movement = movements[sys.argv[1]]

gypsy_limit = int(sys.argv[2]) if len(sys.argv) > 2 else 7
gypsy_dist = [1]*gypsy_limit + [0]*(movement['tables']*4-gypsy_limit)

samples = int(sys.argv[3]) if len(sys.argv) > 3 else 50

gypsy_transformation = {'00': '00',
                        '01': '10',
                        '10': '01',
                        '11': '11',
                        '02': '20',
                        '20': '02',
                        '12': '21',
                        '21': '12',
                        '22': '22'}
poverty_probability = {'00': 0.0,
                       '01': 0.0,
                       '10': 0.0,
                       '11': 0.5,
                       '02': 0.0,
                       '20': 0.0,
                       '12': 1.0,
                       '21': 1.0,
                       '22': 1.0}

def position_to_index(position):
    letter = position[-1]
    position = filter(lambda x: x.isdigit(), position)
    return (int(position) - 1) * 2 + (0 if letter == 'N' else 1)

cumulative_poverties = [0] * movement['tables']
cumulative_pairs_histogram = []

for s in range(samples):
    print >> sys.stderr, 'Iteration #' + str(s)
    cumulative_pairs = [0] * (movement['tables'] * 2)
    positions = map(lambda no: no-1, movement['positions'])
    rotation = map(position_to_index, movement['movement'])
    poverties = [0] * movement['tables']

    random.shuffle(gypsy_dist)
    pairs = map(sum, zip(gypsy_dist[0::2], gypsy_dist[1::2]))

    for round in range(movement['rounds']+1):
        gypsy_pairs = map(lambda pair: pairs[pair], positions)
        tables = map(lambda pair: ''.join(map(lambda p: str(p), pair)), zip(gypsy_pairs[0::2], gypsy_pairs[1::2]))
        poverties = map(lambda t: int(random.random() < poverty_probability[t]), tables)
        if round > 0:
            cumulative_poverties = map(add, cumulative_poverties, poverties)
        print >> sys.stderr, 'round ' + str(round)
        print >> sys.stderr, ' '.join(tables)
        if round > 0:
            print >> sys.stderr, ' '.join([' *' if p else '  ' for p in poverties])
            tables = map(lambda t: gypsy_transformation[t], tables)
            print >> sys.stderr, ' '.join(tables)
        table_gypsies = map(int, ''.join(tables))
        for index, gypsies in enumerate(table_gypsies):
            pairs[positions[index]] = gypsies
        if round > 0:
            cumulative_pairs = map(add, cumulative_pairs, pairs)
        if round > 0:
            new_positions = [-1] * len(positions)
            for index, position in enumerate(rotation):
                new_positions[position] = positions[rotation[index-1 % len(rotation)]]
            for index, position in enumerate(new_positions):
                if position == -1:
                    new_positions[index] = positions[index]
            positions = new_positions
    cumulative_pairs_histogram += cumulative_pairs
    print >> sys.stderr, '---'

print 'Bieda na stole:'
poverties_sum = sum(cumulative_poverties)
for table, pov in enumerate(cumulative_poverties):
    print '{:>3d} ({:>5d})'.format(table+1, pov), '#' * (100  * pov / poverties_sum)

print 'Liczba par wg cyganorund w turnieju:'
pairs_sum = sum(cumulative_pairs_histogram)
cumulative_pairs_histogram = Counter(cumulative_pairs_histogram)
for key in sorted(cumulative_pairs_histogram.keys()):
    print '{:>3d} ({:>5d})'.format(key, cumulative_pairs_histogram[key]), '#' * (100  * cumulative_pairs_histogram[key] / pairs_sum)