접두사 표기법에서 연산자는 인수 앞에 오기 때문에 연산자 next()
가 재귀 적으로 호출된다고 상상할 수 있습니다 . 대괄호 표기법에서 연산자는 인수 사이를 이동하므로 간단히 구문 분석 트리로 상상할 수 있습니다. 접미사 표기법에서 연산자는 인수 뒤에 오기 때문에 스택 기반으로 상상할 수 있습니다.
접두사 표기법에서 연산자는 어디든 갈 수 있습니다 * . 연산자가 나타나고 인수가 충분하지 않은 경우 연산자는 인수가 충분할 때까지 기다립니다. 이 과제를 해결하려면 매우 기본적인 애니 픽스 평가기를 구현해야합니다. (주 anyfix 난 당신과 함께 놀 수있는 포기하는 레크리에이션 언어라고 여기 또는 체크 아웃 여기가 )
다음 명령을 지원해야합니다.
(아티스트 1)
- 복제
- 부정
(아티스트 2)
- 부가
- 곱셈
- 평등 : 반환
0
또는1
.
이 명령에 공백이 아닌 5 개의 기호를 사용하도록 선택할 수 있습니다. 데모 목적으로, "
복제, ×
곱셈 및 +
덧셈으로 사용합니다.
리터럴의 경우 음이 아닌 정수만 지원하면되지만 통역사는 모든 정수를 포함 할 수 있어야합니다 (언어의 (합리적인) 정수 범위 내).
예를 살펴 보겠습니다 : 10+5
. 스토리지는 대기열이 아닌 스택으로 작동해야합니다. 먼저 스택은에서 시작 []
하고 대기열에있는 운영자 목록은에서 시작합니다 []
. 그런 다음 리터럴 10
을 평가하여 스택을 만듭니다 [10]
. 다음으로 연산자 +
가 평가되는데 두 개의 인수가 필요합니다. 그러나 스택에는 하나의 인수 만 있으므로 대기중인 연산자 목록이됩니다 ['+']
. 그런 다음 리터럴 5
을 평가하여 스택을 만듭니다 [10, 5]
. 이 시점에서 연산자 '+'
를 평가하여 스택 [15]
과 대기열을 []
만듭니다.
최종 결과는해야한다 [15]
위해 + 10 5
, 10 + 5
하고 10 5 +
.
더 어려운 예를 보자 : 10+"
. 스택과 큐는 다음과 같이 시작 []
하고 []
. 10
스택을 만드는 첫 번째 평가 [10]
됩니다. 다음으로, +
인수가 충분하지 않기 때문에 스택을 변경하지 않고 대기열을 만듭니다 ['+']
. 그런 다음 "
평가됩니다. 이것은 즉시 실행될 수 있으므로 스택을 [10, 10]
만듭니다. +
스택이 [20]
되고 큐 가되도록 평가할 수 있습니다 []
. 최종 결과는 [20]
입니다.
작업 순서는 어떻습니까?
를 보자 ×+"10 10
. 스택과 큐는 다음과 같이 시작합니다 []
.
×
: 스택이 변경되지 않고 대기열이됩니다['×']
.+
: 스택이 변경되지 않고 대기열이됩니다['×', '+']
."
: 스택이 변경되지 않고 대기열이됩니다['×', '+', '"']
.10
: 스택이됩니다[10]
.×
첫 번째로 표시되므로 평가할 첫 번째 연산자 여야 하지만"
즉시 실행할 수 있고 가능한 연산자가 없으므로 평가됩니다. 스택이[10, 10]
되고 대기열이됩니다['×', '+']
.×
이제 스택[100]
과 대기열 을 만드는 평가할 수 있습니다['+']
.10
: 스택이가 되어 평가할[100, 10]
수+
있습니다. 스택이[110]
되고 대기열이됩니다[]
.
최종 결과는 [110]
입니다.
이 데모에 사용 된 명령은 anyfix 언어의 명령과 일치합니다. 그러나 마지막 예제는 통역사의 버그로 인해 작동하지 않습니다. (면책 조항 : 귀하의 제출물은 anyfix 해석기에서 사용되지 않습니다)
도전
공백이 아닌 숫자가 아닌 문자 5 개를 선택하고 위의 사양에 따라 anyfix 인터프리터를 작성하십시오. 프로그램은 단일 배열 또는 여기에 포함 된 값을 출력 할 수 있습니다. 값 스택에는 실행이 끝날 때 단일 값만 포함되며 실행이 끝날 때 연산자 큐가 비어있게됩니다.
이것은 코드 골프 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.
테스트 사례
이 테스트 사례의 경우 복제본은 "
, 음수 -
, 덧셈은 +
, 곱셈은 ×
같고 동등은 =
입니다.
Input -> Output
1+2×3 -> 9
1"+"+ -> 4
2"××" -> 16
3"×+" -> 18
3"+×" -> 36
123"= -> 1 ("= always gives 1)
1+2=3 -> 1
1"=2+ -> 3
1-2-+ -> -3
-1-2+ -> 3 (hehe, the `-1` becomes `+1` at the `-` rather than making the `2` a `-1`)
+×"10 10 -> 200 (after the 10 is duplicated (duplication is delayed), 10 + 10 is performed and then 20 * 10, giving 200)
규칙
- 표준 허점 적용
- 원하는 경우 anyfix 공식 통역사를 이용하여 골프를 타실 수 있습니다. 끔찍하게 잃을 것으로 예상됩니다.
입력은 문자열로 제공되고 문자열 표현 중 하나의 배열 인 단일 정수로 출력됩니다. 입력에 공백, 숫자 및 선택한 5 자만 포함한다고 가정 할 수 있습니다.
* 사실 아니다
0
그리고 1
?
×+"10 10
테스트 사례 또는 1) 공백을 사용하고 2) 복제본 사용을 지연시키는 다른 예제를 포함해야합니다. 연산자 (전혀 놓친 두 가지 .