Определите следующее улучшение здания в «Монополии»

Каждая улица в «Монополии» состоит из 2 или 3 разных объектов.

Когда пользователь модернизирует улицу, он построит 1 из 3 зданий на соответствующем участке.

  • Дом — наименее ценный, будет построен по умолчанию, максимум 16 на каждый объект.

  • Отель - стоит 3 дома. Максимум 8 на объект.

  • Небоскреб — самый ценный, его постройка стоит 2 отеля, максимум 1 на каждый объект.

Каждый тип здания должен быть расположен равномерно. Например, если есть 2 объекта недвижимости, порядок обновлений будет следующим:

  1. Дом на участке 1
  2. Дом на участке 2
  3. Дом на участке 1
  4. Дом на участке 2
  5. Дом на участке 1
  6. Дом на участке 2
  7. Отель на участке 1 (также удалите 3 дома)
  8. Отель на участке 2 (также удалите 3 дома)
  9. Дом на участке 1

Единственный раз, когда на участке будет более 3 домов, это после того, как небоскребы и отели будут заполнены до максимума, тогда дома будут складываться до 16 на каждом участке.

Мне нужна функция, которая это вычислит. Параметры этой функции: numOfProperties, numOfSkyScrapers, numOfHotels, numOfHouses, и ей необходимо вывести, какое здание должно быть следующим.

Эта функция не может использовать цикл. Я думаю, что оператор mod был бы полезен.

Мой код ниже работает, когда есть 1 свойство. Но с двумя объектами апгрейд 8 — это дом, хотя он должен быть отелем. Это потому, что после первого обновления отеля он удаляет 3 дома, поэтому общее число снова становится 3, и строится еще один дом.

Я не уверен, как я могу сделать это динамичным и работать для любого количества свойств.

function nextBuilding(numProperties, numHouses, numHotels, numSkyscrapers) {
    // Maximum limits per property
    const maxHousesPerProperty = 16;
    const maxHotelsPerProperty = 8;
    const maxSkyscrapersPerProperty = 1;

    // Conversion ratios
    const housesPerHotel = 3;
    const hotelsPerSkyscraper = 2;

    // Calculate the number of buildings per property
    const housesPerProperty = Math.floor(numHouses / numProperties);
    const hotelsPerProperty = Math.floor(numHotels / numProperties);
    const skyscrapersPerProperty = Math.floor(numSkyscrapers / numProperties);

    // Calculate remainders to help balance the properties
    const housesRemainder = numHouses % numProperties;
    const hotelsRemainder = numHotels % numProperties;
    const skyscrapersRemainder = numSkyscrapers % numProperties;

    // Determine the position for the next building
    const nextPropertyIndex = (numHouses + (numHotels * housesPerHotel) + (numSkyscrapers * hotelsPerSkyscraper * housesPerHotel)) % numProperties;

    // Determine the next building to construct
    if ((skyscrapersPerProperty < maxSkyscrapersPerProperty) && (numHotels >= hotelsPerSkyscraper)) {
        // Check if there are enough hotels for the next skyscraper
        return "skyscraper";
    }
    if ((hotelsPerProperty < maxHotelsPerProperty) && (numHouses >= housesPerHotel)) {
        // Check if there are enough houses for the next hotel
        return "hotel";
    }
    if (housesPerProperty < maxHousesPerProperty) {
        return "house";
    }

    return "No building needed";
}

🤔 А знаете ли вы, что...
JavaScript поддерживает работу с графикой и аудио, что позволяет создавать мультимедийные веб-приложения.


2
71
1

Ответ:

Решено

Код Ruby (Javascript IDK; читается как псевдокод):

def f(numOfHouses, numOfHotels, numOfSkyScrapers, numOfProperties)
  return "skyScraper" if numOfSkyScrapers % numOfProperties != 0
  return "skyScraper" if numOfSkyScrapers == 0 && numOfHotels == numOfProperties * 2
  return "hotel" if numOfHotels % numOfProperties != 0
  return "hotel" if numOfHotels < 8 * numOfProperties && numOfHouses == numOfProperties * 3
  return "house" if numOfHouses < 16
  return "no building needed"
end

Это понятно? Мы строим небоскребы, если либо мы не исчерпаны и у нас есть нужное количество отелей, либо мы находимся в процессе строительства набора небоскребов (поэтому количество свойств модов не равно нулю).

Если мы не строим небоскребы, мы строим отели, следуя той же логике.

В противном случае мы строим дома, если у нас есть возможности.

Пример вывода:

> f(0,0,0,2)
=> "house"
> f(1,0,0,2)
=> "house"
> f(2,0,0,2)
=> "house"
> f(3,0,0,2)
=> "house"
> f(4,0,0,2)
=> "house"
> f(5,0,0,2)
=> "house"
> f(6,0,0,2)
=> "hotel"
> f(3,1,0,2)
=> "hotel"
> f(0,2,0,2)
=> "house"
> f(1,2,0,2)
=> "house"
> f(2,2,0,2)
=> "house"
> f(6,2,0,2)
=> "hotel"
> f(3,3,0,2)
=> "hotel"
> f(0,4,0,2)
=> "skyScraper"