Changing Times

2013
02.16
I’m surprised that so much have happened in Singapore this week.

First, FT reported about a suspected murder of an American engineer
http://www.ft.com/cms/s/2/afbddb44-7640-11e2-8eb6-00144feabdc0.html#axzz2L4Xa…
Then an estimated 4000 people protested the latest population white
paper http://www.bloomberg.com/news/2013-02-16/singaporeans-protest-plan-to-increas…
And former Prime Minister Lee Kuan Yew was reported to have been
hospitalized http://sg.news.yahoo.com/lee-kuan-yew-hospitalised-after-suffering-mini-strok…

All the events really serve as a reminder that no country in the world
has the same boundary or government in the past 200 years, and the
world will continue to change.

Posted via email from ramblings of a comsci

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Convert Baupost Group’s 13F into CSV

2013
01.21
Quick and dirty way to convert text file of Baupost Group’s 13F into
CSV for analysis. Because life is too short for manual copy and paste.

#include <iostream> using namespace std; int main () { char security[256], type[256], cusip[256]; int value, shares; while ( cin.good() ) { cin.get(security, 28); cin.get(type, 45-29+2); cin.get(cusip, 10); cin >> value >> shares; cout << security << "," << type << "," << cusip << "," << value << "," << shares << '\n'; cin.getline(security, 255, '\n'); } }

Posted via email from ramblings of a comsci

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Investing in America

2012
12.29

After a long wait, I finally completed my account setup with OptionsHouse two weeks ago. There are a number of obvious difference between US and UK -

