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:
Thank you so much in advance!
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. ;)