Created
August 15, 2012 22:22
-
-
Save tstone/3364269 to your computer and use it in GitHub Desktop.
Divide by 3 (javascript)
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
<!DOCTYPE> | |
<html> | |
<body> | |
<script type="text/javascript"> | |
var base10 = { | |
increment: function(v) { | |
var incrementBit = function(bits) { | |
var b = bits[0]; | |
if (b == '0') { | |
bits.splice(0, 1, '1'); | |
} else if (b == '1') { | |
bits.splice(0, 1, '2'); | |
} else if (b == '2') { | |
bits.splice(0, 1, '3'); | |
} else if (b == '3') { | |
bits.splice(0, 1, '4'); | |
} else if (b == '4') { | |
bits.splice(0, 1, '5'); | |
} else if (b == '5') { | |
bits.splice(0, 1, '6'); | |
} else if (b == '6') { | |
bits.splice(0, 1, '7'); | |
} else if (b == '7') { | |
bits.splice(0, 1, '8'); | |
} else if (b == '8') { | |
bits.splice(0, 1, '9'); | |
} else if (b == '9') { | |
var shortBits = bits.slice(1); | |
if (shortBits.length != 0) { | |
bits = [bits[0]].concat(incrementBit(shortBits)); | |
} else { | |
bits = [0, 1]; | |
} | |
} | |
return bits; | |
} | |
var bits = v.toString().split('').reverse(); | |
bits = incrementBit(bits); | |
return parseInt(bits.reverse().join(''), 10); | |
} | |
}; | |
var base3 = { | |
convertTo: function(d) { | |
var v = '0'; | |
for (var x = 0; x < d; x = base10.increment(x)) { | |
v = base3.increment(v); | |
} | |
return v; | |
}, | |
convertFrom: function(v) { | |
var x = 0; | |
while (v != '0') { | |
v = base3.decrement(v); | |
x = base10.increment(x); | |
} | |
return x; | |
}, | |
decrement: function(v) { | |
var decrementBit = function(bits) { | |
if (bits[0] == '0') { | |
var shortBits = bits.slice(1); | |
if (shortBits.length != 0) { | |
bits = [2].concat(decrementBit(shortBits)); | |
} else { | |
bits = [2]; | |
} | |
} else if (bits[0] == '1') { | |
bits.splice(0, 1, '0'); | |
} else if (bits[0] == '2') { | |
bits.splice(0, 1, '1'); | |
} | |
return bits; | |
}; | |
// Trim leading 0's | |
v = v.replace(/^[0]*/g, ''); | |
var bits = v.split('').reverse(); | |
bits = decrementBit(bits); | |
return bits.reverse().join(''); | |
}, | |
increment: function(v) { | |
var incrementBit = function(bits) { | |
if (bits[0] == '0') { | |
bits.splice(0, 1, '1'); | |
} else if (bits[0] == '1') { | |
bits.splice(0, 1, '2'); | |
} else if (bits[0] == '2') { | |
var shortBits = bits.slice(1); | |
if (shortBits.length != 0) { | |
bits = [0].concat(incrementBit(shortBits)); | |
} else { | |
bits = [0, 1]; | |
} | |
} | |
return bits; | |
}; | |
var bits = v.split('').reverse(); | |
bits = incrementBit(bits); | |
return bits.reverse().join(''); | |
}, | |
bitShift: function(v) { | |
var bits = v.split(''); | |
var left = bits[bits.length - 1]; | |
bits.pop(); | |
return [left].concat(bits).join(''); | |
} | |
}; | |
function divideByThree(x) { | |
var b3 = base3.convertTo(x); | |
b3 = base3.bitShift(b3); | |
return base3.convertFrom(b3); | |
} | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment