2013-09-16 59 views
2

我一直在研究Project Euler問題,作爲學習如何在Lasso中編寫代碼的一部分,並且想知道是否可以改進我的解決方案。以下是我在套索8碼下面得到了問題#1,並返回正確的答案:歐拉項目#1 - 套索

var ('total' = 0); 

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

output($total); 

我的問題:是否有更好或更快的實現代碼?謝謝!

+0

我會在Lasso 9中做很多不同的事情,所以我需要回顧一下自己的答案......這個Chris有什麼問題? –

+0

[問題1](http://projecteuler.net/problem=1) – TreefrogChris

回答

1

其實克里斯看起來像我的L9代碼答案几乎完全一樣。然而,我必須做的時間是將其包裝在一個循環中來計時1000次。

Lasso 9可以做Microseconds,而之前的版本只能以毫秒爲單位。

下面是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/> 

雖然我第一次運行它,第一時間平均爲18,而不是3.也許拉索正在爲後續的運行智能的東西,或者也許是隻是運氣不好。

+0

非常有趣,準確,肯定快很多!但是,它犧牲了很多可讀性。 – TreefrogChris