Natural Prestidigitation

This nifty assignment was developed by Steve Wolfman, Pratt 1997, ECE/CS Dual Major. We've made a few minor edits to give it a bit of a local flavor.

Please read this assignment and the associated How-To before you start programming.


The natural world is full of hidden and beautiful mathematics. The whorls of a conch shell hide the Fibonacci sequence and its Golden Ratio, plants grow in fractal patterns, and comets trace hyperbolic patterns through the solar system. All those beautiful patterns hide in the grungy data of human observation.

So, what are the populations of every town in North Carolina and the number of posts by various authors to a Duke sports bulletin board hiding from you?

Assignment Overview

In this assignment, you will write a program that determines the distribution of initial digits in a set of data (see the data directory for examples). In the end, we want a program that reads in a number n and a list of numbers from a file and outputs a list of 10 values: the frequency with which each digit 0–9 appears as the nth digit of one of the input numbers.

To be human-readable, the data files should also allow labels for the data. We'll accomplish this by allowing commenting in the input file. Your program should ignore anything between (* and *). You may assume that the (* and *) symbols will be surround by whitespace and that nested comments — comments inside other comments — are not allowed. Below are enrollments in Research Triangle Park colleges and universities in Fall 2000 (thanks to the "Research Triangle Regional Partnership" website: http://www.researchtriangle.org/data/enrollment.html).

(* Duke University *)                             12176
(* North Carolina Central University *)           5476
(* Louisburg College (Junior College) *)          543
(* Campbell University *)                         3490
(* University of North Carolina at Chapel Hill *) 24892
(* North Carolina State University *)             28619
(* Meredith College *)                            2595
(* Peace College *)                               603
(* Shaw University *)                             2527
(* St. Augustine's College *)                     1465
(* Southeastern Baptist Theological Seminary *)   1858

If the user enters 0 as the value for n, and thus chooses the first digit, then your program should print:

0s: 0 (0%) 1s: 3 (27%) 2s: 4 (36%) 3s: 1 (9%) 4s: 0 (0%) 5s: 2 (18%) 6s: 1 (9%) 7s: 0 (0%) 8s: 0 (0%) 9s: 0 (0%)

In your README, you should describe the distribution of digits for each of the data files and how they conform or differ from what you would expect from a random list of numbers.

Note: throughout this problem, you may assume that the numbers processed are non-negative or you can use the absolute value function Math.abs to help you handle negative numbers in a reasonable way.

Extra Credit

If you want to find the patterns hidden in the numbers around you, try the following three-part bonus problem:
  1. Find a data source on the web that no one else has used (see next part) and transform it into a format suitable for this assignment. The data must all be separate measurements of a single type of phenomenon. For example: measurements of university/college enrollments across different institutions (like above) or at the same institution across different years; measurements of the flow rates of all the major rivers in North Carolina; measurements of the height of 10000 randomly chosen Durham residents; measurements of the number of hits per day on the Duke computer science website over three years; measurements of the length in characters of each article in the Wikipedia; measurements of the population of the 1000 largest cities and townships in the US; etc. Furthermore, there must be at least 250 measurements in the list (but more would be better!).

  2. Post all of the following items to the course discussion forum with a title describing your data: the URL for your data source, a description of the data source, one attachment with bare data (i.e., no comments), and one attachment with labelled data (using the (* *) style above).

  3. Submit with your assignment the URL of your data, a description of the data source, and digit tallies for digit 1 and digit 2 of your data. Are there any oddities in the tallies? What about in other students' data?

Submitting

Submit Prestidigitation.java, README.txt, and any extra credit new data files under assignment name digit. Provide comments for the methods you write and include any tests that you wrote for the individual methods.
Last modified: Mon Jan 31 23:55:29 EST 2011