Letter
The ruler’s edge
Norman Thomson
It is a pleasure to be able to respond my old partner in education
Ray Polivka [1] on the subject of programming
rulers. Readers may like to compare the different style of approach
which might be taken in J to this problem, which, to remind readers,
is to write a program for a ruler of length y.
with
numbers and tick marks at intervals of x.
.
First pre-define an adverb index
index=.1 : '(i.@$*x.)@]'
which identifies elements where a criterion verb such as ‘equals zero’ is met, for example:
t 0 1 0 1 0 0 1 1 1 0 1 1 (=&0)index t NB. give indices of 0s 0 0 2 0 4 5 0 0 0 9 0 0
This can be used in conjunction with the adverb amend
(}
) to provide a general purpose replacement facility,
for example:
99(=&0)index}t NB. replace 0s with 99 99 1 99 1 99 99 1 1 1 99 1 1
This is used in the final line of the verb numbers
,
which supplies the formatted numeric parts of the ruler:
numbers=.4 : 0 t=.x.*>:i.>.y.%x. NB. multiples of x.up to y. t=.|:10 10 #:t NB. digitise and transpose t=.y.{."(1)x.":t NB. put in spaced char form t=.(' '(=&'0')index}{.t),:{:t NB. blank ldng 0s ) 3 numbers 17 1 1 3 6 9 2 5
Adding the tick marks, both horizontally or vertically, is now straightforward :
rulera=.4 : 0 t=.x. numbers y. t,(y.$((<:x.)#0),1){'-^' NB. add tick marks ) rulerc=.4 : 0 t=.x. numbers y. (|:t),.(0=x.|>:i.y.){'|+' NB. add tick marks ) 3 rulera 17 1 1 3 6 9 2 5 --^--^--^--^--^-- 3 rulerc 11 | | 3+ | | 6+ | | 9+ | |
References
- “The ruler’s edge revisited”, Ray Polivka, Vector Vol.23, No.4 http://archive.vector.org.uk/art10012030