친구 크리스티안과 함께 1년 동안 세계 곳곳을 여행하기로 했다. 문화가 다르면 단위도 다르고, 공학자에게 가장 성가신 차이가 바로 단위다. 사람들은 마일, 퍼킨, 마이크로포트나이트, 촉광, 파인트, 킬로와트시를 쓰지만, 아래 표의 SI 기본단위만 쓰면 훨씬 편하다.
| 물리량 | 이름 | 기호 |
|---|---|---|
| 길이 | 미터 | m |
| 질량 | 킬로그램 | kg |
| 시간 | 초 | s |
| 전류 | 암페어 | A |
| 온도 | 켈빈 | K |
| 광도 | 칸델라 | cd |
표 1: SI 기본단위
너는 SI 단위를 워낙 좋아해서 다른 단위는 아예 쓰지 않는다. 줄(J), 뉴턴(N), 옴 같은 유도단위도 각각 kg m^2 / s^2, kg m / s^2, kg m^2 / s^3 A^2처럼 기본단위로 적을 수 있다. 그래서 여행하는 동안 마주친 단위를 정의와 함께 모두 기록해 둔다. Pa = N / m^2처럼 앞에서 정의한 단위에 기대는 정의도 있다.
정의를 손에 들고 있으면 60 firkins / microfortnights나 63 km / h 같은 표기를 만나도 곧바로 SI 단위로 바꾼다. 100 m + 1.3 km이나 7 N * 8 ohm 같은 계산도 금방 끝난다.
단위 정의와 계산 목록이 주어진다. 각 계산의 결과를 SI 기본단위로 바꿔서 출력하라.
입력은 다음 문법을 따른다. ?는 0개 또는 1개, +는 1개 이상, *는 0개 이상을 뜻한다.
power ::= { 2 이상 4 이하의 정수 }
unit ::= { 영문 대문자 또는 소문자 }+
dimension ::= unit ['^' power]?
size ::= { 부동소수점 수 } [' ' dimension]* [' /' [' ' dimension]+]?
operator ::= '+' 또는 '-' 또는 '*'
expression ::= size ' ' operator ' ' size
definition ::= unit ' = ' size
한 줄 안의 토큰은 공백 하나로 구분한다. 나눗셈 기호 /도 하나의 토큰이라 앞뒤에 공백이 있고, 정의의 =도 마찬가지다. 부동소수점 수는 63, 1.3, -2.5, 1E5처럼 적힌다.
첫째 줄에 새로 정의하는 단위의 개수 U가 주어진다. 이어지는 U개의 줄에 단위 정의가 한 줄에 하나씩 주어진다. 그다음 줄에 정수 N이 주어지고, 이어지는 N개의 줄에 식 또는 크기가 한 줄에 하나씩 주어진다.
각 계산마다 한 줄에 결과를 SI 기본단위로 바꿔서 출력한다. +나 -의 양쪽 차원이 서로 다르면 계산할 수 없으므로 그 줄에는 Incompatible을 출력한다.
한 줄은 다음 형식으로 적는다.
e, 지수의 부호, 두 자리 이상의 지수 순서다. C의 printf("%.5e", x)나 파이썬의 "%.5e" % x가 만드는 형식과 같고, 1.40000e+03이나 -2.50000e-03처럼 나온다. 값이 0이면 부호 없이 0.00000e+00을 적는다./를 적고, 그 단위를 같은 순서로 지수의 절댓값과 함께 적는다.^ 앞뒤는 띄우지 않는다.