Last active
October 12, 2018 08:49
-
-
Save aloisdg/ce043b2be4a78b96a9b19dcf7cffa1fb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Linq; | |
using System.Collections.Generic; | |
// https://rpg.stackexchange.com/a/133360/11129 | |
public class Program | |
{ | |
public class Player | |
{ | |
public string Name | |
{ | |
get; | |
set; | |
} | |
public IEnumerable<int> Rolls | |
{ | |
get; | |
set; | |
} | |
public Player(string name, IEnumerable<int> rolls) | |
{ | |
Name = name; | |
Rolls = rolls; | |
} | |
public override bool Equals(object obj) | |
{ | |
var item = obj as Player; | |
return item == null ? false : this.Name.Equals(item.Name) && this.Rolls.SequenceEqual(item.Rolls); | |
} | |
public override int GetHashCode() => this.Name.GetHashCode() ^ this.Rolls.GetHashCode(); | |
} | |
public static List<int>[] Draft(IEnumerable<int> source, int z) | |
{ | |
var results = Enumerable.Range(0, z).Select(_ => new List<int>()).ToArray(); | |
var rollsCount = source.Count(); | |
for (var i = 0; i < rollsCount; i += z) | |
{ | |
var draft = source.Skip(i).Take(z).OrderBy(x => i / z % 2 == 0 ? -x : x).ToArray(); | |
for (var j = 0; j < z; j++) | |
{ | |
results[j].Add(draft[j]); | |
} | |
} | |
return results; | |
} | |
public static IEnumerable<Player> DraftRolls(IEnumerable<Player> players) | |
{ | |
var z = players.Count(); | |
var rolls = players.SelectMany(x => x.Rolls).OrderByDescending(x => x); | |
var results = Draft(rolls, z); | |
return players.Select((x, i) => new Player(x.Name, results[i])); | |
} | |
public static void Main() | |
{ | |
{ | |
var players = new[]{new Player("A", new[]{1,2}), new Player("B", new[]{2,3}), new Player("C", new[]{3,4})}; | |
var expected = new Player("C", new[]{3,2}); | |
var actual = DraftRolls(players).Last(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1,2}), new Player("B", new[]{2,3}), new Player("C", new[]{3,4})}; | |
var expected = new Player("A", new[]{4,1}); | |
var actual = DraftRolls(players).First(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1}), new Player("B", new[]{2}), new Player("C", new[]{3})}; | |
var expected = new Player("C", new[]{1}); | |
var actual = DraftRolls(players).Last(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1}), new Player("B", new[]{2}), new Player("C", new[]{3})}; | |
var expected = new Player("A", new[]{3}); | |
var actual = DraftRolls(players).First(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1,2,4,1}), new Player("B", new[]{3,4,4,1})}; | |
var expected = new Player("B", new[]{4,4,1,1}); | |
var actual = DraftRolls(players).Last(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1,2,4,1}), new Player("B", new[]{3,4,4,1})}; | |
var expected = new Player("A", new[]{4,3,2,1}); | |
var actual = DraftRolls(players).First(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1,2,4}), new Player("B", new[]{3,4,4})}; | |
var expected = new Player("B", new[]{4,4,1}); | |
var actual = DraftRolls(players).Last(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1,2,4}), new Player("B", new[]{3,4,4})}; | |
var expected = new Player("A", new[]{4,3,2}); | |
var actual = DraftRolls(players).First(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1,2}), new Player("B", new[]{3,4})}; | |
var expected = new Player("B", new[]{3,2}); | |
var actual = DraftRolls(players).Last(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1,2}), new Player("B", new[]{3,4})}; | |
var expected = new Player("A", new[]{4,1}); | |
var actual = DraftRolls(players).First(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1}), new Player("B", new[]{1})}; | |
var expected = new Player("B", new[]{1}); | |
var actual = DraftRolls(players).Last(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1}), new Player("B", new[]{1})}; | |
var expected = new Player("A", new[]{1}); | |
var actual = DraftRolls(players).First(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1, 2})}; | |
var expected = new Player("A", new[]{2, 1}); | |
var actual = DraftRolls(players).First(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
{ | |
var players = new[]{new Player("A", new[]{1})}; | |
var expected = new Player("A", new[]{1}); | |
var actual = DraftRolls(players).First(); | |
var b = expected.Equals(actual); | |
if (!b) | |
actual.Dump(); | |
} | |
Console.WriteLine("done"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://dotnetfiddle.net/3Fkb8s