loading...

Daily Challenge #83 - Deodorant Evaporator

thepracticaldev profile image dev.to staff ・1 min read

This program tests the life of an evaporator containing a gas.

We know the content of the evaporator (content in ml), the percentage of foam or gas lost every day (evap_per_day) and the threshold (threshold) in percentage beyond which the evaporator is no longer useful. All numbers are strictly positive.

The program reports the nth day (as an integer) on which the evaporator will be out of use.

Note: Content is in fact not necessary in the body of the function "evaporator", you can use it or not use it, as you wish. Some people might prefer to reason with content, some other with percentages only. It's up to you but you must keep it as a parameter because the tests have it as an argument.


This challenge comes from g964 from CodeWars, who has licensed redistribution of this challenge under the 2-Clause BSD License!

Want to propose a challenge idea for a future post? Email yo+challenge@dev.to with your suggestions!

Posted on by:

thepracticaldev profile

dev.to staff

@thepracticaldev

The hardworking team behind dev.to ❤️

Discussion

pic
Editor guide
 

In Go! This assumes that the evaporator is always filled up to 100%.

func evaporator(evapPerDay, threshold float64) int {
    days := 0
    fill := 100.0
    for fill >= threshold {
        days += 1
        fill -= (fill * evapPerDay / 100)
    }
    return days
}

Go Playground Example

EDIT:
Forgot to take consider that the evapPerDay is based on the current fill not the starting.

 

Javascript version

const evaporator = (content, evapPerDay, threshold) => {
  let  outOfUseDays = 0, percentage = 100;  
  while (percentage > threshold) {
    percentage = percentage - percentage * (evapPerDay / 100);
    outOfUseDays += 1;
  }
  return outOfUseDays;
}
//console.log('evaporator --> ',evaporator('ml',7,2));
 

Elm

getDaysBeforeEvaporation : Float -> Float -> Int
getDaysBeforeEvaporation percentageBeforeUnusable percentageLostPerDay =
    let
        percentageBeforeUnusableClamped : Float
        percentageBeforeUnusableClamped =
            percentageBeforeUnusable
                |> clamp 1 100

        percentageLostPerDayClamped : Float
        percentageLostPerDayClamped =
            percentageLostPerDay
                |> clamp 1 100
    in
    floor <| (100 - percentageBeforeUnusableClamped) / percentageLostPerDayClamped

Playground

Try it online here.

 

My solution in js


const evaporator = (netContent = 100, evapPerDay, threshold) => {
  let  nthDay = 0;  
  while (netContent >= threshold) {
    netContent -= (netContent * (evapPerDay / 100));
    nthDay++;
  }
  return nthDay;
}

 
function lifespan(evap_per_day, threshold) {
    let content = 100;
    let day = 0;
    while (fill >= threshold) {
        fill *= 1-(evap_per_day/100);
        day++;
    }
    return day;
}