function running_stddev() {
    var n = 0;
    var sum = 0.0;
    var sum_sq = 0.0;
    return function(num) {
        n++;
        sum += num;
        sum_sq += num*num;
        return Math.sqrt( (sum_sq / n) - Math.pow(sum / n, 2) );
    }
}

var sd = running_stddev();
var nums = [2,4,4,4,5,5,7,9];
var stddev = [];
for (var i in nums)
    stddev.push( sd(nums[i]) );

WScript.Echo(stddev.join(', ');
---
#!/usr/bin/env node

function main() {
	var program = __filename;
	console.log("Program: " + program);
}

if (!module.parent) { main(); }
---
for (;;) {
  var a = Math.floor(Math.random() * 20);
  print(a);
  if (a == 10)
    break;
  a = Math.floor(Math.random() * 20);
  print(a);
}
---
var fso = new ActiveXObject("Scripting.FileSystemObject");

function walkDirectoryTree(folder, folder_name, re_pattern) {
    WScript.Echo("Files in " + folder_name + " matching '" + re_pattern + "':");
    walkDirectoryFilter(folder.files, re_pattern);

    var subfolders = folder.SubFolders;
    WScript.Echo("Folders in " + folder_name + " matching '" + re_pattern + "':");
    walkDirectoryFilter(subfolders, re_pattern);

    WScript.Echo();
    var en = new Enumerator(subfolders);
    while (! en.atEnd()) {
        var subfolder = en.item();
        walkDirectoryTree(subfolder, folder_name + "/" + subfolder.name, re_pattern);
        en.moveNext();
    }
}

function walkDirectoryFilter(items, re_pattern) {
    var e = new Enumerator(items);
    while (! e.atEnd()) {
        var item = e.item();
        if (item.name.match(re_pattern))
            WScript.Echo(item.name);
        e.moveNext();
    }
}

walkDirectoryTree(dir, dir.name, '\\.txt$');
---
document.onkeydown = function(evt) {
  if (evt.keyCode === 118) {
    alert("You pressed F7!");
    return false;
  }
}
---
(function () {

    function wakeSplit(intNuts, intSailors, intDepth) {
        var nDepth = intDepth !== undefined ? intDepth : intSailors,
            portion = Math.floor(intNuts / intSailors),
            remain = intNuts % intSailors;

        return 0 >= portion || remain !== (nDepth ? 1 : 0) ?
            null : nDepth ? wakeSplit(
                intNuts - portion - remain, intSailors, nDepth - 1
            ) : intNuts;
    }

    return [5, 6, 7].map(function (intSailors) {
        var intNuts = intSailors;

        while (!wakeSplit(intNuts, intSailors)) intNuts += 1;

        return intNuts;
    });
})();
---
var array = [];
array.push('abc');
array.push(123);
array.push(new MyClass);
console.log( array[2] );
---
var a = parseInt(process.argv[2], 10);
var b = parseInt(process.argv[3], 10);

var sum = a + b;
var difference = a - b;
var product = a * b;
var division = a / b;
var remainder = a % b;

console.log('a + b = %d', sum);
console.log('a - b = %d', difference);
console.log('a * b = %d', product);
console.log('a / b = %d', division);
console.log('a % b = %d', remainder);
---
const aux = n => {
  if(n <= 1) return [1]
  const prevLayer = aux(n - 1)
  const shifted = [0, ...prevLayer]
  return shifted.map((x, i) => (prevLayer[i] || 0) + x)
}
const pascal = n => {
  for(let i = 1; i <= n; i++) {
    console.log(aux(i).join(' '))
  }
}
pascal(8)
---
function fibo(n) {
  if (n < 0) { throw "Argument cannot be negative"; }

  return (function(n) {
    return (n < 2) ? n : arguments.callee(n-1) + arguments.callee(n-2);
  })(n);
}
---
let thePressedKey;

function handleKey(evt) {
  thePressedKey = evt;
  console.log(thePressedKey);
}

document.addEventListener('keydown', handleKey);
---
const date = new Date('2007-11-23T00:00:00Z')

const concise = date.toISOString().split('T', 1)[0]

const pretty = date.toLocaleString('en-US', {
    weekday: 'long',
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    timeZone: 'UTC',
})

console.log({ concise, pretty })
---
var n = 1024;
while (n > 0) {
  print(n);
  n /= 2;
}
---
String.prototype.collapse = function() {
  let str = this;
  for (let i = 0; i < str.length; i++) {
    while (str[i] == str[i+1]) str = str.substr(0,i) + str.substr(i+1);
  }
  return str;
}

let strings = [
  '',
  '"If I were two-faced, would I be wearing this one?" --- Abraham Lincoln ',
  '..1111111111111111111111111111111111111111111111111111111111111117777888',
  `I never give 'em hell, I just tell the truth, and they think it's hell. `,
  '                                                    --- Harry S Truman  '
];
for (let i = 0; i < strings.length; i++) {
  let str = strings[i], col = str.collapse();
  console.log(`«««${str}»»» (${str.length})`);
  console.log(`«««${col}»»» (${col.length})`);
}
---
Solution: [
  'ieee',
  'std_cell_lib',
  'gtech',
  'dware',
  'dw07',
  'dw06',
  'dw05',
  'dw02',
  'dw01',
  'dw04',
  'std',
  'ramlib',
  'synopsys',
  'dw03',
  'des_system_lib' ]
---
for(i = 1; i <= 10; i++)
    console.log(i + " : " + factor(i).join(" x "));

function factor(n) {
    var factors = [];
    if (n == 1) return [1];
    for(p = 2; p <= n; ) {
	if((n % p) == 0) {
	    factors[factors.length] = p;
	    n /= p;
	}
	else p++;
    }
    return factors;
}
---
function fib(arity, len) {
    return nacci(nacci([1,1], arity, arity), arity, len);
}

function lucas(arity, len) {
    return nacci(nacci([2,1], arity, arity), arity, len);
}

function nacci(a, arity, len) {
    while (a.length < len) {
        var sum = 0;
        for (var i = Math.max(0, a.length - arity); i < a.length; i++)
            sum += a[i];
        a.push(sum);
    }
    return a;
}

function main() {
    for (var arity = 2; arity <= 10; arity++)
        console.log("fib(" + arity + "): " + fib(arity, 15));
    for (var arity = 2; arity <= 10; arity++)
        console.log("lucas(" + arity + "): " + lucas(arity, 15));
}

main();
---
function stripComments(s) {
  var re1 = /^\s+|\s+$/g;
  var re2 = /\s*[#;].+$/g;
  return s.replace(re1,'').replace(re2,'');
}


var s1 = 'apples, pears # and bananas';
var s2 = 'apples, pears ; and bananas';

alert(stripComments(s1) + '\n' + stripComments(s2));
---
function logic(a,b) {
  print("a AND b: " + (a && b));
  print("a OR b: " + (a || b));
  print("NOT a: " + (!a));
}
---
(() => {
    'use strict';

    let lst = [
          { "name": "Lagos",                "population": 21.0  },
          { "name": "Cairo",                "population": 15.2  },
          { "name": "Kinshasa-Brazzaville", "population": 11.3  },
          { "name": "Greater Johannesburg", "population":  7.55 },
          { "name": "Mogadishu",            "population":  5.85 },
          { "name": "Khartoum-Omdurman",    "population":  4.98 },
          { "name": "Dar Es Salaam",        "population":  4.7  },
          { "name": "Alexandria",           "population":  4.58 },
          { "name": "Abidjan",              "population":  4.4  },
          { "name": "Casablanca",           "population":  3.98 }
        ];

    return {
        darEsSalaamIndex: lst.findIndex(x => x.name === 'Dar Es Salaam'),
        firstBelow5M: lst.find(x => x.population < 5)
            .name,
        firstApop: lst.find(x => x.name[0] === 'A')
            .population
    };

})();
---
(function () {
     'use strict';

     function maxCombine(xs) {
         return parseInt(
             xs.sort(
                 function (x, y) {
                     var a = x.toString(),
                         b = y.toString(),
                         ab = parseInt(a + b),
                         ba = parseInt(b + a);

                     return ab > ba ? -1 : (ab < ba ? 1 : 0);
                 }
             )
             .join(''), 10
         );
     }

     return [
        [1, 34, 3, 98, 9, 76, 45, 4],
        [54, 546, 548, 60]
     ].map(maxCombine);

 })();
---
function shellSort (a) {
    for (var h = a.length; h > 0; h = parseInt(h / 2)) {
        for (var i = h; i < a.length; i++) {
            var k = a[i];
            for (var j = i; j >= h && k < a[j - h]; j -= h)
                a[j] = a[j - h];
            a[j] = k;
        }
    }
    return a;
}

var a = [];
var n = location.href.match(/\?(\d+)|$/)[1] || 10;
for (var i = 0; i < n; i++)
    a.push(parseInt(Math.random() * 100));
shellSort(a);
document.write(a.join(" "));
---
function sort_disjoint(values, indices) {
  var sublist = [];
  indices.sort(function(a, b) { return a > b; });

  for (var i = 0; i < indices.length; i += 1) {
    sublist.push(values[indices[i]]);
  }

  sublist.sort(function(a, b) { return a < b; });

  for (var i = 0; i < indices.length; i += 1) {
    values[indices[i]] = sublist.pop();
  }

  return values;
}
---
montyhall(1000, 3)
Object {stayWins: "349 34.9%", switchWins: "651 65.1%"}
montyhall(1000, 4)
Object {stayWins: "253 25.3%", switchWins: "384 38.4%"}
montyhall(1000, 5)
Object {stayWins: "202 20.2%", switchWins: "265 26.5%"}
---
var str = prompt("Enter a string");
var value = 0;
while (value != 75000) {
    value = parseInt( prompt("Enter the number 75000") );
}
---
var a = [[2, 12, 10, 4], [18, 11, 9, 3], [14, 15, 7, 17], [6, 19, 8, 13], [1, 20, 16, 5]];

outer_loop:
for (var i in a) {
    print("row " + i);
    for (var j in a[i]) {
        print(" " + a[i][j]);
        if (a[i][j] == 20)
            break outer_loop;
    }
}
print("done");
---
var Roman = {
  Values: [['CM', 900],  ['CD', 400], ['XC',  90], ['XL',  40], ['IV', 4],
           ['IX',   9], ['V',   5], ['X',   10], ['L',  50],
           ['C',  100], ['M', 1000], ['I',    1], ['D',  500]],
  UnmappedStr : 'Q',
  parse: function(str) {
    var result = 0
    for (var i=0; i<Roman.Values.length; ++i) {
      var pair = Roman.Values[i]
      var key = pair[0]
      var value = pair[1]
      var regex = RegExp(key)
      while (str.match(regex)) {
        result += value
        str = str.replace(regex, Roman.UnmappedStr)
      }
    }
    return result
  }
}

var test_data = ['MCMXC', 'MDCLXVI', 'MMVIII']
for (var i=0; i<test_data.length; ++i) {
  var test_datum = test_data[i]
  print(test_datum + ": " + Roman.parse(test_datum))
}
---
var dog = "Benjamin";
var Dog = "Samba";
var DOG = "Bernie";
document.write("The three dogs are named " + dog + ", " + Dog + ", and " + DOG + ".");
---
function F(n, x, y) {
  if (n === 0) {
    return x + y;
  }

  if (y === 0) {
    return x;
  }

  return F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y);
}
---
function swap(arr) {
  var tmp = arr[0];
  arr[0] = arr[1];
  arr[1] = tmp;
}
---
var fs = require('fs');
var lp = fs.openSync('/dev/lp0', 'w');
fs.writeSync(lp, 'Hello, world!\n');
fs.close(lp);
---
var n = 2.5, a = 200, b = 200, ctx;

function point( x, y ) {
    ctx.fillRect( x, y, 1, 1);
}

function start() {
    var can = document.createElement('canvas');
    can.width  = can.height = 600;
    ctx = can.getContext( "2d" );
    ctx.rect( 0, 0, can.width, can.height );
    ctx.fillStyle = "#000000"; ctx.fill();
    document.body.appendChild( can );

    ctx.fillStyle = "#ffffff";
    for( var t = 0; t < 1000; t += .1 ) {
       x = Math.pow( Math.abs( Math.cos( t ) ), 2 / n ) * a * Math.sign( Math.cos( t ) );
       y = Math.pow( Math.abs( Math.sin( t ) ), 2 / n ) * b * Math.sign( Math.sin( t ) );

       point( x + ( can.width >> 1 ), y + ( can.height >> 1 ) );
    }
}
---
const check = s => {
  const _multiply = (e, i) => i % 2 ? e * 1 : e * 3;
  const _sum = (p, c) => p + c;
  const arr = [...s.replaceAll('-', '')
    .replaceAll(' ', '')];
  if ([13].includes(arr.length)) {
    const [last, ...rest] = [...arr].reverse();
    const result = rest.map(_multiply).reduce(_sum, last * 1);
    return result % 10 === 0;
  }
  return false;
}

[
  "978-0596528126",
  "978-0596528120",
  "978-1788399081",
  "978-1788399083"].map(check)
---
function selectionSort(nums) {
  var len = nums.length;
  for(var i = 0; i < len; i++) {
    var minAt = i;
    for(var j = i + 1; j < len; j++) {
      if(nums[j] < nums[minAt])
        minAt = j;
    }

    if(minAt != i) {
      var temp = nums[i];
      nums[i] = nums[minAt];
      nums[minAt] = temp;
    }
  }
  return nums;
}
---
var s = document.createElement('script');
s.type = 'application/javascript';

s.src = 'http://code.jquery.com/jquery-1.6.2.js';
document.body.appendChild(s);
---
const money = require('money-math')

let hamburgers = 4000000000000000
let hamburgerPrice = 5.50

let shakes = 2
let shakePrice = 2.86

let tax = 7.65

let hamburgerTotal = money.mul(hamburgers.toFixed(0), money.floatToAmount(hamburgerPrice))
let shakeTotal = money.mul(shakes.toFixed(0), money.floatToAmount(shakePrice))

let subTotal = money.add(hamburgerTotal, shakeTotal)

let taxTotal = money.percent(subTotal, tax)

let total = money.add(subTotal, taxTotal)

console.log('Hamburger Total:', hamburgerTotal)
console.log('Shake Total:', shakeTotal)
console.log('Sub Total:', subTotal)
console.log('Tax:', taxTotal)
console.log('Total:', total)
---
function findNth(s, c, n) {
  if (n === 1) return s.indexOf(c);
  return s.indexOf(c, findNth(s, c, n - 1) + 1);
}

function selectiveReplace(s, ops) {
  const chars = Array.from(s);
  for ([n, old, rep] of ops) {
    chars[findNth(s, old, n)] = rep;
  }
  return chars.join("");
}

console.log(
  selectiveReplace("abracadabra", [
    [1, "a", "A"],
    [2, "a", "B"],
    [4, "a", "C"],
    [5, "a", "D"],
    [1, "b", "E"],
    [2, "r", "F"],
  ])
);
---
export function encode (number) {
    return number ^ (number >> 1)
}

export function decode (encodedNumber) {
    let number = encodedNumber

    while (encodedNumber >>= 1) {
        number ^= encodedNumber
    }

    return number
}
---
  n = 519

  while ( ((n * n) % 1000000) != 269696 )
    n = n + 1

  console.log(n)
---
(function(steps) {
    'use strict';
    var i, tmp, s1 = '0', s2 = '1';
    for (i = 0; i < steps; i++) {
        tmp = s1;
        s1 += s2;
        s2 += tmp;
    }
    console.log(s1);
})(6);
---
const addMissingZeros = date => (/^\d$/.test(date) ? `0${date}` : date);

const formatter = (date, readable) => {
  const year = date.getFullYear();
  const month = addMissingZeros(date.getMonth() + 1);
  const day = addMissingZeros(date.getDate());

  return readable ? `${year}-${month}-${day}` : `${year}${month}${day}`;
};

function getPalindromeDates(start, palindromesToShow = 15) {
  let date = start || new Date(2020, 3, 2);

  for (
    let i = 0;
    i < palindromesToShow;
    date = new Date(date.setDate(date.getDate() + 1))
  ) {
    const formattedDate = formatter(date);
    if (formattedDate === formattedDate.split("").reverse().join("")) {
      i++;
      console.log(formatter(date, true));
    }
  }
}

getPalindromeDates();
---
var countSort = function(arr, min, max) {
    var i, z = 0, count = [];

    for (i = min; i <= max; i++) {
        count[i] = 0;
    }

    for (i=0; i < arr.length; i++) {
        count[arr[i]]++;
    }

    for (i = min; i <= max; i++) {
        while (count[i]-- > 0) {
            arr[z++] = i;
        }
    }

}
---
function DoublyLinkedList(value, next, prev) {
    this._value = value;
    this._next = next;
    this._prev = prev;
}
DoublyLinkedList.prototype = new LinkedList();

DoublyLinkedList.prototype.prev = function() {
    if (arguments.length == 1)
        this._prev = arguments[0];
    else
        return this._prev;
}

function createDoublyLinkedListFromArray(ary) {
    var node, prev, head = new DoublyLinkedList(ary[0], null, null);
    prev = head;
    for (var i = 1; i < ary.length; i++) {
        node = new DoublyLinkedList(ary[i], null, prev);
        prev.next(node);
        prev = node;
    }
    return head;
}

var head = createDoublyLinkedListFromArray([10,20,30,40]);
---
...
<script src='./dragon.js'></script>
...
<div>
   <svg xmlns='http://www.w3.org/2000/svg' id='fractal'></svg>
</div>
<script>
   DRAGON.fractal('fractal', [100,300], [500,300], 15, false, 700);
</script>
...
---
var hofst_10k = function(n) {
	var memo = [1, 1];

	var a = function(n) {
		var result = memo[n-1];
		if (typeof result !== 'number') {
			result = a(a(n-1))+a(n-a(n-1));	
			memo[n-1] = result;
		}	
		return result;
	}
	return a;
}();

var maxima_between_twos = function(exp) {
	var current_max = 0;
	for(var i = Math.pow(2,exp)+1; i < Math.pow(2,exp+1); i += 1) {
		current_max = Math.max(current_max, hofst_10k(i)/i);
	}
	return current_max;
}

for(var i = 1; i <= 20; i += 1) {
	console.log("Maxima between 2^"+i+"-2^"+(i+1)+" is: "+maxima_between_twos(i)+"\n");
}
---
function IdentityMatrix(n) {
    this.height = n;
    this.width = n;
    this.mtx = [];
    for (var i = 0; i < n; i++) {
        this.mtx[i] = [];
        for (var j = 0; j < n; j++) {
            this.mtx[i][j] = (i == j ? 1 : 0);
        }
    }
}
IdentityMatrix.prototype = Matrix.prototype;

Matrix.prototype.exp = function(n) {
    var result = new IdentityMatrix(this.height);
    for (var i = 1; i <= n; i++) {
        result = result.mult(this);
    }
    return result;
}

var m = new Matrix([[3, 2], [2, 1]]);
[0,1,2,3,4,10].forEach(function(e){print(m.exp(e)); print()})
---
var myArray = new Array();

var myArray1 = new Array(5);

var myArray2 = new Array("Item1","Item2");

var myArray3 = ["Item1", "Item2"];

myArray3[2] = 5;

var x = myArray[2] + myArray.length;

myArray3.push('Test');

var y = [0,1,,];
---
function rangeExtraction(list) {
  var len = list.length;
  var out = [];
  var i, j;

  for (i = 0; i < len; i = j + 1) {
    out.push(list[i]);

    for (var j = i + 1; j < len && list[j] == list[j-1] + 1; j++);
    j--;

    if (i == j) {
      out.push(",");
    } else if (i + 1 == j) {
      out.push(",", list[j], ",");
    } else {
      out.push("-", list[j], ",");
    }
  }
  out.pop();
  return out.join("");
}

print(rangeExtraction([
  0,  1,  2,  4,  6,  7,  8, 11, 12, 14,
  15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
  25, 27, 28, 29, 30, 31, 32, 33, 35, 36,
  37, 38, 39
]));
---
[
  '819..5.....2...75..371.4.6.4..59.1..7..3.8..2..3.62..7.5.7.921..64...9.....2..438',
  '53..247....2...8..1..7.39.2..8.72.49.2.98..7.79.....8.....3.5.696..1.3...5.69..1.',
  '..3.2.6..9..3.5..1..18.64....81.29..7.......8..67.82....26.95..8..2.3..9..5.1.3..',
  '394..267....3..4..5..69..2..45...9..6.......7..7...58..1..67..8..9..8....264..735',
  '97.3...6..6.75.........8.5.......67.....3.....539..2..7...25.....2.1...8.4...73..',
  '4......6.5...8.9..3....1....2.7....1.9.....4.8....3.5....2....7..6.5...8.1......6',
  '85...24..72......9..4.........1.7..23.5...9...4...........8..7..17..........36.4.',
  '..1..5.7.92.6.......8...6...9..2.4.1.........3.4.8..9...7...3.......7.69.1.8..7..',
  '.9...4..7.....79..8........4.58.....3.......2.....97.6........4..35.....2..6...8.',
  '12.3....435....1....4........54..2..6...7.........8.9...31..5.......9.7.....6...8',
  '9..2..5...4..6..3...3.....6...9..2......5..8...7..4..37.....1...5..2..4...1..6..9',
  '1....7.9..3..2...8..96..5....53..9...1..8...26....4...3......1..4......7..7...3..',
  '12.4..3..3...1..5...6...1..7...9.....4.6.3.....3..2...5...8.7....7.....5.......98',
  '..............3.85..1.2.......5.7.....4...1...9.......5......73..2.1........4...9',
  '.......39.....1..5..3.5.8....8.9...6.7...2...1..4.......9.8..5..2....6..4..7.....',
  '....839..1......3...4....7..42.3....6.......4....7..1..2........8...92.....25...6',
  '..3......4...8..36..8...1...4..6..73...9..........2..5..4.7..686........7..6..5..'
].forEach(reduceGrid);

let n = 2;
let s = new Array(Math.pow(n, 4)).fill('.').join('');
reduceGrid(s);
---
function Matrix(ary) {
    this.mtx = ary
    this.height = ary.length;
    this.width = ary[0].length;
}

Matrix.prototype.toString = function() {
    var s = []
    for (var i = 0; i < this.mtx.length; i++)
        s.push( this.mtx[i].join(",") );
    return s.join("\n");
}

Matrix.prototype.transpose = function() {
    var transposed = [];
    for (var i = 0; i < this.width; i++) {
        transposed[i] = [];
        for (var j = 0; j < this.height; j++) {
            transposed[i][j] = this.mtx[j][i];
        }
    }
    return new Matrix(transposed);
}

var m = new Matrix([[1,1,1,1],[2,4,8,16],[3,9,27,81],[4,16,64,256],[5,25,125,625]]);
print(m);
print();
print(m.transpose());
---
function fileExtensionInExtensionsList(filename) {
	let foundIt = false;
	let filenameLC = filename.toLowerCase();
	let extensions = ["zip", "rar", "7z", "gz", "archive", "A##" ,"tar.bz2"];
	extensions.forEach(extension =>  {
		if (filenameLC.endsWith("." + extension.toLowerCase())) { foundIt = true; }
	} );
	return foundIt;
}


var fileNamesToTest = [
	"MyData.a##"
	,"MyData.tar.Gz"
	,"MyData.gzip"
	,"MyData.7z.backup"
	,"MyData..."
	,"MyData"
	,"MyData_v1.0.tar.bz2"
	,"MyData_v1.0.bz2"
];

fileNamesToTest.forEach(filename => {
	console.log(filename + " -> " + fileExtensionInExtensionsList(filename));
});
---
function median(ary) {
    if (ary.length == 0)
        return null;
    ary.sort(function (a,b){return a - b})
    var mid = Math.floor(ary.length / 2);
    if ((ary.length % 2) == 1)
        return ary[mid];
    else
        return (ary[mid - 1] + ary[mid]) / 2;
}

median([]);
median([5,3,4]);
median([5,4,2,3]);
median([3,4,1,-8.4,7.2,4,1,1.2]);
---
var oFSO = new ActiveXObject("Scripting.FileSystemObject");
function readfile(fname) {
	var h = oFSO.OpenTextFile(fname, 1, false);
	var result = h.ReadAll();
	h.Close();
	return result;
}

if (0 === WScript.Arguments.UnNamed.Count) {
	WScript.Echo(WScript.ScriptName,"filename");
	WScript.Quit();
}

var self = readfile(WScript.ScriptFullName);
var whatever = readfile(WScript.Arguments.UnNamed(0));

WScript.Echo(self === whatever ? "Accept" : "Reject");
---
function quibble(words) {
  return "{" +
    words.slice(0, words.length-1).join(",") +
   (words.length > 1 ? " and " : "") +
   (words[words.length-1] || '') +
  "}";
}

[[], ["ABC"], ["ABC", "DEF"], ["ABC", "DEF", "G", "H"]].forEach(
  function(s) {
    console.log(quibble(s));
  }
);
---
var fifo = [];
fifo.push(42);
fifo.push(43);
var x = fifo.shift();
alert(x);
---
<html>
<head>
</head>
<body>
<script src="sundial.js"></script>
</body>
</html>
---
a = '👩‍❤️‍👩'
Buffer.byteLength(a, 'utf16le');
Buffer.byteLength(a, 'utf8');
Buffer.byteLength(s, 'utf16le');
Buffer.byteLength(s, 'utf8');
---
(function (strXPath) {
  var xr = document.evaluate(
      strXPath,
      document,
      null, 0, 0
    ),

    oNode = xr.iterateNext(),
    lstTasks = [];

  while (oNode) {
    lstTasks.push(oNode.title);
    oNode = xr.iterateNext();
  }

  return [
    lstTasks.length + " items found in " + document.title,
    ''
  ].concat(lstTasks).join('\n')

})(
  '//*[@id="mw-content-text"]/div[2]/table/tbody/tr/td/ul/li/a'
);
---
const base = {
    "name": "Rocket Skates",
    "price": 12.75,
    "color": "yellow"
};

const update = {
    "price": 15.25,
    "color": "red",
    "year": 1974
};


const final = Object.assign(base, update);

console.log(JSON.stringify(final, null, 4));
---
var o = {
  multiply: function(a, b) {
    return a * b;
  }
};
---
function delay (ms) {
    return new Promise((res) => setTimeout(res, ms))
}

void (async () => {
    for (let i = 10; i > 0; --i) {
        console.log(i)
        await delay(1000)
    }
    console.log('Blast off!')
})()
---
function idMatrix(n) {
    return Array.apply(null, new Array(n))
        .map(function (x, i, xs) {
            return xs.map(function (_, k) {
                return i === k ? 1 : 0;
            })
        });
}
---
class PeriodicTable {
  constructor() {
    this.aArray = [1, 2, 5, 13, 57, 72, 89, 104];
    this.bArray = [-1, 15, 25, 35, 72, 21, 58, 7];
  }

  rowAndColumn(n) {
    var i = 7;
    while (this.aArray[i] > n)
      i--;
    var m = n + this.bArray[i];
    return [Math.floor(m / 18) + 1, m % 18 + 1];
  }
}

pt = new PeriodicTable();
for (var n of [1, 2, 29, 42, 57, 58, 72, 89, 90, 103]) {
  [r, c] = pt.rowAndColumn(n);
  console.log(n.toString().padStart(3, ' ') + " ->" +
              r.toString().padStart(2, ' ') + c.toString().padStart(3, ' '));
}
---
const fs = require('fs');

function fct(err) {
  if (err) console.log(err);
}

fs.writeFile("output.txt", "", fct);
fs.writeFile("/output.txt", "", fct);

fs.mkdir("docs", fct);
fs.mkdir("/docs", fct);
---
var onmessage = function(event) {
    postMessage({"n" : event.data.n,
                 "factors" : factor(event.data.n),
                 "id" : event.data.id});
};

function factor(n) {
    var factors = [];
    for(p = 2; p <= n; p++) {
        if((n % p) == 0) {
            factors[factors.length] = p;
            n /= p;
        }
    }
    return factors;
}
---
function Car(brand, weight) {
  this.brand = brand;
  this.weight = weight || 1000;
}
Car.prototype.getPrice = function() {
  return this.price;
}

function Truck(brand, size) {
  this.car = Car;
  this.car(brand, 2000);
  this.size = size;
}
Truck.prototype = Car.prototype;

var cars = [
  new Car("Mazda"),
  new Truck("Volvo", 2)
];
for (var i=0; i<cars.length; i++) {
  alert(cars[i].brand + " " + cars[i].weight + " " + cars[i].size + ", " +
      (cars[i] instanceof Car) + " " + (cars[i] instanceof Truck));
}
---
(function () {
    'use strict';

    function a(bool) {
        console.log('a -->', bool);

        return bool;
    }

    function b(bool) {
        console.log('b -->', bool);

        return bool;
    }


    var x = a(false) && b(true),
        y = a(true) || b(false),
        z = true ? a(true) : b(false);

  return [x, y, z];
})();
---
var make_adder = function(m) {
    return function(n) { return m + n }
};
var add42 = make_adder(42);
add42(10)
---
var hofstadterQ = function() {
   var memo = [1,1,1];
   var Q    = function (n) {
      var result = memo[n];
      if (typeof result !== 'number') {
         result  = Q(n - Q(n-1)) + Q(n - Q(n-2));
         memo[n] = result;
      }
      return result;
   };
   return Q;
}();

for (var i = 1; i <=10; i += 1) {
   console.log('Q('+ i +') = ' + hofstadterQ(i));
}

console.log('Q(1000) = ' + hofstadterQ(1000));
---
function pow(base, exp) {
    if (exp != Math.floor(exp))
        throw "exponent must be an integer";
    if (exp < 0)
        return 1 / pow(base, -exp);
    var ans = 1;
    while (exp > 0) {
        ans *= base;
        exp--;
    }
    return ans;
}
---
s == ""
s.length == 0
!s
!Boolean(s)
---
function bitwise(a, b){
   alert("a AND b: " + (a & b));
   alert("a OR b: "+ (a | b));
   alert("a XOR b: "+ (a ^ b));
   alert("NOT a: " + ~a);
   alert("a << b: " + (a << b));
   alert("a >> b: " + (a >> b));
   alert("a >>> b: " + (a >>> b));
}
---
let testHands = [
	"2♥ 2♦ 2♣ k♣ q♦",
	"2♥ 5♥ 7♦ 8♣ 9♠",
	"a♥ 2♦ 3♣ 4♣ 5♦",
	"2♥ 3♥ 2♦ 3♣ 3♦",
	"2♥ 7♥ 2♦ 3♣ 3♦",
	"2♥ 7♥ 7♦ 7♣ 7♠",
	"10♥ j♥ q♥ k♥ a♥",
	"4♥ 4♠ k♠ 5♦ 10♠",
	"q♣ 10♣ 7♣ 6♣ 4♣",
	"joker 4♣ k♣ 5♦ 10♠",
	"joker 2♦ 2♠ k♠ q♦",
	"joker 3♥ 2♦ 3♠ 3♦",
	"joker 7♥ 7♦ 7♠ 7♣",
	"joker 2♦ joker 4♠ 5♠",
	"joker 2♠ joker a♠ 10♠",
	"joker q♦ joker a♦ 10♦"
];
	
for(hand of testHands) console.log(hand + ": " + analyzeHand(hand));
---
var funcs = [];
for (var i = 0; i < 10; i++) {
    funcs.push( (function(i) {
                     return function() { return i * i; }
                })(i) );
}
window.alert(funcs[3]());
---
(function (cFrom, cTo) {

  function cRange(cFrom, cTo) {
    var iStart = cFrom.charCodeAt(0);

    return Array.apply(
      null, Array(cTo.charCodeAt(0) - iStart + 1)
    ).map(function (_, i) {

      return String.fromCharCode(iStart + i);

    });
  }

  return cRange(cFrom, cTo);

})('a', 'z');
---
var eth = {

    halve : function ( n ){  return Math.floor(n/2);  },
    double: function ( n ){  return 2*n;              },
    isEven: function ( n ){  return n%2 === 0);       },

    mult: function ( a , b ){
        var sum = 0, a = [a], b = [b];

        while ( a[0] !== 1 ){
            a.unshift( eth.halve( a[0] ) );
            b.unshift( eth.double( b[0] ) );
        }

        for( var i = a.length - 1; i > 0 ; i -= 1 ){

            if( !eth.isEven( a[i] ) ){
                sum += b[i];
            }
        }
        return sum + b[0];
    }
}
---
function root_mean_square(ary) {
    var sum_of_squares = ary.reduce(function(s,x) {return (s + x*x)}, 0);
    return Math.sqrt(sum_of_squares / ary.length);
}

