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