Нормальна та візуальна реверсія струн


17

Напишіть якийсь код, який діє як програма для котів. Тобто вводити рядок і виводити його як є. Але нормальна реверсія коду повинна виводити нормальну реверсію вхідного рядка. І візуальна реверсія вашого коду повинна виводити візуальну реверсію вхідного рядка.

Нормальна реверсія - це зворотна послідовність символів рядка. Візуальна реверсія - це нормальна реверсія із символами, ()[]{}<>заміненими )(][}{><відповідно.

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

Це , найкоротший код у виграші байтів.

Приклад

Для струни AB(XY)її нормальні та візуальні звороти є )YX(BAі (YX)BAвідповідно.

Якщо ваш код (гіпотетичною мовою) є AB(XY), то код )YX(BAі (YX)BAповинен виводити нормальну та візуальну реверсії вхідного рядка відповідно. І AB(XY)повинна виступати в ролі котячої програми.


Чи очікується, що рядки введення можуть містити нові рядки?
Цифрова травма

@DigitalTrauma Не думав про це ... Ваша програма повинна підтримувати все те, що вхідний режим, який ви використовуєте, може повернути (доки він повертає рядок). І він повинен працювати над самим оригінальним кодом.
jimmy23013

Відповіді:


9

05AB1E , 16 байт

Використовує той факт, що 05AB1E має постійну заздалегідь задану "()<>[]{}"і не впливає на візуальну реверсію.

Код:

,q‡"}{][><)("užR

Пояснення:

,                 # Pop and print the input.
 q                # Quit.
  ‡"}{][><)("užR  # This part is ignored.

Спробуйте в Інтернеті!


Відмінено:

Ržu"()<>[]{}"‡q,

Пояснення:

R                 # Reverse the input.
 žu               # Short for "()<>[]{}".
   "()<>[]{}"     # Push this string.
             ‡    # Transliterate (no-op, since everything is transliterated to itself).
              q   # Quit and implicitly print.
               ,  # This part is ignored.

Спробуйте в Інтернеті!


Візуально обернено:

Ržu")(><][}{"‡q,

Пояснення:

R                 # Reverse the input.
 žu               # Short for "()<>[]{}".
   ")(><][}{"     # Push this string.   
             ‡    # Transliterate (giving the visually reversed string).
              q   # Quit and implicitly print.
               ,  # This part is ignored.       

Спробуйте в Інтернеті!

Використовує кодування CP-1252 .


6

CJam, 21 байт

qe#ere$_"}{][><)("%Wq

Тестуйте це тут.

Звичайна реверсія:

qW%"()<>[]{}"_$ere#eq

Тестуйте це тут.

Візуальна реверсія:

qW%")(><][}{"_$ere#eq

Тестуйте це тут.

Пояснення

По-перше, звичайний код:

qe#ere$_"}{][><)("%Wq

Це просто: qзчитується весь вхід, e#коментується залишок програми, а вхід неявно друкується в кінці.

Тепер нормальна реверсія:

q            e# Read all input.
W%           e# Reverse it.
"()<>[]{}"   e# Push this string.
_$           e# Duplicate and sort it. However, the string is already sorted
             e# so we just get two copies of it.
er           e# Transliteration (i.e. character-wise substitution). But since the
             e# source and target string are identical, the reversed input
             e# is left unchanged.
e#eq            Just a comment...

І нарешті, візуальна реверсія:

q            e# Read all input.
W%           e# Reverse it.
")(><][}{"   e# Push this string.
_$           e# Duplicate and sort it. This gives us "()<>[]{}", i.e. the
             e# same string with each bracket pair swapped.
er           e# Transliteration (i.e. character-wise substitution). This
             e# time, this toggles all the brackets in the reversed input
             e# completing the visual reversion.
e#eq            Just a comment...

Я мав саме цей код.
jimmy23013

6

Haskell, 124 байти

Вперед:

f=id
--esrever.q pam=2>1|esrever=2<1|f;x=x q;')'='(' q;'('=')' q;']'='[' q;'['=']' q;'>'='<' q;'<'='>' q;'}'='{' q;'{'='}' q

Звичайний зворотний бік:

q '}'='{';q '{'='}';q '>'='<';q '<'='>';q ']'='[';q '['=']';q ')'='(';q '('=')';q x=x;f|1<2=reverse|1>2=map q.reverse--
di=f

Візуальний реверс:

q '{'='}';q '}'='{';q '<'='>';q '>'='<';q '['=']';q ']'='[';q '('=')';q ')'='(';q x=x;f|1>2=reverse|1<2=map q.reverse--
di=f

Кожна версія визначає функцію, fяка бере і повертає рядок. У режимі вперед f- функція ідентичності id, решта коду - коментар. У нормальному режимі реверсу охоронець 1<2в fIS True, тому reverseзастосовується. У режимі візуального зворотного <перемикання перемикається на >і захист є False. Другий захист - це навпаки та Trueу візуальному режимі, тому додатково qзастосовується, який перемикає "() <> {} []".

f|1<2=reverse|1>2=map q.reverse      -- normal reverse mode
f|1>2=reverse|1<2=map q.reverse      -- visual reverse mode

Крім того, <і >в охоронців мій код не використовує жодної з дужок, тому їх неможливо зіпсувати.


6

Bash + загальні утиліти Linux, 51

  • 2 байти збережено завдяки @ jimmy23013
  • 2 байти збережено завдяки @AdamKatz
#'><}{][)(' `P5BD706D5AC79E196iFe- cd` rt|ver|
\cat

Звичайна реверсія:

tac\
|rev|tr `dc -eFi691E97CA5D607DB5P` '()[]{}<>'#

Візуальна реверсія:

tac\
|rev|tr `dc -eFi691E97CA5D607DB5P` ')(][}{><'#

Основна хитрість тут полягає в тому, що рядок ()[]{}<>кодується як 691E97CA5D607DB5 (основа 15). Отримана dcкоманда дасть такий самий результат після будь-якого виду реверсії. Однак '()[]{}<>'рядковий літерал чутливий до типу реверсування.

tacпотрібен для зворотного порядку вхідних рядків і revпотрібен для зміни символів кожного рядка. Будь-який вхід ASCII повинен бути прийнятним.


5

MATL, 26 24 22 16 байт

Вперед

DPEXSt'><}{][)('

Спробуйте в Інтернеті!

Пояснення:

                % Implicitly grab the input as a string
D               % Pop the top of the stack and display it
P               % Tries to flip the top element on the stack but errors out
                % because the stack is empty. Program terminates.
EXSt'><}{][)('  % Not executed

Звичайна реверсія:

'()[]{}<>'tSXEPD

Спробуйте в Інтернеті!

Пояснення:

            % Implicitly grab input as a string
'()[]{}<>'  % String literal (search string)
tS          % Duplicate and sort to create the replacement string: '()[]{}<>'
XE          % Replace all entries in the input using the search and replacement strings. 
            % Corresponding characters in the strings are used for the replacement.
            % Effectively a no-op
P           % Flip the string
D           % Explicitly display result

Візуальна реверсія:

')(][}{><'tSXEPD

Спробуйте в Інтернеті!

Пояснення:

            % Implicitly grab the input as a string
')(][}{><'  % String literal (search string)
tS          % Duplicate and sort to create the replacement string: '()[]{}<>'
XE          % Replace all entries in the input using the search and replacement strings. 
            % Corresponding characters in the strings are used for the replacement. 
P           % Flip the result
D           % Explicitly display the result

Візуальна реверсія - це нормальна реверсія із символами, ()[]{}<>заміненими )(][}{><відповідно.
Ерік Аутгольфер

@ ΈρικΚωνσταντόπουλος Оновлено.
Сьювер

3

GolfScript, 32 28 байт

#%{=1-[=-\7?@.`{[(<>)]}.}%1-

Спробуйте в Інтернеті!

Звичайна реверсія:

-1%}.}])><([{`.@?7\-=[-1={%#

Спробуйте в Інтернеті!

Візуальна реверсія:

-1%{.{[(<>)]}`.@?7\-=]-1=}%#

Спробуйте в Інтернеті!

Той факт, що }безперебійне припинення програми в GolfScript, зробив це досить просто. Однак я майже впевнений, що мій код для заміни дужок ще не є оптимальним.


