00000 -> Pb-Pb 00001 -> Pb-Sn 00010 -> Pb-Fe 00011 -> Pb-Cu 00100 -> Sn-Pb 00101 -> Sn-Sn 00110 -> Sn-Fe 00111 -> Sn-Cu 01000 -> Fe-Pb 01001 -> Fe-Sn 01010 -> Fe-Fe 01011 -> Fe-Cu 01100 -> Cu-Pb 01101 -> Cu-Sn 01110 -> Cu-Fe 01111 -> Cu-Cu 10000 -> Au-Pb 10001 -> Au-Sn 10010 -> Au-Fe 10011 -> Au-Cu 10100 -> Pb-Au 10101 -> Sn-Au 10110 -> Fe-Au 10111 -> Cu-Au 11000 -> Ag-Pb 11001 -> Ag-Sn 11010 -> Ag-Fe 11011 -> Ag-Cu 11100 -> Pb-Ag 11101 -> Sn-Ag 11110 -> Fe-Ag 11111 -> Cu-Ag Remaining: Ag-Ag Ag-Au Au-Ag Au-Au Translate ---XX (00, 01, 10, 11) to (Pb, Sn, Fe, Cu) for RH Atom IF 10--- THEN LH Atom=Au ELSE IF 11--- THEN LH Atom=Ag AND IF --1-- THEN SwapOutputAtomsAround ELSE Translate -XX-- (00, 01, 10, 11) to (Pb, Sn, Fe, Cu) It was a tough assignment, yet somehow I managed to get it to work... a lot of clunky fiddling to avoid collisions and dispose / chain waste! I'm sure further improvements could be made but getting the bloody thing working in all cases without collisions was my priority...! Managed to tweak and improve slightly since first submission, even managing to get 'budget encoding' (under 1000G)!