Libraryless. Click here for Pure Java version (6993L/50K/155K).
1 | !7 |
2 | |
3 | !include once #1003474 // class E |
4 | |
5 | abstract sclass Learner {
|
6 | abstract void processInOut(S in, S out); |
7 | abstract S processIn(S in); |
8 | } |
9 | |
10 | static LMath learner; |
11 | |
12 | p {
|
13 | testPoem("#1003072"); // Addition Poem
|
14 | testPoem("#1003073"); // Division Poem
|
15 | print("OK!");
|
16 | } |
17 | |
18 | static void testPoem(S snippetID) {
|
19 | learner = new LMath; |
20 | L<Text> texts = loadPoems(snippetID); |
21 | |
22 | L<E> test1 = parsePoem(texts.get(0).lines); |
23 | L<E> test2 = parsePoem(texts.get(1).lines); |
24 | |
25 | learner.processInOut(test1.get(0).q, test1.get(1).a); |
26 | |
27 | print("Test: " + assertTrue(runPoemTest1(test2)));
|
28 | } |
29 | |
30 | static void untest(L<E> test) {
|
31 | for (E e : test) |
32 | e.test = false; |
33 | } |
34 | |
35 | // used by runPoemTest1 |
36 | static L<E> predict(L<E> input) {
|
37 | if (l(input) != 1) ret null; |
38 | |
39 | new E e; |
40 | S q = input.get(0).q; |
41 | e.a = learner.processIn(q); |
42 | print(q + " >> " + e.a + " " + structure(learner.possibleOperations)); |
43 | ret litlist(e); |
44 | } |
45 | |
46 | sclass LMath extends Learner {
|
47 | String allOperations = "+ - * /"; |
48 | Set<String> possibleOperations = new TreeSet<String>(); |
49 | String outPattern = ""; |
50 | |
51 | LMath() {
|
52 | restart(); |
53 | } |
54 | |
55 | void restart() {
|
56 | possibleOperations.addAll(Arrays.asList(allOperations.split(" +")));
|
57 | } |
58 | |
59 | void processInOut(String in, String out) {
|
60 | outPattern = out.replaceAll("-?\\d+", "*");
|
61 | BigInteger[] inNumbers = extractIntsFromString(in); |
62 | BigInteger[] outNumbers = extractIntsFromString(out); |
63 | try {
|
64 | findOperation(inNumbers, outNumbers); |
65 | } catch (Throwable e) {
|
66 | e.printStackTrace(); |
67 | } |
68 | } |
69 | |
70 | public void findOperation(BigInteger[] in, BigInteger[] out) {
|
71 | filterOperations(in, out); |
72 | if (possibleOperations.isEmpty()) {
|
73 | System.out.println("TILT");
|
74 | restart(); |
75 | filterOperations(in, out); |
76 | } |
77 | } |
78 | |
79 | public void filterOperations(BigInteger[] in, BigInteger[] out) {
|
80 | for (Iterator<String> i = possibleOperations.iterator(); i.hasNext(); ) {
|
81 | String op = i.next(); |
82 | BigInteger[] out2 = doOperation(op, in); |
83 | if (out2 == null || !arraysEqual(out, out2)) |
84 | i.remove(); // keep only matching operations |
85 | } |
86 | } |
87 | |
88 | public BigInteger[] doOperation(String op, BigInteger[] in) {
|
89 | op = op.intern(); |
90 | try {
|
91 | if (in.length == 2) {
|
92 | BigInteger a = in[0], b = in[1], x = null; |
93 | if (op == "+") |
94 | x = a.add(b); |
95 | else if (op == "-") |
96 | x = a.subtract(b); |
97 | else if (op == "*") |
98 | x = a.multiply(b); |
99 | else if (op == "/") |
100 | x = a.divide(b); |
101 | return x != null ? new BigInteger[] {x} : null;
|
102 | } |
103 | return null; |
104 | } catch (Throwable e) {
|
105 | return null; |
106 | } |
107 | } |
108 | |
109 | String processIn(String in) {
|
110 | if (possibleOperations.isEmpty()) return ""; |
111 | String op = possibleOperations.iterator().next(); |
112 | |
113 | BigInteger[] inNumbers = extractIntsFromString(in); |
114 | BigInteger[] outNumbers = doOperation(op, inNumbers); |
115 | String s = outPattern; |
116 | if (outNumbers != null) |
117 | for (BigInteger num : outNumbers) |
118 | s = outPattern.replaceFirst("\\*", num.toString());
|
119 | return s; |
120 | } |
121 | } |
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1003067 |
| Snippet name: | Solve 2 Math Poems (works!) |
| Eternal ID of this version: | #1003067/3 |
| Text MD5: | 5b6174888e3eb7da7328657b02f9f91a |
| Transpilation MD5: | f9d9da463f11252d498900d6135b3005 |
| Author: | stefan |
| Category: | eleu / nl |
| Type: | JavaX source code |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2020-09-26 00:16:31 |
| Source code size: | 3180 bytes / 121 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 887 / 1028 |
| Version history: | 2 change(s) |
| Referenced in: | [show references] |