[ create a new paste ] login | about

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

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

using namespace std;

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

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";
}

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;
}


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);
}

double percent ( int n ){
    return floor((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 = "";
        long small = (1 << 16), big = -( 1 << 16 );
        for( int i=1; i<=m; i++ ){
            scanf( "%d", &censor[i] );
            small = (censor[i] < small ) ? censor[i] : small;
            big = (censor[i] > big ) ? censor[i] : big;
        }

        double mrng1 = small - percent( small ); double mrng2 = small + percent( small );
        double brng1 = big - percent ( big ); double brng2 = big + percent ( big );

        for( int i=1; i<=m; i++ ){
            if ( (censor[i] >= mrng1 && censor[i] <= mrng2) ) censor[i] = 0;
            else if ( (censor[i] >= brng1 && censor[i] <= brng2)) censor[i] = 1; // Can be offset the condition
        }

        if( isReverse( m ) ){
            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 ){
                    decode += (mp[s1]) ;
                    s1 = "";
                }
                else s1 += (censor[i]+'0');
            }
            decode += (mp[s1]) ;
            s1 = "";
        }
        else if (isRight(m)){
            for ( int i=6; i<=m; i+=6){
                censor[i] = 5;
            }

            string s1 = "";
            for(int i=1; i<=m; i++ ){
                if(censor[i] > 1 ){
                    decode += (mp[s1]) ;
                    s1 = "";
                }
                else s1 += (censor[i]+'0');
            }
            decode += (mp[s1]) ;
            s1 = "";
        }

        int sz = decode.length();
        int cc = gen_c(sz-4);
        int kk = gen_k( sz-4,(decode[sz-3] == '-') ? 10 : decode[sz-3]-'0' );

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

        int cfactor = (decode[sz-3] == '-') ? 10 : decode[sz-3] - '0';
        int ffactor = (decode[sz-2] == '-')  ? 10 : decode[sz-2]-'0';

//        cout << endl << decode << " " << cc << " " << cfactor << " " << kk << " " << ffactor << endl;
        if(cc != cfactor) {
            printf("Case %d: bad C\n",++tc); continue;
        }

        if( kk != ffactor) {
            printf("Case %d: bad K\n",++tc); continue;
        }

        if(cc == cfactor && kk == ffactor ){
            printf("Case %d: ",++tc);
            for(int i=1; i<=sz-4; i++ )printf("%c",decode[i]);
        }
        else printf("Case %d: bad code",++tc);
        puts("");

    }

    return 0;
}


Create a new paste based on this one


Comments: