파스칼 프로그램 길이

아직 제출이 없습니다시간 제한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진 숫자(09, af, AF)가 오는 형태다. 예: \$a9F.
  • 인식해야 하는 주석 구분자는 중괄호 { }뿐이며, (* *)는 주석으로 취급하지 않는다. 주석은 중첩되지 않는다.
  • 가능한 경우 +-는 연산자로 본다. 예를 들어 x := -3에서 -3은 서로 다른 토큰이다.
  • 순서형 타입의 부분범위는 lower..upper로 표기한다. 예를 들어 1..10은 1부터 10까지의 정수를 뜻한다.
  • 위에서 설명하지 않은 모든 토큰은 한 글자로 이루어진다.