2013-09-16 5 views
2

저는 올가미 코딩 방법을 배우는 과정에서 프로젝트 오일러 질문에 참여해 왔으며 솔루션을 개선 할 수 있는지 궁금합니다. 여기에 내가 올가미 8 코드에서 질문 # 1 아래에있어 무엇이며, 그것은 정답 반환프로젝트 오일러 # 1 - 올가미

var ('total' = 0); 

loop(1000-1); 
    loop_count % 3 == 0 || loop_count % 5 == 0 ? $total += loop_count; 
/loop; 

output($total); 

내 질문 :이 코드에 더 나은 또는 더 빠른 방법은 무엇입니까? 감사!

+0

올가미 9에서 다른 점이 많습니다. 그래서 내 자신의 답변을 검토해야합니다. #이 질문에 크리스가 뭐라 구요? –

+0

[질문 1] (http://projecteuler.net/problem=1) – TreefrogChris

답변

1

사실 Chris는 내 L9 코드 답변이 거의 똑같은 것처럼 보입니다. 그러나 내가해야 할 일은 1000 번 반복하는 루프로 감싸는 것입니다.

올가미 9는 마이크로 초를 수행 할 수 있지만 이전 버전은 밀리 초 단위로만 수행 할 수 있습니다.

아래에 3 가지 방법이 있습니다. 첫 번째 방법은 내 것이며, 두 번째는 내 방식입니다.

define br => '<br>' 
local(start_time = micros) 
loop(1000)=>{ 
    var ('total' = 0); 

    loop(1000-1); 
     loop_count % 3 == 0 || loop_count % 5 == 0 ? $total += loop_count; 
    /loop; 
    $total; 

} 
'Avg (L8 code in 9): '+(micros - #start_time)/1000+' micros' 

br 
br 

local(start_time = micros) 
loop(1000)=>{ 
    local(sum = 0) 
    loop(999)=>{ loop_count % 3 == 0 || loop_count % 5 == 0 ? #sum += loop_count } 
    #sum 
} 
'Avg (incremental improvement): '+(micros - #start_time)/1000+' micros' 

br 
br 

local(start_time = micros) 
loop(1000)=>{ 
    local(sum = 0) 
    loop(999)=>{ not (loop_count % 3) || not(loop_count % 5) ? #sum += loop_count } 
    #sum 
} 
'Avg using boolean not: '+(micros - #start_time)/1000+' micros' 

출력은 : 나는 8 많은 상황에서 중복 완전히 중복의로 "출력을"사용하지 않은

Avg (L8 code in 9): 637 micros 
Avg (incremental improvement): 595 micros 
Avg using boolean not: 596 micros 

주 9 :

1

재미있다 가우스가 루프를 피하는 데 도움이되는 전략을 포함하는 숫자를 한 번 합산 한 방법에 대한 이야기.

local('p' = 3); 
local('q' = 5); 
local('n' = 1000); 
local('x' = integer); 
local('before'); 
local('after'); 

#before = micros 

loop(1000) => { 
    /* In the tradition of Gauss */ 
    local('n2' = #n - 1) 

    local('pq' = #p * #q) 

    local('p2' = #n2/#p) 
    local('q2' = #n2/#q) 
    local('pq2' = #n2/#pq) 

    local('p3' = (#p2 + 1) * (#p2/2) + (#p2 % 2 ? #p2/2 + 1 | 0)) 
    local('q3' = (#q2 + 1) * (#q2/2) + (#q2 % 2 ? #q2/2 + 1 | 0)) 
    local('pq3' = (#pq2 + 1) * (#pq2/2) + (#pq2 % 2 ? #pq2/2 + 1 | 0)) 

    #x = #p * #p3 + #q * #q3 - #pq * #pq3 
    } 

#after = micros 

'Answer: ' + #x + '<br/>\n' 
'Average time: ' + ((#after - #before)/1000) + '<br/>\n' 

/* Different numbers */ 
#p = 7 
#q = 11 

#before = micros 

loop(1000) => { 
    /* In the tradition of Gauss */ 
    local('n2' = #n - 1) 

    local('pq' = #p * #q) 

    local('p2' = #n2/#p) 
    local('q2' = #n2/#q) 
    local('pq2' = #n2/#pq) 

    local('p3' = (#p2 + 1) * (#p2/2) + (#p2 % 2 ? #p2/2 + 1 | 0)) 
    local('q3' = (#q2 + 1) * (#q2/2) + (#q2 % 2 ? #q2/2 + 1 | 0)) 
    local('pq3' = (#pq2 + 1) * (#pq2/2) + (#pq2 % 2 ? #pq2/2 + 1 | 0)) 

    #x = #p * #p3 + #q * #q3 - #pq * #pq3 
    } 

#after = micros 

'Answer: ' + #x + '<br/>\n' 
'Average time: ' + ((#after - #before)/1000) + '<br/>\n' 

출력은 다음과 같습니다

Answer: 233168<br/> 
Average time: 3<br/> 
Answer: 110110<br/> 
Average time: 2<br/> 

비록 1 평균 시간은 어쩌면 올가미가 후속 실행을위한 스마트 뭔가를하고 18 대신 3.했다, 또는 어쩌면 것을 내가 그것을 처음 실행, 그냥 불운.

+0

매우 흥미롭고 정확하며 확실히 빠릅니다! 그러나, 많은 가독성을 희생합니다. – TreefrogChris