Re: List processing

*To*: mathgroup at smc.vnet.net*Subject*: [mg37239] Re: List processing*From*: daiyanh at earthlink.net (Daitaro Hagihara)*Date*: Fri, 18 Oct 2002 05:16:57 -0400 (EDT)*References*: <aokbp7$afv$1@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

In article <aokbp7$afv$1 at smc.vnet.net>, John Leary <leary at paradise.net.nz> wrote: >Greetings > >This problem can be solved by conventional programming, but I wonder if >there is an elegant Mathematica solution ? > >A list contains pairs of values, with each pair representing the lower and >upper edge of a sub-range. Some of the sub-ranges partially overlap, some >fully overlap, others don't overlap at all. The problem is to produce a >second list that contains the overall upper and lower edges of the >overlapping sub-ranges. > >A simple example : {{100,200},{150,250},{120,270},{300,400}} would result >in {{100,270},{300,400}}. > >In the real case, the input list has several hundred elements and the >output list typically has five elements. > >I have a working solution based on loops, but there must be a more elegant >one. I would be very grateful for any suggestions. Block[{data = {{100,200},{150,250},{120,270}, {300,400}}}, data = Sort[data,#[[1]]<#2[[1]]&]; {{data[[1,1]], Fold[If[#<#2[[1]],#,Max[#,#2[[2]]]]&, data[[1,2]],Rest[data]]}, {Fold[If[#>#2[[2]],#,Min[#,#2[[1]]]]&, (data=Reverse@data)[[1,1]],Rest[data]], data[[1,2]]}}] --> {{100, 270}, {300, 400}} I haven't tested too extensively. The so-called "Mathematica way" is illustrated by the use of Fold function to process data, without which you must resort to conventional looping. DH