Palindrome polyglot


15

งานของคุณคือการเขียนโปรแกรมที่ทำงานในสองภาษาที่ต่างกันและทำสิ่งต่อไปนี้:

  • ในหนึ่งภาษามันจะทำให้เป็นสตริงที่กำหนด
    • รับสาย abcde
    • ย้อนกลับสตริง edcba
    • ลบอักขระตัวแรก dcba
    • กาวลงบนสตริงเดิม abcdedcba
  • ในภาษาอื่นมันจะลดความแปรปรวนของสตริงที่กำหนด
    • ใช้สตริง palidromized โดยวิธีการดังกล่าว abcdedcba
    • รับตัวละครตั้งแต่ต้นจนกลาง abcde

โปรดจำไว้ว่านี่คือดังนั้นโค้ดที่มีอักขระน้อยที่สุด(ไม่ใช่ไบต์) จะชนะ

ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language 1/Language 2, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในบรรทัดแรกโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของสองไฟล์หรือคุณต้องการแสดงรายการการลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

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


@LuisMendo หนึ่งวินาที ...
Oliver Ni

@LuisMendo เอาล่ะฉันได้อัปเดต quesiton แล้ว
Oliver Ni

สตริงจะมีการขึ้นบรรทัดใหม่หรือไม่
Erik the Outgolfer

รูปแบบการป้อนข้อมูลสามารถแตกต่างกันในสองภาษาหรือไม่ เช่นเดียวกับสตริงที่มีเครื่องหมายคำพูดล้อมรอบหรือไม่มี
Luis Mendo

@LuisMendo ใช่
Oliver Ni

คำตอบ:


14

05AB1E / MATL , 10 9 ตัวอักษร

9LQ2/)%¹û

ใน 05AB1E นี้palindromizes ในMATLมันจะลดระดับลง

คำอธิบายใน 05AB1E

ส่วนหนึ่งของรหัสนี้ไม่ได้ทำอะไร (ทั่วโลก):

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 

นี่คือส่วนที่ทำงาน:

¹     Push input again
û     Palindromize. Implicitly display

คำอธิบายใน MATL

นี่คือส่วนที่ทำงาน:

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

สิ่งนี้จะถูกละเว้น:

%¹û   Everything after '%' is a comment

12

05AB1E / Jelly , 6 ตัวอักษร

ทำให้เป็นมาตรฐานใน 05AB1E
ลดความซับซ้อนในเจลลี่

œs2Ḣ¹û

ลองใช้ใน 05AB1E

05AB1E คำอธิบาย

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

ลองในเยลลี่

คำอธิบายของเยลลี่

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

6

Python 3 / JavaScript, 83 ตัวอักษร

บันทึก 2 ไบต์ขอบคุณ @LevitatingLion

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

งูหลามpalindromizes , JavaScript depalindromizes

ฉันพยายามคงโค้ดให้คงที่มากขึ้นระหว่างทั้งสอง แต่ฉันไม่สามารถหาวิธีที่ดีในการแอบ.sliceเข้าไปใน Python ได้ นี่คือวิธีอื่น:

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

คุณสามารถแทนที่x[::-1][1:]ด้วยx[-2::-1]เพื่อบันทึกสองตัวอักษร
LevitatingLion

@LevitatingLion ขอขอบคุณ! ฉันพยายามหาวิธีรวมสองชิ้นเข้าด้วยกัน แต่ดูเหมือนจะไม่มีอะไรเกิดขึ้น
ETHproductions

5

Scala / Javascript, 106 ไบต์

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

ทำให้เป็น Palindromizes ใน scala และลดระดับลงใน javascript

ลองใช้กับideone (สกาล่า) - คำเตือน: การเน้นไวยากรณ์ผิด

ลองใช้กับjsfiddle (javascript)

คำอธิบาย:

Scala เช่น java ประมวลผล unicode escapes ก่อนทุกอย่างดังนั้น scalac จะเห็นโค้ดดังนี้:

/**/                                //\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 ได้รับการแยกวิเคราะห์ดังนี้:

