Stack Cats programını düzleştirme


13

Stack Cats geri dönüşümlü, yığın tabanlı bir dildir. Tersinir doğası biraz garip döngüler yaratır. Bu zorluk koşullu döngü ile ilgilidir (...). Bu döngüler belirli yollarla iç içe yerleştirildiğinde, iç içe geçme derinliğini azaltmak için kodu dönüştürmek mümkündür. Kurallar ( rastgele bir parçacığın nerede Ave nerede Bdurduğu):

  1. Bir döngü başka bir döngü ile başladığında, iç döngüyü öne çıkarabiliriz: ((A)B)olur (A)(B).
  2. Bir döngü başka bir döngü ile sona erdiğinde, iç döngüyü sonuna kadar çıkarabiliriz: (B(A))olur (B)(A).
  3. Boş döngüler,, ()programdan tamamen kaldırılabilir. Bir sonuç olarak (diğer kurallarla birlikte), ((A))eşdeğerdir (A).

Kalır, sadece, iç içe geçmiş halkalar formu olduğu (A(B)C)yerde, A, Bve Cboş olmayan bulunmaktadır.

Meydan okuma

Size geçerli bir Stack Cats programı veriliyor ve göreviniz, yukarıdaki dönüşümleri kullanarak boş döngüler bırakmadan, ilmeklerin iç içe geçme düzeyini mümkün olduğunca azaltmaktır.

Geçerli bir Stack Cats programı ...

  • ... sadece karakterlerden oluşuyor ()/\<>[]{}!"*+-:=ITX^_|.
  • ... ayna simetrisine sahiptir (örn. \(]{}!{}[)/geçerli bir programdır, ancak /|/değildir).
  • ... doğru uyumlu ve iç içe olan ()ve {}( [], <>ve \/onlar yüzünden ayna simetrisi şartına çiftler halinde görünürsünüz rağmen mutlaka her zamanki gibi eşleştirilecek gerekmez).

Girdi olarak bir dize veya bir karakter listesi alabilirsiniz, ancak çıktının aynı biçimde sunulması gerekir.

Bir program veya işlev yazabilir ve girdi alma ve çıktı sağlama gibi standart yöntemlerimizden herhangi birini kullanabilirsiniz . Bu boşlukların varsayılan olarak yasak olduğunu unutmayın .

Bu , bu yüzden bayt cinsinden ölçülen en kısa geçerli cevap kazanır.

Test Durumları

Test senaryolarının her biri boş satırlarla ayrılmış iki satırdır (giriş ve çıkış). Bir çıkışın boş olduğunu unutmayın. Ayrıca boş girişi desteklemeniz gerekir (bu da boş çıktıya neden olur).

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

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

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

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


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

Sadece emin olmak için , çıkarmamız gereken döngüler sadece parantez ile belirtilir (), bu nedenle bir girdi {{A}B}olduğu gibi kalacaktır ve çıkarılmayacak {A}{B}mı?
Kevin Cruijssen

@KevinCruijssen Evet, dönüşüm yalnızca -tip (...)döngüler için geçerlidir .
Martin Ender

Son test durumunda neden \^/parantez içinde?
Kevin Cruijssen

1
@KevinCruijssen Bunlar ayıkladıktan sonra en dıştaki parantezler (<|>((X((T)))[_]))ve (([_](((T))X))<|>).
Martin Ender

1
Ah, anlıyorum. Bu nedenle ((A)B(C)), daha (A)(B)(C)sonra her iki kural 1 ve 2'den kaynaklanacaktır: ((A)B(C))(A)(B(C))(kural 1) → (A)(B)(C)(kural 2).
Kevin Cruijssen

Yanıtlar:


6

Retina 0.8.2 , 113 107 67 66 bayt

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

Çevrimiçi deneyin! @MartinEnder sayesinde 3 4 bayt tasarruf içerir . Açıklama:

+`

Hiçbir eşleşme kalmayana kadar oyuncu değişikliğini tekrar tekrar uygulayın.

\(\)|

Boş bir döngüyü eşleştirin (bu durumda ikame yalnızca onu silmesi için hiçbir şey yakalanmaz) veya:

(\()?

İsteğe bağlı olarak a (. Bu, eşleşirse grup 1'de yakalanır, ancak eşleşmezse yakalanmaz.

(\(

2. maçta maçın ana gövdesini yakalayın ve a (.

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

(Grup 4'teki )yakalamayı a veya grup 4'ten yakalama (grup yoksa başarısız) veya başka bir şeyle tekrar tekrar eşleştirin .

(?(4)@)

Grup 4'te yedek yaka kalmadığından emin olun.

\))

Yakalama grubu 2'yi bir başkasıyla sonlandırın ).

(?(1)|(\)))

Yakalama grubu 1 boşsa, )yakalama grubu 5'i yakalayın. (Yani bu iki gruptan tam olarak birinin yakalanması olacaktır).

$5$2$1

Grup 1 veya grup 5'te yakalanan braketi grup 2'nin diğer tarafına taşıyın. Bu, iç döngüyü, hangi tarafa eşleştiğine bağlı olarak dış halkanın önüne veya sonuna doğru taşıma etkisine sahiptir.


2

Stax v1.0.3 +, 76 65 64 62 58 bayt CP437

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

Ambalajından çıkarıldığında 70 bayt,

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

Çevrimiçi çalıştırın ve hata ayıklayın!

açıklama

{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}MdA((B)C)Ddört parçaya ayrılan ve dönüştüren bir bloktur A(B)(C)D.

X!:Rx!:Rbloğu giriş dizgisinde yürütür (adım 1), sonra dizeyi yansıtır (Stax'taki dize yansıması dizeyi tersine çevirmeyi ve (<[{/(to) ile değiştirmeyi (çevirmeyi) ifade eder \}]>)) ve bloğu elde edilen dizede yürütür ve sonra geri yansıtır (Adım 2). Aşama 2, esas olarak dönüştürmektedir (A(B))için (A)(B).

c.()z:r tüm boş halkaları çıkarın (3. adım).

gpyinelemenin sabitleme noktasını bulan bir jeneratördür. Bu durumda dize, artık değişmeyene kadar 3 adımlı işlemle yinelenir.

Örtük çıktı.


1

Python 3 , 226 223 212 206 bayt

Tamam, işte bunu özyinelemeli regex'i desteklemeyen bir dilde çözmeye çalışmak.

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]

Çevrimiçi deneyin!

Düzenlemeler:

  • Refactored [::-1]6 bayt, Mr.Xcoder sayesinde kaydedin.

gFonksiyon bir karşılık bulur temel yapı bloğu olup ((A)B), bu değişikliklerin (A)(B)fazla dönüşüm mümkün olana kadar, daha sonra sonuç kendisi uygular.

Ana adımlar:

  • gGirişe normal olarak uygulayın .
  • Ters gçevrilen girişe uygulayın . Bu çalışma ))A(B(, etkin biçimde işleyen ters girdinin oluşumunu bulur (A(B)).
  • Öğesinin tüm oluşumlarını kaldırın ().

Sorun şu ki, go kadar kötü kontrol yapısına sahip ki, tek satırlık çalışmayı kötü bir şekilde şişirdi, bu yüzden bu çözüme dayanarak büyük bir iyileştirmenin mümkün olduğunu düşünmüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.