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
92
93
94
95
96
97
|
#!/usr/bin/python3
# Challenge 009
#
# Challenge #2
# Write a script to perform different types of ranking as described below:
#
# 1. Standard Ranking (1224): Items that compare equal receive the same ranking
# number, and then a gap is left in the ranking numbers.
# 2. Modified Ranking (1334): It is done by leaving the gaps in the ranking
# numbers before the sets of equal-ranking items.
# 3. Dense Ranking (1223): Items that compare equally receive the same
# ranking number, and the next item(s) receive the immediately following
# ranking number.
import sys
import operator
class Item():
def __init__(self, index, value):
self.index = index
self.value = value
self.rank = 0
def __str__(self):
return f"Item(index={self.index},value={self.value},rank={self.rank})"
class Items():
def __init__(self, values):
self.items = []
for index, value in enumerate(values):
self.items.append(Item(index, value))
def __str__(self):
return "["+ ", ".join([str(x) for x in self.items]) +"]"
def elems(self):
return self.items
def sort_by_value(self):
self.items = sorted(self.items, key=operator.attrgetter('value'))[::-1]
def sort_by_index(self):
self.items = sorted(self.items, key=operator.attrgetter('index'))
def count_same(self, i):
value = self.items[i].value
count = 0
while i < len(self.items) and self.items[i].value == value:
count += 1
i += 1
return count
def standard_ranking(self):
self.sort_by_value()
rank = 1
i = 0
while i < len(self.items):
same = self.count_same(i)
for j in range(i, i+same):
self.items[j].rank = rank
rank += same
i += same
self.sort_by_index()
def modified_ranking(self):
self.sort_by_value()
rank = 1
i = 0
while i < len(self.items):
same = self.count_same(i)
for j in range(i, i+same):
self.items[j].rank = rank+same-1
rank += same
i += same
self.sort_by_index()
def dense_ranking(self):
self.sort_by_value()
rank = 1
i = 0
while i < len(self.items):
same = self.count_same(i)
for j in range(i, i+same):
self.items[j].rank = rank
rank += 1
i += same
self.sort_by_index()
items = Items([int(x) for x in sys.argv[1:]])
print("Data: "+", ".join([str(x.value) for x in items.elems()]))
items.standard_ranking()
print("Standard ranking: "+", ".join([str(x.rank) for x in items.elems()]))
items.modified_ranking()
print("Modified ranking: "+", ".join([str(x.rank) for x in items.elems()]))
items.dense_ranking()
print("Dense ranking: "+", ".join([str(x.rank) for x in items.elems()]))
|