Polyglot palindrome

15

Tugas Anda adalah menulis program yang berjalan dalam dua bahasa yang berbeda, dan melakukan hal berikut:

  • Dalam satu bahasa, palindromizes string yang diberikan.
    • Ambil talinya. abcde
    • Balikkan string. edcba
    • Hapus karakter pertama. dcba
    • Rekatkan ke string asli. abcdedcba
  • Dalam bahasa lain, ini akan menghilangkan string yang diberikan.
    • Ambil string yang palidromized dengan metode di atas. abcdedcba
    • Dapatkan karakter dari awal hingga tengah. abcde

Ingat, ini adalah , jadi kode dengan karakter paling sedikit (bukan byte) menang.

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language 1/Language 2, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika ada yang ingin Anda sertakan beberapa nomor di header (misalnya karena skor Anda adalah jumlah dari dua file atau Anda ingin daftar juru hukuman bendera secara terpisah), memastikan bahwa skor aktual adalah terakhir nomor dalam header:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

Oliver Ni
sumber
@LuisMendo Satu detik ...
Oliver Ni
@LuisMendo Oke, saya telah memperbarui quesiton
Oliver Ni
Apakah string akan berisi baris baru?
Erik the Outgolfer
Bisakah format input berbeda dalam dua bahasa? Seperti string dengan tanda kutip terlampir atau tanpa tanda kutip
Luis Mendo
@LuisMendo Ya.
Oliver Ni

Jawaban:

14

05AB1E / MATL , 10 9 karakter

9LQ2/)%¹û

Di 05AB1E ini palindromizes . Dalam MATL ia melakukan depalindromizes .

Penjelasan dalam 05AB1E

Bagian kode ini tidak melakukan apa pun (secara global):

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 

Ini adalah bagian yang berfungsi:

¹     Push input again
û     Palindromize. Implicitly display

Penjelasan dalam MATL

Ini adalah bagian yang berfungsi:

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

Ini diabaikan:

%¹û   Everything after '%' is a comment
Luis Mendo
sumber
12

05AB1E / Jelly , 6 karakter

Palindromize di 05AB1E.
Depalindromizes dalam Jelly.

œs2Ḣ¹û

Cobalah di 05AB1E

Penjelasan 05AB1E

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

Cobalah di Jelly

Penjelasan Jelly

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

Python 3 / JavaScript, 83 karakter

Disimpan 2 byte berkat @LevitatingLion

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

Python palindromizes , JavaScript depalindromizes .

Saya mencoba menjaga lebih banyak kode yang konstan di antara keduanya, tetapi saya tidak tahu cara yang baik untuk menyelinap .sliceke Python. Inilah metode alternatif:

1//2;prompt=input,alert=print
x=prompt();1//2;x+=x[-2::-1]);"""
x=x.slice(0,-x.length/2))//"""
alert(x)
Produksi ETH
sumber
Anda dapat mengganti x[::-1][1:]dengan x[-2::-1]untuk menyimpan dua karakter.
LevitatingLion
@LevitatingLion Terima kasih! Saya telah mencoba mencari cara untuk menggabungkan dua irisan, tetapi sepertinya tidak ada yang berhasil.
ETHproduksi
5

Scala / Javascript, 106 byte

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

Palindromize dalam scala dan depalindromizes dalam javascript.

Cobalah di ideone (scala) - Peringatan: penyorotan sintaksis salah

Cobalah di jsfiddle (javascript).

Penjelasan:

Scala, seperti java, memproses unicode lolos sebelum yang lainnya, jadi scalac melihat kode seperti ini:

/**/                                //\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

Javascript akan diuraikan seperti ini:

