MBrendecke icon

The Morpheus Tutorials - Coding Challange 7

MBrendecke | PRO | 08/18/18 10:56:19 PM UTC | 0 ⭐ | 480 👁️ | Never ⏰ | []
C# |

3.8 KB

|

None

|

0 👍

/

0 👎

/*
 * ############################################
 * ###      The Morpheus Tutorials          ###
 * ###      Lösung:   Coding Challenge 7    ###
 * ###      Version:  2018.08.27-0110       ###
 * ############################################
 */
 
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Http;
using System.Text;
 
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
 
using static System.Console;
 
namespace Challenge_7 {
 
  internal class Program {
    private static readonly HttpClient client = new HttpClient();
 
    private const string CHALLENGE_URL = "https://cc.the-morpheus.de/challenges/7/";
    private const string SOLUTIONS_URL = "https://cc.the-morpheus.de/solutions/7/";
 
    private static void Messung(int durchläufe, Action action) {
      Stopwatch sw = new Stopwatch();
      Stopwatch gesamt = new Stopwatch();
      List<TimeSpan> zeiten = new List<TimeSpan>();
 
      {
        gesamt.Start();
        for (int i = 1; i <= durchläufe; i++) {
          Title = $"Durchlauf #{i:0000}";
          sw.Restart();
          action();
          sw.Stop();
          zeiten.Add(sw.Elapsed);
        }
        gesamt.Stop();
      }
 
      string format(long time) => $"{TimeSpan.FromTicks(time):mm\\:ss\\:ffffff}";
      WriteLine($"Min:        {format(zeiten.Min(t => t.Ticks))}");
      WriteLine($"Avg:        {format(Convert.ToInt64(zeiten.Average(t => t.Ticks)))}");
      WriteLine($"Max:        {format(zeiten.Max(t => t.Ticks))}");
      WriteLine($"Gesamt:     {format(gesamt.Elapsed.Ticks)}");
      WriteLine($"Durchläufe: {durchläufe}");
    }
 
    private static int[] SolveWithDictionary(int[] arr, int target) {
      Dictionary<int, int> dict = new Dictionary<int, int>();
      int possibleProblemTarget = (target % 2 == 0) ? target / 2 : -1;
 
      for (int i = 0; i < arr.Length; i++) {
        int ai = arr[i];
        int diff = target - ai;
 
        if (diff < 0) {
          continue;
        }
 
        if (diff == possibleProblemTarget) {
          return new[] { i, i };
        }
 
        if (dict.TryGetValue(diff, out int dd)) {
          if (arr[dd] + ai == target) {
            return new int[] { dd, i };
          }
        }
 
        if (!dict.ContainsKey(ai)) {
          dict.Add(ai, i);
        }
      }
 
      return new[] { -1, -1 };
    }
 
    private static void Solve(Func<int[], int, int[]> solver, int runs) {
      string jsonGet = client.GetAsync(CHALLENGE_URL).Result.Content.ReadAsStringAsync().Result;
 
      dynamic obj = JsonConvert.DeserializeObject(jsonGet);
      int target = obj.k;
      int[] list = ((JArray)obj.list).ToObject<IEnumerable<int>>().ToArray();
 
      int[] solution = null;
      Messung(runs, () => solution = solver(list, target));
 
      string jsonResponse(int[] s) => $"{{\"token\": [{string.Join(", ", s)}]}}";
 
      string response = client.PostAsync(SOLUTIONS_URL,
      new StringContent(jsonResponse(solution), Encoding.UTF8, "application/json")).Result.Content.ReadAsStringAsync().Result;
 
      if (response != "Success") {
        Clear();
        WriteLine("<- - - E R R O R - - ->");
        WriteLine($"K: {target}");
        WriteLine($"List:\n[{string.Join(", ", list)}]");
        WriteLine($"My Solution: [{string.Join(", ", solution)}]");
        WriteLine($"Status: {response}");
        WriteLine("<- - - E R R O R - - ->");
      }
    }
 
    private static void Main(string[] args) {
      try {
        do {
          const int RUNS = 20000;
          WriteLine("Dictionary:");
          Solve(SolveWithDictionary, RUNS);
        } while (ReadKey().Key != ConsoleKey.Escape);
      } catch (Exception ex) {
        WriteLine(ex.StackTrace);
        ReadKey();
      }
    }
  }
}

Comments