Loading...
SvetlozarStoykov avatar SvetlozarStoykov 4 Точки

01. Car Wash

1.Car Wash

Write a JS function that receives some commands. Depending on the command add a percentage of how much the car is cleaned. Start from 0. The first command will always be 'soap':

  • soap – add 10 to the value
  • water – increase the value with 20%
  • vacuum cleaner – increase the value with 25%
  • mud – decrease the value with 10%

The input comes as an array strings. When finished cleaning the car, print the resulting value in the format:
"The car is {value}% clean.". The value should be rounded to the second decimal point.

Examples

Input

Output

['soap', 'soap', 'vacuum cleaner', 'mud', 'soap', 'water']

The car is 39.00% clean.

 

Задачата е доста лесна, но исках да я направя с 4 отделни функции, за всяка команда, за да ги упражня, но не мога да разбера защо 'value' не ми се ъпдейтва. Сигурно е нещо елементарно, но не го виждам.

Ето го кода: https://pastebin.com/ZX6YjEk7

 

 

 

 

 

Тагове:
1
Fundamentals Module 14/10/2019 23:10:28
willystyle avatar willystyle 2472 Точки
Best Answer

Наистина е елементарно, но е основно. Става въпрос за предаване на аргументи по стойност и по референция. Прочети каква е разликата и кои са основните типове данни и кои как се предават.

Explaining Value vs. Reference in Javascript

Ето ти решение чрез предаване по стойност:

function carWash (input) { 
  let value = 0; 
  let soap = x => x + 10;
  let water = x => x + x * 0.2;
  let vacuum = x => x + x * 0.25;
  let mud = x => x - x * 0.10; 
  for (let i = 0; i < input.length; i++){   
    if (input[i] === 'soap') {
      value = soap(value);
    } else if (input[i] === 'water') {
      value = water(value);
    } else if (input[i] === 'vacuum cleaner') {
      value = vacuum(value);
    } else {
      value = mud(value);
    } 
  } 
  console.log(`The car is ${value.toFixed(2)}% clean.`);
}

А ето ти варианта при който подаваш референции:

function carWash (input) { 
  let obj = {value: 0}; 
  let soap = x => x.value += 10;
  let water = x => x.value *= 1.2;
  let vacuum = x => x.value *= 1.25;
  let mud = x => x.value *= 0.90; 
  for (let i = 0; i < input.length; i++){   
    if (input[i] === 'soap') {
      soap(obj);
    } else if (input[i] === 'water') {
      water(obj);
    } else if (input[i] === 'vacuum cleaner') {
      vacuum(obj);
    } else {
      mud(obj);
    } 
  } 
  console.log(`The car is ${obj.value.toFixed(2)}% clean.`);
}

И накрая ще ти предложа едно решение чрез reduce :) :

function carWash (input) {
  let funcs = {
    soap: x => x + 10,
    water: x => x + x * 0.2,
    'vacuum cleaner': x => x + x * 0.25,
    mud: x => x - x * 0.10
  };
  let value = input.reduce((acc, curr) => funcs[curr](acc), 0);  
  console.log(`The car is ${value.toFixed(2)}% clean.`);
}

PS: Тази малка задача, може да даде още един урок, ако искаш да се предпазиш от неблагоприятен вход, реда с редюсера е добре да бъде:

let value = input.reduce((acc, curr) => funcs[curr] && funcs[curr](acc) || acc, 0);

като тук се използва предпазване от undefine, задаване на дефаултна стойност и приоритет на операците. Интересно от една малка задача колко много може да се извлече.

1
15/10/2019 11:10:09
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.