|
|
Thanks to all those who returned the emailed questionaires. I have
compiled these responses below for your enjoyment. The responses are
presented in order of their finish. "Real names" have been omitted.
In addition to these write-ups, please check out the consolation awards
using the link at the left.
|
1:
WordOMatic
by
michael
was a C/C++ entry with total score of 1632
|
> Describe briefly the strategy WordOMatic used for XWORDS:
WordOMatic uses a non-exhaustive width-first search approach. It
generates grids level by level. Level N contains a set of G grids,
each containing N words. G variies between 700 and 3000 grids,
according to the remaining time and an estimation for how long it
takes to fill the best found grid completely with words.
The first level is constructed by all grids containing one horizontal
word in the top left corner. Level N+1 is generated by adding words to
the grids of level N, giving each new grid a score and taking the G
grids with the highest score into the next level. To keep performance
under control, WordOMatic never generates more than 200 successors per
grid.
Each newly added word has to be connected to at least one word that is
already part of the grid. Before adding a new word, 2 different cases
are checked:
(a) the grid contains (still) one or more words that are not part of
the word list, or
(b) all words in the grid are from the wordlist
For case (a), WordOMatic looks for the first (x,y) position where a
missing word starts, and adds only words which cross this position
legally; if there is no such word, there is no successor for the
current grid.
For case (b), WordOMatic generates every possible successor (but not
more than 200) by inserting words which
- cross a non-empty cell
- when the new word will have neighbour letters, the resulting new
letter pairs or triples have to be part of at least one word from
the word list, and this word must be a legal candidate to be
inserted at this place, if it is not already there.
Then, all successor grids are put into a priority queue sorted in
descending order by their score, and the top G grids are taken from
the queue to build the next level.
WordOMatic's scoring function makes an estimation for the letter-sum
score a grid will contain when it is filled up completely. It
separates the grid into 2 areas, the "occupied area" and the "empty
area" by drawing an edge around the occupied cells.
Then, the score is
"sum of letters already in the grid"
+ 0.87 * "size of the empty area"
* ("sum of letters in the grid" / "size of occupied area")
Of course, this is not completely true, the real implementation takes
a "horizontal" and a "vertical" part of the score into account, but
the idea should be clear. This scoring system prefers "dense" grids,
the factor "0.87" was found experimentally. The comparison of the
current letter-sum score and the estimated score is also used to
estimate the running time. If the estimated running time is below 50
seconds, G is increased by 100, if it is greater than 55 seconds, G
is decreased by 200, and if it becomes greater than 58 seconds, G is
decreased by 600.
When generating the next level, WordOMatic also checks the letter-sum
score of all grids of category (b) (see above), and keeps the best
found grid in memory. When no more words can be inserted, or time is
up, this grid is printed out as the final result.
Improvements & Optimizations
----------------------------
- When generating the successor list for level N+1, WordOMatic does
not actually contruct those grids, but constructs tuples
(x,y,wordindex,direction). Those tuples are put into the priority
queue. The new grids are constructed not before their tuple is drawn
from the queue.
- Very important: WordOMatic does not put "equivalent" grids twice
into level N+1; two grids are considered to be equivalent if they
look identically after filling all cells that are crossed both
horizontally and vertically by some replacement character (for
example, a hash # mark). To check if there is already such a grid
in the level, WordOMatic calculates a hash code for each newly
candidate grid and puts it into a hash table. If there is already
the same hash code for a previously generated grid, the new grid
is rejected.
- Another important thing is having some dead-end solving strategies,
avoiding situations with big areas of empty cells, where no new word
can be inserted. For example, it sometimes happened that level 10
was filled up with grids only containing a 5x5-block of letters
in the upper left corner. Then, no new word can be inserted which
is connected to these letters, and even if you remove one word, this
does not change the situation. To avoid these situations, WordOMatic
adds up to 15 grids with lower scores to each level. If the search
comes, nevertheless , to the point where the level is empty,
WordOMatic tries the following strategies one after another
(1) insert the best found valid grid alone into the next level
(2) fill a level with grids having one word removed from the current
best grid
(3) like (2), but allow use of the flipper "*" square. This is the
only section of the algorithm where the flipper square is used in
WordOMatic.
Removal of a word is only applied if the current level contains no
flipper square so far. Removing words is very slow because
WordOMatic's data structures are optimized for inserting words, not
for removing them.
If none of the 3 strategies brings any improvement, WordOMatic
stops.
- WordOMatic does not care about the number of different words. One of
the first versions did, but it seemed to give better results by not
spending any running time for counting this.
> What are your thoughts on the "flipper" square?
Using the flipper square does only bring a very slight improvement for
WordOMatic. I started not using the flipper square (which makes the
whole search a lot faster and easier to implement), and added "flipper
usage" very lately, and only for the special case described above. I
am not sure, but I suspect one could have win the contest with a
program that does not use the flipper square at all.
>
> If I had it to do all over again, here's what I'd try:
>
Trying a completely different approach, simulated annealing, tabu
search or something like that.
>
> I named my XWORDS entry "WordOMatic" because ...
>
No special reason, it just sounded good to me.
>
> Where do you live? work? What do you do for fun? Family?
>
Ense is a small municipality 40km away from Dortmund. I work as a
software developer in Arnsberg, like skiing, trekking, biking and the
POTM contest of, course. Some of the contestants from the older POTM
contests perhaps remember me under my former name Michael Strauch (my
wife and I married last year).
|
|
2:
1x
by
billybob
was a C/C++ entry with total score of 1376
|
>Describe briefly the strategy 1x used for XWORDS:
Breadth-first search, restrict adding new words to locations near-enough the
top-left corner, shrinking the "breadth" of the search as time goes on.
>What are your thoughts on the "flipper" square?
I don't think I used it effectively. When 1x gets "stuck" it then tries
converting an existing letter to the flipper, and working from there.
>If I had it to do all over again, here's what I'd try:
I'd precompute solutions from a few common english words, and look for those
patterns in the test set. For instance, I've got solutions to
SEVEN,TEN,ELEVEN that score about 50 points more than 1x finds on
ONE,TWO,...FIFTEEN.
>I named my XWORDS entry "1x" because ...
It does better with short words.
|
|
3:
TripleWordScore
by
DanHostetler
was a C/C++ entry with total score of 1368
|
> Describe briefly the strategy TripleWordScore used for XWORDS:
I first looked for clusters of words with high density such as:
X
X
XXXX
XXXX
X
x
Then, I tried to put these clusters together with themselves. Then, I
tried to put the clusters together with other clusters.
Finally, I filled in the rest of the board with a depth-first-search.
I tried to fill in one 8x8 section at a time.
In the case of a large word list, I reordered the word list so that the
first word had a lot of connections to other words, and that each word
N had lots of connections to word N-1. Then, for certain operations, I
broke the dictionary up into groups of 16, increasing the group size as
time allowed.
> What are your thoughts on the "flipper" square?
I kept putting it off, so I actually never used it! I was going to
just tack it on at the end to try to squeeze out a few more points. I
think that the challenge was hard enough without it, and I'm not sure
that ideal use would yield more than a few extra points.
> If I had it to do all over again, here's what I'd try:
Scrap my whole cluster finding scheme, and use a more standard search
technique. My program got WAY to complicated.
> I named my XWORDS entry "TripleWordScore" because ...
I love scrabble.
> Where do you live? work? What do you do for fun? Family?
Seattle
I have an internet business that I run from my home.
Ultimate frisbee is my current obsession. Fortunately, I was injured
for long enough to complete the contest.
Nope
|
|
4:
Shift8
by
scotta
was a C/C++ entry with total score of 1289
|
>Describe briefly the strategy Shift8 used for XWORDS:
Since I have never been able to get anything working in previous POTM's,
I took a lesson from work and do the iterative approach.
Fist, I would only produce good boards, I would not try and figure out
how to add words next to each other until later if I had time.
Ix = Iteration x
I1: Print the longest word.
I2: Print the longest word horizontally and vertically.
I3: Determine how to add words.
I4: Save best board found to date.
I4: Get timer working.
I5: Add flipper square.
I6: Optimize code for time to get through as many possibilities.
I7: Add first pass manual best boards given word length.
I8: (this I learned from I7) Search for words in optimal length order.
I9: (Not complete - not even started) Determine how to add three word
packed diagonal.
I10: (Not even thought about how) Determine how to add words next to
each other (in other words, as one of the discussion threads was talking
about, add words that make the board temporarily invalid)
>What are your thoughts on the "flipper" square?
It was nice but not really necessary - I am waiting to see what effect
it has on ranking.
>If I had it to do all over again, here's what I'd try:
Realize that Fred had started the POTM back up. I found out jan 31, so
only had 1 month instead of 2.
>I named my XWORDS entry "Shift8" because ...
In unix you can name a file *. I tried, but the sandbox would not let
me, so being the geek that I am I used the keyboard sequence used to
crate * (a shift and 8 character).
>Where do you live? work? What do you do for fun? Family?
I live in Longmont Colorado, USA.
I work at StorageTek (this is my second time, 6 years the first, 4 years
at Seagate, and 3 months back at StorageTek). I am a servo engineer -
as some of you may have noticed from my control systems idea for a
future POTM.
I do programming problems for fun, Villadolid when Fred took his 4 year
break.
I have been married for almost 10 years (she is an electrical engineer -
go figure), and we used to have a dog and cat until recetly.
I would like to thank Fred for hosting this, it has been great to
participate even if I have not entered (Fred you have over 900 signed
in, 34 or so to participate is not bad - you have to realize that every
time I tried I went for the gusto and never got a program working to the
point of submitting it - you have very hard problems, and it should be
that way).
|
|
5:
Xw0rD
by
Boris
was a C/C++ entry with total score of 1256
|
>Describe briefly the strategy Xw0rD used for XWORDS:
It builds symmetric solution within 16x16 field then tries to combine
Several variants into 32x16 (that's where flipper "*" square comes
handy)
>What are your thoughts on the "flipper" square?
It would be more interesting without it...
>If I had it to do all over again, here's what I'd try:
Would not use Microsoft STL implementation of map....
>I named my XWORDS entry "Xw0rD" because ...
No idea
>Where do you live? work? What do you do for fun? Family?
UK
|
|
6:
HyperCross
by
g.difalco
was a C/C++ entry with total score of 1253
|
> Describe briefly the strategy HyperCross used for XWORDS:
Brute force with many random choices (word order, initial placing, etc.).
When no other word fits in the schema, a rollback is done
for trying different choices.
> What are your thoughts on the "flipper" square?
It changes the best result by a 5% at most.
> If I had it to do all over again, here's what I'd try:
I would have tried a preordinated placing strategy
> I named my XWORDS entry "HyperCross" because ...
No reason.
> Where do you live? work? What do you do for fun? Family?
Rome, Italy. I own a small software company.
|
|
7:
airacuara
by
mongbei
was a C/C++ entry with total score of 1087
|
>Describe briefly the strategy airacuara used for XWORDS:
Create a lookup table : replace the letters of the words with (letter -'A')
for indexing into a 2d array. Each element (x,y) of the array is the list
of words containing the ordered adjacent letters XY Words with more than
one location of XY will appear more than once in the list. One row of the
array (single occurrence, y) is for all words which have just the letter
*Y* . Flipper is also counted as a letter so the array contains (flipper,y)
and (x,flipper) for all x,y in all words.
The move action is at each level is to add a word to the grid. Keep a note
of the candidate locations as (loc, direction) that are positions on the
existing words that allow growth. Copy the grid and move again for a
selected candidate. Start with a random word.
Dealing with time - if some time has elapsed since the last maximum
solution was found break and 'pop' up a random number of levels (maybe to
the top level).
>What are your thoughts on the "flipper" square?
I treated it just as another letter, randomly placing it in the initial
word of the solution. This meant that sometimes it does not appear at an
intersection. I suppose an analysis of the word list for the case that
there are disjoint partitions, the subsets sharing no common letters, would
be a better use of the flipper - could use it as a bridge between two
disjoint subsets.
>If I had it to do all over again, here's what I'd try:
A lot more on tree pruning. For example if at one ply the word W1 at
candidate C1 is entered and the next ply W2 at C2 is added, there is no
mechanism for preventing the branch starting (W2,C2) (W1,C1) from being
explored. This makes for redundant processing.
A lot more on weighting of branches - popping up a random number of levels
is arbitrary and could miss promising branches.
If on adding a word the grid was not complete for a new candidate location
of the word then I fail. Really should be possible to allow partial
completion at this point (to give greater packing) but found in practice I
could not make this fast enough.
>I named my XWORDS entry "airacuara" because ...
This is the name of my favourite cryptic crossword compiler, reversed.
>Where do you live? work? What do you do for fun? Family?
In Shanghai, programming for an oil exploration company. Programming,
learning philosophy, learning Chinese for fun. I have a family who have
different ideas of fun!
|
|
8:
SnowFlake
by
blub
was a C/C++ entry with total score of 1085
|
>Describe briefly the strategy SnowFlake used for XWORDS:
I was heading towards an efficient brute force algorithm.
Placing one word, then recursively trying out all possibilities to
connect other words to this first one. While doing this, the
algortithm takes care that the crossword puzzle is valid after
each single step and the score is alway known.
>What are your thoughts on the "flipper" square?
I generally allow two different letters at each grid position,
one for each direction. Furthermore I count the joints were the
vertically and horizontally attached letter differ. This way, it is
always know how many "flipper" squares are used and I can restrict
this number to one. Generally, I think the flipper is a good idea to
prevent people from using existing code. On the other hand there is
not a big penalty, but generally a great simplification and big
gain in efficiency, if the flipper isn't used at all.
Personally I will most probably try to find a good solution without
flipper and then try to add just another word with the help of the flipper.
>If I had it to do all over again, here's what I'd try:
Hmmm, I must say I underestimated the complexity of the problem.
I used so many hours just for debugging only to find out that I
forgot about a certain special situation. Especially the case
when two joints are touching each other is very tricky.
So, if I would have to do it all over again, I would think hard
about doing it at all (with my very limited time resources).
>I named my XWORDS entry "SnowFlake" because ...
I was think hard about a name while watching out of the window.
It was snowing puffy snowflakes an the structure of a snowflake
reminded me of the way the algorithm "grows" the crossword puzzle...
>Where do you live? work? What do you do for fun? Family?
I live in Berne, Switzerland, and work for the Swiss Federal Institute
of Intellectual Property. I do many things connected with
computers/programming for fun. I have a wife and a sweet little daughter.
|
|
9:
Word_Basher_II
by
hobbified
was a C/C++ entry with total score of 1083
|
> Describe briefly the strategy Word_Basher_II used for XWORDS:
It's incredibly stupid; it merely throws words onto the board (making sure not
to violate any rules) randomly, until the board is full. It keeps generating
boards for about 57 seconds, and then prints out the best one.
> What are your thoughts on the "flipper" square?
I took a simple view toward the flipper; once we run out of places to put
words, if we haven't used the flipper yet, then try to find a place where we
*could* put a word if only one letter was different. Then, place the word and
drop the flipper in at the mismatch. Finally, check to see if this lets us
add any more words. That's how I did it in test versions, anyway; I'm not
sure if flipper support is going to make it into my competetion version.
> If I had it to do all over again, here's what I'd try:
I'm waiting to see all of the creative solutions that everyone else comes up
with.
> I named my XWORDS entry "Word_Basher_II" because ...
Because, as I mentioned before, it's incredibly stupid, relying on brute force
to find a decent solution. Word Basher was the original Perl incarnation;
Word Basher II is its C descendent.
> Where do you live? work? What do you do for fun? Family?
I'm currently a student attending the University of Central Florida; when I'm
not busy doing that, I live in Pennsylvania.
|
|
10:
WordCracker1_31
by
mjs
was a python entry with total score of 1082
|
>Describe briefly the strategy WordCracker1_31 used for XWORDS:
I wanted to build a small elegant program that could solve
any valid XWORDS problem with a satisfactory (but probably
not brilliant) solution.
My entry is a python program of 83 working lines (2936bytes).
Initially WordCracker (wc) creates indexes of word fragments
and orders them by letter popularity (more popular letters will be
easier to join with).
wc then generates and scores solutions until time runs out; then
it reports the best solution and exits.
To generate solutions, wc places the most popular letter in the
centre of a blank puzzle, then while joining opportunities exist,
it finds the best word to join onto the growing mesh of words.
The solution is always conected, always valid, and always has
the correct current score.
>What are your thoughts on the "flipper" square?
If I spent more time and made this program highly competitive,
I would have to implement the flipper to get a few more points
from the solution. As my entry is rather simple, I ignored the
flipper option.
>If I had it to do all over again, here's what I'd try:
I would analyse the problem and create an instrumented
structured program to experiment with. Hacking optimised
code is not very productive...
>I named my XWORDS entry "WordCracker1_31" because ...
What my squirrel did to nuts, this program does to words...
>Where do you live? work? What do you do for fun? Family?
Canberra, Australia.
Scientist at government research establishment.
Play with my kids, hack software, microcontroller experiments,
badminton, reading about science.
Long suffering wife, 3 fun kids, bored cat.
|
|
11:
gibes
by
mmammel
was a C/C++ entry with total score of 1074
|
>Describe briefly the strategy gibes used for XWORDS:
Uses a breadth first search by filling a heap with each word
as the start, then from that heap fill another with possible
additions to each of those boards, etc. Score of board (all
are scored after the addition of the nth word) is based on
the area used (10*x + y). Sometimes gets stuck early with no
ability to add to any board in the heap.
>What are your thoughts on the "flipper" square?
Doesn't seem to add much to the score, you could probably
ignore it.
>If I had it to do all over again, here's what I'd try:
Somehow need to improve speed and thoroughness of evaluating
all possible words to add at each step...
>I named my XWORDS entry "gibes" because ...
gibes are "cross words"
>Where do you live? work? What do you do for fun? Family?
Live in Laurel, Maryland with wife and 2 kids. Work for FDA
in bioinformatics. Fun is this :)
|
|
12:
Bob_The_Builder
by
fred
was a gawk entry with total score of 1053
|
>Describe briefly the strategy Bob_The_Builder used for XWORDS:
1) examine the wordlist and consider only the 25 words that
share the most letters with all the other words.
(Done primarily for time reasons since this is a gawk entry.)
2) with the reduced wordlist, consider each word as the
starting word in the upper left and then:
3) searching in turn from the upper left using starting
squares that are closest to the upper left try
to add additional words without forming any
non-words (this rule makes for sparse solutions
since I don't try to find denser solutions that
would require a "what if" kind of search on formed
"parts" of words.
4) rinse and repeat (2,3) until none of the words fit
5) if there is time, redo (2) through (4) and if the final result
is better then save THAT result ... leave about 10
seconds for the final step.
6) Look for places to fit in the words from the COMPLETE
non-reduced wordlist to fill out the square.
>What are your thoughts on the "flipper" square?
My original thought was to create "half" an answer on a
16x15 square - figuring that this would take much less time
and could therefore be much more exhaustive. I was hopeful
that I could then replicate the left half on the right and
use the flipper to connect them. I am still hoping. When
I began to try this out it turned out not to be quite so
easy ... so I didn't use it at all (not even for a final
fit since my personal coding deadline was reached.
>If I had it to do all over again, here's what I'd try:
I still think there is a germ of an idea in making a smaller
crossword and trying to join them up - but even so my gawk
entry wouldn't likely compete with the big boys.
>I named my XWORDS entry "Bob_The_Builder" because ...
My grandson thought it was a good idea ..
>Where do you live? work? What do you do for fun? Family?
New Jersey USA is home and I'm currently a contractor
working at AT&T. I spend my evenings in Norrath as a
Gnome named Gneen - much to the chagrin of my wife of
37 years. Oh yeah - and I'm the POTM-Master.
|
|
13:
MCross
by
Magus
was a perl entry with total score of 1014
|
>Describe briefly the strategy MCross used for XWORDS:
It is rather simply strategy:
Generaly I get word by word (starting from the longest) and try to put
it into the crossword as many times as it ispossible (veritcal and
horizontal). When there is a number of words in the crosswords I try to
put a word with the flipper.
>What are your thoughts on the "flipper" square?
no special thoughts - another rule in the problem.
>I named my XWORDS entry "MCross" because ...
M- first letter of my name
Cross - short from crossword
>Where do you live? work? What do you do for fun? Family?
I live in Krakow (Poland). I'm a software engineer in a large
software campany. I write programs for fun ;)
|
|
14:
whywords2
by
DrFlibble
was a C/C++ entry with total score of 1014
|
Sorry - DrFlibble did not submit a program description.
|
|
15:
X1Word
by
TBermudez
was a C/C++ entry with total score of 968
|
>Describe briefly the strategy X1Word used for XWORDS:
The initial strategy of X1Word was to use heuristics to place the words.
At the very least the initial placement was to use the largest word in
the word list and place it at the bottom left hand corner. The next
heuristic was to scan down the placed word checking to place a word from
the word list across the placed word. After this the words placed across
are scanned trying to place words down. This goes on until the grid is
filled. The score of the grid is checked to see if it better than the
saved grid that is stored in XGrid. If it is, the XGrid is replaced. The
working grid is cleared and the initial placement is moved over 1 score
and the whole process is repeated until all words and placements are
tried or time runs out.
>What are your thoughts on the "flipper" square?
I did not care for it. Initially I used it after the second word
placement. I later took it out, because the scores were lower with it.
>If I had it to do all over again, here's what I'd try:
I would try more classic AI techniques, i.e., Genetic Algorithms and
some form of minmax with alpha-beta cutoff.
>I named my XWORDS entry "X1Word" because ...
X1 came from X series of rockets. 1 for being my first entry into POTM,
thus X1 and Word.
>Where do you live? work? What do you do for fun? Family?
I live outside of Birmingham, Alabama in the United States. I work for
BellSouth. I like to read, watch LSU sports, and hike. I am married and
have two children.
|
|
16:
X2
by
icjk
was a C/C++ entry with total score of 960
|
Sorry - icjk did not submit a program description.
|
|
17:
xwords8
by
toomyem
was a python entry with total score of 954
|
> Describe briefly the strategy xwords8 used for XWORDS:
The strategy is very simple and trivial. I'm just trying
in a loop to randomly fill the board with words. When there
is no more space on the board then I check if achieved
score is greater then previous one and if so, update the best
score. The loop is exited when time is up.
During the development I was trying to enhance my algorithm
to be less random.
> What are your thoughts on the "flipper" square?
I don't know. For me it does not bring much to the algorithm.
> If I had it to do all over again, here's what I'd try:
The same algorithm.
> I named my XWORDS entry "xwords8" because ...
This is the name of the contest. I like to have
self-descriptive names.
> Where do you live? work? What do you do for fun? Family?
Poland, small city near Cracow. I'm a programmer. I have
a wife and a child on the way to this world :)
|
|
18:
xwjl2
by
jlahd
was a C/C++ entry with total score of 924
|
>Describe briefly the strategy xwjl2 used for XWORDS:
A simple genetic algorithm. The population is created out of the word
list, each member of the initial population simply consisting of a
single word of the list. After that, two representatives are chosen out
of the population and cross-bred (attempt to fit together). If the
members can be fitted together legally (with at most one flipper square)
and so that they connect properly, the offspring is added to the
population. When the population reaches a predetermined limit (a hundred
times the length of the word list, or 10000, whichever is lower), the
population is sorted according to the members' scores and 25% of the
best survive to next generation. Typically, after a few generations
(20-30), the best score of the population stabilizes to some number; at
this point, the best scorer is saved and a new try is initiated with the
initial population of word list words. This is continued until the
allotted time is used up.
>What are your thoughts on the "flipper" square?
Definitely adds a twist. Does not affect my strategy too much, but I can
imagine algorithms where the flipper square might be very hard to add.
>If I had it to do all over again, here's what I'd try:
I'd simplify my data structures, at least. No flags; simply construct a
new member without checking of proper ending and starting of words, then
run through the grid and check it. Would also add robustness. Also, I
have identified some cases that cannot be produced by my algorithm;
those would need to be added somehow (words right next to each other).
Also, I'm not at all sure a genetic algorithm is good for this problem.
Just had too little time to think of anything more specific... And, if I
was sticking to a genetic algorithm, the heuristic for survival to next
generation would need tuning.
>I named my XWORDS entry "xwjl2" because ...
Well, xw for xwords, jl for my initials, and 2 for the second version...
>Where do you live? work? What do you do for fun? Family?
Live in Finland, work for an IT company. For fun I apparently
participate in odd Internet programming competitions. Also run a bit. A
family of wife and two kids.
|
|
19:
XWords
by
aleshka
was a C/C++ entry with total score of 923
|
Sorry - aleshka did not submit a program description.
|
|
20:
Furious
by
Valjean
was a C/C++ entry with total score of 919
|
>Describe briefly the strategy Furious used for XWORDS:
Furious took the approach of holding a grid of "possible words"
which could start on each square on the board (across and down) -
This was initialised at the start (so in the top left all words
will fit both down and across, at he bottom left square
only one letter words can fit.
Then, starting in the top right each possible word is tried
and scored on a combination of length minus the number of
squares which, by using the trial word, become unable to start
any words. the best scoring word is placed and the process
repeated with all squares that hold a letter being tested.
It is not particularly clever and doesn't try to pack words
(always leaves gaps between words) because it only works on
a single word at a time.
>What are your thoughts on the "flipper" square?
My thoughts got confused - so I left it out :)
>If I had it to do all over again, here's what I'd try:
Taking more time and trying to work on word pairs rather
than single words
>I named my XWORDS entry "Furious" because ...
its a word about being cross
>Where do you live? work? What do you do for fun? Family?
Rutland (UK), not far from home, Avid Gamer (currently WOW), Son (16) and Wife(??)
|
|
21:
buy_a_vowel
by
dstone
was a C/C++ entry with total score of 902
|
Sorry - dstone did not submit a program description.
|
|
22:
test_entry3
by
reneh
was a perl entry with total score of 730
|
Sorry - reneh did not submit a program description.
|
|
23:
ganesh
by
icarus
was a C/C++ entry with total score of 685
|
Sorry - icarus did not submit a program description.
|
|
24:
4th_version
by
ngochp
was a C/C++ entry with total score of 682
|
Sorry - ngochp did not submit a program description.
|
|
25:
crossword
by
mc
was a C/C++ entry with total score of 662
|
Sorry - mc did not submit a program description.
|
|
26:
ZYXWords
by
GlopGlop
was a C/C++ entry with total score of 619
|
> Describe briefly the strategy ZYXWords used for XWORDS:
Mainly build all combinations and trying to keep the ratio
score/(number of squares occupied or condamned) to a certain level.
Then increase that level if a solution is found. And so on.
Unfortunately usually needs much more than one minute to get
a solution close to the absolute maximum...
A force stop after 56 seconds gives quite a random result
depending on the word list. Let's see...
> What are your thoughts on the "flipper" square?
Unfortunately I had too much work these last weeks.
Flipper study and use in my code was in my plans but I
had not enough time to manage that and to tune some parameters.
> If I had it to do all over again, here's what I'd try:
Tuning. Investigate the flipper.
> I named my XWORDS entry "ZYXWords" because ...
Just to play with letters. No connection at all with my unfinished strategy...
|
|
27:
gordon
by
Jax
was a python entry with total score of 575
|
Sorry - Jax did not submit a program description.
|
|
28:
SlowPup
by
tsmaster
was a python entry with total score of 228
|
Sorry - tsmaster did not submit a program description.
|
|
29:
chipbot
by
darrendoom
was a php entry with total score of 34
|
Sorry - darrendoom did not submit a program description.
|
|
30:
test_dehark
by
dehark
was a C/C++ entry with total score of 30
|
Sorry - test_dehark did not submit a program description.
|
|
31:
timtest6d
by
fransk
was a C/C++ entry with total score of 0
|
Sorry - timtest6d did not submit a program description.
|
|
32:
dk
by
dk
was a perl entry with total score of 0
|
> Describe briefly the strategy dk used for XWORDS:
Well, the rules said nothing about the words that overlapped
in more than one character, and all examples in the rules
said nothing agains the scenario like
cat
cat
cat
cat
where there are 6 words cat. This observation immediately diminishes the
problem complexity just to a single dimension, to find maximum overlapping of
all the words possible, the shorter the better (because overlapped characters
are counted more than once).
It is only after the first report came to my mail I realized that the test
program tests for more than the contest rules declared, but it was already too
late.
> I named my XWORDS entry "dk" because ...
the submitting interface wasn't quite clear, so I named it
after my initials JIC.
|
|
33:
xdart
by
beebo
was a python entry with total score of 0
|
Sorry - xdart did not submit a program description.
|
|
34:
pythwordc
by
Jeff
was a C/C++ entry with total score of 0
|
>Describe briefly the strategy pythwordc used for XWORDS:
It's essentially a greedy search using the letter count as a heuristic.
It starts with crosswords consisting of single words (one crossword for
each word). At each iteration, it finds the crosswords that can be built
by adding a single word to a previously built crossword. I recently
modified it to produce a list of crosswords that can be built by placing
two words next to each other, then adding words until the crossword is
valid. These crosswords are added to the initial list of crosswords as
well, and the search attempts to add these to previously-built
crosswords as well. When adding single words, however, adjacent words
are considered invalid. This way, there's no need to repeat the
recursive search every time.
>What are your thoughts on the "flipper" square?
I use it as a last resort to fit a word where one wouldn't otherwise. I
considered using it up-front in considering which words to try adding,
but this makes the list of words to try adding too long. Instead, I only
try adding words that match the letter in word they branch off of. If
they happen to intersect with another word, they can use the flipper
square then.
>If I had it to do all over again, here's what I'd try:
I would try building crosswords by combining any already-built
crosswords, not limiting the algorithm to crosswords built from adjacent
words. Adding many words at a time this way seems like it would be more
efficient. Then again, the list of possible crosswords to combine gets
big very quickly. I experimented with a few algorithms along these
lines, but they quickly ate up all my RAM. I had a few ideas to
implement this type of algorithm more efficiently, but I haven't had the
time to write the code.
>I named my XWORDS entry "pythwordc" because ...
It was originally written in Python, and I'm not a very creative namer,
so I just stuck "pyth" in front of "word." You could also consider it a
play on "pithy." Python is a great language, but I wasn't satisfied with
the performance of the python version of my program, and some of the
features that could have sped it up need python 2.4, whereas the server
has python 2.2.1. So I rewrote the program in C++, and renamed it
"pythwordc."
>Where do you live? work? What do you do for fun? Family?
I'm a student at Dartmouth College. I've been interning at Dartmouth's
Institute for Security Technology Studies. I program for fun, of course.
|
|
35:
JustFindOutVersions
by
ke9tv
was a tclsh8.4 entry with total score of 0
|
Sorry - JustFindOutVersions did not submit a program description.
|
|
36:
ComeQuitelyOrThereWillBeTrouble
by
underthesun
was a C/C++ entry with total score of 0
|
Sorry - ComeQuitelyOrThereWillBeTrouble did not submit a program description.
|
|
37:
cisse_test
by
Cisse
was a C/C++ entry with total score of 0
|
Sorry - cisse_test did not submit a program description.
|
|
38:
test3
by
kaspy
was a C/C++ entry with total score of 0
|
Sorry - test3 did not submit a program description.
|
|