/*\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
corvus_192
sumber
4

CJam / MATL , 18 karakter

r_W%(;
"j9LQ2/)%";

Dalam CJam ini palindromizes . Dalam MATL ia melakukan depalindromizes .

Penjelasan dalam CJam

Bagian kerja:

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

Bagian dummy:

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

Penjelasan dalam MATL

Bagian dummy:

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

Bagian kerja:

"           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

Bagian boneka lain:

   %";      Comment (ignored)
            Implicitly display the previously obtained string
Luis Mendo
sumber
4

𝔼𝕊𝕄𝕚𝕟 / Javascript ES6, 55 karakter

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

Try it here (ES6 browsers only).

Palindromize di 𝔼𝕊𝕄𝕚𝕟, depalindromizes di Javascript ES6.

Saya pikir ini akan mudah, karena 𝔼𝕊𝕄𝕚𝕟 mengkompilasi ke ES6 dan sebagian besar ES6 dapat dijalankan di 𝔼𝕊𝕄𝕚𝕟. Rupanya, saya benar-benar salah.

Penjelasan

this._memeriksa untuk melihat apakah _ada variabel dalam lingkup global; 𝔼𝕊𝕄𝕚𝕟 menggunakan Lodash dan karenanya telah _disimpan, tetapi ES6 murni tidak.

Segmen 𝔼𝕊𝕄𝕚𝕟 - Σ(`ï+ï.Ħ⬮.Đ1`)- mengevaluasi dari string kode yang palindromizes input. Biasanya, kodenya ï+ïĦ⬮Đ1, tapi saya meletakkan titik-titik untuk membuat kompiler senang .

Segmen Javascript - (x=prompt()).slice(0,-x.length/2)- mendepromindorisasi string dari prompt.


Saya akan menggunakan fungsi (jadi saya tidak harus berurusan dengan prompt), tetapi fungsi evaluasi 𝔼𝕊𝕄𝕚𝕟 tidak seperti itu, jadi saya menggunakan promptdan tidak ada fungsi untuk membuat kompiler bahagia .

Mama Fun Roll
sumber
Wow, pemilih kompiler.
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()}

Palindromizes dalam JavaScript ES6, depalindromizes dalam JavaScript ES3. Tidak bersaing , itu hanya mencoba membuat polyglot untuk dua versi dari bahasa yang sama.

Dalam fungsi ES3 diizinkan dalam blok, tetapi karena blok tidak mendefinisikan cakupan, fungsi baru hanya menggantikan fungsi pertama. Dalam mode ketat ES5 gagal karena tidak memungkinkan fungsi didefinisikan dalam blok. Di ES6 diizinkan dan, karena blok sekarang mendefinisikan cakupan, fungsi pertama tidak diganti.

Diuji di Internet Explorer 5 (ditiru) untuk ES3 dan Node.JS dan Firefox untuk ES6.

Gustavo Rodrigues
sumber
4

Jelly / CJam, 15 14 karakter

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

-1 char terima kasih untuk 42545 (ETHproductions)

Cobalah online! (Jelly) (Palindromisasi)

Penerjemah CJam (Depalindromization)

Penjelasan jelly:

Dalam Jelly, sama dengan \n, jadi inilah yang Jelly lihat:

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

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

Penjelasan CJam:

Di CJam, semua yang terjadi setelah e#satu baris adalah komentar. Jadi, inilah yang dilihat CJam:

q_,2./m]< Code
q         All input
 _        Duplicate
  ,       Length
   2.     2.0
     /    Float division
      m]  Ceil
        < Take
Erik the Outgolfer
sumber
@ ETHproductions Whoops, saya lupa itu! Itu disebut "bouncing", itu sebabnya.
Erik the Outgolfer
4

Perl / JavaScript, 73 byte

Perl mengembalikan palindrome dan JavaScript 'de-palindromizes' string input.

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

JavaScript

Mengasumsikan string sudah merupakan palindrome yang valid.

Semua pekerjaan terjadi di bagian pertama:

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

Menyimpan input s, lalu mengembalikan bagian pertama (dibulatkan) dari string. Sisa skrip adalah penugasan variabel tak berguna:

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

Coba di sini:

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

Perl

Harus dijalankan dengan -pl, misalnya:

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

Kode ini pada dasarnya adalah dua substitusi ( s///), tetapi menggunakan =sebagai pembatas alih-alih /:

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

Yang pertama, mengganti prompt();console.log(s.slice(0,-s.length\/2));eg(yang, diakui akan mengacaukan string Anda jika berisi sesuatu seperti "prompt;console.logs.slice0,-s.length/2;eg"...) 1;tyang sudah evaldiedit, kembalit , yang kedua menggantikan ujung string ( $) reverse$_yang kemudian juga evaldiedit dan menambahkan sumber asli string dibalik.

Cobalah online!

Dom Hastings
sumber
3

Python 2 / Nim , 76 74 byte

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

Palindromize dengan Python, depalindromizes dalam Nim. Sintaks komentar penyalahgunaan.

Python dan Nim keduanya digunakan #untuk komentar. Python tidak mendukung komentar blok sama sekali (kecuali untuk string multiline dengan """), tetapi Nim melakukannya dengan#[ comment ]# .

Kami menyalahgunakan ini untuk mengomentari Python (di awal) untuk Nim, kemudian menggunakan trailing ]di Python untuk memulai kode Nim, tampak seperti komentar untuk Python.

Kode Python membutuhkan inputnya dikelilingi dengan tanda kutip. Kode Nim tidak memiliki batasan ini.

Diuji pada Python 2.7.8 dan Nim 0.14.2.

Ide itu! - Python 2, palindromisasi

Ide itu! - Nim, depalindromizing Rupanya versi Nim Ideone menggunakan (0.11.2) tidak mendukung komentar multiline. Bekerja pada Nim 0.14.2.

Tembaga
sumber
2

Japt / JavaScript, 63 karakter

Pelajaran hari ini: Poliglot Japt / JavaScript selalu merupakan ide yang buruk ...

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

JavaScript

Baris pertama mengatur variabel $Oqke 1, kemudian melakukan no-op dengan $Oq &&0.

Baris kedua meminta pengguna untuk memasukkan string, menugaskannya ke variabel $U, lalu mengirisnya dari indeks 0*$U(selalu 0) untuk diindeks -$U.length/2. Ini melakukan depalindromisasi yang diperlukan; hasilnya kemudian alertdiedit. Program berakhir pada ReferenceError karena variabel $Uêtidak didefinisikan.

Japt

Di Japt, apa pun di antara tanda dolar dimasukkan langsung ke kode sumber yang ditranskripsikan. Selain itu, setiap huruf kecil berubah menjadi misalnya .q(, kecuali karakter sebelumnya adalah huruf kecil lain, dalam hal ini menjadi "q". Ruang diubah menjadi ), dan semua paren yang hilang ditambahkan secara otomatis. Program di atas mentransformasikan secara kasar ke:

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

Ini kemudian dieksekusi sebagai JavaScript. Oq=1;set variabel Oqmenjadi 1. Ini tidak pernah digunakan lagi, jadi ini adalah no-op. O.q()adalah fungsi yang menghapus STDOUT dan mengembalikan undefined; ini palsu, sehingga seluruh &&0 .a("l".e(...bagian tidak dieksekusi.

Satu-satunya bagian yang sangat penting adalah U.ê(). Input implisit menempatkan string input ke dalam U, .ê()mengubahnya menjadi palindrom, dan output implisit mengirimkan hasilnya ke STDOUT.


Jika entri fungsi diizinkan, yang berikut ini akan berfungsi selama 34 karakter:

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

Bagian pertama mendefinisikan fungsi ES6, tetapi masih merupakan program lengkap di Japt. Uji secara online!

Produksi ETH
sumber
2

Java / Brainfuck, 71 byte

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

Palindromize dalam BF, depalindromizes di Jawa.

Demi kejelasan, inilah yang penting bagi juru bahasa BF:

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

di mana loop terakhir yang mengandung karakter dari Java lambda dilewati karena pointer menunjuk ke karakter nol pada titik itu.

pengguna8397947
sumber
0

05AB1E / Java 8, 102 karakter

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

Palindromize di 05AB1E.
Depalindromize di Java 8.

Penjelasan 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

Penjelasan 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
Kevin Cruijssen
sumber