Odwracalny rewerser

19

Twoje zadanie jest proste. Program czyta wiersz standardowego tekstu i drukuje ten sam tekst w postaci odwróconej znaków. Nie wolno drukować niczego innego.

Na przykład:

input: „Hello!”, output: „! olleH”

Najważniejsze jest to , że twój program musi być w stanie zrobić dokładnie to samo, jeśli kod źródłowy jest odwrócony!

Punktacja: obowiązuje standardowa punktacja golfa, z następującą modyfikacją w celu ograniczenia nudności

//margorp
program//

odpowiedzi w stylu: każde rozwiązanie, które jest palindromem, będzie karane o + 25% punktacji, zaokrąglone w górę. Kara ta nadal obowiązuje, jeśli na przykład wstawisz znaki do programu, które nie mają żadnych użytecznych efektów, tylko po to, by złamać palindrom.

vsz
źródło
2
„Przydatnych efektów” prawdopodobnie nie można obiektywnie określić. Np GolfScript, co -1%#%1-/1albo -1%#%(0?
Peter Taylor

Odpowiedzi:

14

APL, 5

⌽⍞⍝⍞⊖

Powoduje to odwrócenie ( wzdłuż ostatniej osi) wejścia ( ), po którym następuje komentarz ( oznacza komentarz liniowy). Odwrócone, program cofa ( wzdłuż pierwszej osi) dane wejściowe, po czym następuje komentarz. Ponieważ wejście jest zawsze będzie jednowymiarowe, w tym przypadku i są funkcjonalnie równoważne. Być może jest nawet bardziej zaskakujące niż rozwiązanie GolfScript, więc oto czystsze rozwiązanie (bez komentarzy), które uzyska 9 punktów .

⍬,⌽,⍞,⊖,⍬

Najpierw chwyta pusty wektor ( ), spłaszcza go (monadycznie ,) i odwraca ( wzdłuż pierwszej osi). To wciąż pozostawia pusty wektor. Następnie łączy się (dyadic ,) z wejściem ( ), pozostawiając wejście nietknięte. Następnie spłaszcza (monadycznie ,) i tak już płaskie wejście i odwraca je ( wzdłuż ostatniej osi). Następnie łączy ( ,pusty) kolejny pusty wektor ( ) z odwróconym wejściem. To nic nie robi i pozostawia odwrócone wejście. Odwrócony, ten program robi to samo, ponownie w oparciu o fakt i jest funkcjonalnie równoważny z argumentami jednowymiarowymi.

Naprawdę nie możesz powiedzieć, że dodałem bezużyteczne znaki, by przełamać palindrom (dwie różne funkcje odwrotne różnią się przy wprowadzaniu dwóch lub więcej wymiarów; po prostu wykorzystuję fakt, że działają one tak samo z jednym- wejście wymiarowe)

Zmienność
źródło
14

Powłoka uniksowa - 8 + 25% = 10

rev||ver

Poprzednia odpowiedź cat|tacnie działała, tacodwraca kolejność wierszy, a nie kolejność znaków w wierszu.

Geoff Reedy
źródło
10

Haskell, 53

main=niam
niam=interact reverse
esrever tcaretni=main

Technicznie nie jest to palindrom, ale ponieważ kolejność deklaracji funkcji nie ma znaczenia, po odwróceniu masz dokładnie ten sam program.

lortabak
źródło
Niezły (+1). Nie wierzyłem, że to faktycznie coś zrobiło, zanim tego spróbowałem ( Link ).
Martin Thoma
przesuń main=niamdeklarację na środek, a otrzymasz palindrom.
Johannes Kuhn
@JohannesKuhn Tak, przyznaję, że wciąż jest to „nudne” rozwiązanie palindromu, o innym wyglądzie.
lortabac,
10

Ruby, 37 lat

eval <<1.reverse#
esrever.steg stup
1

Wywrócony:

