~pmikkelsen/dyalog-competition-2022

ab47f9cd8c7f00b2cb4daec8c9c3dde413c6820a — Peter Mikkelsen 2 years ago 124a7b4
Add vote problem
1 files changed, 26 insertions(+), 0 deletions(-)

A vote.apln
A vote.apln => vote.apln +26 -0
@@ 0,0 1,26 @@
:Namespace vote
      Ballot←{
          voter←{
              ⍺:?⍨⍵
              n←?⍵
              (⍳n)@(n↑?⍨⍵)⊢⍵⍴0
          }
          ,⍨∘≢⌸(⍺>0)voter¨⍵⍴|⍺
      }
      IRV←{
          ⍵ IRVruns (⊂∘⍋⌷⊢)⍵[;1]{⍺,+⌿⍵}⌸⍨1⍳⍨¨⍵[;2]
      }
      IRVruns←{
          eliminate←{
              ⍝ A loser rating of 0 is worst,
              ⍝ so give it a large value
              res←⍵[;1],⍪↓⍉0@⍺⊢⍉r-r>⍤1 0⊢(⌈⌿,r)@(=∘0)(r←↑⍵[;2])[;⍺]
              ⍝ remove the blank votes now
              res⌿⍨~∨/res⍷⍨⊂0⍴⍨⊃⌽⍴r
          }
          1=≢⍵:⊃⍵ ⍝ We have a winner
          losers←⍵[(⍸⌊⌿⍷⊢)⍵[;2];1]
          ⍵=⍥≢losers:⊂⍵ ⍝ it was a tie
          (⊂⍵),IRV⊃eliminate⌿losers,⊂⍺ ⍝ Calculate next rounds with the loses removed
      }
:EndNamespace