#William Zhang
#3/12/20
#Senior 5
#Enloe
#Potter
#Contest 3

import numpy as np

f = open("sr-sample-input3.txt", 'r')
f = open("F:\\3sr.txt", 'r')

inputs = f.readlines()
inputs = [i.strip() for i in inputs]

def count(arr):
    a=b=c=d=na=nb=nc=nd=0
    for i in range(4):
        for j in range (4):
            if arr[i][j]==1:
                if i==0:
                    b+=1
                    nd+=1
                elif i==1:
                    b+=1
                    d+=1
                elif i==2:
                    nb+=1
                    d+=1
                elif i==3:
                    nb+=1
                    nd+=1
                if j==0:
                    a+=1
                    nc+=1
                elif j==1:
                    a+=1
                    c+=1
                elif j==2:
                    na+=1
                    c+=1
                elif j==3:
                    na+=1
                    nc+=1
    return a,b,c,d,na,nb,nc,nd

def turnoff(arr, char):
    if char=='A':
        for i in range(4):
            for j in range(4):
                if j==0 or j==1:
                    arr[i][j]=0
    elif char=='B':
        for i in range(4):
            for j in range(4):
                if i==0 or i==1:
                    arr[i][j]=0
    elif char=='C':
        for i in range(4):
            for j in range(4):
                if j==1 or j==2:
                    arr[i][j]=0
    elif char=='D':
        for i in range(4):
            for j in range(4):
                if i==1 or i==2:
                    arr[i][j]=0
    elif char=='~A':
        for i in range(4):
            for j in range(4):
                if j==2 or j==3:
                    arr[i][j]=0
    elif char=='~B':
        for i in range(4):
            for j in range(4):
                if i==2 or i==3:
                    arr[i][j]=0
    elif char=='~C':
        for i in range(4):
            for j in range(4):
                if j==0 or j==3:
                    arr[i][j]=0
    elif char=='~D':
        for i in range(4):
            for j in range(4):
                if i==0 or i==3:
                    arr[i][j]=0
    return arr

def one(arr):
    a,b,c,d,na,nb,nc,nd=count(arr)
    if b==8:
        return 'B'
    elif d==8:
        return 'D'
    elif nb==8:
        return '~B'
    elif a==8:
        return 'A'
    elif c==8:
        return 'C'
    elif na==8:
        return '~A'
    elif nd==8:
        return '~D'
    elif nc==8:
        return '~C'
    else: return 'none'

def two(arr):
    if np.all(arr[0]==1):
        arr[0]=np.zeros(4, dtype=int)
        return 'B~D', arr
    if np.all(arr[1]==1):
        arr[1]=np.zeros(4, dtype=int)
        return 'BD', arr
    if np.all(arr[2]==1):
        arr[2]=np.zeros(4, dtype=int)
        return '~BD', arr
    if np.all(arr[3]==1):
        arr[3]=np.zeros(4, dtype=int)
        return '~B~D', arr

    if np.all(arr[:,0]==1):
        arr[:,0]=np.zeros(4, dtype=int)
        return 'A~C', arr
    if np.all(arr[:,1]==1):
        arr[:,1]=np.zeros(4, dtype=int)
        return 'AC', arr
    if np.all(arr[:,2]==1):
        arr[:,2]=np.zeros(4, dtype=int)
        return '~AC', arr
    if np.all(arr[:,3]==1):
        arr[:,3]=np.zeros(4, dtype=int)
        return '~A~C', arr

    if np.all(arr[0:2, 0:2]==1):
        arr[0:2, 0:2]=np.zeros((2,2), dtype=int)
        return 'AB', arr
    if np.all(arr[0:2, 1:3]==1):
        arr[0:2, 1:3]=np.zeros((2,2), dtype=int)
        return 'BC', arr
    if np.all(arr[0:2, 2:4]==1):
        arr[0:2, 2:4]=np.zeros((2,2), dtype=int)
        return '~AB', arr

    if np.all(arr[1:3, 0:2]==1):
        arr[1:3, 0:2]=np.zeros((2,2), dtype=int)
        return 'AD', arr
    if np.all(arr[1:3, 1:3]==1):
        arr[1:3, 1:3]=np.zeros((2,2), dtype=int)
        return 'CD', arr
    if np.all(arr[1:3, 2:4]==1):
        arr[1:3, 2:4]=np.zeros((2,2), dtype=int)
        return '~AD', arr

    if np.all(arr[2:4, 0:2]==1):
        arr[2:4, 0:2]=np.zeros((2,2), dtype=int)
        return 'A~B', arr
    if np.all(arr[2:4, 1:3]==1):
        arr[2:4, 1:3]=np.zeros((2,2), dtype=int)
        return '~BC', arr
    if np.all(arr[2:4, 2:4]==1):
        arr[2:4, 2:4]=np.zeros((2,2), dtype=int)
        return '~A~B', arr

    if np.all(arr[0:2, 0:1]==1) and np.all(arr[0:2, 3:4]==1):
        arr[0:2, 0:1]=arr[0:2, 3:4]=np.zeros((2,1), dtype=int)
        return 'B~C', arr
    if np.all(arr[1:3, 0:1]==1) and np.all(arr[1:3, 3:4]==1):
        arr[1:3, 0:1]=arr[1:3, 3:4]=np.zeros((2,1), dtype=int)
        return '~CD', arr
    if np.all(arr[2:4, 0:1]==1) and np.all(arr[2:4, 3:4]==1):
        arr[2:4, 0:1]=arr[2:4, 3:4]=np.zeros((2,1), dtype=int)
        return '~B~C', arr

    if np.all(arr[0:1, 0:2]==1) and np.all(arr[3:4, 0:2]==1):
        arr[0:1, 0:2]=arr[3:4, 0:2]=np.zeros((2,1), dtype=int)
        return 'A~D', arr
    if np.all(arr[0:1, 1:3]==1) and np.all(arr[3:4, 1:3]==1):
        arr[0:1, 1:3]=arr[3:4, 1:3]=np.zeros((2,1), dtype=int)
        return 'C~D', arr
    if np.all(arr[0:1, 2:4]==1) and np.all(arr[3:4, 2:4]==1):
        arr[0:1, 2:4]=arr[3:4, 2:4]=np.zeros((2,1), dtype=int)
        return '~A~D', arr

    if arr[0,0]==1 and arr[0,3]==1 and arr[3,0]==1 and arr[3,3]==1:
        arr[0,0]=arr[0,3]=arr[3,0]=arr[3,3]=0
        return '~C~D', arr

    #group of 2, top row
    if np.all(arr[0:1, 0:2]==1):
        arr[0:1, 0:2]=np.zeros((1,2), dtype=int)
        return 'AB~D', arr
    if np.all(arr[0:1, 1:3]==1):
        arr[0:1, 1:3]=np.zeros((1,2), dtype=int)
        return 'BC~D', arr
    if np.all(arr[0:1, 2:4]==1):
        arr[0:1, 2:4]=np.zeros((1,2), dtype=int)
        return '~AB~D', arr

    if np.all(arr[1:2, 0:2]==1):
        arr[1:2, 0:2]=np.zeros((1,2), dtype=int)
        return 'ABD', arr
    if np.all(arr[1:2, 1:3]==1):
        arr[1:2, 1:3]=np.zeros((1,2), dtype=int)
        return 'BCD', arr
    if np.all(arr[1:2, 2:4]==1):
        arr[1:2, 2:4]=np.zeros((1,2), dtype=int)
        return '~ABD', arr

    if np.all(arr[2:3, 0:2]==1):
        arr[2:3, 0:2]=np.zeros((1,2), dtype=int)
        return 'A~BD', arr
    if np.all(arr[2:3, 1:3]==1):
        arr[2:3, 1:3]=np.zeros((1,2), dtype=int)
        return '~BCD', arr
    if np.all(arr[2:3, 2:4]==1):
        arr[2:3, 2:4]=np.zeros((1,2), dtype=int)
        return '~A~BD', arr

    if np.all(arr[3:4, 0:2]==1):
        arr[3:4, 0:2]=np.zeros((1,2), dtype=int)
        return 'A~B~D', arr
    if np.all(arr[3:4, 1:3]==1):
        arr[3:4, 1:3]=np.zeros((1,2), dtype=int)
        return '~BC~D', arr
    if np.all(arr[3:4, 2:4]==1):
        arr[3:4, 2:4]=np.zeros((1,2), dtype=int)
        return '~A~B~D', arr

    #group of 2, left column
    if np.all(arr[0:2, 0:1]==1):
        arr[0:2, 0:1]=np.zeros((2,1), dtype=int)
        return 'AB~C', arr
    if np.all(arr[1:3, 0:1]==1):
        arr[1:3, 0:1]=np.zeros((2,1), dtype=int)
        return 'A~CD', arr
    if np.all(arr[2:4, 0:1]==1):
        arr[2:4, 0:1]=np.zeros((2,1), dtype=int)
        return 'A~B~C', arr

    if np.all(arr[0:2, 1:2]==1):
        arr[0:2, 1:2]=np.zeros((2,1), dtype=int)
        return 'ABC', arr
    if np.all(arr[1:3, 1:2]==1):
        arr[1:3, 1:2]=np.zeros((2,1), dtype=int)
        return 'ACD', arr
    if np.all(arr[2:4, 1:2]==1):
        arr[2:4, 1:2]=np.zeros((2,1), dtype=int)
        return 'A~BC', arr

    if np.all(arr[0:2, 2:3]==1):
        arr[0:2, 2:3]=np.zeros((2,1), dtype=int)
        return '~ABC', arr
    if np.all(arr[1:3, 2:3]==1):
        arr[1:3, 2:3]=np.zeros((2,1), dtype=int)
        return '~ACD', arr
    if np.all(arr[2:4, 2:3]==1):
        arr[2:4, 2:3]=np.zeros((2,1), dtype=int)
        return '~A~BC', arr

    if np.all(arr[0:2, 3:4]==1):
        arr[0:2, 3:4]=np.zeros((2,1), dtype=int)
        return '~AB~C', arr
    if np.all(arr[1:3, 3:4]==1):
        arr[1:3, 3:4]=np.zeros((2,1), dtype=int)
        return '~A~CD', arr
    if np.all(arr[2:4, 3:4]==1):
        arr[2:4, 3:4]=np.zeros((2,1), dtype=int)
        return '~A~B~C', arr

    #end rows
    if np.all(arr[0,0]==1 and arr[0,3]==1):
        arr[0,0]=arr[0,3]=0
        return 'B~C~D', arr
    if np.all(arr[1,0]==1 and arr[1,3]==1):
        arr[1,0]=arr[1,3]=0
        return 'B~CD', arr
    if np.all(arr[2,0]==1 and arr[2,3]==1):
        arr[2,0]=arr[2,3]=0
        return '~B~CD', arr
    if np.all(arr[3,0]==1 and arr[3,3]==1):
        arr[3,0]=arr[3,3]=0
        return '~B~C~D', arr

    #end columns
    if np.all(arr[0,0]==1 and arr[3,0]==1):
        arr[0,0]=arr[3,0]=0
        return 'A~C~D', arr
    if np.all(arr[0,1]==1 and arr[3,1]==1):
        arr[0,1]=arr[3,1]=0
        return 'AC~D', arr
    if np.all(arr[0,2]==1 and arr[3,2]==1):
        arr[0,2]=arr[3,2]=0
        return '~AC~D', arr
    if np.all(arr[0,3]==1 and arr[3,3]==1):
        arr[0,3]=arr[3,3]=0
        return '~A~C~D', arr

    #singles
    if np.all(arr[0,0]==1):
        arr[0,0]=0
        return 'AB~C~D', arr
    if np.all(arr[0,1]==1):
        arr[0,1]=0
        return 'ABC~D', arr
    if np.all(arr[0,2]==1):
        arr[0,2]=0
        return '~ABC~D', arr
    if np.all(arr[0,3]==1):
        arr[0,3]=0
        return '~AB~C~D', arr

    if np.all(arr[1,0]==1):
        arr[1,0]=0
        return 'AB~CD', arr
    if np.all(arr[1,1]==1):
        arr[1,1]=0
        return 'ABCD', arr
    if np.all(arr[1,2]==1):
        arr[1,2]=0
        return '~ABCD', arr
    if np.all(arr[1,3]==1):
        arr[1,3]=0
        return '~AB~CD', arr

    if np.all(arr[2,0]==1):
        arr[2,0]=0
        return 'A~B~CD', arr
    if np.all(arr[2,1]==1):
        arr[2,1]=0
        return 'A~BCD', arr
    if np.all(arr[2,2]==1):
        arr[2,2]=0
        return '~A~BCD', arr
    if np.all(arr[2,3]==1):
        arr[2,3]=0
        return '~A~B~CD', arr

    if np.all(arr[3,0]==1):
        arr[3,0]=0
        return 'A~B~C~D', arr
    if np.all(arr[3,1]==1):
        arr[3,1]=0
        return 'A~BC~D', arr
    if np.all(arr[3,2]==1):
        arr[3,2]=0
        return '~A~BC~D', arr
    if np.all(arr[3,3]==1):
        arr[3,3]=0
        return '~A~B~C~D', arr
    
    return 'none', arr

def maketerm(arr):
    term=one(arr)
    if(one(arr)!='none'):
        arr=turnoff(arr, term)
        return term, arr
    term, arr=two(arr)
    if(term!='none'):
        return term, arr
    else: return '', arr
    
for i in range(5):
    binary = bin(int(inputs[i], 16)).replace('0b', '').zfill(16)
    diagram=np.zeros((4,4), dtype=int)
    for j in range(len(binary)):
        diagram[int(j/4)][j%4]=binary[j]
    #print(inputs[i])
    output=''
    counter=0
    while(not np.all(diagram==0) and counter<4):
        #print(diagram)
        term, diagram=maketerm(diagram)
        output=output+term+'+'
        counter+=1
    print(output[:-1])