tracks/csharp/exercises/word-search/Example.cs in trackler-2.2.1.153 vs tracks/csharp/exercises/word-search/Example.cs in trackler-2.2.1.154
- old
+ new
@@ -5,66 +5,74 @@
public class WordSearch
{
private readonly string[] rows;
private readonly int width;
private readonly int height;
+ private (int, int)[] positions;
- private static readonly Tuple<int, int>[] Directions =
+ private static readonly ValueTuple<int, int>[] Directions =
{
- new Tuple<int, int>( 1, 0),
- new Tuple<int, int>( 0, 1),
- new Tuple<int, int>(-1, 0),
- new Tuple<int, int>( 0, -1),
- new Tuple<int, int>( 1, 1),
- new Tuple<int, int>( 1, -1),
- new Tuple<int, int>(-1, 1),
- new Tuple<int, int>(-1, -1)
+ ( 1, 0),
+ ( 0, 1),
+ (-1, 0),
+ ( 0, -1),
+ ( 1, 1),
+ ( 1, -1),
+ (-1, 1),
+ (-1, -1)
};
public WordSearch(string puzzle)
{
rows = puzzle.Split('\n');
width = rows[0].Length;
height = rows.Length;
+ positions = Positions();
}
- public Tuple<Tuple<int, int>, Tuple<int, int>> Find(string word)
+ public Dictionary<string, ValueTuple<ValueTuple<int, int>, ValueTuple<int, int>>?> Search(IEnumerable<string> words)
{
+ return words.ToDictionary(word => word, Search);
+ }
+
+ private ValueTuple<ValueTuple<int, int>, ValueTuple<int, int>>? Search(string word)
+ {
return
Positions()
.SelectMany(position => Directions.SelectMany(direction => Find(word, position, direction)))
.FirstOrDefault();
}
- private IEnumerable<Tuple<Tuple<int, int>, Tuple<int, int>>> Find(string word, Tuple<int, int> position, Tuple<int, int> direction)
+ private IEnumerable<ValueTuple<ValueTuple<int, int>, ValueTuple<int, int>>> Find(string word, ValueTuple<int, int> position, ValueTuple<int, int> direction)
{
var current = position;
foreach (var letter in word)
{
if (FindChar(current) != letter)
{
yield break;
}
- current = new Tuple<int, int>(current.Item1 + direction.Item1, current.Item2 + direction.Item2);
+ current = (current.Item1 + direction.Item1, current.Item2 + direction.Item2);
}
- yield return Tuple.Create(position, new Tuple<int, int>(current.Item1 - direction.Item1, current.Item2 - direction.Item2));
+ yield return ValueTuple.Create(position, (current.Item1 - direction.Item1, current.Item2 - direction.Item2));
}
- private char? FindChar(Tuple<int, int> coordinate)
+ private char? FindChar(ValueTuple<int, int> coordinate)
{
if (coordinate.Item1 > 0 && coordinate.Item1 <= width && coordinate.Item2 > 0 && coordinate.Item2 <= height)
{
return rows[coordinate.Item2 - 1][coordinate.Item1 - 1];
}
return null;
}
- private IEnumerable<Tuple<int, int>> Positions()
+ private ValueTuple<int, int>[] Positions()
{
return Enumerable.Range(1, width).SelectMany(x =>
- Enumerable.Range(1, height).Select(y => new Tuple<int, int>(x, y)));
+ Enumerable.Range(1, height).Select(y => (x, y)))
+ .ToArray();
}
}
\ No newline at end of file