Jestem symetryczny, nie palindromiczny!

22

tło

Zainspirowany jestem palindromem. Jesteś? , gdzie przedstawiono szokujący fakt, że „ ()()nie jest palindromem, ale ())(”, zadałem sobie pytanie, co to jest, ()()a odpowiedź brzmi po prostu: jest to struna o pionowej osi symetrii!

Zadanie

Napisz program lub funkcję, która pobiera jako ciąg ciąg S (lub odpowiedni odpowiednik w Twoim języku), sprawdza symetrię wzdłuż osi pionowej i zwraca odpowiednio wartość prawdy lub fałszu . Możesz użyć wszelkich rozsądnych środków, aby pobrać dane wejściowe i dostarczyć dane wyjściowe.

Odbicie symetrii

Odbicie symetrii wokół osi pionowej (lub symetrii lewa-prawa) oznacza, że ​​jeśli umieścisz lustro pionowo w dokładnym środku struny, odbity obraz pierwszej połowy struny jest identyczny z drugą połową struny.

Na przykład następujące ciągi są odbijające symetrycznie wokół osi pionowej:

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

podczas gdy następujące nie są:

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

Zasady konkursu

• Twój program lub funkcja otrzyma tylko drukowalne znaki ASCII. Możesz dołączyć lub nie pusty ciąg (oczywiście symetryczny!) Jako dane prawne, co jest dla ciebie lepsze.

• Znaki ASCII, które można uznać za symetryczne względem osi pionowych, są następujące (zwróć uwagę na początkową spację oraz różnicę między wielkimi i małymi literami):

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

Znaki ASCII, które można uznać za „dublowane”, oraz odpowiadające im znaki to:

()<>[]{}qpbd/\

Należy zauważyć, że ponieważ są dublowane, można mieć jedno i drugie (), a także )(, /\i \/itp

Wszystkie pozostałe znaki drukowalne ASCII należy traktować jako asymetryczne i bez lustrzanego odpowiadającego znaku.

• Jest to wyzwanie na : im krótszy jest twój program, mierzony w bajtach, tym lepiej w dowolnym języku programowania.

• Uznanie dla osób, które stworzą symetryczny program!

Uwaga : to pytanie nie jest duplikatem „Wygodnego palindromu” , który wymaga sprawdzenia ciągów palindromicznych, w których nawiasy są odwrócone. To pytanie jest inne z dwóch powodów:

1) jest to ograniczenie drugiego pytania dotyczącego tego, co dotyczy znaków nie w nawiasach, ponieważ tylko znaki symetryczne mogą występować w odwrotnej kolejności.

2) Ponieważ jest oparty na koncepcji symetrii, a nie na koncepcji „wygodnego palindromu”, znaki lustrzane mogą pojawiać się w obu kolejności, tj. []I ][, i to sprawia, że ​​program do rozwiązania różni się od programów, które rozwiązują inny problem .

Renzo
źródło
6
Dla każdego, kto się zastanawia, węgiel drzewny nie odzwierciedla liter. :(
totalnie ludzki,
4
Nie zgadzam się z dupeyness, ponieważ cel dupe nie odzwierciedla liter i tak się dzieje.
Stephen
Przepraszam, brakowało mi przykładów, mój błąd
jrtapsell
6
Dlaczego nie jest 8uważany za „symetryczny”?
Scott Milner,
2
@FunkyComputerMan To wcale nie jest to samo, co cel dupe . Przede wszystkim nie ma ograniczeń kodu źródłowego.
Jonathan Allan,

Odpowiedzi:

7

JavaScript (ES6), 130 125 113 bajtów

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>

Edycja: Zapisano 5 bajtów dzięki @Arnauld. Zaoszczędź kolejne 11 bajtów dzięki @YairRand.

Neil
źródło
Czy możesz użyć wyrażenia regularnego zamiast includes()? Takich jak /[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c).
Arnauld,
@Arnauld Rzeczywiście, ten zakres jest bardzo pomocny, dzięki!
Neil
Możesz grać [...s].reverse().map(...)w golfa : s::[].map().reverse()jeśli nie masz nic przeciwko korzystaniu z nowych funkcji ES-next. link
Downgoat
@Downgoat Czy masz link do specyfikacji tej funkcji?
Neil
1
@Neil here
Downgoat
5

Galaretka , 69 62 bajtów

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

Wypróbuj online!

Wszystkie przypadki testowe

-7 bajtów dzięki @JonathanAllan

Jak to działa

“(<[{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.
fireflame241
źródło
Zaoszczędź sześć bajtów za pomocą filtra: ¢FiЀ;1Ạðaµ¢yU⁼->¢Ff@ð¢yU⁼
Jonathan Allan,
Zapisz inny, korzystając z rejestru (teraz wszystkie na jednej linii):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Jonathan Allan,
(... chociaż na tej samej długości ...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼jest prawdopodobnie ładniejszy)
Jonathan Allan
Znaleziono kolejny jeden bajtowy zapis , kodując tylko jedną z każdej pary sąsiednich rzędnych z zestawu symetrycznego (edycja usuniętego komentarza z lepszym kodem)
Jonathan Allan
4

Python 3, 211 208 195 bajtów

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

Zaoszczędź 13 bajtów dzięki Jonathanowi Allanowi.

L3viathan
źródło
1
Zaoszczędź 9 bajtów : 1. odwróć kolejność ukośników, więc nie musisz uciekać; 2. wykorzystanie 2*xi range(7); 3. użyj mnożenia, aby uniknąć >2testu; 4. stosowanie nie logicznie na len(S)celu uniknięcie notod not len(S)%2; 5. wykorzystują fakt, że ''in'blah'jest Trueumożliwienie mnożenia ciąg ~len(S)%2*s[len(S)//2]in s.
Jonathan Allan
1
Zaoszczędź 4 więcej, wkładając wszystko
Jonathan Allan
2

SOGL V0.12 , 88 bajtów

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

Wypróbuj tutaj!

~ 24 bajty, aby dodać qpbdkopię lustrzaną i 6 bajtów dla (x-1 XOR 1) + 1: /

dzaima
źródło
2

Kotlin 1.1, 201 199 bajtów

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

Upiększony

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

Test

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

Nie można uruchomić w TIO, ponieważ 1.1 nie jest obsługiwany

jrtapsell
źródło
Możesz go uruchomić w wersji 1.0, po prostu importując HashMap Wypróbuj online!
97 CAD
Czy mój wynik byłby z importem czy bez?
jrtapsell
ponieważ import jest tylko fikcją, aby działał na 1.0, gdzie działa na 1.1, tak jak jest, tak długo, jak odpowiedź określa 1.1, zostaniesz oceniony bez importu. Dodam notatkę, na wypadek, gdyby ktoś nie wiedział, że HashMap jest (skutecznie) automatycznie importowany do 1.1.
97 CAD
2

Python 2 , 182 167 163 162 160 158 bajtów

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"

Wypróbuj online!

Zaoszczędź 2 bajty dzięki Jonathanowi Allanowi

Objaśnienie Najpierw musimy zbudować listę wszystkich znaków, które nie mają symetrii (sam znak:, A... lub inny znak (dla ), ...):

  • m("","") zwraca ciąg znaków ze wszystkimi dostępnymi znakami.

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) usuwa ze wszystkich dostępnych znaków znaki symetryczne.

Następnie mapujemy każdy znak na jego znak symetryczny i usuwamy znaki, które nie są symetryczne s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

Jeśli wynik jest równy odwróconemu ciągowi, mamy ciąg symetryczny.

Jferard
źródło
Jeśli przeniesiesz ukośniki z prawego końca ti wmożesz zrezygnować z ucieczki, np w="(<]{\pb". Zapisz kolejny bajt za pomocą from string import*;m=maketrans(osobiście wybieram nowy wiersz, gdy ;nie zapisuję bajtów). Nie trzeba też nazywać tej funkcji, o ile jest ona wielokrotnego użytku i nie jest rekurencyjna, co oszczędza kolejne 2.
Jonathan Allan,
Nie musisz też nazywać nazwy funkcji, o ile jest ona wielokrotnego użytku i nie jest rekurencyjna, co oszczędza kolejne 2 TIO (uwaga: kod, który podałeś i pod linkiem to 162 bajty)
Jonathan Allan
@JonathanAllan dzięki. Już usunąłem (mentalnie) dwa bajty f=, ale twoja wersja jest czystsza.
Jferard
1

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

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

Wypróbuj online!

Xcali
źródło
1

Scala , 140 bajtów

s.zip(s.reverse).forall(c=>(" !\"'+*-.:=AHIMOTUVWXY^_ovwx|".flatMap(x=>x+""+x)+"()<>[]{}qpbd/\\\\/dbpq}{][><)(").indexOf(c._1+""+c._2)%2==0)

Wypróbuj online!

sześcienna sałata
źródło