Ruby 2.4를 사용하고 있습니다. 배열의 요소 중 80 % 이상이 특정 패턴과 일치하는지 어떻게 확인합니까? 나는 각 요소 당신은 간단한 계산과 함께 Enumerable#grep
을 사용할 수 있습니다Ruby에서 배열의 요소 중 80 % 이상이 패턴과 일치하는지 어떻게 확인합니까?
/\d\d?\s*-\s*\d\d?/
Ruby 2.4를 사용하고 있습니다. 배열의 요소 중 80 % 이상이 특정 패턴과 일치하는지 어떻게 확인합니까? 나는 각 요소 당신은 간단한 계산과 함께 Enumerable#grep
을 사용할 수 있습니다Ruby에서 배열의 요소 중 80 % 이상이 패턴과 일치하는지 어떻게 확인합니까?
/\d\d?\s*-\s*\d\d?/
정규식 일치하는지 확인하려면 : 당신이 사용할 수있는이 더 단축하기 위해
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
왜'> = .8'이 아니겠습니까? – sweaver2112
'array.grep (...). size> = 0.8 * array.size' – akuhn
또는'.size.fdiv (array.size)> = 0.8'을 쓰면'to_f ' .size.quo (array.size)> = 80/100r' – Stefan
쓸 내용 :
(array.count{|item| item =~ /\d\d?\s*-\s*\d\d?/}/array.size) >= 0.8
성능이 문제 않으면 6,
, 당신이 그들 중 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?/}
부동 소수점 연산에주의하십시오. 10 요소의 경우 'min_success'는 '8.0'이고 'max_failures'는 '1.9999999999999996'입니다. – Stefan
Indead, 나는 대답을 편집했다. 이런 종류의 문제에 대해 Bignum을 사용합니다. – ThomasSevestre
배열 요소를 세고 있기 때문에 정수로 반올림 할 수 있습니다. – Stefan
계산 및 계산? –
필터링하여 새로운 배열과 기존 배열을 백분율로 비교합니까? –