using System; using System.Collections.Generic; using System.Linq;
public class Test
{
public static void Main()
{
//only labelled vertices (should be 21)
int count = 0;
foreach (string triangle in FindTriangles("EAF", "GH", "BC", "EB", "EGD", "AGB", "AD", "AHC", "FHD", "FC", "BD", "CD")) {
Console.WriteLine(triangle);
count++;
}
Console.WriteLine(count);
Console.WriteLine();
//all vertices (should be 40)
count = 0;
foreach (string triangle in FindTriangles("EAF", "GIH", "BKJLC", "EB", "EGKD", "AGB", "AIJD", "AHC", "FHLD", "FC", "BD", "CD")) {
Console.WriteLine(triangle);
count++;
}
Console.WriteLine(count);
}
public static IEnumerable<string> FindTriangles(params string[] lines) { //http://p...content-available-to-author-only...e.com/questions/22889
var edges = (
from line in lines
let length = line.Length
from a in Enumerable.Range(0, length-1)
from b in Enumerable.Range(a+1, length-a-1)
select new string(new [] { line[a], line[b] })
).ToList();
var vertices = new HashSet<char>();
int len = edges.Count;
for (int a = 0; a < len; a++) {
for (int b = a + 1; b < len; b++) {
for (int c = b + 1; c < len; c++) {
string edge = edges[a];
vertices.Add(edge[0]);
vertices.Add(edge[1]);
edge = edges[b];
vertices.Add(edge[0]);
vertices.Add(edge[1]);
edge = edges[c];
vertices.Add(edge[0]);
vertices.Add(edge[1]);
if (vertices.Count == 3) {
string result = string.Join("", vertices);
if (!lines.Any(l => l.Contains(result[0]) && l.Contains(result[1]) && l.Contains(result[2])))
yield return result;
}
vertices.Clear();
}
}
}
}
}
dXNpbmcgU3lzdGVtOyB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsgdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJLy9vbmx5IGxhYmVsbGVkIHZlcnRpY2VzIChzaG91bGQgYmUgMjEpCgkJaW50IGNvdW50ID0gMDsKCQlmb3JlYWNoIChzdHJpbmcgdHJpYW5nbGUgaW4gRmluZFRyaWFuZ2xlcygiRUFGIiwgIkdIIiwgIkJDIiwgIkVCIiwgIkVHRCIsICJBR0IiLCAiQUQiLCAiQUhDIiwgIkZIRCIsICJGQyIsICJCRCIsICJDRCIpKSB7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKHRyaWFuZ2xlKTsKCQkJY291bnQrKzsKCQl9CgkJQ29uc29sZS5Xcml0ZUxpbmUoY291bnQpOwoJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJLy9hbGwgdmVydGljZXMgKHNob3VsZCBiZSA0MCkKCQljb3VudCA9IDA7CgkJZm9yZWFjaCAoc3RyaW5nIHRyaWFuZ2xlIGluIEZpbmRUcmlhbmdsZXMoIkVBRiIsICJHSUgiLCAiQktKTEMiLCAiRUIiLCAiRUdLRCIsICJBR0IiLCAiQUlKRCIsICJBSEMiLCAiRkhMRCIsICJGQyIsICJCRCIsICJDRCIpKSB7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKHRyaWFuZ2xlKTsKCQkJY291bnQrKzsKCQl9CgkJQ29uc29sZS5Xcml0ZUxpbmUoY291bnQpOwoJfQoJCglwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPHN0cmluZz4gRmluZFRyaWFuZ2xlcyhwYXJhbXMgc3RyaW5nW10gbGluZXMpIHsgLy9odHRwOi8vcC4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vcXVlc3Rpb25zLzIyODg5CgkJdmFyIGVkZ2VzID0gKAoJCQlmcm9tIGxpbmUgaW4gbGluZXMKCQkJbGV0IGxlbmd0aCA9IGxpbmUuTGVuZ3RoCgkJCWZyb20gYSBpbiBFbnVtZXJhYmxlLlJhbmdlKDAsIGxlbmd0aC0xKQoJCQlmcm9tIGIgaW4gRW51bWVyYWJsZS5SYW5nZShhKzEsIGxlbmd0aC1hLTEpCgkJCXNlbGVjdCBuZXcgc3RyaW5nKG5ldyBbXSB7IGxpbmVbYV0sIGxpbmVbYl0gfSkKCQkpLlRvTGlzdCgpOwoJCXZhciB2ZXJ0aWNlcyA9IG5ldyBIYXNoU2V0PGNoYXI+KCk7CgkJaW50IGxlbiA9IGVkZ2VzLkNvdW50OwoJCWZvciAoaW50IGEgPSAwOyBhIDwgbGVuOyBhKyspIHsKCQkJZm9yIChpbnQgYiA9IGEgKyAxOyBiIDwgbGVuOyBiKyspIHsKCQkJCWZvciAoaW50IGMgPSBiICsgMTsgYyA8IGxlbjsgYysrKSB7CgkJCQkJc3RyaW5nIGVkZ2UgPSBlZGdlc1thXTsKCQkJCQl2ZXJ0aWNlcy5BZGQoZWRnZVswXSk7CgkJCQkJdmVydGljZXMuQWRkKGVkZ2VbMV0pOwoJCQkJCWVkZ2UgPSBlZGdlc1tiXTsKCQkJCQl2ZXJ0aWNlcy5BZGQoZWRnZVswXSk7CgkJCQkJdmVydGljZXMuQWRkKGVkZ2VbMV0pOwoJCQkJCWVkZ2UgPSBlZGdlc1tjXTsKCQkJCQl2ZXJ0aWNlcy5BZGQoZWRnZVswXSk7CgkJCQkJdmVydGljZXMuQWRkKGVkZ2VbMV0pOwoJCQkJCWlmICh2ZXJ0aWNlcy5Db3VudCA9PSAzKSB7CgkJCQkJCXN0cmluZyByZXN1bHQgPSBzdHJpbmcuSm9pbigiIiwgdmVydGljZXMpOwoJCQkJCQlpZiAoIWxpbmVzLkFueShsID0+IGwuQ29udGFpbnMocmVzdWx0WzBdKSAmJiBsLkNvbnRhaW5zKHJlc3VsdFsxXSkgJiYgbC5Db250YWlucyhyZXN1bHRbMl0pKSkKCQkJCQkJCXlpZWxkIHJldHVybiByZXN1bHQ7CgkJCQkJfQoJCQkJCXZlcnRpY2VzLkNsZWFyKCk7CgkJCQl9CgkJCX0KCQl9Cgl9CgkKfQ==