Polyglot ที่ถูก จำกัด


20

Polyglots เป็นโปรแกรมที่ใช้ได้ในหลายภาษาการเขียนโปรแกรมพร้อมกัน รูปหลายเหลี่ยมดังกล่าวส่วนใหญ่เขียนในลักษณะที่โครงสร้างบางอย่างของภาษาหนึ่งถูกตีความว่าเป็นความคิดเห็นของภาษาอื่น (เช่น#defineในภาษา C ถูกตีความว่าเป็นความคิดเห็นในหลายภาษาสคริปต์)

ฉันอยากรู้ว่ามันเป็นไปได้ไหมที่จะสร้างรูปหลายเหลี่ยมที่ไม่มีความคิดเห็นซึ่งไม่มีความคิดเห็น แต่ก็เปลี่ยนทันทีเมื่อคุณลบตัวอักษรที่ไม่ใช่ช่องว่างออกฉันจึงขอให้คุณลองใช้โปรแกรมเช่นนั้น

กฎที่เป็นรูปธรรมมีดังนี้:

  1. (ขาออก) โปรแกรมของคุณต้องสร้างเอาต์พุตบางส่วนบนคอนโซลภายใต้แต่ละภาษาของคุณ นั่นคือโปรแกรมของคุณไม่ได้รับอนุญาตให้ออกโดยไม่พิมพ์อะไรเลย
  2. (ความแปรปรวน) เนื่องจากเป็นการผ่อนคลายของคำจำกัดความหลายภาษามาตรฐานเอาท์พุทของโปรแกรมอาจแตกต่างกันระหว่างภาษา
  3. (ข้อผิดพลาด) โปรแกรมของคุณจะต้องไม่สร้างข้อผิดพลาด (กำหนดอย่างกว้าง ๆ ) ภายใต้ภาษาใด ๆ ของคุณ สำหรับภาษาส่วนใหญ่จะถูกกำหนดให้ส่งคืนโค้ดออกที่ไม่เป็นศูนย์จากคอมไพเลอร์และ / หรือล่าม
  4. ( จำกัด ) การกำจัดของตัวละครที่ไม่ใช่ช่องว่างใด ๆ เดียวจากรหัสของคุณควรจะทำให้โปรแกรมของคุณจะเปลี่ยนพฤติกรรมของตนภายใต้ทุกภาษาใดภาษาหนึ่งของคุณ โปรแกรมอาจ "เปลี่ยน" โดยไม่ถูกต้องสำหรับภาษานั้นหรือโดยการเปลี่ยนผลลัพธ์ที่ผลิต
  5. นี่คือความท้าทายรหัส ผู้ชนะคือโปรแกรมที่ถูกต้องในภาษาการเขียนโปรแกรมส่วนใหญ่ ความสัมพันธ์จะขาดไปเนื่องจากความยาวของโปรแกรมสั้นลง

กฎการ จำกัด ใช้ไม่ได้กับการลบอักขระหลายตัว กล่าวคือมันเป็นการดีถ้าลบอักขระหลายตัวพร้อมกันทำให้ไม่มีการเปลี่ยนแปลงในภาษาใดภาษาหนึ่งของคุณ

สังเกตว่ากฎข้อ จำกัด บ่งบอกว่าคุณไม่สามารถใช้ช่องว่างเป็นหนึ่งในภาษาของคุณได้เนื่องจากการลบอักขระที่ไม่ใช่ช่องว่างออกจะไม่เปลี่ยนพฤติกรรมของโปรแกรมช่องว่าง

นี่เป็นตัวอย่างง่ายๆของโปรแกรมที่ปฏิบัติตามข้อ จำกัด ข้างต้นทั้งหมดสำหรับภาษา Python 2 และ Python 3:

print("Hello World!")

การลบอักขระใด ๆ ในprintจะทำให้ทั้งสองภาษาโยนNameError; การลบเครื่องหมายวงเล็บเหลี่ยมหรือเครื่องหมายคำพูดจะทำให้ a SyntaxErrorและตัวอักขระสตริงใด ๆ จะเปลี่ยนผลลัพธ์ในทั้งสองภาษา (โปรดทราบว่าprint("hello", "world")เป็นโปรแกรมที่ละเอียดกว่า แต่ยังคงใช้ได้ภายใต้กฎข้างต้น)

ตัวอย่างนี้เป็นบิตง่อยเพราะ Python 2 และ Python 3 คล้ายกันมากดังนั้นฉันจะไม่ยอมรับวิธีแก้ปัญหาอื่น ๆ ที่ใช้ภาษาเดียวกันรุ่นต่าง ๆ เท่านั้น (โดยเฉพาะ Python 2 และ Python 3)


@ IngoBürk: กฎป้องกันคุณจากการเขียนภาษาที่ใช้งานได้ซึ่งเกี่ยวข้องกับช่องว่างยกเว้นว่าภาษาอื่นของคุณเป็นช่องว่างเท่านั้น
nneonneo

1
FWIW ตัวอย่างของคุณprint("Hello World!")เป็นรหัส Ruby ที่ใช้ได้
Cristian Lupascu

มันน่ารำคาญนิดหน่อยที่คำตอบง่ายๆ (เหมือนของฉัน) สำหรับ [คนพูดได้หลายภาษา] มักจะมีภาษามากมาย
Justin

5
เพื่อหลีกเลี่ยงตัวแปรภาษาหรือภาษาที่มีไวยากรณ์คล้ายกันจำนวนมากมันน่าสนใจที่จะกำหนดให้สองภาษานับว่าแตกต่างกันเฉพาะในกรณีที่โปรแกรมสร้างเอาต์พุตที่ต่างกัน
Gilles 'หยุดชั่วร้าย'

คำตอบ:


13

Bash + GolfScript + CJam

"echo" []
{ cat<&3;} \
3<""<("echo" 'p'~)

เอาท์พุต

ทุบตี:

[]
p~

GolfScript:

"echo"
echo{ cat<&3;}0

CJam:

echo{ cat<&3;}-1echop

มี\x7fส่วนท้ายของเอาต์พุตของ CJam


... เดี๋ยวก่อนมันใช้งานได้ทั้งสามภาษาโดยไม่ซ้ำซ้อนกันยังไง?
nneonneo

@nneonneo เพียงพิมพ์รหัสที่ไม่ได้ใช้ในภาษาอื่น
jimmy23013

8

Bash + Befunge

"echo" $,$,"ol":,,,@

พิมพ์ 'hello' ใน befunge


1
ฉันสามารถยืนยันได้ว่าตัวละครทุกตัว (ยกเว้นที่ว่าง) ทำอะไรบางอย่างใน Befunge ฉันไม่สามารถทำเช่นนั้นกับการทุบตี อันนี้น่าประทับใจ
Justin

7

bc, GolfScript, โฮมสปริง, huh, Octave, Scilab (0 ไบต์)

รับประกันว่าจะปฏิบัติตามกฎ 4 ไม่ใช่ผู้ชนะ แต่จะทำได้ดีในการหยุดพัก

เอาท์พุต

ก่อนคริสต์ศักราช

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

GolfScript


Homespring

In Homespring, the null program is not a quine.

ฮะ

?

เสียงคู่แปด

GNU Octave, version 3.6.4
Copyright (C) 2013 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "x86_64-redhat-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.

For information about changes from previous versions, type `news'.

Scilab

Startup execution:
  loading initial environment

-->

2
ฉันรู้ว่ามี esolang ที่ป้องกันความยาว 0 quines โดยเฉพาะการทำสิ่งนี้ (โอ้เดี๋ยวก่อนนั่นคือHomespring ) ฉันเชื่อเหรอ เอาท์พุทบางอย่าง
Justin

ขอบคุณ! น่าเศร้าที่ฉันไม่สามารถโน้มน้าวใจเหรอ? เพื่อให้ทำงานบนลินุกซ์ ...
เดนนิส

1
สิ่งที่ฉันต้องการก็คือแพ็คเกจเสริมสำหรับโมโน โปรแกรมของคุณพิมพ์What?\n?โดยวิธีการ
เดนนิส

1
ทำงานใน GNU Make ด้วย (ถ้าเป็นภาษาโปรแกรม):make: *** No targets. Stop.
jimmy23013

1
@ user23013: ถูกต้อง ในกรณีที่มันไม่ได้เป็นรายการที่ถูกต้องตั้งแต่รหัสทางออกให้เป็น 2
เดนนิส

6

GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Octave + Matlab + Scilab + Topline ที่เป็นตัวเลข +? Fueue + huh

10

ใน Golscript, PHP, CJam, มาติกา, BC, Pyth, /// และ TI-Basic, 10มันเอาท์พุท

ใน R มันส่งออก [1] 10

ใน Octave มันจะออกมา ans = 10

ใน Matlab และ Scilab ans = 10มันจะออกผลลัพธ์

ในตัวเลข Topline 0มันจะออกผลลัพธ์

ถ้าฉันเข้าใจ Fueue อย่างถูกต้องมันจะออกบรรทัดใหม่แล้วทำหน้าที่เป็นโปรแกรม cat

ใน huh? มันส่งออก

What?
?

1
นอกจากนี้ยังทำงานใน CJam
สิงหาคม

5
ฉันไม่คิดว่าควรใช้ล่ามแบบโต้ตอบ
nneonneo

2
สิ่งนี้ทำงานได้ดีในหลายภาษา แต่ไม่ได้ให้ผลผลิตในหลาย ๆ ...
Justin

1
นอกจากนี้ยังเป็นที่ถูกต้องในHTML , BC , MatlabและScilab ถ้าคุณเปลี่ยน72ไป10ก็ควรพิมพ์0ในตัวเลข Topline
เดนนิส

HTML ไม่ใช่ภาษาการเขียนโปรแกรมตามการสนทนาเมตาเนื่องจากไม่มีวิธีการทางคณิตศาสตร์อย่างง่ายหรือการวนซ้ำ
Ingo Bürk

3

ดูเหมือนว่าคำตอบนี้ไม่ถูกต้องอย่างสมบูรณ์
ฉันแก้ไขมันบางส่วนแล้วและจะปรับปรุงส่วนอื่น ๆ ในอีกไม่กี่วัน

C ++ และ Javascript

ความคิดคือ:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");
int
main()
{
puts("Hi from C++!");
}

C ++: http://codepad.org/SK2wbIDL
Javascript: เพียงคัดลอกรหัสไปยังคอนโซลของเบราว์เซอร์

และชุดของการแก้ไขเพื่อให้เป็นที่พึงพอใจ

( จำกัด ) การลบอักขระที่ไม่ใช่ช่องว่างออกจากรหัสของคุณควรทำให้โปรแกรมของคุณเปลี่ยนพฤติกรรมภายใต้ภาษาของคุณทุกภาษา โปรแกรมอาจ "เปลี่ยน" โดยไม่ถูกต้องสำหรับภาษานั้นหรือโดยการเปลี่ยนผลลัพธ์ที่ผลิต

จากด้าน Javascript:

เปลี่ยนint, mainหรือputsจะผิดพลาดกับการอ่านของตัวแปรที่ไม่ได้ประกาศ แต่boolและHi from C++!สามารถเปลี่ยนแปลงได้อย่างปลอดภัย มาแก้ไขกันเถอะ:

puts=function(){}
puts=function(s){s=='Hi from C++!'?bool:nope}

ถ้าสตริงมีค่าเท่ากันมันจะตรวจสอบการดำรงอยู่ของbool, otherwice nopeเกิดปัญหากับการที่ไม่ได้ประกาศ

ขณะนี้มีอัฒภาค 2 ต่อท้ายที่สามารถลบออกได้ ตัวแรกได้รับการแก้ไขแล้ว - เพียงลบ newline ก่อนint:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");int

อย่างที่สองคือก่อนหน้า}นี้ดังนั้นฉันต้องการข้อ จำกัด บางอย่างใช้ได้ทั้งสองภาษาและไม่จำเป็นต้องใช้เครื่องหมายอัฒภาคในตอนท้ายใน C ++ หรือการใช้เซมิโคลอนใน js ละเอียด:

while(0);

เป็นไปไม่ได้ที่จะตัดเครื่องหมายอัฒภาคใน js ตามwhileความต้องการของร่างกาย

ดังนั้นโปรแกรมในขณะนี้คือ:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(s){s=='Hi from C++!'?bool:nope};int=0");int
main()
{
puts("Hi from C++!");while(0);
}

จากด้าน C ++:

มี 2 ​​ปัญหา: evalสามารถมีชื่อใด ๆ และรหัส js ทั้งหมดสามารถเปลี่ยนแปลงได้

ฉันจะพยายามแก้ไขพวกเขาในไม่กี่วัน


2

CJam + Golfscript

โอเคมันค่อนข้างน่าเบื่อ แต่มันเป็นการเริ่มต้น

1,

พิมพ์ "0" ทั้งสองภาษา การลบ1สาเหตุทำให้เกิดข้อผิดพลาดให้ลบการ,พิมพ์ "1" แทน

เช่นเดียวกับที่สามารถทำได้ด้วยหรือ1) 1(มีทางเลือกมากมาย

(ใช่ฉันรู้ว่านี่ไม่ใช่โค้ดกอล์ฟ)


2

C และ C ++

#include <stdio.h>
int main() { puts("Hello!"); return 0; }

C และ C ++ ภาษาที่แตกต่างกันที่เกือบจะเข้ากันได้กับแต่ละอื่น ๆ - ขัดกับสิ่งที่คุณอาจได้ยิน c ++ ไม่ได้เป็นซูเปอร์ซีดูที่http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2Bสำหรับความแตกต่างบาง . ตัวอย่างข้างต้นไม่ได้เป็นสำนวน C ++ แต่ทำงานและสร้างผลลัพธ์เดียวกันในทั้ง C และ C ++


คุณสามารถลบเครื่องหมาย0C
เดนนิสได้

@Dennis ไม่อยู่ใน C89
Gilles 'หยุดความชั่วร้าย'

@Gilles: หากฟังก์ชั่นหลักดำเนินการส่งคืนที่ระบุไม่มีค่าสถานะการเลิกจ้างที่ส่งคืนไปยังสภาพแวดล้อมโฮสต์จะไม่ได้กำหนด (แบบร่าง C89 - 2.1.2.2 สภาพแวดล้อมโฮสต์ ) ที่ไม่ทำให้โปรแกรมไม่ถูกต้องหรือไม่เปลี่ยนผลลัพธ์ดังนั้นสำหรับวัตถุประสงค์ของคำถามนี้0สามารถลบออกได้
เดนนิส

@Dennis ฉันคิดว่ารหัสการออกที่ไม่ระบุนั้นนับว่าทำให้โปรแกรมไม่ถูกต้องตามกฎของคำถามนี้ หากไม่มีให้ทำการติดตั้ง C89 โดยที่โปรแกรมนี้ส่งคืนโค้ดการออกที่ไม่ใช่ศูนย์เช่นgcc -ansiบน x86 (หรือสถาปัตยกรรมอื่น ๆ อีกมากมาย: สิ่งที่เกิดขึ้นคือค่าส่งคืนของการputsจบลงด้วยการอยู่ในรีจิสเตอร์ เพื่อกลับจากmainฟังก์ชัน)
Gilles 'หยุดชั่วร้าย'

@Gilles: การตีความกฎ 3 ของฉันคือคอมไพเลอร์ต้องส่งคืน 0 ไม่ใช่โปรแกรม
เดนนิส


1

Perl + Ruby + Python

ผมคิดว่าใน PHP -Rนี้จะต้องอัฒภาคถ้าคุณกำลังทำงานด้วย

print "Hello World!"

ใช้งานได้ใน Python เช่นกัน
สิงหาคม

1
ยังทำงานร่วมกับ Lua
Trebuchette

1

Bash + sh + zsh + ksh, 4 ไบต์:

echo

ง่ายมากและเป็นไปตามกฎทุกข้อ:

  1. สร้างบรรทัดใหม่ในแต่ละภาษา
  2. ขณะนี้เอาต์พุตไม่ได้แตกต่างกันไปในแต่ละภาษา
  3. ไม่สร้างข้อผิดพลาดในภาษาใด ๆ ...
  4. ... ยกเว้นเมื่อมีการลบ / เปลี่ยนแปลงอักขระใด ๆ

0

Bash + sh + zsh + ksh + Windows Batch ขนาด 4 ไบต์:

echo

ง่ายมากและเป็นไปตามกฎทุกข้อ:

สร้างบรรทัดใหม่ที่ไม่ได้แตกต่างกันไปในแต่ละภาษา (แต่ Windows Batch ที่แสดงผลECHO is onในภาษาที่คุณใช้) จะไม่มีข้อผิดพลาดยกเว้นเมื่อมีการลบหรือเปลี่ยนแปลงจดหมายใด ๆ


1
คำตอบของคุณดูเหมือนจะเหมือนกับคำตอบนี้: codegolf.stackexchange.com/a/100654/65326
Uriel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.