Каков наиболее оптимальный способ сравнения элементов в списке структур и соответствующего обновления? - PullRequest
0 голосов
/ 17 октября 2018

Я играю в многопользовательскую игру на ножницах, чтобы выучить эликсир.Моя структура игры содержит список игроков и победителя.Я хочу рекурсивно перебирать каждого игрока после того, как он выберет свой выбор, который обновляет счет (игрок 1 сравнивается с другими игроками, затем следующим и т. Д., Пока все не будут забиты).Я пытаюсь найти оптимальный способ обновления игры, но все, что я пробовал, кажется посредственным, когда дело доходит до производительности.Какой будет наилучший подход?

Ссылка на конкретную игровую логику: https://github.com/onesneakymofo/rock_paper_scissors/blob/master/lib/rock_paper_scissors/judge.ex

Структура:

%RockPaperScissors.Game{
  players: [
    %RockPaperScissors.Player{choice: "rock", name: "Mandude", score: 0},
    %RockPaperScissors.Player{choice: "paper", name: "Tophlove", score: 0},
    %RockPaperScissors.Player{choice: "scissors", name: "T. Milla", score: 0},
    %RockPaperScissors.Player{choice: "scissors, name: "K-pop", score: 0}
  ],
  winner: nil
}

Ожидаемый ввод:

players: [
    %RockPaperScissors.Player{choice: "rock", name: "Mandude", score: 0},
    %RockPaperScissors.Player{choice: "paper", name: "Tophlove", score: 0},
    %RockPaperScissors.Player{choice: "scissors", name: "T. Milla", score: 0},
    %RockPaperScissors.Player{choice: "scissors, name: "K-pop", score: 0}
  ]

Ожидаемый результат:

players: [
    %RockPaperScissors.Player{choice: "rock", name: "Mandude", score: 2},
    %RockPaperScissors.Player{choice: "paper", name: "Tophlove", score: 1},
    %RockPaperScissors.Player{choice: "scissors", name: "T. Milla", score: 1},
    %RockPaperScissors.Player{choice: "scissors, name: "K-pop", score: 1}
  ]

1 Ответ

0 голосов
/ 17 октября 2018

Сначала подготовьте данные, а затем сопоставьте все:

players = [
  %{choice: "rock", name: "Mandude", score: 0},
  %{choice: "paper", name: "Tophlove", score: 0},
  %{choice: "scissors", name: "T. Milla", score: 0},
  %{choice: "scissors", name: "K-pop", score: 0}
]

winners =
  %{"paper" => "rock",
    "rock" => "scissors",
    "scissors" => "paper"}

counts =
  players
  |> Enum.group_by(& &1.choice)
  |> Enum.map(fn {k, v} -> {k, Enum.count(v)} end)
  |> Enum.into(%{})

players =
  Enum.map(players, fn %{choice: choice, score: score} = p ->
    %{p | score: score + counts[winners[choice]]}
  end) 
#⇒ [
#    %{choice: "rock", name: "Mandude", score: 2},
#    %{choice: "paper", name: "Tophlove", score: 1},
#    %{choice: "scissors", name: "T. Milla", score: 1},
#    %{choice: "scissors", name: "K-pop", score: 1}
#  ]
...