在我的程序中大写最后的名字和姓氏

时间:2016-10-14 20:08:44

标签: ruby

我正在尝试向用户询问名称,以便我们可以创建假名。

假名将:

  • 交换名字和姓氏

  • 将所有元音(a,e,i,o,u)更改为下一个元音,所以' a'会成为' u' u'会成为'

  • 将所有辅音(除了元音之外)改为字母表中的下一个辅音,所以' d'会成为' f'' n'会成为'

我无法在程序结束时获得大写的名字和姓氏。关于如何做到这一点的任何建议?

我也在尝试使用数据结构来存储输入的假名称。当用户退出程序时,遍历数据结构并打印用户输入的所有数据。像Vussit Gimodoe这样的句子实际上是Felicia Torres"或者" Felicia Torres也被称为Vussit Gimodoe

# ---- Swap First and Last Name ----

def name_swap(name)
  name.split.reverse.join(' ')
end

# ---- Change all the vowels ----

def vowel_change(name)
  vowels = ['a', 'e', 'i', 'o', 'u']
  name = name.downcase.split('')
  new_name = name.map do |vow|
    if vowels.include?(vow)
       vowels.rotate(1)[vowels.index(vow)]
     elsif vowels == 'u'
      vowels.replace('a')
     else
      vow
     end
   end
  new_name.join
end

# ---- Change the constant ----

def constant_change(name)
  constants = ['b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z']
  name = name.downcase.split('')
  new_name = name.map do |letter|
    if constants.include?(letter)
       constants.rotate(1)[constants.index(letter)]
     elsif constants == 'z'
        constants.replace('b')
     else
      letter
     end
   end
     new_name.join.capitalize!
end


# ---- User Interface and Data Storage----
valid_input = false
agents ={}
user_input = ""
secret_name = ""

until valid_input
  puts "Hello Secret Agent, to begin please enter the name you would like to change. When you are finished, type 'quit' !"
  user_input = gets.chomp.downcase
    if user_input == "quit"
       puts "Thank You!"
       valid_input = true
     else
      secret_name = name_swap(vowel_change(constant_change(user_input)))
       puts "Your secret name is #{secret_name} "
      end
      agents[user_input] = secret_name
    end


agents.each do |name, scramble|
  puts"#{name} is also known #{scramble}"
end

问题是当我返回最终的代理名称时,名称是小写的,我需要大写的名字和姓氏。它还退出以退出直接循环作为名称。

2 个答案:

答案 0 :(得分:2)

看看这个:https://ruby-doc.org/core-2.2.0/String.html#method-i-capitalize-21

您可以在打印秘密名称之前执行此操作:

output = output.split.each { |name| name.capitalize! }.join(' ')

和原始名称相同:

original_name = original_name.split.each { |name| name.capitalize! }.join(' ')

Ruby docs的例子:

a = "hello"
a.capitalize!   #=> "Hello"
a               #=> "Hello"
a.capitalize!   #=> nil

或者使用Rails'如果您使用Rails,则为titleize方法。

http://apidock.com/rails/String/titleize

答案 1 :(得分:0)

在rails中,您有一个名为titleize

的方法

说,试一试

output = name_swap(vowel_change(constant_change(original_name))).titleize
original_name = original_name.titleize

参考答案:https://stackoverflow.com/a/15005638/2398387