Milo Engineering Problem #2
I’m a fan of Ted Dziuba and enjoy reading his blog. I follow his twitter and he sent out a tweet a couple hours ago, apparently Bryce over at SctollingText posted his solution to his company’s (Milo) engineering challenge. You can take a look at Milo’s Engineering Challenge #2 for yourself. It’s a great little logic problem and engineering puzzle. The problem, Bryce got it wrong, opps. And he forgot to credit Milo, double opps. Oh did I mention it’s the MILO’s ENGINEERING CHALLENGE!!!!
I hate posting results to evaluation challenges, usually I play with them behind the scenes. But seeming this wrong answer is in the wild I wanted to take a crack at it. I’m using my language of choice, C#, and because the challenge mentioned language specific features I used Linq, TPL, auto properties, etc. Seeming Ted’s a *NIX guy I’m sure he doesn’t realize how bad he’s got it compared to us Windows programmers.
I time boxed 30 minutes to get something done. I went a little over but not by too much. Factor in this blog post and I’m probably a little over an hour spent on it. I didn’t have enough time to get to the 3rd part of the challenge, and it seems the most time/code intensive bit. My working theory was creating an array of all the unique parts of a name (length of 2 or more chars), then searching for an occurrence of any of those in the target string.
Logic.cs File
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace EP2CS
{
public class Logic
{
public List<Product> Products { get; set;}
public List<Customer> Customers { get; set; }
public void PopulateProductsAndCustomersLists(string productsFileLocation, string customersFileLocation)
{
// Reset our lists
Products = new List<Product>();
Customers = new List<Customer>();
// Load and read the products file
if (File.Exists(productsFileLocation))
{
string[] lines = File.ReadAllLines(productsFileLocation);
Parallel.ForEach(lines, line =>
{
Product p = new Product();
p.Name = line;
p.IsNameEven = (p.Name.Length % 2 == 0);
if (p.IsNameEven)
p.Multipler = 1.5f;
else
p.Multipler = 1f;
Products.Add(p);
}
);
}
// Load and read the customers file
if (File.Exists(customersFileLocation))
{
string[] lines = File.ReadAllLines(customersFileLocation);
Parallel.ForEach(lines, line =>
{
Customer c = new Customer();
c.Name = line;
c.VowelCount = StringHelpers.CountVowels(c.Name);
Customers.Add(c);
}
);
}
}
public List<Suitability> ScoreCustomersAndProducts()
{
if (Products == null || Customers == null)
return null;
List<Suitability> suitability = new List<Suitability>();
List<Customer> pickList = new List<Customer>(Customers);
Parallel.ForEach(Products, product =>
{
Customer c = null;
lock (pickList)
{
while (c == null)
{
c = pickList.First();
pickList.Remove(c);
}
}
Suitability s = new Suitability();
s.Customer = c;
s.Product = product;
if (product.IsNameEven)
s.Score = c.VowelCount * product.Multipler;
else
s.Score = c.ConsonantCount * product.Multipler;
suitability.Add(s);
}
);
return suitability;
}
}
}
Customers:
Mark
Jason
Gabe
Terry
Bud
Debbie
Dale
Dean
Paul
Shawn
Products:
Epic Cool Prod
Epic Cool Prod II
Epic Cool Prod III
Cheap Junk
Imported Lead Filled Toy
The Result:
Scoring Result ========================= Result Count: 5 Total Score: 12 Product: Cheap Junk Length: 10 Multipler: 1.5 Customer: Dean Length: 4 Vowels: 2 Consonants: 2 Score: 3 Product: Epic Cool Prod II Length: 17 Multipler: 1 Customer: Debbie Length: 6 Vowels: 3 Consonants: 3 Score: 3 Product: Epic Cool Prod Length: 14 Multipler: 1.5 Customer: Gabe Length: 4 Vowels: 2 Consonants: 2 Score: 3 Product: Imported Lead Filled Toy Length: 24 Multipler: 1.5 Customer: Shawn Length: 5 Vowels: 1 Consonants: 4 Score: 1.5 Product: Epic Cool Prod III Length: 18 Multipler: 1.5 Customer: Terry Length: 5 Vowels: 1 Consonants: 4 Score: 1.5
Spent more time on it then I wanted but I think it’s working for the first two requirements. My initial thoughts on completing the third part would be pretty CPU/Mem intensive so I’d have to play with it a little to come up with a more elegant solution.