package math.cipher;

import stdlib.StdIn;

/*************************************************************************
 *  Compilation:  javac HammingDecoder.java StdIn.java
 *  Execution:    java HammingDecoder < all7.txt
 *  
 *  Read in sequences of 7 Hamming-encoded bits at a time from
 *  stdin, and print 4 corrected bits to stdout. Assumes input
 *  is a multiple of 7 bits (or is terminated with FFFF).
 *
 *  % java HammingEncoder < all4.txt | java HammingDecoder
 *
 *************************************************************************/

public class HammingDecoder {

    // return an integer corresponding to the 4 digit hex string
    public static int fromHex(String s) {
        return Integer.parseInt(s, 16)  & 0xFFFF;
    }

    public static void main(String[] args) {

        while(!StdIn.isEmpty()) {
            int m1 = StdIn.readInt();
            if (m1 == 0xFFFF) break;
            int m2 = StdIn.readInt();
            int m3 = StdIn.readInt();
            int m4 = StdIn.readInt();
            int p1 = StdIn.readInt();
            int p2 = StdIn.readInt();
            int p3 = StdIn.readInt();

            // check parity bits
            int c1 = p1 ^ m1 ^ m2 ^ m4;
            int c2 = p2 ^ m1 ^ m3 ^ m4;
            int c3 = p3 ^ m2 ^ m3 ^ m4;

            // flip bits if necessary
            if (c1 + c2 + c3 == 3) m4 = 1 ^ m4;
            else if (c1 + c2 == 2) m1 = 1 ^ m1;
            else if (c1 + c3 == 2) m2 = 1 ^ m2;
            else if (c2 + c3 == 2) m3 = 1 ^ m3;

            // print corrected bits
            System.out.println(m1 + " " + m2 + " " + m3 + " " + m4);
        }
    }
}
