I have found in a forum the following J code that generates a Sierpinski
triangle, and am trying to understand how it works.

sierpinski =: {{ (, ((72#:~8#2){~3#.\0,],0:)@{:)^:y ,: 1 y} (>:+:y) $ 0 }}

' #'{~ sierpinski 15

#

# #

# #

# # # #

# #

# # # #

# # # #

# # # # # # # #

# #

# # # #

# # # #

# # # # # # # #

# # # #

# # # # # # # #

# # # # # # # #

# # # # # # # # # # # # # # # #


I am a J novice and what I have gathered so far is that

- {{ }} is an inline definition of a function. In this case a monadic one
with argument y.

- Calling sierpinski 15 yields a matrix with 0s and 1s making the shape of
a Sierpinski triangle.

- ' #'{~ uses the 0s and 1s in that matrix as indexes for the ' #' array,
thus converting zeros to spaces and 1s to #s.

- (>:+:y) is 2*y+1 (+: being 2* and >: being +1).

- (72#:~8#2) is a weird way of generating the first 8 digits of 72 in base
2. The digits are generated using the dyadic #: verb, with the arguments
switching sides with the ~ adverb.


The rest of the code is incomprehensible to me. In particular:

- I could not find the meaning of certain tokens using the dictionary. For
instance, what is (,? What is \0?

- This part of the program is so densely packed that I cannot even break it
into pieces: {~3#.\0,],0:)@{:)^:y


I would be very grateful if someone could help me understand this code.
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to