Libraryless. Click here for Pure Java version (1487L/10K/33K).
1 | !752 |
2 | |
3 | // Numeric quadruple |
4 | static class NQ { |
5 | BigInteger a; |
6 | S b; |
7 | BigInteger c; |
8 | S d; |
9 | |
10 | *() {} |
11 | *(S a, S *b, S c, S *d) { |
12 | this.a = smartBigint(a); |
13 | this.c = smartBigint(c); |
14 | } |
15 | *(BigInteger *a, S *b, BigInteger *c, S *d) {} |
16 | |
17 | public boolean equals(O o) { |
18 | ret stdEq(this, o, "a", "b", "c", "d"); |
19 | } |
20 | |
21 | public S toString() { |
22 | ret a + " " + b + " is " + c + " " + d; |
23 | } |
24 | |
25 | NQ reverse() { |
26 | ret new NQ(c, d, a, b); |
27 | } |
28 | |
29 | bool valid() { |
30 | ret neq(a, 0) && neq(c, 0); |
31 | } |
32 | } |
33 | |
34 | static new L<NQ> terms; |
35 | |
36 | p { |
37 | load("terms"); |
38 | } |
39 | |
40 | synchronized answer { |
41 | if (match("* * is * *", s, m) || match("* * are * *", s, m)) { |
42 | NQ nq = new NQ(m.unq(0), simplify(m.unq(1)), m.unq(2), simplify(m.unq(3))); |
43 | if (terms.contains(nq)) |
44 | ret "I know!"; |
45 | terms.add(nq); |
46 | save("terms"); |
47 | ret "OK, added to theory. Now " + l(terms) + " entries"; |
48 | } |
49 | |
50 | if (match("show theory", s)) { |
51 | ret structure(allToString(terms)); |
52 | } |
53 | |
54 | if (match("how many * * * *", s, m)) { |
55 | S isAre = m.get(1); |
56 | if (litlist("is", "are").contains(toLower(isAre))) { |
57 | BigInteger a = bigint(m.unq(2)); |
58 | S b = m.unq(3); |
59 | S d = m.unq(0); |
60 | Rat c = calc(new Rat(a), b, d); |
61 | if (c == null) |
62 | ret "I don't know"; |
63 | ret a + " " + b + " " + isAre + " " + c.mixed() + " " + d + "!"; |
64 | } |
65 | } |
66 | } |
67 | |
68 | /*static Rat calc(Rat a, S b, S d) { |
69 | b = simplify(b); |
70 | d = simplify(d); |
71 | for (NQ nq : terms) { |
72 | if (eq(nq.b, b) && eq(nq.d, d)) |
73 | ret calcForward(nq, a); |
74 | if (eq(nq.d, b) && eq(nq.b, d)) |
75 | ret calcForward(nq.reverse(), a); |
76 | } |
77 | null; |
78 | }*/ |
79 | |
80 | static Rat calc(Rat a, S b, S d) { |
81 | b = simplify(b); |
82 | d = simplify(d); |
83 | ret calcTransitive(a, b, d, new TreeSet); |
84 | } |
85 | |
86 | // b is the unit we have, d is the unit we're searching for |
87 | static Rat calcTransitive(Rat a, S b, S d, Set<S> seen) { |
88 | print(format("calcTransitive * * * *", a, b, d, structure(seen))); |
89 | if (eq(b, d)) ret a; // done |
90 | if (seen.contains(b)) ret null; |
91 | seen.add(b); |
92 | for (NQ nq : terms) if (nq.valid()) { |
93 | twice { |
94 | if (eq(nq.b, b)) { |
95 | Rat r = calcTransitive(calcForward(nq, a), nq.d, d, seen); |
96 | if (r != null) ret r; |
97 | } |
98 | nq = nq.reverse(); |
99 | } |
100 | } |
101 | null; |
102 | } |
103 | |
104 | static Rat calcForward(NQ nq, Rat a) { |
105 | ret a.multiply(nq.c).divide(nq.a); |
106 | } |
107 | |
108 | static S simplify(S s) { |
109 | ret toSingular(toLower(s)); |
110 | } |
111 | |
112 | static S toSingular(S s) { |
113 | ret dropSuffix("s", s); // yeah it's rough |
114 | } |
115 | |
116 | static BigInteger smartBigint(S s) { |
117 | if (litlist("a", "an", "one").contains(toLower(s))) |
118 | ret bigint(1); |
119 | ret bigint(s); |
120 | } |
download show line numbers debug dex old transpilations
Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, jtubtzbbkimh, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1002049 |
Snippet name: | Conversion Bot (v1) |
Eternal ID of this version: | #1002049/1 |
Text MD5: | 1f64de1db27e5056aa5c8aecb8a6eadb |
Transpilation MD5: | e80cb1000e7d0f661c9ecff50851c6b6 |
Author: | stefan |
Category: | |
Type: | JavaX source code |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2015-12-16 18:20:48 |
Source code size: | 2666 bytes / 120 lines |
Pitched / IR pitched: | No / Yes |
Views / Downloads: | 747 / 1085 |
Referenced in: | [show references] |