Classic Computer Magazine Archive COMPUTE! ISSUE 37 / JUNE 1983 / PAGE 112

Memory Trainer
Harvey B Herman, Associate Editor

For 64, VIC, PET/CBM, Atari, TI, and Apple - this program might help you improve your memory skills. Some people, training in a similar fashion, have been able to quickly memorize random 80-digit numbers.
A provocative article, entitled "Exceptional Memory," appeared recently in American Scientist (vol. 70, no. 6, p. 607, 1982). The authors described experiments in which a person with a normal memory was trained to recall a sequence of over 80 random digits. How?
    When most people read a random sequence once, they can remember only five to nine digits, the apparent limit of short-term memory (STM).
    One might call this prodigious feat of memory (recalling 80 digits) exceptional, but the authors said that this skill may not be uncommon. Diligent practice, in one case 230 hours over 20 months, resulted in improvement in the ability to rapidly transfer information into long term memory (LTM). A "normal" memory could thereby be transformed into an "exceptional" one.
    How easy it would be to automate the task of memory training by using a computer. Consequently, after reading the article, I sat down at my Commodore 8032 and wrote "Memory Trainer." Random digits are flashed on the screen at a specified rate, rather than being read to the subject. If the sequence is repeated correctly, the next sequence of digits is increased by one. When an error is made, the length of the sequence decreases by one. The subject can stop the experiment at any point, whereupon the maximum number length achieved is displayed.


Program 1: 80-Column CBM Version

100 REM MEMORY TRAINING PROGRAM
110 REM PATTERNED AFTER TECHNIQUE IN:
120 REM    "EXCEPTIONAL MEMORY" BY
130 REM    K.A. ERICSSON    AND
140 REM    W.G. CHASE
150 REM    AMERICAN SCIENTIST
160 REM    VOL 70, NO 6, PG 607, 1982.
170 REM
180 REM PROGRAM BY HARVEY B. HERMAN
190 REM
200 REM MAX 76 DIGITS
210 DIM N(76)
220 MA=0:REM MA=MAX CORRECT SCAN
230 PRINT "{CLEAR}{REV}MEMORY TRAINING PRO
    GRAM"
240 PRINT
250 INPUT "DIGIT RATE (SEC/DIG) 1{03
    LEFT}";DR
260 IF DR<.5 THEN DR=.5
270 PRINT
280 INPUT "INITIAL SEQUENCE LENGTH 5{03
    LEFT}";SL
290 IF SL<2 THEN SL=2
300 IF SL>76 THEN SL=76
310 REM MIN DIGIT RATE .5 SEC/DIG
320 REM SEQ LEN - MIN 2:MAX 76
330 PRINT:PRINT"{REV}CURRENT DIGIT SPAN{
    OFF}";SL;"{LEFT} "
340 REM FLASH GET SET AND DIGITS
350 PRINT:PRINT "{REV}GET SET{OFF}";:FOR I
    =1 TO 300:NEXT I
360 PRINT "{07 LEFT}GET SET";CHR$(7):PRINT
    "*":PRINT "{UP}";:FOR I=1 TO 1250:
     NEXT I:PRINT
370 FOR I=1 TO SL
380 N(I)=INT(RND(1)*10)
390 T=TI
400 PRINT "{UP}{REV}";N(I);"{OFF}";:FOR J=
    1 TO 100:NEXT J
410 PRINT "{03 LEFT}";N(I)
420 IF TI<T+DR*60 THEN 420
430 NEXT I
440 PRINT "{UP} ";
450 PRINT:PRINT "INPUT DIGITS":FL=0
460 PRINT "                                ~
              ";
470 PRINT "                                ~
           ":INPUT "{02 UP} *{03
    LEFT}";A$
480 IF LEN(A$)<>SL THEN FL=1:GOTO 540
490 FOR I=1 TO SL
500 IF VAL(MID$(A$,I,1)) <> N(I) THEN FL=1
    :I=SL
510 NEXT I
520 REM FL=0 - CORRECT   - INCREASES SEQ L
    EN BY ONE
530 REM FL=1 - INCORRECT - DECREASES SEQ L
    EN BY ONE
540 PRINT:IF FL=1 THEN PRINT "{REV}INCORRE
    CT{OFF} - TRY A SHORTER SPAN NEXT
    ":SL=SL-1
550 IF FL=1 THEN PRINT "                  ~
                          ";
560 IF FL=1 THEN PRINT "                  ~
                         ":PRINT "{ UP}";
570 IF FL=1 THEN FOR J=1 TO SL+1:PRINT RIG
    HT$(STR$(N(J)),1);:NEXTJ:GOT0620
580 PRINT "{REV}CORRECT{OFF} -   TRY A LON
    GER SPAN NEXT ":SL=SL+1
