diff options
| -rw-r--r-- | README.md | 5 | ||||
| -rw-r--r-- | index.html | 91 | ||||
| -rw-r--r-- | index.js | 15 |
3 files changed, 109 insertions, 2 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..7010213 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +basic +===== + +This library implements numeric base conversions (à la `Number.toString(b)`). It allows for negative bases, such as negabinary and negaternary. It expresses the fact that negativity is basic. Really basic. + diff --git a/index.html b/index.html new file mode 100644 index 0000000..7371a95 --- /dev/null +++ b/index.html @@ -0,0 +1,91 @@ +<style> +body.loading { opacity: 0 } +body { font-size: 20px; transition: opacity 0.1s; } +label { min-width: 50px; display: inline-block; text-align: right; } +input { text-align: right; } +#numbers, #buttons { float: left; margin: 20px; } +#buttons { margin: 20px; } +button { font-size: 200%; } +</style> + +<body class="loading"> + + <div id="numbers"> + <script type="text/html" id="number-template"> + <div> + <label for="base-{{base}}">{{base}}</label> + <input id="base-{{base}}" type="text"> + </div> + </script> + </div> + + <div id="buttons"> + <button id="add">+</button> + <button id="sub">-</button> + <button id="inv">(-)</button> + </div> +</body> +<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> +<script src="./index.js"></script> +<script> +var MAX_BASE = 16 +var $inputs = {} +var template = $("#number-template").html() +function init () { + iter(build) + bind() + rebuild(0) + $("body").removeClass("loading") +} +function bind () { + $("#add").click(add) + $("#sub").click(sub) + $("#inv").click(inv) +} +function build (base) { + var $div, $input + $div = $(template.replace(/{{base}}/g, base)) + $input = $div.find("input") + $input.on("input", function(){ + var n = basic.toNumber( $input.val(), base ) + if (isNaN(n)) { + return + } + rebuild(n, base) + }) + $inputs[base] = $input + $("#numbers").prepend($div) +} +function rebuild (n, base) { + iter(function(i){ + if (i == base) return + var $i = $inputs[i] + var v = basic.toString(n, i) + $i.val(v) + }) +} +function iter (f) { + for (var i = -MAX_BASE; i <= MAX_BASE; i++) { + if (basic.validate_base(i)) { + f(i) + } + } +} +function current () { + var n = basic.toNumber( $inputs[2].val(), 2 ) + if (isNaN(n)) n = 2 + return n +} +function add () { + rebuild( current() + 1 ) +} +function sub () { + rebuild( current() - 1 ) +} +function inv () { + rebuild( current() * -1 ) +} + +init() +</script> + @@ -1,5 +1,9 @@ -module.exports = basic = {} +var basic = {} + +if (! ('window' in this)) { + module.exports = basic +} // Handle bases up to base 36 basic.abedecary = "0123456789abcdefghijklmnopqrstuvwxyz" @@ -38,10 +42,17 @@ basic.toNumber = function (s, b) { if (! basic.validate(s, b)) { return NaN } - var n = 0 + var n = 0, is_negative = false + if (s.indexOf("-") == 0) { + is_negative = true + s = s.substr(1) + } for (var i = 0, len = s.length; i < len; i++) { n += basic.abedecary.indexOf(s[len-1-i]) * Math.pow(b, i) } + if (is_negative) { + n *= -1 + } return n } |
