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 polegające na kodzie golfowym : 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 .
8
uważany za „symetryczny”?Odpowiedzi:
JavaScript (ES6),
130125113 bajtówEdycja: Zapisano 5 bajtów dzięki @Arnauld. Zaoszczędź kolejne 11 bajtów dzięki @YairRand.
źródło
includes()
? Takich jak/[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c)
.[...s].reverse().map(...)
w golfa :s::[].map().reverse()
jeśli nie masz nic przeciwko korzystaniu z nowych funkcji ES-next. linkGalaretka ,
6962 bajtówWypróbuj online!
Wszystkie przypadki testowe
-7 bajtów dzięki @JonathanAllan
Jak to działa
źródło
¢FiЀ;1Ạðaµ¢yU⁼
->¢Ff@ð¢yU⁼
...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼
jest prawdopodobnie ładniejszy)Python 3,
211208195 bajtówZaoszczędź 13 bajtów dzięki Jonathanowi Allanowi.
źródło
2*x
irange(7)
; 3. użyj mnożenia, aby uniknąć>2
testu; 4. stosowanie nie logicznie nalen(S)
celu uniknięcienot
odnot len(S)%2
; 5. wykorzystują fakt, że''in'blah'
jestTrue
umożliwienie mnożenia ciąg~len(S)%2*s[len(S)//2]in s
.SOGL V0.12 , 88 bajtów
Wypróbuj tutaj!
~ 24 bajty, aby dodać
qpbd
kopię lustrzaną i 6 bajtów dla(x-1 XOR 1) + 1
: /źródło
Kotlin 1.1,
201199 bajtówUpiększony
Test
Nie można uruchomić w TIO, ponieważ 1.1 nie jest obsługiwany
źródło
Python 2 ,
182167163162160158 bajtówWypró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.
źródło
t
iw
możesz zrezygnować z ucieczki, npw="(<]{\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.f=
, ale twoja wersja jest czystsza.Perl 5 , 102 + 1 (-p) = 103 bajty
Wypróbuj online!
źródło
Scala , 140 bajtów
Wypróbuj online!
źródło