4__IDRRT__.Type = function(type) {
8__IDRRT__.Int = new __IDRRT__.Type('Int');
9__IDRRT__.Char = new __IDRRT__.Type('Char');
10__IDRRT__.String = new __IDRRT__.Type('String');
11__IDRRT__.Integer = new __IDRRT__.Type('Integer');
12__IDRRT__.Float = new __IDRRT__.Type('Float');
13__IDRRT__.Forgot = new __IDRRT__.Type('Forgot');
16__IDRRT__.Tailcall = function(f) { this.f = f };
19__IDRRT__.Con = function(i,vars) {
24__IDRRT__.tailcall = function(f) {
32 if (ret instanceof __IDRRT__.Tailcall) {
40__IDRRT__.print = (function(){
42 var util = require('util');
54 BigInteger Javascript code taken from:
55 https://github.com/peterolson
57__IDRRT__.bigInt = (function () {
58 var base = 10000000, logBase = 7;
64 var normalize = function (first, second) {
65 var a = first.value, b = second.value;
66 var length = a.length > b.length ? a.length : b.length;
67 for (var i = 0; i < length; i++) {
71 for (var i = length - 1; i >= 0; i--) {
72 if (a[i] === 0 && b[i] === 0) {
77 if (!a.length) a = [0], b = [0];
82 var parse = function (text, first) {
83 if (typeof text === "object") return text;
85 var s = sign.positive, value = [];
86 if (text[0] === "-") {
90 var text = text.split("e");
91 if (text.length > 2) throw new Error("Invalid integer");
94 if (exp[0] === "+") exp = exp.slice(1);
96 if (exp.lesser(0)) throw new Error("Cannot include negative exponent part for integers");
97 while (exp.notEquals(0)) {
103 if (text === "-0") text = "0";
104 var isValid = /^([0-9][0-9]*)$/.test(text);
105 if (!isValid) throw new Error("Invalid integer");
106 while (text.length) {
107 var divider = text.length > logBase ? text.length - logBase : 0;
108 value.push(+text.slice(divider));
109 text = text.slice(0, divider);
111 var val = bigInt(value, s);
112 if (first) normalize(first, val);
116 var goesInto = function (a, b) {
117 var a = bigInt(a, sign.positive), b = bigInt(b, sign.positive);
118 if (a.equals(0)) throw new Error("Cannot divide by 0");
122 var c = bigInt(a.value, sign.positive), t = c.times(10);
123 while (t.lesser(b)) {
128 while (c.lesserOrEquals(b)) {
132 } while (a.lesserOrEquals(b));
140 var bigInt = function (value, s) {
148 negate: function (m) {
149 var first = m || self;
150 return bigInt(first.value, !first.sign);
153 var first = m || self;
154 return bigInt(first.value, sign.positive);
156 add: function (n, m) {
157 var s, first = self, second;
158 if (m) (first = parse(n)) && (second = parse(m));
159 else second = parse(n, first);
161 if (first.sign !== second.sign) {
162 first = bigInt(first.value, sign.positive);
163 second = bigInt(second.value, sign.positive);
164 return s === sign.positive ?
165 o.subtract(first, second) :
166 o.subtract(second, first);
168 normalize(first, second);
169 var a = first.value, b = second.value;
172 for (var i = 0; i < a.length || carry > 0; i++) {
173 var sum = (a[i] || 0) + (b[i] || 0) + carry;
174 carry = sum >= base ? 1 : 0;
178 return bigInt(result, s);
180 plus: function (n, m) {
183 subtract: function (n, m) {
184 var first = self, second;
185 if (m) (first = parse(n)) && (second = parse(m));
186 else second = parse(n, first);
187 if (first.sign !== second.sign) return o.add(first, o.negate(second));
188 if (first.sign === sign.negative) return o.subtract(o.negate(second), o.negate(first));
189 if (o.compare(first, second) === -1) return o.negate(o.subtract(second, first));
190 var a = first.value, b = second.value;
193 for (var i = 0; i < a.length; i++) {
195 borrow = a[i] < b[i] ? 1 : 0;
196 var minuend = (borrow * base) + a[i] - b[i];
197 result.push(minuend);
199 return bigInt(result, sign.positive);
201 minus: function (n, m) {
202 return o.subtract(n, m);
204 multiply: function (n, m) {
205 var s, first = self, second;
206 if (m) (first = parse(n)) && (second = parse(m));
207 else second = parse(n, first);
208 s = first.sign !== second.sign;
209 var a = first.value, b = second.value;
211 for (var i = 0; i < a.length; i++) {
215 resultSum[i].push(0);
219 for (var i = 0; i < a.length; i++) {
221 for (var j = 0; j < b.length || carry > 0; j++) {
223 var product = y ? (x * y) + carry : carry;
224 carry = product > base ? Math.floor(product / base) : 0;
225 product -= carry * base;
226 resultSum[i].push(product);
230 for (var i = 0; i < resultSum.length; i++) {
231 var len = resultSum[i].length;
232 if (len > max) max = len;
234 var result = [], carry = 0;
235 for (var i = 0; i < max || carry > 0; i++) {
237 for (var j = 0; j < resultSum.length; j++) {
238 sum += resultSum[j][i] || 0;
240 carry = sum > base ? Math.floor(sum / base) : 0;
244 return bigInt(result, s);
246 times: function (n, m) {
247 return o.multiply(n, m);
249 divmod: function (n, m) {
250 var s, first = self, second;
251 if (m) (first = parse(n)) && (second = parse(m));
252 else second = parse(n, first);
253 s = first.sign !== second.sign;
254 if (bigInt(first.value, first.sign).equals(0)) return {
255 quotient: bigInt([0], sign.positive),
256 remainder: bigInt([0], sign.positive)
258 if (second.equals(0)) throw new Error("Cannot divide by zero");
259 var a = first.value, b = second.value;
260 var result = [], remainder = [];
261 for (var i = a.length - 1; i >= 0; i--) {
262 var n = [a[i]].concat(remainder);
263 var quotient = goesInto(b, n);
264 result.push(quotient.result);
265 remainder = quotient.remainder;
269 quotient: bigInt(result, s),
270 remainder: bigInt(remainder, first.sign)
273 divide: function (n, m) {
274 return o.divmod(n, m).quotient;
276 over: function (n, m) {
277 return o.divide(n, m);
279 mod: function (n, m) {
280 return o.divmod(n, m).remainder;
282 pow: function (n, m) {
283 var first = self, second;
284 if (m) (first = parse(n)) && (second = parse(m));
285 else second = parse(n, first);
286 var a = first, b = second;
287 if (b.lesser(0)) return ZERO;
288 if (b.equals(0)) return ONE;
289 var result = bigInt(a.value, a.sign);
291 if (b.mod(2).equals(0)) {
292 var c = result.pow(b.over(2));
295 return result.times(result.pow(b.minus(1)));
299 var first = m || self;
300 return o.add(first, 1);
303 var first = m || self;
304 return o.subtract(first, 1);
306 compare: function (n, m) {
307 var first = self, second;
308 if (m) (first = parse(n)) && (second = parse(m, first));
309 else second = parse(n, first);
310 normalize(first, second);
311 if (first.value.length === 1 && second.value.length === 1 && first.value[0] === 0 && second.value[0] === 0) return 0;
312 if (second.sign !== first.sign) return first.sign === sign.positive ? 1 : -1;
313 var multiplier = first.sign === sign.positive ? 1 : -1;
314 var a = first.value, b = second.value;
315 for (var i = a.length - 1; i >= 0; i--) {
316 if (a[i] > b[i]) return 1 * multiplier;
317 if (b[i] > a[i]) return -1 * multiplier;
321 compareAbs: function (n, m) {
322 var first = self, second;
323 if (m) (first = parse(n)) && (second = parse(m, first));
324 else second = parse(n, first);
325 first.sign = second.sign = sign.positive;
326 return o.compare(first, second);
328 equals: function (n, m) {
329 return o.compare(n, m) === 0;
331 notEquals: function (n, m) {
332 return !o.equals(n, m);
334 lesser: function (n, m) {
335 return o.compare(n, m) < 0;
337 greater: function (n, m) {
338 return o.compare(n, m) > 0;
340 greaterOrEquals: function (n, m) {
341 return o.compare(n, m) >= 0;
343 lesserOrEquals: function (n, m) {
344 return o.compare(n, m) <= 0;
346 isPositive: function (m) {
347 var first = m || self;
348 return first.sign === sign.positive;
350 isNegative: function (m) {
351 var first = m || self;
352 return first.sign === sign.negative;
354 isEven: function (m) {
355 var first = m || self;
356 return first.value[0] % 2 === 0;
358 isOdd: function (m) {
359 var first = m || self;
360 return first.value[0] % 2 === 1;
362 toString: function (m) {
363 var first = m || self;
364 var str = "", len = first.value.length;
366 str += (base.toString() + first.value[len]).slice(-logBase);
368 while (str[0] === "0") {
371 if (!str.length) str = "0";
372 var s = first.sign === sign.positive ? "" : "-";
375 toJSNumber: function (m) {
376 return +o.toString(m);
378 valueOf: function (m) {
379 return o.toJSNumber(m);
385 var ZERO = bigInt([0], sign.positive);
386 var ONE = bigInt([1], sign.positive);
387 var MINUS_ONE = bigInt([1], sign.negative);
389 var fnReturn = function (a) {
390 if (typeof a === "undefined") return ZERO;
393 fnReturn.zero = ZERO;
395 fnReturn.minusOne = MINUS_ONE;
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list