Der reversible Umkehrer

19

Ihre Aufgabe ist einfach. Das Programm liest eine Textzeile aus der Standardeingabe ein und druckt denselben Text in einer zeichenumgekehrten Form aus. Es ist nicht gestattet, etwas anderes zu drucken.

Beispielsweise:

Eingabe: "Hallo!", Ausgabe: "! olleH"

Der Haken ist , dass Ihr Programm in der Lage sein muss, genau dasselbe zu tun, wenn der Quellcode selbst zeichenumgekehrt ist!

Wertung: Es gilt die Standard-Code-Golf-Wertung mit der folgenden Änderung, um die Langeweile zu begrenzen

//margorp
program//

Stilantworten: Für jede Lösung, die ein Palindrom ist, wird eine Strafe von + 25% auf die aufgerundete Punktzahl erhoben. Diese Strafe gilt auch dann, wenn Sie beispielsweise Zeichen in das Programm einfügen, die keine nützlichen Auswirkungen haben, nur um das Palindrom zu brechen.

vsz
quelle
2
"Nützliche Effekte" können wahrscheinlich nicht objektiv angegeben werden. Was ist zB in GolfScript mit -1%#%1-/1oder -1%#%(0?
Peter Taylor

Antworten:

14

APL, 5

⌽⍞⍝⍞⊖

Dies kehrt ( entlang der letzten Achse) die Eingabe ( ) um, gefolgt von einem Kommentar ( markiert einen Zeilenkommentar). Umgekehrt kehrt das Programm die Eingabe um ( entlang der ersten Achse), gefolgt von einem Kommentar. Da die Eingabe in diesem Fall immer eindimensional ist und funktional äquivalent ist. Es ist vielleicht sogar hinterhältiger als die GolfScript-Lösung, daher hier eine sauberere Lösung (keine Kommentare), die mit 9 bewertet wird .

⍬,⌽,⍞,⊖,⍬

Dies fasst zuerst einen leeren Vektor ( ), glättet ihn (monadisch ,) und kehrt ihn um ( entlang der ersten Achse). Dies lässt immer noch einen leeren Vektor. Dann verkettet es sich (dyadisch ,) mit der Eingabe ( ) und lässt die Eingabe unberührt. Anschließend wird ,die bereits flache Eingabe geglättet (monadisch ) und umgekehrt ( entlang der letzten Achse). Dann wird ein ,weiterer leerer Vektor ( ) mit der umgekehrten Eingabe verkettet (dyadisch ) . Dies tut nichts und lässt die umgekehrte Eingabe zurück. Umgekehrt macht dieses Programm das Gleiche, wiederum basierend auf der Tatsache, dass und funktional mit eindimensionalen Argumenten äquivalent sind.

Man kann wirklich nicht sagen, dass ich nutzlose Zeichen hinzufüge, um das Palindrom zu durchbrechen (die zwei unterschiedlichen Umkehrfunktionen unterscheiden sich bei zwei- oder mehrdimensionalen Eingaben; ich nutze nur die Tatsache, dass sie bei ein und derselben Eingabe gleich wirken). dimensionale Eingabe)

Flüchtigkeit
quelle
14

Unix-Shell - 8 + 25% = 10

rev||ver

Vorherige Antwort von cat|tachat nicht wirklich funktioniert, tackehrt die Reihenfolge der Zeilen um, nicht die Reihenfolge der Zeichen in einer Zeile.

Geoff Reedy
quelle
10

Haskell, 53

main=niam
niam=interact reverse
esrever tcaretni=main

Technisch gesehen kein Palindrom, aber da die Reihenfolge der Funktionsdeklaration keine Rolle spielt, haben Sie nach dem Umkehren genau das gleiche Programm.

lortabac
quelle
Schön (+1). Ich habe nicht geglaubt, dass dies tatsächlich etwas bewirkt hat, bevor ich es versucht habe ( Link ).
Martin Thoma
Verschieben Sie die main=niamDeklaration in die Mitte, und Sie erhalten ein Palindrom.
Johannes Kuhn
@JohannesKuhn Ja, ich gebe zu, es ist immer noch die "langweilige" Palindrom-Lösung mit einem anderen Erscheinungsbild.
Lortabac
10

Rubin, 37

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

Rückgängig gemacht:

1
puts gets.reverse
#esrever.1<< lave
Histokrat
quelle
Herestrings, hinterhältig! +1
Türklinke
6

Tcl, 78

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

Kein Palindrom.

Johannes Kuhn
quelle
Idone original - rückgängig gemacht
Johannes Kuhn
Welchen nützlichen Effekt hat "Exit umbenennen" in diesem Programm? (Ich weiß nicht, Tcl)
vsz
Benennt den Befehl exitin um #(das # ist ein Parameter, nicht der Beginn eines Kommentars). \#in der nächsten zeile wird ausgeführt #(nicht anfang des kommentars weil escaped) was das neue ist exit.
Johannes Kuhn
6

