これがStack Catsスタイルの有効なStack Catsプログラムかどうかを確認してください!


16

バックグラウンド

Stack Catsは、Martin Enderによって作成された可逆の難解な言語です。Stack Catsの各コマンドは、それ自体の逆(のような対称文字として表される-_:T|)であるか、その逆のコマンド(のような鏡像として表される() {} [] <>)のいずれかです。Stack Catsには、プログラム全体がそれ自体の鏡像であるべきという強力な構文要件があります。これは、有効なStack Catsプログラムが自然な鏡像アンビグラムであることを意味することに注意してください。

Stack Catsのコマンドセット全体を次に示します。

  • 自己対称: !*+-:=ITX^_|
  • 対称ペア: () {} [] <> \/

その他の文字は無効です。上記の文字セットにない文字を持つ入力はfalseを出力する必要があります。

言語には追加の制約が()あり、{}ペアは常にバランスをとる必要がありますが、簡単にするために、この状態をチェックする必要はありません。

以下は、有効なStack Catsプログラムのです(再び、バランスの取れたかっこをチェックしないことに注意してください)。

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

これらは次のとおりではありません。

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

チャレンジ

指定された文字列が有効なStack Catsプログラムであるかどうかを判断するプログラムまたは関数を作成します。また、コードは自然な鏡像アンビグラムである必要があります

  • コードはそれ自体の鏡像でなければなりません。
    • 自然に表示されるコード全体がそれ自体の鏡像である限り、コードには1つ以上の改行を含めることができます。
    • 表示が変更されないため、各行の末尾の空白を省略または追加できます。
    • タブ文字は表示にあいまいさがあるため、許可されていません。

注:コードは有効なStack Catsプログラムである必要はありませ。Stack Catsで許可されていない特定の余分な文字が含まれている場合があります。(完全なリストについては以下を参照してください。)

たとえば、次の2つのプログラムは対称的であり(したがって有効な送信)、3番目のプログラムはそうではありません。

({bTd})
[<q|p>]
({bTd})
  IXI
({bTd})
IXI
  • 「ミラー対称性」に関しては、Stack Catsスタイルの対称性のみが考慮されます(たとえば({IH})、ミラー対称性があるにもかかわらず、有効な提出ではありません)。
  • コードには、次の文字セットと改行のみを含めることができます。
    • 自己対称:スペース(0x20)+!"'*+-.8:=AHIMOTUVWXY^_ovwx|
    • 対称ペア: () /\ <> [] bd pq {}

SEでコードとして表示される場合、文字セットは厳密に対称または自己対称になるように選択されます。

入出力

入力範囲は、印刷可能なASCII文字の1行の文字列です

入力を文字列、文字のリスト、またはASCII値のリストとして選択できます。

次のいずれかを出力することを選択できます。

  • 選択した言語で定義された真実/偽の値
    • 実際の結果値は、入力間で異なる場合があります(たとえば、真の入力の場合は出力1、別の真の場合は2です)。
    • 真実と偽の値を交換することは許可されていません。
  • それぞれtrue / falseの2つの定数値
    • この場合、結果の値は2つの定数値のいずれかでなければなりません。

提出には入力方法と出力値を指定する必要があります。

勝利条件

これはであるため、各言語の最下位バイトが優先されます。

ノート

  • 通常の標準的な抜け穴は禁止されています。
  • もちろん、これをStack Catsで解決できますが、チャンスは、コードサイズを半分に削減できるフラグを使用できないことです。そして、それを拾うのは非常に難しい言語です:P

1
シャープが#許可されない理由
tsh

1
@tsh SEのコードフォントを含め、多くのフォントでわずかに偏っています(少なくとも、Chromeで見られるものです)。
バブラー

@DLosc周辺のいくつかのポイントを明確にしようとしました。ただし、説明がまだ不明な場合は、お気軽に編集してください。
バブラー

回答:


16

JavaScript(ES6)、487 467 378 298 292 280 266 264バイト

@Bubblerのおかげで14バイト節約

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

