Tôi là đối xứng, không palindromic!


22

Lý lịch

Lấy cảm hứng từ tôi là một palindrom. Bạn có phải? , trong đó người ta đã trình bày một sự thật gây sốc rằng, ()()không phải là một palindrom, mà là ())(, tôi đã tự hỏi mình thay vào đó là gì ()()và câu trả lời đơn giản là: đó là một chuỗi có trục đối xứng dọc!

Nhiệm vụ

Viết chương trình hoặc hàm lấy một chuỗi S (hoặc tương đương phù hợp trong ngôn ngữ của bạn) làm đầu vào, kiểm tra tính đối xứng dọc theo trục dọc và trả về giá trị trung thực hoặc sai lệch tương ứng. Bạn có thể sử dụng bất kỳ phương tiện hợp lý nào để lấy đầu vào và cung cấp đầu ra.

Đối xứng phản xạ

Đối xứng phản xạ xung quanh trục dọc (hoặc đối xứng trái phải) có nghĩa là nếu bạn đặt một gương theo chiều dọc ở trung tâm chính xác của chuỗi, hình ảnh phản chiếu của nửa đầu của chuỗi giống hệt với nửa sau của chuỗi.

Ví dụ, các chuỗi sau đây là đối xứng phản xạ xung quanh một trục dọc:

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

trong khi sau đây không phải là:

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

Thể lệ cuộc thi

• Chương trình hoặc chức năng của bạn sẽ chỉ nhận được các ký tự ASCII có thể in được. Bạn có thể bao gồm hoặc không bao gồm chuỗi trống, (tất nhiên là đối xứng!) Làm đầu vào hợp pháp, tốt hơn cho bạn.

• Các ký tự ASCII có thể được coi là đối xứng với trục dọc là như sau (lưu ý không gian ban đầu và sự khác biệt giữa chữ hoa và chữ thường):

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

Các ký tự ASCII có thể được coi là nhân đôi và nhân vật tương ứng của họ là:

()<>[]{}qpbd/\

Lưu ý rằng, kể từ khi họ được nhân đôi, bạn có thể có cả hai ()cũng như )(, /\\/vv

Tất cả các ký tự có thể in ASCII khác phải được coi là không đối xứng và không có ký tự tương ứng được nhân đôi.

• Đây là một thử thách : chương trình của bạn càng ngắn, được đo bằng byte, càng tốt, trong bất kỳ ngôn ngữ lập trình nào.

• Kudos cho những người sẽ tạo ra một chương trình đối xứng!

Lưu ý : câu hỏi này không phải là một bản sao của "Tiện ích Palindrom , tiện lợi , cần phải kiểm tra các chuỗi palindromic trong đó dấu ngoặc đơn được lật. Câu hỏi này khác nhau vì hai lý do:

1) đó là một hạn chế của câu hỏi khác đối với những gì liên quan đến các ký tự không phải dấu ngoặc đơn, vì chỉ các ký tự đối xứng có thể xuất hiện theo thứ tự ngược lại.

