Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <map>
- #include <climits>
- #define fr(a,b,c) for(int a = b, _ = c; a < c; a++)
- using namespace std;
- int arr[150];
- bool solve_spaces(string &barcode, int m)
- {
- for (int i = 5; i < m - 5; i += 6)
- {
- if (barcode[i] == '1')
- return false;
- }
- return true;
- }
- bool solve_ends(string &barcode, int m)
- {
- if (barcode[2] != '1')
- return false;
- if (barcode[3] != '1')
- return false;
- if (barcode[m - 3] != '1')
- return false;
- if (barcode[m - 2] != '1')
- return false;
- return true;
- }
- void reverse(string &barcode, int m)
- {
- int i = 0, j = m - 1;
- while (i <= j)
- {
- swap(barcode[i], barcode[j]);
- i++, j--;
- }
- }
- int main()
- {
- ios::sync_with_stdio(0);
- int t = 0, m;
- map<string, char> mymap;
- mymap["00001"] = '0';
- mymap["10001"] = '1';
- mymap["01001"] = '2';
- mymap["11000"] = '3';
- mymap["00101"] = '4';
- mymap["10100"] = '5';
- mymap["01100"] = '6';
- mymap["00011"] = '7';
- mymap["10010"] = '8';
- mymap["10000"] = '9';
- mymap["00100"] = '-';
- mymap["00110"] = '*';
- string barcode, cpy, content, decoded, key;
- char val;
- int c, k, computed_c, computed_k;
- int barcode_size, n;
- int weight;
- bool ok;
- do
- {
- cin >> m;
- if (!m)
- continue;
- double nlo = INT_MAX, wlo = INT_MAX, nli = 0, whi = 0;
- fr(i, 0, m)
- {
- cin >> arr[i];
- nlo = min((double)arr[i], nlo);
- whi = max((double)arr[i], whi);
- }
- double limiar = (double)(nlo + whi) / 2.0;
- whi = 0, wlo = INT_MAX;
- fr(i, 0, m)
- {
- if (arr[i] < limiar)
- {
- barcode.push_back('0');
- wlo = min(arr[i] * 2.0, wlo);
- whi = max(arr[i] * 2.0, whi);
- }
- else
- {
- barcode.push_back('1');
- wlo = min((double)arr[i], wlo);
- whi = max((double)arr[i], whi);
- }
- }
- cout << "Case " << ++t << ": ";
- if (m < 29 || (m + 1) % 6 != 0 || wlo * 105.0 < whi * 95.0)
- {
- cout << "bad code" << endl;
- barcode.erase(barcode.begin(), barcode.end());
- continue;
- }
- ok = false;
- fr(i, 0, 2)
- {
- if (!solve_spaces(barcode, m) || !solve_ends(barcode, m))
- {
- reverse(barcode, m);
- }
- else
- {
- ok = true;
- break;
- }
- }
- if (!ok)
- {
- cout << "bad code" << endl;
- }
- else
- {
- cpy = barcode;
- barcode.erase(barcode.begin(), barcode.end());
- fr(i,0,cpy.length()){
- if(i%6 == 5) continue;
- barcode.push_back(cpy[i]);
- }
- // cout << barcode << endl;
- barcode_size = barcode.length();
- fr(i, 0, barcode_size / 5)
- {
- key = barcode.substr(i * 5, 5);
- val = mymap[key];
- if (i > 0 && i < barcode_size / 5 - 3)
- {
- decoded.push_back(val);
- }
- if (i == barcode_size / 5 - 3)
- {
- if (val == '-')
- c = 10;
- else
- c = val - '0';
- }
- if (i == barcode_size / 5 - 2)
- {
- if (val == '-')
- k = 10;
- else
- k = val - '0';
- }
- content.push_back(val);
- }
- computed_c = 0;
- computed_k = 0;
- n = decoded.length();
- fr(i, 1, n + 1)
- {
- val = decoded[i - 1];
- if (val == '-')
- weight = 10;
- else
- weight = val - '0';
- computed_c += (((n - i) % 10) + 1) * weight;
- computed_k += (((n - i + 1) % 9) + 1) * weight;
- }
- computed_k = (computed_k + c) % 11;
- computed_c = computed_c % 11;
- if (c == computed_c && k == computed_k)
- {
- cout << decoded << endl;
- }
- else if (c != computed_c)
- {
- cout << "bad C" << endl;
- }
- else if (k != computed_k)
- {
- cout << "bad K" << endl;
- }
- else
- {
- cout << "bad code" << endl;
- }
- }
- barcode.erase(barcode.begin(), barcode.end());
- content.erase(content.begin(), content.end());
- decoded.erase(decoded.begin(), decoded.end());
- }
- while (m);
- }
- /*
- 59 10 20 20 10 10 10 20 10 10 20 10 10 10 10 20 10 20 10 10 10 20 10 20 10
- 20 10 20 10 10 10 10 10 20 10 10 10 10 10 10 20 20 10 20 10 10 20 10 10 20
- 10 10 10 20 10 10 20 20 10 10
- 35 10 10 20 20 10 10 20 10 10 10 20 10 10 20 10 10 20 10 10 10 20 10 20 10
- 20 10 10 10 10 10 10 10 20 20 10 35 10 10 10 10 10 10 20 10 10 10 20 10 10
- 20 10 10 20 10 10 10 20 10 20 10 20 10 10 10 10 10 10 10 20 20 10 */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement