スタック状態図を解く


15

スタック状態図は、1つのスタックの値が他のスタックにどのように変更されるかを示します。たとえば、これはスタック状態図です:

3 0 2 1 0

これは、最初に3つの値(3パーツ)を含むスタックがあることを意味します。これらの値には0から2までのインデックスが付けられ、先頭に0が付きます2 1 0。次の部分0 2 1 0では、スタックの最終状態について説明します。元々スタックの最上位にあった値も、後方にコピーされています。

これらの変換は、いくつかのデータ型をサポートするスタックで発生します。

  • 「値」タイプ。これは元々スタックにあったものです。これは文字列、整数などでもかまいませんが、その値を知る必要はありません。
  • 「リスト」タイプ。これは、任意のデータタイプの値を含むリストです。

この変換をモデル化するには、次の操作が許可されます。

  • S:スタックの上部にある2つの値を交換します。2 1 02 0 1
  • D:スタックの一番上に値を複製します:1 01 0 0
  • R:スタックの一番上の値を削除します。2 1 02 1
  • L:一番上の値を、その値を含む1要素のリストに変換します。2 1 02 1 (0)
  • C:スタックの上位2つのリストを連結します。2 (1) (0)2 (1 0)
  • U:リストのすべての値をスタックに配置します。2 (1 0)2 1 0

これらは、他のコマンドが使用されない限りUnderloadコマンドと同等~ : ! a * ^です。

SDR、およびLスタックの一番上の任意の値で使用することができますが、CおよびU機能へのスタックの一番上にリストを持っている必要があります。その生成されたシーケンス(のような不正な操作プリフォームしようと提出D空のスタック上またはU非リスト上)があり、間違ったとされている必要があり処罰固定します。

スタック状態図を解決するには、初期スタック状態を新しい状態に正しく変換する一連のコマンドを見つけます。たとえば、1つの解決策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 16

Cスタックの最上位と2番目の位置にリストが必要ですか?または、2番目の位置の要素を一番上のリストに追加できますか?
edc65 16

C両方の位置にリストが必要です。値とリストを連結しても意味がありません。
エソランジングフルーツ

回答:


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)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か?
ザカリー16

@ZacharyTおっと、うん。lREPLで定義されているため、物事をシャッフルしながら動作しました。
orlp 16

示されている例は動作しないようです...(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.]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.