2017-02-07 1 views
-1

私はRuby 2.4を使用しています。私は、文字列がすべて配列内の1つの要素がパターンを満たしているかどうかをチェックする方法はありますか?

str == str.upcase 

を行うことによって大文字にしているかどうかを確認する方法を知っているが、私は文字列の配列を持っている場合、配列の最後の要素だけがために、しばらく大文字されていることを確認する簡単な方法は何ですか他の要素、str!= str.upcase。私は、配列に少なくとも1つの要素があると仮定しています。要素が1つしかなく、大文字になっている場合は、条件をtrueに評価したいと思います。

+1

"[ask]"と "[mcve]"をお読みください。私たちはそれを修正できるようにあなたの試みを見たいと思います。要件のリストを私たちに与えただけなので、コードを記述したいようです。 –

+2

"大文字のみ"は単語の最初の文字のみを参照するため、 "大文字のみを含む"などの単語に "大文字の"を置き換えることができます。 –

答えて

6
def only_last_upcase?(arr) 
    arr.find_index { |w| w == w.upcase } == arr.size - 1 
end 

only_last_upcase? ["word", "wOrD", "WORD"] #=> true 
only_last_upcase? ["WORD", "wOrD", "WORD"] #=> false 
only_last_upcase? ["word", "wOrD", "word"] #=> false 
only_last_upcase? ["word"]     #=> false 
only_last_upcase? ["Word"]     #=> false 
only_last_upcase? ["WORD"]     #=> true 
only_last_upcase? []      #=> false 
+0

非常に賢い!私は今私の答えを恥じていた:) – mrlew

+0

正規表現を修正する必要があります: 'only_last_upcase?(['Word'])#=> true' –

+1

ありがとう、@マイケル。私は非常に慎重に質問を読んでいない。私は "capitalised"という言葉を見てそこから行ったと思います。私は私の答えを修正します。 –

0

一つのアプローチ:

def check_only_last_upcase(arr) 
    return false if arr.empty? 
    arr.each_with_index do |word, index| 
     return false if word == word.upcase && index != (arr.length-1) 
    end 
    (arr.last.upcase == arr.last) 
end 

puts check_only_last_upcase(["word", "wOrD", "WORD"]) #true 
puts check_only_last_upcase(["WORD", "wOrD", "WORD"]) #false 
puts check_only_last_upcase(["word", "wOrD", "word"]) #false 
puts check_only_last_upcase(["word"]) #false 
puts check_only_last_upcase(["WORD"]) #true 
puts check_only_last_upcase([]) #false 

別の方法(より多くのルビーの方法のように見える?):

def check_only_last_upcase(arr) 
    arr.last == arr.last.upcase && 
    arr 
     .slice(0,arr.length-1) 
     .all? { |word| word.upcase != word } 
end 

最終提案がarr場合は戻りませんarrは(常に少なくとも一つのアイテムを持っていると仮定しあなたが指摘したように、空です)。

0

または、おそらく:

foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1 

そして...

2.3.1 :001 > foo = ["WORD","Word"] 
=> ["WORD", "Word"] 
2.3.1 :002 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1 
=> false 
2.3.1 :003 > foo = ["WORD","WORD"] 
=> ["WORD", "WORD"] 
2.3.1 :004 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1 
=> false 
2.3.1 :005 > foo = ["Word","WORD"] 
=> ["Word", "WORD"] 
2.3.1 :006 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1 
=> true 
2.3.1 :007 > foo = ["Word","WORD","WORD"] 
=> ["Word", "WORD", "WORD"] 
2.3.1 :008 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1 
=> false 
2.3.1 :009 > foo = ["WORD"] 
=> ["WORD"] 
2.3.1 :010 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1 
=> true 
2.3.1 :011 > foo = ["Word"] 
=> ["Word"] 
2.3.1 :012 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1 
=> false 
2

ルビーの良いところは、それが実際のコードに問題のテキスト記述を回すために非常に簡単だということです。

def only_last_upcase?(arr) 
    last_index = arr.size - 1 
    arr.find_index { |s| s =~ /^[A-Z]*$/ } == last_index 
end 

どちらも次の結果:のみ要素が配列の最後要素が同じ条件を満たしていることをあなたの状態を満たす

only_last_upcase?(["word", "wOrD", "WORD"]) 
#=> true 
only_last_upcase?(["WORD", "wOrD", "WORD"]) 
#=> false 
only_last_upcase?(["word", "wOrD", "word"]) 
#=> false 
only_last_upcase?(["word"]) 
#=> false 
only_last_upcase?(["WORD"]) 
#=> true 
only_last_upcase?([]) 
#=> false 
+0

あなたの最初のバージョンは、各要素を最後の要素と比較するので、 '[" FOO "、" BAR "、" BAZ "]'に対して 'true'を返します。さらに、「none?」は必ずしも配列全体をトラバースするとは限りません。ブロックが真実の結果を返すとすぐに戻ります。 – Stefan

+0

2つの非常に良い点@Stefanは、目覚めた直後に答えを投稿するために私の役目を果たします。 –

+0

私は最初のバージョンを完全に削除しました。 –

1

チェック:

arr.one? { |str| str == str.upcase } && arr.last == arr.last.upcase 

が答えで与えられた全て同じテストを渡しCary Swoveland。

関連する問題