Bu, Stack Cats tarzında geçerli bir Stack Cats programı olup olmadığını öğrenin!


16

Arka fon

Stack Cats , Martin Ender tarafından yapılan geri dönüşümlü ezoterik bir dildir. Stack Cats'deki her komut ya kendisinin tersidir (simetrik bir karakter olarak temsil edilir -_:T|) veya ters komutuna sahiptir (ayna görüntüsü gibi temsil edilir () {} [] <>). Stack Cats, tüm programın kendisinin ayna görüntüsü olması için güçlü bir sözdizimsel gereksinime sahiptir. Bunun geçerli herhangi bir Stack Cats programının doğal bir ayna görüntüsü ortamı olduğu anlamına geldiğini unutmayın. .

Stack Cats'in tüm komut seti:

  • Kendinden simetrik: !*+-:=ITX^_|
  • Simetrik çiftler: () {} [] <> \/

Diğer karakterler geçersiz; yukarıdaki karakter setinde olmayan bir karaktere sahip olan herhangi bir girdi yanlış çıktı vermelidir.

Dilin ek kısıtlaması vardır ()ve {}çiftler her zaman dengelenmelidir, ancak basitlik için bu durumu kontrol etmeniz gerekmez.

Aşağıdakiler geçerli bir Stack Cats programı için bazı örneklerdir (tekrar, dengeli parens olup olmadığını kontrol etmediğinizi unutmayın):

{[+]==[+]}
[)>^<(]
({T)}|{(T})
<(*]{[:!-_:>}<[<)*(>]>{<:_-!:]}[*)>

Bunlar değil:

b<+>d
())(
({[<++<]})

Meydan okuma

Verilen dizenin geçerli bir Stack Cats programı olup olmadığını belirleyen bir program veya işlev yazın. Kodunuz ayrıca doğal bir ayna görüntüsü ortamı olmalıdır , yani:

  • Kodunuz kendisinin ayna görüntüsü olmalıdır.
    • Kodun tamamı doğal olarak görüntüleniyorsa, kendisinin ayna görüntüsü olduğu sürece kodunuzda bir veya daha fazla yeni satır olabilir.
    • Ekranı değiştirmediği için her satıra sondaki boşlukları atlayabilir veya ekleyebilirsiniz.
    • Sekme karakterlerine, ekranda bazı belirsizlikler bulunduğundan izin verilmez.

Not: kodunuzu yok değil geçerli bir Yığın Kediler programı olmak zorunda; Stack Cats'de izin verilmeyen bazı ekstra karakterler içerebilir. (Tam liste için aşağıya bakın.)

Örneğin, aşağıdaki iki program simetriktir (ve dolayısıyla geçerli bir sunum ), üçüncüsü değildir:

({bTd})
[<q|p>]
({bTd})
  IXI
({bTd})
IXI
  • "Ayna simetrisi" ile ilgili olarak, yalnızca Stack Cats tarzı simetri dikkate alınır (ör. ({IH}) ayna simetrisi olmasına rağmen geçerli bir sunum değildir).
  • Kodunuz yalnızca bu karakter kümelerini ve yeni satırı içerebilir:
    • Kendinden simetrik: boşluk ( 0x20) +!"'*+-.8:=AHIMOTUVWXY^_ovwx|
    • Simetrik çiftler: () /\ <> [] bd pq {}

SE'de kod olarak görüntülendiğinde karakter kümesi kesinlikle simetrik veya kendinden simetrik olarak seçilir.

Giriş ve çıkış

Giriş aralığı, yazdırılabilir ASCII karakterlerinin tek satırlık bir dizesidir .

Girişi dize, karakter listesi veya ASCII değerleri listesi olarak almayı seçebilirsiniz.

Çıktılardan birini seçebilirsiniz:

  • Seçtiğiniz dil tarafından tanımlanan doğruluk / tahrif değerlerinden herhangi biri
    • Gerçek sonuç değerleri girişler arasında farklılık gösterebilir (örneğin doğru bir girdi için çıkış 1 ve başka bir doğru olan için 2).
    • Doğruluk ve yanlış değerlerin değiştirilmesine izin verilmez.
  • Sırasıyla true / false için herhangi iki sabit değer
    • Bu durumda, sonuç değerleri tam olarak iki sabit değerden biri olmalıdır.

Gönderiminizde giriş yönteminizi ve çıkış değerlerinizi belirtmelisiniz.

Kazanma Koşulu

Bu , bu yüzden her dilde en düşük bayt kazanır.

notlar

  • Standart boşluklar her zamanki gibi yasaktır.
  • Tabii bunu Stack Cats'de çözebilirsiniz, ancak şans kod boyutunuzu yarıya indirmenize izin veren bir bayrak kullanamazsınız. Ve almak çok ciddi bir dil: P

1
Neden keskin #izin verilmiyor?
tsh

1
@tsh SE'deki kod yazı tipi de dahil olmak üzere birçok yazı tipinde biraz eğri (en azından Chrome'da gördüğüm şey).
Bubbler

