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


22

Задний план

Вдохновленный я палиндром. Ты? Там, где представлен шокирующий факт, что « ()()это не палиндром, но ())(», я спросил себя, что вместо этого, ()()и ответ прост: это строка с вертикальной осью симметрии!

Задание

Напишите программу или функцию, которая принимает строку S (или соответствующий эквивалент на вашем языке) в качестве входных данных, проверяет симметрию вдоль вертикальной оси и возвращает значение true или 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
Я не согласен с Dupeyness, так как цель Dupe не отражает буквы, и это делает.
Стивен

Извините, я пропустил примеры, моя ошибка
jrtapsell

6
Почему не 8считается "симметричным"?
Скотт Милнер

2
@FunkyComputerMan По сути, это совсем не то же самое, что цель dupe . Прежде всего, это не имеет ограничений по исходному коду.
Джонатан Аллан

Ответы:


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

@ 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

Python 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 байта благодаря Джонатану Аллану

Пояснение Во-первых, нам нужно построить список всех символов, которые не имеют симметрии (сам символ:, 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.