Here's my solution -- like Joe I also just modified earlier input to get part 2's answer.

NB. part 1
Edges=: (0 9 2 { ;:@:}:);._2 'gain' delstring ('lose ';'_') rplc~ Input
ppl=: ~. {."1 Edges
EdgesD=: /:~ Edges, |: ppl,ppl,:<'0'  NB. add diagonal elements
Tbl=: (".@>)/./ 0 2 { |: EdgesD  NB. happiness relationaship table
happPair=: +&({&Tbl)&< |.  NB. happPair 2 3
happ=: +/@:(2 happPair\ (, {.))  NB. happ i.8
smoutput happMax=: >./ happ"1 (i.@! A. i.) # Tbl

NB. part 2
Tbl=: Tbl {.~ >: 2##Tbl
happPair=: +&({&Tbl)&< |.
happ=: +/@:(2 happPair\ (, {.))
smoutput happMax=: >./ happ"1 (i.@! A. i.) # Tbl

On 14 Dec 2015, at 4:41, Moon S wrote:

So far these were simple tasks with clear algorithms, so it's interesting to play with the programs -- keep everything in verbs and be as lazy as possible (i.e. build one final function, that just gives the solution of
the task being given the data; especially funny if the functions are
tacit), or calculate whatever is possible as soon as possible.

NB. happy dinner http://adventofcode.com/day/13

m=: ' '&cut & > cutLF ('.',CR) -.~ fread {:ARGV NB. matrix of input
u=: ~. {."1 m                NB. noun: unique names = all the ppl
s=: _1 1{~'gain'-: >@:(2&{)  NB. _1 for 'lose', 1 for 'gain'
n=: ". @ > @ (3&{)           NB. numeric value
g=: 4 : 'v=.0$~2##x for_e. y do. v=. ((s*n)e) (< x i. 0 10{e) }v end. v'
NB. calc matrix
v=: u g m NB. noun: 'happiness' matrix; all data are
parsed now

h=: {&v @ < @ ,              NB. get 'happiness' for x -> y
r=: 2 h/\ ]                  NB. one way relations betrween ppl in one
combination
w=: +/@r + +/@r@|.           NB. total happiness of one combination
p=: ([ , {.)"1@(i.@! A. i.) NB. all permutation with first column appended
on the right
echo >./ w"1 p #u

h=: ({&v @ < @ ,) :: 0: NB. all missing 'happiness' values will be 0 echo >./ w"1 p >:#u NB. repeat calculation for one more (virtual)
person

exit 0

On Sun, Dec 13, 2015 at 5:07 PM, 'Pascal Jasmin' via Programming <
[email protected]> wrote:

with input on clipboard,

version that works with both parts by returning 0 for index errors. t is
the lookup table that is maybe a tad sloppy.


in =. '.' -.~leaf(0 2 3 _1 { ])@;:@}:"1  a =. > cutLF wdclippaste ''
uni =. (~. {."1 in) , <'Me'
t =. (( (,~ -)@".@(2&{::) ({~ >@('gain' -: leaf ])) 1 { ]) ; 0 3&{) "1 in
calc =. (({."1 t) {~ (}."1 t) I.@:(-:"1) ]) :: 0:
calcr =. (({."1 t) {~ (}."1 t) I.@:(-:"1) |.) :: 0:
perm =: i.@! A. i.


parts 1 and 2,

./ +/@:;@(,/)@((2 (calc , calcr)\ ]))@( uni {~  ] , {.)"1 ]  perm 8
./ +/@:;@(,/)@((2 (calc , calcr)\ ]))@( uni {~  ] , {.)"1 ]  perm 9



----- Original Message -----
From: Joe Bogner <[email protected]>
To: [email protected]
Sent: Sunday, December 13, 2015 9:47 AM
Subject: [Jprogramming] advent 13

not pretty, but here is my solution

pt2 was kind of hacky instead of rewriting the train to calculate, I
just reworked the input to add myself to it

input =: fread 'c:/joe/lang-lab/j/advent2015/day13.txt'
parsed=: ' ' cut each cutLF input

who =: {. every
sitBy =: ([: }: each {: every)
getScore=: [: (] -@]^:((<'lose') e. 0&{@[) ".@>@(1&{))"1 @: ((2,3)&{)
each ]
getChoices=: ([: (] A.~ i.@!@#) [: ~. who)

getMax=: [: (>./)&:(+/"1) (>@getScore@] {~ (who,.sitBy) i.
(],|."1@])@((2]\ ])"1)@([: ({:,])"1  getChoices))

smoutput pt1=:getMax parsed

addMe=: ((((;: 'would gain 0 happiness units sitting next to Me.')
(];[) ]) each) @ (~.&:who))
addThem=: ((((;: 'Me would gain 0 happiness units sitting next to')
([,<@]) ('.',~])) each) @ (~.&:who))

smoutput pt2=: getMax (] , (addMe,addThem)) parsed

sample=: 0 : 0
Alice would gain 54 happiness units by sitting next to Bob.
Alice would lose 79 happiness units by sitting next to Carol.
Alice would lose 2 happiness units by sitting next to David.
Bob would gain 83 happiness units by sitting next to Alice.
Bob would lose 7 happiness units by sitting next to Carol.
Bob would lose 63 happiness units by sitting next to David.
Carol would lose 62 happiness units by sitting next to Alice.
Carol would gain 60 happiness units by sitting next to Bob.
Carol would gain 55 happiness units by sitting next to David.
David would gain 46 happiness units by sitting next to Alice.
David would lose 7 happiness units by sitting next to Bob.
David would gain 41 happiness units by sitting next to Carol.
)
----------------------------------------------------------------------
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

Reply via email to