Я симетричний, а не паліндромний!


22

Фон

Натхненний я паліндром. Ти? , де представлено шокуюче те, що « ()()це не паліндром, але ())(», я запитав себе, що натомість є, ()()а відповідь проста: це струна з вертикальною віссю симетрії!

Завдання

Напишіть програму або функцію, яка приймає рядок S (або відповідний еквівалент у вашій мові) як вхідний, перевіряє на симетрію уздовж вертикальної осі і відповідно повертає значення truthy або false . Ви можете скористатися будь-якими розумними засобами, щоб взяти вклад і забезпечити вихід.

Рефлекторна симетрія

Відображаюча симетрія навколо вертикальної осі (або ліво-правої симетрії) означає, що якщо поставити дзеркало вертикально в точний центр струни, відбите зображення першої половини струни ідентичне другій половині струни.

Наприклад, наступні рядки відображають симетричні навколо вертикальної осі:

()()
()()()
[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
Для всіх, хто цікавиться, вугілля не відображає літер. :(
повністюлюдський

4
Я не погоджуюся з придурливістю, оскільки ціль дупи не відображає букв і це робить.
Стівен

Вибачте, я пропустив приклади, моя помилка
jrtapsell

6
Чому його не 8вважають "симетричним"?
Скотт Мілнер

2
@FunkyComputerMan Насправді це зовсім не те саме, що ціль дупи . По-перше, це не обмеження вихідного коду.
Джонатан Аллан

Відповіді:


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>

Редагувати: Збережено 5 байт завдяки @Arnauld. Збережено ще 11 байт завдяки @YairRand.


Чи можете ви скористатися регулярним виразом замість includes()? Такі як /[- !"'+*.:=AHIMO^_ovwx|T-Y]/.test(c).
Арнольд

@Arnauld Дійсно, цей діапазон дуже корисний, дякую!
Ніл

Ви можете [...s].reverse().map(...)грати в гольф : s::[].map().reverse()якщо ви все добре, використовуючи нові функції ES-next. посилання
Пуховик

@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⁼
Джонатан Аллан

Збережіть іншу, скориставшись реєстром (усі в одному рядку зараз):...}pd\”,Ṛ$Fœs©2Ff@ð®yU⁼
Джонатан Аллан

(... хоча однакова довжина ...}pd\”,Ṛ$F©f@ð®œs2¤yU⁼, можливо, приємніше)
Джонатан Аллан

Знайшов ще один байт збереження , кодуючи лише одну з кожної пари сусідніх порядків із симетричного набору (редагування видаленого коментаря з кращим кодом)
Джонатан Аллан

4

Пітон 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*xі range(7); 3. використовувати множення, щоб уникнути >2тесту; 4. Використовуйте долота не на, len(S)щоб уникнути notвикористання not len(S)%2; 5. використовувати той факт , що ''in'blah'це Trueдозволити строкове множення ~len(S)%2*s[len(S)//2]in s.
Джонатан Аллан



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

Неможливо запустити TIO, оскільки 1.1 не підтримується


Ви можете змусити його працювати на 1.0, просто імпортуючи 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 байти завдяки Джонатану Аллану

Пояснення По-перше, нам потрібно скласти список усіх символів, які не мають симетричного (сам char:, A... або інший знак (для ), ...):

  • m("","") повертає рядок з усіма доступними символами.

  • m("","").translate(None," \t!\"'+*-.:=AHIMOTUVWXY^_ovwx|"+t+w)) вилучає з усіх доступних символів символи, які мають симетричну форму.

Потім ми мапируем кожну табличку до її симетричної та видаляємо символи, які не мають симетричного s.translate(m(t+w,w+t),<chars that don't have a symmetric>)

Якщо результат дорівнює зворотній рядку, у нас є симетрична рядок.


Якщо ви пересунете косої риски з правого кінця tі wможете відмовитися від втечі, наприклад w="(<]{\pb". Збережіть інший байт за допомогою from string import*;m=maketrans(я особисто переходжу до нового рядка, коли ;байт не зберігає). Крім того, вам не потрібно називати цю функцію, якщо вона є багаторазовою і не рекурсивною, що економить ще 2.
Джонатан Аллан

Крім того, вам не потрібно називати цю функцію до тих пір, поки вона буде багаторазовою і не рекурсивною, що зберігає ще 2 TIO (зверніть увагу: код, який ви вказали і за вашим посиланням, становить 162 байти)
Джонатан Аллан

@JonathanAllan дякую. Я вже видалив (подумки) два байти для f=, але ваша версія чистіша.
jferard


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.