print( root_mean_square([1,2,3,4,5,6,7,8,9,10]) );
---
var path = require('path');
var fs = require('fs');

function mkdirp (p, cb) {
    cb = cb || function () {};
    p = path.resolve(p);

    fs.mkdir(p, function (er) {
        if (!er) {
            return cb(null);
        }
        switch (er.code) {
            case 'ENOENT':
                mkdirp(path.dirname(p), function (er) {
                    if (er) cb(er);
                    else mkdirp(p, cb);
                });
                break;

            default:
                cb(er);
                break;
        }
    });
}
---
const e = '3 4 2 * 1 5 - 2 3 ^ ^ / +';
const s = [], tokens = e.split(' ');
for (const t of tokens) {
  const n = Number(t);
  if (!isNaN(n)) {
    s.push(n);
  } else {
    if (s.length < 2) {
      throw new Error(`${t}: ${s}: insufficient operands.`);
    }
    const o2 = s.pop(), o1 = s.pop();
    switch (t) {
      case '+': s.push(o1 + o2); break;
      case '-': s.push(o1 - o2); break;
      case '*': s.push(o1 * o2); break;
      case '/': s.push(o1 / o2); break;
      case '^': s.push(Math.pow(o1, o2)); break;
      default: throw new Error(`Unrecognized operator: [${t}]`);
    }
  }
  console.log(`${t}: ${s}`);
}

if (s.length > 1) {
  throw new Error(`${s}: insufficient operators.`);
}
---
var base = [[[-200, 0], [200, 0]],];
document.documentElement.innerHTML = [...Array(12)].reduce((svg_a, _, lvl) => {
    const rg = step => (80 + (lvl - 2) * step) & 255;
    return svg_a + base.splice(0).reduce((g_a, [a, b]) => {
        const w = (k0, k1) => (k0 * (b[0] - a[0]) + k1 * (b[1] - a[1])) / 2;
        const [c, e, d] = [2, 3, 2].map((j, i) => [a[0] + w(i, j), a[1] + w(-j, i)]);
        base.push([c, e], [e, d]);
        return g_a + `<polygon points="${[a, c, e, d, c, d, b]}"/>`;
    }, `<g fill="rgb(${rg(20)},${rg(30)},24)">`) + '</g>';
}, '<svg viewBox="-1200 -1600 2400 1600" stroke="white">') + '</svg>', "";