You are not logged in.

#26 2008-06-03 04:05:40

rizzix
Member
Registered: 2005-10-22
Posts: 55

Re: Project Euler

scj's method is not very optimal. Here try mine: smile

import Data.Char (digitToInt)
import Data.List (foldl')

number = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"

ans9 :: String -> Int -> Int
ans9 (b:c:d:e:[])   n = n
ans9 (a:b:c:d:e:ns) n | n < prod  = ans9 (b:c:d:e:ns) prod
                      | otherwise = ans9 (b:c:d:e:ns) n
    where prod = foldl' (\x -> (x *) . digitToInt) 1 [a,b,c,d,e]

main = putStrLn . show $ ans9 number 0

Offline

#27 2008-06-03 09:00:32

shining
Pacman Developer
Registered: 2006-05-10
Posts: 2,043

Re: Project Euler

joe wrote:

Sure, I threw a while loop around the 'meat' of the program and had it run 10,000 times. Using

You know you need to be careful when you do that, otherwise you end up doing the same stupid mistake as elide did. That is, forget to reinitialize the variables, and you have the first loop iteration doing the job and all the other ones doing nothing.


pacman roulette : pacman -S $(pacman -Slq | LANG=C sort -R | head -n $((RANDOM % 10)))

Offline

#28 2008-06-03 23:29:44

nj
Member
Registered: 2007-04-06
Posts: 93

Re: Project Euler

joe wrote:
time ./newp
40824

real    0m0.014s
user    0m0.013s
sys     0m0.000s

Lesson learned: SSE optimizations are worth learning.

Very impressive. Now I just have to learn it.

On a side note, I recompiled my program using -O4 instead of -O2 which lowered my unoptimized time down to 83ms, but left the optimized at 69ms.

Offline

#29 2008-06-05 00:29:52

elasticdog
Member
From: Washington, USA
Registered: 2005-05-02
Posts: 995
Website

Re: Project Euler

I love Project Euler...I've been using them to help learn Factor.  Here's my solution for Problem 8 in Factor that I did a long time ago...it could probably be optimized:

: source-008 ( -- str )
    {
        "73167176531330624919225119674426574742355349194934"
        "96983520312774506326239578318016984801869478851843"
        "85861560789112949495459501737958331952853208805511"
        "12540698747158523863050715693290963295227443043557"
        "66896648950445244523161731856403098711121722383113"
        "62229893423380308135336276614282806444486645238749"
        "30358907296290491560440772390713810515859307960866"
        "70172427121883998797908792274921901699720888093776"
        "65727333001053367881220235421809751254540594752243"
        "52584907711670556013604839586446706324415722155397"
        "53697817977846174064955149290862569321978468622482"
        "83972241375657056057490261407972968652414535100474"
        "82166370484403199890008895243450658541227588666881"
        "16427171479924442928230863465674813919123162824586"
        "17866458359124566529476545682848912883142607690042"
        "24219022671055626321111109370544217506941658960408"
        "07198403850962455444362981230987879927244284909188"
        "84580156166097919133875499200524063689912560717606"
        "05886116467109405077541002256983155200055935729725"
        "71636269561882670428252483600823257530420752963450"
    } concat ;

: count-shifts ( seq width -- n )
    >r length 1+ r> - ;

: shift-3rd ( seq obj obj -- seq obj obj )
    rot rest -rot ;

: collect-consecutive ( seq width -- seq )
    [
        2dup count-shifts [ 2dup head shift-3rd , ] times
    ] { } make 2nip ;

: euler008 ( -- answer )
    source-008 5 collect-consecutive [ string>digits product ] map supremum ;

[ euler008 ] 100 ave-time
11 ms run / 0 ms GC ave time - 100 trials

Offline

#30 2008-06-15 06:12:22

scj
Member
From: Sweden
Registered: 2007-09-23
Posts: 158

Re: Project Euler

elasticdog wrote:

Oh hey, stack based programming! I've never actually tried that before. Here's my gforth solution:

: n1 
7 3 1 6 7 1 7 6 5 3 1 3 3 0 6 2 4 9 1 9 2 2 5 1 1 9 6 7 4 4 
2 6 5 7 4 7 4 2 3 5 5 3 4 9 1 9 4 9 3 4 9 6 9 8 3 5 2 0 3 1 
2 7 7 4 5 0 6 3 2 6 2 3 9 5 7 8 3 1 8 0 1 6 9 8 4 8 0 1 8 6 
9 4 7 8 8 5 1 8 4 3 8 5 8 6 1 5 6 0 7 8 9 1 1 2 9 4 9 4 9 5 ;
: n2
4 5 9 5 0 1 7 3 7 9 5 8 3 3 1 9 5 2 8 5 3 2 0 8 8 0 5 5 1 1 
1 2 5 4 0 6 9 8 7 4 7 1 5 8 5 2 3 8 6 3 0 5 0 7 1 5 6 9 3 2 
9 0 9 6 3 2 9 5 2 2 7 4 4 3 0 4 3 5 5 7 6 6 8 9 6 6 4 8 9 5 
0 4 4 5 2 4 4 5 2 3 1 6 1 7 3 1 8 5 6 4 0 3 0 9 8 7 1 1 1 2 ; 
: n3
1 7 2 2 3 8 3 1 1 3 6 2 2 2 9 8 9 3 4 2 3 3 8 0 3 0 8 1 3 5
3 3 6 2 7 6 6 1 4 2 8 2 8 0 6 4 4 4 4 8 6 6 4 5 2 3 8 7 4 9 
3 0 3 5 8 9 0 7 2 9 6 2 9 0 4 9 1 5 6 0 4 4 0 7 7 2 3 9 0 7 
1 3 8 1 0 5 1 5 8 5 9 3 0 7 9 6 0 8 6 6 7 0 1 7 2 4 2 7 1 2 ;
: n4
1 8 8 3 9 9 8 7 9 7 9 0 8 7 9 2 2 7 4 9 2 1 9 0 1 6 9 9 7 2 
0 8 8 8 0 9 3 7 7 6 6 5 7 2 7 3 3 3 0 0 1 0 5 3 3 6 7 8 8 1 
2 2 0 2 3 5 4 2 1 8 0 9 7 5 1 2 5 4 5 4 0 5 9 4 7 5 2 2 4 3 
5 2 5 8 4 9 0 7 7 1 1 6 7 0 5 5 6 0 1 3 6 0 4 8 3 9 5 8 6 4 ;
: n5
4 6 7 0 6 3 2 4 4 1 5 7 2 2 1 5 5 3 9 7 5 3 6 9 7 8 1 7 9 7 
7 8 4 6 1 7 4 0 6 4 9 5 5 1 4 9 2 9 0 8 6 2 5 6 9 3 2 1 9 7 
8 4 6 8 6 2 2 4 8 2 8 3 9 7 2 2 4 1 3 7 5 6 5 7 0 5 6 0 5 7 
4 9 0 2 6 1 4 0 7 9 7 2 9 6 8 6 5 2 4 1 4 5 3 5 1 0 0 4 7 4 ;
: n6
8 2 1 6 6 3 7 0 4 8 4 4 0 3 1 9 9 8 9 0 0 0 8 8 9 5 2 4 3 4 
5 0 6 5 8 5 4 1 2 2 7 5 8 8 6 6 6 8 8 1 1 6 4 2 7 1 7 1 4 7 
9 9 2 4 4 4 2 9 2 8 2 3 0 8 6 3 4 6 5 6 7 4 8 1 3 9 1 9 1 2 
3 1 6 2 8 2 4 5 8 6 1 7 8 6 6 4 5 8 3 5 9 1 2 4 5 6 6 5 2 9 ;
: n7
4 7 6 5 4 5 6 8 2 8 4 8 9 1 2 8 8 3 1 4 2 6 0 7 6 9 0 0 4 2 
2 4 2 1 9 0 2 2 6 7 1 0 5 5 6 2 6 3 2 1 1 1 1 1 0 9 3 7 0 5 
4 4 2 1 7 5 0 6 9 4 1 6 5 8 9 6 0 4 0 8 0 7 1 9 8 4 0 3 8 5 
0 9 6 2 4 5 5 4 4 4 3 6 2 9 8 1 2 3 0 9 8 7 8 7 9 9 2 7 2 4 ;
: n8
4 2 8 4 9 0 9 1 8 8 8 4 5 8 0 1 5 6 1 6 6 0 9 7 9 1 9 1 3 3 
8 7 5 4 9 9 2 0 0 5 2 4 0 6 3 6 8 9 9 1 2 5 6 0 7 1 7 6 0 6 
0 5 8 8 6 1 1 6 4 6 7 1 0 9 4 0 5 0 7 7 5 4 1 0 0 2 2 5 6 9 
8 3 1 5 5 2 0 0 0 5 5 9 3 5 7 2 9 7 2 5 7 1 6 3 6 2 6 9 5 6 ;
: n9
1 8 8 2 6 7 0 4 2 8 2 5 2 4 8 3 6 0 0 8 2 3 2 5 7 5 3 0 4 2 
0 7 5 2 9 6 3 4 5 0 ; 

: numbers ( -- initial numbers to stack ) 
    n1 n2 n3 n4 n5 n6 n7 n8 n9 ;

: crunch ( x1 x2 x3 x4 x5 max -- x1 x2 x3 x4 max )
    swap 6 2 do i pick * loop max ;

: find-max 995 0 do crunch loop 2drop 2drop ;

numbers find-max . bye
$> time gforth-fast euler.fs
40824 gforth-fast euler.fs  0.02s user 0.01s system 5% cpu 0.483 total

Kind of annoying that I had to split up "numbers" in snippets, but whatever.

edit: Guess it is a good idea to clean up the stack afterwards.

Last edited by scj (2008-06-17 18:02:32)

Offline

Board footer

Powered by FluxBB