이 문제에서는 1차원 정수 배열의 선언과 대입문만을 가진 간단한 프로그래밍 언어를 다룬다. 주어진 프로그램에서 버그를 찾는 것이 목표다.
이 언어의 문법을 BNF로 나타내면 다음과 같다.
<program> ::= <declaration> | <program><declaration> | <program><assignment>
<declaration> ::= <array name>[<number>]<new line>
<assignment> ::= <array name>[<expression>]=<expression><new line>
<expression> ::= <number> | <array name>[<expression>]
<number> ::= <digit> | <digit_positive><digit_string>
<digit_string> ::= <digit> | <digit><digit_string>
<digit_positive> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<digit> ::= 0 | <digit_positive>
<array_name> ::= a | b | c | d | e | f | g | h | i | j | k | l | m |
n | o | p | q | r | s | t | u | v | w | x | y | z |
A | B | C | D | E | F | G | H | I | J | K | L | M |
N | O | P | Q | R | S | T | U | V | W | X | Y | Z
여기서 <new line>은 하나의 줄바꿈 문자(LF)이다. 프로그램에 나타나는 문자는 알파벳 글자, 십진 숫자, =, [, ], 그리고 줄바꿈 문자뿐이며, 그 밖의 문자는 나타나지 않는다.
선언은 배열을 선언하고 그 길이를 지정한다. 길이가 $n$인 배열의 유효한 인덱스는 $0$부터 $n - 1$까지의 정수다. 배열 이름은 대소문자를 구분하므로 배열 a와 배열 A는 서로 다른 배열이다. 갓 선언된 배열의 각 원소의 초깃값은 정의되지 않은 상태다. 예를 들어 길이가 $10$인 배열 a와 길이가 $5$인 배열 b는 다음과 같이 선언한다.
a[10]
b[5]
식(expression)은 음이 아닌 정수로 평가된다. <number>는 십진 정수로 해석되며, <array name>[<expression>]은 그 배열에서 인덱스가 <expression>의 값인 원소에 저장된 값으로 평가된다. 대입문은 오른쪽 값을 왼쪽에서 가리키는 배열 원소에 저장한다. 대입문의 예는 다음과 같다.
a[0]=3
a[1]=0
a[2]=a[a[1]]
a[a[0]]=a[1]
프로그램은 첫 줄부터 한 줄씩 실행된다. 모든 배열은 그 원소가 대입되거나 참조되기 전에 정확히 한 번 선언된다고 가정해도 좋다.
프로그램이 주어질 때, 다음 버그를 찾으시오.
구문 오류 같은 다른 종류의 버그는 나타나지 않는다고 가정해도 좋다. 또한 <number>로 표기되는 모든 정수는 $0$ 이상 $2^{31} - 1 = 2147483647$ 이하라고 가정해도 좋다.
입력은 여러 개의 데이터셋으로 이루어지며, 마지막에는 오직 하나의 .(마침표)만 있는 줄이 온다. 각 데이터셋은 하나의 프로그램이며, 마찬가지로 그 뒤에 오직 하나의 .(마침표)만 있는 줄이 온다. 프로그램은 최대 $1000$줄이며, 줄바꿈 문자를 제외한 각 줄의 길이는 $80$자를 넘지 않는다.
각 프로그램에 대해, 첫 번째 버그가 나타나는 대입문의 줄 번호를 출력한다. 줄 번호는 각 프로그램마다 $1$부터 시작한다. 프로그램에 버그가 없으면 $0$을 출력한다. 출력에는 공백과 같은 불필요한 문자가 포함되어서는 안 된다.