Ranking methods: Difference between revisions

Content added Content deleted
(New draft task and Python solution.)
 
(→‎{{header|Python}}: New d & sc rankers.)
Line 45: Line 45:
while fifo:
while fifo:
yield start - 1, fifo.pop(0)
yield start - 1, fifo.pop(0)


def _gap_rank(iterable, start, only1):
"""Dense ranking if only1 else Standard competition ranking"""
first = True
for item in iterable:
if first:
first = False
last, delta = item[0], 1
yield start, item
else:
if item[0] != last:
start += delta
delta = 1
else:
if not only1:
delta += 1
last = item[0]
yield start, item




def sc_rank(iterable, start=1):
def sc_rank(iterable, start=1):
"""Standard competition ranking"""
"""Standard competition ranking"""
lastresult, lastrank = None, None
yield from _gap_rank(iterable, start, only1=False)
for n, item in enumerate(iterable, start):
if item[0] == lastresult:
yield lastrank, item
else:
yield n, item
lastresult, lastrank = item[0], n




def d_rank(iterable, start=1):
def d_rank(iterable, start=1):
"""Dense ranking"""
"""Dense ranking"""
yield from _gap_rank(iterable, start, only1=True)
lastresult, lastrank = None, start - 1,
for item in iterable:
if item[0] == lastresult:
yield lastrank, item
else:
lastresult, lastrank = item[0], lastrank + 1
yield lastrank, item