Task: Stem-and-leaf plot







Python: from collections import namedtuple
from pprint import pprint as pp
from math import floor

Stem = namedtuple('Stem', 'data, leafdigits')

data0 = Stem((12, 127, 28, 42, 39, 113, 42, 18, 44, 118, 44, 37, 113, 124, 37,
              48, 127, 36, 29, 31, 125, 139, 131, 115, 105, 132, 104, 123, 35,
              113, 122, 42, 117, 119, 58, 109, 23, 105, 63, 27, 44, 105, 99,
              41, 128, 121, 116, 125, 32, 61, 37, 127, 29, 113, 121, 58, 114,
              126, 53, 114, 96, 25, 109, 7, 31, 141, 46, 13, 27, 43, 117, 116,
              27, 7, 68, 40, 31, 115, 124, 42, 128, 52, 71, 118, 117, 38, 27,
              106, 33, 117, 116, 111, 40, 119, 47, 105, 57, 122, 109, 124, 115,
              43, 120, 43, 27, 27, 18, 28, 48, 125, 107, 114, 34, 133, 45, 120,
              30, 127, 31, 116, 146),
             1.0)

def stemplot(stem):
    d = []
    interval = int(10**int(stem.leafdigits))
    for data in sorted(stem.data):
        data = int(floor(data))
        stm, lf = divmod(data,interval)
        d.append( (int(stm), int(lf)) )
    stems, leafs = list(zip(*d))
    stemwidth = max(len(str(x)) for x in stems)
    leafwidth = max(len(str(x)) for x in leafs)
    laststem, out = min(stems) - 1, []
    for s,l in d:
        while laststem < s:
            laststem += 1
            out.append('\n%*i |' % ( stemwidth, laststem))
        out.append(' %0*i' % (leafwidth, l))
    out.append('\n\nKey:\n Stem multiplier: %i\n X | Y  =>  %i*X+Y\n'
               % (interval, interval))
    return ''.join(out)

if __name__ == '__main__':
    print( stemplot(data0) )




Fortran:       SUBROUTINE COMBSORT(A,N)
       INTEGER A(*)	
       INTEGER N	
       INTEGER H,T	
       LOGICAL CURSE
        H = N - 1		
    1   H = MAX(1,H*10/13)	
        IF (H.EQ.9 .OR. H.EQ.10) H = 11	
        CURSE = .FALSE.		
        DO I = N - H,1,-1	
          IF (A(I) .GT. A(I + H)) THEN	
            T=A(I); A(I)=A(I+H); A(I+H)=T	
            CURSE = .TRUE.			
          END IF			
        END DO			
        IF (CURSE .OR. H.GT.1) GO TO 1	
      END SUBROUTINE COMBSORT	

      SUBROUTINE TOPIARY(A,N)	
       INTEGER A(*)		
       INTEGER N		
       INTEGER CLIP		
       PARAMETER (CLIP = 10)	
       INTEGER I1,I2,STEM	
        CALL COMBSORT(A,N)	
        STEM = A(1)/CLIP	
        I1 = 1			
        I2 = I1			
   10   I2 = I2 + 1			
        IF (I2 .GT. N) GO TO 11		
        IF (A(I2)/CLIP .EQ.STEM) GO TO 10	
Cast forth a STEM line, corresponding to elements I1:I2 - 1.
   11   WRITE (6,12) STEM,ABS(MOD(A(I1:I2 - 1),CLIP))	
   12   FORMAT (I4,"|",(100I1))		
        IF (I2 .GT. N) RETURN		
        I1 = I2				
Chug along to the next STEM value.
   13   STEM = STEM + 1			
        IF (A(I2)/CLIP.GT.STEM) GO TO 11
        GO TO 10			
      END SUBROUTINE TOPIARY	

      PROGRAM TEST
      INTEGER VALUES(121)	
      DATA VALUES/		
     o  12,127, 28, 42, 39,113, 42, 18, 44,118,	
     1  44, 37,113,124, 37, 48,127, 36, 29, 31,	
     2 125,139,131,115,105,132,104,123, 35,113,
     3 122, 42,117,119, 58,109, 23,105, 63, 27,
     4  44,105, 99, 41,128,121,116,125, 32, 61,
     5  37,127, 29,113,121, 58,114,126, 53,114,
     6  96, 25,109,  7, 31,141, 46, 13, 27, 43,
     7 117,116, 27,  7, 68, 40, 31,115,124, 42,
     8 128, 52, 71,118,117, 38, 27,106, 33,117,
     9 116,111, 40,119, 47,105, 57,122,109,124,
     o 115, 43,120, 43, 27, 27, 18, 28, 48,125,
     1 107,114, 34,133, 45,120, 30,127, 31,116,
     2 146/
        CALL TOPIARY(VALUES,121)
      END