@@ -1,393 +1,387 @@
1−/*
1+/** @constructor */
2− BigInteger Javascript code taken from:
2+__IDR__.Type = function(type) {
3− https://github.com/peterolson
3+ this.type = type;
6−var __IDR__;
6+__IDR__.Int = new __IDR__.Type('Int');
7−(function(__IDR__) {
7+__IDR__.Char = new __IDR__.Type('Char');
8− /** @constructor */
8+__IDR__.String = new __IDR__.Type('String');
9− __IDR__.Type = function(type) {
9+__IDR__.Integer = new __IDR__.Type('Integer');
10− this.type = type;
10+__IDR__.Float = new __IDR__.Type('Float');
11− };
11+__IDR__.Forgot = new __IDR__.Type('Forgot');
13− __IDR__.Int = new __IDR__.Type('Int');
13+/** @constructor */
14− __IDR__.Char = new __IDR__.Type('Char');
14+__IDR__.Tailcall = function(f) { this.f = f };
15− __IDR__.String = new __IDR__.Type('String');
16− __IDR__.Integer = new __IDR__.Type('Integer');
17− __IDR__.Float = new __IDR__.Type('Float');
18− __IDR__.Forgot = new __IDR__.Type('Forgot');
17+__IDR__.Con = function(i,vars) {
22− __IDR__.Tailcall = function(f) { this.f = f };
22+__IDR__.tailcall = function(f) {
24− /** @constructor */
30+ if (ret instanceof __IDR__.Tailcall) {
25− __IDR__.Con = function(i,vars) {
31+ __f = ret.f;
26− this.i = i;
32+ } else {
27− this.vars = vars;
33+ return ret;
30− __IDR__.tailcall = function(f) {
38+__IDR__.print = function(s){
31− var __f = f;
39+ var m = s.match(/(.*)\n$/);
32− var ret;
40+ console.log(m ? m[1] : s);
38− if (ret instanceof __IDR__.Tailcall) {
43+/*
39− __f = ret.f;
44+ BigInteger Javascript code taken from:
40− } else {
45+ https://github.com/peterolson
42− }
47+__IDR__.bigInt = (function () {
43− }
48+ var base = 10000000, logBase = 7;
46− __IDR__.print = function(s){
54+ var normalize = function (first, second) {
47− var m = s.match(/(.*)\n$/);
55+ var a = first.value, b = second.value;
48− console.log(m ? m[1] : s);
56+ var length = a.length > b.length ? a.length : b.length;
57+ for (var i = 0; i < length; i++) {
61+ for (var i = length - 1; i >= 0; i--) {
62+ if (a[i] === 0 && b[i] === 0) {
67+ if (!a.length) a = [0], b = [0];
51− __IDR__.bigInt = (function () {
72+ var parse = function (text, first) {
52− var base = 10000000, logBase = 7;
73+ if (typeof text === "object") return text;
53− var sign = {
74+ text += "";
54− positive: false,
75+ var s = sign.positive, value = [];
55− negative: true
76+ if (text[0] === "-") {
56− };
77+ s = sign.negative;
57−
78+ text = text.slice(1);
58− var normalize = function (first, second) {
79+ }
59− var a = first.value, b = second.value;
80+ var text = text.split("e");
60− var length = a.length > b.length ? a.length : b.length;
81+ if (text.length > 2) throw new Error("Invalid integer");
61− for (var i = 0; i < length; i++) {
82+ if (text[1]) {
62− a[i] = a[i] || 0;
83+ var exp = text[1];
63− b[i] = b[i] || 0;
84+ if (exp[0] === "+") exp = exp.slice(1);
64− }
85+ exp = parse(exp);
65− for (var i = length - 1; i >= 0; i--) {
86+ if (exp.lesser(0)) throw new Error("Cannot include negative exponent part for integers");
66− if (a[i] === 0 && b[i] === 0) {
87+ while (exp.notEquals(0)) {
67− a.pop();
88+ text[0] += "0";
68− b.pop();
89+ exp = exp.prev();
93+ if (text === "-0") text = "0";
94+ var isValid = /^([0-9][0-9]*)$/.test(text);
95+ if (!isValid) throw new Error("Invalid integer");
71− if (!a.length) a = [0], b = [0];
96+ while (text.length) {
72− first.value = a;
97+ var divider = text.length > logBase ? text.length - logBase : 0;
73− second.value = b;
98+ value.push(+text.slice(divider));
99+ text = text.slice(0, divider);
101+ var val = bigInt(value, s);
102+ if (first) normalize(first, val);
76− var parse = function (text, first) {
106+ var goesInto = function (a, b) {
77− if (typeof text === "object") return text;
79− var s = sign.positive, value = [];
107+ var a = bigInt(a, sign.positive), b = bigInt(b, sign.positive);
80− if (text[0] === "-") {
108+ if (a.equals(0)) throw new Error("Cannot divide by 0");
81− s = sign.negative;
109+ var n = 0;
82− text = text.slice(1);
110+ do {
112+ var c = bigInt(a.value, sign.positive), t = c.times(10);
113+ while (t.lesser(b)) {
84− var text = text.split("e");
118+ while (c.lesserOrEquals(b)) {
85− if (text.length > 2) throw new Error("Invalid integer");
119+ b = b.minus(c);
86− if (text[1]) {
120+ n += inc;
88− if (exp[0] === "+") exp = exp.slice(1);
90− if (exp.lesser(0)) throw new Error("Cannot include negative exponent part for integers");
91− while (exp.notEquals(0)) {
97− if (text === "-0") text = "0";
98− var isValid = /^([0-9][0-9]*)$/.test(text);
99− if (!isValid) throw new Error("Invalid integer");
100− while (text.length) {
101− var divider = text.length > logBase ? text.length - logBase : 0;
102− value.push(+text.slice(divider));
103− text = text.slice(0, divider);
105− var val = bigInt(value, s);
122+ } while (a.lesserOrEquals(b));
106− if (first) normalize(first, val);
123+
107− return val;
124+ return {
110− var goesInto = function (a, b) {
130+ var bigInt = function (value, s) {
111− var a = bigInt(a, sign.positive), b = bigInt(b, sign.positive);
131+ var self = {
112− if (a.equals(0)) throw new Error("Cannot divide by 0");
132+ value: value,
113− var n = 0;
133+ sign: s
115− var inc = 1;
135+ var o = {
116− var c = bigInt(a.value, sign.positive), t = c.times(10);
136+ value: value,
117− while (t.lesser(b)) {
137+ sign: s,
118− c = t;
138+ negate: function (m) {
119− inc *= 10;
139+ var first = m || self;
120− t = t.times(10);
140+ return bigInt(first.value, !first.sign);
143+ var first = m || self;
144+ return bigInt(first.value, sign.positive);
146+ add: function (n, m) {
147+ var s, first = self, second;
148+ if (m) (first = parse(n)) && (second = parse(m));
149+ else second = parse(n, first);
151+ if (first.sign !== second.sign) {
152+ first = bigInt(first.value, sign.positive);
153+ second = bigInt(second.value, sign.positive);
154+ return s === sign.positive ?
155+ o.subtract(first, second) :
156+ o.subtract(second, first);
122− while (c.lesserOrEquals(b)) {
158+ normalize(first, second);
123− b = b.minus(c);
159+ var a = first.value, b = second.value;
124− n += inc;
160+ var result = [],
162+ for (var i = 0; i < a.length || carry > 0; i++) {
163+ var sum = (a[i] || 0) + (b[i] || 0) + carry;
164+ carry = sum >= base ? 1 : 0;
165+ sum -= carry * base;
126− } while (a.lesserOrEquals(b));
134− var bigInt = function (value, s) {
142− negate: function (m) {
143− var first = m || self;
144− return bigInt(first.value, !first.sign);
147− var first = m || self;
148− return bigInt(first.value, sign.positive);
150− add: function (n, m) {
151− var s, first = self, second;
152− if (m) (first = parse(n)) && (second = parse(m));
153− else second = parse(n, first);
155− if (first.sign !== second.sign) {
156− first = bigInt(first.value, sign.positive);
157− second = bigInt(second.value, sign.positive);
158− return s === sign.positive ?
159− o.subtract(first, second) :
160− o.subtract(second, first);
162− normalize(first, second);
163− var a = first.value, b = second.value;
166− for (var i = 0; i < a.length || carry > 0; i++) {
167− var sum = (a[i] || 0) + (b[i] || 0) + carry;
168− carry = sum >= base ? 1 : 0;
169− sum -= carry * base;
172− return bigInt(result, s);
168+ return bigInt(result, s);
174− plus: function (n, m) {
170+ plus: function (n, m) {
175− return o.add(n, m);
171+ return o.add(n, m);
177− subtract: function (n, m) {
173+ subtract: function (n, m) {
178− var first = self, second;
174+ var first = self, second;
179− if (m) (first = parse(n)) && (second = parse(m));
175+ if (m) (first = parse(n)) && (second = parse(m));
180− else second = parse(n, first);
176+ else second = parse(n, first);
181− if (first.sign !== second.sign) return o.add(first, o.negate(second));
177+ if (first.sign !== second.sign) return o.add(first, o.negate(second));
182− if (first.sign === sign.negative) return o.subtract(o.negate(second), o.negate(first));
178+ if (first.sign === sign.negative) return o.subtract(o.negate(second), o.negate(first));
183− if (o.compare(first, second) === -1) return o.negate(o.subtract(second, first));
179+ if (o.compare(first, second) === -1) return o.negate(o.subtract(second, first));
184− var a = first.value, b = second.value;
180+ var a = first.value, b = second.value;
185− var result = [],
181+ var result = [],
186− borrow = 0;
182+ borrow = 0;
187− for (var i = 0; i < a.length; i++) {
183+ for (var i = 0; i < a.length; i++) {
188− a[i] -= borrow;
184+ a[i] -= borrow;
189− borrow = a[i] < b[i] ? 1 : 0;
185+ borrow = a[i] < b[i] ? 1 : 0;
190− var minuend = (borrow * base) + a[i] - b[i];
186+ var minuend = (borrow * base) + a[i] - b[i];
191− result.push(minuend);
187+ result.push(minuend);
193− return bigInt(result, sign.positive);
189+ return bigInt(result, sign.positive);
195− minus: function (n, m) {
191+ minus: function (n, m) {
196− return o.subtract(n, m);
192+ return o.subtract(n, m);
198− multiply: function (n, m) {
194+ multiply: function (n, m) {
199− var s, first = self, second;
195+ var s, first = self, second;
200− if (m) (first = parse(n)) && (second = parse(m));
196+ if (m) (first = parse(n)) && (second = parse(m));
201− else second = parse(n, first);
197+ else second = parse(n, first);
202− s = first.sign !== second.sign;
198+ s = first.sign !== second.sign;
203− var a = first.value, b = second.value;
199+ var a = first.value, b = second.value;
204− var resultSum = [];
200+ var resultSum = [];
205− for (var i = 0; i < a.length; i++) {
201+ for (var i = 0; i < a.length; i++) {
206− resultSum[i] = [];
202+ resultSum[i] = [];
207− var j = i;
203+ var j = i;
208− while (j--) {
204+ while (j--) {
209− resultSum[i].push(0);
213− for (var i = 0; i < a.length; i++) {
215− for (var j = 0; j < b.length || carry > 0; j++) {
217− var product = y ? (x * y) + carry : carry;
218− carry = product > base ? Math.floor(product / base) : 0;
219− product -= carry * base;
220− resultSum[i].push(product);
205+ resultSum[i].push(0);
224− for (var i = 0; i < resultSum.length; i++) {
225− var len = resultSum[i].length;
226− if (len > max) max = len;
228− var result = [], carry = 0;
229− for (var i = 0; i < max || carry > 0; i++) {
231− for (var j = 0; j < resultSum.length; j++) {
232− sum += resultSum[j][i] || 0;
209+ for (var i = 0; i < a.length; i++) {
211+ for (var j = 0; j < b.length || carry > 0; j++) {
213+ var product = y ? (x * y) + carry : carry;
234− carry = sum > base ? Math.floor(sum / base) : 0;
214+ carry = product > base ? Math.floor(product / base) : 0;
235− sum -= carry * base;
215+ product -= carry * base;
236− result.push(sum);
216+ resultSum[i].push(product);
238− return bigInt(result, s);
240− times: function (n, m) {
219+ var max = -1;
241− return o.multiply(n, m);
220+ for (var i = 0; i < resultSum.length; i++) {
242− },
221+ var len = resultSum[i].length;
243− divmod: function (n, m) {
222+ if (len > max) max = len;
244− var s, first = self, second;
223+ }
245− if (m) (first = parse(n)) && (second = parse(m));
224+ var result = [], carry = 0;
246− else second = parse(n, first);
225+ for (var i = 0; i < max || carry > 0; i++) {
247− s = first.sign !== second.sign;
226+ var sum = carry;
248− if (bigInt(first.value, first.sign).equals(0)) return {
227+ for (var j = 0; j < resultSum.length; j++) {
249− quotient: bigInt([0], sign.positive),
228+ sum += resultSum[j][i] || 0;
250− remainder: bigInt([0], sign.positive)
252− if (second.equals(0)) throw new Error("Cannot divide by zero");
253− var a = first.value, b = second.value;
254− var result = [], remainder = [];
255− for (var i = a.length - 1; i >= 0; i--) {
256− var n = [a[i]].concat(remainder);
257− var quotient = goesInto(b, n);
258− result.push(quotient.result);
259− remainder = quotient.remainder;
230+ carry = sum > base ? Math.floor(sum / base) : 0;
231+ sum -= carry * base;
234+ return bigInt(result, s);
236+ times: function (n, m) {
237+ return o.multiply(n, m);
239+ divmod: function (n, m) {
240+ var s, first = self, second;
241+ if (m) (first = parse(n)) && (second = parse(m));
242+ else second = parse(n, first);
243+ s = first.sign !== second.sign;
244+ if (bigInt(first.value, first.sign).equals(0)) return {
245+ quotient: bigInt([0], sign.positive),
246+ remainder: bigInt([0], sign.positive)
248+ if (second.equals(0)) throw new Error("Cannot divide by zero");
249+ var a = first.value, b = second.value;
250+ var result = [], remainder = [];
251+ for (var i = a.length - 1; i >= 0; i--) {
252+ var n = [a[i]].concat(remainder);
253+ var quotient = goesInto(b, n);
254+ result.push(quotient.result);
255+ remainder = quotient.remainder;
261− result.reverse();
257+ result.reverse();
262− return {
258+ return {
263− quotient: bigInt(result, s),
259+ quotient: bigInt(result, s),
264− remainder: bigInt(remainder, first.sign)
260+ remainder: bigInt(remainder, first.sign)
267− divide: function (n, m) {
263+ divide: function (n, m) {
268− return o.divmod(n, m).quotient;
264+ return o.divmod(n, m).quotient;
270− over: function (n, m) {
266+ over: function (n, m) {
271− return o.divide(n, m);
267+ return o.divide(n, m);
273− mod: function (n, m) {
269+ mod: function (n, m) {
274− return o.divmod(n, m).remainder;
270+ return o.divmod(n, m).remainder;
276− pow: function (n, m) {
272+ pow: function (n, m) {
277− var first = self, second;
273+ var first = self, second;
278− if (m) (first = parse(n)) && (second = parse(m));
274+ if (m) (first = parse(n)) && (second = parse(m));
279− else second = parse(n, first);
275+ else second = parse(n, first);
280− var a = first, b = second;
276+ var a = first, b = second;
281− if (b.lesser(0)) return ZERO;
277+ if (b.lesser(0)) return ZERO;
282− if (b.equals(0)) return ONE;
278+ if (b.equals(0)) return ONE;
283− var result = bigInt(a.value, a.sign);
279+ var result = bigInt(a.value, a.sign);
285− if (b.mod(2).equals(0)) {
281+ if (b.mod(2).equals(0)) {
286− var c = result.pow(b.over(2));
282+ var c = result.pow(b.over(2));
287− return c.times(c);
283+ return c.times(c);
288− } else {
284+ } else {
289− return result.times(result.pow(b.minus(1)));
285+ return result.times(result.pow(b.minus(1)));
292− next: function (m) {
288+ next: function (m) {
293− var first = m || self;
289+ var first = m || self;
294− return o.add(first, 1);
290+ return o.add(first, 1);
296− prev: function (m) {
292+ prev: function (m) {
297− var first = m || self;
293+ var first = m || self;
298− return o.subtract(first, 1);
294+ return o.subtract(first, 1);
300− compare: function (n, m) {
296+ compare: function (n, m) {
301− var first = self, second;
297+ var first = self, second;
302− if (m) (first = parse(n)) && (second = parse(m, first));
298+ if (m) (first = parse(n)) && (second = parse(m, first));
303− else second = parse(n, first);
299+ else second = parse(n, first);
304− normalize(first, second);
300+ normalize(first, second);
305− if (first.value.length === 1 && second.value.length === 1 && first.value[0] === 0 && second.value[0] === 0) return 0;
301+ if (first.value.length === 1 && second.value.length === 1 && first.value[0] === 0 && second.value[0] === 0) return 0;
306− if (second.sign !== first.sign) return first.sign === sign.positive ? 1 : -1;
302+ if (second.sign !== first.sign) return first.sign === sign.positive ? 1 : -1;
307− var multiplier = first.sign === sign.positive ? 1 : -1;
303+ var multiplier = first.sign === sign.positive ? 1 : -1;
308− var a = first.value, b = second.value;
304+ var a = first.value, b = second.value;
309− for (var i = a.length - 1; i >= 0; i--) {
305+ for (var i = a.length - 1; i >= 0; i--) {
310− if (a[i] > b[i]) return 1 * multiplier;
306+ if (a[i] > b[i]) return 1 * multiplier;
311− if (b[i] > a[i]) return -1 * multiplier;
307+ if (b[i] > a[i]) return -1 * multiplier;
313− return 0;
309+ return 0;
315− compareAbs: function (n, m) {
311+ compareAbs: function (n, m) {
316− var first = self, second;
312+ var first = self, second;
317− if (m) (first = parse(n)) && (second = parse(m, first));
313+ if (m) (first = parse(n)) && (second = parse(m, first));
318− else second = parse(n, first);
314+ else second = parse(n, first);
319− first.sign = second.sign = sign.positive;
315+ first.sign = second.sign = sign.positive;
320− return o.compare(first, second);
316+ return o.compare(first, second);
322− equals: function (n, m) {
318+ equals: function (n, m) {
323− return o.compare(n, m) === 0;
319+ return o.compare(n, m) === 0;
325− notEquals: function (n, m) {
321+ notEquals: function (n, m) {
326− return !o.equals(n, m);
322+ return !o.equals(n, m);
328− lesser: function (n, m) {
324+ lesser: function (n, m) {
329− return o.compare(n, m) < 0;
325+ return o.compare(n, m) < 0;
331− greater: function (n, m) {
327+ greater: function (n, m) {
332− return o.compare(n, m) > 0;
328+ return o.compare(n, m) > 0;
334− greaterOrEquals: function (n, m) {
330+ greaterOrEquals: function (n, m) {
335− return o.compare(n, m) >= 0;
331+ return o.compare(n, m) >= 0;
337− lesserOrEquals: function (n, m) {
333+ lesserOrEquals: function (n, m) {
338− return o.compare(n, m) <= 0;
334+ return o.compare(n, m) <= 0;
340− isPositive: function (m) {
336+ isPositive: function (m) {
341− var first = m || self;
337+ var first = m || self;
342− return first.sign === sign.positive;
338+ return first.sign === sign.positive;
344− isNegative: function (m) {
340+ isNegative: function (m) {
345− var first = m || self;
341+ var first = m || self;
346− return first.sign === sign.negative;
342+ return first.sign === sign.negative;
348− isEven: function (m) {
344+ isEven: function (m) {
349− var first = m || self;
345+ var first = m || self;
350− return first.value[0] % 2 === 0;
346+ return first.value[0] % 2 === 0;
352− isOdd: function (m) {
348+ isOdd: function (m) {
353− var first = m || self;
349+ var first = m || self;
354− return first.value[0] % 2 === 1;
350+ return first.value[0] % 2 === 1;
356− toString: function (m) {
352+ toString: function (m) {
357− var first = m || self;
353+ var first = m || self;
358− var str = "", len = first.value.length;
354+ var str = "", len = first.value.length;
359− while (len--) {
355+ while (len--) {
360− str += (base.toString() + first.value[len]).slice(-logBase);
356+ str += (base.toString() + first.value[len]).slice(-logBase);
362− while (str[0] === "0") {
365− if (!str.length) str = "0";
366− var s = first.sign === sign.positive ? "" : "-";
369− toJSNumber: function (m) {
370− return +o.toString(m);
372− valueOf: function (m) {
373− return o.toJSNumber(m);
358+ while (str[0] === "0") {
361+ if (!str.length) str = "0";
362+ var s = first.sign === sign.positive ? "" : "-";
365+ toJSNumber: function (m) {
366+ return +o.toString(m);
368+ valueOf: function (m) {
376− return o;
369+ return o.toJSNumber(m);
379− var ZERO = bigInt([0], sign.positive);
375+ var ZERO = bigInt([0], sign.positive);
380− var ONE = bigInt([1], sign.positive);
376+ var ONE = bigInt([1], sign.positive);
381− var MINUS_ONE = bigInt([1], sign.negative);
377+ var MINUS_ONE = bigInt([1], sign.negative);
383− var fnReturn = function (a) {
384− if (typeof a === "undefined") return ZERO;
387− fnReturn.zero = ZERO;
389− fnReturn.minusOne = MINUS_ONE;
392−})(__IDR__ || (__IDR__ = {}));
379+ var fnReturn = function (a) {
380+ if (typeof a === "undefined") return ZERO;
383+ fnReturn.zero = ZERO;
385+ fnReturn.minusOne = MINUS_ONE;