2017-02-07 1 views
-1

Ruby 2.4를 사용하고 있습니다. 나는 문자열이 모든배열의 한 요소가 패턴을 만족하는지, 나머지는 패턴을 만족하는지 어떻게 확인합니까?

str == str.upcase 

을 수행하여 대문자로되어 있는지 확인하는 방법을 알고 있지만 내가 문자열 배열이있는 경우, 배열의 마지막 요소가 들어있는 동안 대문자로되어 있는지 확인하는 빠른 방법은 무엇입니까 다른 요소, str! = str.upcase. 배열에 적어도 하나의 요소가 있다고 가정합니다. 요소가 하나만 있고 대문자로 된 경우 내 조건을 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

고마워, 마이클. 나는이 질문을 매우 신중하게 읽지 않았다. 나는 "자본화 된"이라는 단어를 보았고 거기에서 갔다. 내 대답을 고쳐 줄게. –

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

루비에 대한 좋은 것은 그것이 실제 코드에 문제의 텍스트 설명을 설정하는 매우 쉬운 것입니다 :

두 가지 모두 다음과 같은 결과 :

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

대답에 주어진 모두 동일한 테스트를 통과 :

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

확인 만 하나 요소는 당신의 상태 및 배열의 ​​마지막 요소가 동일한 조건을 만족 만족 캐리 스웰 벨드.

관련 문제