using System.Collections.Generic;
public static void Main()
var trackHard = new DifficultyTrack(TrackDifficulty.Hard, new Dictionary<NormalizedDifficulty, int>
[NormalizedDifficulty.VeryEasy] = 0,
[NormalizedDifficulty.Easy] = 10,
[NormalizedDifficulty.Medium] = 55,
[NormalizedDifficulty.Hard] = 35
var trackMedium = new DifficultyTrack(TrackDifficulty.Medium, new Dictionary<NormalizedDifficulty, int>
[NormalizedDifficulty.VeryEasy] = 0,
[NormalizedDifficulty.Easy] = 20,
[NormalizedDifficulty.Medium] = 70,
[NormalizedDifficulty.Hard] = 10
var trackEasy = new DifficultyTrack(TrackDifficulty.Easy, new Dictionary<NormalizedDifficulty, int>
[NormalizedDifficulty.VeryEasy] = 0,
[NormalizedDifficulty.Easy] = 35,
[NormalizedDifficulty.Medium] = 65,
[NormalizedDifficulty.Hard] = 0
var trackVeryEasy = new DifficultyTrack(TrackDifficulty.VeryEasy, new Dictionary<NormalizedDifficulty, int>
[NormalizedDifficulty.VeryEasy] = 40,
[NormalizedDifficulty.Easy] = 40,
[NormalizedDifficulty.Medium] = 20,
[NormalizedDifficulty.Hard] = 0
var tracks = new [] {trackHard, trackMedium, trackEasy, trackVeryEasy};
var p1 = new DifficultyBreakdown
var nearestTrack = tracks.OrderBy(t => t.CalculateDistance(p1)).First();
var distance = nearestTrack.CalculateDistance(p1);
Console.WriteLine($"{nearestTrack.Difficulty} - {distance:p2}");
public enum TrackDifficulty
public enum NormalizedDifficulty
public class DifficultyBreakdown
public double VeryEasy { get; set; }
public double Easy { get; set; }
public double Medium { get; set; }
public double Hard { get; set; }
public class DifficultyTrack
public DifficultyTrack(TrackDifficulty trackDifficulty, Dictionary<NormalizedDifficulty, int> targets)
Difficulty = trackDifficulty;
Targets = new Dictionary<NormalizedDifficulty, double>();
foreach (var kvp in targets)
Targets.Add(kvp.Key, kvp.Value / 100d);
public TrackDifficulty Difficulty { get; }
public Dictionary<NormalizedDifficulty, double> Targets { get; }
public double CalculateDistance(DifficultyBreakdown difficultyBreakdown)
res += Math.Abs(Targets[NormalizedDifficulty.VeryEasy] - difficultyBreakdown.VeryEasy);
res += Math.Abs(Targets[NormalizedDifficulty.Easy] - difficultyBreakdown.Easy);
res += Math.Abs(Targets[NormalizedDifficulty.Medium] - difficultyBreakdown.Medium);
res += Math.Abs(Targets[NormalizedDifficulty.Hard] - difficultyBreakdown.Hard);