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: | 888 / 1028 | 
| Version history: | 2 change(s) | 
| Referenced in: | [show references] |