1
puts gets.reverse
#esrever.1<< lave
histocrat
źródło
Herestrings, podstępne! +1
Klamka
6

Tcl, 78

puts [string rev [gets stdin]];#\
]]nidts steg[ ver gnirts[ stup;# tixe emaner

To nie jest palindrom.

Johannes Kuhn
źródło
Idone oryginał - odwrócony
Johannes Kuhn
Jaki użyteczny efekt ma „zmiana nazwy wyjścia” w tym programie? (Nie znam Tcl)
vsz
zmienia nazwę polecenia exitna #(parametr # to nie początek komentarza). \#w następnym wierszu zostanie wykonany #(nie początek komentarza, ponieważ uciekł), który jest nowy exit.
Johannes Kuhn
6

gs2, 2

(Tak, ten język powstał przed wyzwaniem. Nie, to nie jest żart ani luka. Spacja ASCII ( 0x20) jest odwrotna .)

EDYCJA: aw, stary, to pytanie jest bardzo stare? Gdybym tylko zobowiązał się wcześniej. : <Pozostawię tę odpowiedź tylko dlatego, że jest zbyt dobra, aby ją pominąć.

Lynn
źródło
3

Golfscript, 9 (7 * 1,25 = 8,75)

-1%#%1-

brudne, brudne, brudne, ale bardzo krótkie. -1%oznacza „wybierz każdy element (znak), wstecz” i #oznacza „komentarz do wiersza”. Reszta to tylko trochę magii I / O GolfScript.

To jest najkrótsze „czyste” (bez komentarzy) rozwiązanie, jakie znalazłem ( 14 * 1,25 = 17,5 ):

'';-1%..%1-;''

co oznacza: pchnij pusty ciąg, upuść, odwróć dane wejściowe, sklonuj go dwukrotnie, podziel go sam (zużywając dwie kopie i tworząc pustą tablicę), usuń wszystkie z pustej tablicy, upuść pustą tablicę, pchnij pusty ciąg i (niejawnie) wydrukuj stos.

John Dvorak
źródło
Powinienem się tego spodziewać. Nawet kara w wysokości 500% miałaby duże szanse na zwycięstwo.
vsz
@vsz Jednak szukam rozwiązania bez komentarza (tj. czystego) w golfscript.
John Dvorak
Jeśli dane wejściowe nie zawierają 1-ów ...
Johannes Kuhn
@JohannesKuhn masz rację. Porzuciłem to „rozwiązanie”.
John Dvorak
@vsz bardziej interesującym wyzwaniem jest zabronienie komentowania postaci (i nadal karanie palindromów?) Mój zawodnik ma 14 znaków, całkiem sporo.
John Dvorak
3

Ruby, 44

puts gets.reverse#esrever.steg stup

Tylko komentarz na końcu normalnego programu: P

35 znaków, + 25% = 44

ratownik
źródło
2

Tcl, 75,25

Tym razem palindrom.

puts [string rev [gets stdin]]]]nidts steg[ ver gnirts[ stup
Johannes Kuhn
źródło
(pomiędzy ]]i ]]jest znakiem \ x1A.)
Johannes Kuhn
2

Python 3, 42

print(input()[::-1]);#)]1-::[)(tupni(tnirp

Kredyty

  • Pierwsza wersja z wynikiem 49 + 25% = 61,25 stworzona przeze mnie
  • Dzięki arshajii za poprawę wyniku z 61,25 do 51,25
  • Nowa wersja z wynikiem 42 ( :-)) stworzona przeze mnie
Martin Thoma
źródło
Zamiast tego możesz użyć print(input()[::-1])#)]1-::[)(tupni(tnirpw Pythonie 3, aby obniżyć wynik do 51,25.
arshajii
1
To się nie tnie ...
Oliver Ni
„każde rozwiązanie, które jest palindromem, spowoduje naliczenie +25% kary do wyniku, w zaokrągleniu w górę. Kara ta nadal obowiązuje, jeśli na przykład wstawisz do programu postacie, które nie mają żadnych użytecznych efektów, tylko po to, by złamać palindrom . ” Twierdziłbym, że ;jest to takie wstawienie, które nie ma żadnego użytecznego efektu.
Oliver Ni
2

