Consider a valid English word without hyphens or spaces, which is not a proper noun. Assign the values a=0, b=1, c=2, d=3, e=4, f=5, g=6, h=7, i=8 and j=9.
A date corresponding to a valid English word in consonance with the above assignment in mm/dd/yy format is called a "spell date". For example,the word "deface" generates 34/50/24 which is not a valid date in the mm/dd/yy format, and consequently not a spell date.
(A) Determine the respective first and last spell dates in the period covering January 1, 2001 to December 31, 2100 inclusively.
(B) What would have been the respective answers to (A) if the definition of a spell date involved a dd/mm/yy format instead?
DECLARE FUNCTION isWord! (w$)
CLS
MO = 1: DA = 1: ye = 2001
GOSUB greg.to.jd: jdstart = jd
MO = 12: DA = 31: ye = 2100
GOSUB greg.to.jd: jdend = jd
FOR j = jdstart TO jdend
jd = j
GOSUB jd.to.greg
mm$ = RIGHT$("0" + LTRIM$(STR$(MO)), 2)
dd$ = RIGHT$("0" + LTRIM$(STR$(DA)), 2)
yy$ = RIGHT$("0" + LTRIM$(STR$(ye MOD 100)), 2)
w$ = mm$ + dd$ + yy$
FOR i = 1 TO LEN(w$)
MID$(w$, i, 1) = MID$("abcdefghij", VAL(MID$(w$, i, 1)) + 1)
NEXT i
IF isWord(w$) THEN
PRINT mm$; "/"; dd$; "/"; yy$, w$
END IF
NEXT
PRINT
FOR j = jdstart TO jdend
jd = j
GOSUB jd.to.greg
mm$ = RIGHT$("0" + LTRIM$(STR$(MO)), 2)
dd$ = RIGHT$("0" + LTRIM$(STR$(DA)), 2)
yy$ = RIGHT$("0" + LTRIM$(STR$(ye MOD 100)), 2)
w$ = dd$ + mm$ + yy$
FOR i = 1 TO LEN(w$)
MID$(w$, i, 1) = MID$("abcdefghij", VAL(MID$(w$, i, 1)) + 1)
NEXT i
IF isWord(w$) THEN
PRINT dd$; "/"; mm$; "/"; yy$, w$
END IF
NEXT
PRINT
FOR j = jdstart TO jdend
jd = j
GOSUB jd.to.greg
mm$ = RIGHT$("0" + LTRIM$(STR$(MO)), 2)
dd$ = RIGHT$("0" + LTRIM$(STR$(DA)), 2)
yy$ = RIGHT$("0" + LTRIM$(STR$(ye MOD 100)), 2)
w$ = yy$ + mm$ + dd$
FOR i = 1 TO LEN(w$)
MID$(w$, i, 1) = MID$("abcdefghij", VAL(MID$(w$, i, 1)) + 1)
NEXT i
IF isWord(w$) THEN
PRINT yy$; "/"; mm$; "/"; dd$, w$
END IF
NEXT
PRINT
FOR j = jdstart TO jdend
jd = j
GOSUB jd.to.greg
mm$ = RIGHT$("0" + LTRIM$(STR$(MO)), 2)
dd$ = RIGHT$("0" + LTRIM$(STR$(DA)), 2)
yyyy$ = STR$(ye)
w$ = yyyy$ + mm$ + dd$
FOR i = 1 TO LEN(w$)
MID$(w$, i, 1) = MID$("abcdefghij", VAL(MID$(w$, i, 1)) + 1)
NEXT i
IF isWord(w$) THEN
PRINT yyyy$; "/"; mm$; "/"; dd$, w$
END IF
NEXT
PRINT
END
greg.to.jd:
10100 REM :greg mo/da/ye --> jd at noon
10110 GOSUB jul.to.jd
10120 jd = jd + 2 - INT(cw(1) / 100) + INT(cw(1) / 400)
10130 RETURN
jul.to.jd:
10150 REM :jul mo/da/ye --> jd at noon
10160 cw(0) = MO: cw(1) = ye: IF MO < 3 THEN cw(0) = MO + 12: cw(1) = ye - 1
10170 jd = INT(365.25 * cw(1)) + INT(30.61 * (cw(0) + 1)) + DA + 1720995!
10180 RETURN
jd.to.greg:
10200 REM:noon jd-->greg mo/da/ye
10210 cw(0) = INT((jd - 1867216.25#) / 36524.25)
10220 cw(0) = jd + 1 + cw(0) - INT(cw(0) / 4)
10230 GOTO common.from.jd
jd.to.jul:
10240 REM : noon jd-->jul mo/da/ye
10250 cw(0) = jd
common.from.jd:
10260 cw(0) = cw(0) + 1524
10265 cw(1) = INT((cw(0) - 122.1) / 365.25)
10270 cw(2) = INT(365.25 * cw(1))
10275 cw(3) = INT((cw(0) - cw(2)) / 30.6001)
10280 DA = cw(0) - cw(2) - INT(30.61 * cw(3))
10285 ye = cw(1) - 4716
10290 MO = cw(3) - 1: IF MO > 12 THEN MO = MO - 12: ye = ye + 1
10295 RETURN
FUNCTION isWord (w$)
n = LEN(w$)
w1$ = SPACE$(n)
OPEN "\words\words" + LTRIM$(STR$(n)) + ".txt" FOR BINARY AS #2
l = LOF(2) / n
low = 1: high = l
DO
mid = INT((low + high) / 2)
GET #2, (mid - 1) * n + 1, w1$
IF w1$ = w$ THEN isWord = 1: CLOSE 2: EXIT FUNCTION
IF w1$ < w$ THEN low = mid + 1: ELSE high = mid - 1
LOOP UNTIL low > high
isWord = 0
CLOSE 2
END FUNCTION
finds
10/22/04 baccae
02/24/34 accede
10/18/43 babied
10/27/43 bached
02/02/80 acacia
14/03/43 beaded
27/05/43 chafed
18/11/43 bibbed
20/11/43 cabbed
30/11/43 dabbed
02/02/80 acacia
20/11/84 cabbie
showing for part (A)
first: 10/22/04 baccae
last: 02/02/80 acacia
and for part (B)
first: 14/03/43 beaded
last: 20/11/84 cabbie
The program tried for yy/mm/dd and yyyy/mm/dd also, but did not find any results for these formats.
|
Posted by Charlie
on 2012-09-03 14:41:34 |