1 | !636 |
2 | !quickmain |
3 | !auto-import |
4 | |
5 | import java.math.*; // BigInteger |
6 | |
7 | interface Learner {
|
8 | void processInOut(String in, String out); |
9 | String processIn(String in); |
10 | } |
11 | |
12 | main {
|
13 | psvm {
|
14 | print "\nHello. Teach me math." |
15 | LMath learner = new LMath(); |
16 | while (true) {
|
17 | String in = readLine("\nQ: ");
|
18 | in = in.trim(); |
19 | |
20 | if (in.equals("restart")) {
|
21 | System.out.println("[restart]");
|
22 | learner.restart(); |
23 | continue; |
24 | } |
25 | |
26 | if (in.length() == 0) |
27 | break; |
28 | |
29 | String guess = learner.processIn(in); |
30 | if (guess != null && guess.length() != 0) {
|
31 | System.out.println(in + " => " + guess); |
32 | String ok = readLine("\nOK (y/n)? ");
|
33 | ok = ok.toLowerCase().trim(); |
34 | boolean yes = ok.startsWith("y") || ok.startsWith("j");
|
35 | if (yes) {
|
36 | print ":)" |
37 | // OPTIONAL - indicate that guess was OK: learner.processInOut(in, guess); |
38 | continue; |
39 | } else {
|
40 | print "Oops." |
41 | // query correcting answer from user |
42 | } |
43 | } else {
|
44 | print "I don't know." |
45 | } |
46 | |
47 | String out = readLine(in + " => "); |
48 | out = out.trim(); |
49 | learner.processInOut(in, out); |
50 | System.out.println("OK. " + in + " => " + out);
|
51 | } |
52 | } |
53 | |
54 | static Scanner system_in = new Scanner(System.in); |
55 | static String readLine(String prompt) {
|
56 | System.out.print(prompt); |
57 | return system_in.nextLine(); |
58 | } |
59 | |
60 | static BigInteger[] getNumbers(String s) {
|
61 | Pattern p = Pattern.compile("-?\\d+");
|
62 | Matcher m = p.matcher(s); |
63 | List<BigInteger> list = new ArrayList<BigInteger>(); |
64 | while (m.find()) |
65 | list.add(new BigInteger(m.group())); |
66 | return list.toArray(new BigInteger[list.size()]); |
67 | } |
68 | |
69 | static boolean arraysEqual(BigInteger[] a, BigInteger[] b) {
|
70 | if (a.length != b.length) return false; |
71 | for (int i = 0; i < a.length; i++) |
72 | if (!a[i].equals(b[i])) return false; |
73 | return true; |
74 | } |
75 | |
76 | static class LMath implements Learner {
|
77 | String allOperations = "+ - * /"; |
78 | Set<String> possibleOperations = new TreeSet<String>(); |
79 | String outPattern = ""; |
80 | |
81 | LMath() {
|
82 | restart(); |
83 | } |
84 | |
85 | void restart() {
|
86 | possibleOperations.addAll(Arrays.asList(allOperations.split(" +")));
|
87 | } |
88 | |
89 | public void processInOut(String in, String out) {
|
90 | outPattern = out.replaceAll("-?\\d+", "*");
|
91 | BigInteger[] inNumbers = getNumbers(in); |
92 | BigInteger[] outNumbers = getNumbers(out); |
93 | try {
|
94 | findOperation(inNumbers, outNumbers); |
95 | } catch (Throwable e) {
|
96 | e.printStackTrace(); |
97 | } |
98 | } |
99 | |
100 | public void findOperation(BigInteger[] in, BigInteger[] out) {
|
101 | filterOperations(in, out); |
102 | if (possibleOperations.isEmpty()) {
|
103 | System.out.println("TILT");
|
104 | restart(); |
105 | filterOperations(in, out); |
106 | } |
107 | } |
108 | |
109 | public void filterOperations(BigInteger[] in, BigInteger[] out) {
|
110 | for (Iterator<String> i = possibleOperations.iterator(); i.hasNext(); ) {
|
111 | String op = i.next(); |
112 | BigInteger[] out2 = doOperation(op, in); |
113 | if (out2 == null || !arraysEqual(out, out2)) |
114 | i.remove(); // keep only matching operations |
115 | } |
116 | } |
117 | |
118 | public BigInteger[] doOperation(String op, BigInteger[] in) {
|
119 | op = op.intern(); |
120 | try {
|
121 | if (in.length == 2) {
|
122 | BigInteger a = in[0], b = in[1], x = null; |
123 | if (op == "+") |
124 | x = a.add(b); |
125 | else if (op == "-") |
126 | x = a.subtract(b); |
127 | else if (op == "*") |
128 | x = a.multiply(b); |
129 | else if (op == "/") |
130 | x = a.divide(b); |
131 | return x != null ? new BigInteger[] {x} : null;
|
132 | } |
133 | return null; |
134 | } catch (Throwable e) {
|
135 | return null; |
136 | } |
137 | } |
138 | |
139 | public String processIn(String in) {
|
140 | if (possibleOperations.isEmpty()) return ""; |
141 | String op = possibleOperations.iterator().next(); |
142 | |
143 | BigInteger[] inNumbers = getNumbers(in); |
144 | BigInteger[] outNumbers = doOperation(op, inNumbers); |
145 | String s = outPattern; |
146 | if (outNumbers != null) |
147 | for (BigInteger num : outNumbers) |
148 | s = outPattern.replaceFirst("\\*", num.toString());
|
149 | return s; |
150 | } |
151 | } |
152 | } |
download show line numbers debug dex old transpilations
Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gkwdfizivqfm, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, qbtsjoyahagl, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #640 |
| Snippet name: | Learn to calculate (console) |
| Eternal ID of this version: | #640/1 |
| Text MD5: | f741b25fe79687d42c048cda01c53f3b |
| Author: | stefan |
| Category: | |
| Type: | JavaX source code |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2015-06-23 23:45:49 |
| Source code size: | 4406 bytes / 152 lines |
| Pitched / IR pitched: | No / Yes |
| Views / Downloads: | 966 / 886 |
| Referenced in: | [show references] |