590 IF MA<SL-1 THEN MA=SL-1
600 PRINT "                               ~
             ";
610 PRINT                                 ~
            ":PRINT "{UP}";
620 PRINT:PRINT:INPUT "AGAIN   Y{03 LEFT}"
    ;N$:IF SL<l THEN SL=1
630 IF SL>76 THEN SL=76
640 IF LEFT$(N$,1)="Y" THEN PRINT"{HOME}{0
    5 DOWN}";:GOTO 330
650 PRINT:PRINT "HOPE YOU IMPROVED YOUR DI
    GIT SPAN":PRINT
660 PRINT "{REV}HIGHEST CORRECT DIGIT SPAN
    {OFF}";MA;"{UP}"


Program 2:
40-Column PET/CBM And 64 Version

Substitute the following lines in Program 1 to run on a
40-column PET/CBM or the Commodore 64.

470 PRINT "                                 ~
            ":INPUT "{03 UP} *{03
    LEFT}";A$
560 IF FL=1 THEN PRINT "                    ~
                         ":PRINT "{02
UP}"'
610 PRINT "                                 ~
            ":PRINT "{02 UP}";


Program 3: VIC Version
Substitute the following lines in Program 1 to run
Memory Trainer on the VIC-20.

40 GOTO 100
50 POKE 36878,8:POKE 36875,225:FOR I=1 TO
     30:NEXT I:POKE 36875,0:RETURN
230 PRINT "{CLEAR}    {REV}MEMORY TRAINER"
250 INPUT "DIG RATE(SEC/DIG) 1{03 LEFT}";
    DR
270 REM DELETE THIS LINE FROM PROGRAM 1
280 INPUT "INIT SEQ LENGTH 5{03 LEFT}";SL
360 PRINT "{07 LEFT}GET SET":GOSUB 50:PRIN
    T "*":PRINT "{UP}";:FOR I=1 TO 12
    50:NEXT I:PRINT
470 PRINT "                                ~
            ":INPUT "{04 UP} *{03
    LEFT}";A$
540 PRINT:IF FL=1 THEN PRINT "{REV}INCORRE
    CT{OFF}-TRY LESS":SL=SL-1
560 IF FL=1 THEN PRINT "                   ~
                         ":PRINT "{04
    UP}";
580 PRINT "{REV}CORRECT{OFF}-TRY MORE  ":S
    L=SL+1
610 PRINT "                               ~
            ":PRINT "{04 UP}";
640 IF LEFT$(N$,1)="Y" THEN PRINT"{HOME}{0
    4 DOWN}";:GOTO 330
650 PRINT"{CLEAR}{DOWN}":PRINT "HOPE YOU I
    MPROVED YOURDIGIT SPAN!":PRINT


Program 4: Atari Version

200 REM MAX 95 DIGITS
210 DIM N(95),A$(95),N$(3)
220 MA=0:REM MA=MAX CORRECT SPAN
230 GRAPHICS 0:PRINT "{8 SPACES}{REV}MEMO
    RY TRAINING PROGRAM{OFF}":PRINT
240 PRINT "DIGIT RATE (SEC/DIG)  1
    {2 LEFT}";:INPUT DR
250 IF DR<0.5 THEN DR=0.5
260 PRINT
280 PRINT "INITIAL SEQUENCE LENGTH
    5(2 LEFT}";:INPUT SL
290 IF SL<2 THEN SL=2
300 IF SL>95 THEN SL=95
310 REM MIN DIGIT RATE .5 SEC/DIG
320 REM SEQ LEN - MIN 2:MAX 95
330 PRINT :PRINT "{REV}CURRENT DIGIT SPAN{OFF}
     ";SL
340 REM FLASH GET SET AND DIGITS
350 POKE 752,1:PRINT :PRINT "{REV}GET SET{OFF}
    ";:FOR I=1 TO 300:NEXT I
360 PRINT "{7 LEFT}-GET SET";CHR$(253
    ):PRINT "*":PRINT "{UP}";:FOR I=
    1 TO 500:NEXT I:PRINT
370 FOR I=1 TO SL
380 N(I)=INT(RND(1)*10)
390 POKE 20,0:POKE 19,0
400 PRINT "{UP}";CHR$(N(I)+176);:FOR
     J=1 TO 100:NEXT J
410 PRINT "{LEFT}";N(I)
420 IF (PEEK(19)*256+PEEK(20))/60<DR
     THEN 420
430 NEXT I
440 PRINT "{UP}  ";
450 PRINT :PRINT "INPUT DIGITS":FL=0
460 PRINT "{96 SPACES}"
470 POKE 752,0:PRINT "{3 UP} *
    {2 LEFT};:INPUT A$
480 IF LEN(A$)<>SL THEN FL=1:GOTO 54
    0
