I guess Dan really meant:
CHARS =: ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
randomize =: fivePct`mutation}
fivePct =: 0.05 >: $ ?...@$ 0:
mutation =: CHARS&(] ,: [ {~ $...@] ?...@$ #...@[)
score =: +/@:~:"1
copy100 =: 100 $ ,:
done =: 1 - -:
initial =: CHARS ([ {~ ?...@$&#~ ) [
f =: ([ (] {~ (i. <./)@:score) randomize@:copy100@:])
(f while done initial) 'METHINKS IT IS LIKE A WEASEL'
METHINKS IT IS LIKE A WEASEL
________________________________
From: Jose Mario Quintana <[email protected]>
To: Programming forum <[email protected]>
Sent: Thursday, October 8, 2009 4:43:04 PM
Subject: Re: [Jprogramming] Limit limitation
Thanks, Devon. (I guessed you meant =: instead of -: .)
UCALPHA =: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
CHARS =: ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
randomize =: fivePct`mutation}
fivePct =: 0.05 >: $ ?...@$ 0:
mutation =: (UCALPHA,' ')&(] ,: [ {~ $...@] ?...@$ #...@[)
score =: +/@:~:"1
copy100 =: 100 $ ,:
done =: 1 - -:
initial =: CHARS ([ {~ ?...@$&#~ ) [
f =: ([ (] {~ (i. <./)@:score) randomize@:copy100@:])
(f^:done^:_: initial) 'METHINKS IT IS LIKE A WEASEL'
BACHIHKSEITPIN LIKHTALIERLUP
(f while done initial) 'METHINKS IT IS LIKE A WEASEL'
METHINKS IT IS LIKE A WEASEL
For recursive alternatives to u while v see
http://www.jsoftware.com/pipermail/general/2005-July/023272.html
________________________________
From: Devon McCormick <[email protected]>
To: Programming forum <[email protected]>
Sent: Thursday, October 8, 2009 3:11:17 PM
Subject: Re: [Jprogramming] Limit limitation
Since I long ago swiped a few of Dan's global definitions, I can tell you
UCALPHA-:'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
On Thu, Oct 8, 2009 at 1:59 PM, Jose Mario Quintana <
[email protected]> wrote:
> I hit that wall years ago; this is what I currently use instead of U^:V^:_
> in similar situations:
>
> U while V
> 0&({::)@:((U^:([`1:`(0&({::)@])) ,&< -.@:(1&({::)@:]))^:(''"_ $
> ,@:(V^:([`1:`(0&({::)@]))))^:_^:([`1:`((] ,&< 0:)@])))
>
>
> This is a modification, following a hint from Henry, of another shorter
> version of while that unfortunately had multiple instances of U or V
> resulting in generating over-sized code.
>
> By the way, what is UCALPHA?
>
>
>
>
> ________________________________
> From: Dan Bron <[email protected]>
> To: Programming Forum <[email protected]>
> Sent: Thursday, October 8, 2009 11:43:59 AM
> Subject: [Jprogramming] Limit limitation
>
> I'm seeking a stylish workaround to the a constraint on applications of
> ^:_ .
>
> The idiom ^:_ is well designed and well documented. It is one of the
> most useful tools in the J kit and has broad applicability. However,
> there are some cases where it's almost, but not quite, applicable.
>
> Consider the form f^:g^:_ where g is a conditional which determines if
> f is to be applied (again). Of course if g returns 0, then f isn't
> applied, and f^:g becomes an identity function, which means its output
> will match its input, and ^:_ will terminate. So usually ^:g^:_ acts
> as a while loop, independent of the operation of f, terminating iff g is
> 0.
>
> But now consider an f that is not one-to-one. That is, an f where two or
> more distinct inputs may produce identical outputs. Using this f in
> f^:g^:_ becomes problematic. If f receives two inputs in a row which map
> to the same output, then the loop will terminate early (that is, even if g
> is 1).
>
> Here's a recent example. I'm trying to code the "evoluationary algorithm"
> from RC http://rosettacode.org/wiki/Evolutionary_algorithm . The code I
> have so far reads [1]:
>
> CHARS =: ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
> randomize =: fivePct`mutation}
> fivePct =: 0.05 >: $ ?...@$ 0:
> mutation =: (UCALPHA,' ')&(] ,: [ {~ $...@] ?...@$ #...@[)
> score =: +/@:~:"1
> copy100 =: 100 $ ,:
> done =: 1 - -:
> initial =: CHARS ([ {~ ?...@$&#~ ) [
>
> f =: ([ (] {~ (i. <./)@:score) randomize@:copy100@:])
>
> (f^:done^:_: initial) 'METHINKS IT IS LIKE A WEASEL'
>
> The problem I'm hitting is that f here isn't deterministic. It takes a
> "parent", generates a random population, and selects the fittest member of
> that population -- which could legitimately be the original parent. Hence
> input and output are identical and f^:done^:_: terminates "early". What
> is I want is for f^:done^:_: to terminate iff done is true (that is,
> 'METHINKS IT IS LIKE A WEASEL' -: y ).
>
> Now, I understand that ^:_ is doing the right thing. I just want it to
> do a slightly different thing, and I'm asking for elegant ways to achieve
> that. I know I've hit this wall before. Has anyone else? Can you
> suggest a stylish workaround?
>
> One method I'm considering is artificially (but reversibly) changing the
> output of f at every iteration, as in defining f_new =: -.&.>@:{. ,&<
> f (that is, concatenating a boolean and negating it every iteration).
>
> -Dan
>
> [1] Bear in mind this code is still in development, and may suffer from
> problems other than the one in question.
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
--
Devon McCormick, CFA
^me^ at acm.
org is my
preferred e-mail
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm