2017-01-09 3 views

답변

2

정규식 일치하는지 확인하려면 : 당신이 사용할 수있는이 더 단축하기 위해

array.grep(/\d\d?\s*-\s*\d\d?/).size/array.size.to_f >= 0.8 

에게 Numeric#quo 또는 Numeric#fdiv :

array.grep(/\d\d?\s*-\s*\d\d?/).size.quo(array.size) >= 0.8 
+1

왜'> = .8'이 아니겠습니까? – sweaver2112

+1

'array.grep (...). size> = 0.8 * array.size' – akuhn

+1

또는'.size.fdiv (array.size)> = 0.8'을 쓰면'to_f ' .size.quo (array.size)> = 80/100r' – Stefan

0

쓸 내용 :

(array.count{|item| item =~ /\d\d?\s*-\s*\d\d?/}/array.size) >= 0.8 
성능이 문제 않으면 6,
1

, 당신이 그들 중 80 % 이상이 조건을 maching하는 경우 알고 모든 요소를 ​​점검 할 필요가 없습니다

루비 2.3이 구현으로

조금 더 빠른 카운트 솔루션보다 두 배입니다 grep 솔루션보다 빠름 :

def pareto_match(array, proportion: 0.8) 
    min_success= (array.count * proportion).round(4) 
    max_failures= (array.count * (1 - proportion)).round(4) 
    success= 0 
    failure= 0 
    array.each do |element| 
    if yield(element) 
     success+= 1 
     return true if success >= min_success 
    else 
     failure+= 1 
     return false if failure > max_failures 
    end 
    end 
end 

pareto_match(array){|e| e =~ /\d\d?\s*-\s*\d\d?/} 
+1

부동 소수점 연산에주의하십시오. 10 요소의 경우 'min_success'는 '8.0'이고 'max_failures'는 '1.9999999999999996'입니다. – Stefan

+0

Indead, 나는 대답을 편집했다. 이런 종류의 문제에 대해 Bignum을 사용합니다. – ThomasSevestre

+0

배열 요소를 세고 있기 때문에 정수로 반올림 할 수 있습니다. – Stefan

관련 문제