1 | !636 |
2 | !quickmain |
3 | !auto-import |
4 | !standard functions |
5 | |
6 | interface Learner { |
7 | public void processInOut(String in, String out); |
8 | public String processIn(String in); |
9 | public void toJava(Code code); |
10 | } |
11 | |
12 | class Code { |
13 | StringBuilder buf = new StringBuilder(); |
14 | |
15 | void line(String line) { |
16 | buf.append(line).append('\n'); |
17 | } |
18 | } |
19 | |
20 | main { |
21 | static List<String[]> fullExamples = new ArrayList<String[]>(); |
22 | static List<String> halfExamples = new ArrayList<String>(); |
23 | static List<String[]> examples1, examples2; |
24 | |
25 | psvm { |
26 | parse(args.length != 0 ? args[0] : null); |
27 | calculate(); |
28 | } |
29 | |
30 | static void parse(String arg) tex { |
31 | String text; |
32 | if (arg != null) |
33 | text = loadSnippet(arg); |
34 | else { |
35 | text = loadTextFile("input/input.txt", null); |
36 | if (text == null) text = loadSnippet("#2000455"); // example input |
37 | } |
38 | |
39 | System.out.println(text); |
40 | String in = null, out = null; |
41 | |
42 | for (String line : toLines(text)) { |
43 | if (line.startsWith("I")) { // "In: " or "I: " |
44 | if (in != null) |
45 | halfExamples.add(in); |
46 | in = unquote(line.substring(line.indexOf(':')+1).trim()); |
47 | out = null; |
48 | } else if (line.startsWith("O")) { // "Out: " or "O: " |
49 | out = unquote(line.substring(line.indexOf(':')+1).trim()); |
50 | System.out.println(quote(in) + " => " + quote(out)); |
51 | fullExamples.add(new String[] {in, out}); |
52 | in = out = null; |
53 | } |
54 | } |
55 | |
56 | if (in != null) |
57 | halfExamples.add(in); |
58 | } |
59 | |
60 | static void calculate() tex { |
61 | if (fullExamples.size() < 2) |
62 | throw new RuntimeException("Too few examples (" + fullExamples.size() + ")"); |
63 | int splitPoint = fullExamples.size()-1; |
64 | System.out.println("Full examples: " + fullExamples.size() + ", splitPoint: " + splitPoint); |
65 | examples1 = fullExamples.subList(0, splitPoint); |
66 | examples2 = fullExamples.subList(splitPoint, fullExamples.size()); |
67 | |
68 | Learner learner = findOKLearner(); |
69 | if (learner == null) |
70 | print "\nProblem not solved" |
71 | else { |
72 | print "\nSolved!\n" |
73 | Code code = new Code(); |
74 | learner.toJava(code); |
75 | System.out.println(code.buf); |
76 | for (String in : halfExamples) { |
77 | String out = learner.processIn(in); |
78 | System.out.println(quote(in) + " =>! " + quote(out)); |
79 | } |
80 | } |
81 | } |
82 | |
83 | static Learner findOKLearner() { |
84 | for (Learner learner : makeLearners()) try { |
85 | if (learnerOK(learner)) |
86 | return learner; |
87 | } catch (Throwable e) { |
88 | e.printStackTrace(); |
89 | } |
90 | return null; |
91 | } |
92 | |
93 | static boolean learnerOK(Learner learner) { |
94 | for (String[] e : examples1) { |
95 | learner.processInOut(e[0], e[1]); |
96 | } |
97 | for (String[] e : fullExamples) { |
98 | String out = learner.processIn(e[0]); |
99 | if (!e[1].equals(out)) { |
100 | System.out.println("[fail] " + learner + " on " + quote(e[0]) + " - " + quote(out) + " vs " + quote(e[1])); |
101 | return false; |
102 | } |
103 | } |
104 | return true; // all test examples passed |
105 | } |
106 | |
107 | static Iterable<Learner> makeLearners() { |
108 | List<Learner> list = new ArrayList<Learner>(); |
109 | //list.add(new LId()); // subsumed by trivial case of PrefixSuffix |
110 | list.add(new LPrefixSuffix()); |
111 | list.add(new LSplitInput(new LOutPattern())); |
112 | list.add(new LInputPattern()); |
113 | return list; |
114 | } |
115 | |
116 | public static String unquote(String s) { |
117 | if (s.startsWith("\"") && s.endsWith("\"") && s.length() > 1) |
118 | return s.substring(1, s.length()-1).replace("\\\"", "\"").replace("\\\\", "\\"); // SHOULD work... |
119 | else |
120 | return s; // Return SOMETHING |
121 | } |
122 | |
123 | public static String quote(String s) { |
124 | if (s == null) return "null"; |
125 | return "\"" + s.replace("\\", "\\\\").replace("\"", "\\\"") + "\""; |
126 | } |
127 | |
128 | // splits the input at some point, takes only one part |
129 | static class LSplitInput implements Learner { |
130 | int splitIdx = 1; // split after first character |
131 | Learner baseLearner; |
132 | |
133 | LSplitInput(Learner baseLearner) { |
134 | this.baseLearner = baseLearner; |
135 | } |
136 | |
137 | public void processInOut(String in, String out) { |
138 | in = in.substring(splitIdx); |
139 | baseLearner.processInOut(in, out); |
140 | } |
141 | |
142 | public String processIn(String in) { |
143 | in = in.substring(splitIdx); |
144 | return baseLearner.processIn(in); |
145 | } |
146 | |
147 | public void toJava(Code code) { |
148 | code.line("in = in.substring(" + splitIdx + ");"); |
149 | baseLearner.toJava(code); |
150 | } |
151 | } |
152 | |
153 | // if input appears in output in fixed pattern |
154 | static class LOutPattern implements Learner { |
155 | String pattern = "%!%"; |
156 | |
157 | public void processInOut(String in, String out) { |
158 | pattern = out.replace(in, "%!%"); |
159 | } |
160 | |
161 | public String processIn(String in) { |
162 | return pattern.replace("%!%", in); |
163 | } |
164 | |
165 | public void toJava(Code code) { |
166 | code.line("in = " + quote(pattern) + ".replace(" + quote("%!%") + ", in);"); |
167 | } |
168 | } |
169 | |
170 | // learns to exchange common prefixes and suffixes |
171 | static class LPrefixSuffix implements Learner { |
172 | String prefixIn, suffixIn, prefixOut, suffixOut; |
173 | |
174 | public void processInOut(String in, String out) { |
175 | updateIn(in); |
176 | prefixOut = prefixOut == null ? out : commonPrefix(prefixOut, out); |
177 | suffixOut = suffixOut == null ? out : commonSuffix(suffixOut, out); |
178 | } |
179 | |
180 | void updateIn(String in) { |
181 | prefixIn = prefixIn == null ? in : commonPrefix(prefixIn, in); |
182 | suffixIn = suffixIn == null ? in : commonSuffix(suffixIn, in); |
183 | } |
184 | |
185 | public String processIn(String in) { |
186 | //System.out.println("[before last info] " + quote(prefixIn) + " " + quote(suffixIn) + " " + quote(prefixOut) + " " + quote(suffixOut)); |
187 | //System.out.println("[last info] " + quote(in)); |
188 | |
189 | // use latest information |
190 | String p = prefixIn, s = suffixIn; |
191 | updateIn(in); |
192 | prefixOut = prefixOut.substring(0, prefixOut.length()-(p.length()-prefixIn.length())); |
193 | suffixOut = suffixOut.substring(s.length()-suffixIn.length()); |
194 | |
195 | //System.out.println("[after last info] " + quote(prefixIn) + " " + quote(suffixIn) + " " + quote(prefixOut) + " " + quote(suffixOut)); |
196 | String core = in.substring(prefixIn.length(), in.length()-suffixIn.length()); |
197 | return prefixOut + core + suffixOut; |
198 | } |
199 | |
200 | public void toJava(Code code) { |
201 | throw new RuntimeException("TODO"); |
202 | } |
203 | } |
204 | |
205 | // for "find" tasks (e.g. "abcde" to "[[abc]]de") |
206 | static class LInputPattern implements Learner { |
207 | String regexp = ""; |
208 | |
209 | public void processInOut(String in, String out) { |
210 | int i = out.indexOf("[["), j = out.indexOf("]]", i+1); |
211 | if (j < 0) return; |
212 | String s = out.substring(i+2, j); |
213 | regexp = s.replaceAll("\\d+", Matcher.quoteReplacement("\\d+")); |
214 | System.out.println("regexp: " + regexp); |
215 | } |
216 | |
217 | public String processIn(String in) { |
218 | if (regexp.length() == 0) |
219 | return in; |
220 | else |
221 | return in.replaceAll("(" + regexp + ")", "[[$1]]"); |
222 | } |
223 | |
224 | public void toJava(Code code) { |
225 | code.line("in = in.replaceAll(" + quote("(" + regexp + ")") + ", \"[[$1]]\");"); |
226 | } |
227 | } |
228 | |
229 | } |
Began life as a copy of #677
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, teubizvjbppd, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #678 |
Snippet name: | IOIOI Processor (v3, with input pattern finding) |
Eternal ID of this version: | #678/1 |
Text MD5: | 16b65b390a79b14054c2a8f9f136b1a4 |
Author: | stefan |
Category: | |
Type: | JavaX source code |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2015-07-24 20:55:51 |
Source code size: | 7263 bytes / 229 lines |
Pitched / IR pitched: | No / Yes |
Views / Downloads: | 726 / 604 |
Referenced in: | [show references] |