Генерация координат алмаза N-размера для Haskell - PullRequest
2 голосов
/ 08 октября 2019

Итак, мне нужно сгенерировать координаты, чтобы создать ромб на сетке. Я получу center (x, y) и высоту n от центра к вершине, затем мне нужно сгенерировать координаты [(x, y),..], чтобы напечатать что-то вроде этого (n = 4 и center = (4, 4)):

        #
      # # #
    # # # # #
  # # # # # # #
# # # # # # # # #
  # # # # # # #
    # # # # #
      # # #
        #

Где каждый # представляет позицию возвращаемого списка. Я понятия не имею, как это сделать.

Вот как я делаю это в kotlin:

fun diamond(n: Int, coord: Coord): List<Coord> {
  val coords = mutableSetOf<Coord>()
  for (i in 0..n) {
    for (j in 0..(n - i)) {
      coords.add(Coord((coord.x + i).absoluteValue, (coord.y + j).absoluteValue))
      coords.add(Coord((coord.x + i).absoluteValue, (coord.y - j).absoluteValue))
      coords.add(Coord((coord.x - i).absoluteValue, (coord.y + j).absoluteValue))
      coords.add(Coord((coord.x - i).absoluteValue, (coord.y - j).absoluteValue))
    }
  }
  return coords.toList()
}

PS: печать не проблема, мне просто нужны координаты.

1 Ответ

1 голос
/ 08 октября 2019

Мы можем сделать анализ предметов по координатам. Если центр находится в (x,y), то мы знаем, что есть один символ точно n мест над центром и 3 символов точно n-1 над центром. и т.д.

Таким образом, мы можем использовать понимание списка здесь:

coordinates :: Integral i => i -> i -> i -> [(i,i)]
coordinates x y n = [(x+dx, y+dy) | dy <- [-n .. n], let ay = n - abs dy, dx <- [-ay .. ay]]
...