using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions;
public static void Main()
using (WebClient client = new WebClient())
var inputString = client.DownloadString(@"http://tiskotown.org/input10.txt");
var nums = inputString.Split("\r\n").Select(x => int.Parse(x)).OrderBy(x => x).ToList();
var canBeRemoved = new List<int>();
while (i < nums.Count()-1)
var diff1 = nums[i+1]-nums[i];
var diff2 = nums[(i + 2 < nums.Count() - 1) ? (i + 2) : (i + 1)] - nums[i + 1];
if (diff1 == 1 && diff2==1)
canBeRemoved.Add(nums[i+1]);
var removableCombinations = new List<List<int>>();
var combinationLength = canBeRemoved.Count;
while (combinationLength > 0)
Console.WriteLine(combinationLength);
GenerateCombination(new List<int>(), 0, combinationLength);
Console.WriteLine(removableCombinations.Count(IsValid) + 1);
void GenerateCombination(List<int> combination, int index, int len)
removableCombinations.Add(combination.ToList());
for (int j = index; j < canBeRemoved.Count; j++)
var list = new List<int>();
list.AddRange(combination.ToList());
list.Add(canBeRemoved[j]);
GenerateCombination(list, j + 1, len - 1);
bool IsValid(List<int> testable)
var copy = nums.ToList();
var removed = copy.Except(testable).ToList();
var isValid = removed.All(x =>
var ind = removed.IndexOf(x);
if (ind < removed.Count-1 && (removed[ind + 1] - removed[ind] > 3)) return false;
string validRegEx(string pattern, string input)
var regEx = new Regex(pattern);
var matches = regEx.Matches(input);
return matches.Any() ? matches[0].Value : null;