Math In the Address Bar

Did you know that you can do math problems in the address bar of your browser? Regardless of what browser your using, you can use its address bar to find the answer to an arithmetic problem. For instance, let’s say that you are using Internet Explorer and all of a sudden someone asks you what 54 × 32 is. To figure it out, you type the following into the address bar and then hit the ENTER key:

javascript:alert(54 * 32)

If you tried it out, you know the answer is 1728. What about the square root of 1728? To figure it out, you could use the following:

javascript:alert(Math.sqrt(1728))

Now that you know that Math.sqrt(…) exists, you may be wondering, what other math related functions and constants like this exist. Here is a list of them derived from DevGuru.com:

Constants

Math.E
Euler’s constant and the base of natural logarithms (~2.7183).

Math.LN10
The natural log of 10.

Math.LN2
The natural log of 2.

Math.LOG10E
The base 10 log of E.

Math.LOG2E
The base 2 log of E.

Math.PI
PI – The circumference of a circle divided by its the diameter.

Math.SQRT1_2
One divided by the square root of 2.

Math.SQRT2
The square root of 2.

Functions

Math.abs(X)
The absolute value of the number X.

Math.acos(X)
The arccosine of X (which must be greater than or equal to -1 and less than or equal to 1) as a value between 0 and PI.

Math.asin(X)
The arcsine of X (which must be greater than or equal to -1 and less than or equal to 1) as a value between -PI / 2 and PI / 2.

Math.atan(X)
The arctangent of X as a value between -PI / 2 and PI / 2.

Math.atan2(X, Y)
The arctangent of X / Y as a value between -PI / 2 and PI / 2.

Math.ceil(X)
If X is an integer this evaluates to X, otherwise it evaluates to the next integer up.

Math.cos(X)
The cosine of X as a value between -1 and 1.

Math.exp(X)
The value of EX where E is Euler’s constant.

Math.floor(X)
If X is an integer, this evaluates to X, otherwise it evaluates to the next integer down.

Math.log(X)
The natural log (base E) of X (which must be greater than 0).

Math.max(X, Y, …)
The maximum number of X, Y, and any other parameters that you specify.

Math.min(X, Y, …)
The minimum number of X, Y, and any other parameters that you specify.

Math.pow(X, Y)
The value of XY.

Math.random()
A random number that is greater than or equal to 0 and less than 1.

Math.round(X)
The rounded value of X. If the fractional portion of the number is less than 0.5, the number is rounded down, otherwise it is rounded up.

Math.sin(X)
The sine of X as a value between -1 and 1.

Math.sqrt(X)
The square root X (which must be greater than or equal to 0).

Math.tan(X)
The tangent of X.

If you haven’t already guessed it, alert(...) actually displays whatever you specify in a new dialog box. Believe it or not, you can also assign values to variables and then use those variables later on. Of course, though, you have to do all of this on one line. Here is an example of what I mean by assigning values to variables and then using them later:

javascript:age = 2011 - 1987; alert(age + Math.sqrt(age))

If you tried the above code out in your address bar, you now know what my age plus the square root of my age is.

All I have to say now is, “welcome to the world if JavaScript!!!”

Power Set

As I was beefing up my past implementation of cartesianProductOf(), I decided to look into set theory a little bit more. After looking through some Wikipedia pages, I found another process that may be of interest to JavaScript programmers that have to deal with sets: a JavaScript implementation of finding a power set. Here is my code to do this:

function powerSetOf(arrFull) {
  var ret = [], fullLen = arrFull.length, last = fullLen - 1;
  function get(arrPrefix, start, lenToFind) {
    for(lenToFind--; start < fullLen; start++)
      if(!lenToFind)
        ret.push(arrPrefix.concat([arrFull[start]]));
      else if(start < last)
        get(arrPrefix.concat([arrFull[start]]), start + 1, lenToFind);
  }
  for(var lenToFind = fullLen; lenToFind > 0; lenToFind--)
    get([], 0, lenToFind);
  return ret.concat([[]]);
}

Although the above code works, I couldn’t help think that there was a simpler way of achieving the same goal. After fumbling around the idea in my head, I came up with the following, shorter solution:

function powerSetOf(arr) {
  var item, ret = [[]], max = arr.length - 1;
  function fn(arrPrefix, start) {
    for(; ret.push(item = arrPrefix.concat([arr[start]])) && start < max;)
      fn(item, ++start);
  }
  if(max + 1)
    fn([], 0);
  return ret;
}

Unlike the first solution, the above one does not return the results ordered by size. On the other hand, this solution is shorter, an works faster.

You may have noticed that neither solution removes duplicates if they exist within the array. If you want to remove all duplicates from an array, you can make a build of jPaq that has the Array.prototype.uniquify() function and then use it as follows:

// Your array of numbers or whatever.
var arr = [1,2,1,3,4,3,2];

// Get the power set for your array.
var arrPowerSet = powerSetOf(arr.uniquify());

Cartesian Product of Multiple Arrays

A few weeks ago, I came across a question about finding the cartesian product of two or more arrays in JavaScript. For anybody who is looking to do so, I posted the following code on stackoverflow:

function cartesianProductOf() {
  return Array.prototype.reduce.call(arguments, function(a, b) {
    var ret = [];
    a.forEach(function(a) {
      b.forEach(function(b) {
        ret.push(a.concat([b]));
      });
    });
    return ret;
  }, [[]]);
}

It is important to note that the above code will only work on newer browsers that implement Array.prototype.forEach() and Array.prototype.reduce(). If you must allow this function to be used on any browser or even in a stand-alone Windows Host Script, I would suggest using this version of jPaq which implements the functions if they aren’t already present. As of yet, I have not received any requests to see this in a JavaScript library. If you do want it in a library, let me know of your suggestions for a better name than cartesianProductOf. My issue with the name is that it is too long.