Search code examples
algorithmmathrecursionpascals-triangletriangular

How to get the adjacent blocks in Floyd triangle?


I need to write a function to find the adjacent blocks in Floyd triangle.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

What is the formula to find the adjacent blocks (top, left, right, bottom) of a given value.

For example:

  • input 20 → output left: 19, right: 21, top: 15, bottom: 26
  • input 28 → output left: 27, right: -1, top: -1, bottom: 35
  • input 19 → output left: 18, right: 20, top: 14, bottom: 25

Thank you so much in advance!


Solution

  • The shifts needed to go up or down are uniquely determined by the identifier o the line. If n >= 1 in the given value, you have to find the largest integer k such that:

    k(k+1)/2 + 1 <= n <=> k^2 + k + 2(1 - n) <= 0
    

    This is a second-degree polynomial function:

    delta = 1 - 8(1 - n) = 8n - 7 > 0
    x1 = (-1 + sqrt(8n-7)) / 2 and x2 = (-1 - sqrt(8n-7)) / 2
    

    x2 < 0 < x1 so the 0-based identifier of the line is: k := floor((-1 + sqrt(8n-7)) / 2).

    After that: up it's n - k, down it's n + k + 1, left n - 1 and right n + 1. The corner cases (leftmost/rightmost/...) can be spotted with k as well, left to the reader. ;)