#include <stdio.h>
#include <stdlib.h>
#define NOTA 1
#define NOTB 2
#define NOTC 4
#define AND 1
#define OR 2
#define NOT 3
#define PORTA 4
#define PORTB 5
#define PORTC 6
char nametable[ 7 ] [ 5 ] = { "NONE" , "AND" , "OR" , "NOT" , "A" , "B" , "C" } ;
unsigned int three_notflag[ 3 ] = { 0 , 0 , 0 } ;
typedef unsigned char flag;
typedef unsigned char bln;
typedef unsigned char tt;
typedef unsigned char gate;
const tt three_not[ 3 ] = { 0x0f , 0x33 , 0x55 } ;
/* possible truth table ( 3 input tables for 3 depth ) */
struct ptt_t{
flag possible;
tt srca, srcb;
gate type;
} ;
typedef struct ptt_t ptt;
ptt ptts[ 3 * 256 ] ;
int current_count[ 3 ] = { 0 , 0 , 0 } ;
int current_depth = 0 ;
void dump_exit( void )
{
FILE * fp;
int i;
fopen_s( & fp , "answer.txt" , "w" ) ;
for ( i = current_depth* 256 ; i < current_depth* 256 + 256 ; i++ ) {
if ( ptts[ i] .possible ) {
( unsigned char ) i , nametable[ ptts[ i] .type ] ) ;
if ( AND <= ptts[ i] .type && ptts[ i] .type <= OR )
fprintf ( fp
, "(%02x,%02x)\n " , ptts
[ i
] .
srca , ptts
[ i
] .
srcb ) ; else if ( ptts[ i] .type == NOT )
fprintf ( fp
, "(%02x)\n " , ptts
[ i
] .
srca ) ; else
}
}
}
void cp_ptts( int srcdepth )
{
int i, ix = srcdepth* 256 ;
for ( i = 0 ; i < 256 ; i++ ) {
ptts[ i+ ix+ 256 ] = ptts[ i+ ix] ;
}
current_count[ srcdepth+ 1 ] = current_count[ srcdepth] ;
three_notflag[ srcdepth+ 1 ] = three_notflag[ srcdepth] ;
}
void apply_gate( tt a , tt b , gate tp )
{
tt y;
int ix, i;
switch ( tp ) {
case AND: y = a & b; break ;
case OR: y = a | b; break ;
case NOT: y = ~a; break ;
}
ix = y+ current_depth* 256 ;
if ( ptts[ ix] .possible == 0 ) {
ptts[ ix] .possible = 1 ;
ptts[ ix] .srca = a;
ptts[ ix] .srcb = b;
ptts[ ix] .type = tp;
current_count[ current_depth] ++;
for ( i = 0 ; i < 3 ; i++ ) {
if ( three_not[ i] == y ) {
three_notflag[ current_depth] |= ( 1 << i ) ;
if ( three_notflag[ current_depth] == 7 )
dump_exit( ) ;
}
}
}
}
void apply_gate2all_conbination( void )
{
tt a, b;
int i;
gate types[ 2 ] = { AND , OR } ;
for ( ;; ) {
int oldcount = current_count[ current_depth] ;
for ( i = 0 ; i < 2 ; i++ ) {
for ( a = 0 ; a < 255 ; a++ ) {
if ( ptts[ current_depth* 256 + a] .possible ) {
for ( b = a+ 1 ; b != 0 ; b++ ) {
if ( ptts[ current_depth* 256 + b] .possible )
apply_gate( a , b , types[ i] ) ;
}
}
}
}
if ( oldcount == current_count[ current_depth] ) break ;
}
}
tt mtt( bln a000 , bln a001 , bln a010 , bln a011 , bln a100 , bln a101 , bln a110 , bln a111 )
{
unsigned char ret = a000;
ret += ( a001 ? 2 : 0 ) ;
ret += ( a010 ? 4 : 0 ) ;
ret += ( a011 ? 8 : 0 ) ;
ret += ( a100 ? 16 : 0 ) ;
ret += ( a101 ? 32 : 0 ) ;
ret += ( a110 ? 64 : 0 ) ;
ret += ( a111 ? 128 : 0 ) ;
return ret;
}
void do_recursive( void )
{
int i = 0 ;
cp_ptts( current_depth) ;
current_depth++;
while ( i < 256 ) {
if ( ptts[ i+ current_depth* 256 ] .possible == 0 ) {
i++;
continue ;
}
apply_gate( i , 0 , NOT ) ;
apply_gate2all_conbination( ) ;
printf ( "%d:%d\n " , current_depth
, current_count
[ current_depth
] ) ;
if ( current_depth < 2 ) {
do_recursive( ) ;
}
cp_ptts( current_depth- 1 ) ;
i++;
}
current_depth--;
}
int main( int argc , char * argv[ ] )
{
int i;
for ( i = 0 ; i < 256 ; i++ ) {
ptts[ i] .possible = 0 ;
}
ptts[ mtt( 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 ) ] .possible = 1 ;
ptts[ mtt( 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 ) ] .type = PORTA;
ptts[ mtt( 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 ) ] .possible = 1 ;
ptts[ mtt( 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 ) ] .type = PORTB;
ptts[ mtt( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ) ] .possible = 1 ;
ptts[ mtt( 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ) ] .type = PORTC;
current_count[ 0 ] = 3 ;
current_depth = 0 ;
/* make level 1 */
apply_gate2all_conbination( ) ;
/* go */
do_recursive( ) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgTk9UQQkxCiNkZWZpbmUgTk9UQgkyCiNkZWZpbmUgTk9UQwk0CgojZGVmaW5lIEFORAkJMQojZGVmaW5lIE9SCQkyCiNkZWZpbmUgTk9UCQkzCiNkZWZpbmUgUE9SVEEJNAojZGVmaW5lIFBPUlRCCTUKI2RlZmluZSBQT1JUQwk2CgpjaGFyIG5hbWV0YWJsZVs3XVs1XSA9IHsgIk5PTkUiICwgIkFORCIgLCAiT1IiICwgIk5PVCIgLCAiQSIgLCAiQiIgLCAiQyIgfTsKdW5zaWduZWQgaW50IHRocmVlX25vdGZsYWdbM10gPSB7IDAgLCAwICwgMCB9OwoKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGZsYWc7CnR5cGVkZWYgdW5zaWduZWQgY2hhciBibG47CnR5cGVkZWYgdW5zaWduZWQgY2hhciB0dDsKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGdhdGU7Cgpjb25zdCB0dCB0aHJlZV9ub3RbM10gPSB7IDB4MGYgLCAweDMzICwgMHg1NSB9OwoKLyogcG9zc2libGUgdHJ1dGggdGFibGUgKCAzIGlucHV0IHRhYmxlcyBmb3IgMyBkZXB0aCApICovCnN0cnVjdCBwdHRfdHsKCWZsYWcgcG9zc2libGU7Cgl0dCBzcmNhLHNyY2I7CglnYXRlIHR5cGU7Cn07Cgp0eXBlZGVmIHN0cnVjdCBwdHRfdCBwdHQ7CnB0dCBwdHRzWzMqMjU2XTsKCmludCBjdXJyZW50X2NvdW50WzNdID0geyAwICwgMCAsIDAgfTsKaW50IGN1cnJlbnRfZGVwdGggPSAwOwoKdm9pZCBkdW1wX2V4aXQoIHZvaWQgKQp7CglGSUxFICpmcDsKCWludCBpOwoKCXByaW50ZiggIkl0J3MgZm91bmQgLlxuIiApOwoJZm9wZW5fcyggJmZwICwgImFuc3dlci50eHQiICwgInciICk7CgoJZm9yKCBpID0gY3VycmVudF9kZXB0aCoyNTYgOyBpIDwgY3VycmVudF9kZXB0aCoyNTYrMjU2IDsgaSsrICkgewoJCWlmKCBwdHRzW2ldLnBvc3NpYmxlICkgewoJCQlmcHJpbnRmKCBmcCAsICIlMDJ4OiVzIiAsCgkJCQkJKHVuc2lnbmVkIGNoYXIpaSAsIG5hbWV0YWJsZVtwdHRzW2ldLnR5cGVdICk7CgkJCWlmKCBBTkQgPD0gcHR0c1tpXS50eXBlICYmIHB0dHNbaV0udHlwZSA8PSBPUiApCgkJCQlmcHJpbnRmKCBmcCAsICIoJTAyeCwlMDJ4KVxuIiAsIHB0dHNbaV0uc3JjYSAsIHB0dHNbaV0uc3JjYiApOwoJCQllbHNlIGlmKCBwdHRzW2ldLnR5cGUgPT0gTk9UICkKCQkJCWZwcmludGYoIGZwICwgIiglMDJ4KVxuIiAsIHB0dHNbaV0uc3JjYSApOwoJCQllbHNlCgkJCQlmcHJpbnRmKCBmcCAsICJcbiIgKTsKCQl9Cgl9CglmY2xvc2UoIGZwICk7CgoJZXhpdCgxKTsKfQoKdm9pZCBjcF9wdHRzKCBpbnQgc3JjZGVwdGggKQp7CglpbnQgaSxpeCA9IHNyY2RlcHRoKjI1NjsKCglmb3IoIGkgPSAwIDsgaSA8IDI1NiA7IGkrKyApIHsKCQlwdHRzW2kraXgrMjU2XSA9IHB0dHNbaStpeF07Cgl9CgljdXJyZW50X2NvdW50W3NyY2RlcHRoKzFdID0gY3VycmVudF9jb3VudFtzcmNkZXB0aF07Cgl0aHJlZV9ub3RmbGFnW3NyY2RlcHRoKzFdID0gdGhyZWVfbm90ZmxhZ1tzcmNkZXB0aF07Cn0KCnZvaWQgYXBwbHlfZ2F0ZSggdHQgYSAsIHR0IGIgLCBnYXRlIHRwICkKewoJdHQgeTsKCWludCBpeCxpOwoKCXN3aXRjaCggdHAgKSB7CgljYXNlIEFORDogeSA9IGEgJiBiOyBicmVhazsKCWNhc2UgT1I6IHkgPSBhIHwgYjsgYnJlYWs7CgljYXNlIE5PVDogeSA9IH5hOyBicmVhazsKCX0KCglpeCA9IHkrY3VycmVudF9kZXB0aCoyNTY7CgoJaWYoIHB0dHNbaXhdLnBvc3NpYmxlID09IDAgKSB7CgkJcHR0c1tpeF0ucG9zc2libGUgPSAxOwoJCXB0dHNbaXhdLnNyY2EgPSBhOwoJCXB0dHNbaXhdLnNyY2IgPSBiOwoJCXB0dHNbaXhdLnR5cGUgPSB0cDsKCQljdXJyZW50X2NvdW50W2N1cnJlbnRfZGVwdGhdKys7CgoJCWZvciggaSA9IDAgOyBpIDwgMyA7IGkrKyApIHsKCQkJaWYoIHRocmVlX25vdFtpXSA9PSB5ICkgewoJCQkJdGhyZWVfbm90ZmxhZ1tjdXJyZW50X2RlcHRoXSB8PSAoIDEgPDwgaSApOwoJCQkJaWYoIHRocmVlX25vdGZsYWdbY3VycmVudF9kZXB0aF0gPT0gNyApCgkJCQkJZHVtcF9leGl0KCk7CgkJCX0KCQl9Cgl9Cn0KCnZvaWQgYXBwbHlfZ2F0ZTJhbGxfY29uYmluYXRpb24oIHZvaWQgKQp7Cgl0dCBhLGI7CglpbnQgaTsKCWdhdGUgdHlwZXNbMl0gPSB7IEFORCAsIE9SIH07CgoJZm9yKDs7KSB7CgkJaW50IG9sZGNvdW50ID0gY3VycmVudF9jb3VudFtjdXJyZW50X2RlcHRoXTsKCgkJZm9yKCBpID0gMCA7IGkgPCAyIDsgaSsrICkgewoJCQlmb3IoIGEgPSAwIDsgYSA8IDI1NSA7IGErKyApIHsKCQkJCWlmKCBwdHRzW2N1cnJlbnRfZGVwdGgqMjU2K2FdLnBvc3NpYmxlICkgewoJCQkJCWZvciggYiA9IGErMSA7IGIgIT0gMCA7IGIrKyApIHsKCQkJCQkJaWYoIHB0dHNbY3VycmVudF9kZXB0aCoyNTYrYl0ucG9zc2libGUgKQoJCQkJCQkJYXBwbHlfZ2F0ZSggYSAsIGIgLCB0eXBlc1tpXSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQlpZiggb2xkY291bnQgPT0gY3VycmVudF9jb3VudFtjdXJyZW50X2RlcHRoXSApIGJyZWFrOwoJfQp9Cgp0dCBtdHQoIGJsbiBhMDAwICwgYmxuIGEwMDEgLCBibG4gYTAxMCAsIGJsbiBhMDExICwgYmxuIGExMDAgLCBibG4gYTEwMSAsIGJsbiBhMTEwICwgYmxuIGExMTEgKQp7Cgl1bnNpZ25lZCBjaGFyIHJldCA9IGEwMDA7CglyZXQgKz0gKCBhMDAxID8gMiA6IDAgKTsKCXJldCArPSAoIGEwMTAgPyA0IDogMCApOwoJcmV0ICs9ICggYTAxMSA/IDggOiAwICk7CglyZXQgKz0gKCBhMTAwID8gMTYgOiAwICk7CglyZXQgKz0gKCBhMTAxID8gMzIgOiAwICk7CglyZXQgKz0gKCBhMTEwID8gNjQgOiAwICk7CglyZXQgKz0gKCBhMTExID8gMTI4IDogMCApOwoKCXJldHVybiByZXQ7Cn0KCnZvaWQgZG9fcmVjdXJzaXZlKCB2b2lkICkKewoJaW50IGkgPSAwOwoKCWNwX3B0dHMoY3VycmVudF9kZXB0aCk7CgljdXJyZW50X2RlcHRoKys7CgoJd2hpbGUoIGkgPCAyNTYgKSB7CgkJaWYoIHB0dHNbaStjdXJyZW50X2RlcHRoKjI1Nl0ucG9zc2libGUgPT0gMCApIHsKCQkJaSsrOwoJCQljb250aW51ZTsKCQl9CgkJYXBwbHlfZ2F0ZSggaSAsIDAgLCBOT1QgKTsKCQlhcHBseV9nYXRlMmFsbF9jb25iaW5hdGlvbigpOwoKCQlwcmludGYoICIlZDolZFxuIiAsIGN1cnJlbnRfZGVwdGggLCBjdXJyZW50X2NvdW50W2N1cnJlbnRfZGVwdGhdICk7CgoJCWlmKCBjdXJyZW50X2RlcHRoIDwgMiApIHsKCQkJZG9fcmVjdXJzaXZlKCk7CgkJfQoJCWNwX3B0dHMoY3VycmVudF9kZXB0aC0xKTsKCQlpKys7Cgl9CgoJY3VycmVudF9kZXB0aC0tOwp9CgppbnQgbWFpbiggaW50IGFyZ2MgLCBjaGFyICphcmd2W10gKQp7CglpbnQgaTsKCglmb3IoIGkgPSAwIDsgaSA8IDI1NiA7IGkrKyApIHsKCQlwdHRzW2ldLnBvc3NpYmxlID0gMDsKCX0KCglwdHRzW210dCgwLDAsMCwwLDEsMSwxLDEpXS5wb3NzaWJsZSA9IDE7CglwdHRzW210dCgwLDAsMCwwLDEsMSwxLDEpXS50eXBlID0gUE9SVEE7CglwdHRzW210dCgwLDAsMSwxLDAsMCwxLDEpXS5wb3NzaWJsZSA9IDE7CglwdHRzW210dCgwLDAsMSwxLDAsMCwxLDEpXS50eXBlID0gUE9SVEI7CglwdHRzW210dCgwLDEsMCwxLDAsMSwwLDEpXS5wb3NzaWJsZSA9IDE7CglwdHRzW210dCgwLDEsMCwxLDAsMSwwLDEpXS50eXBlID0gUE9SVEM7CgljdXJyZW50X2NvdW50WzBdID0gMzsKCgljdXJyZW50X2RlcHRoID0gMDsKCS8qIG1ha2UgbGV2ZWwgMSAqLwoJYXBwbHlfZ2F0ZTJhbGxfY29uYmluYXRpb24oKTsKCS8qIGdvICovCglkb19yZWN1cnNpdmUoKTsKCglyZXR1cm4gMDsKfQ==