Skip to content

Instantly share code, notes, and snippets.

@phongphan
Last active August 15, 2017 09:55
Show Gist options
  • Save phongphan/dea977a1e3144295490bff6098d66d25 to your computer and use it in GitHub Desktop.
Save phongphan/dea977a1e3144295490bff6098d66d25 to your computer and use it in GitHub Desktop.
An inefficient version of range-merge exam
/*
* Input example: 1,2,8-20,15-200
* Output: 1,2,8-200
*/
using System;
using System.Collections.Generic;
using System.Linq;
namespace Fold
{
internal class Program
{
public static void Main(string[] args)
{
while (true)
{
var ranges = NormalizeRange(ReadRangeSorted());
var enumerable = ranges as Tuple<int, int>[] ?? ranges.ToArray();
if (!enumerable.Any())
break;
PrintRanges(enumerable);
}
Console.WriteLine("Until next time...");
}
private static IEnumerable<Tuple<int, int>> NormalizeRange(IEnumerable<Tuple<int, int>> ranges)
{
var enumerable = ranges as Tuple<int, int>[] ?? ranges.ToArray();
if (!enumerable.Any())
return new List<Tuple<int, int>>();
return enumerable.Aggregate(new [] { enumerable.First() },
(prod, next) =>
{
var src = prod.Last();
if (next.Item1 >= src.Item1 && next.Item1 <= src.Item2)
{
return prod.TakeWhile((o, i) => i < prod.Length - 1).Concat(
new [] { Tuple.Create(src.Item1, Math.Max(src.Item2, next.Item2)) }).ToArray();
}
return prod.Concat(new [] { next }).ToArray();
}
);
}
private static IEnumerable<Tuple<int, int>> ReadRangeSorted()
{
return ReadRange()
.Select(t => t.Item1 <= t.Item2 ? t : Tuple.Create(t.Item2, t.Item1))
.OrderBy(t => t.Item1);
}
private static IEnumerable<Tuple<int, int>> ReadRange()
{
Console.Write(">> ");
var line = Console.ReadLine();
if (string.IsNullOrEmpty(line))
return new List<Tuple<int, int>>();
var ranges = line.Split(',').Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s))
.Select(s =>
{
var r = s.Split('-');
if (r.Length == 2)
return Tuple.Create(int.Parse(r[0]), int.Parse(r[1]));
var val = int.Parse(r[0]);
return Tuple.Create(val, val);
});
return ranges.ToList();
}
private static void PrintRanges(IEnumerable<Tuple<int, int>> ranges)
{
var sranges = ranges.Select(range => range.Item1 == range.Item2
? Convert.ToString(range.Item1)
: string.Format($"{range.Item1}-{range.Item2}"));
Console.WriteLine(string.Join(",", sranges));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment