1. Dictionary - StewartML
- Posted by Irv <irvm at ellijay.com> Oct 27, 2003
- 393 views
Thanks for the wordlist, it will be useful for some games. I have a few comments about dictionary.e which may help someone. 1. for platform independence, remove both \n and \r when reading the text file 2. better to upcase the search word, and add an '*' if user forgets, otherwise wildcard match will fail even if the word is in the list. 3 a. if dictionary[i] = word won't work, because you will be trying to compare words of different lengths. equal() works, but there's a better way. 3b. find() is faster than a loop, except for very short lists of words. finding 'ZOO' with a loop takes 5.74 seconds, finding 'ZOO' with find() takes 2.17 seconds (1000 repetitions) See mods below. Regards, Irv include wildcard.e global sequence Dictionary global procedure LoadDictionary(sequence path) integer fn object temp fn = open(path, "r") if fn = -1 then printf(2, "Error opening the dictionary '%s'\n",{path}) abort(1) end if Dictionary = {} while 1 do temp = gets(fn) if atom(temp) then exit end if -- if temp[length(temp)] = '\n' then -- temp = temp[1..length(temp) - 1] -- end if while find('\n',temp)+find('\r',temp) do -- (1) temp = temp[1..length(temp) - 1] end while Dictionary = append(Dictionary, upper(temp)) end while close(fn) end procedure global function FindMatchingWords(sequence dictionary, sequence string) sequence words words = {} string = upper(string) -- (2) if not find('*',string) then string &= "*" end if for i = 1 to length(dictionary) do if wildcard_match(string, dictionary[i]) then words = append(words, dictionary[i]) end if end for return words end function global function IsWordInDictionary(sequence dictionary, sequence word) -- for i = 1 to length(dictionary) do -- (3a) -- if dictionary[i] = word then -- err -- if equal(dictionary[i],word) then -- slow -- return i -- end if -- end for -- return 0 return find(upper(word),dictionary) -- (3b) -- faster end function
2. Re: Dictionary - StewartML
- Posted by Irv <irvm at ellijay.com> Oct 27, 2003
- 381 views
On Monday 27 October 2003 05:35 pm, you wrote: > > Hi Irv, > > Thanks for looking at that; i hope to use this myself soon. > > I just have one note to add... > > When stripping off the end character, wouldnt it be faster > to simply check the last character: > > while temp[length(temp)]=10 do > temp = temp[1..length(temp) - 1] > end while > > Something like that? > You wouldnt need find() that way, which looks at every > single character in the line. Yes, it's slightly faster (about 10%). Since you have to check for both 13 and 10, the fastest seems to be: while temp[length(temp)] < 14 do Anybody know a better way? Regards, Irv
3. Re: Dictionary - StewartML
- Posted by "Stewart MacKenzie-Leigh" <stewartml89 at msn.com> Oct 28, 2003
- 405 views
Thanks for the suggestions. I should have realised about the equal function, but i just bashed it together in my spare time and i am not in the habit of having to use 'equal' (im a BASIC programmer mostly) and overlooked it. If i get some time, i'll upload the changed version. My main project at the moment is a scheduler to help treat procedures as seperate processes. its based on the langwar idea only it is more comprehensive. email me (stewart[PISSOFFSPAMMERS]ml89 at msn.com - remove the stuff in '[]') if you like the idea and any suggestions are welcome. >From: Irv <irvm at ellijay.com> >Reply-To: EUforum at topica.com >To: EUforum at topica.com >Subject: Dictionary - StewartML >Date: Mon, 27 Oct 2003 16:50:22 -0500 > > >Thanks for the wordlist, it will be useful for some games. >I have a few comments about dictionary.e which may help someone. > >1. for platform independence, remove both \n and \r when reading the text >file > >2. better to upcase the search word, and add an '*' if user forgets, >otherwise > wildcard match will fail even if the word is in the list. > >3 a. if dictionary[i] = word won't work, because you will be trying to >compare >words of different lengths. equal() works, but there's a better way. > >3b. find() is faster than a loop, except for very short lists of words. > finding 'ZOO' with a loop takes 5.74 seconds, > finding 'ZOO' with find() takes 2.17 seconds (1000 repetitions) > >See mods below. >Regards, >Irv > >include wildcard.e > >global sequence Dictionary > >global procedure LoadDictionary(sequence path) > integer fn > object temp > > fn = open(path, "r") > if fn = -1 then > printf(2, "Error opening the dictionary '%s'\n",{path}) > abort(1) > end if > > Dictionary = {} > > while 1 do > temp = gets(fn) > if atom(temp) then > exit > end if > > -- if temp[length(temp)] = '\n' then > -- temp = temp[1..length(temp) - 1] > -- end if > > while find('\n',temp)+find('\r',temp) do -- (1) > temp = temp[1..length(temp) - 1] > end while > > Dictionary = append(Dictionary, upper(temp)) > end while > > close(fn) >end procedure > > >global function FindMatchingWords(sequence dictionary, sequence string) > sequence words > > words = {} > > string = upper(string) -- (2) > if not find('*',string) then string &= "*" > end if > > for i = 1 to length(dictionary) do > if wildcard_match(string, dictionary[i]) then > words = append(words, dictionary[i]) > end if > end for > > return words >end function > > >global function IsWordInDictionary(sequence dictionary, sequence word) > >-- for i = 1 to length(dictionary) do -- (3a) > -- if dictionary[i] = word then -- err >-- if equal(dictionary[i],word) then -- slow >-- return i >-- end if >-- end for >-- return 0 > > return find(upper(word),dictionary) -- (3b) -- faster >end function >
4. Re: Dictionary - StewartML
- Posted by Irv <irvm at ellijay.com> Oct 28, 2003
- 401 views
On Tuesday 28 October 2003 02:30 pm, you wrote: > > Thanks for the suggestions. I should have realised about the equal > function, but i just bashed it together in my spare time and i am not in > the habit of having to use 'equal' (im a BASIC programmer mostly) and > overlooked it. If i get some time, i'll upload the changed version. We *all* do that - in fact, equal() is one of the most confusing 'features' of Euphoria, and there have been numerous suggestions to change it so we can use = just like every other language. Unfortunately, it's not likely to happen. > My main project at the moment is a scheduler to help treat procedures as > seperate processes. its based on the langwar idea only it is more > comprehensive. email me (stewart[PISSOFFSPAMMERS]ml89 at msn.com - remove the > stuff in '[]') if you like the idea and any suggestions are welcome. Sounds good. More than once I have needed something like that. Irv