[ create a new paste ] login | about

Link: http://codepad.org/f932DgLT    [ raw code | fork ]

iamyeasin - C++, pasted on Jan 10:
#include <bits/stdc++.h>

using namespace std;

int censor[1234];
string decode;
vector < string > vc;
map <string , string >mp;


bool isReverse ( long n ){
    int start[] = {0,0,1,1,0};
    for( int i=n,j=0; i>=(n-4); j++,i-- ){
        if(start[j] != censor[i])return false;
    }
    return true;
}

bool isRight ( long n ){
    bool start[] = {0,0,1,1,0};
    for( int i=1,j=0; i<=(5); j++,i++ ){
        if(start[j] != censor[i])return false;
    }
    return true;
}


void init(){
    mp ["00001"] = "0";
    mp ["10001"] = "1";
    mp ["01001"] = "2";
    mp ["11000"] = "3";
    mp ["00101"] = "4";
    mp ["10100"] = "5";
    mp ["01100"] = "6";
    mp ["00011"] = "7";
    mp ["10010"] = "8";
    mp ["10000"] = "9";
    mp ["00100"] = "-";
    mp ["00110"] = "S";
}


int gen_c( int n ){
    long sum = 0;

    for(int i=1; i<=n; i++){

        int wci = ((decode[i] == '-') ? 10 : decode[i]-'0');
        sum += ((((n-i)%10)+1) * wci);
    }
    return (sum % 11);
}

int gen_k( int n , int c ){ // send n+1 for calculating C
    long sum = 0;

    for(int i=1; i<=n; i++){
        int wci = ((decode[i] == '-') ? 10 : decode[i]-'0');
        sum += ((((n-i+1)%9)+1) * wci);
    }
    int wci = ((c == '-') ? 10 : c);
    sum += ((((0)%9)+1) * wci);

    return (sum %= 11);
}

int percent ( int n ){
    return ceil( (long) (n*5.00/100.00))+1;
}

int main() {
//    freopen("in.txt","rt",stdin);
//    freopen("out.txt","wt",stdout);
    init();

    long m,tc=0;
    while ( scanf("%ld",&m),m ){
        decode = "";

        int once = (1 << 16) , twice = -(1 << 16) ;
        for ( int i=1; i<=m; i++ ){
            scanf("%d",&censor[i]);
            once = ( censor[i] < once ) ? censor[i] : once;
            twice = ( censor[i] > twice ) ? censor[i] : twice;
        }
        /// Start working from here idiot .. Start fresh

//        cout << percent( ) << endl;
        int range1 = once - (percent(once));
        int range2 = once + (percent(once));
        int ra1 = once * 2;
        int par1 = twice - percent(twice);
        int par2 = twice + percent(twice);
        cout << ra1 << endl;

        for ( int i=1; i<=m; i++ ) {

            if( (censor[i]>= range1 && censor[i] <= range2) && (censor[i] < ra1)) censor[i] = 0;
            else if((censor[i] >= par1) && (censor[i] <= par2) ) censor[i] = 1;
            else {
                printf("Case %d: bad code\n",++tc);
                break;
            }
            //censor[i] = ( censor[i] == once ) ? 0 : 1 ;
//            cout << i << " " << censor[i] << endl;

        }

        bool r = isReverse( m );

//        for(int i=1; i<=m; i++) {
//            printf("%2d",censor[i]);
//            if(!(i%10))cout << endl;
//        }
//        cout << endl << r << " " << isRight(m) << endl;
        if( (!r && !isRight(m)) ){
            printf("Case %d: bad code\n",++tc);
            continue;
        }

        int exit = 0;
        if( r ){
            for ( int i=m-5; i>=1; i-=6) censor[i] = 5;
            string s1 = "";

            for(int i=m; i>=1; i-- ){
                if(censor[i] > 1 ){
                    if( mp[s1] == ""){
                        printf("Case %d: bad code\n",++tc);
                        exit = 1;
                        break;
                    }
                    decode += (mp[s1]) ;
                    s1 = "";
                }
                else s1 += (censor[i]+'0');
            }
            if( mp[s1] == "" && !exit){
                        printf("Case %d: bad code\n",++tc);
                        exit = 1;
                        break;
            }
            decode += (mp[s1]) ;
            s1 = "";
        }
        else {
            for ( int i=6; i<=m; i+=6){
                censor[i] = 5;
            }

            string s1 = "";
            for(int i=1; i<=m; i++ ){
                if(censor[i] > 1 ){
                    if( mp[s1] == ""){
                        printf("Case %d: bad code\n",++tc);
                        exit = 1;
                        break;
                    }
//                    cout << "s = " << mp[s1] << endl;
                    decode += (mp[s1]) ;
                    s1 = "";
                }
                else s1 += (censor[i]+'0');
            }
            if( mp[s1] == "" && !exit){
                printf("Case %d: bad code\n",++tc);
                exit = 1;
                break;
            }
            decode += (mp[s1]) ;
//            cout << "s = " << mp[s1] << endl;
            s1 = "";
        }

        if(exit)continue;

        int sz = decode.size();
//        cout  << decode[0] << decode[sz-1] << endl;

//        cout << "fuck" << endl;
        //cout << sz << endl;
        int cc = gen_c( sz-4);
        int ck = (decode[sz-3]-'0');
        int kk  ;

//        cout << cc << endl;
        if(decode[0] != 'S' || decode[sz-1] != 'S' || sz <= 4){
            printf("Case %d: bad code\n",++tc); continue;
        }

        if( cc == ck  || ( cc==10 && decode[sz-3] == '-')){
            kk = gen_k(( sz-4),cc );
            if(kk == (decode[sz-2] - '0') || (kk == 10 && decode[sz-2] == '-')){
                printf("Case %d: ",++tc);
                for(int i=1; i<=sz-4; i++){
                        if(decode[i] != 'S')
                            printf("%c",decode[i]);

                }
                puts("");
            }
            else  printf("Case %d: bad K\n",++tc);
        }
        else printf("Case %d: bad C\n",++tc);

//        cout << endl << decode << " " << cc << " " << kk << " " << endl;

        decode = "";
    }


    return 0;
}


Create a new paste based on this one


Comments: