나는 회문이 아닌 대칭입니다!


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 인쇄 가능 문자는 비대칭으로 간주되고 해당 문자가 미러링되지 않아야합니다.

• 이것은 문제입니다. 프로그램이 짧을수록 바이트 단위로 측정할수록 모든 프로그래밍 언어에서 더 좋습니다.

• 대칭 프로그램을 제작할 사람들에게 인기!

참고 :이 질문은 "편리한 회문" 과 중복되지 않으며 괄호가 뒤집힌 회문 문자열을 확인해야합니다.이 질문은 다음 두 가지 이유로 다릅니다.

1) 대칭 문자 만 역순으로 나타날 수 있으므로 괄호가 아닌 문자와 관련하여 다른 질문을 제한합니다.

2)“편의 회문”개념이 아닌 대칭 개념에 기초하기 때문에 거울 문자는 순서 와 같이 순서대로 나타날 수 []있으며 ][, 이로 인해 다른 문제를 해결하는 프로그램과는 다른 방식으로 문제를 해결할 수 있습니다. .


6
궁금해하는 사람을 위해 Charcoal은 글자를 반영하지 않습니다. :(
완전히 인간적인

4
나는 속임수 목표가 글자를 반영하지 않기 때문에 속임수에 동의하지 않습니다.
Stephen

죄송합니다, 나는 실수를 저지른 사례를 놓쳤다
jrtapsell

6
8"대칭"으로 간주 되지 않습니까?
Scott Milner

2
@FunkyComputerMan 듀프 대상 과 본질적으로 같지는 않습니다 . 우선 소스 코드 제한이 없습니다.
Jonathan Allan

답변:


7

자바 스크립트 (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

@Arnauld 실제로, 그 범위는 매우 도움이됩니다. 감사합니다!

새로운 ES-next 기능을 사용해도 괜찮다면 골프 [...s].reverse().map(...)를 하실 수 s::[].map().reverse()있습니다. 링크
Downgoat

@Downgoat 해당 기능의 사양에 대한 링크가 있습니까?
Neil

1
@Neil 여기
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⁼
Jonathan Allan

레지스터를 사용하여 다른 것을 저장하십시오 (모두 한 줄에) :...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan

(... 동일한 길이 ...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼는 틀림없이 더 좋을 지라도 )
Jonathan Allan

대칭 세트에서 인접한 서수 쌍 중 하나에 대해서만 인코딩하여 다른 1 바이트 저장 을 찾았습니다 (더 나은 코드로 삭제 된 주석 편집)
Jonathan Allan

4

파이썬 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*xrange(7); 3. 곱셈을 사용하여 >2테스트 를 피하십시오 . 4. 사용은에없는 비트 단위 len(S)피하기 위해 not의를 not len(S)%2; 5. 사실 사용 ''in'blah'이다 True문자열 곱셈을 허용하기를 ~len(S)%2*s[len(S)//2]in s.
Jonathan Allan



2

코 틀린 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에서 작동하도록 shim 일 뿐이므로 1.1에서 그대로 작동하므로 답변이 1.1을 지정하면 가져 오기없이 점수를 얻습니다. 나는 누군가 HashMap이 1.1로 (효과적으로) 자동으로 수입되는지 알지 못하는 경우를 대비하여 메모를 작성했습니다.
CAD97

2

파이썬 (2) , 182 (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"

온라인으로 사용해보십시오!

Jonathan Allan 덕분에 2 바이트 절약

설명 첫째, 우리는 대칭 (: 숯불 자체가없는 모든 문자의 목록을 구축 할 필요가 A... 또는 다른 문자 (를 들어 ), ...)

  • m("","") 사용 가능한 모든 문자가 포함 된 문자열을 반환합니다.

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) 사용 가능한 모든 문자에서 대칭이있는 문자를 제거합니다.

그런 다음 모든 문자를 대칭 문자에 매핑하고 대칭이없는 문자를 제거합니다. s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

결과가 반전 된 문자열과 같으면 대칭 문자열이 있습니다.


당신의 오른쪽 끝에서 슬래시를 이동하는 경우 t그리고 w당신은, 예를 탈출을 포기 수 있습니다 w="(<]{\pb". 다른 바이트를 저장하십시오 from string import*;m=maketrans( 바이트를 저장 ;하지 않으면 개인적으로 줄 바꿈을 사용합니다 ). 또한 재사용 가능하고 재귀 적이 지 않는 한 함수의 이름을 지정할 필요가 없으므로 2를 더 절약 할 수 있습니다.
Jonathan Allan

또한 재사용 가능하고 재귀 적이 지 않는 한 함수의 이름을 지정할 필요가 없으므로 다른 2 개의 TIO 가 저장됩니다 (참고 : 나열된 코드와 링크에있는 코드는 162 바이트 임)
Jonathan Allan

@JonathanAllan 감사합니다. 에 대한 2 바이트를 이미 (정적으로) 제거 f=했지만 버전이 더 깨끗합니다.
jferard


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.