0

Python 2.7, 208 байт

Вперед

import sys#
print''.join(sys.stdin)#
#0:tpecxe
#"]1-::[)nidts.sys(nioj.'' tnirp"cexe:yrt
#0:tpecxe
#"(('<>{}[]()','><}{][)(')snartekam.s)etalsnart.[1-::](nidts.sys)nioj.'' tnirp"cexe:yrt
#s sa gnirts,sys tropmi

Нормальна реверсія

import sys,string as s#
try:exec"print''.join)sys.stdin(]::-1[.translate)s.maketrans)'()[]{}<>',')(][}{><'(("#
except:0#
try:exec"print''.join(sys.stdin)[::-1]"#
except:0#
#)nidts.sys(nioj.''tnirp
#sys tropmi

https://eval.in/574639

Візуальна реверсія

import sys,string as s#
try:exec"print''.join(sys.stdin)[::-1].translate(s.maketrans(')(][}{><','()[]{}<>'))"#
except:0#
try:exec"print''.join)sys.stdin(]::-1["#
except:0#
#(nidts.sys)nioj.''tnirp
#sys tropmi

https://eval.in/574638

Усі вказівки читаються від stdin до EOF.

Нічого супер розумного тут немає. Останні коментарі виконуватимуть лише прямий та зворотний код, а потім execзаяву в спробу блоку, щоб виявити синтаксичні помилки для двох різних реверсій.

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