Last active
August 29, 2015 14:08
-
-
Save anton0xf/d926d2ca3db316e91a23 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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