Re: 1-liner wanted
- To: mathgroup at smc.vnet.net
- Subject: [mg121676] Re: 1-liner wanted
- From: "Oleksandr Rasputinov" <oleksandr_rasputinov at hmamail.com>
- Date: Sun, 25 Sep 2011 05:42:13 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <j5hdfe$7j5$1@smc.vnet.net>
On Fri, 23 Sep 2011 08:45:50 +0100, Kent Holing <KHO at statoil.com> wrote:
> Let's assume we have a list of elements of the type {x,y,z} for x, y and
> z integers. And, if needed we assume x < y < z. We also assume that the
> list contains at least 3 such triples.
>
> Can Mathematica easily solve the following problem? To detect at least
> three elements from the list of the type {a,b,.}, {b,c,.} and {a,c,.}? I
> am more intereseted in an elegant 1-liner than computational efficient
> solutions.
>
> Example:
> Givenlist ={1,2,3},{2,4,5],{6,7,8},{1,4,6},{7,8,9},{11,12,13}};
> should return
> {{1,2,3},{2,4,5},{1,4,6}}
>
> Kent Holing,
> Norway
>
The following is a brute-force approach; while short and easy to
understand it is far from computationally efficent. As the concept of a
line of code is not very well defined in Mathematica, I will leave it to
you to decide whether or not it constitutes a one-liner.
f[list_] := ReplaceList[
list,
Apply[
Alternatives,
Permutations[
{f:{a_, b_, _}, g:{b_, c_, _}, h:{a_, c_, _}},
{3}
] /. {f_, g_, h_} :> {___, f, ___, g, ___, h, ___}
] :> {f, g, h}
]
list = {
{1, 2, 3}, {2, 4, 5}, {6, 7, 8},
{1, 4, 6}, {7, 8, 9}, {11, 12, 13}
};
f[list]
gives
{{{1, 2, 3}, {2, 4, 5}, {1, 4, 6}}}
which is a list of instances of the required sequence of items. In this
case there is only one element in the list returned because there is only
one possibility for the given input. For other lists multiple matches may
be possible. Trying it on a slightly longer list:
f@RandomInteger[{0, 9}, {10, 3}]
gives
{
{{6, 0, 2}, {0, 3, 4}, {6, 3, 1}},
{{6, 8, 9}, {8, 3, 4}, {6, 3, 1}},
{{5, 6, 6}, {6, 0, 2}, {5, 0, 5}}
}
showing three possible matches for this particular input. For longer
lists, the number of matches can be rather large; there are about 1000
possibilities for a list of 100 random triples and finding them all can
take some time (over a second on my computer). If you have at most one
matching instance in any given list, or only require the first matching
instance to be returned, you might wish to substitute Replace for
ReplaceList.