Note: This is my first Code Golf challenge/question, so I might not be using the correct format below. I'm not really sure how to tag this particular question, and should this be community wiki? Thanks!
This Code Golf challenge is about solving word searches!
A word search, as defined by Wikipedia, is:
A word search, word find, word seek, word sleuth or mystery word puzzle is a word game that is letters of a word in a grid, that usually has a rectangular or square shape. The objective of this puzzle is to find and mark all the words hidden inside the box. The words may be horizontally, vertically or diagonally. Often a list of the hidden words is provided, but more challenging puzzles may let the player figure them out. Many word search puzzles have a theme to which all the hidden words are related.
The word searches for this challenge will all be rectangular grids with a list of words to find provided. The words can be written vertically, horizontally, or diagonally.
Input/Output
The user inputs their word search and then inputs a word to be found in their grid. These two inputs are passed to the function that you will be writing. It is up to you how you want to declare and handle these objects.
Using a strategy described below or one of your own, the function finds the specific word in the search and outputs its starting coordinates (simply row number and column number) and ending coordinates. If you find two occurrences of the word, you must output both sets of coordinates. If the word is a palindrome, you may arbitrarily choose one end to be the "start" of the word.
Example
Input:
A I Y R J J Y T A S V Q T Z E
X B X G R Z P W V T B K U F O
E A F L V F J J I A G B A J K
R E S U R E P U S C Y R S Y K
F B B Q Y T K O I K H E W G N
G L W Z F R F H L O R W A R E
J A O S F U E H Q V L O A Z B
J F B G I F Q X E E A L W A C
F W K Z E U U R Z R T N P L D
F L M P H D F W H F E C G W Z
B J S V O A O Y D L M S T C R
B E S J U V T C S O O X P F F
R J T L C V W R N W L Q U F I
B L T O O S Q V K R O W G N D
B C D E J Y E L W X J D F X M
Word to find: codegolf
Output:
row 12, column 8 --> row 5, column 1
Strategies
Here are a few strategies you might consider using. It is completely up to you to decide what strategy you want to use; it doesn't have to be in this list.
- Looking for the first letter of the word; on each occurrence, looking at the eight surrounding letters to see whether the next letter of the word is there.
- Same as above, except looking for a part of a word that has two of the same letter side-by-side.
- Counting how often each letter of the alphabet is present in the whole grid, then selecting one of the least-occurring letters from the word you have to find and searching for the letter. On each occurrence of the letter, you look at its eight surrounding letters to see whether the next and previous letters of the word is there.
AWK - 252
255The input should be in the form
Python - 186 chars
testing code:
This version is 196 chars and accepts the grid without doing any extra tweaking
testing code:
Python, 318 strokes.
Sample input:
Output:
Released under the "edit-the-answer-instead-of-commenting-on-how-I-should-fix-this" license.
Perl, 226 char
Character count excludes newlines and indentation, which are included for readability. I assume the matrix of letters is specified with standard input and the target words are command-line arguments.
First line (after the
sub h
definition) maps all non-space characters into a single array@S
. Then iterate over all the target words, over the possible directions that words may appear in ($W
is the width of the puzzle), and over all of the letters in the current target word until a match is found.Python:
491- 353 charactersStill quite some room for improvement I guess, all comments welcome.
Strategy: finding all occurences of the first letter, and then trying to fetch the word in all directions.
Example usage:
Example output:
C++C,411400388367 charactersMy first attempt ever at a code golf.
It compiles without warnings on gcc with no additional flags.
Here's the version with whitespace:
Expected input on stdin looks like:
where
15 15
are the numbers of rows and columns, respectively.Since this is my first round of golf, and I could find precious little common tricks on the web, I'll list some that I found:
Try to keep loop bodies to a single statement to save on moustaches (2 chars).
Example: anything using the comma operator.
Use a conditional expression (
?:
) instead of anif
when you can (1 char).Example: instead of
if(x)printf("");
, writex?printf(""):0;
. This works becauseprintf
returnsint
.Use the fact that booleans are
0
or1
when used as anint
(? chars).Example: instead of
(y>0?r-l:r)
, writer-(y>0)*l
. The savings here are in the parentheses, which were necessary in this situation.while
loops are never shorter thanfor
loops, and longer most of the time (>= 0 chars).Example:
while(x)y;
is just as long asfor(;x;y);
but withfor
you get the loop body to play with as well, without paying for the extra;
.Put your loop increments into the last expression that uses the loop counter (1 char).
Example: instead of
for(;x<b;++x)printf("%i",x);
, writefor(;x<b;)printf("%i",x++);
.Leave off
main
's return type (4 chars).Leave off
main
'sreturn
statement (9 chars).Use
&
and|
instead of&&
and||
whenever possible (1 char).Example: instead of
if(x||y)
, writeif(x|y)
. This only works if you don't depend on the short-circuit behaviour of&&
and||
.Inline the
strlen
function and remove#include<string.h>
(11 chars).If you don't care about compiler warnings: