Hone logo
Hone
Problems

Crafting a JavaScript Range Function

The built-in range function is a staple in languages like Python, providing a concise way to generate sequences of numbers. This challenge asks you to recreate this functionality in JavaScript, allowing you to dynamically create arrays of numbers within a specified range. This is a fundamental building block for many algorithms and data manipulations.

Problem Description

Your task is to implement a JavaScript function called range that generates an array of numbers within a specified range. The function should accept one, two, or three arguments:

  • start (optional): The starting number of the sequence. If omitted, it defaults to 0.
  • end (optional): The ending number of the sequence (exclusive). If omitted, it defaults to the start value if start was provided, or 1 if start was not provided.
  • step (optional): The increment between numbers in the sequence. If omitted, it defaults to 1.

The function should return a new array containing the numbers in the sequence, starting from start, incrementing by step, and stopping before reaching end.

Key Requirements:

  • Handle cases where only end is provided (start defaults to 0).
  • Handle cases where only step is provided (start and end default to 0 and 1 respectively).
  • Handle cases where no arguments are provided (start and end default to 0 and 1 respectively).
  • Ensure the step value is correctly applied to generate the sequence.
  • Return an empty array if start is greater than or equal to end and step is positive, or if start is less than or equal to end and step is negative.
  • The function should not modify the original arguments.

Expected Behavior:

The function should return an array of numbers. The numbers should be generated according to the provided start, end, and step values.

Examples

Example 1:

Input: range(5)
Output: [0, 1, 2, 3, 4]
Explanation: Start defaults to 0, end defaults to 5, step defaults to 1. The sequence includes numbers from 0 up to (but not including) 5.

Example 2:

Input: range(2, 7)
Output: [2, 3, 4, 5, 6]
Explanation: Start is 2, end is 7, step defaults to 1. The sequence includes numbers from 2 up to (but not including) 7.

Example 3:

Input: range(1, 10, 2)
Output: [1, 3, 5, 7, 9]
Explanation: Start is 1, end is 10, step is 2. The sequence includes numbers starting at 1, incrementing by 2, and stopping before reaching 10.

Example 4:

Input: range(5, 2)
Output: []
Explanation: Start is 5, end is 2, step defaults to 1. Since start > end, an empty array is returned.

Example 5:

Input: range(10, 5, -1)
Output: [10, 9, 8, 7, 6]
Explanation: Start is 10, end is 5, step is -1. The sequence includes numbers starting at 10, decrementing by 1, and stopping before reaching 5.

Constraints

  • start, end, and step should be numbers.
  • start and end can be positive, negative, or zero.
  • step can be positive, negative, or zero. A zero step will result in an empty array.
  • The function should handle potential type coercion of the arguments. If a string is passed that can be reasonably converted to a number, it should be.
  • The function should be performant for reasonable ranges (e.g., up to 10,000 elements).

Notes

  • Consider using a for loop or while loop to generate the sequence.
  • Pay close attention to the conditions for stopping the loop and ensuring the correct numbers are included in the array.
  • Think about how to handle the optional arguments and their default values effectively.
  • Remember that the end value is exclusive – the sequence should stop before reaching end.
  • Test your function thoroughly with various inputs, including edge cases, to ensure it behaves as expected.
Loading editor...
javascript