我是对称的,不是回文!


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
对于任何想知道的人,木炭都不能反映字母。:(
–totalhuman 2002年

4
我不同意欺诈行为,因为受骗对象不能反映字母,而确实可以反映字母。
斯蒂芬

抱歉,我错过了示例,我的错误
jrtapsell

6
为什么不8被认为是“对称的”?
Scott Milner

2
@FunkyComputerMan从根本上说,它与受骗对象完全不同。首先,这没有源代码限制。
乔纳森·艾伦

Answers:


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个字节。


您可以使用regexp代替includes()吗?如/[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c)
Arnauld

@Arnauld确实,该范围非常有帮助,谢谢!
尼尔于2009年

您可以[...s].reverse().map(...)选择:s::[].map().reverse()如果可以,请使用新的ES-next功能。链接
Downgoat

@Downgoat您是否具有该功能规格的链接?
尼尔

1
@Neil here
Downgoat

5

果冻69 62字节

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

在线尝试!

所有测试用例

-7个字节,感谢@JonathanAllan

怎么运行的

“(<[{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.

使用过滤器保存六个字节:¢FiЀ;1Ạðaµ¢yU⁼->¢Ff@ð¢yU⁼
Jonathan Allan

使用寄存器保存另一个(现在全部在线上):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan

(...虽然长度一样长...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼,但可以说更好)
Jonathan Allan

通过仅对对称集中的每对相邻序号中的一个进行编码(用更好的代码编辑删除的注释)发现了另一个保存字节
Jonathan Allan

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))

由于乔纳森·艾伦节省了13个字节。


1
节省9个字节:1.反斜杠顺序,因此无需转义;2.使用2*xrange(7); 3.使用乘法避免>2测试;4.使用逐位不上len(S),以避免notnot len(S)%2; 5.使用的事实,''in'blah'True允许的字符串倍增~len(S)%2*s[len(S)//2]in s
乔纳森·艾伦

1
保存4个内联的所有内容
乔纳森·艾伦,

2

SOGL V0.12,88 个字节

"el²┘N!←8mYdDm⁵╔C⅛┌6▼ģη⁷fņ‘;W‽0←}C
l»{Kα}lalh=‽;KCø;{:↔³↔=?"qpbd”⁴²+:GW:2%«H+W}:h=?:CΚ}=

在这里尝试!

〜24个字节可添加qpbd镜像,6个字节可用于(x-1 XOR 1) + 1:/


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 使其
CAD97

我的分数是带或不带进口?
jrtapsell

由于导入只是使它在1.0上运行的一种填充方式,因此只能在1.1上运行,只要答案指定了1.1,就无需导入即可获得评分。不过,我会做个说明,以防万一有人不知道HashMap是(有效地)在1.1中自动导入的。
CAD97

2

Python 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"

在线尝试!

由于乔纳森·艾伦节省了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>)

如果结果等于反向字符串,则我们有一个对称字符串。


如果从右端移动斜线tw你可以放弃逃生,例如w="(<]{\pb"。使用保存另一个字节from string import*;m=maketrans(但是,;如果不保存字节,我个人会换行)。你也不必这么长时间来命名的功能,因为它是可重复使用的,而不是递归,从而节省了另一个2
乔纳森·艾伦

另外,只要函数是可重用的且不是递归的,就无需命名该函数,这样可以节省另外2个TIO(请注意:您列出的链接处的代码为162字节)
Jonathan Allan

@JonathanAllan谢谢。我已经删除了(临时)的两个字节f=,但是您的版本更干净了。
jferard

1

Perl 5,102 +1(-p)= 103字节

$_=!/[^ !"'+*.:=AHIMOT-Y^_ovwx|()<>[\]{}qpbd\/\\-]/&&$_ eq reverse y|()<>[]{}qpbd/\\|)(><][}{pqdb\\/|r

在线尝试!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.