// EPROG Runde 1: Bsp. 1154 (schwer)
// Autor: Michael Zöch
// MatrNr: 0305116
// E-mail: kongo@gmx.at
// HP: www.8ung.at/kongo
// Kurzbeschreibung:
//   Das Programm liest eine boolsche Funktion in disjunktiver Normalform ein und gibt das
//   entsprechende Karnaugh-Veitch-Diagramm aus. Eine disjunktive Normalform besteht aus
//   Disjunktionen von Vollkunjunktionen. Jede Vollkunjunktion wird mit den Buchstaben
//   "ABCD" angegeben, wobei:
//      _ _     _   _
//   (AnBnCnD)v(AnBnCnD)v... durch AbcD aBcD ... dargestellt wird.
//   
//   Am Ende muss ein "=" als eigener String angegeben werden, um das KV-Diagramm auszugeben
//   und das Programm zu beenden.

import eprog.*;

public class Disjnorm extends EprogIO
{
	// Konstanten
	static final String IN_ENDZEICHEN = "=";                      // Das Endzeichen
	static final String IN_UPPERCASE = "ABCD";                    // Der Eingabestring (in Upper Case)
	static final String OUT_1 = "1";                              // Ausgabezeichen, wenn die entsprechende Vollkunjunktion eingegeben wurde
	static final String OUT_0 = "0";                              // Ausgabezeichen, wenn die entsprechende Vollkunjunktion nicht eingegeben wurde
	static final String OUT_TRENNZEICHEN = " ";                   // Das Trennzeichen bei der Ausgabe
	static final String OUT_ERROR_MESSAGE = "FALSCHE EINGABE";    // Die Fehlermeldung

	static boolean kvdiag[][] = new boolean[4][4];             // Ein 4x4 Diagramm (das KV-Diagramm)

	// Verarbeitet jede Eingabe (Vollkunjunktion) des Benutzers zu einem KV-Diagramm Eintrag
	static boolean toKV(String in)
	{
		int row=-1, col=-1;   // Reihe, Spalte des KV-Diagramm

		// Die ersten beiden Charakter ergeben die Reihe
		if (in.charAt(0) == IN_UPPERCASE.charAt(0)) {
			if (in.charAt(1) == IN_UPPERCASE.charAt(1))
				row = 2;   // Beide groß geschrieben, zb. "AB"
			else
				row = 1;   // Erster groß geschrieben, zb. "Ab"
		} else {
			if (in.charAt(1) == IN_UPPERCASE.charAt(1))
				row = 3;   // Zweiter groß geschrieben, zb. "aB"
			else
				row = 0;   // Beide klein geschrieben, zb. "ab"
		}

		// Der 3. und der 4. Charakter ergeben die Spalte
		if (in.charAt(2) == IN_UPPERCASE.charAt(2)) {
			if (in.charAt(3) == IN_UPPERCASE.charAt(3))
				col = 1;   // beide groß geschrieben, zb. "CD"
			else
				col = 2;   // Dritter groß geschrieben, zb. "Cd"
		} else {
			if (in.charAt(3) == IN_UPPERCASE.charAt(3))
				col = 0;   // Vierter groß geschrieben, zb. "cD"
			else
				col = 3;   // Beide klein geschrieben, zb. "cd"
		}

		// Sollte der Diagrammeintrag schon einmal vorgekommen sein: Fehler -> gib false zurück
		if (kvdiag[row][col] == true)
			return false;

		// Ansonsten setze den Diagrammeintrag auf true
		kvdiag[row][col] = true;

		return true;	
	}

	public static void main(String[] args)
	{
		String input = "";     // Eingabe des Benutzers
		boolean err = false;   // true wenn Fehler in Eingabe

		do {
			// Eingaben lesen bis Benutzer "=" eingibt
			input = readWord();
			if (input.equals(IN_ENDZEICHEN))
				break;
				
			// Fehler schon aufgetreten, nur mehr auf Eingabe von Endzeichen warten
			if (err) continue;

			// Prüfen ob Input gleich "ABCD" ist (keine Prüfung der Groß/Kleinschreibung)
			// wenn nicht -> Fehler
			if (!input.equalsIgnoreCase(IN_UPPERCASE)) {
				err = true;
				continue;
			}

			// Sollte noch kein Fehler aufgetreten sein
			// Eingabe in das KV-Diagramm übertragen
			// Wurde diese Vollkonjunktion schon einmal eingegeben, liefert die Funktion false zurück
			if (toKV(input) == false)
				err = true;
		} while(true);

		if (err) {
			// Fehler -> Fehlermeldung ausgeben
			println(OUT_ERROR_MESSAGE);
		} else {
			// Kein Fehler -> KV-Diagramm ausgeben
			for (int i = 0; i < 16; i++) {
				// Zwischen den Reihen ein Trennzeichen einfügen, aber nicht ganz am Anfang
				if (i != 0 && i%4 == 0) print(OUT_TRENNZEICHEN);
				// Ist der Diagrammeintrag auf true gesetzt: gibt OUT_1 aus, ansonsten OUT_2
				print(kvdiag[i/4][i%4]==true ? OUT_1 : OUT_0);
			}
			println();
		}
	}  // void main

}  // class Disjnorm