Rebmu : 9 (z karą) lub 13 (bez)

Nudnym rozwiązaniem Rebmu jest 9 i niesie karę palindromiczną. Mimo to pokażę to „tylko dlatego”:

rnRVaVRnr

Używając nieuczciwej sztuczki polegającej na zauważaniu dużych liter, są to osobne słowa, a brak wiodącego kapitału oznacza, że ​​nie tworzymy zestawu słów, produkujemy pięć zwykłych słów:

rn rv a vr nr

Który jest skrótem dla równoważnego kodu (również legalnego Rebmu):

return reverse a vr nr

Fakt, że vr i nr są bez znaczenia, nie ma znaczenia, ponieważ mimo że nie są przypisane do niczego, są poprawnymi słowami. Więc ewaluator uruchamia tylko return reverse a... działa w obie strony. Ale jest to w pewnym sensie analogiczne do nudnego oszustwa: kod nie jest komentowany, ale jest martwy i nie jest wykonywany na jednej ścieżce.

Jeśli szukasz czegoś bardziej ekscytującego, co nie wiąże się z karą, skorzystaj z tego 13-znakowego rozwiązania:

a VR :rv AvrA

Spójrzmy, jak to jest przetwarzane na ścieżkach do przodu i do tyłu, po rozwinięciu. Naprzód:

a               ; evaluate a, as it is a string it has no side effects
vr: :reverse    ; "set" vr to mean what a "get" of reverse means now
a: vr a         ; assign a to calling "vr" on a, effectively reversing
                ;   ^-- result of assign is last expression, the answer!

Do tyłu jako ArvA vr: RV a:

a: reverse a    ; assign A to its reversal
vr: rv: a       ; make the abbreviation vr equal to assignment of a to rv
                ;   ^-- result of assign is last expression, the answer!

Z drugiej strony wariant do tyłu zastępuje skrót dla odwrotnej. Ale hej, to nie jest palindrom, a to tylko 13 znaków. :-)

(Uwaga: Zakłada się, że używasz Rebmu w trybie / args, gdzie a jest domyślnym argumentem programu przekazywanym do interpretera w wierszu poleceń i akceptujesz wynik. Jeśli odczyt ze standardowego wejścia jest w rzeczywistości wymagany, rzeczy rośnie np. z 9 do 11 znaków dla prostego rozwiązania:. rnRVrArVRnrA jeśli musisz wydrukować na standardowe wyjście z programu zamiast akceptować wyjście wyrażenia interpretera, który dodałby również kilka znaków.)

Dr. Rebmu
źródło
2

JavaScript, 62 * 1,25 = 78

i.split('').reverse().join('')//)''(nioj.)(esrever.)''(tilps.i

Niezbyt kreatywne, ale najlepsze, co mogłem wymyślić. (zakłada, że ​​dane wejściowe są przechowywane w zmiennej i)

Dostałem to:

63 znaki, bez palindromu

i.split('').reverse().join('')//)a(nioj.)(esrever.)''=a(tilps.i

ale wydawało się to zbyt wielkim oszustwem. : PI może wprowadzić wiele bardziej trywialnych zmian (takich jak używanie i['split']zamiast zamiast i.split), ale wszyscy nadal mają ochotę oszukiwać: P.

Klamka
źródło
zakłada, że ​​dane wejściowe są przechowywane w zmiennej i, a następnie (p=a=>a&&p()==`(p=${p})(i)`?i:i.split``.reverse().join``)(i)(60 bajtów) robi to.
Esc Điệp
2

Pyke, 2 (+ 25%), niekonkurujący

