Рулоны обоев, необходимые для украшения комнаты (головоломка на Javascript)

#javascript

#javascript

Вопрос:

Я новичок в Javascript и действительно борюсь с этой головоломкой от CodeWars.

Джон хочет украсить комнату обоями. Комната имеет размеры: ширина (w), высота (h), длина (l). Один рулон обоев имеет размеры 52 см в ширину и 10 м в длину. Он хочет на 15% больше обоев, чем ему нужно, чтобы покрыть комнату. В случае ошибок или просчетов, поэтому он хочет купить длину на 15% больше, чем ему нужно.

Это то, что я придумал:

 function wallpaper(l, w, h) {
var totalArea= ((2*(l*h)) (2*(w*h))*1.15);  //wall area to be covered
var rollsNeeded= (Math.ceil(totalArea/5.2));
return rollsNeeded;
  

Несколько примеров текстовых обращений:

 Test.describe("wallpaper",function() {
Test.it("Basic tests",function() { 
  testing(wallpaper(6.3, 4.5, 3.29), 16);
  testing(wallpaper(7.8, 2.9, 3.29), 16);
  testing(wallpaper(6.3, 5.8, 3.13), 17);
  testing(wallpaper(6.1, 6.7, 2.81), 16);
})})enter code here
  

Но моя функция всегда возвращает на единицу меньше, чем в тестовом примере. Таким образом, вместо 16 я получаю 15, вместо 17 я получаю 16. Я не знаю, допустил ли я ошибку с математикой или кодом…

Другие примечания: Все рулоны (даже с неполной шириной) помещаются от края до края 0 <= l, w, h (плавающие числа), может случиться так, что w x h x l равно нулю Целое число r (количество рулонов) всегда будет меньше или равно 20

Комментарии:

1. Первая ошибка, которую я вижу, заключается в том, что вы умножаете ширину на 1,15 — вам нужно умножить длину .

2. @vlaz Не так: w * (h * 1.5) совпадает с (w * h) * 1.5

3. Подождите, я думаю, я могу ошибаться — это длина комнаты , а не обои. Я думаю, что математика неверна, хотя я просто не могу точно понять, какой она должна быть.

4. @PeterSmith не то, чтобы это имело гораздо больше смысла даже тогда, хотя — вы все равно не получаете общее 15%

5. @vlaz Правильно! Я ненавижу математику, которая выглядит простой в пятницу днем. Я думаю, мне нужно нарисовать это на листе (настенной) бумаги!

Ответ №1:

Это скорее математическая задача, чем проблема с кодом, поэтому давайте сначала исправим математику:

Предположим, что это комната в форме куба, у нее четыре стены, каждая из которых представляет собой прямоугольник с шириной и высотой. Более того, противоположные стены должны быть точно такими же.

Итак, Джон хочет оклеить обоями всю площадь всех этих четырех стен. Предположительно, это странная комната без дверей или окон на стенах, но что угодно. Я предполагаю, что он входит и выходит через потолок или пол.

В комнате есть

  • ширина w
  • высота h
  • длина l

Что переводится как:

  • две стены, использующие ширину и высоту в качестве размеров, площадью w*h
  • две другие стены, использующие длину и высоту в качестве размеров, которые имеют площадь l*h

Итак, вот формула для общей площади:

 [2*(l*h)]   [2*(w*h)]
  

чтобы получить дополнительный материал, необходимый Джону, мы добавляем 15% к общему количеству.

 {[2*(l*h)]   [2*(w*h)]}   {[2*(l*h)]   [2*(w*h)]}*0.15
  

или

 {[2*(l*h)]   [2*(w*h)]}*1.15
  

ваш код выполняет следующие вычисления

 {[2*(l*h)]   [2*(w*h)]*1.15}
  

что добавляет 15% к площади только двух стен. Вы хотите (и, вероятно, намеревались) иметь умножение за пределами внешних скобок

 function wallpaper(l, w, h) {
  var totalArea= ((2*(l*h)) (2*(w*h)))*1.15;  //corrected
  var rollsNeeded= (Math.ceil(totalArea/5.2));
  return rollsNeeded;
}

function testing(result, expected) {
  console.log("Expected: "   expected   
              "ngot: "  result  
              "nsuccess: "   (result === expected));
}

testing(wallpaper(6.3, 4.5, 3.29), 16);
testing(wallpaper(7.8, 2.9, 3.29), 16);
testing(wallpaper(6.3, 5.8, 3.13), 17);
testing(wallpaper(6.1, 6.7, 2.81), 16);  

В качестве дополнения вы можете упростить формулу общей площади

 [2*(l*h)]   [2*(w*h)]
 = 2*l*h   2*w*h
 = 2*h*(l   w)
  

что делает код намного короче:

 var totalArea = (2*h*(l   w))*1.15;  //simplified
//or          : 2*h*(l   w)*1.15
//or even     : 2.3*h*(l   w)