From bece4ffc8d756180f2dd9a223d4b9bda0bd0c416 Mon Sep 17 00:00:00 2001 From: BorysLevytskyi Date: Tue, 22 Nov 2016 19:48:10 +0200 Subject: [PATCH 1/3] Pad with zeroes --- package.json | 1 + src/app/calc.js | 26 +++++++++++++++++++ .../results/ListOfNumbersExpressionView.jsx | 7 ++--- src/app/expression.js | 8 ++++++ src/app/formatter.js | 26 +++++++++++++++++++ 5 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 src/app/calc.js create mode 100644 src/app/formatter.js diff --git a/package.json b/package.json index cb9aed4..8c739c0 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "babel-preset-es2015": "^6.18.0", "babel-preset-react": "^6.16.0", "body-parser": "^1.15.2", + "lodash": "^4.17.2", "react": "^15.4.0", "react-dom": "^15.4.0" } diff --git a/src/app/calc.js b/src/app/calc.js new file mode 100644 index 0000000..5b0911e --- /dev/null +++ b/src/app/calc.js @@ -0,0 +1,26 @@ +import should from './should'; + +export default calc = { + numberOfBits: function (num) { + if(num < 0) { + return 32; + } + should.bePositiveInteger(num); + return Math.floor(Math.log(num) / Math.log(2)) + 1; + }, + + maxNumberOfBits: function (arr) { + + var counts = [], num; + for (var i = 0; i < arr.length; i++) { + num = arr[i]; + counts.push(this.numberOfBits(num)); + } + + return Math.max.apply(null, counts); + }, + + calcExpression: function (expr) { + return eval(expr.expressionString); + } + }; \ No newline at end of file diff --git a/src/app/components/results/ListOfNumbersExpressionView.jsx b/src/app/components/results/ListOfNumbersExpressionView.jsx index c98bdea..0e9fdb6 100644 --- a/src/app/components/results/ListOfNumbersExpressionView.jsx +++ b/src/app/components/results/ListOfNumbersExpressionView.jsx @@ -1,9 +1,10 @@ import React from 'react'; +import formatter from '../../formatter'; export default class ListOfNumersExpressionView extends React.Component { render() { const expr = this.props.expression; - const numberViews = expr.numbers.map((n, i) => ) + const numberViews = expr.numbers.map((n, i) => ) return {numberViews}
@@ -13,12 +14,12 @@ export default class ListOfNumersExpressionView extends React.Component { class OperandView extends React.Component { render() { const op = this.props.operand; - console.log(op); + console.log(this.props); // const bitsSize = this.propsю; // .padLeft(m.bitsSize, '0') return {op.input} - {op.bin} + {formatter.padLeft(op.bin, this.props.maxBitsLegnth, '0')} {op.other} }; diff --git a/src/app/expression.js b/src/app/expression.js index fae9385..52b5d4a 100644 --- a/src/app/expression.js +++ b/src/app/expression.js @@ -1,3 +1,5 @@ +import * as _ from 'lodash'; + var expression = { factories:[], canParse: function(string) { @@ -119,6 +121,7 @@ export class Operand { this.bin = this.value < 0 ? (this.value >>> 0).toString(2) : this.value.toString(2); this.kind = this.input.indexOf('0x') > -1 ? 'hex' : 'dec'; this.other = this.kind == 'dec' ? this.hex : this.dec; + this.lengthInBits = Operand.getBitLength(this.value); } getLengthInBits() { @@ -154,6 +157,10 @@ export class Operand { return this.input; } + static getBitLength(num) { + return Math.floor(Math.log(num) / Math.log(2)) + 1 + } + static getBase(kind){ switch (kind){ case 'bin': return 2; @@ -223,6 +230,7 @@ export class ListOfNumbersExpression { constructor(expressionString, numbers) { this.expressionString = expressionString; this.numbers = numbers; + this.maxBitsLegnth = _.chain(numbers).map(n => n.lengthInBits).reduce((n , c) => n >= c ? n : c, 0).value(); } } diff --git a/src/app/formatter.js b/src/app/formatter.js new file mode 100644 index 0000000..42dd5ee --- /dev/null +++ b/src/app/formatter.js @@ -0,0 +1,26 @@ +export default { + formatString: function(num, kind) { + return num.toString(getBase(kind || "bin")); + }, + padLeft: function (str, length, symbol) { + var sb = Array.prototype.slice.call(str), symbol = symbol || "0"; + + if(length == null) { + return str; + } + + while(length > sb.length) { + sb.unshift(symbol); + } + + return sb.join(''); + } + }; + + function getBase(kind) { + switch (kind){ + case 'bin': return 2; + case 'hex': return 16; + case 'dec': return 10; + } + } \ No newline at end of file From 90b26032c7c7dbb69605d3f2b13c345e2c429184 Mon Sep 17 00:00:00 2001 From: BorysLevytskyi Date: Tue, 22 Nov 2016 20:09:41 +0200 Subject: [PATCH 2/3] Support for flipable bits --- .../results/ListOfNumbersExpressionView.jsx | 40 ++++++++++++++++--- src/app/expression.js | 38 +++++++++++------- 2 files changed, 58 insertions(+), 20 deletions(-) diff --git a/src/app/components/results/ListOfNumbersExpressionView.jsx b/src/app/components/results/ListOfNumbersExpressionView.jsx index 0e9fdb6..f2932c0 100644 --- a/src/app/components/results/ListOfNumbersExpressionView.jsx +++ b/src/app/components/results/ListOfNumbersExpressionView.jsx @@ -12,15 +12,43 @@ export default class ListOfNumersExpressionView extends React.Component { } class OperandView extends React.Component { + componentWillMount() { + this.setState(this.props.operand); + } render() { - const op = this.props.operand; - console.log(this.props); - // const bitsSize = this.propsю; - // .padLeft(m.bitsSize, '0') - return + const op = this.state; + const binaryString = formatter.padLeft(op.bin, this.props.maxBitsLegnth, '0'); + + return {op.input} - {formatter.padLeft(op.bin, this.props.maxBitsLegnth, '0')} + this.flipBit(i)} /> {op.other} }; + + flipBit(index) { + var op = this.props.operand; + const binaryString = formatter.padLeft(op.bin, this.props.maxBitsLegnth, '0'); + var arr = binaryString.split(''); + arr[index] = arr[index] == '0' ? '1' : '0'; + op.update(arr.join()); + this.setState(op); + } +} + +class ClickableBinary extends React.Component { + render() { + const str = this.props.binaryString; + const chars = str.split(''); + const classNames = { '0': 'zero flipable', '1' : 'one flipable' }; + const children = chars.map((c, i) => this.onBitClick(i, e)}>{c}); + + return {children} + } + + onBitClick(index, e) { + if(this.props.onFlipBit) { + this.props.onFlipBit(index); + } + } } \ No newline at end of file diff --git a/src/app/expression.js b/src/app/expression.js index 52b5d4a..64843f3 100644 --- a/src/app/expression.js +++ b/src/app/expression.js @@ -131,19 +131,7 @@ export class Operand { return Math.floor(Math.log(this.value) / Math.log(2)) + 1; }; - toKindString(value, kind) { - switch(kind) { - case 'hex': - var hexVal = Math.abs(value).toString(16); - return value >= 0 ? '0x' + hexVal : '-0x' + hexVal; - case 'bin': - return (value>>>0).toString(2); - case 'dec': - return value.toString(10); - default: - throw new Error("Unexpected kind: " + kind) - } - }; + getOtherKind(kind) { switch(kind) { @@ -156,7 +144,15 @@ export class Operand { toString() { return this.input; } - + + update(binary) { + this.value = parseInt(2); + this.bin = binary; + this.dec = Operand.toKindString(this.value, 'dec'); + this.hex = Operand.toKindString(this.value, 'hex'); + + } + static getBitLength(num) { return Math.floor(Math.log(num) / Math.log(2)) + 1 } @@ -178,6 +174,20 @@ export class Operand { return new Operand(str); }; + static toKindString(value, kind) { + switch(kind) { + case 'hex': + var hexVal = Math.abs(value).toString(16); + return value >= 0 ? '0x' + hexVal : '-0x' + hexVal; + case 'bin': + return (value>>>0).toString(2); + case 'dec': + return value.toString(10); + default: + throw new Error("Unexpected kind: " + kind) + } + }; + static toHexString (hex) { return hex.indexOf('-') == 0 ? '-0x' + hex.substr(1) : '0x' + hex; }; From ca9590fc126ded45fe9e853a0ce8e880d253046a Mon Sep 17 00:00:00 2001 From: BorysLevytskyi Date: Thu, 24 Nov 2016 18:43:37 +0200 Subject: [PATCH 3/3] Improvement of list of numbers expression --- src/app/components/results/ListOfNumbersExpressionView.jsx | 2 +- src/app/expression.js | 1 - src/app/index.jsx | 5 +++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/components/results/ListOfNumbersExpressionView.jsx b/src/app/components/results/ListOfNumbersExpressionView.jsx index f2932c0..f687777 100644 --- a/src/app/components/results/ListOfNumbersExpressionView.jsx +++ b/src/app/components/results/ListOfNumbersExpressionView.jsx @@ -31,7 +31,7 @@ class OperandView extends React.Component { const binaryString = formatter.padLeft(op.bin, this.props.maxBitsLegnth, '0'); var arr = binaryString.split(''); arr[index] = arr[index] == '0' ? '1' : '0'; - op.update(arr.join()); + op.update(arr.join('')); this.setState(op); } } diff --git a/src/app/expression.js b/src/app/expression.js index 64843f3..d20d9c1 100644 --- a/src/app/expression.js +++ b/src/app/expression.js @@ -150,7 +150,6 @@ export class Operand { this.bin = binary; this.dec = Operand.toKindString(this.value, 'dec'); this.hex = Operand.toKindString(this.value, 'hex'); - } static getBitLength(num) { diff --git a/src/app/index.jsx b/src/app/index.jsx index 852b7e0..b020058 100644 --- a/src/app/index.jsx +++ b/src/app/index.jsx @@ -8,8 +8,9 @@ import AppRoot from './components/AppRoot'; commands.initialize(cmd); -cmd.execute('help'); -cmd.execute('1 2 3'); +cmd.execute('1'); +cmd.execute('2'); +cmd.execute('3'); var root = ; ReactDOM.render(root, document.getElementById('root')); \ No newline at end of file