아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

APL Lives!

시간 제한2초메모리 제한1024 MB

요약
작은 APL 부분집합의 식을 한 줄씩 계산하고, 결과로 나온 벡터나 배열을 출력합니다.
난이도

보통10점 중 4점

유형
시뮬레이션, 구현, 재귀
정답자
아직 제출이 없습니다

문제

APL은 Ken Iverson이 1957년에 고안한 표기법을 사용하는 배열 프로그래밍 언어이다. 이 문제에서는 언어의 일부만 다루며, 이를 apl(작은 APL)이라 부른다.

각 apl 식은 한 줄에 하나씩 나오고, 식마다 값이 있다. 식을 입력하면 그 값이 바로 출력된다. apl의 연산자에는 C, C++, Java처럼 우선순위가 없다. 연산자는 오른쪽에서 왼쪽으로 적용된다. 괄호로 계산 순서를 바꿀 수 있다. 이항 연산자의 피연산자도 오른쪽에서 왼쪽 순서로 계산한다. 다음은 apl 식의 예이다.

식설명
var = 1 2 3벡터 1 2 3을 var에 저장하여 이전 값을 대체한다. 식의 값은 1 2 3이다. =의 왼쪽 피연산자는 반드시 변수여야 한다.
var + 4var의 각 원소에 4를 더한 값을 출력한다(결과: 5 6 7). 저장된 var는 바뀌지 않는다.
- / varvar의 각 행에서 원소 사이마다 - 연산자를 넣은 것처럼 계산한 값을 출력한다(결과: 2). var가 2차원이면 결과는 벡터이다. 3차원이면 결과는 2차원 배열이다. * /와 + /도 같은 방식으로 동작한다.
iota 5값이 1 2 3 4 5인 벡터를 만든다.
2 2 rho 1 2 3 4벡터 1 2 3 4의 모양을 2×2 배열로 바꾼다. 첫 행은 1과 2, 둘째 행은 3과 4이다.
2 2 rho 1 2 3 4 5 6위와 같은 결과이다.
2 3 rho 1 2 3 4다른 모양 변환이다. 첫 행은 1 2 3, 둘째 행은 4 1 2가 된다. 오른쪽 피연산자의 원소가 부족하면 처음부터 다시 사용하며, 순서는 행 우선이다.
2 drop iota 5결과: 3 4 5. iota 5의 앞 두 원소를 버린다.
1 2 * 3 4결과: 3 8. 원소별 곱셈의 예이다. 두 피연산자의 모양이 같거나, 적어도 하나가 원소 하나짜리 벡터여야 한다(두 번째 예 참조).
( ( a = 1 ) drop 1 2 3 ) - 5결과: -3 -2. 괄호 사용 예이다.
a + ( a = 5 ) + a + ( a = 6 )결과: 22. 계산 순서의 예이다.

입력의 정수는 0 이상 10410^4 미만이다. 중간 값을 포함한 모든 계산된 정수 값의 절댓값은 10410^4 미만이다. 행렬의 원소 수는 항상 10410^4 이하이다. 변수 이름은 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 배열 사이에 빈 줄을 둔다. 같은 줄의 값은 공백으로 구분하며, 열을 맞출 필요는 없다.

예제1

  1. 예제 1

    입력
    var = 1 2 3
    var + 4
    - / var
    iota 5
    2 2 rho 1 2 3 4
    2 3 rho 1 2 3 4
    2 drop iota 4
    1 2 * 3 4
    ( ( a = 1 ) drop 1 2 3 ) – 5
    a + ( a = 5 ) + a + ( a = 6 )
    ( 2 2 rho 2 drop iota 6 ) + 100
    1 2 3 + 4 5 6
    2 3 rho 1 2 3 4 5 + 1 2 3 4 5
    + / 2 3 4 rho iota 2 * 3 * 4
    ( 2 4 5 rho iota 2 * 4 * 5 ) - 99
    #
    
    예상 출력
    Case 1: var = 1 2 3
     1 2 3
    Case 2: var + 4
     5 6 7
    Case 3: - / var
     2
    Case 4: iota 5
     1 2 3 4 5
    Case 5: 2 2 rho 1 2 3 4
     1 2
     3 4
    Case 6: 2 3 rho 1 2 3 4
     1 2 3
     4 1 2
    Case 7: 2 drop iota 4
     3 4
    Case 8: 1 2 * 3 4
     3 8
    Case 9: ( ( a = 1 ) drop 1 2 3 ) - 5
     -3 -2
    Case 10: a + ( a = 5 ) + a + ( a = 6 )
     22
    Case 11: ( 2 2 rho 2 drop iota 6 ) + 100
     103 104
     105 106
    Case 12: 1 2 3 + 4 5 6
     5 7 9
    Case 13: 2 3 rho 1 2 3 4 5 + 1 2 3 4 5
     2 4 6
     8 10 2
    Case 14: + / 2 3 4 rho iota 2 * 3 * 4
     10 26 42
     58 74 90
    Case 15: ( 2 4 5 rho iota 2 * 4 * 5 ) - 99
     -98 -97 -96 -95 -94
     -93 -92 -91 -90 -89
     -88 -87 -86 -85 -84
     -83 -82 -81 -80 -79
     -78 -77 -76 -75 -74
     -73 -72 -71 -70 -69
     -68 -67 -66 -65 -64
     -63 -62 -61 -60 -59