using System.Collections.Generic;
static void Main(string[] args)
var matrix = new string[] { "chill", "windd","windd", "snoww", "coldd", "chill", "chill", "coldd" };
var wordStream = new string[] { "ramii", "oshgku", "snoww", "windd", "windd", "ujhgt", "wrert", "coldd", "chill", "coldd", "coldd", "gthyu" };
var result = new WordFinderService(matrix).Find(wordStream);
Console.WriteLine(string.Join(",", result));
private readonly string[] _matrix;
public WordFinderService(IEnumerable<string> matrix)
_matrix = matrix.ToArray();
public IEnumerable<string> Find(IEnumerable<string> wordStream)
var leftRightSearch = new string(string.Join(string.Empty, _matrix).Take(64).ToArray());
var characterMatrix = _matrix
.Select(row => row.ToCharArray())
var topDownString = new StringBuilder();
for (var i = 0; i < characterMatrix.Length; i++)
for (var j = 0; j < characterMatrix[i].Length; j++)
if (characterMatrix[j].Length > i)
topDownString.Append(characterMatrix[j][i]);
var topDownSearch = topDownString.ToString();
var result = new List<KeyValuePair<int, string>>();
var wordStramArray = wordStream.ToArray();
for (int i = 0; i < wordStramArray.Length; i++)
var count = leftRightSearch.Split(wordStramArray[i]).Length - 1;
count += topDownSearch.Split(wordStramArray[i]).Length - 1;
result.Add(new KeyValuePair<int, string>(count, wordStramArray[i]));
return result.OrderByDescending(item => item.Key)
.Select(item => item.Value).ToList();