loading...

Daily Challenge #193 - What's the Real Floor?

thepracticaldev profile image dev.to staff ・1 min read

Setup

Americans can be weird sometimes. The first floor of a building is typically referred to as the ground floor. In some American buildings, there is no 13th floor because of old superstitions.

Implement a function that takes an American floor passed as an integer and returns the actual floor number. Your function should also work for basement floors.

Examples

getRealFloor(1) == 0
getRealFloor(0) == 0
getRealFloor(5) == 4
getRealFloor(15) == 13
getRealFloor(-3) == -3

Tests

getRealFloor(3)
getRealFloor(7)
getRealFloor(20)
getRealFloor(1)
getRealFloor(-6)

Good luck!


This challenge comes from acadet on CodeWars. Thank you to 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!

Discussion

pic
Editor guide
Collapse
savagepixie profile image
SavagePixie

Elixir

I wasn't sure if the 13th floor thingie was also supposed to apply to basement levels. I wrote a solution that does it.

defmodule Floor do
  def get_real_floor(n) when n == 0, do: 0
  def get_real_floor(n) when n > 13, do: n - 2
  def get_real_floor(n) when n > 0, do: n - 1
  def get_real_floor(n) when n < -13, do: n + 1
  def get_real_floor(n), do: n
end
Collapse
aminnairi profile image
Amin

Elm

getRealFloor : Int -> Int
getRealFloor floor =
    if floor > 12 then
        floor - 2
        -- 15 -> 13

    else if floor > 0 then
        floor - 1
        -- 5 -> 4

    else
        floor
        -- -5 -> -5
Collapse
citizen428 profile image
Michael Kohl

ReasonML solution. The challenge didn't really specify what to do with floors < -13, so don't use this to get information about your neighbor's secret underground headquarters of doom or something.

let getRealFloor = n =>
  switch (n) {
  | 0 => 0
  | _ when n > 13 => n - 2
  | _ when n > 0 => n - 1
  | _ => n
  };

Tests:

describe("getRealFloat", ({test}) => {
  test("0 should equal 0", ({expect}) =>
    expect.int(getRealFloor(0)).toBe(0)
  );
  test("1 should equal 0", ({expect}) =>
    expect.int(getRealFloor(1)).toBe(0)
  );
  test("5 should equal 4", ({expect}) =>
    expect.int(getRealFloor(5)).toBe(4)
  );
  test("15 should equal 13", ({expect}) =>
    expect.int(getRealFloor(15)).toBe(13)
  );
  test("-3 should equal -3", ({expect}) =>
    expect.int(getRealFloor(-3)).toBe(-3)
  );
});
Collapse
vidit1999 profile image
Vidit Sarkar

C++ one liner

int getRealFloor(int americanFloor){
    // there is no 13th floor because of old superstitions, so no case of 13 and -13 is considered
    return (americanFloor<1) ? (americanFloor>=-12) ? americanFloor : americanFloor+1 : (americanFloor<=12) ? americanFloor-1 : americanFloor-2;
}

Here is what that thing actually is

if(americanFloor < 1){
    if(americanFloor >= -12)
        return americanFloor;
    else
        return americanFloor+1;
}
else{
    if(americanFloor <= 12)
        return americanFloor-1;
    else
        return americanFloor-2;
}
Collapse
madstk1 profile image
Natamo

C#

Same as @savagepixie , not sure about negative superstitions, though I opted not to include it.

static int getRealFloor(int floor) {
    if(floor >  0 ) { floor--; }
    if(floor >= 13) { floor--; }
    return floor;
}
Collapse
nijeesh4all profile image
Nijeesh Joshy

Ruby Oneliner


def getRealFloor floor 
 floor <= 0 ? floor : floor > 13 ? floor - 2 : floor - 1
end

Some tests


require "test/unit"

class GetRealFloorTest < Test::Unit::TestCase
  def test_get_real_floor
    assert_equal 0,  get_real_floor(0)
    assert_equal 2,  get_real_floor(3)
    assert_equal 6,  get_real_floor(7)
    assert_equal 18, get_real_floor(20)
    assert_equal 0,  get_real_floor(1)
    assert_equal -6, get_real_floor(-6)
  end
end


#1 tests, 6 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications

Collapse
maskedman99 profile image
Rohit Prasad

Python

var = int(input("Enter the floor number: "))

if var <= 0:
        print(var)
elif var > 13:
        print(var-2)
else:
        print(var-1)
Collapse
bkaguilar profile image
Bk Aguilar

In JavaScript


const getRealFloor = n => {
  return n <= 0 ? n : n > 13 ? n-2 : n-1;
}

Collapse
jay profile image
Jay

Rust pattern matching

fn get_real_floor(n: i32) -> i32 {
    match n {
        0 => 0,
        1..=12 => n-1,
        13..=std::i32::MAX => n - 2,
        _ => n
    }
}
Collapse
stevenbey profile image
Steven Bey

return floor - (floor < 1 ? 0 : floor < 13 ? 1 : 2);