@DLosc Çevresindeki bazı noktaları açıklığa kavuşturmaya çalıştım. Ancak, açıklamanın hala belirsiz olduğunu düşünüyorsanız, lütfen düzenlemekten çekinmeyin.
Bubbler

Yanıtlar:


16

JavaScript (ES6), 487 467 378 298 292 280 266 264 bayt

@Bubbler sayesinde 14 bayt kaydedildi

I=>(V=v=>!I[v]||((T=o=>[[]][+!!A[o]]||[(I[v]!=A[o]||A)[o^o<88/8]]+T(++o))(8-8)==I.pop())*V(++v))(V|(A='(){}[]<>\\/ !*+-:=ITX^_|'))//\\(('|_^XTI=:-+*! \//<>[]{}()'=A)|V)((v++)V*(()qoq.I==(8-8)((o++)T+[[8\88>o^o](A||[o]A=![v]I)]||[[o]A!!+][[]]<=o=T))||[v]I!<=v=V)<=I

Bir dizi karakter alan ve istenen çıktıyı döndüren anonim bir işlevi tanımlar. Çıktı doğrudur / sahtedir; genellikle 1/ 0, ancak boş dize verir true.

Nasıl?

En belirgin hile //\\kodun yansıtılmış versiyonunu yorumlamak için bir merkez nokta olarak kullanmaktır . Bundan sonra, sadece verilen karakter setini kullanarak sorunu çözmenin en kısa yolunu bulma oyunu haline gelir.

İlk karşılaştığımız sorun anahtar kelimelerin ve yerleşik yapıların eksikliğidir. Son anda mucizevi hala var .pop()içeren (ama gerisi izin operatörleri aracılığıyla yapılması gerekecektir a[b]vef(c) taklit döngüler için yineleme ile,).

İkinci konu mantıksal operatörlerin olmamasıdır. Hiçbiri &ve ?izin verilmiyor, yani kullanabileceğimiz tek karar verici operatör ||. Bu nedenle, bunu dikkate almak için mantığımızı dikkatlice yapılandırmamız gerekir.

İlk yaptığım şey, Tbireysel bir karakteri yansıtan bir fonksiyon tanımlamaktı . Temel fikir, her karakteri verilen karakterle eşitlik açısından test ederek aynalanabilir karakter dizisinde her karakter arasında döngü yapmaktır. O eşitse, biz onun ayna kömürü iade index^1için (){}[]<>\/ya da geri kalanı için karakter kendisi.

Burada karşılaştığım ilk sorun, her yinelemede yansıtılmış karakter veya sahte bir değer elde etmekti. Çözelti Sonunda oldu ile geldi (x!=A[o]||A)[o^o<88/8]nerede x, giriş karakteridir Ayansıtma alfabe olduğu ve ocari endeksidir. Eğer xaynı değilse A[o], bu verir trueve dizin ifadesi undefined; Aksi halde, ||Aaktif hale gelir ve sonunda elde ederiz A[o^(o<11)].

