#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

SRCLEN=6  # Anzahl der Bits in den zu kodierenden Worten
PARLEN=3  # Anzahl der Paritäts-Bits


def create_words(len):
    # Erzeuge eine Liste aller Worte mit Länge len
    array = [[]]
    for i in range(0,len):
        newarray = []
        for v in array:
            for j in [0,1]:
                newarray.append (v+[j])
        array = newarray
    return array


def apply_parity_checks (word, checks):
    # Parity Checks (Summe: 0) anwenden
    newword = []  # Kopieren mit "newword = word" geht nicht...
    for i in range(0,len(word)): newword.append(word[i])
    
    for c in checks:
        parity = 0
        for i in range(0,len(c)):
            if c[i] == 1:   parity += word[i]
            if parity == 2: parity = 0
        newword.append(parity)
    return newword


def parity_code(input,checks):
    # Aus einem Array von Eingabeworten und einer Liste
    # von Parity-Checks einen Code berechnen
    out = []
    for w in input:
        res = apply_parity_checks (w, checks)
        out.append(res)
    return out


def distance(x,y):
    # Hamming-Distanz zweier Worte berechnen
    dist = 0
    for i in range(0,len(x)):
        if x[i] != y[i]:  dist+=1
    return dist


def hamming_distance(code):
    # Hamming-Distanz eines Codes berechnen (minimaler Abstand
    # distance(x,y) für alle x != y
    dist=50000  # große Länge als Anfangswert
    for x in code:
        for y in code:
            if x != y: dist = min (dist, distance(x,y))
    return dist



inputs=create_words(SRCLEN)


checks=create_words(PARLEN)


num = len(inputs)

for i1 in range(0,num):
    c1 = inputs[i1]
    for i2 in range(i1+1,num):
        c2 = inputs[i2]
        for i3 in range(i2+1,num):
            c3 = inputs[i3]
            for i4 in range(i3+1,num):
                c4 = inputs[i4]
                code = parity_code (inputs,[c1,c2,c3,c4])
                d = hamming_distance(code)
                if d > 1:
                    print "Hamming-Distanz Inputs:",d, "für Code", c1, c2, c3, c4

