Skip to content

Instantly share code, notes, and snippets.

View adilakhter's full-sized avatar

Adil Akhter adilakhter

View GitHub Profile
@adilakhter
adilakhter / gist:4124111
Created November 21, 2012 10:14
computelength (tail recursive)
// Tail recursive computation of List's length
let length list =
// Auxiliary function to compute length
// It store intermediate result in acc.
let rec lengthAux acc list =
match list with
| [] -> acc
| _::tail -> lengthAux (acc+1) tail
lengthAux 0 list // invoking lengthAux with acc = 0
@adilakhter
adilakhter / modulo.fs
Created November 21, 2012 12:29
modulo operator
let rec (|%|) a n =
match a, n with
|_ when a < n -> a
|_ when a>=n -> (|%|) (a-n) n
//Resulting signature: val ( |%| ) : int -> int -> int
@adilakhter
adilakhter / isprime.fs
Created November 21, 2012 15:56
isprime
let isprime n =
let rec isprimeAux i n =
i > n/2 || (n%i <> 0 && (isprimeAux (i+1) n))
isprimeAux 2 n
//> output:
//
//val isprime : int -> bool
//
//> isprime 10;;
@adilakhter
adilakhter / gist:4140927
Created November 24, 2012 18:52
f# higher order fn
let names = ["alice"; "bob"; "carol"]
let name = List.tryFind (fun s -> length s < 4) names
match name with
| Some n -> printfn "%s" n
| None -> printfn "They all have long names"
// partial application
let doubled = Seq.map (fun v -> v *2) values
@adilakhter
adilakhter / gist:4151069
Created November 26, 2012 22:26
list.average
let avg list =
let rec avgAux sum length list =
match list with
| [] -> sum/length
| x::xs -> avgAux (x+sum) (length + 1) xs
avgAux 0 0 list
@adilakhter
adilakhter / gist:4151076
Created November 26, 2012 22:27
count elements that are greater than avg of list elements
let countElements list =
let rec countElementsAux sum length l=
match l with
| [] -> (sum/length, 0) // computing average from sum and length accumulator
| x :: xs ->
let (avg,count) = countElementsAux (x+ sum) (length+1) xs
if x < avg then (avg,count) else (avg,count+1)
let (avg, count) = countElementsAux 0 0 list
count
@adilakhter
adilakhter / euler02.fsx
Created December 5, 2012 21:38
Euler Problem 2(1)
// Recursive solution
let eulerProblem2Answer'' =
let maxF = 4000000
let rec computeSum f1 f2 sum =
match f1 + f2 with
| n -> computeSum f2 n sum
| n when n%2 = 0 -> if (n<maxF) then (computeSum f2 n (sum+n)) else sum
computeSum 0 1 0
@adilakhter
adilakhter / euler02.fsx
Created December 5, 2012 21:52
Euler Problem 002 (2)
let eulerProblem2Answer =
(0,1)
|> Seq.unfold (fun (f1,f2) -> Some(f2, (f2, f1+f2))) // Fibonacci Sequence
|> Seq.takeWhile(fun x -> x < 4000000) // Taking upto Max Fibbonacci
|> Seq.filter (fun x -> x%2=0) // Filtering only even numbers
|> Seq.sum // computing sum
@adilakhter
adilakhter / euler02.fsx
Created December 5, 2012 21:54
Euler Problem 002 (3)
let eulerProblem2Answer' =
(0,1)
|> Seq.unfold (fun (f1,f2) -> Some(f2, (f2, f1+f2)))
|> Seq.takeWhile(fun x -> x < 4000000)
|> Seq.sumBy (fun x -> if (x%2)=0 then x else 0) // using SumBy with a projection
@adilakhter
adilakhter / length.fs
Created December 6, 2012 08:24
List.Length
let length list =
List.fold
(fun acc _ -> acc+1)
0
list