Hmm... good point.

Here's a faster version of tick:

   tock=: ((0 >. <:) + _1+i.@# #/.~@, I.@:* (] + <:) +/@:* ?@# <:@#)

Thanks,

-- 
Raul


On Wed, Jul 19, 2017 at 11:56 PM, Louis de Forcrand <ol...@bluewin.ch> wrote:
> NB. tacit
> run=: upd rec
> upd=: [ ((({~ 0{::]) + 1{::])`(0{::])`[} - 2{::]) ~.@] ; ] (+//. ; ]) 1 <: [
>
> NB. explicit
> RUN=: UPD rec
> UPD=: 4 : 0
>  b -~ x u}~ (x {~ u=. ~.y) + y +//. b=. x >: 1
> )
>
> rec=: ((] + ] >: i.@[) (?@$ <:))@#
>
>
> Slower on short vectors, faster on larger ones (j805):
>
>    1e2 ts 'tick^:1e4#~20'
> 0.0408952 3840
>    1e2 ts 'run^:1e4#~20'
> 0.0802917 4864
>    1e2 ts 'RUN^:1e4#~20'
> 0.0636084 7040
>
>    10 ts 'tick^:1e4#~100'
> 0.243663 23552
>    10 ts 'run^:1e4#~100'
> 0.12502 11904
>    10 ts 'RUN^:1e4#~100'
> 0.104644 14848
>
> Probably because of =/.
>
> Louis
>
>> On 19 Jul 2017, at 18:37, Rob Hodgkinson <rhodg...@me.com> wrote:
>>
>> Thanks Mike it formats and reads perfectly… nice job, Rob
>>
>>> On 20 Jul 2017, at 8:02 am, 'Mike Day' via Programming 
>>> <programm...@jsoftware.com> wrote:
>>>
>>> This took me much longer than a lunch-break,  partly because we
>>> were away in France,  and I was experimenting with J701 on my
>>> iPad when Liz would let me.
>>>
>>> I came up with a number of variants, of which the following is best.
>>> It's slower and uses more space than Raul's for small problem-sizes,
>>> but is perhaps better for larger problems,  eg n > 100 or so.
>>>
>>> NB. a Boolean verb for whether a player donates,  which,
>>> NB. of course, depends on whether he has any money:
>>>
>>>  donation =: 1 & <.
>>>
>>> NB. This verb lists the indexes of the random donee (? player donated to)
>>> NB. for each player,  whether of not that player CAN donate.
>>> NB. It assumes that its single argument is i.n where n is the number
>>> NB. of players,  which is why its name ends in i (!):
>>>
>>>  idoneei=:(#|(+?&.<:@#~@#))
>>>
>>> NB.  The idea is to concatenate
>>> NB.   (the old state minus donation) and (donation), namely
>>> NB.   ((-,  ])donation)
>>> NB.  and sum them as ordered with this left-hand key:
>>> NB.   (i.n) concatenated with (idonee),  namely
>>> NB.   (, idoneei)@(i.@#)
>>>
>>> NB.  Here it is,  with a fix, f.
>>>
>>> new =: ((,idoneei)@(i.@#) +//. ((-,  ])donation )) f.
>>>
>>> NB. time & space:
>>>  ts =: 6!:2 , 7!:2@]
>>>
>>> NB. where my version is ok:
>>>  ts'orig ^:5000 #~200'   NB. Xiao-Yong Jin's original suggestion
>>> 5.72563 22912
>>>  ts'tick ^:5000 #~200'   NB. Raul's revised version
>>> 1.57339 77824
>>>  ts'new ^:5000 #~200'    NB. The best I could manage
>>> 0.922963 20992
>>>
>>> NB. and where it isn't so good:
>>>  ts'orig ^:5000 #~10'  NB. Xiao-Yong Jin
>>> 0.341718 6272
>>>  ts'tick ^:5000 #~10'  NB. Raul M
>>> 0.0445439 3840
>>>  ts'new  ^:5000 #~10'  NB. Mike D
>>> 0.0676198 4864
>>>
>>> Sorry for this late posting,  but it wasn't convenient to
>>> write up and send until home and with laptop to hand.
>>>
>>> Thanks,
>>> Mike
>>>
>>> NB. prepared in notepad, copied to Thunderbird, and trying
>>> to force fixed width - hope it displays reasonably.
>>>
>>>
>>>
>>> On 11/07/2017 19:33, Devon McCormick wrote:
>>>> Reading the page referenced, I see where I was confused.  The problem
>>>> starts out as 100 people each with $100, but then solves a variant of it
>>>> for 45 people with $45 each, possibly so the animation is legible.  It's
>>>> not clear why they even mention the first set of numbers.
>>>>
>>>> On Mon, Jul 10, 2017 at 8:37 PM, Raul Miller <rauldmil...@gmail.com> wrote:
>>>>
>>>>> Oops, I did not think about that "reflexive giving" wart.
>>>>>
>>>>> Here's a fix for my version:
>>>>>
>>>>>   tick=: (0 >. <:) + i.@# +/@:(=/)~ I.@:* (] + <:) +/@:* ?@# <:@#
>>>>>   require 'stats'
>>>>>   stddev"1 tick^:(i.10) 45#45
>>>>> 0 0.977008 1.18705 1.73205 2.01133 2.15322 2.46798 2.86832 2.97719 3.1334
>>>>>   tick^:10000]20#20
>>>>> 3 20 1 15 10 38 6 8 23 24 11 90 33 67 5 13 7 20 1 5
>>>>>
>>>>> Thanks,
>>>>>
>>>>> --
>>>>> Raul
>>>>>
>>>>> On Mon, Jul 10, 2017 at 7:50 PM, 'Pascal Jasmin' via Programming
>>>>> <programm...@jsoftware.com> wrote:
>>>>>>
>>>>>> The number of $ available each round is the number of people with >&0.
>>>>> The number of potential recipients is the population.  This simplification
>>>>> though means its possible for someone to pay himself.
>>>>>>
>>>>>> A correction to your version,
>>>>>>
>>>>>> /:~@(-&1`]@.(=&0)"0 (#/.~@] + ~.@]{[)`(~.@])`[} >&0 # (?@#~@#@]`]`[} ]
>>>>> I.@:= i.@#)@?@#~@#)^:21000 #~10
>>>>>> That assumption would increase the likelihood of eventual
>>>>> "superconcntration"  but that doesn't seem to happen.
>>>>>> As soon as some have 0, the rest have a "negative return" expectation
>>>>> each turn.
>>>>>>
>>>>>> ________________________________
>>>>>>
>>>>>>
>>>>>> From: Xiao-Yong Jin <jinxiaoy...@gmail.com>
>>>>>>
>>>>>> To: "programm...@jsoftware.com" <programm...@jsoftware.com>
>>>>>>
>>>>>> Sent: Monday, July 10, 2017 3:43 PM
>>>>>>
>>>>>> Subject: [Jprogramming] Everyone giving dollars to random others
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> I thought this is a good lunch break exercise.
>>>>>>
>>>>>>
>>>>>>
>>>>>> http://www.decisionsciencenews.com/2017/06/19/counterintuitive-
>>>>> problem-everyone-room-keeps-giving-dollars-random-others-
>>>>> youll-never-guess-happens-next/
>>>>>>
>>>>>>
>>>>>> Quote: “Imagine a room full of 100 people with 100 dollars each. With
>>>>> every tick of the clock, every person with money gives a dollar to one
>>>>> randomly chosen other person. After some time progresses, how will the
>>>>> money be distributed?”
>>>>>>
>>>>>>
>>>>>> And I came up with this simulation.  (45 people with 45 dollars each,
>>>>> same as on the webpage.)
>>>>>>
>>>>>>
>>>>>> /:~@(-&1`]@.(=&0)"0 (#/.~@] + ~.@]{[)`(~.@])`[} >&0 # (?@#~@#@]`]`[} ]
>>>>> I.@:= i.@#)^:_@?@#~@#)^:5000 #~45
>>>>>>
>>>>>>
>>>>>> And I really like to see the mean expectations and the standard
>>>>> deviation of the mean, I ended up doing this.  (Make sure the J sentence 
>>>>> is
>>>>> one long line if you want to try it out.)
>>>>>>
>>>>>>
>>>>>>    ((],.[:(+/%#*<:@#)&.:*: -"1)+/%#)}.(/:~@(-&1`]@.(=&0)"0 (#/.~@] +
>>>>> ~.@]{[)`(~.@])`[} >&0 # (?@#~@#@]`]`[} 
>>>>> ]I.@:=i.@#)^:_@?@#~@#)^:10000)^:(<65)
>>>>> #~45
>>>>>>
>>>>>> 0.984375 0.124984
>>>>>>
>>>>>>
>>>>>> 2.01562 0.170335
>>>>>>
>>>>>>
>>>>>>  3.0625 0.180765
>>>>>>
>>>>>>
>>>>>> 4.15625 0.230616
>>>>>>
>>>>>>
>>>>>> 5.21875 0.248476
>>>>>>
>>>>>>
>>>>>>  6.1875 0.306894
>>>>>>
>>>>>>
>>>>>> 7.35938 0.332862
>>>>>>
>>>>>>
>>>>>> 8.64062 0.362809
>>>>>>
>>>>>>
>>>>>> 9.84375 0.380723
>>>>>>
>>>>>>
>>>>>> 10.9688 0.383805
>>>>>>
>>>>>>
>>>>>>  12.125 0.407944
>>>>>>
>>>>>>
>>>>>> 13.6406 0.423964
>>>>>>
>>>>>>
>>>>>> 15.0625 0.457453
>>>>>>
>>>>>>
>>>>>> 16.5312 0.462893
>>>>>>
>>>>>>
>>>>>> 18.1875 0.480717
>>>>>>
>>>>>>
>>>>>> 19.7031 0.464877
>>>>>>
>>>>>>
>>>>>> 21.1562 0.475709
>>>>>>
>>>>>>
>>>>>> 22.7031 0.483702
>>>>>>
>>>>>>
>>>>>> 24.4062 0.516935
>>>>>>
>>>>>>
>>>>>> 26.4062   0.5768
>>>>>>
>>>>>>
>>>>>> 28.1094 0.604266
>>>>>>
>>>>>>
>>>>>> 29.8281 0.617838
>>>>>>
>>>>>>
>>>>>>  31.875  0.61942
>>>>>>
>>>>>>
>>>>>> 33.9375 0.603345
>>>>>>
>>>>>>
>>>>>> 35.7812 0.642211
>>>>>>
>>>>>>
>>>>>> 37.9844 0.647987
>>>>>>
>>>>>>
>>>>>> 40.6562 0.731321
>>>>>>
>>>>>>
>>>>>>      43 0.739342
>>>>>>
>>>>>>
>>>>>> 45.3906 0.723616
>>>>>>
>>>>>>
>>>>>> 48.0469   0.7613
>>>>>>
>>>>>>
>>>>>> 51.6094 0.823639
>>>>>>
>>>>>>
>>>>>> 54.7656 0.873934
>>>>>>
>>>>>>
>>>>>> 57.1406 0.815544
>>>>>>
>>>>>>
>>>>>>      60 0.866598
>>>>>>
>>>>>>
>>>>>> 63.8594 0.898319
>>>>>>
>>>>>>
>>>>>>   68.75 0.918018
>>>>>>
>>>>>>
>>>>>> 73.5781  1.00736
>>>>>>
>>>>>>
>>>>>> 78.3281  1.08128
>>>>>>
>>>>>>
>>>>>> 84.9688  1.25534
>>>>>>
>>>>>>
>>>>>> 93.4688  1.29731
>>>>>>
>>>>>>
>>>>>> 104.578  1.73274
>>>>>>
>>>>>>
>>>>>> 114.922  2.07574
>>>>>>
>>>>>>
>>>>>> 131.938   2.7357
>>>>>>
>>>>>>
>>>>>> 159.359  4.40899
>>>>>>
>>>>>>
>>>>>> 204.766  7.24239
>>>>>>
>>>>>>
>>>>>>
>>>>>> So, how do I make a fancy animation (like the one in the webpage I
>>>>> linked in the beginning of this message) with J?
>>>>>>
>>>>>> ----------------------------------------------------------------------
>>>>>>
>>>>>>
>>>>>> 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
>>>>>
>>>>
>>>>
>>>
>>>
>>> ---
>>> This email has been checked for viruses by Avast antivirus software.
>>> https://www.avast.com/antivirus
>>>
>>> ----------------------------------------------------------------------
>>> 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

Reply via email to