using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
{
public static TableClass _MyTable = new TableClass();
public class TableRow
{
public int ID;
public string Name;
public string Hair;
public string Eyes;
public TableRow(int _ID, string _Name, string _Hair, string _Eyes)
{
ID = _ID;
Name = _Name;
Hair = _Hair;
Eyes = _Eyes;
}
}
public class TableClass
{
public List<TableRow> Table = new List<TableRow>();
}
static void Main(string[] args)
{
// ID Name Hair Eyes
// 1 John Black Brown
// 2 Paul Brown Green
// 3 Ringo Blond Blue
// 4 George Red Blue
// 5 John * *
// 6 John * Brown
// 7 * Red *
// 8 * * *
// 9 Paul * *
CreateTable();
ShowTable();
FindID("John", "Black", "Brown"); // should return 1, complete match
FindID("John", "Red", "Green"); // should return 5 (not 7), matched on "John" and the other two wildcards (*)
FindID("John", "Red", "Brown"); // should return 6, matched on "John" and "Brown" and one wildcard
FindID("Brian", "Grey", "Grey"); // should return 8, matched on three wildcard
}
static bool match(TableRow row, string _Name, string _Hair, string _Eyes)
{
return (row.Name == _Name || row.Name == "*") && (row.Hair == _Hair || row.Hair == "*") && (row.Eyes == _Eyes || row.Eyes == "*");
}
static int score(TableRow row)
{
//can assume these already "match"
var score = 0;
score += row.Name == "*" ? 1000 : 2000;
score += row.Hair == "*" ? 100 : 200;
score += row.Eyes == "*" ? 10 : 20;
return score;
}
static int FindID(string _Name, string _Hair, string _Eyes)
{
// needs to be implemented
var s = from row in _MyTable.Table
where match(row, _Name, _Hair, _Eyes)
orderby score(row) descending
select row;
Console.WriteLine(s.First().ID);
return 0;
}
static void CreateTable()
{
_MyTable.Table.Add(new TableRow(1, "John", "Black", "Brown"));
_MyTable.Table.Add(new TableRow(2, "Paul", "Brown", "Green"));
_MyTable.Table.Add(new TableRow(3, "Ringo", "Blond", "Blue"));
_MyTable.Table.Add(new TableRow(4, "George", "Red", "Blue"));
_MyTable.Table.Add(new TableRow(5, "John", "*", "*"));
_MyTable.Table.Add(new TableRow(6, "John", "*", "Brown"));
_MyTable.Table.Add(new TableRow(7, "*", "Red", "*"));
_MyTable.Table.Add(new TableRow(8, "*", "*", "*"));
_MyTable.Table.Add(new TableRow(9, "Paul", "*", "*"));
}
static void ShowTable()
{
foreach(TableRow _TableRow in _MyTable.Table)
{
Console.WriteLine("{0} {1} {2} {3}", _TableRow.ID, _TableRow.Name, _TableRow.Hair, _TableRow.Eyes);
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UZXh0OwoKY2xhc3MgUHJvZ3JhbQogICAgewogICAgICAgIHB1YmxpYyBzdGF0aWMgVGFibGVDbGFzcyBfTXlUYWJsZSA9IG5ldyBUYWJsZUNsYXNzKCk7CgogICAgICAgIHB1YmxpYyBjbGFzcyBUYWJsZVJvdwogICAgICAgIHsKICAgICAgICAgICAgcHVibGljIGludCBJRDsKICAgICAgICAgICAgcHVibGljIHN0cmluZyBOYW1lOwogICAgICAgICAgICBwdWJsaWMgc3RyaW5nIEhhaXI7CiAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRXllczsKCiAgICAgICAgICAgIHB1YmxpYyBUYWJsZVJvdyhpbnQgX0lELCBzdHJpbmcgX05hbWUsIHN0cmluZyBfSGFpciwgc3RyaW5nIF9FeWVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBJRCA9IF9JRDsKICAgICAgICAgICAgICAgIE5hbWUgPSBfTmFtZTsKICAgICAgICAgICAgICAgIEhhaXIgPSBfSGFpcjsKICAgICAgICAgICAgICAgIEV5ZXMgPSBfRXllczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVibGljIGNsYXNzIFRhYmxlQ2xhc3MKICAgICAgICB7CiAgICAgICAgICAgIHB1YmxpYyBMaXN0PFRhYmxlUm93PiBUYWJsZSA9IG5ldyBMaXN0PFRhYmxlUm93PigpOwogICAgICAgIH0KCiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgICAgIHsKICAgICAgICAgICAgLy8gSUQgICAgICAgTmFtZSAgICAgICAgSGFpciAgICAgICAgRXllcwogICAgICAgICAgICAvLyAxICAgICAgICBKb2huICAgICAgICBCbGFjayAgICAgICBCcm93bgogICAgICAgICAgICAvLyAyICAgICAgICBQYXVsICAgICAgICBCcm93biAgICAgICBHcmVlbgogICAgICAgICAgICAvLyAzICAgICAgICBSaW5nbyAgICAgICBCbG9uZCAgICAgICBCbHVlCiAgICAgICAgICAgIC8vIDQgICAgICAgIEdlb3JnZSAgICAgIFJlZCAgICAgICAgIEJsdWUKICAgICAgICAgICAgLy8gNSAgICAgICAgSm9obiAgICAgICAgKiAgICAgICAgICAgKgogICAgICAgICAgICAvLyA2ICAgICAgICBKb2huICAgICAgICAqICAgICAgICAgICBCcm93bgogICAgICAgICAgICAvLyA3ICAgICAgICAqICAgICAgICAgICBSZWQgICAgICAgICAqCiAgICAgICAgICAgIC8vIDggICAgICAgICogICAgICAgICAgICogICAgICAgICAgICoKICAgICAgICAgICAgLy8gOSAgICAgICAgUGF1bCAgICAgICAgKiAgICAgICAgICAgKgoKICAgICAgICAgICAgQ3JlYXRlVGFibGUoKTsKCiAgICAgICAgICAgIFNob3dUYWJsZSgpOwoKICAgICAgICAgICAgRmluZElEKCJKb2huIiwgIkJsYWNrIiwgIkJyb3duIik7ICAvLyBzaG91bGQgcmV0dXJuIDEsIGNvbXBsZXRlIG1hdGNoCgogICAgICAgICAgICBGaW5kSUQoIkpvaG4iLCAiUmVkIiwgIkdyZWVuIik7ICAvLyBzaG91bGQgcmV0dXJuIDUgKG5vdCA3KSwgbWF0Y2hlZCBvbiAiSm9obiIgYW5kIHRoZSBvdGhlciB0d28gd2lsZGNhcmRzICgqKQoKICAgICAgICAgICAgRmluZElEKCJKb2huIiwgIlJlZCIsICJCcm93biIpOyAgLy8gc2hvdWxkIHJldHVybiA2LCBtYXRjaGVkIG9uICJKb2huIiBhbmQgIkJyb3duIiBhbmQgb25lIHdpbGRjYXJkCgogICAgICAgICAgICBGaW5kSUQoIkJyaWFuIiwgIkdyZXkiLCAiR3JleSIpOyAgLy8gc2hvdWxkIHJldHVybiA4LCBtYXRjaGVkIG9uIHRocmVlIHdpbGRjYXJkCgogICAgICAgICAgICAKICAgICAgICB9CgoJc3RhdGljIGJvb2wgbWF0Y2goVGFibGVSb3cgcm93LCBzdHJpbmcgX05hbWUsIHN0cmluZyBfSGFpciwgc3RyaW5nIF9FeWVzKQoJewoJCXJldHVybiAocm93Lk5hbWUgPT0gX05hbWUgfHwgcm93Lk5hbWUgPT0gIioiKSAmJiAocm93LkhhaXIgPT0gX0hhaXIgfHwgcm93LkhhaXIgPT0gIioiKSAmJiAocm93LkV5ZXMgPT0gX0V5ZXMgfHwgcm93LkV5ZXMgPT0gIioiKTsKCX0KCglzdGF0aWMgaW50IHNjb3JlKFRhYmxlUm93IHJvdykKCXsKCQkvL2NhbiBhc3N1bWUgdGhlc2UgYWxyZWFkeSAibWF0Y2giCgkJdmFyIHNjb3JlID0gMDsKCQlzY29yZSArPSAgcm93Lk5hbWUgPT0gIioiID8gMTAwMCA6IDIwMDA7IAoJCXNjb3JlICs9ICByb3cuSGFpciA9PSAiKiIgPyAxMDAgOiAyMDA7IAoJCXNjb3JlICs9ICByb3cuRXllcyA9PSAiKiIgPyAxMCA6IDIwOyAKCQlyZXR1cm4gc2NvcmU7Cgl9CgogICAgICAgIHN0YXRpYyBpbnQgRmluZElEKHN0cmluZyBfTmFtZSwgc3RyaW5nIF9IYWlyLCBzdHJpbmcgX0V5ZXMpCiAgICAgICAgewogICAgICAgICAgICAvLyBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZAoJICAgIHZhciBzID0gZnJvbSByb3cgaW4gX015VGFibGUuVGFibGUKCQkJd2hlcmUgbWF0Y2gocm93LCBfTmFtZSwgX0hhaXIsIF9FeWVzKQoJCQlvcmRlcmJ5IHNjb3JlKHJvdykgZGVzY2VuZGluZwoJCQlzZWxlY3Qgcm93OwoKCQkKCQlDb25zb2xlLldyaXRlTGluZShzLkZpcnN0KCkuSUQpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyB2b2lkIENyZWF0ZVRhYmxlKCkKICAgICAgICB7CiAgICAgICAgICAgIF9NeVRhYmxlLlRhYmxlLkFkZChuZXcgVGFibGVSb3coMSwgIkpvaG4iLCAiQmxhY2siLCAiQnJvd24iKSk7CiAgICAgICAgICAgIF9NeVRhYmxlLlRhYmxlLkFkZChuZXcgVGFibGVSb3coMiwgIlBhdWwiLCAiQnJvd24iLCAiR3JlZW4iKSk7CiAgICAgICAgICAgIF9NeVRhYmxlLlRhYmxlLkFkZChuZXcgVGFibGVSb3coMywgIlJpbmdvIiwgIkJsb25kIiwgIkJsdWUiKSk7CiAgICAgICAgICAgIF9NeVRhYmxlLlRhYmxlLkFkZChuZXcgVGFibGVSb3coNCwgIkdlb3JnZSIsICJSZWQiLCAiQmx1ZSIpKTsKICAgICAgICAgICAgX015VGFibGUuVGFibGUuQWRkKG5ldyBUYWJsZVJvdyg1LCAiSm9obiIsICIqIiwgIioiKSk7CiAgICAgICAgICAgIF9NeVRhYmxlLlRhYmxlLkFkZChuZXcgVGFibGVSb3coNiwgIkpvaG4iLCAiKiIsICJCcm93biIpKTsKICAgICAgICAgICAgX015VGFibGUuVGFibGUuQWRkKG5ldyBUYWJsZVJvdyg3LCAiKiIsICJSZWQiLCAiKiIpKTsKICAgICAgICAgICAgX015VGFibGUuVGFibGUuQWRkKG5ldyBUYWJsZVJvdyg4LCAiKiIsICIqIiwgIioiKSk7CiAgICAgICAgICAgIF9NeVRhYmxlLlRhYmxlLkFkZChuZXcgVGFibGVSb3coOSwgIlBhdWwiLCAiKiIsICIqIikpOwogICAgICAgIH0KCiAgICAgICAgc3RhdGljIHZvaWQgU2hvd1RhYmxlKCkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goVGFibGVSb3cgX1RhYmxlUm93IGluIF9NeVRhYmxlLlRhYmxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezB9IHsxfSB7Mn0gezN9IiwgX1RhYmxlUm93LklELCBfVGFibGVSb3cuTmFtZSwgX1RhYmxlUm93LkhhaXIsIF9UYWJsZVJvdy5FeWVzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0=