私は対称的で、回文ではありません!


22

バックグラウンド

私はパリンドロームに触発されましたあなたは?、「回文ではないが」という衝撃的な事実が提示されて()()いるので、())(代わりに何であるかを自問()()しました。答えは単純です。それは垂直対称軸を持つストリングです!

タスク

文字列S(または言語の適切な同等物)を入力として受け取り、垂直軸に沿った対称性をチェックし、それに応じて真実または偽の値を返すプログラムまたは関数を作成します。妥当な手段を使用して、入力を取得し、出力を提供できます。

反射対称性

垂直軸の周りの反射対称(または左右対称)は、ストリングの正確な中心にミラーを垂直に配置すると、ストリングの前半の反射イメージがストリングの後半と同一になることを意味します。

たとえば、次の文字列は垂直軸を中心に反射対称です。

()()
()()()
[A + A]
WOW ! WOW
OH-AH_wx'xw_HA-HO
(<<[[[T*T]]]>>)
(:)
)-(
())(()
qpqp

以下はそうではありません:

())(
((B))
11
+-*+-
WOW ! wow
(;)
qppq

コンテストのルール

•プログラムまたは関数は、印刷可能なASCII文字のみを受け取ります。空の文字列(もちろん対称です!)を合法的な入力として含めることも、含めないこともできます。

•垂直軸に関して対称とみなせるASCII文字は次のとおりです(最初のスペース、および大文字と小文字の違いに注意してください)。

 !"'+*-.:=AHIMOTUVWXY^_ovwx|

「ミラーリングされた」と見なされるASCII文字とそれに対応する文字は次のとおりです。

()<>[]{}qpbd/\

彼らがミラーリングされているので、あなたは両方を持つことができ、なお()だけでなく、として)(/\および\/など、

他のすべてのASCII印刷可能文字は、非対称であり、対応するミラー化された文字がないと見なす必要があります。

•これは、課題です。バイト単位で測定したプログラムが短いほど、どのプログラミング言語でも優れています。

•対称的なプログラムを作成する人々に称賛を!

:この質問は、「Convenient Palindrome」の複製ではなく、括弧が反転している回文の文字列を確認する必要があります。この質問は2つの理由で異なります。

1)括弧以外の文字に関係するものについては、対称文字のみが逆順で表示されるため、他の質問の制限です。

