I was set a challenge after I told somebody I exported a dictionary to a database (simple python script to export the OPTED dictionary HTML pages into a database), it was to convert space-less Morse code into a word.
e.g.
Normally messages would be: .- .--. .--. .-.. . (apple), with a space in between each character.
But since there is a database to check every possibility against, the new input would be: .-.--..--..-... (apple), without the spaces in between.
I wrote a python script to do this, but I found a very odd phenomena, old values (which aren't stored in any variable) are coming up again.
Code is below:
import sqlite3
conn = sqlite3.connect('english_dictionary.db')
c = conn.cursor()
#Morse code alphabet
mc = {'.-' : 'a', '-...' : 'b', '-.-.' : 'c', '-..' : 'd', '.' : 'e', '..-.' : 'f', '--.' : 'g', '....' : 'h', '..' : 'i', '.---' : 'j', '-.-' : 'k', '.-..' : 'l', '--' : 'm', '-.' : 'n', '---' : 'o', '.--.' : 'p', '--.-' : 'q', '.-.' : 'r', '...' : 's', '-' : 't', '..-' : 'u', '...-' : 'v', '.--' : 'w', '-..-' : 'x', '-.--' : 'y', '--..' : 'z'}
#Recursive function - input, current words, current index, current_word
def magic(inp, curwords=[''], curindex=0, current_word=''):
    #print 'inp: "%s", curwords = %s, curindex = %i, current_word = "%s"' % (inp, str(curwords), curindex, current_word)
    #If the function is being called with an empty input, then this word has been finished, so set it up for a new one
    if inp == "":
        curwords.append('')
        curindex += 1
        return curwords,curindex
    #Finding valid Morse code letters
    for i in range(1, len(inp)+1):
        #print 'Current: %i in (1, %i)' % (i, len(inp)+1)
        if inp[:i] in mc:
            #print 'Morse Code: "%s" -> %s in (1, %i)' % (inp[:i],mc[inp[:i]], len(inp)+1)
            curwords[curindex] = current_word + mc[inp[:i]]
            curwords,curindex = magic(inp[i:], curwords, curindex, current_word + mc[inp[:i]])
        #else:
            #print 'Not Morse Code: "%s" in (1, %i)' % (inp[:i], len(inp)+1)
    return curwords,curindex
while 1:
    x = raw_input('> ')
    mag = magic(x)[0]
    for row in c.execute('SELECT DISTINCT word FROM dictionary WHERE LOWER(word) IN %s' % (str(tuple(mag)))):
        print row[0]
(Please ask if you want part of the code explained more in-depth)
The problem:
If I input ..- it returns It
If I input --. it returns Me
(Both of which are correct)
However if I do .-.--..--..-... it returns Apple (again, correct but here is where it breaks)
Now, if I do any morse code after I check Apple, then Apple is returned as a result.
e.g.
(Run these in order)
> ..- -> It
> --. -> Me
> .-.--..--..-... -> Apple
> ..- -> Apple, It
> --. -> Apple, Me
I made it output mag before the SQL statement, and it has all the possibilities that apple has + the possibilities of the new input (therefor its not caused by SQL).
I have tried adding mag = [] at the end of the while loop, and still doesn't work.
I had experienced odd behavior similar to this in a different language which was caused by modifying the value of arguments parsed into a function, so I tried copying the values to new variables, but to no avail.