R.E. Boss wrote:
My 2 cents:
(>./-<./)+/\+/1 _1 *A
1
(>./-<./)+/\+/1 _1 *B
2
So A qualifies, B does not.
R.E. Boss
This doesn't address the case where both inputs have 1's in the same column
]C=:2 5 $ 1 0 0 1 0 0 1 0 1 0
1 0 0 1 0
0 1 0 1 0
(>./-<./)+/\+/1 _1 *C
1
The original statement of the problem doesn't say what to do with simultaneous 1's, but I
would think they fail the "alternating" description.
I am a total newb when it comes to J programming, though I did some APL programming in
the early 1970's. I find that what's missing from this example (and lots of other
examples of J programs) is a statement of why it is written the way it is. I find J
expressions to be wonderfully precise on *what* the expression is doing, but not *why*
the author wrote it that way. (E.g., whether it's taking advantage of some special case,
or should be studied by us newbs for its deep insights.) It often takes me a long time
to figure out what a given expression does, then I have to figure out how that
combination solves the problem at hand, and guess at why that's the best way to solve
this particular problem. For example, I love the use of "+/\" in the above to
propagate the state of the match. (Though, I worry a little about the efficiency of it,
if prefix really reapplies the verb to each of the possible prefixes, especially as the
inputs get long.) Raul Miller and especially Ma
rshall Lochbaum are wonderful exceptions in this thread, describing how their
solutions work.
In the "alternating binary array" case, it seems, to me, like what's called for is a
small finite state machine (or regular expression parser, if that's how you think). Start in a
neutral state, and move to a new state on reading a column of the input. I think there are only 4
states: TooSoonToTell, MostRecently01, MostRecently10, and Error. TooSoonToTell just moves to one
of the MostRecently states based on the input (or to Error on 1 1). The MostRecently states
transition to the other MostRecently on the "other" input, or to Error on the same input
(or on 1 1). Error just stays in Error regardless of the input. The state machine seems almost
J-friendly, since it can be represented as a matrix with rows for states and columns for inputs,
yielding a new state. I see that J *has* a Sequential Machine (dyadic :;) operator. Why isn't
that the right solution to the alternating 1's problem?
Conversely, why is it not J-like to filter out the 0 0 columns (and check for 1 1 columns while you
are there), then match successive 2x2 blocks to make sure they are all the same? Either "2 2
$ 0 1 1 0" or "2 2 $ 1 0 0 1", whichever comes first? (Or use Raul Miller's sort
trick to impose an order.) I'm sure it would take me hours to construct that expression, and maybe
I shouldn't spend the time, if that's not the J way to do things like this. Is that not J-like
because I shouldn't be thinking in terms of iterating over the input?
I'm trying to learn to think like a J programmer. Thanks for teaching me to
fish.
... peter
-----Oorspronkelijk bericht-----
Van: [email protected]
[mailto:[email protected]] Namens Linda Alvord
Verzonden: zaterdag 28 juli 2012 9:43
Aan: [email protected]
Onderwerp: Re: [Jprogramming] Determining an 'alternating' binary array
In this case the tacit version leads to a better explicit definition:
al=: 13 :'(-:((2 2$0 1 1 0)$~#))(|: y) -. 0 0'
al
[: (-: ((2 2$0 1 1 0) $~ #)) 0 0 -.~ |:
al2=: 13 :'(-:(2 2$0 1 1 0)$~#)0 0 -.~|:y'
al2
[: (-: ((2 2$0 1 1 0) $~ #)) 0 0 -.~ |:
Linda
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Linda Alvord
Sent: Saturday, July 28, 2012 3:14 AM
To: [email protected]
Subject: Re: [Jprogramming] Determining an 'alternating' binary array
This seems to work as well:
(|:A)-: |: A/:A
1
al=: 13 :'(-:((2 2$0 1 1 0)$~#))(|: y) -. 0 0'
al
[: (-: ((2 2$0 1 1 0) $~ #)) 0 0 -.~ |:
al A
1
al B
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Linda Alvord
Sent: Saturday, July 28, 2012 2:45 AM
To: [email protected]
Subject: Re: [Jprogramming] Determining an 'alternating' binary array
Here's an alternative to 'alternative'
]A=:2 8$ 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0
0 0 1 0 0 0 0 1
1 0 0 0 1 0 0 0
]B=:2 5$1 0 0 0 1 0 1 1 0 0
1 0 0 0 1
0 1 1 0 0
alt=: 13 :'(-:((2 2$0 1 1 0)$~#))(|: y /:y) -. 0 0'
alt
[: (-: ((2 2$0 1 1 0) $~ #)) 0 0 -.~ [: |: /:~
alt A
1
alt B
0
Linda
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Marshall
Lochbaum
Sent: Friday, July 27, 2012 11:56 AM
To: [email protected]
Subject: Re: [Jprogramming] Determining an 'alternating' binary array
Here's another option: convert the two rows into one using base 2, discard
the ones that are 0, and check if the remaining ones are 1 2 1...
I borrowed the sort in Raul's solution so that they must be in that order,
not 2 1 2... .
alternate =: (-: 1 2$~$)@:(0 -.~ #.@|:)@:/:~
Note that we don't have to convert to binary. In this case, we end up with
alternate =: (-: (0 1,:1 0)$~#)@:(0 0 -.~ |:)@:/:~
Marshall
On Fri, Jul 27, 2012 at 10:39 AM, Brian Schott
<[email protected]>wrote:
Another approach?
alternates =: [: -. 1 e. [: +/ 0 1 |."0 1 ] #"_ 1~ +./ noAnds =:
*./@(-.@(*./)) check =: noAnds *. alternates
--
(B=)
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm