Stack Catsプログラムをフラット化する


13

Stack Catsは、可逆的なスタックベースの言語です。その可逆的な性質により、やや奇妙なループになります。この挑戦は条件付きループについて(...)です。これらのループが特定の方法でネストされると、コードを変換してネストの深さを減らすことができます。ルールは次のとおりです(任意のスニペットの場所Aと略称B):

  1. 1つのループが別のループで始まるとき、私たちは前に内部ループを抽出することができます:((A)B)なり(A)(B)
  2. 1つのループが別のループを終了すると、我々は最後まで内部ループを抽出することができます:(B(A))なり(B)(A)
  3. 空のループを()プログラムから完全に削除できます。当然の結果として(他の規則と組み合わせて)、((A))と同等(A)です。

残る唯一のネストされたループは、の形式です(A(B)C)。ここでABおよびC空ではありません。

チャレンジ

有効なStack Catsプログラムが与えられ、タスクは、上記の変換を使用して、ループのネストレベルを可能な限り減らし、空のループを残さないことです。

有効なStack Catsプログラム...

  • ...は文字のみで構成され()/\<>[]{}!"*+-:=ITX^_|ます。
  • ...ミラー対称性\(]{}!{}[)/があります(たとえば、有効なプログラムですが、そうで/|/はありません)。
  • ...が正しく一致してネストされ()、and {}[]、通常のように一致する必要は<>あり\/ませんが、ミラー対称性の要件によりペアで表示されます)。

入力として文字列または文字のリストを使用できますが、出力は同じ形式で提示する必要があります。

プログラムまたは関数を記述し、入力を受け取って出力を提供する当社の標準的な方法を使用できます。これらの抜け穴はデフォルトでは禁止されていることに注意してください。

これはであるため、バイト単位で測定された最短の有効な回答が勝ちます。

テストケース

テストケースはそれぞれ2行(入力と出力)で、空の行で区切られています。1つの出力が空であることに注意してください。また、空の入力をサポートする必要があります(結果として空の出力になるはずです)。

(((=+|+=)))
(=+|+=)

({(=+|+=)})
({(=+|+=)})

((\)/)I(\(/))
(\)(/)I(\)(/)

(()()(())()())


((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)

確かに、抽出しなければならないループは括弧()で示されているだけなので、入力{{A}B}はそのまま残り{A}{B}、同様に抽出されませんか?
ケビンクルイッセン

@KevinCruijssenはい、変換は(...)-typeループに対してのみ有効です。
マーティンエンダー

最後のテストケースでは、なぜ\^/括弧内にあるのですか?
ケビンクルーッセン

1
@KevinCruijssenこれらは、(<|>((X((T)))[_]))とを抽出した後の最も外側の括弧です(([_](((T))X))<|>)
マーティンエンダー

1
ああ、分かった。したがって、ルール1とルール2の両方((A)B(C))(A)(B)(C)起因することになります:((A)B(C))(A)(B(C))(ルール1)→ (A)(B)(C)(ルール2)。
ケビンクルーイッセン

回答:


6

網膜0.8.2113の 107 67 66バイト

+`\(\)|(\()?(\(((\()|(?<-4>\))|[^()])*(?(4)@)\))(?(1)|(\)))
$5$2$1

オンラインでお試しください!@MartinEnderのおかげで3 4バイトの節約が含まれています。説明:

+`

一致するものがなくなるまで、置換を繰り返し適用します。

\(\)|

空のループに一致する場合(この場合、何もキャプチャされないため、置換は単にループを削除します)または:

(\()?

オプションでに一致し(ます。これは、一致した場合はグループ1でキャプチャされますが、一致しなかった場合はキャプチャされません。

(\(

グループ2の試合の本文をキャプチャし、aにマッチし(ます。

(
 (\()
|
 (<-4>\))
|
 [^()]
)*

(グループ4で)キャプチャするか、グループ4からキャプチャを削除する(グループがない場合は失敗する)か、何か他のものに繰り返し一致します。

(?(4)@)

グループ4に予備のキャプチャが残っていないことを確認します。

\))

別のキャプチャグループ2を終了する )ます。

(?(1)|(\)))

キャプチャグループ1が空の場合、キャプチャ )、キャプチャグループ5をキャプチャします(したがって、これら2つのグループのいずれか1つがキャプチャを持ちます)。

$5$2$1

グループ1またはグループ5でキャプチャされたブラケットをグループ2の反対側に移動します。これにより、内側のループが一致した側に応じて、外側のループの前または外側に移動します。


2

Stax v1.0.3 +、76 65 64 62 58 バイトCP437

îÜ•$o,Γ{í]Üf╒9♦╛üΣóç*\$ñ₧└ΦJ♠¥c╥jóu≥3E.╘ⁿ◄◘W₧<¶┼7úê╟┴zç↨aG

解凍すると70バイト、

{{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Md}X!:Rx!:Rc.()z:rgp

オンラインで実行してデバッグします!

説明

{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}MdA((B)C)D4つの部分に分かれてに変換するブロックですA(B)(C)D

X!:Rx!:R入力文字列でブロックを実行し(ステップ1)、文字列を反映します(Staxの文字列反映は、文字列の反転に加えて(変換)(<[{/を(to)に置き換えることを意味します\}]>))、取得した文字列でブロックを実行し、それを反映します(ステップ2)。ステップ2は基本的にに変換(A(B))してい(A)(B)ます。

c.()z:r すべての空のループを削除します(ステップ3)。

gp反復の不動点を見つけるジェネレーターです。この場合、文字列は変更されなくなるまで3ステッププロセスで繰り返されます。

暗黙的な出力。


1

Pythonの3226の 223 212 206バイト

さて、これは再帰的正規表現をサポートしない言語でこれを解決する試みです。

lambda s:g(g(s,*'()'),*')(').replace('()','')
def g(s,t,u):
 m,*a={},;i=v=0
 for c in s:
  i+=1;a+=[i]*(c==t)
  if c==u:*a,x=a;m[x]=i;v=m.get(x+1)
  if v:return g(s[:x]+s[x+1:v]+t+s[v:],t,u)
 return s[::-1]

オンラインでお試しください!

編集:

  • [::-1]Mr.Xcoderのおかげで、6バイトを節約するためにリファクタリングされました。

g関数は、の発生を見つける基本的なビルディングブロックであり、((A)B)それを変更し、(A)(B)に、それ以上変換ができなくなるまで結果に適用されるです。

主な手順は次のとおりです。

  • g通常の入力に適用します。
  • g反転した入力に適用します。この実行により))A(B(、反転入力でのの発生が検出され、これによりが効果的に処理され(A(B))ます。
  • の出現を削除します()

問題は、g制御構造が非常に悪いため、1行にしようとするとひどく膨張するため、このソリューションに基づいて大幅な改善が可能になるとは思わない。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.