文字の配列を受け取り、必要な出力を返す匿名関数を定義します。出力は真実/虚偽です。通常は1/ 0が、空の文字列を与えますtrue

どうやって?

最も明白なトリックは//\\、ミラーリングされたバージョンのコードをコメントアウトするための中心点として使用することです。その後、与えられた文字セットのみを使用して問題を解決する最短の方法を見つけるゲームになります。

私たちが最初に遭遇する問題は、キーワードと組み込みの欠如です。奇跡的にまだありますが.pop()、ループをエミュレートする再帰を使用して、許可された演算子(a[b]およびを含むf(c))を介して他のすべてを実行する必要があります。

2番目の問題は、論理演算子の欠如です。どちら&?を意味し、許可されているだけで私たちが使用できる意思決定のオペレータがあります||。したがって、これを考慮してロジックを慎重に構成する必要があります。

私が最初にしたことはT、個々のキャラクターを反映する関数を定義することでした。基本的な考え方は、ミラーリング可能な文字の文字列内の各文字をループ処理し、各文字が指定された文字と等しいかどうかをテストすることです。等しい場合、そのミラー(index^1for (){}[]<>\/のchar、または残りのchar自体)を返します。

ここで最初に遭遇した問題は、各反復でミラー化されたcharまたは偽の値を取得することでした。最終的に私が思いついた解決策はでした(x!=A[o]||A)[o^o<88/8]。ここでxは、入力文字、Aミラーリングアルファベット、およびo現在のインデックスです。xがと同じでない場合A[o]、これによりが得られtrue、インデックス式は次のように評価されundefinedます。そうでない場合、||Aはアクティブになり、を取得することになりA[o^(o<11)]ます。

2番目の問題は、再帰を終了する方法です。これを行う最善の方法は、すべての反復の結果を単純に連結し、最後にA到達したときに空の文字列を返すことであることがわかりました。これにより、さらに2つの問題が生じます。s undefinedを空の文字列に変換することと、空の文字列を返す||ことです。これらは配列の乱用で解決できます:[a]+""の文字列表現a、またはa未定義の場合は空の文字列を提供します。ボーナスとして、[]真実ですが、空の文字列に文字列化されるため、これを「真の空の文字列」として便利に使用できます。

これで、このT関数を使用して任意の1文字をミラーリングできます。これを再帰的に行い、charの配列の最後に到達I[v++]するI.pop()までto のミラーを比較します。すべての比較が真実かどう&&&を確認したり、使用したりすることはできませんが、*代わりに使用してください。これらの結果をすべて乗算すると1、すべての文字が反対側の文字のミラーである0か、比較が失敗したかがわかります。

それが基本的にこの答えの仕組みです。私はおそらくそれをあまり明確に説明しなかったので、あなたが持っているかもしれない質問をして、私が犯した間違いを指摘してください。


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バイト
-tsh

@tsh コンマはソースコードでは許可されません。それらは対称ではなく(SEコードフォントで)、ミラーを持たない(とにかくASCIIで)
ETHproductions

すみません、私はその部分を逃しました。
tsh

@tsh私も最初はそれを見逃していましたが、それが有効ではないことを理解するためだけに20分間ソリューションに費やしました:P
ETHproductions

とにかく、すでにJavaScriptソリューションを投稿していたので。もう別のJSF * kソリューションは必要ありません... //もし私があなたなら、JSF * kにコンパイルするだけでこれを修正します
...-tsh

1

スタックス76 70バイト

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

実行してデバッグする

StaxはStack Catsの友人であり、前半からStack Catsプログラムの後半を生成する内部機能を備えています。ソースの制限を気にせず、文字セットを確認する必要がない場合は、4バイトのソリューションがあります。

4バイト

:R_=

実行してデバッグする

説明

: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

存在RとはW本当に面白いです。pq組み合わせによるプログラムの終了も印象的です。
バブラー

ありがとうございました。命令は実際には2バイトです::Rおよび:W。これを行うStaxの内部構造があることを皆に伝えるのは仕方がないと思います。
ウェイジュン周
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.