_

Pyke bierze dane wejściowe niejawnie i dane wyjściowe niejawnie.

_ jest funkcją odwrotną.

niebieski
źródło
1

Tcl, 99

proc unknown args {puts "Hello World!"}
}"!dlroW olleH" stup{ sgra nwonknu corp

Jeśli wywoływane jest polecenie, które nie istnieje, wywoływane jest specjalne unknownpolecenie, które może załadować polecenie. Lub rób inne śmieszne rzeczy.

Johannes Kuhn
źródło
1

T-SQL, 86 * 1,25 = 108

Oto nudna palindromiczna pozycja dla SQL Server 2008 (i nowszych), aby pokazać, że jest to możliwe.

DECLARE @ VARCHAR(MAX)='Hi'PRINT REVERSE(@)--)@(ESREVER TNIRP''=)XAM(RAHCRAV @ ERALCED

@ przechowuje tekst wejściowy, przy czym przykładowy ciąg to „Cześć”. Liczba znaków tego wpisu jest dla ciągu znaków dwóch znaków.

Muqo
źródło
1

Beczka , sufit (1 + 0,25) = 2 bajty

?

To bierze dane wejściowe i odwraca, a dorozumiane dane wyjściowe dosłownie. TIO

ZA
źródło
0

QBIC , 14 + 25% = 18 bajtów

;?_fA|#|Af_?;

Wykorzystuje palindromowy kod źródłowy. Użycie dwóch różnych sposobów, aby to zrobić, trwa nieco dłużej (34 bajty):

;[_lA|,1,-1|Z=Z+mid$(A,a,1)#|Af_?;

Wyjaśnienie:

Read the input string from the command line as A$
;

FOR len(A$); a >= 1; a--
[        Starts a FOR loop
_l...|   returns the length the argument(here, A$); sets the starting point of the loop
,1       set the end point of the loop
,-1      FOR loop incrementer (or decrementer in this case)
|        Ends the argument list for the FOR loop

On each FOR iteration, add the right-most character of the input to Z$
Z=Z+mid$(A,a,1)

The cheat:
# starts a string literal, hiding the flipped source.
    The literal is closed implicitly at the end-of-file.
    The FOR loop is closed implicitly at the end-of-file.
    Z$ gets printed implicitly at the end of the program if it's non-empty

The flipped source is the same as my palindrome-code:
;       reads in A$ from the cmd line   
 ?      PRINT
  _fA|  The reversed version of A$
      # And hide the rest of our source in a literal  
Steenbergh
źródło
0

Pushy , 7 bajtów (5 + 25%)

@"i"@

Wypróbuj online!

Powoduje to karę w wysokości 25%, ponieważ jest to palindrom, ale to najlepsze, co mogłem zrobić. Bez względu na to, w jaki sposób program jest uruchamiany, wykonuje następujące 3 polecenia:

@     \ Reverse the input
 "    \ Print
  i   \ Exit

Podstawiając ido c(jasny stosu) lub \(komentarz) ma ten sam efekt.

FlipTack
źródło
0

05AB1E , 1 + 25% = 2 bajty

R

Wypróbuj online!

Bismarck71
źródło
Musisz zaokrąglić w górę, więc jest to (1 + 0,25) = 1,25 zaokrąglone w górę = 2 bajty.
A̲̲
Dzięki! Naprawiłem tytuł.
Bismarck71
0

R , 65 bajtów

EDYCJA: Zrzuciłem 25% kary dzięki trywialnej, ale dla mnie niewidzianej zmianie przez Grimy'ego.

stringi::stri_reverse(scan(,""))#))'',(nacs(esrever_irts::ignirts

Wypróbuj online!

Przywitaj się z ogromną zdolnością R do obsługi ciągów, nawet jeśli używasz pakietów zaprojektowanych dla ciągów takich jak stringi... barf

Sumner18
źródło