APL Notes: Array aesthetics
  1. 2d coordinates of a 5‿5 array
  2. 2d chars from an array of strings
  3. string of ASCII NUL bytes
  4. string of non-ASCII

Overall, the APLs and to a lesser extent J have output that seems to favor use in a textual UI - to the point of losing clarity during development. K and Kap take the opposite extreme of having output that's maximally clear to the developer and not minding that any UI will need something else. BQN falls slightly short when it comes to developer-friendly output, but compensates with cleaner output in normal cases.

2d coordinates of a 5‿5 array

K's output emphasizes the wrong pairs (0;0, the last and first element of adjacent arrays), is quite noisy, doesn't use horizontal alignment, and even elids output at the right margin. On the other hand, K's output can be read directly back into K as data, and it seems relatively human-readable at higher dimensions or much more data, compared to BQN where I'll print an array, get an entire screen of whitespace, then fall back to looking at the array's shape and picking at it, rather than trying to see it.

BQN's output is relatively airy, though it it doesn't hurt so much with larger elements. The output can't be read back as valid BQN due to the implicit stranding, but is still easier to massage into valid data if necessary since it uses ⟨ ... ⟩ instead of line-drawing characters.

GNU APL's output is very clean, but too subtle on larger and deeper arrays. Ivy is in the same boat starting at 3d arrays.

   ↕5‿5  # BQN
┌─                                         
╵ ⟨ 0 0 ⟩ ⟨ 0 1 ⟩ ⟨ 0 2 ⟩ ⟨ 0 3 ⟩ ⟨ 0 4 ⟩  
  ⟨ 1 0 ⟩ ⟨ 1 1 ⟩ ⟨ 1 2 ⟩ ⟨ 1 3 ⟩ ⟨ 1 4 ⟩  
  ⟨ 2 0 ⟩ ⟨ 2 1 ⟩ ⟨ 2 2 ⟩ ⟨ 2 3 ⟩ ⟨ 2 4 ⟩  
  ⟨ 3 0 ⟩ ⟨ 3 1 ⟩ ⟨ 3 2 ⟩ ⟨ 3 3 ⟩ ⟨ 3 4 ⟩  
  ⟨ 4 0 ⟩ ⟨ 4 1 ⟩ ⟨ 4 2 ⟩ ⟨ 4 3 ⟩ ⟨ 4 4 ⟩  
                                          ┘
      ⍳5 5  ⍝ Dyalog APL
┌───┬───┬───┬───┬───┐
│1 1│1 2│1 3│1 4│1 5│
├───┼───┼───┼───┼───┤
│2 1│2 2│2 3│2 4│2 5│
├───┼───┼───┼───┼───┤
│3 1│3 2│3 3│3 4│3 5│
├───┼───┼───┼───┼───┤
│4 1│4 2│4 3│4 4│4 5│
├───┼───┼───┼───┼───┤
│5 1│5 2│5 3│5 4│5 5│
└───┴───┴───┴───┴───┘
      ⍳5 5  ⍝ GNU APL
 1 1  1 2  1 3  1 4  1 5 
 2 1  2 2  2 3  2 4  2 5 
 3 1  3 2  3 3  3 4  3 5 
 4 1  4 2  4 3  4 4  4 5 
 5 1  5 2  5 3  5 4  5 5
iota 5 5  # ivy
(1 1) (1 2) (1 3) (1 4) (1 5)
(2 1) (2 2) (2 3) (2 4) (2 5)
(3 1) (3 2) (3 3) (3 4) (3 5)
(4 1) (4 2) (4 3) (4 4) (4 5)
(5 1) (5 2) (5 3) (5 4) (5 5)
   <@,"0/~ i.5  NB. J
┌───┬───┬───┬───┬───┐
│0 0│0 1│0 2│0 3│0 4│
├───┼───┼───┼───┼───┤
│1 0│1 1│1 2│1 3│1 4│
├───┼───┼───┼───┼───┤
│2 0│2 1│2 2│2 3│2 4│
├───┼───┼───┼───┼───┤
│3 0│3 1│3 2│3 3│3 4│
├───┼───┼───┼───┼───┤
│4 0│4 1│4 2│4 3│4 4│
└───┴───┴───┴───┴───┘
 5 5#+!5 5  /ngn/k
((0 0;0 1;0 2;0 3;0 4)
 (1 0;1 1;1 2;1 3;1 4)
 (2 0;2 1;2 2;2 3;2 4)
 (3 0;3 1;3 2;3 3;3 4)
 (4 0;4 1;4 2;4 3;4 4))
