APL Lives!
시간 제한2초메모리 제한1024 MB
작은 APL 부분집합의 식을 한 줄씩 계산하고, 결과로 나온 벡터나 배열을 출력합니다.
문제
APL은 Ken Iverson이 1957년에 고안한 표기법을 사용하는 배열 프로그래밍 언어이다. 이 문제에서는 언어의 일부만 다루며, 이를 apl(작은 APL)이라 부른다.
각 apl 식은 한 줄에 하나씩 나오고, 식마다 값이 있다. 식을 입력하면 그 값이 바로 출력된다. apl의 연산자에는 C, C++, Java처럼 우선순위가 없다. 연산자는 오른쪽에서 왼쪽으로 적용된다. 괄호로 계산 순서를 바꿀 수 있다. 이항 연산자의 피연산자도 오른쪽에서 왼쪽 순서로 계산한다. 다음은 apl 식의 예이다.
입력의 정수는 0 이상 미만이다. 중간 값을 포함한 모든 계산된 정수 값의 절댓값은 미만이다. 행렬의 원소 수는 항상 이하이다. 변수 이름은 1자 이상 3자 이하의 영문 소문자로 이루어지며, iota, rho, drop은 항상 연산자로 해석된다. 식의 요소(상수, 변수, 연산자, 괄호) 사이는 정확히 공백 한 칸으로 구분된다.
입력의 상수는 벡터이다. 모든 중간 값은 양의 차원을 가진 1차원, 2차원, 3차원 배열이다. 따라서 2 0 rho 1 2 3, 2 3 2 1 rho 5, 3 drop iota 3은 허용되지 않는다. 지원하는 산술 연산자는 +(덧셈), -(뺄셈), *(곱셈)뿐이다. 피연산자는 예에서처럼 형태가 맞아야(conformable) 한다. 1 1 rho 1과 1 rho 1은 모양이 서로 다르다. iota의 피연산자는 원소 하나짜리 양의 벡터로 계산된다. drop의 왼쪽 피연산자는 원소 하나짜리 음이 아닌 벡터로 계산되고, 오른쪽 피연산자는 벡터로 계산된다. rho의 두 피연산자는 모두 벡터로 계산된다.
입력
입력에는 여러 개의 테스트 케이스가 있으며, 각 케이스는 한 줄을 차지한다. 한 케이스에서 할당한 변수의 값은 이후 케이스에서 그대로 사용할 수 있다. 식의 길이는 공백을 포함하여 80자를 넘지 않는다. 어떤 테스트 케이스도 빈 벡터처럼 잘못된 결과를 만들지 않는다.
마지막 테스트 케이스 다음 줄에는 문자 # 하나만 있는 줄이 온다.
출력
각 테스트 케이스마다 케이스 번호와 입력 줄을 한 줄에 출력한다. 다음 줄부터 식의 계산 결과를 출력한다. 벡터는 정수를 한 줄에 출력한다. m×n 배열은 m줄에 걸쳐 각 줄에 n개의 값을 출력한다. m×n×p 배열은 n×p 배열 m개로 출력하며, 각 n×p 배열 사이에 빈 줄을 둔다. 같은 줄의 값은 공백으로 구분하며, 열을 맞출 필요는 없다.