2017-04-15 1 views
0

나는 내 코드에 대해 몇 가지 문제를 겪고있다. 나는이 일의 대부분을 봤다. 이것이 간단하고 해결책이 간단하다면 사과드립니다. 나는 전체적인 설명을 선호하는 해결책을 찾고 있습니다. 지금까지루비 계산 배열이이를 반환하고 합계합니다. 출력 코드 포함

내 코드 : 여기

a1 = [ 4, 6, 7, 8, 10, 13, 14, 15, 17, 21, 24, 45, 48, 61] 
a2 = [ 5, 10, 14, 18, 24, 25, 33, 34, 40, 45, 47, 50, 52, 54] 
a3 = [ 1, 5, 12, 17, 23, 24, 25, 29, 33, 39, 40, 44, 46, 48] 
a4 = [ 5, 16, 18, 20, 31, 39, 41, 42, 43, 55, 57, 60, 62, 63] 
a5 = [ 2, 7, 18, 26, 33, 36, 38, 43, 44, 45, 50, 51, 52, 55] 
a6 = [ 2, 12, 14, 15, 18, 24, 32, 35, 41, 43, 46, 47, 48, 51] 
a7 = [ 4, 12, 13, 15, 17, 18, 19, 23, 26, 32, 33, 35, 40, 47] 

all_arrays = [a1, a2, a3, a4, a5, a6, a7] 
total = Array.new 
fun = Array.new 
b = Array.new 
all_arrays.map do |arr3| 
    fun = [arr3.include?(41 & 43)] #.count(true) 
    total = [fun.count(true)] 

내가 41, 43 그들이 A4와 A6에서 할 배열에서 함께 발생 있는지 확인하기 위해 노력하고있어. 이제는 얼마나 많은 시간이 함께 발생했는지 계산할 수 있기를 원합니다. 내가 puts total 인 경우 출력은 0001010이됩니다. 출력이 puts fun 인 경우 false, false, false, true, false, true가 표시됩니다. 나는 진리 또는 1을 셀 수 있기를 바란다. 그래서 나는 41 번과 43 번이 몇 번이나 생겨나게 될지를 알게된다. 출력을 배열로 변환하는 방법을 모르겠습니까? total = [fun.count(true)]이 맞지 않습니다. 그러나 그것은 작동합니까? 일종의. 수업을 만들어야합니까? 여기

counts = Hash.new(0) 
    total.each do |color| 
     counts[color] += 1 
     #puts counts 
     #puts total.count 
     #total.uniq.each do |elem| 
     #puts "#{elem}\t#{total.count(elem)}" 
     #end 
    end 

내 연구하는 동안, 구글과 유래를 포함하여 다른 사이트에 을 표시하는 코드입니다. 나는 의사와 api를 보았다. 나는 언어의 논리와 구문을 아직 이해하지 못해서 무리를 읽고 온라인 수업을 듣는 것은 효과가 없다. 나는 배우기를 희망하고 있습니다. 그러나 현재 이것은 저에게 새로운 것이고, 저는 방과후 프로젝트로 아들을 돕고 있습니다. 나는 이것을 배우기 위해 이것을 배우고 싶다. 도와 줘서 고마워.

+0

는 'A = Array.new'가'A = [] '과 동일하다. 후자가 일반적으로 사용됩니다. 비슷하게,'h = Hash.new'는'h = {}'와 동일하고, 일반적으로 후자가 일반적으로 사용됩니다. –

답변

0
all_arrays = [a1, a2, a3, a4, a5, a6, a7] 
fun = [] 
all_arrays.each do |arr3| 
    if arr3.include?(41) && arr3.include?(43) 
    fun << true 
    else 
    fun << false 
    end 
end 

puts fun 

당신은 1과 0, 그냥 일에 충실 변경하려는 경우와 0으로 거짓이 당신이 찾고 있던 전체 출력하거나 추가 뭔가가 필요 했습니까?

+1

'fun << (arr3.include? (41) && arr3.include? (43))'를 수행하여'if'를 완전히 피할 수 있습니다. – Gerry

+0

사실 그게 사실이에요. –

1

