12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- /* eslint-disable semi */
- function solve24point(...numbers) {
- class Operation {
- constructor(val, rank, exp) {
- this.val = val;
- this.rank = rank;
- this.exp = exp;
- }
- plus(that) {
- return new Operation(this.val + that.val, 0, `${this.exp}+${that.exp}`);
- }
- minus(that) {
- let exp;
- if (that.rank === 0) exp = `${this.exp}-(${that.exp})`;
- else exp = `${this.exp}-${that.exp}`;
- return new Operation(this.val - that.val, 0, exp);
- }
- mult(that) {
- let exp;
- if (this.rank === 0 && that.rank === 0) exp = `(${this.exp})*(${that.exp})`;
- else if (this.rank === 0) exp = `(${this.exp})*${that.exp}`;
- else if (that.rank === 0) exp = `${this.exp}*(${that.exp})`;
- else exp = `${this.exp}*${that.exp}`;
- return new Operation(this.val * that.val, 1, exp);
- }
- div(that) {
- let exp;
- if (this.rank === 0 && that.rank !== 2) exp = `(${this.exp})/(${that.exp})`;
- else if (this.rank === 0) exp = `(${this.exp})/${that.exp}`;
- else if (that.rank !== 2) exp = `${this.exp}/(${that.exp})`;
- else exp = `${this.exp}/${that.exp}`;
- return new Operation(this.val / that.val, 1, exp);
- }
- }
- const eps = 0.000001;
- function dfs(nums) {
- if (nums.length === 1 && Math.abs(nums[0].val - 24.0) < eps) return nums[0].exp;
- for (let i = 0; i < nums.length - 1; i++) {
- for (let j = i + 1; j < nums.length; j++) {
- let next = new Array(nums.length - 2);
- for (let k = 0, idx = 0; k < nums.length; k++) {
- if (k == i || k == j) continue;
- next[idx++] = nums[k];
- }
- let p = nums[i], q = nums[j];
- let tmp = [p.plus(q), p.minus(q), q.minus(p), p.mult(q)];
- if (q.val > 0) tmp.push(p.div(q));
- if (p.val > 0) tmp.push(q.div(p));
- for (let i = 0; i < tmp.length; i++) {
- next.push(tmp[i]);
- const res = dfs(next);
- if (res !== null) return res;
- next.pop();
- }
- }
- }
- return null;
- }
- const nums = new Array(numbers.length);
- for (let i = 0; i < numbers.length; i++) {
- nums[i] = new Operation(numbers[i], 2, numbers[i]);
- }
- return dfs(nums);
- }
- // eslint-disable-next-line no-console
- const log = console.log.bind(console);
- log(solve24point(2, 4, 1, 8));
- log(solve24point(2, 4, 6, 8));
- log(solve24point(1, 2, 5, 8));
- log(solve24point(1, 7, 8, 8));
- log(solve24point(6, 6, 6, 6, 6));
- log(solve24point(1, 5, 5, 5));
- log(solve24point(2, 5, 5, 10));
- log(solve24point(1, 4, 5, 6));
- log(solve24point(6, 9, 9, 10));
|