-1

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!

bbnn
  • 3,505
  • 10
  • 50
  • 68
  • 1
    What did you learn from [your previous question on the topic](http://stackoverflow.com/q/39467778/2336725)? – Teepeemm Sep 13 '16 at 14:29

1 Answers1

2

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. ;)

md5
  • 23,373
  • 3
  • 44
  • 93
  • @beeant: Every algorithm can be made "artificially" recursive, but I have to say I don't see any natural recursive substructure here... Why do you want to use recursion? – md5 Sep 13 '16 at 12:18
  • do you think there's a recursive substructure on the function for finding k? – bbnn Sep 13 '16 at 13:00
  • @beeant I gave you iterative code in previous topic. Have you seen it? – MBo Sep 13 '16 at 15:18
  • where is the previous topic? Right now I just use binary search to find the k. – bbnn Sep 13 '16 at 17:17