Hackerrank Ruby - Strings - Indexing Solution

Hackerrank Ruby - Strings - Indexing Solution

When you index a string, you extract or alter the portions. This is perhaps the most important operation you want to perform on strings. The string class provides a convenient array-like square bracket [] operator, which allows you to extract portions of the string as well as altering the content when used on the left side of an assignment.

Consider the following examples:

> str = "Hello World!"
> str[str.size-1]
"!"
> str[-1] # first character from the end of the string
"!"
> str[-2] # second last character
"d"
> str[0] # first character
"H"

More often, you'd want to extract specific portions of the string rather than individual characters. To do this, use comma separated operands between the square brackets. The first operand specifies an index (which may be negative), and the second specifies a length (which must be non-negative).

Consider the example below:

> str[0,4] # first four characters
"Hell"
> str[6,3] # 3 characters starting from index 6 ( 0-indexing )
"Wor"
> str[-1, 1] # 1 character starting from the END of string
"!"

The same examples shown above can be used for assignment / deletion of characters. We can insert characters by giving a non-empty assignment or delete characters in the range by giving an empty assignment.

Consider the example below:

> str = "Hello"
> str[str.size, 0] = " World!" # append by assigning at the end of the string
> str
"Hello World!"
> str[5, 0] = "," # insert a comma after the 5th position
> str[5, 6] = ""  # delete 6 characters starting from index 5. 
"Hello!"
> str[5,1] = " World" # replace the string starting from index 5 and of length 1 with the given string. 

But wait, there's more! Ruby also allows you to index strings using a Range or a Regexp object as well. We will discuss these methods in the future.

In this challenge, your task is to code a serial_average method which is described below:

  • It takes a fixed width string in format: SSS-XX.XX-YY.YY. SSS is a three digit serial number, XX.XX and YY.YY are two digit numbers including up to two decimal digits.
  • It returns a string containing the answer in format SSS-ZZ.ZZ where SSS is the serial number of that input string, and ZZ.ZZ is the average of XX.XX and YY.YY.
  • All numbers are rounded off to two decimal places.

For example:

> serial_average('002-10.00-20.00')
"002-15.00"

You can use string interpolationto insert Ruby code within a string.

For example:

> tmp = 123
> "Hello #{tmp}"
Hello 123

Constraints.MathJax_SVG_Display {text-align: center; margin: 1em 0em; position: relative; display: block!important; text-indent: 0; max-width: none; max-height: none; min-width: 0; min-height: 0; width: 100%} .MathJax_SVG .MJX-monospace {font-family: monospace} .MathJax_SVG .MJX-sans-serif {font-family: sans-serif} .MathJax_SVG {display: inline; font-style: normal; font-weight: normal; line-height: normal; font-size: 100%; font-size-adjust: none; text-indent: 0; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0; min-height: 0; border: 0; padding: 0; margin: 0} .MathJax_SVG * {transition: none; -webkit-transition: none; -moz-transition: none; -ms-transition: none; -o-transition: none} .mjx-svg-href {fill: blue; stroke: blue}

-

Solution in ruby

Approach 1.

def serial_average s
   s.sub(/(.{5})-(.{5})$/){"%.2f" % (($2.to_f + $1.to_f)/2).round(2)}
end

Approach 2.

# Your code here
def serial_average(str)
   b = str.split('-')
   "#{b[0]}-#{((b[1].to_f+b[2].to_f)/2).round(2)}" 
end

Approach 3.

# Your code here
def serial_average(s)

    sn = s[0..2]
    n1 = s[4..8].to_f
    n2 = s[10..14].to_f
    avg = ((n1+n2)/2).round(2)
    "#{sn}-#{avg}"
end

Subscribe to The Poor Coder | Algorithm Solutions

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
[email protected]
Subscribe