Palindrome polyglot


15

Ihre Aufgabe ist es, ein Programm zu schreiben, das in zwei verschiedenen Sprachen ausgeführt wird und folgende Aufgaben ausführt:

  • In einer Sprache wird eine bestimmte Zeichenfolge palindromisiert.
    • Nimm die Schnur. abcde
    • Kehre die Saite um. edcba
    • Entfernen Sie das erste Zeichen. dcba
    • Kleben Sie es auf die ursprüngliche Zeichenfolge. abcdedcba
  • In einer anderen Sprache wird eine bestimmte Zeichenfolge depalindromisiert.
    • Nehmen Sie eine Schnur, die mit der obigen Methode palidromisiert wurde. abcdedcba
    • Bringe die Charaktere von Anfang an in die Mitte. abcde

Denken Sie daran, dies ist , also gewinnt der Code mit den wenigsten Zeichen (nicht Bytes).

Bestenlisten

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language 1/Language 2, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

# Ruby/Python, <s>104</s> <s>101</s> 96 bytes

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

# Perl/C, 43 + 2 (-p flag) = 45 bytes

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

# [><>](http://esolangs.org/wiki/Fish)/Python, 121 bytes


@ LuisMendo Eine Sekunde ...
Oliver Ni

@ LuisMendo Okay, ich habe die Frage aktualisiert
Oliver Ni

Wird die Zeichenfolge jemals Zeilenumbrüche enthalten?
Erik der Outgolfer

Kann das Eingabeformat in beiden Sprachen unterschiedlich sein? Wie eine Zeichenfolge mit oder ohne Anführungszeichen
Luis Mendo

@ LuisMendo Ja.
Oliver Ni

Antworten:


14

05AB1E / MATL , 10 9 Zeichen

9LQ2/)%¹û

In 05AB1E wird dies palindromisiert . In MATL wird es depalindromisiert .

Erklärung in 05AB1E

Dieser Teil des Codes bewirkt (global) nichts:

9L    Pushes array [1, 2, ... 9]
Q     Consumes the array, takes the input implicitly, and produces no output
2/    With no further input to take implicitly, this gives no output
)     Wrap stack into an array: gives an empty array
%     Consumes that array and, with no further input to take implicitly, gives no ouput 

Dies ist der Teil, der die Arbeit erledigt:

¹     Push input again
û     Palindromize. Implicitly display

Erklärung in MATL

Dies ist der Teil, der die Arbeit erledigt:

9L    Push array [0, 1j]
Q2/   Add 1, divide by two: transforms into [1/2, (1+1j)/2]
)     Use as index into implicit input. [1/2, (1+1j)/2] is interpreted as
      1/2:(end+1)/2, which is rounded to 1:(end+1)/2. So this takes elements
      from first to half, including both. Implicitly display

Dies wird ignoriert:

%¹û   Everything after '%' is a comment

12

05AB1E / Jelly , 6 Zeichen

Palindromiert in 05AB1E.
Depalindromiert in Gelee.

œs2Ḣ¹û

Versuchen Sie es in 05AB1E

05AB1E Erläuterung

œ       # compute powerset of input
 s      # swap (does nothing)
  2     # push 2
   Ḣ    # does nothing
    ¹û  # palindromize input

Probieren Sie es in Jelly

Jelly Erklärung

œs2     # split input in 2 chunks (first chunk is larger for odd length strings)
   Ḣ    # head, take first
    ¹û  # does nothing

6

Python 3 / JavaScript, 83 Zeichen

2 Bytes dank @LevitatingLion gespart

1//2;x=input();print(x+x[-2::-1]);"""
x=prompt();alert(x.slice(0,-x.length/2))//"""

Python palindromisiert , JavaScript depalindromisiert .

Ich habe versucht, mehr Code zwischen den beiden konstant zu halten, aber ich konnte keinen guten Weg finden, um mich .slicein Python einzuschleichen. Hier ist eine alternative Methode:

1//2;prompt=input,alert=print
x=prompt();1//2;x+=x[-2::-1]);"""
x=x.slice(0,-x.length/2))//"""
alert(x)

Sie können ersetzen x[::-1][1:]mit x[-2::-1]zu speichern zwei Zeichen.
LevitatingLion

@LevitatingLion Vielen Dank! Ich hatte versucht, herauszufinden, wie man die beiden Scheiben kombiniert, aber nichts schien zu funktionieren.
ETHproductions

