summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJules Laplace <jules@okfoc.us>2017-03-08 16:28:00 +0100
committerJules Laplace <jules@okfoc.us>2017-03-08 16:28:00 +0100
commit15ddd0beabb2342d9d68ff4625139ab7fb456ace (patch)
tree99d351a78e1b5ad9ec5c759da6b0cbcdb93e0cdc
parent26f3fd1352a7fb73b7e8317a45f2a38975467429 (diff)
readme and demo page
-rw-r--r--README.md5
-rw-r--r--index.html91
-rw-r--r--index.js15
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>
+
diff --git a/index.js b/index.js
index 71d93d9..423295b 100644
--- a/index.js
+++ b/index.js
@@ -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
}