The following table shows how many presses are required to type LOW with the given number of letters per row in the layout:
5 13
6 16
7 15
8 11
9 11
10 11
11 11
12 32
13 33
14 34
15 25
16 26
17 27
18 28
19 29
20 30
21 31
22 32
23 25
24 25
25 25
26 25
So only with 8, 9, 10 or 11 letters per row does LOW take 12 or fewer presses, in fact taking 11 presses.
What about the three number words that can be typed with 12 or fewer button presses? The table below shows what number words can be typed with 12 or fewer presses for layouts with from 8 through 11 letters per row:
letters number button
/row represented presses
8 2 12
9 1 11
9 2 11
9 10 12
10 1 11
11 1 11
Only 9 letters per row allows three number words, ONE, TWO and TEN, to be spelled with 12 or fewer presses.
The program for the first table above:
DECLARE SUB enterNum ()
DECLARE SUB ProcPiece (piece$, MajorPower!)
DATA one,two,three,four,five,six,seven,eight,nine
DATA ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen
DATA eighteen,nineteen
DATA twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety
DATA thousand,million,billion,trillion,quadrillion,quintillion,sextillion
DIM SHARED unit$(19), ten$(10), major$(7)
FOR i = 1 TO 19
READ unit$(i)
NEXT
FOR i = 2 TO 9
READ ten$(i)
NEXT
FOR i = 1 TO 7
READ major$(i)
NEXT
DIM SHARED name$, num$
letPerLine = 4
alpha$ = "abcdefghijklmnopqrstuvwxyz"
FOR letPerLine = 5 TO 26
w$ = "low": GOSUB ctStrokes: PRINT letPerLine, tot
NEXT
PRINT
END
ctStrokes:
row = 0: col = 0: tot = 0
FOR i = 1 TO LEN(w$)
letNo = INSTR(alpha$, MID$(w$, i, 1)) - 1 ' zero based
IF letNo > 0 THEN
newRow = letNo \\ letPerLine
newCol = letNo MOD letPerLine
dist = ABS(newRow - row) + ABS(newCol - col) + 1
tot = tot + dist
row = newRow: col = newCol
END IF
NEXT
RETURN
SUB enterNum
DO
INPUT "Enter number:", num$
num$ = LTRIM$(RTRIM$(num$))
num = 1
FOR i = 1 TO LEN(num$)
IF INSTR("0123456789", MID$(num$, i, 1)) = 0 THEN num = 0: EXIT FOR
NEXT
IF num = 0 THEN PRINT "Must be numeric."
LOOP WHILE num = 0
END SUB
SUB ProcPiece (piece$, MajorPower)
piece = VAL(piece$)
n$ = ""
IF piece > 99 THEN
n$ = unit$(piece \\ 100) + " hundred "
piece = piece MOD 100
END IF
IF piece > 19 THEN
n$ = n$ + ten$(piece \\ 10)
piece = piece MOD 10
IF piece > 0 THEN n$ = n$ + "-": ELSE n$ = n$ + " "
END IF
IF piece > 0 THEN n$ = n$ + unit$(piece) + " "
IF n$ > "" THEN name$ = n$ + major$(MajorPower) + " " + name$
END SUB
The added code to make the second table above:
FOR letPerLine = 8 TO 11
ctFit = 0
FOR n = 1 TO 150
num$ = LTRIM$(STR$(n))
IF num$ = "0" THEN
name$ = "zero"
ELSE
name$ = ""
MajorPower = 0
DO
l = LEN(num$): IF l > 3 THEN l = 3
piece$ = RIGHT$(num$, l)
num$ = LEFT$(num$, LEN(num$) - l)
CALL ProcPiece(piece$, MajorPower)
MajorPower = MajorPower + 1
LOOP WHILE LEN(num$) > 0
END IF
w$ = name$
GOSUB ctStrokes
IF tot <= 12 THEN
ctFit = ctFit + 1
PRINT letPerLine; n; tot
END IF
NEXT
IF ctFit > 2 THEN PRINT letPerLine
NEXT letPerLine
Based on "Low numbers" by Susan Denham, Enigma No. 1508, New Scientist, 23 August 2008 |