⊢ ⍳5 5  ⍝ Kap
┌→────────────────────────────┐
↓┌→──┐ ┌→──┐ ┌→──┐ ┌→──┐ ┌→──┐│
││0 0│ │0 1│ │0 2│ │0 3│ │0 4││
│└───┘ └───┘ └───┘ └───┘ └───┘│
│┌→──┐ ┌→──┐ ┌→──┐ ┌→──┐ ┌→──┐│
││1 0│ │1 1│ │1 2│ │1 3│ │1 4││
│└───┘ └───┘ └───┘ └───┘ └───┘│
│┌→──┐ ┌→──┐ ┌→──┐ ┌→──┐ ┌→──┐│
││2 0│ │2 1│ │2 2│ │2 3│ │2 4││
│└───┘ └───┘ └───┘ └───┘ └───┘│
│┌→──┐ ┌→──┐ ┌→──┐ ┌→──┐ ┌→──┐│
││3 0│ │3 1│ │3 2│ │3 3│ │3 4││
│└───┘ └───┘ └───┘ └───┘ └───┘│
│┌→──┐ ┌→──┐ ┌→──┐ ┌→──┐ ┌→──┐│
││4 0│ │4 1│ │4 2│ │4 3│ │4 4││
│└───┘ └───┘ └───┘ └───┘ └───┘│
└─────────────────────────────┘
 flip 5 window 5 cross 5  # lil
(((0,0),(0,1),(0,2),(0,3),(0,4)),((1,0),(1,1),(1,2),(1,3),(1,4)),((2,0),(2,1),(2,2),(2,3),(2,4)),((3,0),(3,1),(3,2),(3,3),(3,4)),((4,0),(4,1),(4,2),(4,3),(4,4)))
 each row in flip 5 window 5 cross 5 show[row] end
((0,0),(0,1),(0,2),(0,3),(0,4))
((1,0),(1,1),(1,2),(1,3),(1,4))
((2,0),(2,1),(2,2),(2,3),(2,4))
((3,0),(3,1),(3,2),(3,3),(3,4))
((4,0),(4,1),(4,2),(4,3),(4,4))
(((0,0),(0,1),(0,2),(0,3),(0,4)),((1,0),(1,1),(1,2),(1,3),(1,4)),((2,0),(2,1),(2,2),(2,3),(2,4)),((3,0),(3,1),(3,2),(3,3),(3,4)),((4,0),(4,1),(4,2),(4,3),(4,4)))

2d chars from an array of strings

2d chars from an array of strings

BQN stands out as not filling out the array without more work, but it still has space as the fill. Kap stands out as filling with zeroes and having very ugly array-of-chars formatting.

   {>(⌈´≠¨𝕩)↑¨𝕩} "the sun"‿"rises in"‿"the south"  # BQN
┌─           
╵"the sun    
  rises in   
  the south" 
            ┘
      ⊃"the sun" "rises in" "the south"  ⍝ GNU APL
the sun  
rises in 
the south
   >'the sun';'rises in';'the south'  NB. J
the sun  
rises in 
the south
mix "the sun" "rises in" "the south"  # ivy
the sun  
rises in 
the south
⊢ ⊃"the sun" "rises in" "the south"  ⍝ Kap
┌→───────────────────────────────┐
↓@t @h @e @\u20 @s    @u @n  0  0│
│@r @i @s    @e @s @\u20 @i @n  0│
│@t @h @e @\u20 @s    @o @u @t @h│
└────────────────────────────────┘
 select from "the sun","rises in","the south"  # lil
+-------------+
| value       |
+-------------+
| "the sun"   |
| "rises in"  |
| "the south" |
+-------------+

string of ASCII NUL bytes

   10⥊@+0  # BQN
""
      10⍴⎕AV[1]  ⍝ GNU APL

10 rho '\x00'  # ivy

   10$0{a.  NB. J

 10#"\0"  /ngn/k
"\0\0\0\0\0\0\0\0\0\0"
⊢ 10⍴@\u0  ⍝ Kap
"␀␀␀␀␀␀␀␀␀␀"
⊢ ⊃1 10⍴@\u0
┌→────────────────────────────────────────────────┐
↓@\u0 @\u0 @\u0 @\u0 @\u0 @\u0 @\u0 @\u0 @\u0 @\u0│
└─────────────────────────────────────────────────┘

string of non-ASCII

   "тест"  # BQN
"тест"
   1⊑"тест"
'е'
      'тест'  ⍝ GNU APL
тест
      'тест'[1]
т
'тест'  # ivy
тест
'тест'[1]
т
   'тест'  NB. J
тест
   1 { 'тест'

   1 { ucp 'тест'
е
   #'тест'
8
   #ucp 'тест'
4
 "тест"  /ngn/k + kyte
0xd182d0b5d181d182
 `1:"тест"  /ngn/k
тест
⊢ "тест"  ⍝ kap
"тест"
⊢ ⍴"тест"
┌→┐
│4│
└─┘
⊢ "тест"[1]
@\u435
 "тест"  # lil
"????????"
 print["тест"]
????????