파스칼 프로그램 길이
시간 제한1초메모리 제한128 MB
각 터보 파스칼 프로그램에서 예약어, 식별자, 상수, 왼쪽 괄호와 대괄호, 지정된 연산자의 개수를 세고 주석과 문자열은 건너뛰어 제출자 이름과 함께 출력한다.
문제
한 지역 컴퓨터 사용자 모임이 분기별 소식지를 발행하는데, 매 호마다 회원들이 풀 수 있는 작은 Turbo Pascal 프로그래밍 문제가 실린다. 회원들은 자신의 풀이를 편집자에게 제출하고, 가장 짧은 풀이를 제출한 회원이 상을 받는다.
프로그램의 길이는 유닛(unit) 수로 측정한다. 유닛 수는 다음 항목들이 등장한 횟수의 총합이다.
- 예약어,
- 식별자,
- 상수,
- 여는 괄호
(, - 여는 대괄호
[, - 그리고 연산자
+,-,*,/,=,<,>,<=,>=,<>,@,^,:=.
주석은 세지 않으며, 위 분류에 속하지 않는 다른 모든 기호도 세지 않는다. 유닛 수가 가장 적은 프로그램이 우승하고, 유닛 수가 같은 프로그램이 둘 이상이면 상을 나눠 갖는다.
여러 개의 Turbo Pascal 프로그램을 읽어 각 프로그램의 유닛 수를 출력하는 프로그램을 작성하라.
입력
입력은 여러 개의 Turbo Pascal 프로그램으로 이루어진다. 각 프로그램은 첫 두 칸에 물결표 두 개(~~)가 오고 그 뒤에 제출한 회원의 이름이 이어지는 줄로 끝난다. 모든 프로그램은 문법적으로 올바르며, 주석은 중괄호({ }), 첨자는 대괄호([ ])라는 표준 기호를 사용한다. 입력은 파일의 끝에서 종료된다.
출력
각 프로그램마다 제출한 회원의 이름과 그 프로그램의 유닛 수를 담은 한 줄을 다음 형식과 정확히 동일하게 출력한다.
Program by NAME contains N units.
Turbo Pascal 토큰에 대한 추가 설명:
- 식별자는 밑줄(
_) 또는 (대소문자) 알파벳으로 시작하고, 그 뒤에 밑줄·알파벳·숫자가 0개 이상 이어진다. - 문자열 상수는 작은따옴표(
')로 둘러싸며, 한 줄 안에 모두 들어간다. 문자열 안의 연속된 두 따옴표('')는 따옴표 한 개(')를 나타내므로, 따옴표 한 개로 이루어진 문자열은''''로 쓴다. 빈 문자열''도 허용된다. - 수치 상수의 가장 일반적인 형태는
10.56E-15이다. 정수부(항상 존재하는 한 자리 이상의 숫자), 선택적 소수부(.뒤에 오는 숫자들), 선택적 지수부(대소문자E, 선택적 부호+/-, 그리고 숫자들)로 이루어진다. - 16진 정수 상수는
\$뒤에 한 개 이상의 16진 숫자(0–9,a–f,A–F)가 오는 형태다. 예:\$a9F. - 인식해야 하는 주석 구분자는 중괄호
{ }뿐이며,(**)는 주석으로 취급하지 않는다. 주석은 중첩되지 않는다. - 가능한 경우
+와-는 연산자로 본다. 예를 들어x := -3에서-와3은 서로 다른 토큰이다. - 순서형 타입의 부분범위는
lower..upper로 표기한다. 예를 들어1..10은 1부터 10까지의 정수를 뜻한다. - 위에서 설명하지 않은 모든 토큰은 한 글자로 이루어진다.