이 닫힌 질문 의 제목을 보았을 때 , 흥미로운 코드 골프 도전처럼 보였습니다. 따라서 다음과 같이 발표하겠습니다.
도전:
산술 식의 지정된, 프로그램, 서브 루틴 또는 식 작성 중위 표기 , 등 1 + 2, 동일한 표현 출력 후위 표기 , 즉 1 2 +.
(참고 : 비슷한 도전이 1 월 초에 게시 되었지만,이 두 가지 과제가이 별도의 도전을 정당화하기에 충분히 세부적으로 다르다고 생각합니다. 또한 아래의 모든 내용을 입력 한 후에 다른 스레드 만 발견했습니다. 그냥 버리지 말고)
입력:
입력이 이루어지는 유효한 중위 산술 식 구성 번호 (음이 아닌 정수 하나 개 이상의 십진수의 시퀀스로 표현), 균형 괄호 그룹화 표현식을 나타내고, 네 중위 이진 연산자 + , -, *및 /. 이들 중 임의의 수의 공백 문자로 이들을 분리 (및 전체 표현식으로 묶을 수 있음) 할 수 있습니다.이 문자는 무시해야합니다. 1
공식 문법을 좋아하는 사람들을 위해 유효한 입력을 정의하는 간단한 BNF 유사 문법이 있습니다. 간결하고 명확하게하기 위해 문법에는 두 개의 토큰 (숫자 안의 숫자 이외) 사이에 발생할 수있는 선택적 공백이 포함되지 않습니다.
expression := number | subexpression | expression operator expression
subexpression := "(" expression ")"
operator := "+" | "-" | "*" | "/"
number := digit | digit number
digit := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
하나 가 두 개의 연속 된 숫자를 분리 할 때 공간의 존재는 분석에 영향을 줄 수있는 경우에만이고; 그러나 연산자로 분리되지 않은 두 개의 숫자는 유효한 접 두부 표현식에서 발생할 수 없으므로이 경우에는 유효한 입력에서 발생할 수 없습니다.
산출:
출력은 입력과 동등한 접미사 표현식이어야합니다. 출력 식으로, 숫자와 연산자 구성되어야 단일 공백 문자 다음 문법 (여기서 같이 인접 토큰들의 각 쌍 사이 않은 공간을 포함하는) 2 :
expression := number | expression sp expression sp operator
operator := "+" | "-" | "*" | "/"
number := digit | digit number
digit := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
sp := " "
2 단순화 number를 위해이 문법 의 생성은 아래 규칙에 따라 출력이 금지 되더라도 앞에 0이있는 숫자를 허용합니다.
연산자 우선 순위 :
괄호가 없으면 다음과 같은 우선 순위 규칙이 적용됩니다.
- 연산자
*및/보다 높은 우선 순위를 가지고+와-. - 연산자
*와/서로 우선 순위가 같습니다. - 연산자
+와-서로 우선 순위가 같습니다. - 모든 연산자는 왼쪽 연관입니다.
예를 들어 다음 두 표현식은 동일합니다.
1 + 2 / 3 * 4 - 5 + 6 * 7
((1 + ((2 / 3) * 4)) - 5) + (6 * 7)
그리고 둘 다 다음과 같은 결과를 산출해야합니다.
1 2 3 / 4 * + 5 - 6 7 * +
(이 같은 우선 순위 규칙은 C 언어로 그것에서 파생 된 대부분의 언어에 있습니다. 그들은 아마, 당신이 초등학교에서 배운 규칙을 닮은의 상대적 우선 순위에 대한 가능성 제외시켰다 *와 /.)
기타 규칙 :
제공된 솔루션이 표현식 또는 서브 루틴 인 경우 입력을 제공하고 출력을 단일 문자열로 리턴해야합니다. 솔루션이 완전한 프로그램 인 경우 표준 입력에서 접두사 표현식이 포함 된 행을 읽고 접미사 버전이 포함 된 행을 표준 출력으로 인쇄해야합니다.
입력의 숫자 는 선행 0을 포함 할 수 있습니다. 출력에서의 숫자는 안된다 (로 출력한다 숫자 0을 제외하고 0을 선도했다
0).식을 평가하거나 최적화 할 필요는 없습니다. 특히, 연산자가 반드시 연관, 정류 또는 기타 대수적 아이덴티티를 만족한다고 가정해서는 안됩니다. 즉, 당신은 예를 들어 가정해서는 안
1 + 2동일2 + 1또는1 + (2 + 3)동등(1 + 2) + 3.입력의 숫자가 2 31 − 1 = 2147483647을 초과하지 않는다고 가정 할 수 있습니다 .
이 규칙은 올바른 출력이 입력에 의해 고유하게 정의되도록하기위한 것입니다.
예 :
유효한 입력 표현식과 해당 출력은 다음과 같습니다 "input" -> "output".
"1" -> "1"
"1 + 2" -> "1 2 +"
" 001 + 02 " -> "1 2 +"
"(((((1))) + (2)))" -> "1 2 +"
"1+2" -> "1 2 +"
"1 + 2 + 3" -> "1 2 + 3 +"
"1 + (2 + 3)" -> "1 2 3 + +"
"1 + 2 * 3" -> "1 2 3 * +"
"1 / 2 * 3" -> "1 2 / 3 *"
"0102 + 0000" -> "102 0 +"
"0-1+(2-3)*4-5*(6-(7+8)/9+10)" -> "0 1 - 2 3 - 4 * + 5 6 7 8 + 9 / - 10 + * -"
(적어도 모든 것이 정확하기를 바랍니다 . 수작업으로 변환을했기 때문에 실수가 발생했을 수 있습니다.)
분명히하기 위해 다음 입력은 모두 유효하지 않습니다. 주어진 경우 솔루션이 무엇을하든 중요 하지 않습니다 (물론, 예를 들어 오류 메시지를 반환하는 것이 무한한 메모리를 소비하는 것보다 낫습니다).
""
"x"
"1 2"
"1 + + 2"
"-1"
"3.141592653589793"
"10,000,000,001"
"(1 + 2"
"(1 + 2)) * (3 / (4)"
1 2 3 4 + *하겠습니까?
1 2 3 4 +평균`1 + 2 + 3 + 4`입니다.