<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bryan Helmig &#187; Boring Stuff</title>
	<atom:link href="http://bryanhelmig.com/category/boring-stuff/feed/" rel="self" type="application/rss+xml" />
	<link>http://bryanhelmig.com</link>
	<description>...does nerdy things.</description>
	<lastBuildDate>Thu, 29 Mar 2012 16:18:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Python Crossword Puzzle Generator</title>
		<link>http://bryanhelmig.com/python-crossword-puzzle-generator/</link>
		<comments>http://bryanhelmig.com/python-crossword-puzzle-generator/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 21:18:31 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Boring Stuff]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[crosswords]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://bryanhelmig.com/?p=275</guid>
		<description><![CDATA[As my next miniature project will be a crossword puzzle maker for teachers that will make random generation of crossword puzzles and word search puzzles, I thought I&#8217;d share the code I developed to create these puzzles on the fly. While I was working on it, I ran across many different scripts to accomplish this, [...]]]></description>
			<content:encoded><![CDATA[<p>As my next miniature project will be a <a href="http://http://crosswordpuzzlemaker.org/">crossword puzzle maker</a> for teachers that will make random generation of crossword puzzles and word search puzzles, I thought I&#8217;d share the code I developed to create these puzzles on the fly. While I was working on it, I ran across many different scripts to accomplish this, but none of them were in my most favorite of languages: Python. Besides, I&#8217;d like the code to fit snugly in my web framework of choice: Django; the popular PHP version just wouldn&#8217;t cut it. Anyways, scroll down to see the code, or read on for a little primer about the process behind it.</p>
<p><strong>Puzzles like these:</strong></p>
<pre>
p u m p e r n i c k e l -    p u m p e r n i c k e l v
a - - - - - - - a - - e -    a w j m p c a y a w r e s
l - s n i c k e r - - a -    l f s n i c k e r b z a x
a - a - - - - - a - - v -    a f a z k e u i a b f v k
d - f - c - - - m - - e -    d x f v c j f d m c n e x
i - f j o r d - e - - n -    i d f j o r d z e j g n z
n - r - d - - - l i p - -    n r r x d j a o l i p d j
- c o r a l - - - - i - -    i c o r a l u s t o i x w
- - n - - i - - - - s - -    m r n u e i i h o t s y w
- - - - - m i s t - t - -    m w e x s m i s t r t u j
p l a g u e - - - - o - -    p l a g u e b n h k o m s
- - - - - - - d a w n - -    f m n v j f p d a w n c q
- - - - - - - - - - - - -    m h j a e d p p r g t p j
</pre>
<p><strong>Behind the Scenes</strong></p>
<p>This program is actually very simple and creates completely random crosswords on the fly. Naturally, the more words you have, the better it will be at placing the most possible on a board. However, increasing the number of words will increase computation time. Additionally, increasing the board size will severely increase computation time. To counteract the fact that sometimes it will randomly generate a sub-par board, we will generate many different boards in an allotted time and only keep the &#8220;best&#8221; board (in this case, the board with the most words placed). So, as the board and word list gets bigger, the number of prospective boards created decreases within a fixed time.</p>
<p>The code first randomizes the word list and then sorts by word length. The idea here is that longer words are more difficult to place, so get them placed when the board is the most open. Next, we place the longest word on the <strong>1, 1</strong> coordinate of the grid as the <em>seed</em>. In tests, the placement of the first word at <strong>1, 1</strong> yielded by far the best results on average. Then we go to the next longest word and loop over its letters and each cell in the grid. When we find a match, we back it up and suggest a coordinate placement for that word. Once we&#8217;ve checked every letter against every cell, we chose the best (the word best is used very loosely here) coordinate and apply the word to the grid. Now we move on the next word and so forth. Once we&#8217;ve made it through once, we can loop over the unplaced words and looks for any lucky chances for a second placement.</p>
<p>This suggested coordinate system allows for a much faster fit than some methods I&#8217;ve seen that will randomly place a word to see if it works. Additionally, it requires the word cross other words which is the point of well, a crossword puzzle.</p>
<p><strong>Operation</strong></p>
<p>Be mindful when you create a word list to exclude words like &#8220;an&#8221; or  &#8220;or&#8221; because these have a tendency to be placed <em>inside </em>other  already placed words. This can be confusing. Simply run the code below.</p>
<p>You can feed the Crossword class a list of Word classes, or a list of tuples or lists with the word and clue. Either way works.</p>
<p>When you call the compute_crossword(<em>seconds</em>) method, it does all the work of computing the best crossword in however many seconds you passed. 1 second is probably enough for crossword grids of less that 20&#215;20 and 2 seconds is fine for 25&#215;25 and 3 seconds is good for 30&#215;30. Additionally, if you have a massive word list, you may want to double the time alloyed. Finally, if you can&#8217;t run psycho, quadruple these times for similar quality.</p>
<p><strong>The Code:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>, <span style="color: #dc143c;">re</span>, <span style="color: #dc143c;">time</span>, <span style="color: #dc143c;">string</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">copy</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">copy</span> <span style="color: #ff7700;font-weight:bold;">as</span> duplicate
&nbsp;
<span style="color: #808080; font-style: italic;"># optional, speeds up by a factor of 4</span>
<span style="color: #ff7700;font-weight:bold;">import</span> psyco
psyco.<span style="color: black;">full</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Crossword<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, cols, rows, empty = <span style="color: #483d8b;">'-'</span>, maxloops = <span style="color: #ff4500;">2000</span>, available_words=<span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">cols</span> = cols
        <span style="color: #008000;">self</span>.<span style="color: black;">rows</span> = rows
        <span style="color: #008000;">self</span>.<span style="color: black;">empty</span> = empty
        <span style="color: #008000;">self</span>.<span style="color: black;">maxloops</span> = maxloops
        <span style="color: #008000;">self</span>.<span style="color: black;">available_words</span> = available_words
        <span style="color: #008000;">self</span>.<span style="color: black;">randomize_word_list</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">debug</span> = <span style="color: #ff4500;">0</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">clear_grid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> clear_grid<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># initialize grid and fill with empty character</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">grid</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">rows</span><span style="color: black;">&#41;</span>:
            ea_row = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cols</span><span style="color: black;">&#41;</span>:
                ea_row.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">empty</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">grid</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>ea_row<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> randomize_word_list<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># also resets words and sorts by length</span>
        temp_list = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> word <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">available_words</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>word, Word<span style="color: black;">&#41;</span>:
                temp_list.<span style="color: black;">append</span><span style="color: black;">&#40;</span>Word<span style="color: black;">&#40;</span>word.<span style="color: black;">word</span>, word.<span style="color: black;">clue</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                temp_list.<span style="color: black;">append</span><span style="color: black;">&#40;</span>Word<span style="color: black;">&#40;</span>word<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, word<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">random</span>.<span style="color: black;">shuffle</span><span style="color: black;">&#40;</span>temp_list<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># randomize word list</span>
        temp_list.<span style="color: black;">sort</span><span style="color: black;">&#40;</span>key=<span style="color: #ff7700;font-weight:bold;">lambda</span> i: <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>i.<span style="color: black;">word</span><span style="color: black;">&#41;</span>, reverse=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># sort by length</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">available_words</span> = temp_list
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> compute_crossword<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, time_permitted = <span style="color: #ff4500;">1.00</span>, spins=<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>:
        time_permitted = <span style="color: #008000;">float</span><span style="color: black;">&#40;</span>time_permitted<span style="color: black;">&#41;</span>
&nbsp;
        count = <span style="color: #ff4500;">0</span>
        <span style="color: #dc143c;">copy</span> = Crossword<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cols</span>, <span style="color: #008000;">self</span>.<span style="color: black;">rows</span>, <span style="color: #008000;">self</span>.<span style="color: black;">empty</span>, <span style="color: #008000;">self</span>.<span style="color: black;">maxloops</span>, <span style="color: #008000;">self</span>.<span style="color: black;">available_words</span><span style="color: black;">&#41;</span>
&nbsp;
        start_full = <span style="color: #008000;">float</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: black;">&#40;</span><span style="color: #008000;">float</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> - start_full<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> time_permitted <span style="color: #ff7700;font-weight:bold;">or</span> count == <span style="color: #ff4500;">0</span>: <span style="color: #808080; font-style: italic;"># only run for x seconds</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">debug</span> += <span style="color: #ff4500;">1</span>
            <span style="color: #dc143c;">copy</span>.<span style="color: black;">current_word_list</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
            <span style="color: #dc143c;">copy</span>.<span style="color: black;">clear_grid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">copy</span>.<span style="color: black;">randomize_word_list</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            x = <span style="color: #ff4500;">0</span>
            <span style="color: #ff7700;font-weight:bold;">while</span> x <span style="color: #66cc66;">&lt;</span> spins: <span style="color: #808080; font-style: italic;"># spins; 2 seems to be plenty</span>
                <span style="color: #ff7700;font-weight:bold;">for</span> word <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">copy</span>.<span style="color: black;">available_words</span>:
                    <span style="color: #ff7700;font-weight:bold;">if</span> word <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">copy</span>.<span style="color: black;">current_word_list</span>:
                        <span style="color: #dc143c;">copy</span>.<span style="color: black;">fit_and_add</span><span style="color: black;">&#40;</span>word<span style="color: black;">&#41;</span>
                x += <span style="color: #ff4500;">1</span>
            <span style="color: #808080; font-style: italic;">#print copy.solution()</span>
            <span style="color: #808080; font-style: italic;">#print len(copy.current_word_list), len(self.current_word_list), self.debug</span>
            <span style="color: #808080; font-style: italic;"># buffer the best crossword by comparing placed words</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">copy</span>.<span style="color: black;">current_word_list</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span> = <span style="color: #dc143c;">copy</span>.<span style="color: black;">current_word_list</span>
                <span style="color: #008000;">self</span>.<span style="color: black;">grid</span> = <span style="color: #dc143c;">copy</span>.<span style="color: black;">grid</span>
            count += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> suggest_coord<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, word<span style="color: black;">&#41;</span>:
        count = <span style="color: #ff4500;">0</span>
        coordlist = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        glc = -<span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> given_letter <span style="color: #ff7700;font-weight:bold;">in</span> word.<span style="color: black;">word</span>: <span style="color: #808080; font-style: italic;"># cycle through letters in word</span>
            glc += <span style="color: #ff4500;">1</span>
            rowc = <span style="color: #ff4500;">0</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">grid</span>: <span style="color: #808080; font-style: italic;"># cycle through rows</span>
                rowc += <span style="color: #ff4500;">1</span>
                colc = <span style="color: #ff4500;">0</span>
                <span style="color: #ff7700;font-weight:bold;">for</span> cell <span style="color: #ff7700;font-weight:bold;">in</span> row: <span style="color: #808080; font-style: italic;"># cycle through  letters in rows</span>
                    colc += <span style="color: #ff4500;">1</span>
                    <span style="color: #ff7700;font-weight:bold;">if</span> given_letter == cell: <span style="color: #808080; font-style: italic;"># check match letter in word to letters in row</span>
                        <span style="color: #ff7700;font-weight:bold;">try</span>: <span style="color: #808080; font-style: italic;"># suggest vertical placement </span>
                            <span style="color: #ff7700;font-weight:bold;">if</span> rowc - glc <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>: <span style="color: #808080; font-style: italic;"># make sure we're not suggesting a starting point off the grid</span>
                                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>rowc - glc<span style="color: black;">&#41;</span> + word.<span style="color: black;">length</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span>= <span style="color: #008000;">self</span>.<span style="color: black;">rows</span>: <span style="color: #808080; font-style: italic;"># make sure word doesn't go off of grid</span>
                                    coordlist.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>colc, rowc - glc, <span style="color: #ff4500;">1</span>, colc + <span style="color: black;">&#40;</span>rowc - glc<span style="color: black;">&#41;</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
                        <span style="color: #ff7700;font-weight:bold;">except</span>: <span style="color: #ff7700;font-weight:bold;">pass</span>
                        <span style="color: #ff7700;font-weight:bold;">try</span>: <span style="color: #808080; font-style: italic;"># suggest horizontal placement </span>
                            <span style="color: #ff7700;font-weight:bold;">if</span> colc - glc <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>: <span style="color: #808080; font-style: italic;"># make sure we're not suggesting a starting point off the grid</span>
                                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>colc - glc<span style="color: black;">&#41;</span> + word.<span style="color: black;">length</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span>= <span style="color: #008000;">self</span>.<span style="color: black;">cols</span>: <span style="color: #808080; font-style: italic;"># make sure word doesn't go off of grid</span>
                                    coordlist.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>colc - glc, rowc, <span style="color: #ff4500;">0</span>, rowc + <span style="color: black;">&#40;</span>colc - glc<span style="color: black;">&#41;</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
                        <span style="color: #ff7700;font-weight:bold;">except</span>: <span style="color: #ff7700;font-weight:bold;">pass</span>
        <span style="color: #808080; font-style: italic;"># example: coordlist[0] = [col, row, vertical, col + row, score]</span>
        <span style="color: #808080; font-style: italic;">#print word.word</span>
        <span style="color: #808080; font-style: italic;">#print coordlist</span>
        new_coordlist = <span style="color: #008000;">self</span>.<span style="color: black;">sort_coordlist</span><span style="color: black;">&#40;</span>coordlist, word<span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;">#print new_coordlist</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> new_coordlist
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> sort_coordlist<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, coordlist, word<span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># give each coordinate a score, then sort</span>
        new_coordlist = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> coord <span style="color: #ff7700;font-weight:bold;">in</span> coordlist:
            col, row, vertical = coord<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, coord<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, coord<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
            coord<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span> = <span style="color: #008000;">self</span>.<span style="color: black;">check_fit_score</span><span style="color: black;">&#40;</span>col, row, vertical, word<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># checking scores</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> coord<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span>: <span style="color: #808080; font-style: italic;"># 0 scores are filtered</span>
                new_coordlist.<span style="color: black;">append</span><span style="color: black;">&#40;</span>coord<span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">random</span>.<span style="color: black;">shuffle</span><span style="color: black;">&#40;</span>new_coordlist<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># randomize coord list; why not?</span>
        new_coordlist.<span style="color: black;">sort</span><span style="color: black;">&#40;</span>key=<span style="color: #ff7700;font-weight:bold;">lambda</span> i: i<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span>, reverse=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># put the best scores first</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> new_coordlist
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> fit_and_add<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, word<span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># doesn't really check fit except for the first word; otherwise just adds if score is good</span>
        fit = <span style="color: #008000;">False</span>
        count = <span style="color: #ff4500;">0</span>
        coordlist = <span style="color: #008000;">self</span>.<span style="color: black;">suggest_coord</span><span style="color: black;">&#40;</span>word<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff7700;font-weight:bold;">not</span> fit <span style="color: #ff7700;font-weight:bold;">and</span> count <span style="color: #66cc66;">&lt;</span> <span style="color: #008000;">self</span>.<span style="color: black;">maxloops</span>:
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">0</span>: <span style="color: #808080; font-style: italic;"># this is the first word: the seed</span>
                <span style="color: #808080; font-style: italic;"># top left seed of longest word yields best results (maybe override)</span>
                vertical, col, row = <span style="color: #dc143c;">random</span>.<span style="color: black;">randrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span>
                <span style="color: #483d8b;">''</span><span style="color: #483d8b;">' 
                # optional center seed method, slower and less keyword placement
                if vertical:
                    col = int(round((self.cols + 1)/2, 0))
                    row = int(round((self.rows + 1)/2, 0)) - int(round((word.length + 1)/2, 0))
                else:
                    col = int(round((self.cols + 1)/2, 0)) - int(round((word.length + 1)/2, 0))
                    row = int(round((self.rows + 1)/2, 0))
                # completely random seed method
                col = random.randrange(1, self.cols + 1)
                row = random.randrange(1, self.rows + 1)
                '</span><span style="color: #483d8b;">''</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">check_fit_score</span><span style="color: black;">&#40;</span>col, row, vertical, word<span style="color: black;">&#41;</span>: 
                    fit = <span style="color: #008000;">True</span>
                    <span style="color: #008000;">self</span>.<span style="color: black;">set_word</span><span style="color: black;">&#40;</span>col, row, vertical, word, force=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>: <span style="color: #808080; font-style: italic;"># a subsquent words have scores calculated</span>
                <span style="color: #ff7700;font-weight:bold;">try</span>: 
                    col, row, vertical = coordlist<span style="color: black;">&#91;</span>count<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, coordlist<span style="color: black;">&#91;</span>count<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, coordlist<span style="color: black;">&#91;</span>count<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
                <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">IndexError</span>: <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #808080; font-style: italic;"># no more cordinates, stop trying to fit</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">if</span> coordlist<span style="color: black;">&#91;</span>count<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span>: <span style="color: #808080; font-style: italic;"># already filtered these out, but double check</span>
                    fit = <span style="color: #008000;">True</span> 
                    <span style="color: #008000;">self</span>.<span style="color: black;">set_word</span><span style="color: black;">&#40;</span>col, row, vertical, word, force=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
&nbsp;
            count += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> check_fit_score<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, col, row, vertical, word<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'
        And return score (0 signifies no fit). 1 means a fit, 2+ means a cross.
&nbsp;
        The more crosses the better.
        '</span><span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> col <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">1</span> <span style="color: #ff7700;font-weight:bold;">or</span> row <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">1</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
        count, score = <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span> <span style="color: #808080; font-style: italic;"># give score a standard value of 1, will override with 0 if collisions detected</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> letter <span style="color: #ff7700;font-weight:bold;">in</span> word.<span style="color: black;">word</span>:            
            <span style="color: #ff7700;font-weight:bold;">try</span>:
                active_cell = <span style="color: #008000;">self</span>.<span style="color: black;">get_cell</span><span style="color: black;">&#40;</span>col, row<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">IndexError</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> active_cell == <span style="color: #008000;">self</span>.<span style="color: black;">empty</span> <span style="color: #ff7700;font-weight:bold;">or</span> active_cell == letter:
                <span style="color: #ff7700;font-weight:bold;">pass</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> active_cell == letter:
                score += <span style="color: #ff4500;">1</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> vertical:
                <span style="color: #808080; font-style: italic;"># check surroundings</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> active_cell <span style="color: #66cc66;">!</span>= letter: <span style="color: #808080; font-style: italic;"># don't check surroundings if cross point</span>
                    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">check_if_cell_clear</span><span style="color: black;">&#40;</span>col+<span style="color: #ff4500;">1</span>, row<span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># check right cell</span>
                        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
                    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">check_if_cell_clear</span><span style="color: black;">&#40;</span>col-<span style="color: #ff4500;">1</span>, row<span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># check left cell</span>
                        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">if</span> count == <span style="color: #ff4500;">1</span>: <span style="color: #808080; font-style: italic;"># check top cell only on first letter</span>
                    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">check_if_cell_clear</span><span style="color: black;">&#40;</span>col, row-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
                        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">if</span> count == <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>word.<span style="color: black;">word</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># check bottom cell only on last letter</span>
                    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">check_if_cell_clear</span><span style="color: black;">&#40;</span>col, row+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>: 
                        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>: <span style="color: #808080; font-style: italic;"># else horizontal</span>
                <span style="color: #808080; font-style: italic;"># check surroundings</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> active_cell <span style="color: #66cc66;">!</span>= letter: <span style="color: #808080; font-style: italic;"># don't check surroundings if cross point</span>
                    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">check_if_cell_clear</span><span style="color: black;">&#40;</span>col, row-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># check top cell</span>
                        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
                    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">check_if_cell_clear</span><span style="color: black;">&#40;</span>col, row+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># check bottom cell</span>
                        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">if</span> count == <span style="color: #ff4500;">1</span>: <span style="color: #808080; font-style: italic;"># check left cell only on first letter</span>
                    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">check_if_cell_clear</span><span style="color: black;">&#40;</span>col-<span style="color: #ff4500;">1</span>, row<span style="color: black;">&#41;</span>:
                        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">if</span> count == <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>word.<span style="color: black;">word</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># check right cell only on last letter</span>
                    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">check_if_cell_clear</span><span style="color: black;">&#40;</span>col+<span style="color: #ff4500;">1</span>, row<span style="color: black;">&#41;</span>:
                        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> vertical: <span style="color: #808080; font-style: italic;"># progress to next letter and position</span>
                row += <span style="color: #ff4500;">1</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>: <span style="color: #808080; font-style: italic;"># else horizontal</span>
                col += <span style="color: #ff4500;">1</span>
&nbsp;
            count += <span style="color: #ff4500;">1</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> score
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> set_word<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, col, row, vertical, word, force=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># also adds word to word list</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> force:
            word.<span style="color: black;">col</span> = col
            word.<span style="color: black;">row</span> = row
            word.<span style="color: black;">vertical</span> = vertical
            <span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>word<span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">for</span> letter <span style="color: #ff7700;font-weight:bold;">in</span> word.<span style="color: black;">word</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">set_cell</span><span style="color: black;">&#40;</span>col, row, letter<span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> vertical:
                    row += <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    col += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> set_cell<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, col, row, value<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">grid</span><span style="color: black;">&#91;</span>row-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>col-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> = value
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_cell<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, col, row<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">grid</span><span style="color: black;">&#91;</span>row-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>col-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> check_if_cell_clear<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, col, row<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            cell = <span style="color: #008000;">self</span>.<span style="color: black;">get_cell</span><span style="color: black;">&#40;</span>col, row<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> cell == <span style="color: #008000;">self</span>.<span style="color: black;">empty</span>: 
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">IndexError</span>:
            <span style="color: #ff7700;font-weight:bold;">pass</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> solution<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># return solution grid</span>
        outStr = <span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> r <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">rows</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> c <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">grid</span><span style="color: black;">&#91;</span>r<span style="color: black;">&#93;</span>:
                outStr += <span style="color: #483d8b;">'%s '</span> <span style="color: #66cc66;">%</span> c
            outStr += <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> outStr
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> word_find<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># return solution grid</span>
        outStr = <span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> r <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">rows</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> c <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">grid</span><span style="color: black;">&#91;</span>r<span style="color: black;">&#93;</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> c == <span style="color: #008000;">self</span>.<span style="color: black;">empty</span>:
                    outStr += <span style="color: #483d8b;">'%s '</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">string</span>.<span style="color: black;">lowercase</span><span style="color: black;">&#91;</span><span style="color: #dc143c;">random</span>.<span style="color: black;">randint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>,<span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span>.<span style="color: black;">lowercase</span><span style="color: black;">&#41;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    outStr += <span style="color: #483d8b;">'%s '</span> <span style="color: #66cc66;">%</span> c
            outStr += <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> outStr
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> order_number_words<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># orders words and applies numbering system to them</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span>.<span style="color: black;">sort</span><span style="color: black;">&#40;</span>key=<span style="color: #ff7700;font-weight:bold;">lambda</span> i: <span style="color: black;">&#40;</span>i.<span style="color: black;">col</span> + i.<span style="color: black;">row</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        count, icount = <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> word <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span>:
            word.<span style="color: black;">number</span> = count
            <span style="color: #ff7700;font-weight:bold;">if</span> icount <span style="color: #66cc66;">&lt;</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> word.<span style="color: black;">col</span> == <span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span><span style="color: black;">&#91;</span>icount<span style="color: black;">&#93;</span>.<span style="color: black;">col</span> <span style="color: #ff7700;font-weight:bold;">and</span> word.<span style="color: black;">row</span> == <span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span><span style="color: black;">&#91;</span>icount<span style="color: black;">&#93;</span>.<span style="color: black;">row</span>:
                    <span style="color: #ff7700;font-weight:bold;">pass</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    count += <span style="color: #ff4500;">1</span>
            icount += <span style="color: #ff4500;">1</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> display<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, order=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># return (and order/number wordlist) the grid minus the words adding the numbers</span>
        outStr = <span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> order:
            <span style="color: #008000;">self</span>.<span style="color: black;">order_number_words</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #dc143c;">copy</span> = <span style="color: #008000;">self</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> word <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span>:
            <span style="color: #dc143c;">copy</span>.<span style="color: black;">set_cell</span><span style="color: black;">&#40;</span>word.<span style="color: black;">col</span>, word.<span style="color: black;">row</span>, word.<span style="color: black;">number</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> r <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">copy</span>.<span style="color: black;">rows</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> c <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">copy</span>.<span style="color: black;">grid</span><span style="color: black;">&#91;</span>r<span style="color: black;">&#93;</span>:
                outStr += <span style="color: #483d8b;">'%s '</span> <span style="color: #66cc66;">%</span> c
            outStr += <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span>
&nbsp;
        outStr = <span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'[a-z]'</span>, <span style="color: #483d8b;">' '</span>, outStr<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> outStr
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> word_bank<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>: 
        outStr = <span style="color: #483d8b;">''</span>
        temp_list = duplicate<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span><span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">random</span>.<span style="color: black;">shuffle</span><span style="color: black;">&#40;</span>temp_list<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># randomize word list</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> word <span style="color: #ff7700;font-weight:bold;">in</span> temp_list:
            outStr += <span style="color: #483d8b;">'%s<span style="color: #000099; font-weight: bold;">\n</span>'</span> <span style="color: #66cc66;">%</span> word.<span style="color: black;">word</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> outStr
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> legend<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># must order first</span>
        outStr = <span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> word <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">current_word_list</span>:
            outStr += <span style="color: #483d8b;">'%d. (%d,%d) %s: %s<span style="color: #000099; font-weight: bold;">\n</span>'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>word.<span style="color: black;">number</span>, word.<span style="color: black;">col</span>, word.<span style="color: black;">row</span>, word.<span style="color: black;">down_across</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, word.<span style="color: black;">clue</span> <span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> outStr
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Word<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, word=<span style="color: #008000;">None</span>, clue=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">word</span> = <span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\s</span>'</span>, <span style="color: #483d8b;">''</span>, word.<span style="color: black;">lower</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">clue</span> = clue
        <span style="color: #008000;">self</span>.<span style="color: black;">length</span> = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">word</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># the below are set when placed on board</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">row</span> = <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">col</span> = <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">vertical</span> = <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">number</span> = <span style="color: #008000;">None</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> down_across<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>: <span style="color: #808080; font-style: italic;"># return down or across</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">vertical</span>: 
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'down'</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>: 
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'across'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__repr__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">word</span>
&nbsp;
<span style="color: #808080; font-style: italic;">### end class, start execution</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#start_full = float(time.time())</span>
&nbsp;
word_list = <span style="color: black;">&#91;</span><span style="color: #483d8b;">'saffron'</span>, <span style="color: #483d8b;">'The dried, orange yellow plant used to as dye and as a cooking spice.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'pumpernickel'</span>, <span style="color: #483d8b;">'Dark, sour bread made from coarse ground rye.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'leaven'</span>, <span style="color: #483d8b;">'An agent, such as yeast, that cause batter or dough to rise..'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'coda'</span>, <span style="color: #483d8b;">'Musical conclusion of a movement or composition.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'paladin'</span>, <span style="color: #483d8b;">'A heroic champion or paragon of chivalry.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'syncopation'</span>, <span style="color: #483d8b;">'Shifting the emphasis of a beat to the normally weak beat.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'albatross'</span>, <span style="color: #483d8b;">'A large bird of the ocean having a hooked beek and long, narrow wings.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'harp'</span>, <span style="color: #483d8b;">'Musical instrument with 46 or more open strings played by plucking.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'piston'</span>, <span style="color: #483d8b;">'A solid cylinder or disk that fits snugly in a larger cylinder and moves under pressure as in an engine.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'caramel'</span>, <span style="color: #483d8b;">'A smooth chery candy made from suger, butter, cream or milk with flavoring.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'coral'</span>, <span style="color: #483d8b;">'A rock-like deposit of organism skeletons that make up reefs.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'dawn'</span>, <span style="color: #483d8b;">'The time of each morning at which daylight begins.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'pitch'</span>, <span style="color: #483d8b;">'A resin derived from the sap of various pine trees.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'fjord'</span>, <span style="color: #483d8b;">'A long, narrow, deep inlet of the sea between steep slopes.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'lip'</span>, <span style="color: #483d8b;">'Either of two fleshy folds surrounding the mouth.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'lime'</span>, <span style="color: #483d8b;">'The egg-shaped citrus fruit having a green coloring and acidic juice.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'mist'</span>, <span style="color: #483d8b;">'A mass of fine water droplets in the air near or in contact with the ground.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'plague'</span>, <span style="color: #483d8b;">'A widespread affliction or calamity.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'yarn'</span>, <span style="color: #483d8b;">'A strand of twisted threads or a long elaborate narrative.'</span><span style="color: black;">&#93;</span>, \
    <span style="color: black;">&#91;</span><span style="color: #483d8b;">'snicker'</span>, <span style="color: #483d8b;">'A snide, slightly stifled laugh.'</span><span style="color: black;">&#93;</span>
&nbsp;
a = Crossword<span style="color: black;">&#40;</span><span style="color: #ff4500;">13</span>, <span style="color: #ff4500;">13</span>, <span style="color: #483d8b;">'-'</span>, <span style="color: #ff4500;">5000</span>, word_list<span style="color: black;">&#41;</span>
a.<span style="color: black;">compute_crossword</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> a.<span style="color: black;">word_bank</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> a.<span style="color: black;">solution</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> a.<span style="color: black;">word_find</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> a.<span style="color: black;">display</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> a.<span style="color: black;">legend</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>a.<span style="color: black;">current_word_list</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'out of'</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>word_list<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> a.<span style="color: black;">debug</span>
<span style="color: #808080; font-style: italic;">#end_full = float(time.time())</span>
<span style="color: #808080; font-style: italic;">#print end_full - start_full</span></pre></div></div>

<p><strong>Sample output:</strong></p>
<p>You should be able to see the associated methods lining up with the output. A side note: you must run the display() method before the legend() method can be ran.</p>
<pre>
mist
lime
snicker
paladin
caramel
leaven
pumpernickel
coral
fjord
plague
piston
lip
dawn
saffron
coda

p u m p e r n i c k e l -
a - - - - - - - a - - e -
l - s n i c k e r - - a -
a - a - - - - - a - - v -
d - f - c - - - m - - e -
i - f j o r d - e - - n -
n - r - d - - - l i p - -
- c o r a l - - - - i - -
- - n - - i - - - - s - -
- - - - - m i s t - t - -
p l a g u e - - - - o - -
- - - - - - - d a w n - -
- - - - - - - - - - - - -

p u m p e r n i c k e l v
a w j m p c a y a w r e s
l f s n i c k e r b z a x
a f a z k e u i a b f v k
d x f v c j f d m c n e x
i d f j o r d z e j g n z
n r r x d j a o l i p d j
i c o r a l u s t o i x w
m r n u e i i h o t s y w
m w e x s m i s t r t u j
p l a g u e b n h k o m s
f m n v j f p d a w n c q
m h j a e d p p r g t p j

1               4     8 -
  - - - - - - -   - -   -
  - 2             - -   -
  -   - - - - -   - -   -
  -   - 6 - - -   - -   -
  - 3         -   - -   -
  -   -   - - - 10   12 - -
- 5       9 - - - -   - -
- -   - -   - - - -   - -
- - - - - 11       -   - -
7           - - - -   - -
- - - - - - - 13       - -
- - - - - - - - - - - - -

1. (1,1) across: Dark, sour bread made from coarse ground rye.
1. (1,1) down: A heroic champion or paragon of chivalry.
2. (3,3) across: A snide, slightly stifled laugh.
2. (3,3) down: The dried, orange yellow plant used to as dye and as a cooking spice.
3. (3,6) across: A long, narrow, deep inlet of the sea between steep slopes.
4. (9,1) down: A smooth chery candy made from suger, butter, cream or milk with flavoring.
5. (2,8) across: A rock-like deposit of organism skeletons that make up reefs.
6. (5,5) down: Musical conclusion of a movement or composition.
7. (1,11) across: A widespread affliction or calamity.
8. (12,1) down: An agent, such as yeast, that cause batter or dough to rise..
9. (6,8) down: The egg-shaped citrus fruit having a green coloring and acidic juice.
10. (9,7) across: Either of two fleshy folds surrounding the mouth.
11. (6,10) across: A mass of fine water droplets in the air near or in contact with the ground.
12. (11,7) down: A solid cylinder or disk that fits snugly in a larger cylinder and moves under pressure as in an engine.
13. (8,12) across: The time of each morning at which daylight begins.

15 out of 20
811
</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://bryanhelmig.com/python-crossword-puzzle-generator/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>6 IT Decisions for Non-IT Management</title>
		<link>http://bryanhelmig.com/6-it-decisions-for-non-it-management/</link>
		<comments>http://bryanhelmig.com/6-it-decisions-for-non-it-management/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 23:18:05 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Boring Stuff]]></category>

		<guid isPermaLink="false">http://bryanhelmig.com/?p=227</guid>
		<description><![CDATA[The first consideration is: is the level of spending tied to the overall strategy? Given that there are uncertain returns for IT investments, the spending should be considered like any other business investment and prudence should be exercised just the same. While industry bookmarks can be an exceptional indicator, they should not be the targeted [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>The first consideration is: <em>is the level of spending tied to the overall strategy</em>? Given that there are uncertain returns for IT investments, the spending should be considered like any other business investment and prudence should be exercised just the same. While industry bookmarks can be an exceptional indicator, they should not be the targeted spending.</li>
<li>The second consideration is: <em>is the money focused on essential, benefit producing programs</em>? While it may be tempting to streamline all business processes, it is foolish to equally distribute investments among business processes that will benefit unevenly. However, a careful balance must be struck to avoid any bottlenecks.</li>
<li>The third consideration is: <em>at what scope will the business benefit from IT centralization</em>? Another tempting move may be to provide company-wide IT integration, or centralization, regardless of the cost. This may appear to be an excellent way to provide cost savings (by buying in bulk), but the added benefit of centralization may be entirely mitigated by the added costs.</li>
<li>The fourth consideration is: <em>does the business need a premier, top-of-the-line system to operate efficiently</em>? If left to IT management, the added cost/benefit ratio may be clearly defined in raw technology terms, but the benefit as perceived by IT management may not translate to overall benefits to the business.</li>
<li>The fifth consideration is: <em>at what point does the marginal cost of more hassle cross the marginal benefit of more security</em>?  In other words, by increasing IT security, are you inadvertently creating insurmountable obstacles for non-IT employees? Research suggests that the weakest link of most security chains is the human element, and the human element is best handled through proper training, not extravagant (and costly) firewalls and encryption.</li>
<li>The sixth and final consideration is: <em>place blame on the management of IT implementation, not the IT systems.</em> Most IT systems are built to exact specifications, and many are industry wide solutions adopted elsewhere. When the expected benefits don’t materialize, find the problem in the decision chain that approved inappropriate systems, not in the IT system itself.</li>
</ol>
<p style="text-align: right;"><em><small>Six IT Decisions Your IT People Shouldn&#8217;t Make &#8211; March 3, 2009 &#8211; Jeanne W. Ross and Peter Weill</small></em></p>
]]></content:encoded>
			<wfw:commentRss>http://bryanhelmig.com/6-it-decisions-for-non-it-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django Encryption &#8211; An Updated How-To</title>
		<link>http://bryanhelmig.com/django-encryption/</link>
		<comments>http://bryanhelmig.com/django-encryption/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 05:56:10 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Boring Stuff]]></category>
		<category><![CDATA[AES]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[snippets]]></category>

		<guid isPermaLink="false">http://bryanhelmig.com/?p=213</guid>
		<description><![CDATA[I love Django, and I love Django Snippets, but I&#8217;ve noticed some snippets are out of date, most notably for me, Django snippet 1095 or Django Encryption. Unfortunately, some folks are hitting a few snags on TypeError: &#8220;Non-hexadecimal digit found&#8221;. Luckily, it seems that Django-Fields have solved this problem for us! Here is my (their) [...]]]></description>
			<content:encoded><![CDATA[<p>I love Django, and I love <a href="http://www.djangosnippets.org/">Django Snippets</a>, but I&#8217;ve noticed some snippets are out of date, most notably for me, Django snippet 1095 or <a href="http://www.djangosnippets.org/snippets/1095/">Django Encryption</a>. Unfortunately, some folks are hitting a few snags on TypeError: &#8220;Non-hexadecimal digit found&#8221;.</p>
<p>Luckily, it seems that <a href="http://github.com/svetlyak40wt/django-fields">Django-Fields</a> have solved this problem for us! Here is my (their) technique!</p>
<p>Make a file named encryption.py to go into the same folder as your settings.py containing:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">binascii</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">string</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> django <span style="color: #ff7700;font-weight:bold;">import</span> forms
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span> <span style="color: #ff7700;font-weight:bold;">import</span> models
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">conf</span> <span style="color: #ff7700;font-weight:bold;">import</span> settings
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> BaseEncryptedField<span style="color: black;">&#40;</span>models.<span style="color: black;">Field</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'This code is based on the djangosnippet #1095
You can find the original at http://www.djangosnippets.org/snippets/1095/'</span><span style="color: #483d8b;">''</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        cipher = kwargs.<span style="color: black;">pop</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'cipher'</span>, <span style="color: #483d8b;">'AES'</span><span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">imp</span> = <span style="color: #008000;">__import__</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Crypto.Cipher'</span>, <span style="color: #008000;">globals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">locals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#91;</span>cipher<span style="color: black;">&#93;</span>, -<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span> = <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">imp</span>, cipher<span style="color: black;">&#41;</span>.<span style="color: #dc143c;">new</span><span style="color: black;">&#40;</span>settings.<span style="color: black;">SECRET_KEY</span><span style="color: black;">&#91;</span>:<span style="color: #ff4500;">32</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">prefix</span> = <span style="color: #483d8b;">'$%s$'</span> <span style="color: #66cc66;">%</span> cipher
&nbsp;
        max_length = kwargs.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'max_length'</span>, <span style="color: #ff4500;">40</span><span style="color: black;">&#41;</span>
        mod = max_length <span style="color: #66cc66;">%</span> <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">block_size</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> mod <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>:
            max_length += <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">block_size</span> - mod
        kwargs<span style="color: black;">&#91;</span><span style="color: #483d8b;">'max_length'</span><span style="color: black;">&#93;</span> = max_length <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">2</span> + <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">prefix</span><span style="color: black;">&#41;</span>
&nbsp;
        models.<span style="color: black;">Field</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _is_encrypted<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>value, <span style="color: #008000;">basestring</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> value.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">prefix</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _get_padding<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        mod = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">block_size</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> mod <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">block_size</span> - mod
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> to_python<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>._is_encrypted<span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">decrypt</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">binascii</span>.<span style="color: black;">a2b_hex</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#91;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">prefix</span><span style="color: black;">&#41;</span>:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\0</span>'</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> value
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_db_prep_value<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> value <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>._is_encrypted<span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>:
            padding = <span style="color: #008000;">self</span>._get_padding<span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> padding <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>:
                value += <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>&quot;</span> + <span style="color: #483d8b;">''</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #dc143c;">random</span>.<span style="color: black;">choice</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span>.<span style="color: black;">printable</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> index <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>padding-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            value = <span style="color: #008000;">self</span>.<span style="color: black;">prefix</span> + <span style="color: #dc143c;">binascii</span>.<span style="color: black;">b2a_hex</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cipher</span>.<span style="color: black;">encrypt</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> value
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> EncryptedTextField<span style="color: black;">&#40;</span>BaseEncryptedField<span style="color: black;">&#41;</span>:
    <span style="color: #0000cd;">__metaclass__</span> = models.<span style="color: black;">SubfieldBase</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_internal_type<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'TextField'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> formfield<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        defaults = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'widget'</span>: forms.<span style="color: black;">Textarea</span><span style="color: black;">&#125;</span>
        defaults.<span style="color: black;">update</span><span style="color: black;">&#40;</span>kwargs<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>EncryptedTextField, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">formfield</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">**</span>defaults<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> EncryptedCharField<span style="color: black;">&#40;</span>BaseEncryptedField<span style="color: black;">&#41;</span>:
    <span style="color: #0000cd;">__metaclass__</span> = models.<span style="color: black;">SubfieldBase</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_internal_type<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;CharField&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> formfield<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        defaults = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'max_length'</span>: <span style="color: #008000;">self</span>.<span style="color: black;">max_length</span><span style="color: black;">&#125;</span>
        defaults.<span style="color: black;">update</span><span style="color: black;">&#40;</span>kwargs<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>EncryptedCharField, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">formfield</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">**</span>defaults<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>And then in your models.py:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> encryption <span style="color: #ff7700;font-weight:bold;">import</span> EncryptedCharField
...
<span style="color: #ff7700;font-weight:bold;">class</span> Example<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    secret = EncryptedCharField<span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">class</span> Meta:
        ordering = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'secret'</span>,<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">secret</span></pre></td></tr></table></div>

<p>This should be pretty explanatory! Have fun!</p>
<p><em>PS: You need PyCrypto! Google much?</em></p>
]]></content:encoded>
			<wfw:commentRss>http://bryanhelmig.com/django-encryption/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