gs2, 2

(Ja, diese Sprache wurde vor der Herausforderung erstellt. Nein, es ist kein Witz oder eine Lücke. ASCII-Leerzeichen ( 0x20) sind umgekehrt .)

EDIT: aw, man, diese Frage ist super alt? Wenn ich mich nur früher verpflichtet hätte. : <Ich lasse diese Antwort offen, nur weil es zu schön ist, darauf zu verzichten.

Lynn
quelle
3

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

-1%#%1-

dreckig, dreckig, dreckig, aber extrem kurz. -1%bedeutet "jedes Element auswählen (Zeichen), rückwärts" und #bedeutet "Zeilenkommentar". Der Rest ist nur ein kleiner Teil der I / O-Magie von GolfScript.

Dies ist die kürzeste "saubere" (keine Kommentare) Lösung, die ich gefunden habe ( 14 * 1,25 = 17,5 ):

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

Das heißt: eine leere Zeichenkette verschieben, fallen lassen, die Eingabe umkehren, zweimal klonen, für sich teilen (zwei Kopien verbrauchen und ein leeres Array erzeugen), alle aus der leeren Zeichenkette entfernen, die leere Zeichenkette löschen, eine leere Zeichenkette verschieben und (implizit) den Stapel drucken.

John Dvorak
quelle
Ich hätte das erwarten sollen. Selbst eine Strafe von 500% hätte eine hohe Chance, einen Sieger zu erzielen.
vsz
@vsz Ich suche jedoch eine kommentarlose (dh saubere) Lösung für golfscript.
John Dvorak
Wenn die Eingabe keine 1 enthält ..
Johannes Kuhn
@JohannesKuhn du hast recht. Ich habe diese "Lösung" fallen gelassen.
John Dvorak
@vsz Eine interessantere Herausforderung ist es, Kommentarzeichen zu verbieten (und trotzdem Palindrome zu bestrafen?). Mein Kandidat dafür hat 14 Zeichen, ziemlich viel, denke ich.
John Dvorak
3

Rubin, 44

puts gets.reverse#esrever.steg stup

Nur ein Kommentar am Ende eines normalen Programms: P

35 Zeichen, + 25% = 44

Retter
quelle
2

Tcl, 75,25

Diesmal ein Palindrom.

puts [string rev [gets stdin]]]]nidts steg[ ver gnirts[ stup
Johannes Kuhn
quelle
(Zwischen ]]und ]]ist das Zeichen \ x1A.)
Johannes Kuhn
2

Python 3, 42

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

Credits

  • Die erste Version mit einer Punktzahl von 49 + 25% = 61,25 wurde von mir erstellt
  • Vielen Dank an Arshajii für die Verbesserung der Punktzahl von 61,25 auf 51,25
  • Neue Version mit Punktzahl von 42 ( :-)) von mir erstellt
Martin Thoma
quelle
Sie können print(input()[::-1])#)]1-::[)(tupni(tnirpstattdessen Python 3 verwenden, um die Punktzahl auf 51,25 zu reduzieren.
Arshajii
1
Das schneidet nicht ...
Oliver Ni
"Jede Lösung, bei der es sich um ein Palindrom handelt, wird mit einer Strafe von + 25% für die aufgerundete Punktzahl geahndet. Diese Strafe gilt weiterhin, wenn Sie zum Beispiel Zeichen in das Programm einfügen, die keine nützlichen Effekte haben, nur um das Palindrom zu zerbrechen . " Ich würde argumentieren, dass dies ;eine solche Einfügung ist, die keinen nützlichen Effekt hat.
Oliver Ni
2

Rebmu : 9 (mit Strafe) oder 13 (ohne)

Die langweilige Rebmu-Lösung ist 9 und trägt die palindromische Strafe. Ich zeige es trotzdem "nur weil":

rnRVaVRnr

Mit dem Trick, Großbuchstaben nicht zu überdecken, werden separate Wörter gebildet, und das Fehlen eines führenden Großbuchstaben bedeutet, dass wir kein festes Wort bilden, sondern fünf gewöhnliche Wörter produzieren:

rn rv a vr nr

Was ist eine Abkürzung für den entsprechenden Code (auch legal Rebmu):

return reverse a vr nr

Die Tatsache, dass vr und nr bedeutungslos sind, spielt keine Rolle, da sie trotz fehlender Zuordnung gültige Wörter sind. Der Evaluator führt also nur das aus return reverse a... es funktioniert in beide Richtungen. Aber dies ist in gewissem Sinne analog zum langweiligen Cheat: Der Code ist nicht auskommentiert, aber er ist tot und wird nicht auf einem Pfad ausgeführt.

