Освоение Straights: группировка карт в последовательном порядке с помощью Scala

В захватывающем мире карточных игр одна общая цель — собрать комбинацию из стритов, в которой набор карт расположен в последовательном порядке. В этой статье блога мы рассмотрим различные методы в Scala для идентификации и группировки карт в последовательном порядке, что позволит вам с легкостью улучшить свои проекты карточных игр. Итак, давайте погрузимся и овладеем искусством создания прямых!

Метод 1: сортировка и итерация

Один из подходов к определению стритов — отсортировать карты, а затем перебирать отсортированный список, чтобы сгруппировать их. Вот пример реализации:

def identifyStraights(cards: List[Int]): List[List[Int]] = {
  val sortedCards = cards.sorted
  var straights: List[List[Int]] = List(List(sortedCards.head))
  sortedCards.tail.foreach { card =>
    if (card - straights.last.last == 1) {
      straights = straights.init :+ (straights.last :+ card)
    } else {
      straights = straights :+ List(card)
    }
  }
  straights.filter(_.length >= 3) // Optional: Filter out straights with less than three cards
}

Метод 2: скользящее окно

Другой метод предполагает использование скользящего окна для проверки последовательных карточек. Вот пример реализации:

def identifyStraights(cards: List[Int]): List[List[Int]] = {
  val straights = cards.sorted.sliding(3).collect {
    case a :: b :: c :: _ if b - a == 1 && c - b == 1 => List(a, b, c)
  }.toList
  straights
}

Метод 3: Рекурсия

Для определения стрэйтов также можно использовать рекурсивный подход. Этот метод работает путем рекурсивной проверки, может ли текущая карта расширить существующий стрейт. Вот пример реализации:

def identifyStraights(cards: List[Int]): List[List[Int]] = {
  def extendStraight(straights: List[List[Int]], card: Int): List[List[Int]] = {
    straights.flatMap { straight =>
      if (card - straight.last == 1)
        List(straight :+ card)
      else
        List(straight, List(card))
    }
  }
  val straights = cards.sorted.foldLeft(List(List.empty[Int])) { (acc, card) =>
    extendStraight(acc, card)
  }
  straights.filter(_.length >= 3) // Optional: Filter out straights with less than three cards
}

Используя возможности Scala, у вас теперь есть несколько методов для идентификации и группировки карт в последовательном порядке, чтобы сформировать комбинацию из стритов. Независимо от того, предпочитаете ли вы сортировку и итерацию, использование скользящего окна или рекурсивный подход, эти методы дадут вам возможность создавать увлекательные карточные игры. Итак, внедряйте эти методы в свои проекты Scala, и игра начнется!