Well, there's 18!:0, but type is a lame substitute for intent. -- Raul
On Mon, Dec 12, 2016 at 7:29 AM, 'Jon Hough' via Programming <[email protected]> wrote: > I wrote an Object Oriented implementation of a hashmap a while ago: > https://github.com/jonghough/msgpack-j/blob/master/hashmap.ijs > > It's not brilliant but I have used it for some things. > > e.g. > > hm =: '' conew 'HashMap' > set__hm (1; 'hello') > get__hm 1 > > It can also contain other hashmaps as values -- although I had to use a > horrific workaround because J has no object introspection (that I know of), so > you can't differentiate between a boxed literal and an object reference. > > -------------------------------------------- > On Mon, 12/12/16, Moon S <[email protected]> wrote: > > Subject: [Jprogramming] AoC 2016 day 10 > To: "programming" <[email protected]> > Date: Monday, December 12, 2016, 1:53 AM > > I won't lie, first I wrote that > solution in Python. It's much easier and > faster. Then the program was translated to J. The biggest > problem was that > J didn't have dictionaries. While even K has! And sparse > arrays don't > support strings or boxed values. Argh. And we are at the end > of year 2016! > Anyway, we deal with small numbers, it's quite suitable to > grow an array > when we need to insert some value there with an index a bit > greater than > the length of the array. We could also allocate some big > arrays, or just > bigger than input, or to calculate the sizes based on the > input. Well, it's > possible, yes. But pretending to deal with dictionaries > looks more pleasant > to me. So it was finally, the J solution for Day 10. > > t =: cutLF CR-.~fread '10.dat' > > 'E O B' =: 0 0 1 NB. empty value; what:Output, what:Bot > b =: 0 6$0 NB. i-th bot: [lo-what lo-index hi-what hi-index > slot1 slot2] > o =: i.0 NB. outputs, empty vector at first > > NB. first we build the bot net > 3 : 0 t > for_s. y do. s =. ' 'cut >s > if. -. 'bot'-:>{.s do. continue. end. NB. > do only bots > 'k lk hk' =.".>1 6 11{s NB. all numbers > from string > lo=.('bot'-:> 5{s){O,B > hi=.('bot'-:>10{s){O,B > if. k>:#b do. b =: b,((>:k-#b),{:$b)$0 > end. NB. expand b if needed > b =: (lo,lk,hi,hk,E,E) k}b > end. > ) > > pv =: 4 : 0 NB. pass value; x - value to set, y - pair > what,index > k=.{:y > if. O={.y do. NB. output, set value in o > if. k>:#o do. o =: o,(>:k-#o)$E end. NB. > expand o if needed > if. E~:k{o do. exit#echo 'output already set > ',"k,k{o end. > o =: x k}o > else. NB. B - bot, set 1st slot, or 2nd slot and then > propagate value > if. k>:#b do. exit#echo 'no such bot ',":k > end. > 'lw lx hw hx s1 s2' =. k{b > if. s1=E do. NB. both slots are empty, let's > set the 1st > b =: x (<k,4)}b > else. > if. s2~:E do. exit#echo 'no empty slot > ',":k,v,s1,s2 end. > b =: x (<k,5)}b > lv =. x <. s1 > hv =. x >. s1 > if. 17 61 -: lv,hv do. echo k end. NB. > part 1: catch what was asked! > lv pv 0 1{k{b > hv pv 2 3{k{b > end. > end. > ) > > NB. then we spread values > 3 : 0 t > for_s. y do. s =. ' 'cut >s > if. -. 'value'-:>{.s do. continue. end. NB. > process only values > v pv B,k [ 'v k' =.".>1 5{s > end. > ) > > echo */0 1 2{o NB. part 2: multiply outputs > > exit 0 > > It's rather long, but easy to understand, I hope. If you > remove comments > and rearrange some pieces of code, it'll be down to 720+ > chars and will fit > one screen. > > The idea of the solution was first to build the whole > network of bots, i.e. > to have them all with their connections to other bots, but > without any real > values yet; then we start to put values to the bots and > propagate those > values to other bots and to the output. Usually the puzzles > of AoC allow > such simple solutions - all the data is correct, no > conflicts, no races in > schemes, all will be perfect in the end. So such a solution > works. > > Then it comes the challenge -- to make it all J-style, all > tacit and magic > :) > Well, there's still left one explicit definition, I guess it > would've been > too complicated if it was tacit. > > The basic ideas are the same, to build the bot net and put > the values > there. On the second stage the reduce is used. J doesn't > allow arbitrary > types for '/' or an initial/state value of different type, > but here boxes > come to the rescue - we can put anything in the boxes and > work with them as > with simple values. > > t =: cutLF CR-.~fread '10.dat' > NB. verbs ----------------------------------- > onlybots =: #~ ('bot'-:3{.>)"0 > onlyvals =: #~ ('val'-:3{.>)"0 > parsebot =: [:".[:>1 4 5 8 9{[:cut('to output';'0';'to > bot';'1')rplc~> > parseval =: [:<[:".[:>1 5{[:cut > > val2out =: ([:{.])`([:<_1,5<.[:{:])`[ } NB. save value > to output = last > bots item > val2slot1 =: ([:{.])`([:<4,~[:{:])`[ } > val2slot2 =: 4 : 0 > if. 17 61 -: lh=./:~ ({.y),4{(k=.{:y){x do. echo {:y > end. NB. part 1 > answer > ((({.y)(<k,5)}x)pv({.lh),0 1{k{x)pv({:lh),2 3{k{x > NB. set slot2 and pass > both values > ) > val2bot =: val2slot2`val2slot1 @. (0=4{([:{:]){[) NB. choose > slot > pv =: val2out`val2bot @.(1{]) NB. pass value > av =: [:< ([:>]) pv 1j1 1#!.1[:>[ NB. apply value > to bots > NB. nouns ----------------------------------- > bots =: (0 0,~}.)"1 /:~ parsebot"0 onlybots t NB. get all > bots from input > vals =: parseval"0 onlyvals t > NB. get all vaules > echo */3{.{:> av/ |.(bots,0);vals > NB. apply values to bots; > part 2 output > exit 0 > > I don't know if it's really readable. Anyway it works. > > Enjoy :) > > P.S. what was interesting there: v1`v2 @. vt, v1`v2`v3 }, / > over boxes, AjB > #!.C. > > Georgiy Pruss > ---------------------------------------------------------------------- > 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
