{"about":"Lesson A27, Dynamic programming: remember what you already worked out. Computed by tools/school/fill_editdistance.mjs from system/school/editdistance.mjs. Do not edit by hand. Levenshtein distance with unit costs (insert, delete, substitute each 1). Distances, call counts and cell counts are exact; wall times are this machine only. No GPU.","sourceSha256":{"editdistance.mjs":"3e5ae4f5ef82e61587353075df628c04b7530e73a92d4e9875e2228c31163d7c"},"recipe":{"naiveMaxLength":9,"naiveBudgetMs":2000,"randomSeeds":{"bfsCheck":4,"greedyControl":9}},"sources":{"about":"What the sources are cited for and how far each was checked. Every distance and count in the other blocks is this lesson's own computation (system/school/editdistance.mjs), checked by four methods that must agree; none of it depends on trusting a citation.","wagnerFischer1974":{"cite":"Robert A. Wagner and Michael J. Fischer, The String-to-String Correction Problem, Journal of the ACM 21(1):168-173, January 1974, doi:10.1145/321796.321811","read":"Bibliographic record and abstract read from Crossref (api.crossref.org) on 2026-10-16: title, authors, volume 21, issue 1, pages 168-173, January 1974 all match. The abstract states the edit operations (change one symbol, delete one, insert one), the distance as the minimum-cost sequence of them, and an algorithm in time proportional to the product of the two lengths. The full paper is behind the ACM paywall (dl.acm.org returned 403) and was not read, so the table's exact layout in the paper is unverified.","citedFor":["the dynamic-programming table for edit distance and its cost, (m + 1)(n + 1) cells"]},"bellman1957":{"cite":"Richard Bellman, Dynamic Programming, Princeton University Press, Princeton, N.J., 1957","read":"Not read. The publisher, place, year and extent (xxv + 342 pages) were checked against Preston C. Hammer's review in Science 127(3304), 1958 (Crossref record doi:10.1126/science.127.3304.976.a). The wording, chapter and page of the principle of optimality are unverified.","citedFor":["the principle that an optimal solution is built from optimal solutions to its subproblems, which is why D[i][j] needs only its three neighbours"]},"jurafskyMartin":{"cite":"Daniel Jurafsky and James H. Martin, Speech and Language Processing, third edition draft of 19 August 2026, chapter 2, section 2.9 Minimum Edit Distance","read":"Read on 2026-10-16 (web.stanford.edu/~jurafsky/slp3/2.pdf). Section 2.9 gives intention to execution as 5 with every operation costing 1 (Levenshtein, 1966), and 8 when a substitution costs 2; it says the algorithm was named by Wagner and Fischer (1974) but independently discovered by many people, and that the intention and execution example was adapted from Kruskal (1983). Its worked table (Figure 2.20) uses substitution cost 2; this lesson uses cost 1.","citedFor":["intention to execution = 5 with unit costs","storing a back-pointer per cell and tracing back to get an alignment"]},"kittenSitting":{"cite":"kitten to sitting = 3, a widely used example with no single primary source found","read":"Not attributed. The value is checked here by breadth-first search over single edits, which does not use the recurrence."}},"pairs":{"about":"Every pair: the table's distance, its cell count (m + 1)(n + 1), the memoised recursion's distance, cells computed and total calls (including answers taken from memory), and the naive recursion's distance and calls when both strings have at most 9 letters (null above that). naiveCallsByRecurrence is the naive call count from T(i, 0) = T(0, j) = 1, T(i, j) = 1 + T(i-1, j) + T(i, j-1) + T(i-1, j-1), for every pair, run or not. alignment: one optimal alignment from the traceback (ties go to the diagonal, then delete, then insert), '-' for a gap, marks s, d, i for substitute, delete, insert. greedy: the control's (wrong) answer.","rows":[{"group":"classic","a":"kitten","b":"sitting","lengths":[6,7],"distance":3,"known":3,"cells":56,"naive":3,"naiveCallsRun":29737,"naiveCallsByRecurrence":29737,"memo":3,"memoComputed":56,"memoCalls":127,"greedy":3,"alignment":{"top":"kitten-","bottom":"sitting","marks":"s   s i"},"ops":{"match":4,"substitute":2,"delete":0,"insert":1}},{"group":"classic","a":"intention","b":"execution","lengths":[9,9],"distance":5,"known":5,"cells":100,"naive":5,"naiveCallsRun":2193844,"naiveCallsByRecurrence":2193844,"memo":5,"memoComputed":100,"memoCalls":244,"greedy":5,"alignment":{"top":"intention","bottom":"execution","marks":"sssss    "},"ops":{"match":4,"substitute":5,"delete":0,"insert":0}},{"group":"sentence","a":"check the tide table first","b":"check the tide tables first","lengths":[26,27],"distance":1,"known":null,"cells":756,"naive":null,"naiveCallsRun":null,"naiveCallsByRecurrence":31757508296837110000,"memo":1,"memoComputed":756,"memoCalls":2107,"greedy":7,"alignment":{"top":"check the tide table- first","bottom":"check the tide tables first","marks":"                    i      "},"ops":{"match":26,"substitute":0,"delete":0,"insert":1}},{"group":"sentence","a":"halve the beach","b":"half the beach","lengths":[15,14],"distance":2,"known":null,"cells":240,"naive":null,"naiveCallsRun":null,"naiveCallsByRecurrence":27538900177,"memo":2,"memoComputed":240,"memoCalls":631,"greedy":12,"alignment":{"top":"halve the beach","bottom":"hal-f the beach","marks":"   ds          "},"ops":{"match":13,"substitute":1,"delete":1,"insert":0}},{"group":"sentence","a":"knock on every shell","b":"knock on each shell","lengths":[20,19],"distance":4,"known":null,"cells":420,"naive":null,"naiveCallsRun":null,"naiveCallsByRecurrence":161020787911873,"memo":4,"memoComputed":420,"memoCalls":1141,"greedy":9,"alignment":{"top":"knock on every shell","bottom":"knock on e-ach shell","marks":"          dsss      "},"ops":{"match":16,"substitute":3,"delete":1,"insert":0}},{"group":"sentence","a":"low tide is at noon","b":"the low tide is at noon","lengths":[19,23],"distance":4,"known":null,"cells":480,"naive":null,"naiveCallsRun":null,"naiveCallsByRecurrence":1705087544838046,"memo":4,"memoComputed":480,"memoCalls":1312,"greedy":21,"alignment":{"top":"----low tide is at noon","bottom":"the low tide is at noon","marks":"iiii                   "},"ops":{"match":19,"substitute":0,"delete":0,"insert":4}},{"group":"sentence","a":"write it down once","b":"write it down, once","lengths":[18,19],"distance":1,"known":null,"cells":380,"naive":null,"naiveCallsRun":null,"naiveCallsByRecurrence":28327584642805,"memo":1,"memoComputed":380,"memoCalls":1027,"greedy":6,"alignment":{"top":"write it down- once","bottom":"write it down, once","marks":"             i     "},"ops":{"match":18,"substitute":0,"delete":0,"insert":1}},{"group":"sentence","a":"remember what you worked out","b":"remember what we worked out","lengths":[28,27],"distance":3,"known":null,"cells":812,"naive":null,"naiveCallsRun":null,"naiveCallsByRecurrence":181815100207415500000,"memo":3,"memoComputed":812,"memoCalls":2269,"greedy":14,"alignment":{"top":"remember what you worked out","bottom":"remember what -we worked out","marks":"              dss           "},"ops":{"match":25,"substitute":2,"delete":1,"insert":0}}]},"naive":{"about":"The naive recursion on growing prefixes of \"remember what you worked out\" and \"remember what we worked out\" (equal lengths L), against the memoised recursion and the table. calls: counted while running; recurrence: from the recurrence without running (must be equal). The run stops when one length takes over 2000 ms on this machine; predicted gives the calls for the next lengths from the recurrence alone. growth: calls(L + 1) / calls(L), measured.","rows":[{"length":1,"a":"r","b":"r","calls":4,"recurrence":4,"ms":0.0039,"distance":0,"tableDistance":0,"memoComputed":4,"memoCalls":4,"cells":4},{"length":2,"a":"re","b":"re","calls":19,"recurrence":19,"ms":0.0017,"distance":0,"tableDistance":0,"memoComputed":9,"memoCalls":13,"cells":9},{"length":3,"a":"rem","b":"rem","calls":94,"recurrence":94,"ms":0.0023,"distance":0,"tableDistance":0,"memoComputed":16,"memoCalls":28,"cells":16},{"length":4,"a":"reme","b":"reme","calls":481,"recurrence":481,"ms":0.0047,"distance":0,"tableDistance":0,"memoComputed":25,"memoCalls":49,"cells":25},{"length":5,"a":"remem","b":"remem","calls":2524,"recurrence":2524,"ms":0.0272,"distance":0,"tableDistance":0,"memoComputed":36,"memoCalls":76,"cells":36},{"length":6,"a":"rememb","b":"rememb","calls":13483,"recurrence":13483,"ms":0.0766,"distance":0,"tableDistance":0,"memoComputed":49,"memoCalls":109,"cells":49},{"length":7,"a":"remembe","b":"remembe","calls":72958,"recurrence":72958,"ms":0.3873,"distance":0,"tableDistance":0,"memoComputed":64,"memoCalls":148,"cells":64},{"length":8,"a":"remember","b":"remember","calls":398593,"recurrence":398593,"ms":2.2204,"distance":0,"tableDistance":0,"memoComputed":81,"memoCalls":193,"cells":81},{"length":9,"a":"remember ","b":"remember ","calls":2193844,"recurrence":2193844,"ms":11.6019,"distance":0,"tableDistance":0,"memoComputed":100,"memoCalls":244,"cells":100},{"length":10,"a":"remember w","b":"remember w","calls":12146179,"recurrence":12146179,"ms":64.2375,"distance":0,"tableDistance":0,"memoComputed":121,"memoCalls":301,"cells":121},{"length":11,"a":"remember wh","b":"remember wh","calls":67570078,"recurrence":67570078,"ms":273.9906,"distance":0,"tableDistance":0,"memoComputed":144,"memoCalls":364,"cells":144},{"length":12,"a":"remember wha","b":"remember wha","calls":377393953,"recurrence":377393953,"ms":1667.1586,"distance":0,"tableDistance":0,"memoComputed":169,"memoCalls":433,"cells":169},{"length":13,"a":"remember what","b":"remember what","calls":2114900428,"recurrence":2114900428,"ms":11326.5277,"distance":0,"tableDistance":0,"memoComputed":196,"memoCalls":508,"cells":196}],"stoppedAt":{"atLength":13,"reason":"one naive run at length 13 took 11327 ms, over the 2000 ms budget"},"predicted":[{"length":14,"calls":11885772379},{"length":15,"calls":66963572734},{"length":16,"calls":378082854913},{"length":17,"calls":2138752086628}],"growth":[4.75,4.9474,5.117,5.2474,5.3419,5.4111,5.4633,5.504,5.5365,5.5631,5.5852,5.604],"verdict":"Length 13: the naive recursion made 2114900428 calls in 11327 ms; the memoised one worked out 196 cells (508 calls), the table fills 196. Each extra letter multiplied the naive calls by 5.6 at the end of the run. Length 17 would take 2138752086628 calls."},"checks":{"about":"Independent checks. random: 300 random pairs over the letters a, b, c with 0 to 4 letters each (seed 4): the table against breadth-first search over single edits (which never uses the recurrence), and the table against itself with the strings swapped. four: the pairs short enough for the naive recursion, with all four methods (search over edits only up to 7 letters; for intention and execution it is too slow, so that pair rests on the naive recursion, which is the definition, and on the published value 5). known: the published values.","random":{"pairs":300,"tableEqualsSearch":300,"symmetric":300,"sample":[{"a":"aaaa","b":"ac","table":3,"bfs":3},{"a":"ccb","b":"cbc","table":2,"bfs":2},{"a":"bc","b":"cbbc","table":2,"bfs":2},{"a":"c","b":"bb","table":2,"bfs":2},{"a":"","b":"bc","table":2,"bfs":2},{"a":"","b":"baba","table":4,"bfs":4},{"a":"aba","b":"ccba","table":2,"bfs":2},{"a":"bac","b":"abcc","table":2,"bfs":2},{"a":"ca","b":"bbc","table":3,"bfs":3},{"a":"","b":"b","table":1,"bfs":1},{"a":"cab","b":"cba","table":2,"bfs":2},{"a":"cac","b":"acb","table":2,"bfs":2}]},"four":[{"a":"kitten","b":"sitting","table":3,"naive":3,"memo":3,"bfs":3,"allAgree":true},{"a":"intention","b":"execution","table":5,"naive":5,"memo":5,"bfs":null,"allAgree":true}],"bfs":{"kittenSitting":3,"halveHalf":2},"known":[{"a":"kitten","b":"sitting","known":3,"table":3,"matches":true},{"a":"intention","b":"execution","known":5,"table":5,"matches":true}]},"controls":{"about":"Control: a greedy matcher that walks both strings left to right, passes equal letters, substitutes unequal ones and inserts or deletes whatever is left at the end. It never looks back, so one early insertion shifts every later letter out of line. It is a valid edit script, so it can never be below the true distance. rows: every lesson pair; random: 1,000 random pairs of 6 to 8 letters over a, b, c, d (seed 9).","greedy":{"rows":[{"a":"kitten","b":"sitting","distance":3,"greedy":3,"wrong":false},{"a":"intention","b":"execution","distance":5,"greedy":5,"wrong":false},{"a":"check the tide table first","b":"check the tide tables first","distance":1,"greedy":7,"wrong":true},{"a":"halve the beach","b":"half the beach","distance":2,"greedy":12,"wrong":true},{"a":"knock on every shell","b":"knock on each shell","distance":4,"greedy":9,"wrong":true},{"a":"low tide is at noon","b":"the low tide is at noon","distance":4,"greedy":21,"wrong":true},{"a":"write it down once","b":"write it down, once","distance":1,"greedy":6,"wrong":true},{"a":"remember what you worked out","b":"remember what we worked out","distance":3,"greedy":14,"wrong":true}],"wrong":6,"pairs":8},"random":{"pairs":1000,"greedyAbove":576,"greedyBelow":0,"meanExcess":0.928},"verdict":"Greedy is wrong on 6 of 8 lesson pairs (right on both classic pairs, 6 of 6 sentence pairs wrong) and too high on 576 of 1000 random pairs; it was never below the true distance (0 times)."},"timing":{"about":"Wall time in Node v25.2.1 on this machine only (13th Gen Intel(R) Core(TM) i7-13700KF, win32), one process at below-normal priority, median of 3 or 5 runs, in milliseconds per call (table and memo averaged over 100 calls). Another machine gives other times; the call and cell counts do not change.","rows":[{"a":"kitten","b":"sitting","tableMs":0.0023,"memoMs":0.0059,"naiveMs":1.0652},{"a":"intention","b":"execution","tableMs":0.0041,"memoMs":0.0021,"naiveMs":10.6411},{"a":"check the tide table first","b":"check the tide tables first","tableMs":0.0159,"memoMs":0.0214,"naiveMs":null},{"a":"halve the beach","b":"half the beach","tableMs":0.0076,"memoMs":0.0079,"naiveMs":null},{"a":"knock on every shell","b":"knock on each shell","tableMs":0.0141,"memoMs":0.0136,"naiveMs":null},{"a":"low tide is at noon","b":"the low tide is at noon","tableMs":0.0151,"memoMs":0.0156,"naiveMs":null},{"a":"write it down once","b":"write it down, once","tableMs":0.0069,"memoMs":0.007,"naiveMs":null},{"a":"remember what you worked out","b":"remember what we worked out","tableMs":0.0147,"memoMs":0.0165,"naiveMs":null}]},"film":{"about":"What the film draws (the tide tables: work each entry out once, then read it back). tables: the full table D and the choice per cell for kitten and sitting, intention and execution, and one of the guides' sentence pairs, with the traceback's alignment. effort: for the pairs the naive recursion ran on, its calls against the table's cells.","tables":[{"a":"kitten","b":"sitting","distance":3,"D":[[0,1,2,3,4,5,6,7],[1,1,2,3,4,5,6,7],[2,2,1,2,3,4,5,6],[3,3,2,1,2,3,4,5],[4,4,3,2,1,2,3,4],[5,5,4,3,2,2,3,4],[6,6,5,4,3,3,2,3]],"choice":[["start","insert","insert","insert","insert","insert","insert","insert"],["delete","substitute","substitute","substitute","substitute","substitute","substitute","substitute"],["delete","substitute","match","insert","insert","match","insert","insert"],["delete","substitute","delete","match","match","insert","insert","insert"],["delete","substitute","delete","match","match","insert","insert","insert"],["delete","substitute","delete","delete","delete","substitute","substitute","substitute"],["delete","substitute","delete","delete","delete","substitute","match","insert"]],"alignment":{"ops":[{"op":"substitute","i":0,"j":0,"from":"k","to":"s"},{"op":"match","i":1,"j":1,"from":"i","to":"i"},{"op":"match","i":2,"j":2,"from":"t","to":"t"},{"op":"match","i":3,"j":3,"from":"t","to":"t"},{"op":"substitute","i":4,"j":4,"from":"e","to":"i"},{"op":"match","i":5,"j":5,"from":"n","to":"n"},{"op":"insert","i":6,"j":6,"from":"","to":"g"}],"top":"kitten-","bottom":"sitting","marks":"s   s i","cost":3}},{"a":"intention","b":"execution","distance":5,"D":[[0,1,2,3,4,5,6,7,8,9],[1,1,2,3,4,5,6,6,7,8],[2,2,2,3,4,5,6,7,7,7],[3,3,3,3,4,5,5,6,7,8],[4,3,4,3,4,5,6,6,7,8],[5,4,4,4,4,5,6,7,7,7],[6,5,5,5,5,5,5,6,7,8],[7,6,6,6,6,6,6,5,6,7],[8,7,7,7,7,7,7,6,5,6],[9,8,8,8,8,8,8,7,6,5]],"choice":[["start","insert","insert","insert","insert","insert","insert","insert","insert","insert"],["delete","substitute","substitute","substitute","substitute","substitute","substitute","match","insert","insert"],["delete","substitute","substitute","substitute","substitute","substitute","substitute","substitute","substitute","match"],["delete","substitute","substitute","substitute","substitute","substitute","match","insert","insert","substitute"],["delete","match","substitute","match","substitute","substitute","substitute","substitute","substitute","substitute"],["delete","delete","substitute","delete","substitute","substitute","substitute","substitute","substitute","match"],["delete","delete","substitute","substitute","substitute","substitute","match","insert","insert","substitute"],["delete","delete","substitute","substitute","substitute","substitute","substitute","match","insert","insert"],["delete","delete","substitute","substitute","substitute","substitute","substitute","delete","match","insert"],["delete","delete","substitute","substitute","substitute","substitute","substitute","delete","delete","match"]],"alignment":{"ops":[{"op":"substitute","i":0,"j":0,"from":"i","to":"e"},{"op":"substitute","i":1,"j":1,"from":"n","to":"x"},{"op":"substitute","i":2,"j":2,"from":"t","to":"e"},{"op":"substitute","i":3,"j":3,"from":"e","to":"c"},{"op":"substitute","i":4,"j":4,"from":"n","to":"u"},{"op":"match","i":5,"j":5,"from":"t","to":"t"},{"op":"match","i":6,"j":6,"from":"i","to":"i"},{"op":"match","i":7,"j":7,"from":"o","to":"o"},{"op":"match","i":8,"j":8,"from":"n","to":"n"}],"top":"intention","bottom":"execution","marks":"sssss    ","cost":5}},{"a":"halve the beach","b":"half the beach","distance":2,"D":[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],[1,0,1,2,3,4,5,6,7,8,9,10,11,12,13],[2,1,0,1,2,3,4,5,6,7,8,9,10,11,12],[3,2,1,0,1,2,3,4,5,6,7,8,9,10,11],[4,3,2,1,1,2,3,4,5,6,7,8,9,10,11],[5,4,3,2,2,2,3,4,4,5,6,7,8,9,10],[6,5,4,3,3,2,3,4,5,4,5,6,7,8,9],[7,6,5,4,4,3,2,3,4,5,5,6,7,8,9],[8,7,6,5,5,4,3,2,3,4,5,6,7,8,8],[9,8,7,6,6,5,4,3,2,3,4,5,6,7,8],[10,9,8,7,7,6,5,4,3,2,3,4,5,6,7],[11,10,9,8,8,7,6,5,4,3,2,3,4,5,6],[12,11,10,9,9,8,7,6,5,4,3,2,3,4,5],[13,12,11,10,10,9,8,7,6,5,4,3,2,3,4],[14,13,12,11,11,10,9,8,7,6,5,4,3,2,3],[15,14,13,12,12,11,10,9,8,7,6,5,4,3,2]],"choice":[["start","insert","insert","insert","insert","insert","insert","insert","insert","insert","insert","insert","insert","insert","insert"],["delete","match","insert","insert","insert","insert","insert","match","insert","insert","insert","insert","insert","insert","match"],["delete","delete","match","insert","insert","insert","insert","insert","insert","insert","insert","insert","match","insert","insert"],["delete","delete","delete","match","insert","insert","insert","insert","insert","insert","insert","insert","insert","insert","insert"],["delete","delete","delete","delete","substitute","substitute","substitute","substitute","substitute","substitute","substitute","substitute","substitute","substitute","substitute"],["delete","delete","delete","delete","substitute","substitute","substitute","substitute","match","insert","insert","match","insert","insert","insert"],["delete","delete","delete","delete","substitute","match","substitute","substitute","substitute","match","insert","insert","insert","insert","insert"],["delete","delete","delete","delete","substitute","delete","match","insert","insert","delete","substitute","substitute","substitute","substitute","substitute"],["delete","match","delete","delete","substitute","delete","delete","match","insert","insert","insert","substitute","substitute","substitute","match"],["delete","delete","delete","delete","substitute","delete","delete","delete","match","insert","insert","match","insert","insert","insert"],["delete","delete","delete","delete","substitute","match","delete","delete","delete","match","insert","insert","insert","insert","insert"],["delete","delete","delete","delete","substitute","delete","delete","delete","delete","delete","match","insert","insert","insert","insert"],["delete","delete","delete","delete","substitute","delete","delete","delete","match","delete","delete","match","insert","insert","insert"],["delete","delete","match","delete","substitute","delete","delete","delete","delete","delete","delete","delete","match","insert","insert"],["delete","delete","delete","delete","substitute","delete","delete","delete","delete","delete","delete","delete","delete","match","insert"],["delete","match","delete","delete","substitute","delete","delete","match","delete","delete","delete","delete","delete","delete","match"]],"alignment":{"ops":[{"op":"match","i":0,"j":0,"from":"h","to":"h"},{"op":"match","i":1,"j":1,"from":"a","to":"a"},{"op":"match","i":2,"j":2,"from":"l","to":"l"},{"op":"delete","i":3,"j":3,"from":"v","to":""},{"op":"substitute","i":4,"j":3,"from":"e","to":"f"},{"op":"match","i":5,"j":4,"from":" ","to":" "},{"op":"match","i":6,"j":5,"from":"t","to":"t"},{"op":"match","i":7,"j":6,"from":"h","to":"h"},{"op":"match","i":8,"j":7,"from":"e","to":"e"},{"op":"match","i":9,"j":8,"from":" ","to":" "},{"op":"match","i":10,"j":9,"from":"b","to":"b"},{"op":"match","i":11,"j":10,"from":"e","to":"e"},{"op":"match","i":12,"j":11,"from":"a","to":"a"},{"op":"match","i":13,"j":12,"from":"c","to":"c"},{"op":"match","i":14,"j":13,"from":"h","to":"h"}],"top":"halve the beach","bottom":"hal-f the beach","marks":"   ds          ","cost":2}}],"effort":[{"a":"kitten","b":"sitting","naiveCalls":29737,"cells":56},{"a":"intention","b":"execution","naiveCalls":2193844,"cells":100}]},"table":{"about":"The table's cost: (m + 1)(n + 1) cells, each from three neighbours, for every lesson pair; the memoised recursion works out the same number of cells (when both strings have letters) and the step form takes one step per cell (editdistance.test.mjs).","rows":[{"a":"kitten","b":"sitting","cells":56,"memoComputed":56,"equal":true},{"a":"intention","b":"execution","cells":100,"memoComputed":100,"equal":true},{"a":"check the tide table first","b":"check the tide tables first","cells":756,"memoComputed":756,"equal":true},{"a":"halve the beach","b":"half the beach","cells":240,"memoComputed":240,"equal":true},{"a":"knock on every shell","b":"knock on each shell","cells":420,"memoComputed":420,"equal":true},{"a":"low tide is at noon","b":"the low tide is at noon","cells":480,"memoComputed":480,"equal":true},{"a":"write it down once","b":"write it down, once","cells":380,"memoComputed":380,"equal":true},{"a":"remember what you worked out","b":"remember what we worked out","cells":812,"memoComputed":812,"equal":true}]},"cost":{"about":"Milliseconds this fill spent in each part (this machine only), and the fill's wall time in seconds.","totals":{"table":1.3107,"memo":0.4856,"naive":13360.1896,"bfs":45.2312},"fillSeconds":13.621},"seconds":13.6}