5

Scala / Javascript, 106 Bytes

/*\u002A/print(args(0)+args(0).reverse.tail)//*/
/*/**/
alert((s=prompt()).slice(0,-s.length/2))//\u000A*/

Palindromizes in Scala und Depalindromizes in Javascript.

Versuchen Sie es auf Ideone (Scala) - Warnung: falsche Syntax Hervorhebung

Probieren Sie es auf jsfiddle (Javascript).

Erläuterung:

Scala verarbeitet, wie Java, Unicode-Escape-Zeichen, bevor alles andere passiert, daher sieht scalac den Code so:

/**/                                //\u002A is as asterisk, results in an empty block comment
print(args(0)+args(0).reverse.tail) //scala code
//*/                                //a line comment
/*                                  //scala supports nested block comments, so this comment...
  /*
  */
  alert((s=prompt()).slice(0,-s.length/2)) 
  //                                  //\u000A (newline) inserted here
*/                                  //...ends here

Das Javascript wird folgendermaßen analysiert:

/*\u002A/print(args(0)+args(0).reverse.tail)//*/ //block comment
/*                                               //a block comment...
  /*
*/                                               //...ending here, no nesting
alert((s=prompt()).slice(0,-s.length/2))         //code
//\u000A*/                                       //line comment

4

CJam / MATL , 18 Zeichen

r_W%(;
"j9LQ2/)%";

In CJam wird dies palindromisiert . In MATL wird es depalindromisiert .

Erklärung in CJam

Arbeitsteil:

r           Read string
_           Duplicate
W%          Reverse
(;          Remove first element

Dummy-Teil:

"j9LQ2/)%"  Push this string
;           Remove it from the stack
            Implicitly display both strings obtained previously

Erklärung in MATL

Dummy-Teil:

r           Push random number between 0 and 1
_           Negate
W           2 raised to that
%(;  Comment (ignored)

Arbeitsteil:

"           For each element in the array at the top of the stack. Since it is a number,
            which is the same as a length-1 array, the following is executed once
  j         Input string
  9L        Push array [0, 1j]
  Q2/       Add 1, divide by 2: transforms into [1/2, (1+1j)/2]
  )         Use as index. [1/2, (1+1j)/2] is interpreted as 1/2:(end+1)/2, which is
            rounded to 1:(1+end)/2. So this takes elements from first to half,
            including both

Ein weiteres Dummy-Teil:

   %";      Comment (ignored)
            Implicitly display the previously obtained string

4

𝔼𝕊𝕄𝕚𝕟 / Javascript ES6, 55 Zeichen

this._?Σ(`ï+ï.Ħ⬮.Đ1`):(x=prompt()).slice(0,-x.length/2)

Try it here (ES6 browsers only).

Palindromiert in 𝔼𝕊𝕄𝕚𝕟, depalindromiert in Javascript ES6.

Ich dachte, dass dies einfach sein würde, da 𝔼𝕊𝕄𝕚𝕟 auf ES6 kompiliert wird und die meisten ES6-Anwendungen in 𝔼𝕊𝕄𝕚𝕟 ausgeführt werden können. Anscheinend liege ich völlig falsch.

Erläuterung

this._prüft, ob eine Variable _im globalen Bereich existiert; 𝔼𝕊𝕄𝕚𝕟 verwendet Lodash und hat daher _gespeichert, reines ES6 jedoch nicht.

Das 𝔼𝕊𝕄𝕚𝕟-Segment - Σ(`ï+ï.Ħ⬮.Đ1`)- wertet aus der Zeichenfolge den Code aus, der die Eingabe palindromisiert. Normalerweise wäre das der Code ï+ïĦ⬮Đ1, aber ich habe die Punkte eingefügt, um den Compiler glücklich zu machen .

Das Javascript-Segment - (x=prompt()).slice(0,-x.length/2)- depalindromiert eine Zeichenfolge an einer Eingabeaufforderung.


Ich wollte eine Funktion verwenden (damit musste ich mich nicht befassen prompt), aber die Bewertungsfunktion von 𝔼𝕊𝕄𝕚𝕟 mochte das nicht, also benutzte ich promptund keine Funktion, um den Compiler glücklich zu machen .


Wow, der Compiler ist wählerisch.
HyperNeutrino

4

JavaScript ES6 / JavaScript ES3, 143 Byte

function(x){'use strict';function a(){return x+x.split('').reverse().slice(1).join('')}{function a(){return x.slice(0,-x.length/2)}}return a()}

Palindromiert in JavaScript ES6, depalindromiert in JavaScript ES3. Nicht konkurrierend , es ist nur ein Versuch, einen Polyglott für zwei Versionen derselben Sprache zu erstellen.

In ES3 sind Funktionen in Blöcken zulässig, aber da Blöcke keine Bereiche definieren, ersetzt die neue Funktion nur die erste Funktion. Im strikten ES5-Modus schlägt dies fehl, da Funktionen nicht in Blöcken definiert werden können. In ES6 ist dies zulässig, und da Blöcke jetzt Bereiche definieren, wird die erste Funktion nicht ersetzt.

Getestet in Internet Explorer 5 (emuliert) für ES3 und Node.JS sowie Firefox für ES6.


4

Gelee / Marmelade, 15 14 Zeichen

q_,2./m]<e#¶ŒB

-1 Zeichen dank 42545 (ETHproductions)

Probieren Sie es online! (Gelee) (Palindromisierung)

CJam Interpreter (Depalindromization)

Jelly Erklärung:

In Jelly ist dasselbe wie \n, also sieht Jelly Folgendes:

q_,2./m]<e#
ṖṚṭ