2) Kể từ khi nó được dựa trên khái niệm về đối xứng, và không phải trên một khái niệm về “palindrome thuận tiện”, nhân vật được nhân đôi có thể xuất hiện trong cả hai trình tự, ví dụ []][, và điều này làm cho chương trình để giải quyết nó khác biệt so với các chương trình giải quyết vấn đề khác .


6
Chỉ cần bất cứ ai tự hỏi, Char than không phản ánh các chữ cái. :(
hoàn toàn là

4
Tôi không đồng ý với tính hai mặt, vì mục tiêu dupe không phản ánh các chữ cái và điều này cũng vậy.
Stephen

Xin lỗi, tôi đã bỏ lỡ các ví dụ, lỗi của tôi
jrtapsell

6
Tại sao không 8được coi là "đối xứng"?
Scott Milner

2
@FunkyComputerMan Về cơ bản nó không giống với mục tiêu dupe . Đầu tiên và quan trọng nhất là không có hạn chế mã nguồn.
Jonathan Allan

Câu trả lời:


7

JavaScript (ES6), 130 125 113 byte

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>

Chỉnh sửa: Đã lưu 5 byte nhờ @Arnauld. Đã lưu thêm 11 byte nhờ @YairRand.


Bạn có thể sử dụng một biểu thức chính quy thay vì includes()? Chẳng hạn như /[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c).
Arnauld

@Arnauld Thật vậy, phạm vi đó rất hữu ích, cảm ơn!
Neil

Bạn có thể chơi gôn [...s].reverse().map(...): s::[].map().reverse()nếu bạn ổn với việc sử dụng các tính năng ES-next mới. liên kết
Hạ cấp

@Downgoat Bạn có liên kết đến thông số kỹ thuật của tính năng đó không?
Neil

1
@Neil ở đây
Downgoat

5

Thạch , 69 62 byte

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

Hãy thử trực tuyến!

Tất cả các trường hợp thử nghiệm

-7 byte nhờ @Jonathan ALLan

Làm thế nào nó hoạt động

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

Lưu sáu byte bằng bộ lọc: ¢FiЀ;1Ạðaµ¢yU⁼->¢Ff@ð¢yU⁼
Jonathan Allan

Lưu cái khác bằng cách sử dụng thanh ghi (tất cả trên một dòng ngay bây giờ):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan

(... mặc dù ở cùng độ dài ...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼được cho là đẹp hơn)
Jonathan Allan

Tìm thấy một byte khác tiết kiệm bằng cách chỉ mã hóa cho một trong mỗi cặp thứ tự liền kề từ bộ đối xứng (chỉnh sửa nhận xét đã xóa với mã tốt hơn)
Jonathan Allan

4

Python 3, 211 208 195 byte

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

Lưu được 13 byte nhờ Jonathan Allan.


1
Lưu 9 byte : 1. thứ tự đảo ngược của dấu gạch chéo để không cần thoát; 2. sử dụng 2*xrange(7); 3. sử dụng phép nhân để tránh >2kiểm tra; 4. Sử dụng Bitwise không phải trên len(S)để tránh sự notcủa not len(S)%2; 5. sử dụng thực tế đó ''in'blah'Truecho phép nhân chuỗi ~len(S)%2*s[len(S)//2]in s.
Jonathan Allan


2

SOGL V0.12 , 88 byte

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

Hãy thử nó ở đây!

~ 24 byte để thêm qpbdphản chiếu và 6 byte cho (x-1 XOR 1) + 1: /


2

Kotlin 1.1, 201 199 byte

{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()}

Làm đẹp

{
    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()
}

Kiểm tra

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

Không thể chạy trên TIO vì 1.1 không được hỗ trợ


Bạn có thể làm cho nó hoạt động trên 1.0 bằng cách nhập HashMap Hãy thử trực tuyến!
CAD97

Điểm số của tôi sẽ có hoặc không có nhập khẩu?
jrtapsell

vì quá trình nhập chỉ là một shim để làm cho nó hoạt động trên 1.0, trong đó nó hoạt động trên 1.1, miễn là câu trả lời chỉ định 1.1 bạn sẽ được ghi mà không cần nhập. Tuy nhiên, tôi muốn ghi chú lại, chỉ trong trường hợp ai đó không biết HashMap được nhập tự động trong 1.1 một cách hiệu quả.
CAD97

2

Python 2 , 182 167 163 162 160 158 byte

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"

Hãy thử trực tuyến!

Đã lưu 2 byte nhờ Jonathan Allan

Giải thích Trước tiên, chúng ta cần xây dựng danh sách tất cả các ký tự không có đối xứng (chính char : A, ... hoặc char khác (cho ), ...):

  • m("","") trả về một chuỗi với tất cả các ký tự có sẵn.

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) loại bỏ khỏi tất cả các ký tự có sẵn các ký tự có đối xứng.

Sau đó, chúng tôi ánh xạ mọi char thành char đối xứng của nó và loại bỏ các ký tự không có đối xứng với s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

Nếu kết quả bằng với chuỗi đảo ngược, chúng ta có một chuỗi đối xứng.


Nếu bạn di chuyển dấu gạch chéo từ đầu bên phải twbạn có thể từ bỏ lối thoát, ví dụ w="(<]{\pb". Lưu một byte khác với from string import*;m=maketrans(Cá nhân tôi đi tìm một dòng mới khi ;mặc dù không lưu byte). Ngoài ra, bạn không cần đặt tên hàm miễn là nó có thể tái sử dụng và không đệ quy, điều này sẽ giúp tiết kiệm thêm 2.
Jonathan Allan

Ngoài ra, bạn không cần đặt tên hàm miễn là nó có thể tái sử dụng và không đệ quy, điều này giúp tiết kiệm 2 TIO khác (lưu ý: mã bạn đã liệt kê và tại liên kết của bạn là 162 byte)
Jonathan Allan

@Jonathan Allan cảm ơn. Tôi đã loại bỏ (về mặt tinh thần) hai byte cho f=, nhưng phiên bản của bạn sạch hơn.
jferard


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.