#include "abc.h"
#include <bits/stdc++.h>
using namespace std;
// you may find the definitions useful
const int OP_ZERO = 0; // f(OP_ZERO, x0, x1) = 0
const int OP_NOR = 1; // f(OP_NOR, x0, x1) = !(x0 || x1)
const int OP_GREATER = 2; // f(OP_GREATER, x0, x1) = (x0 > x1)
const int OP_NOT_X1 = 3; // f(OP_NOT_X1, x0, x1) = !x1
const int OP_LESS = 4; // f(OP_LESS, x0, x1) = (x0 < x1)
const int OP_NOT_X0 = 5; // f(OP_NOT_X0, x0, x1) = !x0
const int OP_XOR = 6; // f(OP_XOR, x0, x1) = (x0 ^ x1)
const int OP_NAND = 7; // f(OP_NAND, x0, x1) = !(x0 && x1)
const int OP_AND = 8; // f(OP_AND, x0, x1) = (x0 && x1)
const int OP_EQUAL = 9; // f(OP_EQUAL, x0, x1) = (x0 == x1)
const int OP_X0 = 10; // f(OP_X0, x0, x1) = x0
const int OP_GEQ = 11; // f(OP_GEQ, x0, x1) = (x0 >= x1)
const int OP_X1 = 12; // f(OP_X1, x0, x1) = x1
const int OP_LEQ = 13; // f(OP_LEQ, x0, x1) = (x0 <= x1)
const int OP_OR = 14; // f(OP_OR, x0, x1) = (x0 || x1)
const int OP_ONE = 15; // f(OP_ONE, x0, x1) = 1
// Alice
int // returns la
alice(
/* in */ const int n,
/* in */ const char names[][5],
/* in */ const unsigned short numbers[],
/* out */ bool outputs_alice[]
) {
if (n==1){
for(int i=0;i<16;i++){
outputs_alice[i] = numbers[0] & (1<<i);
}
return 16;
} else if (n==26){
//output numbers[0]
for(int j=0;j<26;j++){
for(int i=0;i<16;i++){
outputs_alice[16*j+i] = numbers[j] & (1<<i);
}
}
return 16*26;
}
}
// Bob
int // returns lb
bob(
/* in */ const int m,
/* in */ const char senders[][5],
/* in */ const char recipients[][5],
/* out */ bool outputs_bob[]
) {
/*
outputs_bob[0] = 1;
outputs_bob[1] = 1;
outputs_bob[2] = 0;
*/
//output m
if (m<=1 || (senders[0]==senders[1] && recipients[0]==recipients[1])){
for(int i=0;i<10;i++){
outputs_bob[i] = m & (1<<i);
}
return 10;
} else {
for(int i=0;i<26;i++){
for(int j=0;j<26;j++){
outputs_bob[26*i+j] = 0;
}
}
//for all edges, mark at the receiving end
for(int e=0;e<m;e++){
int s = senders[e][0]-'a';
int r = recipients[e][0]-'a';
outputs_bob[26*r+s] = 1;
}
return 26*26;
}
}
struct gate {
int p;
int x0,x1;
};
vector<gate> bitShiftBlock(int pos, int shift, int left, int size, int determinant){ //if determinant output = 0, block=0
vector<gate> block;
//the first shift are all 0
for(int i=0;i<shift;i++){
block.push_back({0,0,1});
}
//the remaining work from the left
for(int i=0;i<size-shift;i++){
block.push_back({8,left+i,determinant});
}
return block;
}
//sum block
// {block of length size starting at left}{block of length size starting at left2}{stuff.....sum of two blocks}
vector<gate> sumBlock(int pos, int left, int left2, int size){
vector<gate> block;
vector<gate> endBlock;
//first gate is sum0: xor
int at = pos;
block.push_back({6,left,left2});
endBlock.push_back({10,at,0});
at++;
//next gate is carry0: and
block.push_back({8,left,left2});
at++;
//create remaining using full adders
for(int i=1;i<size;i++){
//D is xor of things
block.push_back({6,left+i,left2+i});
at++; // D is at-1, Cin is at-2
//E is D AND Cin
block.push_back({8,at-1,at-2});
at++; //E is at-1, D is at-2, Cin is at-3
//F is A AND B
block.push_back({8,left+i,left2+i});
at++; //F is at-1, E is at-2, D is at-3, Cin is at-4
//S is D XOR Cin
block.push_back({6,at-3,at-4});
endBlock.push_back({10,at,0});
at++; //F is at-2, E is at-3, D is at-4, Cin is at-5
//Cout is F XOR E
block.push_back({6,at-2,at-3});
at++;
}
//add endBlock to block
for(auto a : endBlock){
block.push_back(a);
}
return block;
}
// Circuit
int // returns l
circuit(
/* in */ const int la,
/* in */ const int lb,
/* out */ int operations[],
/* out */ int operands[][2],
/* out */ int outputs_circuit[][16]
) {
//first bits are input
int L = la+lb;
if (la==16){
//start by adding null block of zeros
for(int i=0;i<16;i++){
operations[L] = 0;
operands[L][0] = 0;
operands[L][1] = 0;
L++;
}
//do all things
for(int i=0;i<10;i++){
//add the bitshift block at L
vector<gate> block = bitShiftBlock(L,i,0,16,16+i);
for(auto a : block){
operations[L] = a.p;
operands[L][0] = a.x0;
operands[L][1] = a.x1;
L++;
}
//add the sum block at L
vector<gate> block2 = sumBlock(L,L-32,L-16,16);
for(auto a : block2){
operations[L] = a.p;
operands[L][0] = a.x0;
operands[L][1] = a.x1;
L++;
}
}
//answer is just last 16 bits
for(int j=0;j<16;j++){
outputs_circuit[0][j] = L-16+j;
}
} else {
//solve person by person
for(int p=0;p<26;p++){
//add null block of zeros
for(int i=0;i<16;i++){
operations[L] = 0;
operands[L][0] = 0;
operands[L][1] = 0;
L++;
}
//then, for every other person, copy over their number if they sent a thing to p (0 otherwise), and add to running total
for(int q=0;q<26;q++){
//add the bitshift block at L
vector<gate> block = bitShiftBlock(L,0,16*q,16,la+26*p+q);
for(auto a : block){
operations[L] = a.p;
operands[L][0] = a.x0;
operands[L][1] = a.x1;
L++;
}
//keep running total
//add the sum block at L
vector<gate> block2 = sumBlock(L,L-32,L-16,16);
for(auto a : block2){
operations[L] = a.p;
operands[L][0] = a.x0;
operands[L][1] = a.x1;
L++;
}
}
//result for this person is last 16 bits
for(int j=0;j<16;j++){
outputs_circuit[p][j] = L-16+j;
}
}
}
/*
//start by adding null block of zeros
for(int i=0;i<16;i++){
operations[L] = 0;
operands[L][0] = 0;
operands[L][1] = 0;
L++;
}
//do all things
for(int i=0;i<10;i++){
//add the bitshift block at L
vector<gate> block = bitShiftBlock(L,i,0,16,16+i);
for(auto a : block){
operations[L] = a.p;
operands[L][0] = a.x0;
operands[L][1] = a.x1;
L++;
}
//add the sum block at L
vector<gate> block2 = sumBlock(L,L-32,L-16,16);
for(auto a : block2){
operations[L] = a.p;
operands[L][0] = a.x0;
operands[L][1] = a.x1;
L++;
}
}
//answer is just last 16 bits
for(int j=0;j<16;j++){
outputs_circuit[0][j] = L-16+j;
}
*/
return L;
/*
operations[5] = 8;
operations[6] = 14;
operands[5][0] = 0; operands[5][1] = 4;
operands[6][0] = 2; operands[6][1] = 5;
int final_results[] = {20000, 0, 24464};
for(int i = 0; i < 3; ++i)
for(int j = 0; j < 16; ++j)
outputs_circuit[i][j] = 5 + (final_results[i] >> j & 1);
return 7;
*/
}
Compilation message
abc.cpp: In function 'int alice(int, const char (*)[5], const short unsigned int*, bool*)':
abc.cpp:48:1: warning: control reaches end of non-void function [-Wreturn-type]
48 | }
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
1264 KB |
Correct! |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
1264 KB |
Correct! |
2 |
Correct |
1 ms |
1212 KB |
Correct! |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
1264 KB |
Correct! |
2 |
Correct |
1 ms |
1212 KB |
Correct! |
3 |
Incorrect |
40 ms |
5604 KB |
WA Your functions alice(), bob(), circuit() finished successfully, but the final output binary string is incorrect. |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
5704 KB |
Correct! |
2 |
Correct |
32 ms |
5352 KB |
Correct! |
3 |
Correct |
31 ms |
6000 KB |
Correct! |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
5704 KB |
Correct! |
2 |
Correct |
32 ms |
5352 KB |
Correct! |
3 |
Correct |
31 ms |
6000 KB |
Correct! |
4 |
Incorrect |
33 ms |
5520 KB |
WA Your functions alice(), bob(), circuit() finished successfully, but the final output binary string is incorrect. |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
5704 KB |
Correct! |
2 |
Correct |
32 ms |
5352 KB |
Correct! |
3 |
Correct |
31 ms |
6000 KB |
Correct! |
4 |
Incorrect |
33 ms |
5520 KB |
WA Your functions alice(), bob(), circuit() finished successfully, but the final output binary string is incorrect. |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
122 ms |
12192 KB |
WA Your functions alice(), bob(), circuit() finished successfully, but the final output binary string is incorrect. |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
122 ms |
12192 KB |
WA Your functions alice(), bob(), circuit() finished successfully, but the final output binary string is incorrect. |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
1264 KB |
Correct! |
2 |
Correct |
1 ms |
1212 KB |
Correct! |
3 |
Incorrect |
40 ms |
5604 KB |
WA Your functions alice(), bob(), circuit() finished successfully, but the final output binary string is incorrect. |
4 |
Halted |
0 ms |
0 KB |
- |