계산기 언어(Calculator Language, CL)는 대입, 양의 정수와 음의 정수, 그리고 간단한 사칙연산을 지원한다. CL 문장에서 사용할 수 있는 문자는 다음과 같다.
A..Z | 변수 이름 |
|---|---|
0..9 | 숫자 |
+ | 덧셈 연산자 |
- | 뺄셈 연산자 |
* | 곱셈 연산자 |
/ | 정수 나눗셈 연산자 |
= | 대입 연산자 |
() | 괄호 |
_ | 음수 부호 |
모든 연산자는 우선순위가 같고 오른쪽 결합(right associative)이다. 따라서 15 - 8 - 3 = 15 - (8 - 3) = 10이다. 예상하듯이 괄호는 그 안의 식을 먼저 계산하게 하며, 괄호는 원하는 만큼 깊이 중첩할 수 있다. 식에서 두 연산자가 (괄호로 나뉘어 있더라도) 서로 바로 이웃하는 경우는 없다. 대입 연산자 바로 앞에는 항상 변수가 오고, 한 줄에서 가장 왼쪽 연산자는 항상 대입이다. 가독성을 위해 공백은 자유롭게 넣을 수 있지만, 음수 부호와 그 숫자 사이에는 넣을 수 없다. 음수 부호는 정수 바로 앞에만 나타난다. 모든 변수는 0으로 시작하며, 명시적으로 바뀌기 전까지 값을 유지한다.
또한 두 번째 피연산자를 항상 먼저 계산한다. 예를 들어 (A = 10) / (A = 5)는 먼저 (A = 5)를 계산하고, 그다음 (A = 10)을 계산한 뒤, 마지막으로 10 / 5를 계산한다. 모든 정수 나눗셈은 C/C++의 정수 나눗셈 규칙(0을 향한 절삭)을 따르며, 0으로 나누는 경우는 없다.
이 언어로 작성된 식을 읽어서 계산하는 프로그램을 작성하라. 각 식은 한 줄을 차지하며, 적어도 하나의 대입 연산자를 포함한다.
입력은 여러 줄로 이루어지며, 각 줄에는 올바른 CL 식이 하나씩 들어 있다. 한 줄의 길이는 100자를 넘지 않는다. 입력은 문자 # 하나만 있는 줄로 끝난다.
입력의 각 줄마다 한 줄씩 출력한다. 각 출력 줄에는 그 식을 계산한 결과로 값이 바뀐 모든 변수의 최종 값을 나열한다. 값이 바뀐 변수가 둘 이상이면 알파벳 순서로 , (쉼표와 공백)로 구분하여 나열한다. 한 식 안에서 어떤 변수의 값이 여러 번 바뀌더라도 최종 값만 출력한다. 어떤 변수의 식 계산 후 값이 계산 전 값과 다르면 그 변수는 "값이 바뀌었다"고 본다. 값이 바뀐 변수가 하나도 없으면 No Change를 출력한다. 형식은 예제와 정확히 같게 맞춘다.