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)
|