解决堆栈状态图


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 (1) (0)2 (1 0)
  • U:将列表中的所有值放入堆栈:2 (1 0)2 1 0

这些等效于欠载命令~ : ! a * ^如果不使用其他命令,。

SDR,和L可以与在叠层的顶部上的任何值使用,但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 2016年

需求是否在C堆栈的顶部和第二位置列出?还是第二个位置的元素可以添加到顶部列表中?
edc65 '16

C两个职位都需要清单。串联一个值和一个列表是没有意义的。
硕果累累

Answers:


9

Python 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'

说明:首先,我们复制零并将其包装在列表中:

DL -> 3 2 1 0 (0)

这是我们的基础。现在,我将解释一种通用算法,该算法可以... 1 0 (x)转换... 1 0 (i x)为任意整数i。我以一个例子为例i = 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 time(SR)来删除堆栈的其余部分。最后,我们解压缩列表并删除0插入的第一个列表以开始列表(UR)。


你是说打字吗 s而不是l
扎卡里

@ZacharyT糟糕,是的。由于l在REPL上进行了定义,因此可以在整理周围的东西时起作用。
orlp

显示的示例似乎无效...(DLLSLSCSLSCSLSCSLSCLSLSCDURLCULCULSCLSLSCSLSCSLSCLSLSCDURLCULCULSCLSLSCSLSCLSLSCDURLCULCULSCLSLSCLSLSCDURLCULCULSCLLSLSCDURLCULCULSCSRSRSRSRUR )。S当堆栈中只有1个值时,它将尝试执行一条指令。
硕果累累

@ Challenger5而且我也忘了更新示例...现在应该修复。
orlp

是的,现在看起来不错!
硕果累累

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.]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.