ṖṚṭ         Main link. Arguments: z
Ṗ           Pop
 Ṛ          Reverse
  ṭ         Append
   ⁸        (implicit) z

CJam Erklärung:

In CJam ist alles nach e#einer Zeile ein Kommentar. Das sieht CJam also so:

q_,2./m]< Code
q         All input
 _        Duplicate
  ,       Length
   2.     2.0
     /    Float division
      m]  Ceil
        < Take

@ETHproductions Hoppla, ich habe es vergessen! Es heißt "Bounce", deshalb.
Erik der Outgolfer

4

Perl / JavaScript, 73 Bytes

Perl gibt ein Palindrom zurück und JavaScript deaktiviert die Eingabezeichenfolge.

s=prompt();console.log(s.slice(0,-s.length/2));eg=1;t=eg;s=$=reverse$_=eg

JavaScript

Angenommen, die Zeichenfolge ist bereits ein gültiges Palindrom.

Die ganze Arbeit findet im ersten Abschnitt statt:

s=prompt();console.log(s.slice(0,-s.length/2));

Speichert die Eingabe in sund gibt dann die erste Hälfte (aufgerundet) der Zeichenfolge zurück. Der Rest des Skripts besteht aus sinnlosen Variablenzuweisungen:

eg=1;t=eg;s=$=reverse$_=eg

Probieren Sie es hier aus:

s=prompt();console.log(s.slice(0,-s.length/2));eg=1;t=eg;s=$=reverse$_=eg

Perl

Muss ausgeführt werden mit -plzB:

perl -ple 's=prompt();console.log(s.slice(0,-s.length/2));eg=1;t=eg;s=$=reverse$_=eg' <<< 'test'
# returns testtset

Der Code besteht im Grunde aus zwei Substitutionen ( s///), die jedoch =als Begrenzer verwendet werden anstelle von /:

s/prompt();console.log(s.slice(0,-s.length\/2));eg/1;t/eg;s/$/reverse$_/eg

Das erste Ersetzen prompt();console.log(s.slice(0,-s.length\/2));eg(was zugegebenermaßen Ihre Zeichenkette durcheinander bringt, wenn es etwas wie "prompt;console.logs.slice0,-s.length/2;eg"... enthält ), mit 1;tdem evaled zurückgegeben wird t, das zweite Ersetzen das Ende der Zeichenkette ( $), mit reverse$_dem dann aucheval Ersetzen ed und die ursprüngliche Quelle angehängt wird Zeichenfolge umgekehrt.

Probieren Sie es online!


3

Python 2 / Nim , 76 74 Bytes

#[
s=input();print s+s[-2::-1]#let s=stdin.readLine;echo s[0..s.len div 2]

Palindromiert in Python, depalindromiert in Nim. Missbrauch der Kommentarsyntax.

Python und Nim werden beide #für Kommentare verwendet. Python unterstützt überhaupt keine Blockkommentare (mit Ausnahme von mehrzeiligen Zeichenfolgen mit """), Nim jedoch mit#[ comment ]# .

Wir missbrauchen dies, um das Python (am Anfang) für Nim auszukommentieren und dann das Trailing zu verwenden ] im Python, um den Nim-Code zu starten, der wie ein Kommentar für Python aussieht.

Der Python-Code muss in Anführungszeichen gesetzt werden. Der Nim-Code hat diese Einschränkung nicht.

Getestet auf Python 2.7.8 und Nim 0.14.2.

Ideone es! - Python 2, palindromisierend

Ideone es! - Nim, depalindromizing Anscheinend unterstützt die von Nim Ideone verwendete Version (0.11.2) keine mehrzeiligen Kommentare. Funktioniert auf Nim 0.14.2.




2

Japt / JavaScript, 63 Zeichen

Lektion des Tages: Japt / JavaScript-Polyglots sind immer eine schlechte Idee ...

$Oq=1;$Oq &&0
alert(($U=prompt()).slice(0*$U,-$U.length/2));$Uê

JavaScript

Die erste Zeile setzt die Variable $Oqauf 1 und führt dann ein No-Op mit aus$Oq &&0 .

In der zweiten Zeile wird der Benutzer aufgefordert $U, eine Eingabezeichenfolge einzugeben, diese der Variablen zuzuweisen und dann vom Index 0*$U(immer 0) zum Index zu verschieben -$U.length/2. Dies führt die notwendige Depalindromisierung durch; Das Ergebnis wird dann alertbearbeitet. Das Programm endet bei einem ReferenceError weil Variable$Uê keine definiert ist.

Japt

In Japt wird alles zwischen Dollarzeichen direkt in den transpilierten Quellcode eingefügt. Davon abgesehen wird jeder Kleinbuchstabe zu z. B. transpiliert .q(, es sei denn, das vorherige Zeichen war ein anderer Kleinbuchstabe, und in diesem Fall wird es "q". Ein Leerzeichen wird transpiliert )und alle fehlenden Parens werden automatisch hinzugefügt. Das obige Programm überträgt sich ungefähr auf:

Oq=1;O.q()&&0
.a("l".e("r".t((U=prompt()).slice(0*U,-U.length/2))));U.ê()

Dies wird dann als JavaScript ausgeführt. Oq=1;Setzt die Variable Oqauf 1. Dies wird nie wieder verwendet, es ist also ein No-Op. O.q()ist eine Funktion, die STDOUT löscht und zurückgibt undefined. Dies ist falsch, daher &&0 .a("l".e(...wird nicht der gesamte Teil ausgeführt.

Der einzige Teil, der wirklich zählt, ist U.ê(). Implizite Eingabe fügt die Eingabezeichenfolge ein U, .ê()verwandelt sie in ein Palindrom, und implizite Ausgabe sendet das Ergebnis an STDOUT.


Wenn Funktionseinträge zulässig sind, funktioniert Folgendes für 34 Zeichen:

X=>($X=X).slice(0,-X.length/2);$Uê

Der erste Teil definiert eine ES6-Funktion, aber es ist immer noch ein volles Programm in Japt. Testen Sie es online!


2

Java / Brainfuck, 71 Bytes

/*+[,>]<[<]>[.>]<<[.<][*/a->a.substring(0,Math.ceil(a.length()/2d));//]

Palindromiert in BF, depalindromiert in Java.

Aus Gründen der Klarheit ist dies für den BF-Interpreter wichtig:

+[,>]<[<]>[.>]<<[.<][->,..]

Dabei wird die letzte Schleife, die Zeichen aus dem Java-Lambda enthält, übersprungen, da der Zeiger an dieser Stelle auf ein Nullzeichen zeigt.


0

05AB1E / Java 8, 102 Zeichen

//¹ûq
interface M{static void main(String[]a){System.out.print(a[0].substring(0,a[0].length()/2+1));}}

Palindromize in 05AB1E.
Depalindromize in Java 8.

Erläuterung 05AB1E:

//     # No-ops
¹      # First input
 û     # Palindromize it
  q    # Terminate the program
interface M{static void main(String[]a){System.out.print(a[0].substring(0,a[0].length()/2+1));}}
       # No-ops

Erklärung Java 8:

//¹ûq                           // No-ops
interface M{                    // Class
  static void main(String[]a){  //  Mandatory main-method
    System.out.print(           //   Print to STDOUT:
      a[0].substring(0,         //    The substring of the input-argument from index 0 to
        a[0].length()/2+1));}}  //    the length of the input integer-divided by 2 plus 1
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.