Viktor Cerovski wrote:
>
>
> Ric Sherlock wrote:
>>
>> I saw the following thread on comp.lang.apl
>> http://groups.google.com/group/comp.lang.apl/browse_thread/thread/89c585c9d1a7bd3a#
>> and was trying to put together a (non-regex) J solution.
>>
>> Given the matrix:
>> ]A=: 'CTGGTTGAT','GTAGTCATA','CATGTCTAA','TCGAAAGTT',:'CCGGAGAAG'
>> CTGGTTGAT
>> GTAGTCATA
>> CATGTCTAA
>> TCGAAAGTT
>> CCGGAGAAG
>>
>> and the list 'TAG'
>>
>> Identify the rows of the matrix where the letters in the list occur in
>> the order they appear in the list, but not necessarily adjacent to
>> each other.
>> So the result of a verb findinRows would be:
>> A findinRows 'TAG'
>> 0 1 0 1 0
>>
>> I have an answer below but am thinking there may be other approaches I'm
>> missing
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> Spoiler alert!!
>>
>>
>>
>>
>>
>>
>> findinRows=: [: (1 e. ,@:(</))&>/ 2 (([: ($ #. ]) 4 $. [: $. </)&.>)/\
>> [: <@I."1 ="_ 0
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>>
>>
> Here is yet another solution, based on doing reduce operation.
> Let's consider:
>
> chop=.(>:@i. }. [)"1 0
>
> Now the following reduction seems to work:
>
> A
> CTGGTTGAT
> GTAGTCATA
> CATGTCTAA
> TCGAAAGTT
> CCGGAGAAG
>
> 'G' chop~ 'A' chop~ 'T' chop~ A
>
> TCATA
>
> TT
>
> Non-"empty" lines contained the ordered sequence (incl. repeated chars)
> before the reduction.
>
> The subtle caveat is that if the last char to be matched appears only as
> the
> last char of a line, it won't be recognized correctly. Thus the reduction
> is
> done for all the chars except the last one, which is looked for after the
> reduction. Altogether, the solution is:
>
> findinrows=: {:@] +./@:="0 1 (chop~R |.@}:)
>
Shorter:
findinrows1=: {:@] e."1 (chop~R |.@}:)
>
> where the reduce adverb R is defined as:
>
> R =: 1 : 0
> u/y
> :
> a=.x
> b=.y
> while.#b do.
> a=.a u~{:b
> b=.}:b
> end.
> a
> )
>
> A findinrows 'TAG'
> 0 1 0 1 0
> A findinrows 'TAA'
> 0 1 1 1 0
> A findinrows 'TAGT'
> 0 1 0 1 0
> A findinrows 'TAAG'
> 0 0 0 1 0
> A findinrows 'AAG'
> 0 0 0 1 1
> A findinrows 'A'
> 1 1 1 1 1
>
>
>
>
--
View this message in context:
http://old.nabble.com/Search-for-ordered-letters-within-lines-of-matrix-tp32287342s24193p32300948.html
Sent from the J Programming mailing list archive at Nabble.com.
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm