스택 상태 다이어그램 해결


15

스택 상태 다이어그램은 한 스택의 값이 다른 스택으로 어떻게 변경되는지 보여줍니다. 예를 들어, 이것은 스택 상태 다이어그램입니다.

3 0 2 1 0

이는 처음에 3 개의 값 ( 3부분)을 포함하는 스택이 있음을 의미합니다 . 이 값은 0에서 2까지 색인화되며 맨 위에 0이 표시됩니다 2 1 0. 다음 부분 0 2 1 0에서는 스택의 최종 상태에 대해 설명합니다. 원래 스택 위에 있던 값도 뒤쪽으로 복사되었습니다.

이러한 변환은 여러 데이터 유형을 지원하는 스택에서 발생합니다.

  • "값"유형은 원래 스택에있는 유형입니다. 문자열, 정수 등일 수 있지만 값을 알 필요는 없습니다.
  • "목록"유형. 모든 데이터 유형의 값을 포함하는 목록입니다.

이 변환을 모델링하기 위해 다음 작업이 허용됩니다.

  • S: 스택 위에 두 값을 교환합니다. 2 1 02 0 1
  • D: 스택 위에 값을 복제합니다. 1 01 0 0
  • R: 스택에서 최고 값을 제거합니다. 2 1 02 1
  • L: 최상위 값을 해당 값이 포함 된 단일 요소 목록으로 바꿉니다. 2 1 02 1 (0)
  • C: 스택에서 상위 2 개의 목록을 연결하십시오. 2 (1) (0)2 (1 0)
  • U: 목록의 모든 값을 스택에 배치하십시오. 2 (1 0)2 1 0

이것들은 ~ : ! a * ^다른 명령이 사용되지 않는 경우 이는 Underload 명령 .

S, D, RL스택의 상단에있는 값으로 사용될 수 있지만, CU함수에 스택 위에 목록을 가져야한다. 생성 된 시퀀스가 ​​유효하지 않은 연산을 수행하려고 시도하는 제출 (예 D: 빈 스택 또는 U목록이 아닌)이 잘못되었습니다. 되어야 처벌 고정.

스택 상태 다이어그램을 해결하려면 초기 스택 상태를 새 스택 상태로 올바르게 변환하는 명령 시퀀스를 찾으십시오. 예를 들어, 한 가지 해결책 3: 0 2 1 0LSLCSLCULSLCLSLDCSC USLCU 다음과 같습니다.

   2 1 0
L  2 1 (0)
S  2 (0) 1
L  2 (0) (1)
C  2 (0 1)
S  (0 1) 2
L  (0 1) (2)
C  (0 1 2)
U  0 1 2
L  0 1 (2)
S  0 (2) 1
L  0 (2) (1)
C  0 (2 1)
L  0 ((2 1))
S  ((2 1)) 0
L  ((2 1)) (0)
D  ((2 1)) (0) (0)
C  ((2 1)) (0 0)
S  (0 0) ((2 1))
C  (0 0 (2 1))
U  0 0 (2 1)
S  0 (2 1) 0
L  0 (2 1) (0)
C  0 (2 1 0)
U  0 2 1 0

당신의 임무는 스택 상태 다이어그램을 가져 와서 솔루션을 출력하는 프로그램을 작성하는 것입니다.

테스트 사례

2 1 0       ->

3 2 0       -> SR

9           -> RRRRRRRRR

2 0 1 0     -> LSLCDCUR

2 0 1 1     -> SD

6 2         -> RRSRSRSR

5 0 1 2 3 4 -> LSLCSLCSLCSLCU

4 2 0 1 3 2 -> LSLCSLSCSLCULSLSCSLSCLSLDCSCUSLCU

이것은 이므로 가장 짧은 유효한 답변 (바이트)이 이깁니다.


목록이 포함 된 목록을 가질 수 있습니까? 편집 : 예, 당신은 할 수 있습니다.
orlp

합니까 C스택의 상단과 두 번째 위치에 필요 목록을? 또는 두 번째 위치의 요소를 맨 위에 목록에 추가 할 수 있습니까?
edc65

C두 위치 모두에 대한 목록이 필요합니다. 값과 목록을 연결하는 것은 의미가 없습니다.
Esolanging Fruit

답변:


9

파이썬 3, 84 바이트

lambda n,*s:"DLL"+"L".join(i*"SLSC"+"LSLSCDURLCULCULSC"for i in s[::-1])+n*"SR"+"UR"

용법:

# Example: 4 2 0 1 3 2 -> LSLCSLSCSLCULSLSCSLSCLSLDCSCUSLCU
>>> f = lambda ...
>>> f(4, 2, 0, 1, 3, 2)
'DLLSLSCSLSCLSLSCDURLCULCULSCLSLSCSLSCSLSCLSLSCDURLCULCULSCLSLSCLSLSCDURLCULCULSCLLSLSCDURLCULCULSCLSLSCSLSCLSLSCDURLCULCULSCSRSRSRSRUR'

설명 : 시작하기 위해 0을 복제하고 목록으로 묶습니다.

DL -> 3 2 1 0 (0)

이것이 우리의 기지입니다. 이제 임의의 정수 ... 1 0 (x)로 바뀌는 일반적인 알고리즘을 설명하겠습니다 . 예제로 사용 하겠습니다 . 임의의 목록이 있습니다. 우리는 현재 목록 을 다른 목록으로 포장하여 시작 합니다.... 1 0 (i x)ii = 2(x)(x)

L -> 3 2 1 0 ((x))

이제 다음 순서 i시간을 반복하십시오 .

SLSC -> 3 2 1 (0 (x))
SLSC -> 3 2 (1 0 (x))

이제 2를 list에 삽입 할 준비가되었습니다 (x). 이것은 다음과 같습니다 :

LSLSC -> 3 (2 (1 0 (x)))
DU -> 3 (2 (1 0 (x))) 2 (1 0 (x))
RLCU -> 3 2 (1 0 (x)) 2
LCU -> 3 2 1 0 (x) 2
LSC -> 3 2 1 0 (2 x)

우리는 왼쪽에 새로운 정수를 계속 밀어 넣습니다. 그래서 (0)우리가 시작한 첫 번째 는 오른쪽에 머물러 있습니다.

모든 정수를 목록에 삽입 한 후 n 시간 ( SR)을 바꾸고 제거하여 나머지 스택을 제거 합니다. 마지막으로 목록의 압축을 풀고 0삽입 한 첫 번째 목록을 삭제하여 목록을 시작합니다 ( UR).


s대신에 입력 l하시겠습니까?
Zacharý

@ZacharyT 죄송합니다. l내 REPL에 정의되어 있기 때문에 주변을 뒤섞는 동안 효과 가있었습니다.
orlp

표시된 예가 작동하지 않는 것 같습니다 ... ( DLLSLSCSLSCSLSCSLSCLSLSCDURLCULCULSCLSLSCSLSCSLSCLSLSCDURLCULCULSCLSLSCSLSCLSLSCDURLCULCULSCLSLSCLSLSCDURLCULCULSCLLSLSCDURLCULCULSCSRSRSRSRUR ). S스택에 1 개의 값만 있으면 명령 을 실행하려고 시도합니다 .
Esolanging Fruit

@ Challenger5 그리고 나는 또한 예제를 업데이트하는 것을 잊었다. 지금 고쳐야한다.
orlp

그래, 이제 좋아 보인다!
Esolanging Fruit

0

CJam, 54 바이트

orlp의 Python 솔루션에서 CJam으로의 번역입니다. 여기에는 새로운 것이 없습니다.

"DLL"q~("SR"*\W%{"SLSC"*"LSLSCDURLCULCULSC"+}%'L*\"UR"

설명:

"DLL"                  e# Push string
q~                     e# Read input and evaluate
(                      e# Pop the first value
"SR"                   e# Push string
*                      e# Repeat string n times
\                      e# Swap (bring s to front)
W%                     e# Reverse
{                      e# For each:
  "SLSC"               e#   Push string
  *                    e#   Repeat i times
  "LSLSCDURLCULCULSC"+ e#   Append string to end
}%                     e# End
'L*                    e# Join with 'L'
\                      e# Swap (bring "SR"*n to front)
"UR"                   e# Push string
                       e# [Stack is implicitly output.]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.