Skip to content

Instantly share code, notes, and snippets.

@anton0xf
Last active August 29, 2015 14:08
Show Gist options
  • Save anton0xf/d926d2ca3db316e91a23 to your computer and use it in GitHub Desktop.
Save anton0xf/d926d2ca3db316e91a23 to your computer and use it in GitHub Desktop.
var _ = require('underscore'); // http://underscorejs.org
function get_m(x) {
return x.length;
}
function check(x) {
if(!x.length)
return false;
for(var i=0; i<x.length; i++) {
if(x[i] !== 0 && x[i] !== 1)
return false;
}
return true;
}
function sum(arr) {
return _.reduce(arr, function(memo, num){ return memo + num; }, 0);
}
function get_n(x) {
return sum(x);
}
function max_distance(x) {
if(!check(x))
throw "Bad input"
var m = get_m(x), n = get_n(x);
if(n === 0)
return m;
var max = 0, cur = 0;
var start = _.indexOf(x, 1);
for(var i=1; i <= m; i++) {
cur++;
var idx = (start + i) % m;
if(x[idx] === 1) {
max = Math.max(max, cur);
cur = 0;
}
}
return max;
}
function min_max_distance(m, n) {
if(m < n) {
throw "n(" + n + ") have to be equal or less then m(" + m + ")";
} else if(m < 0) {
throw "m(" + m + ") should not be negative";
} else if(n < 0) {
throw "n(" + n + ") should not be negative";
} else {
return Math.ceil(m/n);
}
}
function print_res(res) {
console.log("m: " + get_m(res)
+ ", n: " + get_n(res)
+ ", D: " + max_distance(res)
+ ", res: " + res);
}
function test(m, n, f) {
var res = f(m, n);
var expected_distance = min_max_distance(m,n);
var actual_distance = max_distance(res);
if(m !== get_m(res)
|| n !== get_n(res)
|| expected_distance !== actual_distance) {
console.log(">> expected m: " + m + ", n: " + n
+ ", D: " + expected_distance + ", but was:");
print_res(res);
return false;
}
return true;
}
function test_all(max_m, f) {
var ok = 0;
var fail = 0;
for(var m=1; m <= max_m; m++) {
for(var n=1; n <= m; n++) {
var res = test(m, n, f);
if(res) {
ok++;
} else {
fail++;
}
}
}
console.log("Tests Ok: " + ok + ", Failed: " + fail);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment