readlayout =: 3 : 0
  d =. 1!:1 y
  d =. toJ d
  d =. cutopen d
  > d
)

slice_spec =. 1 1 ,: 3 3

step_individual =: 3 : 0
  curr =. (< 1;1) { y
  fl =. curr = '.'
  occ =. curr = '#'
  nums =. > ('#' & =) each > y
  NB. (+/ & ;) = sum . flatten
  NB. ((< 1;1) & {) = item at index 1,1
  NB. ((f g h) x) = (f x) g (h x)
  NB.
  NB. so this line sums the box and subtracts the middle value, hence getting
  NB.   the number of adjacent, filled chairs.
  adj =. ((+/ & ;) - ((< 1;1) & {)) nums
  if. fl do. '.' else.
    if. occ do.
      if. (adj >: 4) do. 'L' else. curr end.
    else.
      if. (adj = 0) do. '#' else. curr end.
    end.
  end.
)

one =: 3 : 0
  curr =. (< 1;1) { y
  fl =. curr = '.'
  occ =. curr = '#'
  adj =. ((+/&;)-((<1;1)&{))>('#'&=)each>y
  etf =. (]&'L')`(]&'#')@.(=&0)
  fte =. (]&'L')`(]&'#')@.(<&4)
  ((etf`fte@.(]&occ))`(]&'.')@.(]&fl))adj
)

step =: 3 : 0
  padded =. '.',"1('.',y,'.'),.'.'
  NB. step_individual =. (+/ & ;) - ((< 1;1) & {)
  slice_spec step_individual ;. _3 padded
)

part_one =: 3 : 0
  seats =. readlayout < y
  final =. step ^: _ seats
  counts =. > ('#' & =) each > final
  +/ ; counts
)

NB. angles =: (< 1 0) , (< 0 1) , (< 1 1) , (< 1 _1)
NB. angles =: angles , <"1 (_1 _1 *"1 > angles)
NB. the verb applied to angles above is "multiply each coordinate by -1, -1"
angles =: (, (<"1 @: (_1 _1 *"1 >))) (<1 0),(<0 1),(<1 1),(<1 _1)

NB. From here, I wasn't able to figure out how to bend J to my will enough to
NB. accomplish what I wanted to do.
NB.
NB. The struggle came in building line-of-sight vectors for each seat. My
NB. initial plan was to do it by constructing a table of each seat coordinate,
NB. then using [angles] above to draw rays out in all 8 directions, but that
NB. became pretty painful pretty quickly and I wasn't particularly having fun
NB. anymore.