С риском сделать кому-то домашнее задание для них, вот как я бы справился с этим. Сначала поймите, что если мы отсортируем список, индексы полученного списка будут теми «рангами», которые мы хотим получить в нашем конечном результате. Вы можете получить индекс числа из списка, используя примитив position
. Затем мы можем легко использовать примитив map
для замены каждого значения в исходном списке на «ранг» из отсортированного массива.
Пошаговый пример:
to step-by-step-ranking
let items [5 1 6 7 9]
let sorted sort items
; sorted is now [1 5 6 7 9]
show sorted
; so the `position` of the number 5 in `sorted` is index `1`
show position 5 sorted
; and the `position` of the number 5 in `sorted` is index `0`
show position 1 sorted
; and so on for the other items, `position` gives our rank
; so we just need to do `position n sorted` for each number in order
; which is what `map` will do for us
; `map` to `position` from `sorted` for each number in `items`
let ranked map [ n -> position n sorted ] items
show ranked ; outputs [1 0 2 3 4]
end
И если вам нужен репортер более общего назначения, вы можете использовать любой список чисел:
to-report rank [items]
let sorted sort items
let ranked map [ n -> position n sorted ] items
report ranked
end
to test-rank
show rank [5 1 6 7 9] ; outputs [1 0 2 3 4]
show rank [ 10 9 3 2 10 9 3 2 11 ] ; outputs [6 4 2 0 6 4 2 0 8]
end