Normalne i wizualne odwrócenie łańcucha

17

Napisz kod, który działa jak program cat. To znaczy, aby wprowadzić ciąg i wyprowadzić go takim, jaki jest. Ale normalne odwrócenie kodu musi generować normalne odwrócenie ciągu wejściowego. A wizualna rewersja twojego kodu musi generować wizualną rewersję ciągu wejściowego.

Normalne odwrócenie to odwrócona sekwencja znaków w łańcuchu. Odwrócenie wizualne jest normalnym odwróceniem z odpowiednio ()[]{}<>zastąpionymi znakami )(][}{><.

Możesz użyć dowolnej strony kodowej zawierającej znaki ()[]{}<>i opublikowane przed tym wyzwaniem do zdefiniowania znaków. Musisz użyć tej samej strony kodowej dla całego kodu. Twój oryginalny kod musi być prawidłowy na tej stronie kodowej, a zastosowanie do niego jednego z odwróconych kodów powinno się przynieść.

To jest , wygrywa najkrótszy kod w bajtach.

Przykład

Dla struny AB(XY), jej normalne i wizualne są powroty )YX(BAi (YX)BAodpowiednio.

Jeśli masz kod (w hipotetycznym języku) AB(XY), kod )YX(BAi (YX)BApowinien wypisywać odpowiednio odwrócenie normalne i wizualne ciągu wejściowego. I AB(XY)powinien działać jako program dla kotów.

jimmy23013
źródło
Czy oczekuje się, że ciągi wejściowe mogą zawierać znaki nowej linii?
Digital Trauma
@DigitalTrauma Nie myślałem o tym ... Twój program powinien obsługiwać wszystko, co może zwrócić procedura wejściowa (o ile zwraca ciąg znaków). I powinien działać na samym oryginalnym kodzie.
jimmy23013
1
Powiązane codegolf.stackexchange.com/q/28190/15599
Level River St

Odpowiedzi:

9

05AB1E , 16 bajtów

Wykorzystuje fakt, że 05AB1E ma stałą predefiniowaną "()<>[]{}"i nie ma wpływu na odwrócenie wizualne.

Kod:

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

Wyjaśnienie:

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

Wypróbuj online!


Wywrócony:

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

Wyjaśnienie:

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.

Wypróbuj online!


Odwrócony wizualnie:

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

Wyjaśnienie:

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.       

Wypróbuj online!

Wykorzystuje kodowanie CP-1252 .

Adnan
źródło
6

CJam, 21 bajtów

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

Sprawdź to tutaj.

Normalna rewersja:

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

Sprawdź to tutaj.

Odwrócenie wizualne:

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

Sprawdź to tutaj.

Wyjaśnienie

Po pierwsze, normalny kod:

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

Jest to proste: qodczytuje wszystkie dane wejściowe, e#komentuje pozostałą część programu, a dane wejściowe są drukowane niejawnie na końcu.

Teraz normalna rewersja:

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

I wreszcie odwrócenie wizualne:

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...
Martin Ender
źródło
Sam miałem dokładnie ten kod.
jimmy23013
6

Haskell, 124 bajty

Naprzód:

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

Normalny bieg wsteczny:

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

Wizualna rewers:

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

Każda wersja definiuje funkcję, fktóra pobiera i zwraca ciąg znaków. W trybie przesyłania dalej fjest funkcja tożsamości id, reszta kodu to komentarz. W normalnym trybie odwrotnym osłona 1<2w faktualnie się znajduje True, to reversejest stosowane. W wizualnym trybie odwrotnym przełącznik <jest włączony, >a osłona jest False. Druga osłona jest odwrotnie i działa Truew trybie wizualnym, dlatego dodatkowo qzastosowano przełącznik, który przełącza „() <> {} []”.

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

Poza tym <i >strażnicy, mój kod nie używa nawiasów, więc nie można ich pomieszać.

nimi
źródło
6

Bash + wspólne narzędzia linux, 51

  • 2 bajty zapisane dzięki @ jimmy23013
  • 2 bajty zapisane dzięki @AdamKatz
#'><}{][)(' `P5BD706D5AC79E196iFe- cd` rt|ver|
\cat

Normalna rewersja:

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

Odwrócenie wizualne:

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

Główna sztuczka polega na tym, że łańcuch ()[]{}<>jest zakodowany jako 691E97CA5D607DB5 (podstawa 15). Wynikowe dcpolecenie da ten sam wynik po obu rodzajach cofania. Jednak '()[]{}<>'literał łańcuchowy jest wrażliwy na typ odwrócenia.

tacjest wymagane do odwrócenia kolejności linii wejściowych i revjest wymagane do odwrócenia znaków każdej linii. Każde wejście ASCII powinno być dopuszczalne.

Cyfrowa trauma
źródło
5

MATL, 26 24 22 16 bajtów

Naprzód

DPEXSt'><}{][)('

Wypróbuj online!

Wyjaśnienie:

                % 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

Normalna rewersja:

'()[]{}<>'tSXEPD

Wypróbuj online!

Wyjaśnienie:

            % 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

Odwrócenie wizualne:

')(][}{><'tSXEPD

Wypróbuj online!

Wyjaśnienie:

            % 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
Suever
źródło
Odwrócenie wizualne jest normalnym odwróceniem z odpowiednio ()[]{}<>zastąpionymi znakami )(][}{><.
Erik the Outgolfer
@ ΈρικΚωνσταντόπουλος Zaktualizowano.
Suever
3

GolfScript, 32 28 bajtów

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

Wypróbuj online!

Normalna rewersja:

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

Wypróbuj online!

Odwrócenie wizualne:

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

Wypróbuj online!

Fakt, że niedopasowane }zakończenie programu w GolfScript, uczyniło to dość prostym. Jestem jednak całkiem pewien, że mój kod do zamiany nawiasów nie jest jeszcze optymalny.

Martin Ender
źródło
0

Python 2.7, 208 bajtów

Naprzód

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

Normalna rewersja

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

Odwrócenie wizualne

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

Wszystkie kierunki odczytywane są ze standardu do EOF.

Nic super sprytnego tutaj. Końcowe komentarze, aby wykonać tylko kod do przodu i do tyłu, a następnie execinstrukcję w bloku try, aby wyłapać błędy składniowe dla dwóch różnych wersji.

Orez
źródło