Download Jar. Uses 4489K of libraries. Click here for Pure Java version (13337L/96K).
1 | !7 |
2 | |
3 | !include #1007768 // faster eq() |
4 | |
5 | sS theFacts = [[ |
6 | |
7 | Fibonacci number n is Fibonacci number n-1 plus Fibonacci number n-2 if n > 2. |
8 | There is no Fibonacci number with a negative index. |
9 | There is no Fibonacci number 0. |
10 | Fibonacci number 1 is 1. |
11 | Fibonacci number 2 is 1. |
12 | |
13 | // Some technical stuff |
14 | gmtzfidalveipfyx feyhbrhdeovmbvaw amcmxkgwhivbouqs |
15 | pqnfhkzxoqkaoyqk sppxbuuqeetjmzuo |
16 | ]]; |
17 | |
18 | sS theRiddle = [[ |
19 | What is Fibonacci number 0? |
20 | What is Fibonacci number 1? |
21 | What is Fibonacci number 2? |
22 | What is Fibonacci number 3? |
23 | What is Fibonacci number 4? |
24 | ]]; |
25 | |
26 | static S concepts = [[ |
27 | ["feyhbrhdeovmbvaw", "There is no X."], |
28 | ["mtsrzasaoxrmicch", "X is Y if Z."], |
29 | ["fgvvrzypbkqomktd", "X is Y."], |
30 | ["sppxbuuqeetjmzuo", "X plus Y"], |
31 | ["devwldetfsfylnod", "X with a negative index"], |
32 | ["rgsamtbrhpcqowko", "Fibonacci number X"], |
33 | ["jxcubqjtqykhfvyo", "X - Y", "as in minus"], |
34 | ["wdbphzfoxwlrhdyl", "X > Y"], |
35 | ["urfkhwfasdaqqqse", "What is X?"], |
36 | ["pqnfhkzxoqkaoyqk", "Operation X should be expanded."], |
37 | ["amcmxkgwhivbouqs", "Something that doesn't exist"], |
38 | ["yissyloatogavyuu", "Fibonacci number"], |
39 | ["gmtzfidalveipfyx", "Marker X implies label Y."], |
40 | ["wvuyakuvuelmxpwp", "X on this"], |
41 | ]]; |
42 | |
43 | !include #1007689 // Web v2 |
44 | |
45 | static int saveInterval = 60000; |
46 | static volatile new Web web; |
47 | static L<Lisp> facts; |
48 | static long lastSave, sizeSaved; |
49 | |
50 | extend Web { |
51 | volatile transient bool cancelled, calculating; |
52 | } |
53 | |
54 | p-tt { |
55 | setConsoleTitle(programTitle()); |
56 | load("web"); lastSave = sysNow(); |
57 | setFrameHeight(consoleFrame(), 400); |
58 | centerConsole(); |
59 | //magellan(); |
60 | //graphite(); |
61 | //mistAqua(); |
62 | //moderateTheme(); |
63 | sahara(); |
64 | swing { |
65 | setConsoleInput("What is Fibonacci number 500?"); |
66 | consoleAddAskButton(); |
67 | focusConsole(); |
68 | final JLabel lblBrainSize = jRightAlignedLabel(); |
69 | addToConsole2(withMargin(centerAndEast(lblBrainSize, |
70 | withLeftMargin(jbutton("Reset", "reset"))))); |
71 | awtEvery(lblBrainSize, 1000, r { |
72 | lblBrainSize.setText("Brain Size: " + toM(fileSize(programFile("web.structure")), 1) + " MB"); |
73 | }); |
74 | awtCalcEvery(lblBrainSize, 1000, 1000, r { |
75 | if (web.calculating) ret; |
76 | int webSize = web.count(); |
77 | if (shouldSave(webSize, false)) saveWeb(webSize); |
78 | }); |
79 | } |
80 | |
81 | aiEnhancements(); |
82 | aiConcepts_noAutoClear(); |
83 | useConceptsDump(concepts); |
84 | set englishToConceptLanguage_useBrackets; |
85 | facts = clParse(linesToCL(theFacts)); |
86 | print(theFacts); |
87 | useFacts(theFacts); |
88 | //printNumberedLines(facts); |
89 | |
90 | firstRiddle(); |
91 | |
92 | makeBot(); |
93 | notDone(); |
94 | } |
95 | |
96 | svoid firstRiddle { |
97 | print(); |
98 | for (S rid : toLinesFullTrim(theRiddle)) { |
99 | print("? " + rid); |
100 | print(" " + answer(rid)); |
101 | } |
102 | print(); |
103 | } |
104 | |
105 | static int webSize() { ret web.count(); } |
106 | |
107 | sbool shouldSave(int webSize, bool checkInterval) { |
108 | ret webSize != sizeSaved && |
109 | (!checkInterval || sysNow() >= lastSave+saveInterval); |
110 | } |
111 | |
112 | svoid saveWeb(int webSize) { |
113 | save("web"); |
114 | sizeSaved = webSize; |
115 | lastSave = sysNow(); |
116 | } |
117 | |
118 | static S answer(S rid) { |
119 | web.calculating = true; |
120 | try { |
121 | ret answerImpl(rid); |
122 | } finally { |
123 | web.calculating = false; |
124 | } |
125 | } |
126 | |
127 | static S answerImpl(S rid) { |
128 | if (match("web", rid)) { print(web); ret "OK"; } |
129 | if (match("visualize", rid)) { webToCAL(web).show(); ret "OK"; } |
130 | Web web = main.web; |
131 | Lisp riddle = clParse(englishToConceptLanguage(rid)); |
132 | //print("# " + riddle); |
133 | |
134 | if (!riddle.is("urfkhwfasdaqqqse", "mrhggsmuykeceghd")) ret "huh?"; // What is X? // What is the decimal representation of X? |
135 | Lisp mainConcept = riddle.get(0); |
136 | |
137 | // Make web |
138 | web.node(mainConcept); |
139 | web.relations(facts); |
140 | |
141 | int webSize = web.count(); |
142 | int cursor = 0; |
143 | while licensed { |
144 | if (web.cancelled) ret "cancelled"; |
145 | //print("Web size: " + webSize); |
146 | if (shouldSave(webSize, true)) { |
147 | printWithoutNL("S"); |
148 | saveWeb(webSize); |
149 | } else |
150 | printWithoutNL("."); |
151 | if ((++cursor % 60) == 0) print(); |
152 | |
153 | CriticalAction action = beginCriticalAction("Web Update"); |
154 | try { |
155 | web_expandMarkers2(web); |
156 | web_expandOperations2(web); |
157 | |
158 | for (LispStatement ls : lispStatementsByHead("mtsrzasaoxrmicch")) { |
159 | if (web.cancelled) ret "cancelled"; |
160 | Lisp rule = ls.term, x = rule.get(0); |
161 | //print("Pot size: " + l(web.getPot(ls.globalID))); |
162 | for (WebNode node : web.clearPot(ls.globalID)) { |
163 | for (Lisp lbl : cloneList(node.labels)) { |
164 | //print("Matching " + x + " and " + lbl); |
165 | Map<S, Lisp> matches = lispMatch(x, lbl, ll("n")); |
166 | if (matches != null) { |
167 | //print("Rule match: " + struct(matches)); |
168 | Lisp bla = lispReplaceVars(rule.get(2), matches); |
169 | if (checkACondition(bla)) { |
170 | bla = lispReplaceVars(rule.get(1), matches); |
171 | bla = lispCalculateDeep(bla); |
172 | bla = web_insertNumbers(web, bla); |
173 | //print("bla: " + bla); |
174 | bla = lispCalculateDeep(bla); |
175 | if (lispIsInt(bla)) { |
176 | node.addLabel(bla); // Found! |
177 | //pot.remove(node); |
178 | } else { |
179 | //print("Condition OK! Evaluating: " + bla); |
180 | web.node(bla); |
181 | // Place into pot again |
182 | web.getPot(ls.globalID).add(node); |
183 | } |
184 | } |
185 | } |
186 | } |
187 | } |
188 | //print("Node: " + node + ", condition: " + condition); |
189 | } |
190 | } finally { |
191 | action.done(); |
192 | } |
193 | |
194 | int n = web.count(); |
195 | if (n == webSize) break; |
196 | webSize = n; |
197 | } |
198 | print(); |
199 | |
200 | // print question again |
201 | if (cursor / 60 >= 10) |
202 | print("? " + rid); |
203 | |
204 | // Answer question |
205 | L<Lisp> l = listWithout(web.findNode(mainConcept).labels, mainConcept); |
206 | //print("Labels: " + l); |
207 | S s = chooseALabelToReturn(l); |
208 | s = or2(conceptLanguageToEnglish(unquote(s)), "I don't know"); |
209 | ret s; |
210 | } |
211 | |
212 | sS chooseALabelToReturn(L<Lisp> ll) { |
213 | L<S> l = map(f clUnparse, ll); |
214 | //print(" Labels: " + l); |
215 | S s = findInteger(l); |
216 | if (s == null) s = firstGlobalID(l); |
217 | //if (s == null) s = random(l); |
218 | if (s == null) ret s = first(l); |
219 | ret s; |
220 | } |
221 | |
222 | sbool checkACondition(Lisp l) false on exception { |
223 | ret lispCalculateDeep(l).is("true"); |
224 | } |
225 | |
226 | svoid cleanMeUp { |
227 | while (criticalActionsInFlight()) sleep(5); |
228 | if (sizeSaved != web.count()) |
229 | save("web"); |
230 | } |
231 | |
232 | svoid reset { |
233 | if (!confirmOKCancel("Really clear the Fibonacci brain?")) ret; |
234 | web.cancelled = true; |
235 | CriticalAction action = beginCriticalAction("Resetting Brain"); |
236 | try { |
237 | web = new Web; |
238 | sizeSaved = 0; |
239 | save("web"); |
240 | } finally { |
241 | action.done(); |
242 | } |
243 | clearConsole(); |
244 | firstRiddle(); |
245 | } |
Began life as a copy of #1007739
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt, wtqryiryparv
No comments. add comment
Snippet ID: | #1007765 |
Snippet name: | Demo 2: Fibonacci numbers [best version, WORKS] |
Eternal ID of this version: | #1007765/7 |
Text MD5: | 2dd319ce5de4d0c82d3c923919ddd85a |
Transpilation MD5: | 1c3f9845eae11ba0363f95c62d66e338 |
Author: | stefan |
Category: | javax / a.i. |
Type: | JavaX source code (desktop) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2017-04-10 11:09:28 |
Source code size: | 6859 bytes / 245 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 725 / 1812 |
Version history: | 6 change(s) |
Referenced in: | [show references] |