Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so dont bother with any of their useless mail servers here and just use oauth login instead. Thank the nice Russians for causing that. :)

Paste

Pasted as Python by terror_macbeth_I ( 16 years ago )
#!/usr/bin/python
# vim:fileencoding=utf-8

from collections import defaultdict


class RuleOrganizer(object):

    def __init__(self, field_lengths):
        self.field_lengths = field_lengths
        self.rules_by_field = defaultdict(list)

    def cross_fields(self, other_field, other_letter, own_field, own_letter):
        if other_field > own_field:
            other_field, own_field = own_field, other_field
            other_letter, own_letter = own_letter, other_letter
        crossing = {'other_field': other_field,
                        'other_letter': other_letter,
                        'own_letter': own_letter}
        newrule = (self.field_lengths[own_field], crossing)
        self.rules_by_field[own_field].append(newrule)


class Vertex(object):
    def __init__(self, depth, parent, CWR):
        self.depth = depth
        self.parent = parent
        self.CWR = CWR
        self.children = []


def create_vocabulary(filename):
    with open(filename, 'r') as f:
        vocabulary = f.read().split()
    return vocabulary


def solve_CWR(vertex, indexed_vocab_dict, rules):
    if vertex.depth == len(rules):
        return
    rule = rules[vertex.depth+1]
    vocabulary = set()
    length, crossing = rule[0]
    indexed_vocab = indexed_vocab_dict[length]
    for length, crossing in rule:
        index = crossing['own_letter']
        letter = vertex.CWR[crossing['other_field']][crossing['other_letter']]
        if vocabulary:
            vocabulary.intersection_update(indexed_vocab[index][letter])
        else:
            vocabulary = set(indexed_vocab[index][letter])

    for word in vocabulary:
        CWR = vertex.CWR[:]
        CWR.append(word)
        newchild = Vertex(vertex.depth+1, vertex, CWR)
        vertex.children.append(newchild)
        solve_CWR(newchild, indexed_vocab_dict, rules)


def print_solutions(vertex):
    if vertex.depth == 3:
        print vertex.CWR
        return
    for child in vertex.children:
        print_solutions(child)


def count_solutions(vertex, c, depth):
    if vertex.depth == depth:
        return c+1
    for child in vertex.children:
        c = count_solutions(child, c, depth)
    return c

def index_vocabulary(vocabulary):
    indexed_vocab = []
    for word in vocabulary:
        for i, letter in enumerate(word):
            try:
                d = indexed_vocab[i]
                d[letter].append(word)
            except IndexError:
                d = defaultdict(list)
                d[letter].append(word)
                indexed_vocab.append(d)
    return indexed_vocab

if __name__ == '__main__':
    import random
    from time import time

    vocabulary = create_vocabulary('./fours.txt')
    rind = (random.randint(0, len(vocabulary)-1) for i in xrange(500))
    vocabulary = [vocabulary[i] for i in rind]
    indexed_vocab = index_vocabulary(vocabulary)
    indexed_vocab_dict = {4: indexed_vocab}

    rules = RuleOrganizer([4, 4, 4, 4])
    rules.cross_fields(other_field=0, other_letter=3, own_field=1, own_letter=0)
    rules.cross_fields(other_field=1, other_letter=3, own_field=2, own_letter=3)
    rules.cross_fields(other_field=3, other_letter=3, own_field=2, own_letter=0)
    rules.cross_fields(other_field=0, other_letter=0, own_field=3, own_letter=0)

    CWR = [vocabulary[random.randint(0, len(vocabulary)-1)]]
    root = Vertex(0, None, CWR)
    t0 = time()
    solve_CWR(root, indexed_vocab_dict, rules.rules_by_field)
    t1 = time()
    #print_solutions(root)
    c = count_solutions(root, 0, 3)
    print t1-t0, c

 

Revise this Paste

Your Name: Code Language: