As you could already know from Mr. C's
lectures from YUI Theater or
FrontTrends -
standard I/O is the worst thing programming languages could ever implement. Fortunately - Javascript has no input at all. And in most cases it doesn't need any - it was designed as script language for web pages. But nowadays we use Javascript in any other aspects of our programming life - we can build for desktops using
XUL, server-side tools like
node.js (for example with announced last week
JSPP) or
any other Server-side Javascript implemenation provide JS backend for the web, native mobile apps could be created using frameworks like
Phonegap. So what about executing JS scripts from command line? And why do we need it?
The reason I've refreshed my experiences with JS scripts executing was
Hacker Cup organized by Facebook - there are no language restrictions in there, your scripts just has to know how to analyze given input and write the answers on the standard output. It is quite unpopular way of using & writing Javascript, so I will show few tips of command line in here.
Engines
There is such a JavaScript engine called
Rhino. It is completely written in Java, open source, and very easy to use. It is managed by Mozilla, so you can find a lot of docs and tutorials on
Mozilla's page.
Rhino has few additional functions eg for working with files (
readFile()) or serializing objects (
serialize()), which makes it useful in solving algorithmic problems in competitions like FBHC. Full list of all shell function can be found on
Mozilla's page.
Each time you run Javascript scripts from command line, all the arguments you provide will be stored in global variable called '
arguments'. Enriched with this knowledge we can begin with some examples. This is my implementation of binarySearch algorithm:
Array.prototype.binSearch = function(element) {
var element = parseInt(element, 10),
left = 0,
right = this.length-1,
middle = ~~((left+right)/2),
lastMiddle;
while (parseInt(this[middle], 10) !== element) {
if (lastMiddle === middle) {
return null; //nothing found, break
}
if (parseInt(this[middle], 10) < element)
left = middle++;
else
right = middle--;
lastMiddle = middle;
middle = Math.round((left+right)/2);
}
return middle; //index of found element
}
var MainFunction = function(args) {
var a = readFile(args).split("\n"),
arrayElement = a[0].split(" "),
result;
print("Array: "+arrayElement);
for (var i=1, j=a.length;i < j;i++) {
result = arrayElement.binSearch(a[i]);
if (result)
print("Element "+parseInt(a[i], 10)+" in on position nr "+result);
else
print("Element "+parseInt(a[i], 10)+" cannot be found in the array");
}
}(arguments)
As an input it takes filename with the elements of an array in first row and elements to find in that array in next rows, like this:
4 10 12 19 25 34 41 50 52 61 66 68 76 81 82 85 94 97 105 112 115 124 128 138 139 230 321 432 456 540
61
82
94
2
10
4
24
432
Assuming that script file is called binSearch.js, data.txt is the file with input data, and both are in the same directory as Rhino, to run the script simply type
java -jar js.jar binSearch.js data.txt
Ideone
You can simply achieve the same effect using online tools\, without installing anything on your computer.
Ideone, online IDE & debugging tool allows you to run your scripts using Rhino or
SpiderMonkey, another Mozilla's JS engine, this one written in C. You can edit your scripts in realtime and provide different inputs on every run.
Good luck in FBHC!