aboutsummaryrefslogtreecommitdiff
path: root/challenge-009/paulo-custodio/python/ch-2.py
blob: 4c7f8135d30320f3e2c9f5f3635e5df152a29ca7 (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
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()]))