490 FOR I=1 TO SL
500 IF VAL(A$(I,I))<>N(I) THEN FL=1:
    I=SL
510 NEXT I
520 REM FL=0 - CORRECT - INCREASES S
    EQ LEN BY ONE
530 REM FL=1 - INCORRECT - DECREASES
     SEQ LEN BY ONE
540 PRINT :IF FL=1 THEN POSITION 2,1
    4:? "{REV}INCORRECT{OFF} - TRY A SHORTER S
    PAN NEXT":SL=SL-1
550 IF FL=1 THEN PRINT "{80 SPACES}";
560 IF FL=1 THEN PRINT "{20 SPACES}":
    PRINT "{3 UP)";
570 IF FL=1 THEN FOR J=1 TO SL+1:PRI
    NT N(J);:NEXT J:GOTO 620
580 POSITION 2,14:? "{REV}CORRECT{OFF} - TRY A
     LONGER SPAN NEXT{3 SPACES}":SL=
    SL+1
590 IF MA<SL-1 THEN MA=SL-1
600 PRINT "{38 SPACES}";
610 PRINT "{56 SPACES}"
620 POSITION 2,18:? "AGAIN
    {3 SPACES}Y{2 LEFT}";:INPUT N$:I
    F SL<:1 THEN SL=1
630 IF SL?-95 THEN SL=95
640 IF N$(1,1)="Y" THEN POSITION 2,5
    :GOTO 330
650 PRINT "{UP}HOPE YOU IMPROVED YOU
    R DIGIT SPAN!"
660 PRINT :PRINT "{REV}HIGHEST CORRECT DI
    GIT SPAN{OFF} ";MA


Program 5: Apple Version

200 REM MAX 76 DIGITS
210 DIM N(76)
220 MA = 0: REM MA=MAX CORRECT SPAN
230 TEXT : HOME : INVERSE : PRINT "MEM
    ORY TRAINING PROGRAM": NORMAL
240 PRINT
250 INPUT "DIGIT RATE (1-10) ? ";DR
260 IF DR < 1 OR DR > 10 THEN 230
270 PRINT
280 INPUT "INITIAL SEQUENCE LENGTH ? "
    ;SL
290 IF SL < 2 THEN SL = 2
300 IF SL > 76 THEN SL = 76
320 REM SEQ LEN - MIN 2:MAX 76
330 PRINT : INVERSE : PRINT "CURRENT D
    IGIT SPAN";: NORMAL : PRINT " ";SL
340 REM FLASH GET SET AND DIGITS
350 PRINT : FLASH : PRINT "GET SET";: FOR
    I = 1 TO 300: NEXT I: NORMAL : HTAB
    1: PRINT "GET SET";
360 PRINT CHR$ (7): PRINT "*";: FOR I
     = 1 TO 1250: NEXT I
370 FOR I = 1 TO SL
380 N(I) = INT ( RND (1) * 10)
400 HTAB 1: INVERSE : PRINT N(I);: FOR
    J = 1 TO 100: NEXT J: NORMAL
410 HTAB 1: PRINT N(I);: IF I = SL THEN
     HTAB 1: PRINT " ";
420 FOR K = 1 TO DR * 100: NEXT K
430 NEXT I
450 PRINT : PRINT : PRINT "INPUT DIGIT
    S":FL = 0
460 PRINT "
                 ";
470 PRINT "
            "; VTAB 13: PRINT "*";: HTAB
    1: INPUT "";A$
480 IF LEN (A$) < > SL THEN FL = 1: GOTO
    540
490 FOR I = 1 TO SL
500 IF VAL ( MID$ (A$,I,1)) < > N(I)
     THEN FL = 1:I = SL
510 NEXT I
520 REM FL=0 - CORRECT - INCREASES SE
    Q LEN BY ONE
530 REM FL=1 - INCORRECT - DECREASES
    SEQ LEN BY ONE
540 IF FL = 1 THEN INVERSE : VTAB 15:
     PRINT "INCORRECT";: NORMAL : PRINT
    " - TRY A SHORTER SPAN NEXT ";SL =
    SL - 1
550 IF FL = 1 THEN PRINT "
                                 ";
560 IF FL = 1 THEN PRINT "
                              ": VTAB 1
    6
570 IF FL = 1 THEN FOR J = 1 TO SL +
    1: PRINT RIGHT$ ( STR$ (N(J)),1);
    : NEXT J: GOTO 620
580 VTAB 15: INVERSE : PRINT "CORRECT"
     ;: NORMAL : PRINT " - TRY A LONGER
      SPAN NEXT    ":SL = SL + 1
590 IF MA < SL - 1 THEN MA = SL - 1
600 PRINT "
                   ";
610 PRINT "
                   ": VTAB 18
620 HTAB 1: VTAB 19: INPUT "AGAIN (Y O
    R N) ? ";N$: VTAB 19: HTAB 18: PRINT
    "   ": IF SL < 1 THEN SL = 1
630 IF SL > 76 THEN SL = 76
640 IF LEFT$ (N$,1) = "Y" THEN VTAB
    6: GOTO 330
650 PRINT : HTAB 7: PRINT "HOPE YOU IM
    PROVED YOUR SPAN!": PRINT
660 HTAB 7: INVERSE : PRINT "HIGHEST C
    ORRECT DIGIT SPAN";: NORMAL : PRINT
    " ";MA: VTAB 23


Program 6: TI-99/4A Version

100 RANDOMIZE
110 REM MAX 90 DIGITS
120 DIM N(90)
130 MA=0
140 CALL CLEAR
150 CALL SCREEN(12)
160 FOR I=5 TO 8
170 CALL COLOR(I,14,16)
180 NEXT I
190 PRINT "{6 SPACES}MEMORY TRAINER
    "
200 FOR I=1 TO 3
210 PRINT
220 NEXT I
230 INPUT "DIGIT RATE (1-10) ? ":DR
240 IF DR<1 OR DR>10 THEN 140
250 PRINT
260 INPUT "INITIAL SEQUENCE LENGTH
    ? ":SL
270 IF SL<2 THEN SL=2
280 IF SL>90 THEN SL=90
290 PRINT
300 PRINT
310 PRINT
320 PRINT "CURRENT DIGIT SPAN "&STR
    $(SL)
330 PRINT
340 PRINT
350 IF H$<>"Y" THEN 390
360 FOR I=1 TO 6
370 PRINT
380 NEXT I
390 PRINT "get set"
400 PRINT "*"
410 FOR I=9 TO 11
420 CALL COLOR(I,10,'7)
430 NEXT I
440 FOR I=1 TO 200
450 NEXT I
460 FOR I=9 TO 11
470 CALL COLOR(I,2,1)
480 NEXT I
490 CALL SOUND(150,300,10)
500 FOR I=1 TO 200
510 NEXT I
520 FOR I=1 TO SL
530 N(I)=INT(RND*10)
540 CALL HCHAR(23,3,N(I)+48)
550 FOR J=1 TO DR*20
560 NEXT J
570 CALL HCHAR(23,3,32)
580 FOR K=1 TO 10
590 NEXT K
600 NEXT I
610 CALL HCHAR(23,3,32)
620 FL=0
630 PRINT
640 PRINT
650 IF H$<>"Y" THEN 690
660 FOR I=1 TO 4
670 PRINT
680 NEXT I
690 PRINT "INPUT DIGITS"
700 INPUT "*":A$
710 PRINT
720 PRINT
730 FOR I=1 TO 200
740 NEXT I
750 IF LEN(A$)=SL THEN 780
760 FL=1
770 GOTO 850
780 FOR I=1 TO SL
790 IF VAL(SEG$(A$,I,1))=N(I)THEN 8
    20
800 I=SL
810 FL=1
820 NEXT I
830 REM FL=0 -CORRECT- INCREASE SEQ
     LEN BY ONE
840 REM FL=1 -INCORRECT-
850 CALL CLEAR
860 IF FL=0 THEN 980
870 PRINT "INCORRECT-TRY A SHORTER
    SPAN"
880 PRINT
890 SL=SL-1
900 PRINT "YOUR RESPONSE=";A$
910 H$=""
920 FOR I=1 TO SL+1
930 H$=H$&STR$(N(I))
940 NEXT I
950 PRINT
960 PRINT "ACTUAL SEQUENCE=";H$
970 GOTO 1020
980 PRINT " CORRECT-TRY A LONGER SP
    AN"
990 SL=SL+1
1000 IF MA>=SL-1 THEN 1020
1010 MA=SL-1
1020 FOR I=1 TO 10
1030 PRINT
1040 NEXT I
1050 PRINT "{6 SPACES}AGAIN (Y OR N
     ) ? "
1060 CALL KEY(0,F,STATUS)
1070 IF STATUS=0 THEN 1060
1080 H$=CHR$(F)
1090 CALL CLEAR
1100 IF H$="N" THEN 1120
1110 GOTO 320
1120 PRINT "HOPE YOU IMPROVED YOUR
     SPAN!"
1130 FOR 1=1 TO 10
1140 PRINT
1150 NEXT I
1160 FOR 1=3 TO 4
1170 CALL COLOR(I,13,12)
1180 NEXT I
1190 PRINT "-HIGHEST CORRECT DIGIT
     SPAN-"
1200 PRINT
1210 PRINT
1220 PRINT "{ll SPACES}(";MA;")"
1230 FOR 1=1 TO 500
1240 NEXT I
1250 END


Atari Version
"Memory Trainer," Atari version. (Other versions similar.)