İkinci sorun, özyinelemenin nasıl sonlandırılacağıdır. Bunu yapmanın en iyi yolunun, her yinelemenin sonuçlarını birleştirmek, sonuna Aulaşıldığında boş dizeyi döndürmek olduğunu buldum . Bu bize iki sorun daha sunar: undefineds'yi boş dizelere dönüştürme ve boş dizeyi bir ||şey döndürme . Bunlar dizi kötüye kullanımı ile çözülebilir: [a]+""dizenin temsilini aveya atanımlanmamışsa boş dizeyi verir . Bir bonus olarak, []doğrudur, ancak boş dizgiye yayılır, bu yüzden bunu uygun bir şekilde "gerçeğe uygun boş dize" olarak kullanabiliriz.

Şimdi bu Tfonksiyonu herhangi bir karakteri yansıtmak için kullanabiliriz . Biz ayna karşılaştırarak, yinelemeli bunu I[v++]için I.pop()karakterlerin dizinin sonuna ulaşılıncaya kadar. Biz kullanamaz &&veya &karşılaştırmaların tüm truthy olup olmadığını kontrol etmek, ama çok kullanmak *yerine. Tüm bu sonuçların bir araya getirilmesi, 1her karakterin zıt olanın aynası olup 0olmadığı veya herhangi bir karşılaştırma başarısız olursa verilir.

Temel olarak bu cevap böyle çalışır. Muhtemelen çok açık bir şekilde açıklamamıştım, bu yüzden lütfen sorularınızı sorun ve yaptığım hataları belirtin.


U=([A,...H])=>!(V=H.pop())||!(W=([x,...X]=(T="!*+-:=ITX^_|")+"(){}[]<>\\/",[o,...O]=T+")(}{][></\\")=>!x||((o!=A)+(x!=V))*(W(X,O)))()*U(H)//...280 bayt
tsh

@tsh virgüllerine simetrik olmadıkları (SE kodu yazı tipinde) ve aynaları olmadığı için (ASCII'de zaten) kaynak kodunda izin verilmez
ETHproductions 26:18

üzgünüm, o kısmı kaçırdım.
tsh

@tsh İlk başta da kaçırdım ve bunun geçerli olamayacağını anlamak için bir çözüme 20 dakika geçirdim: P
ETHproductions 26:18

Her neyse, zaten bir JavaScript çözümü yayınlamış olduğunuzdan. Şimdi başka bir JSF * k çözümüne ihtiyacımız yok ... // Siz olsaydım, bunu sadece JSF * k'ye
derleyerek düzeltirdim

1

Stax , 76 70 bayt

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq*!-W:"|_^XTI=:-+*!\>])}"_=_HM^^xW:

Çalıştır ve hata ayıkla

Stax, Stack Cats'in arkadaşıdır ve ilk yarıdan Stack Cats programının sonraki yarısını oluşturmak için dahili özelliklere sahiptir. Kaynaktaki kısıtlamayı umursamıyorsak ve karakter setini kontrol etmemiz gerekmiyorsa, 4 baytlık bir çözüm aşağıdadır:

4 bayt

:R_=

Çalıştır ve hata ayıkla

açıklama

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq...
:W                                         "Mirror" the string
                                           Equivalent to appending the reverse of the string to itself
                                           And map `{([</\>])}` to its mirror in the appended string
  x^^                                      2, but we can't just use `2` here ...
     MH                                    Partition the "mirror"ed string to two parts, take the later part.
       _=                                  The string is the same as the original one (*)
                                           `:Wx^^MH_=` is just `:R_=`, but we can't use `R` here ...
         _                                 Input string
          "{([</!*+-:=ITX^_|":W-           Remove valid characters from input
                                !          The final string is empty (**)
                                 *         (*) and (**)
                                  p        Pop and print result
                                   q       Peek stack and print
                                           Since the stack is now empty, this causes the program to terminate
                                    ...    Not executed

Varlığı Rve Wgerçekten ilginç. pqKombinasyonla program sonlandırma da benim için etkileyici.
Bubbler

Teşekkür ederim. Talimatlar aslında iki bayttır: :Rve :W. Stax'ta bunu yapan herkese içsel olduğunu söyleyemediğimi hissediyorum.
Weijun Zhou
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.