With
diag 7
1 0 0 0 0 0
0 2 0 0 0 0
0 0 3 0 0 0
0 0 0 4 0 0
0 0 0 0 5 0
0 0 0 0 0 6
one could have a fill = first item, also in the upper triangle:
({~ d...@#) '*abcdef'
a*****
*b****
**c***
***d**
****e*
*****f
diag=: {.~&....@}.@i.
R.E. Boss
> -----Oorspronkelijk bericht-----
> Van: [email protected] [mailto:programming-
> [email protected]] Namens Gilles Kirouac
> Verzonden: donderdag 23 april 2009 17:43
> Aan: Programming forum
> Onderwerp: Re: [Jprogramming] diagonal arrays
>
>
> I just read this thread of last October.
>
> The following phrase based on Take is type independent, accepts
> duplicates and fill elements. It does not "manipulate" data with
> * or /: or move it around with $ . It also handles an empty argument.
> Concise enough? a matter of compromise.
>
> diagonal =: ( {."_1~ -@:>:@:i.@:# )
>
> diagonal 99 1x1 0 _1j1 99
> 99 0 0 0 0
> 0 2.71828 0 0 0
> 0 0 0 0 0
> 0 0 0 _1j1 0
> 0 0 0 0 99
>
> <diagonal 'a b c d ' NB. suitable for text-diamond 2009/04/17
> +--------+
> |a |
> | |
> | b |
> | |
> | c |
> | |
> | d |
> | |
> +--------+
>
> diagonal (<s: ' tra'),<"0] 99 1x1 0 _1j1 99
> +----+--+-------+-+----+--+
> |`tra| | | | | |
> +----+--+-------+-+----+--+
> | |99| | | | |
> +----+--+-------+-+----+--+
> | | |2.71828| | | |
> +----+--+-------+-+----+--+
> | | | |0| | |
> +----+--+-------+-+----+--+
> | | | | |_1j1| |
> +----+--+-------+-+----+--+
> | | | | | |99|
> +----+--+-------+-+----+--+
>
> diagonal a:,3#<+`-
> ++-----+-----+-----+
> || | | |
> ++-----+-----+-----+
> ||+-+-+| | |
> |||+|-|| | |
> ||+-+-+| | |
> ++-----+-----+-----+
> || |+-+-+| |
> || ||+|-|| |
> || |+-+-+| |
> ++-----+-----+-----+
> || | |+-+-+|
> || | ||+|-||
> || | |+-+-+|
> ++-----+-----+-----+
>
> $diagonal ''
> 0 0
>
> The lower triangle can be filled with a constant fill atom
> (type dependent):
>
> ( {.!.'.'"_1~ -@:>:@:i.@:# )'abcdef'
> a
> .b
> ..c
> ...d
> ....e
> .....f
> or with a variable fill atom (but not tacitly in this form I think):
> '*'( 4 : '(->:i.# y) {.!.x "_1 y' ) 'abcdef'
> a
> *b
> **c
> ***d
> ****e
> *****f
>
> ~ Gilles
>
> ---------- Original Message -----------
> From: "Raul Miller" <[email protected]>
> To: "Programming forum" <[email protected]>
> Sent: Sat, 11 Oct 2008 14:40:18 -0400
> Subject: [Jprogramming] diagonal arrays
>
> > Given a vector, put it on the diagonal of an array:
> >
> > (<0 1)&|:inv 2 7 9 20
> > |index error
> > (+/ .*(e.(<0 1 2 )&|:)@i.@(3##)) 2 7 9 20
> > 2 0 0 0
> > 0 7 0 0
> > 0 0 9 0
> > 0 0 0 20
> > (, $~ 2##)@(,"0 1*&0)2 7 9 20
> > 2 0 0 0
> > 0 7 0 0
> > 0 0 9 0
> > 0 0 0 20
> >
> > Are there more concise approaches, that work?
> >
> > Thanks,
> >
> > --
> > Raul
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
> ------- End of Original Message -------
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm