I cannot reproduce that spelling error you are getting. This suggests to me that either (a) your implementation of J (or some part of the infrastructure it relies on) is damaged, or (b) there's an illegal character hidden somewhere in your copy of that line.
That said, note that while I did try using jqt's Run > Clipboard menu option when trying to reproduce your problem, I normally run this as a script (File > New temp; paste code into the green window; File > Save in the green window; Run > Load Script also in that green window, then go back to the yellow window to try it out). Meanwhile: solitaire 0 10 14 No solution timespacex 'solitaire 0 10 14' 6.53433 41600 Thanks, -- Raul On Thu, Jun 8, 2017 at 8:37 AM, Michael Rice <[email protected]> wrote: > I've tried inputting your code in jqt several times, each time with a new > jqt terminal and keep encountering errors. Here's the last try: > > move_table=: > <:(,|."1)(#~0<*/"1)~.,/,/_3&{.\@/:~"1(,|:"2)>|:((;|.)@(1++)+/)\i.5 > > flip=: ~: (i.15)&e. > > legal_moves=: [ #~ 6 = 2 #. { > > search=:3 :0 > ((15#1) flip y) search i.0 3 > NB. x: board; y: moves > : > if. 1=+/x do. y return. end. > for_move. move_table legal_moves x do. > r=.(x flip move) search move,y > if. #r do. r return. end. > end. > i.0 3 > > solitaire=:3 :0 > path=. search y > if. #path do. path else. 'No solution' end. > |spelling error > | if. #path do. path else. 'No solution' end. > | ^ > > B/t/w, does it work for: > > solitaire 0 10 14? > > I remember you had some question about that. > > Michael > > On Thu, Jun 8, 2017 at 6:44 AM, Raul Miller <[email protected]> wrote: > >> > I've already posted code for changing a board and extracting legal moves >> > from it that satisfactorily produced a path to a win. If you like, you're >> > free to take a swing at finishing it any way you think will work. >> >> I thought I had posted a finished implementation? >> >> http://www.jsoftware.com/pipermail/programming/2017-June/047522.html >> >> solitaire 5 >> 14 9 5 >> 2 5 9 >> 3 4 5 >> 10 6 3 >> 1 3 6 >> 12 7 3 >> 13 8 4 >> 9 5 2 >> 2 4 7 >> 11 7 4 >> 6 3 1 >> 0 1 3 >> 3 4 5 >> >> If you feel there's something wrong with this approach, let me know >> and I'll see if I can wrap my head around those issues. >> >> Thanks, >> >> -- >> Raul >> >> >> On Wed, Jun 7, 2017 at 11:21 PM, Michael Rice <[email protected]> wrote: >> > @ Raul Miller >> > >> > "I guess I disagree with the model you posted here, about how to >> > implement the peg game" >> > >> > I've already posted code for changing a board and extracting legal moves >> > from it that satisfactorily produced a path to a win. If you like, you're >> > free to take a swing at finishing it any way you think will work. Here's >> my >> > Clojure code (see below) for the two remaining functions, *search* and >> > *solitaire*. >> > >> > The *recur* function calls just act as calls to the original function >> that >> > called them, and could be replaced with the name of that function and get >> > the same result. >> > >> > Search function: >> > That first *if-let* tries to pull a move off the top of the incoming >> moves >> > list. If it fails, i.e., moves was empty, it drops through to the *if* >> > statement below it where it checks the board for just one remaining peg. >> If >> > true, it returns the path to the solution. If not it checks the history >> > stack. If it's empty, it prints "No solution." Otherwise it pulls a board >> > and move-list (the move list being the rest of the moves for a previous >> > move that led to a dead-end) off the history stack, and recurs with that >> > board, its move list, the path list minus the last move added, and the >> rest >> > of the history stack. As you can see, the elements of the history stack >> are >> > lists with two sublists, one for the board, the other for its remaining >> > moves. >> > >> > If the search function gets a move, you can see for yourself what it >> does: >> > 1) create the next board >> > 2) recur(next-board, moves for next-board, move added to path, the >> current >> > board and the rest of its moves pushed onto the history stack) >> > >> > Solitaire function: >> > The board is modeled like the J code I posted. >> > The recursion is kicked off with that board, its moves, an empty vector >> to >> > accumulate the path (see note below), and an empty history stack (a >> list). >> > >> > Note: A nice feature of Clojure is using a vector instead of a list to >> > accumulate a path. An item is added to a list at its top. An item is >> added >> > to a vector at its end. Popping a list removes the first element. >> Popping a >> > vector removes the last element. Using a list to accumulate a path >> requires >> > reversing the list before printing it. Using a vector eliminates that >> > requirement. Lists are enclosed in parentheses, vectors in brackets. >> > >> > If you, or anyone else, pursues this, feel free to ask any questions you >> > might have. >> > >> > Michael >> > >> > Code (Change font to fixed-width if it doesn't come across as that. It's >> > easier to read with proper indentatation): >> > >> > (defn search >> > [board moves path history] >> > (if-let [move (when-let [s (seq moves)] (first s))] >> > (let [next-board (make-move board move)] >> > (recur next-board (find-moves next-board) (conj path move) (conj >> > history (list board (rest moves))))) >> > (if (= (reduce + 0 board) 1) >> > path >> > (if-let [backtrack (when-let [s (seq history)] (first s))] >> > (let [[board moves] backtrack] >> > (recur board moves (pop path) (rest history))) >> > "No solution.")))) >> > >> > (defn solitaire >> > ; lst: empty board location(s) >> > [lst] >> > (let [board (reduce #(assoc %1 %2 0) [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] >> > lst)] >> > (search board (find-moves board) [] ()))) >> > >> > ;user=> (solitaire '(5)) >> > ;[[0 2 5] [3 1 0] [5 4 3] [6 3 1] [0 1 3] [11 7 4] [3 4 5] [9 5 2] [13 12 >> > 11] [10 11 12] [12 8 5] [2 5 9] [14 9 5]] >> > >> > >> > >> > On Wed, Jun 7, 2017 at 3:23 PM, Raul Miller <[email protected]> >> wrote: >> > >> >> Oh... well... >> >> >> >> I guess I disagree with the model you posted here, about how to >> >> implement the peg game: I think that a spec requiring five arrays is >> >> unnecessarily redundant. >> >> >> >> That said, I did make an error in one of my posts, which I am only >> >> just now realizing: the move_table depends on the size of the board, >> >> and I didn't deal with that in my supposed general case >> >> implementation. Fortunately, the fix is straightforward, and I could >> >> post that if you wanted. >> >> >> >> Anyways... to address the complexity argument you're raising, you can >> >> have up to four hetrogenous unboxed array parameters in a recursive >> >> context in J without resorting to objects to represent them. >> >> Specifically: verbs can take one or two arguments, adverbs give you an >> >> additional argument and conjunctions another on top of that. With >> >> objects, or with boxing, you can go much higher - but that can indeed >> >> feel kludgy if you need an object or box for every recursive >> >> invocation. But you can also often rearrange things to not need so >> >> many recursive parameters. >> >> >> >> And for the peg problem, I only see three significant arrays: the >> >> board, the moves to reach that board and the list of legal moves. >> >> Recursive contexts give you a stack, allowing you to backtrack with >> >> these arrays. I'm not seeing why you need more than that? >> >> >> >> Thanks, >> >> >> >> -- >> >> Raul >> >> >> >> On Wed, Jun 7, 2017 at 2:26 PM, Michael Rice <[email protected]> >> wrote: >> >> > Thanks for the paste tip. I was unaware of that feature. >> >> > >> >> > I'm "giving up on" the peg game. I didn't think that needed >> identifying >> >> as >> >> > it's been my only focus. I think of "academic exercises" as homework, >> >> > seeking answers to which is, rightly, taboo on computer language >> >> web-sites. >> >> > >> >> > The peg game search function has five arrays it recursively >> manipulates >> >> to >> >> > a solution, three of which begin as empty, all having varying shapes, >> >> even >> >> > empty, as they pass through recursions. From what I've read in >> >> *Learning J*, >> >> > for their heterogeneous shapes they would have to be boxed to be >> passed >> >> as >> >> > a functional parameter, un-boxed inside a recursive pass to be >> altered, >> >> and >> >> > then boxed again to be passed on to the next recursion. I didn't say >> it >> >> was >> >> > impossible, just that it seemed kludgy, or, as you put it "forced." >> >> > >> >> > I spent quite a bit of time with Haskell. As a functional language >> it's >> >> > hard to beat, but some problems on which I used it I felt like I was >> >> having >> >> > to go around the block just to get next door. Why bother? >> >> > >> >> > Thanks for your input. >> >> > >> >> > >> >> > On Wed, Jun 7, 2017 at 1:11 PM, Raul Miller <[email protected]> >> >> wrote: >> >> > >> >> >> When pasting into gmail, please use "Paste and match style" to avoid >> >> >> the extra blank lines that someone at google somehow managed to work >> >> >> into the default Paste action. >> >> >> >> >> >> That said: >> >> >> >> >> >> my_empty =: }. 1 >> >> >> < my_empty >> >> >> ┌┐ >> >> >> ││ >> >> >> └┘ >> >> >> >> >> >> What you are seeing here is not an empty list of boxes but a box >> >> >> containing an empty. Or, ok, yes: "an empty box". >> >> >> >> >> >> Note also that a: is the same: >> >> >> >> >> >> a: >> >> >> ┌┐ >> >> >> ││ >> >> >> └┘ >> >> >> a: -: <}.1 >> >> >> 1 >> >> >> >> >> >> (Finally, I should perhaps note that I have no idea what problem you >> >> >> are giving up on. Usually, though, "academic exercises" - which >> >> >> typically focus more on how the goal is reached than on reaching the >> >> >> goal - tend to feel forced in J.) >> >> >> >> >> >> Thanks, >> >> >> >> >> >> -- >> >> >> Raul >> >> >> >> >> >> >> >> >> On Wed, Jun 7, 2017 at 1:03 PM, Michael Rice <[email protected]> >> >> wrote: >> >> >> > @robert therriault >> >> >> > >> >> >> > my_empty =: }. 1 >> >> >> > >> >> >> > my_empty >> >> >> > >> >> >> > >> >> >> > f my_empty >> >> >> > >> >> >> > 1 >> >> >> > >> >> >> > < my_empty >> >> >> > >> >> >> > ┌┐ >> >> >> > >> >> >> > ││ >> >> >> > >> >> >> > └┘ >> >> >> > >> >> >> > >> >> >> > An empty box? >> >> >> > >> >> >> > >> >> >> > I'm beginning to see the problem I was thinking of doing in J is >> >> >> ill-suited >> >> >> > to the language. It could be done, as it could in any computer >> >> language, >> >> >> > but the solution would be pretty kludgy. >> >> >> > >> >> >> > >> >> >> > I'll soon think of something else on which to apply J. It's already >> >> >> > invading my sleep. Going through exercises is no way to get into a >> >> >> > language. One needs a problem on which to focus it. I've been >> wanting >> >> to >> >> >> > explore cryptography more deeply, and J seems ideal for it. >> >> >> > >> >> >> > >> >> >> > Thanks to all, >> >> >> > >> >> >> > >> >> >> > Michael >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > On Wed, Jun 7, 2017 at 12:01 PM, robert therriault < >> >> >> [email protected]> >> >> >> > wrote: >> >> >> > >> >> >> >> I'm going to look at these results through the lens of Shape ($) >> >> >> >> >> >> >> >> f =: (1&,) >> >> >> >> f 2 >> >> >> >> 1 2 >> >> >> >> $ f 2 NB. shape is 2 >> >> >> >> 2 >> >> >> >> f '' >> >> >> >> 1 >> >> >> >> $ f '' NB. shape is 1 >> >> >> >> 1 >> >> >> >> empty NB. it is a verb in my environment >> >> >> >> (i.0 0)"_ >> >> >> >> f empty >> >> >> >> f empty NB. result of two verbs and no arguments is just the two >> >> verbs >> >> >> >> f empty 2 NB. this is where you expect to have a 1 returned >> >> >> >> >> >> >> >> $ f empty 2 NB. shape is 1 0 >> >> >> >> 1 0 NB. one line of no items means no display >> >> >> >> >> >> >> >> I think it is the second dimension of EMPTY as opposed to NULL >> that >> >> is >> >> >> >> tripping you up. >> >> >> >> >> >> >> >> NULL=.'' >> >> >> >> $ NULL >> >> >> >> 0 >> >> >> >> EMPTY >> >> >> >> $EMPTY >> >> >> >> 0 0 >> >> >> >> EMPTY-:empty 1 >> >> >> >> 1 >> >> >> >> >> >> >> >> In answer to your most recent question Michael, I would say just >> make >> >> >> sure >> >> >> >> that the empty list that you pass is the right shape. >> >> >> >> >> >> >> >> Cheers, bob >> >> >> >> >> >> >> >> > On Jun 7, 2017, at 8:48 AM, Raul Miller <[email protected]> >> >> >> wrote: >> >> >> >> > >> >> >> >> > empty is a verb >> >> >> >> > f is a verb >> >> >> >> > >> >> >> >> > so f empty is a verb (a hook) >> >> >> >> > >> >> >> >> > f=: 1&, >> >> >> >> > (f empty) 3 >> >> >> >> > >> >> >> >> > >> >> >> >> > >> >> >> >> > $(f empty) 3 >> >> >> >> > 3 0 >> >> >> >> > $(f empty) 5 >> >> >> >> > 5 0 >> >> >> >> > >> >> >> >> > The reasons for this are documented at >> >> >> >> > http://www.jsoftware.com/help/dictionary/dictf.htm (hooks) and >> >> >> >> > http://www.jsoftware.com/help/dictionary/d630n.htm (x m&v y). >> >> >> >> > >> >> >> >> > That said, verbs take arguments and empty is a verb - it always >> >> >> >> > produces an empty result, but only when it gets an argument. >> >> >> >> > >> >> >> >> > I hope this helps, >> >> >> >> > >> >> >> >> > -- >> >> >> >> > Raul >> >> >> >> > >> >> >> >> > >> >> >> >> > On Wed, Jun 7, 2017 at 11:39 AM, Michael Rice < >> [email protected] >> >> > >> >> >> >> wrote: >> >> >> >> >> Oops! Guess I creamed empty. Will close and regen Jqt before >> >> >> proceeding. >> >> >> >> >> >> >> >> >> >> Done! >> >> >> >> >> >> >> >> >> >> f =: (1&,) >> >> >> >> >> f 2 >> >> >> >> >> 1 2 >> >> >> >> >> f empty >> >> >> >> >> f empty >> >> >> >> >> >> >> >> >> >> Shouldn't it have returned >> >> >> >> >> >> >> >> >> >> 1 >> >> >> >> >> >> >> >> >> >> ? >> >> >> >> >> >> >> >> >> >> On Wed, Jun 7, 2017 at 11:22 AM, robert therriault < >> >> >> >> [email protected]> >> >> >> >> >> wrote: >> >> >> >> >> >> >> >> >> >>> One thing to remember is that empty is already defined as a >> verb >> >> >> >> >>> >> >> >> >> >>> empty >> >> >> >> >>> (i.0 0)"_ >> >> >> >> >>> >> >> >> >> >>> So if you overwrite this you may break some code if you have >> >> >> previously >> >> >> >> >>> relied on the existing verb definition. >> >> >> >> >>> >> >> >> >> >>> I think along the lines that Pascal mentioned that null could >> be >> >> >> >> similarly >> >> >> >> >>> defined as >> >> >> >> >>> >> >> >> >> >>> null NB. check that it is not already used >> >> >> >> >>> |value error: null >> >> >> >> >>> null=:(i.0)"_ >> >> >> >> >>> NULL NB. check that it is not already used - uppercase for >> >> global >> >> >> >> >>> nouns is a convention I like and is often seen in J code >> >> >> >> >>> |value error: NULL >> >> >> >> >>> NULL=:'' NB. I use this as the null string (same as what >> John >> >> >> >> suggested) >> >> >> >> >>> NULL-:null 2 NB. any argument produces NULL from null >> >> >> >> >>> 1 >> >> >> >> >>> >> >> >> >> >>> Hope this helps, >> >> >> >> >>> >> >> >> >> >>> Cheers, bob >> >> >> >> >>> >> >> >> >> >>>> On Jun 7, 2017, at 8:09 AM, 'Jon Hough' via Programming < >> >> >> >> >>> [email protected]> wrote: >> >> >> >> >>>> >> >> >> >> >>>> >> >> >> >> >>>> I may be wrong in doing this, but I usually write >> >> >> >> >>>> empty=: '' >> >> >> >> >>>> to signify an empty list, array, matrix etc. >> >> >> >> >>>> >> >> >> >> >>>> >> >> >> >> >>>> On Jun 7, 2017, 23:59, at 23:59, Michael Rice < >> >> [email protected] >> >> >> > >> >> >> >> >>> wrote: >> >> >> >> >>>>> Is there a special "noun" for an empty list? >> >> >> >> >>>>> >> >> >> >> >>>>> Creating one seems enigmatic. >> >> >> >> >>>>> >> >> >> >> >>>>> empty =: 1 2 >> >> >> >> >>>>> empty >> >> >> >> >>>>> 1 2 >> >> >> >> >>>>> empty =: }. empty >> >> >> >> >>>>> empty >> >> >> >> >>>>> 2 >> >> >> >> >>>>> empty =: }. empty >> >> >> >> >>>>> empty >> >> >> >> >>>>> >> >> >> >> >>>>> empty1 =: >> >> >> >> >>>>> |syntax error >> >> >> >> >>>>> | empty1=: >> >> >> >> >>>>> ------------------------------ >> ------------------------------ >> >> >> >> ---------- >> >> >> >> >>>>> For information about J forums see >> http://www.jsoftware.com/ >> >> >> >> forums.htm >> >> >> >> >>>> ------------------------------------------------------------ >> >> >> >> ---------- >> >> >> >> >>>> For information about J forums see http://www.jsoftware.com/ >> >> >> >> forums.htm >> >> >> >> >>> >> >> >> >> >>> ------------------------------------------------------------ >> >> >> ---------- >> >> >> >> >>> For information about J forums see http://www.jsoftware.com/ >> >> >> forums.htm >> >> >> >> >>> >> >> >> >> >> ------------------------------------------------------------ >> >> >> ---------- >> >> >> >> >> For information about J forums see http://www.jsoftware.com/ >> >> >> forums.htm >> >> >> >> > ------------------------------------------------------------ >> >> >> ---------- >> >> >> >> > For information about J forums see http://www.jsoftware.com/ >> >> >> forums.htm >> >> >> >> >> >> >> >> ------------------------------------------------------------ >> >> ---------- >> >> >> >> For information about J forums see http://www.jsoftware.com/ >> >> forums.htm >> >> >> >> >> >> >> > ------------------------------------------------------------ >> >> ---------- >> >> >> > For information about J forums see http://www.jsoftware.com/ >> >> forums.htm >> >> >> ------------------------------------------------------------ >> ---------- >> >> >> For information about J forums see http://www.jsoftware.com/ >> forums.htm >> >> >> >> >> > ------------------------------------------------------------ >> ---------- >> >> > For information about J forums see http://www.jsoftware.com/ >> forums.htm >> >> ---------------------------------------------------------------------- >> >> For information about J forums see http://www.jsoftware.com/forums.htm >> >> >> > ---------------------------------------------------------------------- >> > For information about J forums see http://www.jsoftware.com/forums.htm >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm >> > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
