Pyramid.cs 880 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. namespace Day9;
  2. public class Pyramid
  3. {
  4. public Sequence Bottom { get; }
  5. private readonly IList<Sequence> _layers = new List<Sequence>();
  6. public Pyramid(Sequence bottom)
  7. {
  8. Bottom = bottom;
  9. Build();
  10. }
  11. public long Predict()
  12. {
  13. var next = 0L;
  14. foreach (var sequence in _layers.Reverse().Skip(1))
  15. {
  16. next = sequence.Next(next);
  17. }
  18. return next;
  19. }
  20. public long Retrodict()
  21. {
  22. var next = 0L;
  23. foreach (var sequence in _layers.Reverse().Skip(1))
  24. {
  25. next = sequence.Prev(next);
  26. }
  27. return next;
  28. }
  29. private void Build()
  30. {
  31. _layers.Add(Bottom);
  32. while (!_layers.Last().IsZeros())
  33. {
  34. _layers.Add(_layers.Last().Difference());
  35. }
  36. }
  37. }