using System.Collections.Generic;
using System.Globalization;
public static void Main()
var input = @"photo.jpg, Warsaw, 2013-09-05 14:08:15
john.png, London, 2015-06-20 15:13:22
myFriends.png, Warsaw, 2013-09-05 14:07:13
Eiffel.jpg, Paris, 2015-07-23 08:03:02
pisatower.jpg, Paris, 2015-07-22 23:59:59
BOB.jpg, London, 2015-08-05 00:02:03
notredame.png, Paris, 2015-09-01 12:00:00
me.jpg, Warsaw, 2013-09-06 15:40:22
a.png, Warsaw, 2016-02-13 13:33:50
b.jpg, Warsaw, 2016-01-02 15:12:22
c.jpg, Warsaw, 2016-01-02 14:34:30
d.jpg, Warsaw, 2016-01-02 15:15:01
e.png, Warsaw, 2016-01-02 09:49:09
f.png, Warsaw, 2016-01-02 10:55:32
g.jpg, Warsaw, 2016-02-29 22:13:11";
var output = @"Warsaw02.jpg
var resultQ3 = Solution_Q3(input);
Console.WriteLine("\n\tResult:\n{0}\n\n\tExpected:\n{1}", resultQ3, output);
public static string Solution_Q3(string S)
const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
var lines = S.Split('\n');
var items = new List<Tuple<int, string, string, DateTime>>();
var results = new Dictionary<int, string>();
for (int index = 0; index < lines.Length; index++)
var blocks = line.Split(',').Select(z => z.Trim()).ToArray();
var filenameSplits = blocks[0].Split('.');
var extension = filenameSplits[1].Trim();
var cityName = TrimAndClean(blocks[1], 20);
var dateTime = DateTime.ParseExact(blocks[2], DateTimeFormat, CultureInfo.InvariantCulture).ToUniversalTime();
items.Add(Tuple.Create(index, extension, cityName, dateTime));
foreach (var groupItem in groups)
foreach (var item in groupItem)
var counterString = new string('0', groupItem.Count().ToString().Length);
var filename = string.Format("{0}{1}.{2}", item.Item3, counter.ToString(counterString), item.Item2);
results.Add(item.Item1, filename);
var returnResults = results
return string.Join("\n", returnResults);
private static string TrimAndClean(string s, int nrChars)
var trimmed = s.Trim().ToLowerInvariant();
var maxLen = Math.Min(trimmed.Length, nrChars);
var text = Char.ToUpperInvariant(trimmed[0]) + trimmed.Substring(1, maxLen - 1);