2)「便利な回文」の概念ではなく、対称性の概念に基づいているため、鏡像化されたキャラクターは両方の順序、すなわち[]][で現れることがあり、これにより、それを解決するプログラムは他の問題を解決するプログラムとは異なります。


6
疑問に思う人のためだけに、木炭は文字を反映していません。:(
完全に人間の

4
だまされたターゲットは文字を反映しておらず、これが反映されているので、私はだまされに反対します。
スティーブン

申し訳ありませんが、私は、私のミスの例を逃した
jrtapsell

6
なぜ8「対称」と見なされないのですか?
スコットミルナー

2
@FunkyComputerManそれは、本質的にだまされたターゲットとまったく同じではありません。何よりもまず、これにはソースコードの制限はありません。
ジョナサンアラン

回答:


7

JavaScriptの(ES6)、130の 125 113バイト

f=
s=>s==[...s].reverse(s=`()<>[]{}qpbd/\\`).map(c=>s[s.indexOf(c)^1]||/[- !"'+*.:=AHIMOT-Y^_ovwx|]/.exec(c)).join``
<input oninput=o.textContent=f(this.value)><pre id=o>

編集:@Arnauldのおかげで5バイト保存されました。@YairRandのおかげで、さらに11バイト節約できました。


代わりに正規表現を使用できますincludes()か?など/[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c)
アーナウド

@Arnauld確かに、その範囲は非常に役立ちます、ありがとう!
ニール

ゴルフ[...s].reverse().map(...)することができs::[].map().reverse()ます:新しいES-next機能の使用に問題がない場合。リンク
Downgoat

@Downgoatその機能の仕様へのリンクはありますか?
ニール

1
@ニールはこちら
Downgoat

5

ゼリー69 62バイト

“(<[{qb/“ !"'+*-.:=AHIMOTUVWXY^_ovwx|“)>]}pd\”,Ṛ$F©f@ð®œs2¤yU⁼

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

すべてのテストケース

@JonathanAllanのおかげで-7バイト

使い方

“(<[{qb/“ !"'+*-.:=AHIMOTUVWXY^_ovwx|“)>]}pd\”,Ṛ$F©f@ð®œs2¤yU⁼  main link

“(<[{qb/“ !"'+*-.:=AHIMOTUVWXY^_ovwx|“)>]}pd\”  The literal list of strings  ['(<[{qb/', ' !"\'+*-.:=AHIMOTUVWXY^_ovwx|', ')>]}pd\\']
               $                 Last two links (if not part of an LCC) as a monad 
            Ṛ                    Reverse array Does not vectorize.
           ,                     Pair; return [x, y].
                 ©               Copy link result to register (® atom to retrieve). 
              F                  Flatten list.
                  f              Filter; remove the elements from x that are not in y.
                   @             Swaps operands. 

                    ð            Start a new dyadic chain
                         ¤       Nilad followed by links as a nilad. 
                      2          The literal integer 2
                   ®             Restore; retrieve the value of the register. Initially 0.
                    œs           Split x into y chunks of similar lengths.
                          y      Translate the elements of y according to the mapping in x.
                           U     Upend; reverse an array.
                            ⁼    Equals. Does not vectorize.

フィルターを使用して6バイトを保存します¢FiЀ;1Ạðaµ¢yU⁼¢Ff@ð¢yU⁼
ジョナサンアラン

レジスタを使用して別のファイルを保存します(すべて1行になりました):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
ジョナサンアラン

(...同じ長さであること...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼は間違いなくより良い)
ジョナサンアラン

対称セットの隣接する序数の各ペアの1つのみをエンコードすることにより、別の1バイトの保存が見つかりました(削除されたコメントの編集とコードの改善)
ジョナサンアラン

4

Python 3、211 208 195バイト

lambda S,p="()<>[]{}qpbd\/",s=" !\"'+*-.:=AHIMOTUVWXY^_ovwx|":(S==S.translate({ord(s[2*x]):s[2*x+1]for s in(p,p[::-1])for x in range(7)})[::-1])*(~len(S)%2*s[len(S)//2]in s)*(not set(S)-set(p+s))

Jonathan Allanのおかげで13バイト節約されました。


1
9バイトを節約します。1.スラッシュの順序を逆にして、エスケープする必要がないようにします。2. 2*xおよびを使用しrange(7)ます。3.乗算を使用して>2テストを回避します。4.ビット単位ではなくlen(S)not of を回避するために、not len(S)%2ます。5.実際に使用''in'blah'されるTrue文字列の乗算を許可するようにします~len(S)%2*s[len(S)//2]in s
ジョナサンアラン

1
インライン化すべてをさらに4つ保存
ジョナサンアラン


2

Kotlin 1.1、201の 199バイト

{var R="(<[{qb/\\dp}]>)"
var m=HashMap<Any,Any>()
"\"!'+*-.:=AHIMOTUVWXY^_ovwx| ".map{m[it]=it}
R.indices.map{m[R[it]]=R[R.length-(it+1)]}
it.zip(it.reversed()).filter{m[it.first]!=it.second}.none()}

美化

{
    var R = "(<[{qb/\\dp}]>)"
    var m = HashMap<Any, Any>()
    "\"!'+*-.:=AHIMOTUVWXY^_ovwx| ".map { m[it] = it }
    R.indices.map { m[R[it]] = R[R.length - (it + 1)] }
    it.zip(it.reversed()).filter { m[it.first] != it.second }.none()
}

テスト

var i:(String)->Boolean =
{var R="(<[{qb/\\dp}]>)"
var m=HashMap<Any,Any>()
"\"!'+*-.:=AHIMOTUVWXY^_ovwx| ".map{m[it]=it}
R.indices.map{m[R[it]]=R[R.length-(it+1)]}
it.zip(it.reversed()).filter{m[it.first]!=it.second}.none()}
fun main(args: Array<String>) {
    var GOOD = listOf("()()",
            "()()()",
            "[A + A]",
            "WOW ! WOW",
            "OH-AH_wx'xw_HA-HO",
            "(<<[[[T*T]]]>>)",
            "(:)",
            ")-(",
            "())(()",
            "qpqp")

    var BAD = listOf("())(",
            "((B))",
            "11",
            "+-*+-",
            "WOW ! wow",
            "(;)",
            "qppq")

    GOOD.filterNot { i(it) }.forEach { throw AssertionError(it) }
    BAD.filter { i(it) }.forEach { throw AssertionError(it) }
    println("Test Passed")
}

1.1がサポートされていないため、TIOで実行できません


HashMapをインポートするだけで1.0で動作するようになります。オンラインで試してみてください!
CAD97

インポートの有無にかかわらず、私のスコアはありますか?
jrtapsell

インポートが1.0で動作するためのシムであるため、1.1でそのまま動作する場合、答えが1.1である限り、インポートなしでスコアリングされます。ただし、HashMapが1.1に(効果的に)自動的にインポートされることを知らない場合に備えて、メモを入れておきます。
CAD97

2

パイソン2182の 167 163 162 160 158バイト

lambda s:s[::-1]==s.translate(m(t+w,w+t),m("","").translate(None," !\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w))
from string import*
m=maketrans
t=")>[{/qd"
w="(<]}\pb"

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

ジョナサンアランのおかげで2バイト節約

説明 まず、我々は対称(:文字自体持たないすべての文字のリストを構築する必要がありA、...または別の文字(のために)、...):

  • m("","") 使用可能なすべての文字を含む文字列を返します。

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) 使用可能なすべての文字から対称の文字を削除します。

次に、すべてのcharをその対称charにマッピングし、対称を持たないcharを削除します s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

結果が逆の文字列と等しい場合、対称文字列があります。


あなたはの右端からスラッシュを移動した場合tw、あなたは例えば、脱出を見送ることができますw="(<]{\pb"。別のバイトを保存します(ただし、バイトが保存されないfrom string import*;m=maketrans場合は個人的に改行に行きます;)。また、あなたはそれが別の2.保存する、再利用可能と再帰的ではない限り、機能の名前を指定する必要はありません
ジョナサン・アラン

また、あなたはそれを再利用可能と別の2節約する、再帰的ではない限り、機能の名前を指定する必要はありませんTIO(注:あなたのリンクであなたが列挙されているコードとは162バイト)
ジョナサン・アラン

@JonathanAllanありがとう。私はすでに(精神的に)2バイトを削除していましたf=が、あなたのバージョンはきれいです。
jferard


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