1
<HTML><HEAD><TITLE>Answer to Exercise 72</TITLE></HEAD>
2
<BODY BGCOLOR="#FFFFFF">
3
<TABLE><TR><TD Valign="top"><IMG SRC="../icons/exercise.gif" ALT="??"><TD bgcolor="#FAA89B"><B>ANSWER TO EXERCISE 72</B><TR><TD><TD>
8
be returned as a number in the usual Inform time format:
9
as hours times 60 plus minutes (on the 24-hour clock, so
10
that the 'hour' part is between 0 and 23).
12
Constant TWELVE_HOURS = 720;
13
[ NumericTime hr mn word x;
14
if (hr>=24) return -1;
15
if (mn>=60) return -1;
16
x=hr*60+mn; if (hr>=13) return x;
17
x=x%TWELVE_HOURS; if (word=='pm') x=x+TWELVE_HOURS;
18
if (word~='am' or 'pm' && hr==12) x=x+TWELVE_HOURS;
21
[ MyTryNumber wordnum i j;
22
i=wn; wn=wordnum; j=NextWordStopped(); wn=i;
24
{ 'twenty-five': return 25;
26
default: return TryNumber(wordnum);
29
[ TimeOfDay i j k flag loop ch hr mn;
32
{ 'midnight': parsed_number=0; return 1;
33
'midday', 'noon': parsed_number=TWELVE_HOURS; return 1;
35
! Next try the format 12:02
36
j=WordAddress(wn-1); k=WordLength(wn-1);
38
for (loop=0:loop<k:loop++)
40
if (ch==':' && flag==0 && loop~=0 && loop~=k-1) flag=1;
41
else { if (ch<'0') flag=-1; if (ch>'9') flag=-1; }
43
if (k<3) flag=0; if (k>5) flag=0;
45
{ for (loop=0:j->loop~=':':loop++, hr=hr*10)
46
hr=hr+j->loop-'0';
48
for (loop++:loop<k:loop++, mn=mn*10)
49
mn=mn+j->loop-'0';
52
parsed_number=NumericTime(hr, mn, j);
53
if (parsed_number<0) return -1;
54
if (j~='pm' or 'am') wn--;
57
! Next the format "half past 12"
58
j=-1; if (i=='half') j=30; if (i=='quarter') j=15;
59
if (j<0) j=MyTryNumber(wn-1); if (j<0) return -1;
60
if (j>=60) return -1;
63
{ hr=j; if (hr>12) return -1; jump TimeFound; }
64
if (k=='o^clock' or 'am' or 'pm')
65
{ hr=j; if (hr>12) return -1; jump TimeFound; }
66
if (k=='to' or 'past')
67
{ mn=j; hr=MyTryNumber(wn);
69
{ switch(NextWordStopped())
70
{ 'noon', 'midday': hr=12;
75
if (hr>=13) return -1;
76
if (k=='to') { mn=60-mn; hr=hr-1; if (hr==-1) hr=23; }
77
wn++; k=NextWordStopped();
80
hr=j; mn=MyTryNumber(--wn);
81
if (mn<0) return -1; if (mn>=60) return -1;
82
wn++; k=NextWordStopped();
84
parsed_number = NumericTime(hr, mn, k);
85
if (parsed_number<0) return -1;
86
if (k~='pm' or 'am' or 'o^clock') wn--;
92
<HR>Back to <A HREF="../section27.html#ex72">the exercise in section 27</A><HR>
93
<SMALL><I>Mechanically translated to HTML from third edition as revised 16 May 1997. Copyright © Graham Nelson 1993, 1994, 1995, 1996, 1997: all rights reserved.</I></SMALL></BODY></HTML>