/*\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 ตัวอักษร

r_W%(;
"j9LQ2/)%";

ใน CJam นี้palindromizes ในMATLมันจะลดระดับลง

คำอธิบายใน CJam

ส่วนการทำงาน:

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

ส่วนหุ่น:

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

คำอธิบายใน MATL

ส่วนหุ่น:

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

ส่วนการทำงาน:

"           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

อีกส่วนที่หลอกตา:

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

4

𝔼𝕊𝕄𝕚𝕟 / Javascript ES6, 55 ตัวอักษร

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

Try it here (ES6 browsers only).

ทำให้เป็นมาตรฐานใน𝔼𝕊𝕄𝕚𝕟, ลดระดับความน่าเชื่อถือใน Javascript ES6

ฉันว่าสิ่งนี้จะเป็นเรื่องง่ายเนื่องจาก𝔼𝕊𝕄𝕚𝕟รวบรวมกับ ES6 และ ES6 ส่วนใหญ่สามารถทำงานใน in ได้ เห็นได้ชัดว่าฉันผิดอย่างสมบูรณ์

คำอธิบาย

this._ตรวจสอบเพื่อดูว่า_มีตัวแปรอยู่ในขอบเขตส่วนกลางหรือไม่ 𝔼𝕊𝕄𝕚𝕟ใช้ Lodash และดังนั้นจึงมี_จัดเก็บไว้ แต่ ES6 แท้ๆไม่ได้ทำ

เซกเมนต์ - - Σ(`ï+ï.Ħ⬮.Đ1`)- ประเมินจากสตริงรหัสที่ให้ป้อนอินพุต ปกติรหัสจะเป็นï+ïĦ⬮Đ1แต่ฉันใส่จุดในการทำให้คอมไพเลอร์มีความสุขทำให้มีความสุขคอมไพเลอร์

ส่วน Javascript - (x=prompt()).slice(0,-x.length/2)- depalindromizes สตริงจากพรอมต์


ผมจะใช้ฟังก์ชั่น (ดังนั้นฉันไม่ได้มีการจัดการกับprompt) แต่ฟังก์ชั่นการประเมินผลของ𝔼𝕊𝕄𝕚𝕟ไม่เช่นนั้นดังนั้นผมจึงใช้promptและฟังก์ชั่นที่จะทำให้มีความสุขคอมไพเลอร์


ว้าวคอมไพเลอร์ของพิถีพิถัน
HyperNeutrino

4

JavaScript ES6 / JavaScript ES3, 143 ไบต์

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()}

ทำให้เป็นแนวร่วมใน JavaScript ES6, ยกเลิกการจัดวางใหม่ใน JavaScript ES3 ไม่ใช่การแข่งขันแต่เป็นความพยายามที่จะสร้างหลายภาษาสำหรับภาษาเดียวกันสองเวอร์ชัน

ในฟังก์ชั่น ES3 ได้รับอนุญาตในบล็อก แต่ในขณะที่บล็อกไม่ได้กำหนดขอบเขตฟังก์ชั่นใหม่เพียงแค่แทนที่ฟังก์ชั่นแรก ในโหมดเข้มงวด ES5 มันล้มเหลวเพราะมันไม่อนุญาตให้กำหนดฟังก์ชันในบล็อก ใน ES6 ได้รับอนุญาตและเนื่องจากขณะนี้บล็อคกำหนดขอบเขตแล้วฟังก์ชันแรกจะไม่ถูกแทนที่

ทดสอบใน Internet Explorer 5 (จำลอง) สำหรับ ES3 และ Node.JS และ Firefox สำหรับ ES6


4

Jelly / CJam, 15 14 ตัวอักษร

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

-1 ถ่านขอบคุณ 42545 (ETH ผลิตภัณฑ์)

ลองออนไลน์! (Jelly) (การทำให้เป็นก้อน)

ล่าม CJam (Depalindromization)

คำอธิบายของเยลลี่:

ในเยลลี่นั้นเหมือนกับ\nดังนั้นนี่คือสิ่งที่เจลลี่เห็น:

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

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

คำอธิบายของ CJam:

ใน CJam ทุกอย่างที่e#อยู่ในสายเป็นการแสดงความคิดเห็น ดังนั้นนี่คือสิ่งที่ CJam เห็น:

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

@ ETHproductions อ๊ะฉันลืมมัน! มันเรียกว่า "เด้ง" นั่นเป็นเหตุผล
Erik the Outgolfer

4

Perl / JavaScript, 73 ไบต์

Perl ส่งคืน palindrome และ 'de-palindromizes' สตริงการป้อนข้อมูลของ JavaScript

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

JavaScript

ถือว่าเป็นสตริงที่ถูกต้องแล้ว

งานทั้งหมดเกิดขึ้นในส่วนแรก:

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

เก็บอินพุตในsจากนั้นส่งคืนครึ่งแรก (ปัดเศษขึ้น) ของสตริง ส่วนที่เหลือของสคริปต์คือการกำหนดตัวแปรแบบไม่มีจุดหมาย:

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

ลองที่นี่:

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

Perl

ต้องทำงานด้วย-plเช่น:

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

โค้ดนั้นใช้แทนตัวอักษรสองตัว ( s///) แต่ใช้=เป็นตัวคั่นแทน/:

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

การแทนที่ครั้งแรกprompt();console.log(s.slice(0,-s.length\/2));eg(ซึ่งยอมรับว่าจะทำให้สตริงของคุณยุ่งเหยิงหากมันมีบางสิ่งที่เหมือน"prompt;console.logs.slice0,-s.length/2;eg"... ) 1;tซึ่งเป็นevaled, return t, อันที่สองจะแทนที่ส่วนท้ายของสตริง ( $) reverse$_ซึ่งยังเป็นเช่นนั้นeval ed แล้วต่อท้ายต้นฉบับดั้งเดิม ย้อนกลับสตริง

ลองออนไลน์!


3

งูหลาม 2 / นิ่ม , 76 74 ไบต์

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

ทำให้เป็นก้อนกลมใน Python, ลดระดับลงใน Nim การละเมิดความคิดเห็นไวยากรณ์

Python และ Nim ใช้#สำหรับความคิดเห็น Python ไม่สนับสนุนความคิดเห็นบล็อกเลย (ยกเว้นสตริงหลายบรรทัดด้วย""" ) #[ comment ]#แต่นิ่มจะมี

เราใช้สิ่งนี้เพื่อแสดงความคิดเห็น Python (ที่จุดเริ่มต้น) สำหรับ Nim จากนั้นใช้การติดตาม ]ใน Python เพื่อเริ่มรหัส Nim ดูเหมือนว่าเป็นความคิดเห็นของ Python

รหัสหลามต้องการอินพุตที่ล้อมรอบด้วยเครื่องหมายคำพูด รหัส Nim ไม่มีข้อ จำกัด นี้

ทดสอบกับ Python 2.7.8 และ Nim 0.14.2

ไอเดียมัน! - Python 2, palindromizing

ไอเดียมัน! - นิ่มการลดขนาดลงชัดเจนว่าเวอร์ชันของ Nim Ideone ใช้ (0.11.2) ไม่สนับสนุนความคิดเห็นหลายบรรทัด ทำงานบน Nim 0.14.2




2

Japt / JavaScript, 63 ตัวอักษร

บทเรียนประจำวัน: Polyglots ของ Japt / JavaScript เป็นความคิดที่ไม่ดีเสมอ ...

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

JavaScript

บรรทัดแรกกำหนดตัวแปร$Oq1 แล้วดำเนินการไม่มี-op $Oq &&0กับ

บรรทัดที่สองแจ้งให้ผู้ใช้สายป้อนที่กำหนดให้กับตัวแปร$Uแล้วชิ้นได้จากดัชนี0*$U(เสมอ 0) -$U.length/2การจัดทำดัชนี สิ่งนี้ทำ depalindromization ที่จำเป็น ผลที่ได้คือalerted โปรแกรมลงท้ายด้วย ReferenceError เนื่องจากตัวแปร$Uêไม่ได้ถูกกำหนดไว้

Japt

ใน Japtet สิ่งใดระหว่างเครื่องหมายดอลลาร์จะถูกแทรกโดยตรงในซอร์สโค้ด transpiled อื่น ๆ กว่าที่แต่ละตัวพิมพ์เล็ก transpiles จดหมายถึงเช่นเว้นแต่ถ่านก่อนหน้านี้เป็นตัวอักษรตัวพิมพ์เล็กอีกซึ่งในกรณีนี้มันจะกลายเป็น.q( "q"ช่องว่างถูก transpiled )และ parens ที่หายไปทั้งหมดจะถูกเพิ่มโดยอัตโนมัติ โปรแกรมด้านบน transpiles ประมาณถึง:

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

สิ่งนี้ถูกเรียกใช้งานเป็น JavaScript Oq=1;ตั้งค่าตัวแปรOqเป็น 1 สิ่งนี้ไม่เคยถูกใช้อีกครั้งดังนั้นจึงไม่มีการใช้งาน O.q()เป็นฟังก์ชั่นที่ล้าง STDOUT และส่งคืนundefined; นี่เป็นเท็จดังนั้น&&0 .a("l".e(...ส่วนทั้งหมดจะไม่ถูกดำเนินการ

U.ê()เป็นเพียงส่วนหนึ่งที่มีความสำคัญจริงๆ การป้อนข้อมูลโดยปริยายทำให้สายป้อนในU,.ê()เปลี่ยนมันเป็น palindrome และการส่งออกโดยปริยายส่งผลให้ STDOUT


หากอนุญาตให้ใช้ฟังก์ชันรายการสิ่งต่อไปนี้จะใช้ได้กับ 34 ตัวอักษร:

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

ส่วนแรกกำหนดฟังก์ชั่น ES6 แต่ก็ยังเป็นโปรแกรมเต็มรูปแบบใน Japt ทดสอบออนไลน์!


2

Java / Brainfuck, 71 ไบต์

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

Palindromizes ใน BF, depalindromizes ใน Java

เพื่อความชัดเจนนี่คือสิ่งที่สำคัญสำหรับล่าม BF:

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

โดยที่ลูปสุดท้ายที่มีอักขระจาก Java แลมบ์ดาถูกข้ามเนื่องจากตัวชี้ชี้ไปที่อักขระโมฆะที่จุดนั้น


0

05AB1E / Java 8, 102 ตัวอักษร

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

ทำให้เป็นสนิมใน 05AB1E
Depalindromize ใน Java 8

คำอธิบาย 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

คำอธิบาย 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.