All about problems in Volume 2. If there is a thread about your problem, please use it. If not, create one with its number in the subject.
Moderator: Board moderators
andrei_vish
New poster
Posts: 4 Joined: Mon Nov 14, 2005 4:03 pm
Post
by andrei_vish » Mon Nov 14, 2005 4:13 pm
My code pass all tests listed here, but I got WA.
I don't know what's wrong ?
Code: Select all
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
using namespace std;
enum TokenType
{
UnaryOp, BinaryOp, Varible
};
TokenType GetTokenType(char token)
{
if (token == '@')
return UnaryOp;
if (token == '+' || token == '-' || token == '*' || token == '/')
return BinaryOp;
else
return Varible;
}
enum BinaryOperatorType
{
Add, Sub, Mul, Div
};
BinaryOperatorType GetBinaryOperatorType(char op)
{
switch(op) {
case '+': return Add;
case '-': return Sub;
case '*': return Mul;
case '/': return Div;
}
return Add;
}
unsigned mem;
char prevVar;
bool valueInStack;
void AddToStack(char val)
{
switch(GetTokenType(val))
{
case Varible:
{
if (prevVar)
{
if (valueInStack)
cout << "ST $" << mem++ << "\n";
cout << "L " << prevVar << "\n";
valueInStack = true;
}
prevVar = val;
}
break;
case UnaryOp:
{
if (prevVar)
{
if (valueInStack)
cout << "ST $" << mem++ << "\n";
cout << "L " << prevVar << "\n";
prevVar = 0;
}
cout << "N\n";
}
break;
case BinaryOp:
{
switch(GetBinaryOperatorType(val))
{
case Add:
{
if (prevVar)
{
cout << "A " << prevVar << "\n";
prevVar = 0;
}
else
cout << "A $" << --mem << "\n";
}
break;
case Sub:
{
if (prevVar)
{
cout << "S " << prevVar << "\n";
prevVar = 0;
}
else
cout << "N\nA $" << --mem << "\n";
}
break;
case Mul:
{
if (prevVar)
{
cout << "M " << prevVar << "\n";
prevVar = 0;
}
else
cout << "M $" << --mem << "\n";
}
break;
case Div:
{
if (prevVar)
{
cout << "D " << prevVar << "\n";
prevVar = 0;
}
else
{
cout << "ST $" << mem++ << "\n";
cout << "L $" << mem - 2 << "\n";
cout << "D $" << --mem << "\n";
mem--;
}
}
break;
}
}
break;
}
}
int main(int argc, char* argv[])
{
string input;
while (cin >> input)
{
static bool first = true;
if (!first)
cout << "\n";
else
first = false;
mem = 1;
prevVar = 0;
valueInStack = false;
for (unsigned i = 0; i < input.size(); ++i)
AddToStack(input[i]);
AddToStack(0);
}
return 0;
}
little joey
Guru
Posts: 1080 Joined: Thu Dec 19, 2002 7:37 pm
Post
by little joey » Mon Nov 14, 2005 5:31 pm
Try this:
Your output contains more than one error...
andrei_vish
New poster
Posts: 4 Joined: Mon Nov 14, 2005 4:03 pm
Post
by andrei_vish » Mon Nov 14, 2005 10:16 pm
Thanks,
My answer for A@B@+C@D@++ is
Code: Select all
L A
N
ST $1
L B
N
A $1
ST $1
L C
N
ST $2
L D
N
A $2
A $1
but still got WA
Code: Select all
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
using namespace std;
enum TokenType
{
UnaryOp, BinaryOp, Varible
};
TokenType GetTokenType(char token)
{
if (token == '@')
return UnaryOp;
if (token == '+' || token == '-' || token == '*' || token == '/')
return BinaryOp;
else
return Varible;
}
enum BinaryOperatorType
{
Add, Sub, Mul, Div
};
BinaryOperatorType GetBinaryOperatorType(char op)
{
switch(op) {
case '+': return Add;
case '-': return Sub;
case '*': return Mul;
case '/': return Div;
}
return Add;
}
unsigned mem;
char prevVar;
bool valueInStack;
void AddToStack(char val)
{
switch(GetTokenType(val))
{
case Varible:
{
if (prevVar)
{
if (valueInStack)
cout << "ST $" << mem++ << "\n";
cout << "L " << prevVar << "\n";
valueInStack = true;
}
prevVar = val;
}
break;
case UnaryOp:
{
if (prevVar)
{
if (valueInStack)
cout << "ST $" << mem++ << "\n";
cout << "L " << prevVar << "\n";
prevVar = 0;
valueInStack = true;
}
cout << "N\n";
}
break;
case BinaryOp:
{
switch(GetBinaryOperatorType(val))
{
case Add:
{
if (prevVar)
{
cout << "A " << prevVar << "\n";
prevVar = 0;
}
else
cout << "A $" << --mem << "\n";
}
break;
case Sub:
{
if (prevVar)
{
cout << "S " << prevVar << "\n";
prevVar = 0;
}
else
cout << "N\nA $" << --mem << "\n";
}
break;
case Mul:
{
if (prevVar)
{
cout << "M " << prevVar << "\n";
prevVar = 0;
}
else
cout << "M $" << --mem << "\n";
}
break;
case Div:
{
if (prevVar)
{
cout << "D " << prevVar << "\n";
prevVar = 0;
}
else
{
cout << "ST $" << mem++ << "\n";
cout << "L $" << mem - 2 << "\n";
cout << "D $" << --mem << "\n";
mem--;
}
}
break;
}
}
break;
}
}
int main(int argc, char* argv[])
{
string input;
while (cin >> input)
{
static bool first = true;
if (!first)
cout << "\n";
else
first = false;
mem = 1;
prevVar = 0;
valueInStack = false;
for (unsigned i = 0; i < input.size(); ++i)
AddToStack(input[i]);
AddToStack(0);
}
return 0;
}
little joey
Guru
Posts: 1080 Joined: Thu Dec 19, 2002 7:37 pm
Post
by little joey » Mon Nov 14, 2005 10:45 pm
Temporary storage locations are allocated by the assembler for an operand of the form ``$n" where n is a single digit.
But your code prints "$10" sometimes.
Hint: I got your code accepted by changing one single character in it.
andrei_vish
New poster
Posts: 4 Joined: Mon Nov 14, 2005 4:03 pm
Post
by andrei_vish » Tue Nov 15, 2005 3:36 pm
Thanks,
I fixed this bug and got AC.
sclo
Guru
Posts: 519 Joined: Mon Jan 23, 2006 10:45 pm
Location: Vancouver, BC, Canada
Contact:
Post
by sclo » Sun Mar 19, 2006 12:57 pm
N only negate the value in the register
so without A$1, the register would contain -(C+D) only
aerofoil.kite
New poster
Posts: 12 Joined: Tue Dec 06, 2011 8:59 pm
Location: Bangladesh
Contact:
Post
by aerofoil.kite » Thu May 22, 2014 9:31 am
This is very important.. But i think everyone is missing this case...
$n, here n will be a single digit.. start n from zero.. Because it stores 10 operand..
Mir Shahriar Sabuj