것은 당신이 모두 41과 43를 포함하는 배열의 수를 찾고 있다면, 이것을 사용 :

total = 0 
for array in all_arrays do 
    if array.include?(41) && array.include?(43) 
    total += 1 
    end 
end 

코드가 모두 포함 배열의 수를 보유 할 변수 total을 설정하여 시작 41 및 43을 0으로 설정합니다. 모든 배열을 하나씩 검토하고 각 배열에서 41과 43이 모두 있는지 확인한 다음 1을 total에 추가합니다.

라인

for array in all_arrays do 

array 참조하여 현재 배열, all_arrays 각 어레이에 대해 한 번 실행하는 루프를 정의한다. 루프를 처음 실행할 때 arraya1을 나타냅니다. 루프를 통해 두 번째로 arraya2을 참조합니다. 루프를 통해 세 번 째에는 arraya3을 가리 킵니다. 끝까지 최대 값은 a7입니다.

루프 내에서 41과 43이 모두 현재 배열 array에 있는지 확인해야합니다. 이 코드 행을 사용하여이 작업을 수행합니다.

...이 경우 1에 합계를 더합니다.

+0

고마워요 조이, 그건 이해가 돼. 지금 내가 볼 수 있고 내가 원하는 걸 이해할 수있어. 왜 &&와 &뿐만 아니라 왜 두 가지를 분리해야 하는가? 읽기 쉽도록 만드는 것입니까? if array.include? (41) && array.include? (43) –

0

식품 전사 묻습니다 :

&&뿐 아니라 &?

&& 우리가 논리적을 부르는 것이다. a && bab이 모두 참인 경우에만 true입니다. && "및"버전은 일반 생활에서 "및"이라는 단어를 사용하는 방식에 더 가깝습니다.

&비트, 그리고 순간에 유용하지의 설명을 많이 저장하는 것입니다, 내가 바로 숫자의 이진 표현에 수학 연산을 수행 할 때만 의미가 있다고 가정 해 봅시다. 이 아닌 "및"은 ab이 모두 사실인지 알고 싶을 때 생각합니다.

식품 전사는 묻는다 :

if array.include?(41) && array.include?(43) 대신 if array.include?(41 && 43) 사용할 수 있습니까?

컴퓨터는 "벙어리"입니다. 즉, 프로그래밍 할 때 사용하는 언어가 자연 언어보다 정확해야한다는 의미입니다.

  1. 배열은 숫자 41이 포함되어 있습니까 : 우리가 지정된 배열은 모두 41과 43이 포함되어 있는지 알고 싶을 때, 우리는 실제로 질문을하는거야?
  2. 배열에 숫자 43이 있습니까?
  3. 질문 1과 2에 대한 답변이 모두 "예"입니까?

이 세 가지 질문에 코드의이 라인에 포함되어 있습니다 : 우리는 컴퓨터가 아닌 사람에게 이야기한다면 현재 배열 (41)이 포함되어있는 경우 물론

if array.include?(41) && array.include?(43) 

는, 우리는 "말할 수와 43 "우리가 유혹을받을 수도로 작성 :

if array.include?(41 && 43) 

이 인간에게 의미가 있지만, 루비, 그것으로이 문장을 해석"배열 t을 포함하는 경우 첫째, 41 && 43의 값을 계산 한 후 참조 모자 가치 ". 여기에 들어가기까지 약간 시간이 걸리기 때문에 41 && 43의 값은 43입니다. 즉, if array.include?(41 && 43)if array.include?(43)과 같으며 원하는 것은 아닙니다. 당신이 all_arrays의 각 요소에 대해 하나 개의 요소 (true 또는 false)와 배열 (fun를) 만들 이후

3

첫째, 당신은 all_arraysEnumerable#map를 호출합니다.

우리는 all_arrays의 각 요소는 두 개의 값 ( 4143) 모두를 포함하고 있는지 확인 되었기 때문에
fun = all_arrays.map { |row| row.include?(41) && row.include?(43) } 
    #=> [false, false, false, true, false, true, false] 

이 합리적으로 효율적으로 될 것입니다. 이것을 일반화합시다.

targets = [41, 43] 

fun = all_arrays.map { |row| targets.all? { |t| row.include?(t) } } 
    #=> [false, false, false, true, false, true, false] 

는의 각 요소 all_arraysrow에 필요한 작업의 수를 계산하자. 각 요소 ttargets 인 경우 row.include?(t)을 실행해야합니다. 단순화를 위해 row에는 중복이없고 row.include?(t)true 번을 반환한다고 가정합니다. true을 반환하면 조사되는 row의 평균 요소 수는 rows.size/2이라고 가정 할 수 있습니다. false이 반환 될 때 row의 모든 요소를 ​​검사해야하므로 검사되는 row의 평균 요소 수는 0.75 * row.size입니다. 따라서 all_arrays의 요소마다 필요한 연산의 평균 개수는

target.size * 0.75 * row_size 

이 불쾌 비효율적이다. 우리가 원하는 것은 all_arrays의 각 요소를 하나의 패스로 만들고, 요소가 target인지 여부를 확인하여 예상되는 작업 수를 row_size 미만으로 가져 오는 것입니다. 각 작업은 약간 더 오래 걸릴 수 있지만 위의 썰매 해머 방식보다 훨씬 효율적입니다. 다음은 두 가지보다 효율적인 접근 방법입니다. 세트에

# 1 변환 targets

require 'set' 

def check_row(row, set_targets) 
    row.uniq.each { |x| return true if set_targets.delete(x).empty? } 
    false 
end 

set_targets = targets.to_set 
fun = all_arrays.map { |row| check_row(row, set_targets.dup) } 
    #=> [false, false, false, true, false, true, false] 

all_arrays의 요소 대부분에서 중복 값의 소수 row.uniq가 정당화 될 수 없습니다 계산하는 데 필요한 시간을 포함하면이 경우 .uniq 정상적으로에서 생략 할 수있다.

커버 아래의 세트는 해시로 구현됩니다. 결과 집합에 요소가 포함되어 있는지 확인한 다음 해당 요소를 삭제하는 데 필요한 시간 (Set#delete 참조)은 기본 해시에 지정된 키가 있는지 확인한 다음 해당 키가 있으면 삭제하는 것과 같습니다. 후자에 필요한 시간은 does not vary greatly with the size of the hash입니다. 결과적으로 집합 조회는 배열 조회보다 훨씬 효율적입니다.

Array.instance_methods.include?(:to_set) 
    #=> false 

require 'set' 

Array.instance_methods.include?(:to_set) 
    #=> true 
Array.instance_method(:to_set).owner 
    #=> Enumerable 

# 2를 사용하여 설정 작업 배열에

fun = all_arrays.map { |row| targets == targets & row } 
    #=> [false, false, false, true, false, true, false] 

Array#&를 참조하십시오 require 'set'는 인스턴스 메서드 Enumerable#to_set를 설치하는 것이

참고. 문서에서 targets & row의 순서는 target의 요소 순서와 일치한다는 점을 메모하십시오.

대안

,

fun = all_arrays.map { |row| (targets - row).empty? } 
    #=> [false, false, false, true, false, true, false] 

이것은 Array#-를 이용한다.

두 집합과 같은 연산은 C로 코딩되었으므로 부분적으로 매우 빠릅니다. (또한 배열 차이 계산은 결과가 끝날 때 종료 될 수 있습니다.) 즉 targets - row이 비게되면 Array#- 같은 않으면 계산 과정에서. 누구나 알고 단락을? )

+0

캐리, 나는 정말로 '설정'비트를 얻지 못한다. 나는 더 빠른 접근법을 좋아하지만 코드에 숫자를 어떻게 추가합니까? 41,43보다 큰 그룹을 확인하고 싶다고합시다. 다소 큰 세트에 4 ~ 5 개의 숫자 그룹이 있다고합시다. 도와 주셔서 감사합니다. –

+0

Foodie, 필자는 배열보다 배열을 사용하는 것이 더 효율적인 이유를 설명하기 위해 필자의 대답을 편집했습니다. 3 개 이상의 요소 (41과 43)를 포함하는 그룹을 검사 할 때, 배열의 목적은 임의의 수의 요소를 포함하는'targets'입니다. 그 질문에 대답합니까? –