Каждая улица в «Монополии» состоит из 2 или 3 разных объектов.
Когда пользователь модернизирует улицу, он построит 1 из 3 зданий на соответствующем участке.
Дом — наименее ценный, будет построен по умолчанию, максимум 16 на каждый объект.
Отель - стоит 3 дома. Максимум 8 на объект.
Небоскреб — самый ценный, его постройка стоит 2 отеля, максимум 1 на каждый объект.
Каждый тип здания должен быть расположен равномерно. Например, если есть 2 объекта недвижимости, порядок обновлений будет следующим:
Единственный раз, когда на участке будет более 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 поддерживает работу с графикой и аудио, что позволяет создавать мультимедийные веб-приложения.
Код 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"