Does
Does

Reputation: 67

How to find highest char value in ruby?

Suppose I'm given a string "Nas". I want to select the char which has the highest integer value. How can I do this in Ruby?

My implementation involved creating a hash with the numerical value for each char:

alpha = {}
('a'...'z').zip(1. .26).each do |x| alpha[x[0]] = x[1] end

And then I'd loop through my word like so:

word.each_char do |c |
    puts c
end

I have defined a method which takes two parameters, the first param is an array which specifies the "importance of a char", and second param takes a word:

def designer_pdf(h, word)
  alpha = {}
  ('a'...'z').zip(1..26).each do |x|
    alpha[x[0]] = x[1]
  end

  word.each_char do |c|
    puts c
  end
end

designer_pdf (
  [1, 3, 1, 3, 1, 4, 1, 3, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
  'abc'
)

The goal is two return the highest value from the h array based on the character from word.

For example, word: 'abc':

a = 1
b = 3
c = 1

So return 3 because b is highest.

Upvotes: 0

Views: 335

Answers (3)

Cary Swoveland
Cary Swoveland

Reputation: 110675

There is no need to construct a hash.

def largest_mapped_value(word, values)
  base = 'a'.ord
  values[word.each_char.max_by { |c| values[c.ord-base] }.ord-base]
end

  #       a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t
values = [1, 3, 1, 3, 1, 4, 1, 3, 2, 5, 6, 5, 5, 7, 5, 5, 5, 5, 5, 1,
          5, 5, 5, 5, 5, 5]
  #       u  v  w  x  y  z

%w| cat kite zebra fined a |.each { |word|
  puts "#{word}: #{largest_mapped_value(word, values)}" }
cat:   1
kite:  6
zebra: 5
fined: 7
a:     1

A variant is the following.

word = "fined"
base = 'a'.ord
  #=> 97
word.each_char.map { |c| values[c.ord-base] }.max
  #=> 7

Upvotes: 1

Gagan Gami
Gagan Gami

Reputation: 10251

You can pass any priority array and any word as arguments:

def designer_pdf(h, word)
  alpha =  Hash[('a'..'z').zip(h)]

  # if you want only character from word with highest priority
  character = word.chars.max_by{|e| alpha[e]}

  # if you want only highest char value
  value = alpha[character]

  # if you want both character and value
  [character, value]
end

> designer_pdf([1, 3, 1, 3, 1, 4, 1, 3, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], "abc")
#=> ["b", 3] 

> designer_pdf([1, 3, 1, 3, 1, 4, 1, 3, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], "zeb")
#=> ["z", 5] 

Upvotes: 2

Rajagopalan
Rajagopalan

Reputation: 6064

You can do this

For zep string

p [*'a'..'z'].zip([1, 3, 1, 3, 1, 4, 1, 3, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5])
    .select{|x|("zeb".chars).include?x[0]}.max_by{|x|x[1]}

output

["z", 5]

Upvotes: 3

Related Questions