1. Fund transfer takes a week in US compared to 2 hours in the UK (that's probably the only advantage in UK)

2. On the other hand there are a lot more companies to invest in. Now I can trade in anything listed on NYSE, NASDAQ, and Pink sheet, and there are major advantages. For example, the more efficient way to invest in gold is to buy SPDR Gold Trust that trades as GLD, but there is no easy way in UK.

3. There are also more ways to invest. I now have the flexibility of buying, short selling, and buying or selling put and call options all with reasonable bid/ask spread.

4. No tax on share purchases. I've always disliked the 0.5% tax in UK.

I have been loading up positions lately, mainly in companies that I'm familiar with, and doing more research in general. So far I have

AAPL – the iPhone, iPad, iTunes, and Mac company. Very simple, easy to analyze.

BRK.B – diversified conglomerate. Owns Geico, MidAmerican, BNSF Railway, etc. And Warren Buffett works there.

NVDA – makes graphics card chips and embedded SoC. Also simple business and reasonably easy to analyze and keep track of.

WFC – #1 bank in US west coast. Did well in 2008/09.

YHOO – digital media company. Recently fired a CEO who claimed to have Bachelor's degree in Computer Science but didn't, and hired another with a real Master's degree in CS. It's also the only company name I know of that has an exclamation mark.

DD – applied sciences company. Invented teflon, nylon, kevlar, lycra etc. It's also very complicated with many divisions and even more products.

VZ – leading telecom provider. Operates a tier 1 network. A big part of the reason I bought Vodafone in UK was because it owns 45% of Verizon Wireless. This is the 55% owner.

BSX – medical device manufacturer, my employer and I get a discount.

I own S&P 500 index fund in my retirement account.

I'm quite happy that the market has gotten lower this week. If it gets lower, I'll buy more, and if it gets a lot lower, I'll buy a lot more.

Posted via email from ramblings of a comsci

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

23 (pairs of chromosomes) and me – my experience with genetic testing

2012
12.19
A few weeks ago I ordered a DNA test kit from 23andme, mostly for fun. So I collected some of my saliva, put into the tube, and shipped it off to California. Today, I'm glad to report that the results are out.

First I have to declare that I have never taken a biology class in school, so I may not know what I'm talking about. Feel free to correct me. Also, the comprehensiveness of the results exceeded all my expectations.

There are many things about myself that I knew, but didn't know why. Now I can report that I have no flushing reaction to alcohol because I have two working copies of ALDH2 that can be inferred from GG genotype at rs671, and my friend Chork probably has AA (i.e., no working copies of ALDH2). My GG gene at rs713598 likely explains why I didn't start eating vegetables until I was 7 due to sensitivity to the bitter taste. It's interesting how my genes were able to explain my intolerance to lactose, intolerance to gluten, being better at sprinting than running long distance, being near-sighted, have brown eyes, A-B+ type blood, thick hair, lighter than average at birth, the list goes on and most of the predicted traits are incredibly accurate.

An important application of genetic testing is to predict response to common drugs, especially for those with severe side-effects. More information is always better, and the next time I encounter any of the drugs, I can make an informed decision and inform my physician the likely response.

The biggest attraction of the test by far for me is the ability to know the odds of getting various diseases, and this is where I got my biggest surprise. According to the test, I have 47% chance of getting Atrial Fibrillation during my lifetime compared to 27% in the general population due to chromosome 4q25. This is especially interesting given my day job is to develop a new cardiac mapping system. I'm in a good position given the clinical and engineering support I can obtain if/when I need to go for pulmonary vein isolation. Also, I have decades to participate in research and devise better procedures.

For now, I just have to eat healthily, have an active life, and work very hard. It feels good to have a good guess of my ills in my old age, and have decades to prepare for them.

Posted via email from ramblings of a comsci student

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Introduction to Finance Spreadsheets

2012
08.06
Doing Introduction to Finance on Coursera.org at the moment. Feel free to view and share my spreadsheet.

Posted via email from ramblings of a comsci student

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Getting Homebrew up and running

2012
06.12

For someone who came from Linux to OS X, the absence of a package manager is deeply disturbing. I chanced upon Homebrew, and managed to get it working after some Googling and fiddling. Please leave a comment if you have any trouble setting it up.

First, install Homebrew by copying this command to your Terminal.

/usr/bin/ruby -e "$(/usr/bin/curl -fsSL https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)"

After Homebrew has been successfully installed, type in “brew doctor” to see a (long and scary) list of errors. There were several errors on my computer.

Error: Some directories in /usr/local/share/man aren't writable. This can happen if you "sudo make install" software that isn't managed by Homebrew. If a brew tries to add locale information to one of these directories, then the install will fail during the link step. You should probably `chown` them:  /usr/local/share/man/de /usr/local/share/man/de/man1 Error: You have Xcode 4.2, which is outdated. Please install Xcode 4.3. Error: Unbrewed dylibs were found in /usr/local/lib. If you didn't put them there on purpose they could cause problems when building Homebrew formulae, and may need to be deleted.  Unexpected dylibs: /usr/local/lib/libcdt.5.dylib    /usr/local/lib/libcgraph.6.dylib    /usr/local/lib/libgraph.5.dylib    /usr/local/lib/libgvc.6.dylib    /usr/local/lib/libgvpr.2.dylib    /usr/local/lib/libpathplan.4.dylib    /usr/local/lib/libxdot.4.dylib Error: Unbrewed .pc files were found in /usr/local/lib/pkgconfig. If you didn't put them there on purpose they could cause problems when building Homebrew formulae, and may need to be deleted.  Unexpected .pc files: /usr/local/lib/pkgconfig/libcdt.pc    /usr/local/lib/pkgconfig/libcgraph.pc    /usr/local/lib/pkgconfig/libgraph.pc    /usr/local/lib/pkgconfig/libgvc.pc    /usr/local/lib/pkgconfig/libgvpr.pc    /usr/local/lib/pkgconfig/libpathplan.pc    /usr/local/lib/pkgconfig/libxdot.pc Error: /usr/bin occurs before /usr/local/bin This means that system-provided programs will be used instead of those provided by Homebrew. The following tools exist at both paths:  2to3  Consider amending your PATH so that /usr/local/bin is ahead of /usr/bin in your PATH.

First, I need to make the directories writable using “chown”.

sudo chown your_username /usr/local/share/man/de sudo chown your_username /usr/local/share/man/de/man1

Then I installed Xcode 4.3 from the App Store, and installed command line tools from Xcode->Preferences->Downloades->Components. Then I set a valid path to my Xcode 4.3.

sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

There are some unexpected dylib and .pc files from my installation of GraphViz. It’s probably safe to delete them directly but I chose to back them up instead in case other applications break. To back them up:

mkdir -p ~/brew-backup/lib/pkgconfig/ mv /usr/local/lib/*.*.dylib ~/brew-backup/lib/ mv /usr/local/lib/pkgconfig/*.pc ~/brew-backup/lib/pkgconfig/

Finally, amend the system PATH so that /usr/local/bin appears ahead of other paths.

export PATH=/usr/local/bin:/usr/local/sbin:$PATH

At this stage, Homebrew should be ready to go. Confirm that there is no error by running “brew doctor” again.

Also, run “brew update” before using so that package information are up-to-date.

Posted via email from ramblings of a comsci student

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Facebook Hacker Cup – Auction

2012
01.27

import java.util.*; public class Auction {

static int m, k; static int earliest; static long n; static long lcm; static int[] firstMod, min, max, minMap, maxMap; public static class Tree { private class Entry { // if min or max is 0, then the subtree is empty int value; int min; int max; boolean exists; public Entry(int value) { this.value = value; } public String toString() { return value+"|m"+min+"|M"+max+"|"+(exists?"T":"F"); } } Entry[] tree; int size; boolean[] exist; public Tree(int max) { tree = new Entry[2 * max + 2]; exist = new boolean[max + 1]; size = 0; Entry emptyTree = new Entry(0); // dummy entry, used as empty subtree genTree(1, max, 1); for (int i = 0; i < tree.length; i++) { if (tree[i] == null) tree[i] = emptyTree; } } private void genTree(int L, int R, int at) { if (L > R) return; int M = (L + R) / 2; tree[at] = new Entry(M); genTree(L, M - 1, at * 2); genTree(M + 1, R, at * 2 + 1); } public void clear() { size = 0; clear(1); } public void clear(int at) { if (at >= tree.length || tree[at].min == 0) return; tree[at].min = 0; tree[at].max = 0; tree[at].exists = false; exist[tree[at].value] = false; clear(at * 2); clear(at * 2  + 1); } public boolean isEmpty() { return size == 0; } public int first() { return tree[1].min; } public int last() { return tree[1].max; }  public void add(int n) { int at = 1; exist[n] = true; while (true) { if (n < tree[at].value) at *= 2; else if (n > tree[at].value) at = 2 * at + 1; else { if (!tree[at].exists) size++; tree[at].exists = true; break; } } updateMinMax(at); } public void remove(int n) { int at = 1; exist[n] = false; while (true) { if (n < tree[at].value) at *= 2; else if (n > tree[at].value) at = 2 * at + 1; else { if (tree[at].exists) size--; tree[at].exists = false; break; } } updateMinMax(at); } public boolean contains(int n) { return exist[n]; } private void updateMinMax(int at) { while (at >= 1) { Entry L = tree[0], R = tree[0], M = tree[at]; if (at * 2 < tree.length) L = tree[at * 2]; if (at * 2 + 1 < tree.length) R = tree[at * 2 + 1];   if (L.min != 0) M.min = L.min; else if (M.exists) M.min = M.value; else M.min = R.min;  if (R.max != 0) M.max = R.max; else if (M.exists) M.max = M.value; else M.max = L.max;  at /= 2; } } } public static class Sequence { int[] leading, repeat, first; long l, r, mod; public int get(int i) { if (i < l) return leading[(int) i]; i -= l; return repeat[(int) (i % r)]; } public String toString() { return Arrays.toString(leading)+"("+Arrays.toString(repeat)+")"; } public Sequence(int p1, long a, long b, long m) { mod = m; first = new int[(int) mod + 1];  int P = p1; List list = new ArrayList(); boolean[] seen = new boolean[(int) (m+1)]; for (int i = 1; i <= n; i++) { if (seen[P]) { int start = list.indexOf(P); leading = new int[start]; repeat = new int[list.size() - start]; for (int j = 0; j < start; j++) leading[j] = list.get(j); for (int j = start; j < list.size(); j++) { repeat[j - start] = list.get(j); first[list.get(j)] = j + 1; } break; } else { list.add(P); } seen[P] = true; P = (int) (((a * P + b) % m) + 1); if (i == n) { leading = new int[(int) n]; repeat = new int[0]; for (int j = 0; j < n; j++) { leading[j] = list.get(j); } } } l = leading.length; r = repeat.length; } }  public static long gcd(long a, long b) { return b == 0 ? a : gcd(b, a%b); } public static long ceil(long a, long b) { // assumes a >= 0 return (a+b-1)/b; } public static long floor(long a, long b) { if (a < 0) return -ceil(-a, b); return a/b; } public static long timesSeen(int p, int w) { if (P.first[p] == 0 || W.first[w] == 0) return 1; int mod = (int) ((((W.first[w] - P.first[p]) % W.r) + W.r) % W.r); long firstSeen = P.r * firstMod[mod] + P.first[p]; long k = Math.min(floor(firstSeen - P.first[p], lcm), floor(firstSeen - W.first[w], lcm)); firstSeen -= k * lcm; return (n - firstSeen) / lcm + 1; } public static void generateMinMax() { boolean[] seen = new boolean[(int)W.r]; int[] seenWhen = new int[k+1]; minMap = new int[(int) P.r]; maxMap = new int[(int) P.r]; earliest = 1000000000; for (int i = 0; i < W.r; i++) { long first = 0; if (P.l + 1 - (W.l + i + 1) > 0) first = ceil(P.l + 1 - (W.l + i + 1), W.r); // get the first time we see it after the leading P terms seenWhen[i] = (int)(W.r * first + W.l + i + 1); earliest = Math.min(earliest, seenWhen[i]); }  if (P.r == 0) return; Tree window = new Tree((int)(W.mod)); for (int start = 0; start < W.r; start++) { long endW = start, L = 0, R = 0; int smallest = earliest; if (seen[start]) continue; window.clear(); int atW = start; //while (smallest <= Math.max(P.l + P.r, W.l + W.r)) { // nope. while (smallest - earliest < P.r) { // nope. seen[atW] = true; int startElement = W.repeat[atW]; long last = seenWhen[atW] + (window.size - 1) * P.r; while (last + P.r <= n) { if (L > R) { R = L; endW = atW; } int next = W.repeat[(int) endW]; if (window.contains(next)) break; window.add(next); last += P.r; endW += P.r; endW %= W.r; R++; } int when = seenWhen[atW]; if (!window.isEmpty() && when - earliest < P.r) { minMap[when - earliest] = window.first(); maxMap[when - earliest] = window.last(); } window.remove(startElement); seenWhen[atW] += W.r; atW += P.r; atW %= W.r; L++; if (atW == start) { // we've looped, HOPE THIS WORKS RIGHT smallest += W.r; } } }  firstMod = new int[(int)W.r]; for (int i = 0; i < W.r / gcd(P.r, W.r); i++) { firstMod[(int) (P.r * i % W.r)] = i; } } public static Sequence P, W; public static void main(String[] args) { Scanner in = new Scanner(System.in); int t = in.nextInt(); for (int ca = 1; ca <= t; ca++) { n = in.nextLong(); int p1 = in.nextInt(), w1 = in.nextInt(); m = in.nextInt(); k = in.nextInt(); int a = in.nextInt(), b = in.nextInt(), c = in.nextInt(), d = in.nextInt();  P = new Sequence(p1, a, b, m); W = new Sequence(w1, c, d, k);  generateMinMax();  lcm = 0; if (W.r > 0 && P.r > 0) lcm = (W.r / gcd(W.r, P.r) * P.r);  min = new int[m+1]; max = new int[m+1]; for (int i = 0; i <= m; i++) min[i] = k+1; // lower bound: 0, upper bound: k+1  for (int i = 0; i < P.l; i++) { min[P.get(i)] = W.get(i); max[P.get(i)] = W.get(i); } for (int i = (int)P.l; i < P.l + P.r; i++) { int j = i; while (j < W.l) { min[P.get(i)] = Math.min(min[P.get(i)], W.get(j)); max[P.get(i)] = Math.max(max[P.get(i)], W.get(j)); j += P.r; } if (j < n) { int id = j + 1 - earliest; if (minMap[id] > 0) min[P.get(i)] = Math.min(min[P.get(i)], minMap[id]); if (maxMap[id] > 0) max[P.get(i)] = Math.max(max[P.get(i)], maxMap[id]); } }  long terrible = 0; int maxMaxs = 0; for (int i = m; i >= 1; i--) { if (max[i] > maxMaxs) {

// System.out.println(“Terrible: ”+i+“,”+max[i]+“ ct=”+timesSeen(i,max[i]));

terrible += timesSeen(i, max[i]); maxMaxs = max[i]; } } long bargains = 0; int minMins = k+1; for (int i = 1; i <= m; i++) { if (min[i] < minMins) { bargains += timesSeen(i, min[i]); minMins = min[i]; } }  System.out.printf("Case #%d: %d %d%n", ca, terrible, bargains); } }

}

Posted via email from ramblings of a comsci student

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Facebook Hacker Cup – Alphabet Soup

2012
01.27
Problem statement:

Alfredo Spaghetti really likes soup, especially when it contains
alphabet pasta. Every day he constructs a sentence from letters,
places the letters into a bowl of broth and enjoys delicious alphabet
soup.

Today, after constructing the sentence, Alfredo remembered that the
Facebook Hacker Cup starts today! Thus, he decided to construct the
phrase “HACKERCUP”. As he already added the letters to the broth, he
is stuck with the letters he originally selected. Help Alfredo
determine how many times he can place the word “HACKERCUP”
side-by-side using the letters in his soup.

Input
The first line of the input file contains a single integer T: the
number of test cases. T lines follow, each representing a single test
case with a sequence of upper-case letters and spaces: the original
sentence Alfredo constructed.

Output
Output T lines, one for each test case. For each case, output “Case
#t: n”, where t is the test case number (starting from 1) and n is the
number of times the word “HACKERCUP” can be placed side-by-side using
the letters from the sentence.

Constraints
1 < T ≤ 20
Sentences contain only the upper-case letters A-Z and the space character
Each sentence contains at least one letter, and contains at most 1000
characters, including spaces
Example input
5
WELCOME TO FACEBOOK HACKERCUP
CUP WITH LABEL HACKERCUP BELONGS TO HACKER
QUICK CUTE BROWN FOX JUMPS OVER THE LAZY DOG
MOVE FAST BE BOLD
HACK THE HACKERCUP

Example output
Case #1: 1
Case #2: 2
Case #3: 1
Case #4: 0
Case #5: 1

Solution:

Very easy problem, just iterate through the sentence, and find least
occurrence in the alphabets contained in “HACKERCUP” (notice there are
2 Cs).

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Alphabet {
       public static void main(String[] args) throws FileNotFoundException {
               Scanner sc = new Scanner (new File(args[0]));
               int t = sc.nextInt();
               sc.nextLine();
               for (int i=1; i<= t; i++) {
                       String s = sc.nextLine();
                       char[] ch = s.toCharArray();
                       int[] al = new int[7];
                       int c = 0;
                       for (int i1=0; i1<ch.length; i1++) {
                               switch (ch[i1]) {
                               case ‘H’: al[0]++;
                               break;
                               case ‘A’: al[1]++;
                               break;
                               case ‘C’: c++;
                               break;
                               case ‘K’: al[2]++;
                               break;
                               case ‘E’: al[3]++;
                               break;
                               case ‘R’: al[4]++;
                               break;
                               case ‘U’: al[5]++;
                               break;
                               case ‘P’: al[6]++;
                               break;
                               default: break;
                               }
                       }
                       int min = c/2;
                       for (int j=0; j<al.length; j++) {
                               if (al[j]<min)
                                       min = al[j];
                       }
                       System.out.println(“Case #”+i+”: “+min);
               }
       }

}

 

Posted via email from ramblings of a comsci student

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Facebook Hacker Cup – Billboard

2012
01.27
Problem statement:

We are starting preparations for Hacker Cup 2013 really early. Our
first step is to prepare billboards to advertise the contest. We have
text for hundreds of billboards, but we need your help to design them.

The billboards are of different sizes, but are all rectangular. The
billboard widths and heights are all integers. We will supply you with
the size in inches and the text we want printed. We want you to tell
us how large we can print the text, such that it fits on the billboard
without splitting any words across lines. Since this is to attract
hackers like yourself, we will use a monospace font, meaning that all
characters are of the same width (e.g.. ‘l’ and ‘m’ take up the same
horizontal space, as do space characters). The characters in our font
are of equal width and height, and there will be no additional spacing
between adjacent characters or adjacent rows. If you print a word on
one line and print the next word on the next line, you do not need to
print a space between them.

Let’s say we want to print the text “Facebook Hacker Cup 2013″ on a
350×100″ billboard. If we use a font size of 33″ per character, then
we can print “Facebook” on the first line, “Hacker Cup” on the second
and “2013″ on the third. The widest of the three lines is “Hacker
Cup”, which is 330″ wide. There are three lines, so the total height
is 99″. We cannot go any larger.

Input
The first line of the input file contains a single integer T: the
number of test cases. T lines follow, each representing a single test
case in the form “W H S”. W and H are the width and height in inches
of the available space. S is the text to be written.

Output
Output T lines, one for each test case. For each case, output “Case
#t: s”, where t is the test case number (starting from 1) and s is the
maximum font size, in inches per character, we can use. The size must
be an integral number of inches. If the text does not fit when printed
at a size of 1″, then output 0.

Constraints
1 ? T ? 20
1 ? W, H ? 1000
The text will contain only lower-case letters a-z, upper-case letters
A-Z, digits 0-9 and the space character
The text will not start or end with the space character, and will
never contain two adjacent space characters
The text in each case contains at most 1000 characters

Example input
5
20 6 hacker cup
100 20 hacker cup 2013
10 20 MUST BE ABLE TO HACK
55 25 Can you hack
100 20 Hack your way to the cup

Example output
Case #1: 3
Case #2: 10
Case #3: 2
Case #4: 8
Case #5: 7

Solution:

Since the width and height are fairly small, simulation is feasible.
Solve the problem by iterating font size from 1 until the billboard
cannot contain all the words. Fill the billboard line by line.
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class Billboards {        public static void main(String[] args) throws FileNotFoundException {                Scanner sc = new Scanner (new File(args[0]));                int t = sc.nextInt();                for (int i=1; i<= t; i++) {                        int w = sc.nextInt();                        int h = sc.nextInt();                        sc.skip(" ");                        String s = sc.nextLine();                        String[] sa = s.split(" ");                        int size = 0;                        for (int j=1; j<10000; j++) {                                int saPtr = 0;                                int currH = h;                                while (true) {                                        currH -= j;                                        if (currH < 0)                                                break;                                        int currW = w;                                        while (currW >= (sa[saPtr].length()*j) ) {                                                currW -= sa[saPtr].length()*j;                                                currW -= j;                                                saPtr++;                                                if (saPtr == sa.length) {                                                        size = j;                                                        break;                                                }                                        }                                        if (size == j)                                                break;                                }                                if (size < j)                                        break;                        }                        System.out.println("Case #"+i+": "+size);                }        } }

Posted via email from ramblings of a comsci student

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

My 2011 in numbers

2011
12.31
111207-lg-23a2011rev

169 – new friends on Facebook

116 – people in my Google+ circles

54 – Facebook events joined

 

77 – days spent in London over the summer

29 – days spent at home

4 – kg put on at home

 

0.16 – thickness of my new Macbook Air in inches (4mm)

10.7 – version of Mac OS running on the Macbook Air

2.3.4 – version of updated Android running on my Samsung Galaxy S and Nook Color

26 – apps downloaded from Mac App store

 

8.83 – percentage increase in my stock portfolio value

5.5 – estimated rate of inflation

0.5 – Bank of England base rate

240 – share price of Barclays Plc when I joined

155 – share price when I left

 

60 – miles cycled from London to Cambridge

28 – miles cycled from Cambridge to Ely and back

 

Posted via email from ramblings of a comsci student

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]