Re: Getting stuck with finding an elegant solution without global variables

• To: mathgroup at smc.vnet.net
• Subject: [mg124821] Re: Getting stuck with finding an elegant solution without global variables
• From: "Oleksandr Rasputinov" <oleksandr_rasputinov at ymail.com>
• Date: Wed, 8 Feb 2012 05:31:10 -0500 (EST)
• Delivered-to: l-mathgroup@mail-archive0.wolfram.com

```On Tue, 07 Feb 2012 09:08:28 -0000, Fredob <fredrik.doberl at gmail.com>
wrote:

> Hi,
>
> I am trying to find an elegant solution, i.e. without a global
> variable to the following problem:
>
> Given a list, e.g. {1,2,3,4}, create a new list where each element is
> a function of the "i th" element and the rest of the list, e.g.
>
> Branch[Elem_, List_] := Elem + Cases[List, Except[Elem]]
>
> The the result would be {{3, 4, 5}, {3, 5, 6}, {4, 5, 7}, {5, 6, 7}}
>
> I have used Map[f, List] but then I have to use a global variable in f
> to access the list itself, e.g. BranchG[Elem_] := Elem + Cases[List,
> Except[Elem]]
>

It seems to me that you are asking not for elegant solutions per se, but
rather for solutions in a pure functional style. As such I assume that it
is not so much global variables that you wish to avoid using as any
user-defined named symbols (variables) at all. Actually, the clearest way
to accomplish this (in my opinion) is indeed to use Map:

Function[{f, lst},
Through[f[Part, Delete][lst, #]] & /@ Range@Length[lst]
][Plus, {1, 2, 3, 4}]

{{3, 4, 5}, {3, 5, 6}, {4, 5, 7}, {5, 6, 7}}

Obviously other functions can be used as well, such as Times:

Function[{f, lst},
Through[f[Part, Delete][lst, #]] & /@ Range@Length[lst]
][Times, {1, 2, 3, 4}]

{{2, 3, 4}, {2, 6, 8}, {3, 6, 12}, {4, 8, 12}}

Or we can return a closure over the list, leaving f unspecified until
later:

In :=
Function[lst,
Function[f,
Through[f[Part, Delete][lst, #]] & /@ Range@Length[lst] // Evaluate
]
][{1, 2, 3, 4}]

Out =
Function[f\$,
{f\$[1, {2, 3, 4}], f\$[2, {1, 3, 4}],
f\$[3, {1, 2, 4}], f\$[4, {1, 2, 3}]}
]

In :=
%[Plus]

Out =
{{3, 4, 5}, {3, 5, 6}, {4, 5, 7}, {5, 6, 7}}

And just for fun here is one without Map:

Function[{f, lst},
Range@Length[lst] // Function[idx,
Through[f[Part, Delete][lst, idx]],
Listable
]
][Plus, {1, 2, 3, 4}]

{{3, 4, 5}, {3, 5, 6}, {4, 5, 7}, {5, 6, 7}}

Although it is not so important here as we have not employed any
user-defined symbols in the above, I would caution you against using
symbol names starting with capital letters. Especially names like List,
which are already in use for fundamental Mathematica language constructs.

```

• Prev by Date: Re: Input cells destroy Grids?