Simetrikim, palindromik değil!


22

Arka fon

Bir palindromdan ilham aldım. Sen? “ Palindrom değil, ama ” diye şok edici bir gerçeğin sunulduğu yerde kendime ne olduğunu ve cevabın basit olduğunu sordum : dikey simetri eksenli bir dize!()()())(()()

Görev

Girdi olarak S dizesini (veya kendi dilinizde uygun eşdeğeri) alan, dikey eksen boyunca simetriyi kontrol eden ve buna göre bir truthy veya falsy değeri döndüren bir program veya işlev yazın . Girdiyi almak ve çıktıyı sağlamak için herhangi bir makul yolu kullanabilirsiniz .

Yansıma simetrisi

Dikey bir eksen etrafındaki yansıma simetrisi (veya sol-sağ simetri), dize tam ortasına dikey olarak bir ayna koyarsanız, dizenin ilk yarısının yansıtılan görüntüsünün dizenin ikinci yarısına aynı olduğu anlamına gelir.

Örneğin, aşağıdaki dizeler dikey bir eksen etrafında yansıma simetriktir:

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

aşağıdakiler olmasa da:

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

Yarışma Kuralları

• Programınız veya işleviniz yalnızca yazdırılabilir ASCII karakterleri alacaktır. Boş dizgiyi (tabii ki simetrik olan tabii ki!) Yasal girdi olarak dahil edebilir veya eklemeyebilirsiniz, bu sizin için daha iyidir.

• Düşey eksenlere göre simetrik olarak kabul edilebilecek ASCII karakterleri aşağıdaki gibidir (ilk boşluğu ve büyük ve küçük harfler arasındaki farkı not edin):

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

“Yansıtılmış” sayılabilecek ASCII karakterleri ve bunlara karşılık gelen karakterler:

()<>[]{}qpbd/\

Onlar yansıtılmış olduğundan, her ikisine de sahip olabilir, unutmayın ()sıra sıra )(, /\ve \/vb

Diğer tüm ASCII yazdırılabilir karakterleri asimetrik olarak ve yansıtılmış karşılık gelen bir karakter olmadan düşünülmelidir.

• Bu bir mücadelesidir: programınız ne kadar kısa olursa, herhangi bir programlama dilinde bayt olarak ölçülür.

• Simetrik bir program üretecek insanlara Kudos!

Not : Bu soru parantezlerin ters çevrildiği palindromik dizgilerin kontrol edilmesini gerektiren “Uygun Palindrom” un bir kopyası değildir , bu soru iki nedenden dolayı farklıdır:

1) Parantez olmayan karakterleri ilgilendiren hususlar için diğer sorunun bir kısıtlamasıdır, çünkü sadece simetrik karakterler ters sırada görünebilir.

2) simetri kavramına dayalı değil, “uygun bir palindrom” bir kavram üzerine olduğundan, aynalı karakterler, hem sırayla ie görünebilir []ve ][ve bu diğer sorunu çözmek programlardan farklı çözmek için programı yapar .


6
Merak eden herkes için Kömür harfleri yansıtmaz. :(
totallyhuman 09:17

4
Düped hedefinin harfleri yansıtmadığı ve bu durumun yansıtmadığı için, aldatmacaya katılmıyorum.
Stephen

Üzgünüm, örnekleri kaçırdım, hatam
jrtapsell

6
Neden 8"simetrik" olarak kabul edilmiyor ?
Scott Milner

2
@FunkyComputerMan Aslında hiç dupe hedefi ile aynı değil . Birincisi ve en önemlisi, bunun kaynak kod kısıtlaması yoktur.
Jonathan Allan

Yanıtlar:


7

JavaScript (ES6), 130 125 113 bayt

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>

Düzenleme: @Arnauld sayesinde 5 bayt kaydedildi. @YairRand sayesinde 11 bayt daha kaydedildi.


Yerine bir regexp kullanabilir misiniz includes()? Gibi /[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c).
Arnauld,

@Arnauld Gerçekten, bu aralık çok yararlı, teşekkürler!
Neil

Golf oynayabilirsiniz [...s].reverse().map(...): s::[].map().reverse()yeni ES-sonraki özelliklerini kullanmakta sorun yoksa. link
Downgoat 12:17

@Downgoat Bu özelliğin özelliklerine bir bağlantınız var mı?
Neil


5

Jöle , 69 62 bayt

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

Çevrimiçi deneyin!

Tüm test durumları

@JonathanAllan sayesinde -7 bayt

Nasıl çalışır

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

Bir filtre kullanarak altı bayttan tasarruf edin: ¢FiЀ;1Ạðaµ¢yU⁼->¢Ff@ð¢yU⁼
Jonathan Allan

Kayıt defterini kullanarak bir başkasını kaydedin (şimdi hepsi bir satırda):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan

(... aynı uzunlukta ...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼tartışmasız daha güzel olsalar da )
Jonathan Allan

Simetrik kümedeki her bitişik sıra çiftinin yalnızca birini kodlayarak başka bir bayt kaydetme bulundu (daha iyi kodla silinen yorumun düzenlenmesi)
Jonathan Allan

4

Python 3, 211 208 195 bayt

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 sayesinde 13 byte kurtarıldı.


1
9 bayt kaydet : 1. ters eğik çizgi sırası, kaçmaya gerek yok; 2. kullanımı 2*xve range(7); 3. >2testi önlemek için çarpımı kullanın ; 4. kullanımı ile ilgili olup bitsel len(S)önlemek için notarasında not len(S)%2; 5. gerçeğini kullanmak ''in'blah'olduğunu Truedize çarpma izin vermek ~len(S)%2*s[len(S)//2]in s.
Jonathan Allan

1
Her şeyi 4 satırda daha fazla kazanın
Jonathan Allan

2

SOGL V0.12 , 88 bayt

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

Burada dene!

~ qpbdYansıtma eklemek için 24 bayt ve 6 bayt (x-1 XOR 1) + 1:


2

Kotlin 1.1, 201 199 bayt

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

Beautified

{
    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çek

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 desteklenmediğinden TIO'da çalıştırılamıyor


Sadece HashMap'i içe aktararak 1.0 üzerinde çalışmasını sağlayabilirsiniz. Çevrimiçi deneyin!
CAD97,

Puanım ithalatla mı yoksa ithalatla mı olur?
jrtapsell

içe aktarma, 1.0 üzerinde çalışmasını sağlamak için sadece bir ayar olduğundan, 1.1'de olduğu gibi çalışır, cevap 1.1'i içe aktarma olmadan alacağınızı belirttiği sürece. Yine de, birisinin HashMap’in otomatik olarak 1.1’de içe aktarıldığını bilmediği durumlarda bir not verdim.
CAD97

2

Python 2 , 182 167 163 162 160 158 bayt

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"

Çevrimiçi deneyin!

Jonathan Allan sayesinde 2 bayt kaydedildi

Açıklama Öncelikle, simetrik olmayan bütün karakterlerin listesini oluşturmamız gerekiyor (karakterin kendisi:, A... veya ... (için başka bir karakter )):

  • m("","") Kullanılabilir tüm karakterleri içeren bir dize döndürür.

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) simetrik olan karakterleri mevcut bütün karakterlerden siler.

Daha sonra, her char'i simetrik karakterine eşler ve simetrik olmayan karakterleri kaldırırız. s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

Sonuç ters dizgeye eşitse, simetrik bir dizgemiz vardır.


Eğer sağ ucundan eğik çizgi taşırsanız tve wsen, mesela kaçış vazgeçmek w="(<]{\pb". Başka bir baytla kaydet from string import*;m=maketrans( ;Ancak bayt kaydetmediğinde kişisel olarak yeni bir satıra gidiyorum ). Ayrıca, yeniden kullanılabilir ve özyinelemeli olmadığı sürece, başka bir fonksiyondan tasarruf sağlayan sürece işlevi adlandırmanız gerekmez.
Jonathan Allan

Ayrıca, yeniden kullanılabilir ve özyinelemeli olmadığı sürece, işlevi yeniden adlandırmanız gerekmez, bu da başka bir 2 TIO kaydeder (not: listelediğiniz kodda ve bağlantınızda 162 byte)
Jonathan Allan

@ JonathanAllan teşekkürler. Zaten iki byte'ı (zihinsel olarak) kaldırmıştım f=ama sürümün daha temiz.
perşembe


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.