Für etwas Aufregenderes, für das es keine Strafe gibt, wie wäre es mit dieser 13-Zeichen-Lösung:

a VR :rv AvrA

Schauen wir uns an, wie dies auf den Vorwärts- und Rückwärtspfaden verarbeitet wird, wenn es erweitert wird. Nach vorne:

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!

Rückwärts als 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!

Auf der anderen Seite überschreibt die Rückwärtsvariante die Abkürzung für Reverse. Aber hey, es ist kein Palindrom und es sind nur 13 Charaktere. :-)

(Hinweis: Dies setzt voraus, dass Sie Rebmu im / args-Modus ausführen, wobei a das Standardargument für das Programm ist, das an den Interpreter in der Befehlszeile übergeben wird, und Sie das Ergebnis akzeptieren. Wenn das Lesen von der Standardeingabe tatsächlich eine Voraussetzung ist, sind die Dinge B. von 9 auf 11 Zeichen für die einfache Lösung: rnRVrArVRnrUnd wenn Sie aus dem Programm heraus auf die Standardausgabe drucken müssen, anstatt die Ausdrucksausgabe des Interpreters zu akzeptieren, bei der auch ein paar Zeichen hinzugefügt würden.)

Dr. Rebmu
quelle
2

JavaScript, 62 * 1,25 = 78

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

Nicht zu kreativ, aber das Beste, was ich mir einfallen lassen konnte. (setzt voraus, dass die Eingabe in Variable gespeichert ist i)

Ich habe folgendes bekommen:

63 Zeichen, kein Palindrom

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

aber es fühlte sich zu sehr nach Schummeln an. : PI könnte noch viel mehr triviale Änderungen vornehmen (z. B. Verwenden i['split']anstelle von i.split), aber alle, die dies möchten, haben immer noch das Gefühl, zu schummeln: P

Türknauf
quelle
nimmt an, dass die Eingabe in der Variablen i gespeichert ist, dann (p=a=>a&&p()==`(p=${p})(i)`?i:i.split``.reverse().join``)(i)(60 Bytes) macht das Ding.
Esc ĐiĐp
2

Pyke, 2 (+ 25%), nicht konkurrierend

_

Pyke nimmt implizit Eingaben und gibt sie implizit aus.

_ ist die umgekehrte Funktion.

Blau
quelle
1

Tcl, 99

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

Wenn ein nicht vorhandener Befehl aufgerufen wird, wird ein spezieller unknownBefehl aufgerufen, der den Befehl laden kann. Oder andere lustige Sachen machen.

Johannes Kuhn
quelle
1

T-SQL, 86 * 1,25 = 108

Hier ist ein langweiliger palindromischer Eintrag für SQL Server 2008 (und neuer), um zu zeigen, dass dies möglich ist.

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

@ enthält den eingegebenen Text, wobei die Beispielzeichenfolge "Hi" ist. Die Zeichenanzahl dieses Eintrags gilt für eine Eingabezeichenfolge mit zwei Zeichen.

Muqo
quelle
1

Keg , ceil (1 + 0,25) = 2 Bytes

?

Dies nimmt Eingaben und Umkehrungen vor und implizite Ausgaben geben sie wörtlich aus. TIO

EIN
quelle
0

QBIC , 14 + 25% = 18 Bytes

;?_fA|#|Af_?;

Verwendet einen palindromischen Quellcode. Die Verwendung von zwei verschiedenen Methoden dauert etwas länger (34 Byte):

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

Erläuterung:

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
quelle
0

Pushy , 7 Bytes (5 + 25%)

@"i"@

Probieren Sie es online!

Dies führt zu einer Strafe von 25%, da es sich um ein Palindrom handelt, aber es ist das Beste, was ich tun kann. Unabhängig davon, in welcher Richtung das Programm ausgeführt wird, werden die folgenden 3 Befehle ausgeführt:

@     \ Reverse the input
 "    \ Print
  i   \ Exit

Das Ersetzen ivon c(Stapel löschen) oder \(Kommentar) hat den gleichen Effekt.

FlipTack
quelle
0

05AB1E , 1 + 25% = 2 Byte

R

Probieren Sie es online!

Bismarck71
quelle
Sie müssen aufrunden, dies ist also (1 + 0,25) = 1,25 aufgerundet = 2 Bytes.
A
Vielen Dank! Ich habe den Titel festgelegt.
Bismarck71
0

R , 65 Bytes

EDIT: Hat die 25% Strafe dank einer für mich unsichtbaren Änderung durch Grimy abgeschafft.

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

Probieren Sie es online!

Begrüßen Sie Rs abgründige Fähigkeit, mit Strings umzugehen, selbst wenn Sie Pakete verwenden, die für Strings wie stringi... barf entwickelt wurden

Sumner18
quelle
1
Gleiche
Byteanzahl