Advertisement
JustHev

AoC 2018 - 16

Dec 16th, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.57 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct st{
  5.     long long r[4];
  6. };
  7.  
  8. st addr(const long long* in, long long a, long long b, long long c) {
  9.     st q = {.r={in[0], in[1], in[2], in[3]}};
  10.     q.r[c] = q.r[a] + q.r[b];
  11.     return q;
  12. }
  13. st addi(const long long* in, long long a, long long b, long long c) {
  14.     st q = {.r={in[0], in[1], in[2], in[3]}};
  15.     q.r[c] = q.r[a] + b;
  16.     return q;
  17. }
  18. st mulr(const long long* in, long long a, long long b, long long c) {
  19.     st q = {.r={in[0], in[1], in[2], in[3]}};
  20.     q.r[c] = q.r[a] * q.r[b];
  21.     return q;
  22. }
  23. st muli(const long long* in, long long a, long long b, long long c) {
  24.     st q = {.r={in[0], in[1], in[2], in[3]}};
  25.     q.r[c] = q.r[a] * b;
  26.     return q;
  27. }
  28. st banr(const long long* in, long long a, long long b, long long c) {
  29.     st q = {.r={in[0], in[1], in[2], in[3]}};
  30.     q.r[c] = q.r[a] & q.r[b];
  31.     return q;
  32. }
  33. st bani(const long long* in, long long a, long long b, long long c) {
  34.     st q = {.r={in[0], in[1], in[2], in[3]}};
  35.     q.r[c] = q.r[a] & b;
  36.     return q;
  37. }
  38. st borr(const long long* in, long long a, long long b, long long c) {
  39.     st q = {.r={in[0], in[1], in[2], in[3]}};
  40.     q.r[c] = q.r[a] | q.r[b];
  41.     return q;
  42. }
  43. st bori(const long long* in, long long a, long long b, long long c) {
  44.     st q = {.r={in[0], in[1], in[2], in[3]}};
  45.     q.r[c] = q.r[a] | b;
  46.     return q;
  47. }
  48. st setr(const long long* in, long long a, long long b, long long c) {
  49.     st q = {.r={in[0], in[1], in[2], in[3]}};
  50.     q.r[c] = q.r[a];
  51.     return q;
  52. }
  53. st seti(const long long* in, long long a, long long b, long long c) {
  54.     st q = {.r={in[0], in[1], in[2], in[3]}};
  55.     q.r[c] = a ;
  56.     return q;
  57. }
  58. st gtir(const long long* in, long long a, long long b, long long c) {
  59.     st q = {.r={in[0], in[1], in[2], in[3]}};
  60.     q.r[c] = a > q.r[b]?1:0;
  61.     return q;
  62. }
  63. st gtri(const long long* in, long long a, long long b, long long c) {
  64.     st q = {.r={in[0], in[1], in[2], in[3]}};
  65.     q.r[c] = q.r[a] > b?1:0;
  66.     return q;
  67. }
  68. st gtrr(const long long* in, long long a, long long b, long long c) {
  69.     st q = {.r={in[0], in[1], in[2], in[3]}};
  70.     q.r[c] = q.r[a] > q.r[b]?1:0;
  71.     return q;
  72. }
  73. st eqir(const long long* in, long long a, long long b, long long c) {
  74.     st q = {.r={in[0], in[1], in[2], in[3]}};
  75.     q.r[c] = a == q.r[b]?1:0;
  76.     return q;
  77. }
  78. st eqri(const long long* in, long long a, long long b, long long c) {
  79.     st q = {.r={in[0], in[1], in[2], in[3]}};
  80.     q.r[c] = q.r[a] == b?1:0;
  81.     return q;
  82. }
  83. st eqrr(const long long* in, long long a, long long b, long long c) {
  84.     st q = {.r={in[0], in[1], in[2], in[3]}};
  85.     q.r[c] = q.r[a] == q.r[b]?1:0;
  86.     return q;
  87. }
  88.  
  89. st (*op[])(const long long*, long long, long long, long long)={addr, addi, mulr, muli, banr, bani, borr, bori, setr, seti, gtir, gtri, gtrr, eqir, eqri, eqrr};
  90. string opn[]={"addr", "addi", "mulr", "muli", "banr", "bani", "borr", "bori", "setr", "seti", "gtir", "gtri", "gtrr", "eqir", "eqri", "eqrr"};
  91.  
  92. st (*rop[])(const long long*, long long, long long, long long)={eqri, banr, bori, mulr, seti, bani, muli, gtrr, setr, addi, gtir, borr, addr, eqrr, gtri, eqir};
  93. int main() {
  94.     //int r[4]= {0,0,1,0};
  95.     //st b = addr(r, 3, 2, 1);
  96.     //cout << r[1] << ' ' << b.r[1] << '\n';
  97.     int top=0;
  98.     for(int i=0; i<16; i++) cout << "(declare-const " << opn[i] << " Int)\n";
  99.     while(true) {
  100.         string prs, pos, ops;
  101.         getline(cin, prs);
  102.         if (prs.length() == 0) break;
  103.         getline(cin, ops);
  104.         getline(cin, pos);
  105.         string sace;
  106.         getline(cin, sace);
  107. //      cout << prs << ops <<pos << '|' << sace << "------------------\n";
  108.         long long pr[4] = {prs[9]-'0', prs[12]-'0', prs[15]-'0', prs[18]-'0'};
  109.         long long po[4] = {pos[9]-'0', pos[12]-'0', pos[15]-'0', pos[18]-'0'};
  110.         int o; long long a,b,c;
  111.         if (ops[1] == ' ') {
  112.             o = ops[0]-'0'; a=ops[2]-'0'; b=ops[4]-'0'; c=ops[6]-'0';
  113.         } else {
  114.             o = 10*(ops[0]-'0')+(ops[1]-'0'); a=ops[3]-'0'; b=ops[5]-'0'; c=ops[7]-'0';
  115.         }
  116.         int z=0;
  117.         cout << "(assert (or";
  118.         for(int j=0; j<16; j++) {
  119.             st q = op[j](pr, a,b,c);
  120.             bool e=true;
  121.             for(int i=0; i<4; i++) {
  122.                 if (q.r[i] != po[i]) {
  123.                     e=false; break;
  124.                 }
  125.             }
  126.             if(e) {
  127.                 z++;
  128.                 cout << " (= " << o << " " << opn[j] << ")";
  129.             }
  130.         }
  131.         cout << "))\n";
  132.         if (z>=3)       top++;
  133.     }
  134.     cout << "(check-sat) (get-model)\n";
  135.     cout << ';' << top <<'\n';
  136.     long long reg[4] = {0,0,0,0};
  137.     int t=0;
  138.     while (true) {
  139.         t++;
  140.         int o,a,b,c;
  141.         cin >> o;
  142.         if (o<0) break;
  143.         cin >> a >> b >> c;
  144.         st q = rop[o](reg, a,b,c);
  145.         for(int i=0; i<4;i++) reg[i]=q.r[i];
  146.         //cout << t << ": (" <<o << ' ' << a << ' ' << b << ' ' << c << ") " << reg[0]<< ' ' << reg[1] << ' ' << reg[2] << ' ' << reg[3] << '\n';
  147.     }
  148.     cout << ';' << reg[0] << '\n';// ' ' << t << '\n';
  149.     return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement