Bowling Kata

Our team’s been doing Katas to get the hang of TDD. One such kata (calculating bowling scores) struck me as insanely simple with pattern matching in F#: let rec score acc = function     | 10 :: (a :: b :: _ as t) -> score (acc + 10 + a + b) t //…

7

8-Queens in 8 Lines

Brushing up on “whiteboard coding” for internal interviews… Inspired by Hal Ableson’s streams-based solution to this old classic in the SICP lectures, here’s a pretty concise n-Queens solution:   let rec Solutions n board size = seq { // board is (x,y) tuple list of queens      let safe board (x,y) = // is particular…

1

Fixing Decades-old Bugs in the HP-35

[Part 2 of the HP Calc series] Making the JavaScript-based HP-35 microcode emulator has been a fun little project. Last time we disassembled the original bits from the ROM. I say “disassemble” but really our microcode instructions were an array of JavaScript functions. This time, I’m continuing the fun with what I’ll call an “assembler”;…

2

Microcode-level HP-35 Emulator (in JavaScript!)

[Part 1 of the HP Calc series] I recently started a super-geeky side hobby of collecting vintage calculators and got my hands on a pair of HP calcs. The more I learned about the internals of the devices, the more intrigued I was. Jacques Laporte has an absolutely wonderful site going into crazy detail. In…

5

FScheme – Scheme in F#

[Part 1 of the FScheme series] One of my New Year’s goals is to re-read Lisp in Small Pieces and implement all 11 interpreters and 2 compilers. As much as I like the “Lisp in Lisp” idea and enjoyed the eureka moment in SICP when Sussman writes the metacircular interpreter on the board to the…

7

Project Euler Problem #13

First ten digits of sum of following one-hundred 50-digit numbers. It would be interesting to do without BigInts. Could use doubles with enough precision for just the first ten digits or some such thing, but just wanted the correct answer to plug into the site and I’m lazy open System [37107287533902102798797998220837590246510135740250I;  46376937677490009712648124896970078050417018260538I;  74324986199524741059474233309513058123726617309629I;  91942213363574161572522430563301811072406154908250I;  23067588207539346171171980310421047513778063246676I;…

0

Project Euler Problem #12

First triangle number to have over five hundred divisors. let naturals = Seq.unfold (fun i -> Some(i, i + 1)) 1 // from prob7 let triangleNums = Seq.scan (+) 0 naturals let isFactor n d = n % d = 0 let factors n = seq { 1..int (sqrt (float n)) } |> Seq.filter (isFactor…

0

Project Euler Problem #11

Greatest product of four adjacent numbers (up, down, left, right, or diagonally) in this 20×20 grid: let grid = [|08;02;22;97;38;15;00;40;00;75;04;05;07;78;52;12;50;77;91;08;              49;49;99;40;17;81;18;57;60;87;17;40;98;43;69;48;04;56;62;00;              81;49;31;73;55;79;14;29;93;71;40;67;53;88;30;03;49;13;36;65;              52;70;95;23;04;60;11;42;69;24;68;56;01;32;56;71;37;02;36;91;              22;31;16;71;51;67;63;89;41;92;36;54;22;40;40;28;66;33;13;80;              24;47;32;60;99;03;45;02;44;75;33;53;78;36;84;20;35;17;12;50;              32;98;81;28;64;23;67;10;26;38;40;67;59;54;70;66;18;38;64;70;              67;26;20;68;02;62;12;20;95;63;94;39;63;08;40;91;66;49;94;21;              24;55;58;05;66;73;99;26;97;17;78;78;96;83;14;88;34;89;63;72;              21;36;23;09;75;00;76;44;20;45;35;14;00;61;33;97;34;31;33;95;              78;17;53;28;22;75;31;67;15;94;03;80;04;62;16;14;09;53;56;92;              16;39;05;42;96;35;31;47;55;58;88;24;00;17;54;24;36;29;85;57;              86;56;00;48;35;71;89;07;05;44;44;37;44;60;21;58;51;54;17;58;              19;80;81;68;05;94;47;69;28;73;92;13;86;52;17;77;04;89;55;40;              04;52;08;83;97;35;99;16;07;97;57;32;16;26;26;79;33;27;98;66;              88;36;68;87;57;62;20;72;03;46;33;67;46;55;12;32;63;93;53;69;              04;42;16;73;38;25;39;11;24;94;72;18;08;46;29;32;40;62;76;36;              20;69;36;41;72;30;23;88;34;62;99;69;82;67;59;85;74;04;36;16;             …

2

Project Euler Problem #10

Sum of primes below two-million. Easy problem, but way too slow (taking several minutes) with the naïve prime number generator from problem 7. This new version is 10x faster, based on this paper:http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf (still not implementing the ‘wheel’ though; probably another 3x improvement) let primes =     let rec sieve i c = seq {        …

0

Project Euler Problem #9

Pythagorean triplet where a + b + c = 1000 (2, 1) |> Seq.unfold (fun (m, n) –>     Some([m * m – n * n; 2 * m * n; m * m + n * n],         if n + 1 < m then m, n + 1 else m + 1, 1))…

0