2017-09-27 75 views
1

你好,我有一个问题,我正在努力解决。用另一个修改的实例编辑一个数组

定义一个名为clean_slate的方法,该方法将采用表示记录的字符串和表示名称作为参数的另一个字符串。该方法返回一个表示原始记录的字符串,但每个名称的实例都将替换为名称中包含字符的X的两倍。如果传递了一个完整名称,它也将替换只使用了第一个或最后一个名字的实例,以及包含与全名包含字符一样多的X的实例。你的方法不应区分大小写。假设输入将始终是一个字符串。如果找不到名称,请返回原始记录。

到目前为止,我有:

def clean_slate(record, name) 
    name = name.downcase 
    split_name = name.downcase.split(" ") #array 
    change_name = split_name.map do |letter| 
    letter = "X" * 2 * name.length 
    end 
    record_words = record.downcase.split(" ") #array 
    new_record = record_words.map do |word| 
    if word.include?(split_name[0] || split_name[1]) 
    word = change_name 
    else 
    word 
    end 
    end 
new_record.join(" ") 
end 

clean_slate("Megan Fox is a talented actress. megan knows sulfoxide is a chemical compound containing a sulfinyl (SO) functional group attached to two carbon atoms. It is a polar functional group. Ms. fox has many talents.", "Megan Fox") 

我返回record,但我不是在节录的record获得姓氏。有谁知道我如何解决这个问题?

"XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX fox is a talented actress. XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX knows sulfoxide is a chemical compound containing a sulfinyl (so) functional group attached to two carbon atoms. it is a polar functional group. ms. fox has many talents." 

回答

0

在您record.split.map您需要检查是否正在传递的record.downcase包括split第一个或最后一个值,但在同一时间,以检查是否在块word等于任何这两个的,所以它会是这样的:

new_record = record.split.map do |word| 
    if record.downcase.include?(split_name[0] || split_name[1]) && 
    word.downcase == split_name[0] || word.downcase == split_name[1] 
    ... 

此外,如果你使用过mapsplit_name分配的X量,它会返回一个数组,当你这样做word = change_name,它需要一个数组内的值,如['XXXXX'](例如),所以你需要访问里面只有一个值:

word = change_name.first 

因为它不需要初始化不被块内部使用的变量,那么就change_name.first

这样一来,这个工程:

def clean_slate(record, name) 
    name = name.downcase 
    split_name = name.downcase.split(" ") 
    change_name = split_name.map do |letter| 
    letter = 'X' * 2 * name.length 
    end 
    new_record = record.split.map do |word| 
    if record.downcase.include?(split_name[0] || split_name[1]) && 
     word.downcase == split_name[0] || word.downcase == split_name[1] 
     change_name.first 
    else 
     word 
    end 
    end 
    new_record.join(" ") 
end 

但它也有一些事情可以改善:

split(" "),能够缩短split

letter = 'X' * 2 * name.length可以'XX' * name.length

change_name = 'XX' * name.length没有必要使用地图,所以

change_name.first名更改change_name

join(" ")喜欢单引号代替双那些

您需要一种方法来简化record.mapif声明,你仍然不知道名字将只有两个词用[0][-1]

你可以看看String#gsub

def clean_slate(record, name) 
    record.gsub(/\b#{name.split.join('|')}\b/i, 'XX' * name.size) 
end 
+0

哇!非常感谢你的回应和你的解释。我学到了新东西! – Joseph

0

下面是一个更清晰的实现方法。就在record比较每个单词name和替代X秒。

def clean_slate record, name 
    names = name.downcase.split 
    new_record = [] 
    record.split.each do |word| 
    new_record << word 
    if names.include?(word.downcase) 
     new_record[-1] = "X" * 2 * name.length 
    end 
    end 
    new_record.join(' ') 
end 

结果:

XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX is a talented actress. XXXXXXXXXXXXXXXXXX knows sulfoxide is a chemical compound containing a sulfinyl (SO) functional group attached to two carbon atoms. It is a polar functional group. Ms. XXXXXXXXXXXXXXXXXX has many talents. 
+0

它给'“XXXXXXXXXX XXXXXX是一个有才华的女演员。XXXXXXXXXX是超级狡猾的,一个伟大的棋手。XXXXXX女士拥有众多优秀人才。” '在等待'“XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX是一个有才华的女演员。XXXXXXXXXXXXXXXXXX是超级狡猾的,一个伟大的棋手。XXXXXXXXXXXXXXXXXX女士拥有众多优秀的人才。”' –

+0

哎呀。修正了,谢谢。 – rohit89

+0

不要担心,这是因为约瑟夫没有添加的例子投入和预期产出,你可以看到[卡塔(https://www.codewars.com/kata/clean-slate/train/ruby)。 –

0

如果我理解你的任务吧,我觉得你可以做的解决方案类似于它:

def clean_slate(record, name) 
    name = name.split.map(&:downcase) 
    record = record.split 

    record.map do |word| 
    if name.include? word.downcase 
     word = 'X' * 2 * name.join.length 
    else 
     word 
    end 
    end.join(' ') 
end 

#> clean_slate("Megan Fox is a talented actress. megan knows sulfoxide is a chemical compound containing a sulfinyl (SO) functional group attached to two carbon atoms. It is a polar functional group. Ms. fox has many talents.", "Megan Fox") 
#=> "XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX is a talented actress. XXXXXXXXXXXXXXXX knows sulfoxide is a chemical compound containing a sulfinyl (SO) functional group attached to two carbon atoms. It is a polar functional group. Ms. XXXXXXXXXXXXXXXX has many talents." 
+0

这真棒!感谢您的答复。 – Joseph

相关问题