Viết một polyglot in tên của ngôn ngữ


65

Nhiệm vụ của bạn là viết một chương trình thực thi bằng nhiều ngôn ngữ nhất có thể, với càng ít ký tự càng tốt. Để tránh các giải pháp tầm thường, chương trình phải in tên của ngôn ngữ mà nó được chạy.

Chấm điểm

Chương trình của bạn phải làm việc với ít nhất 5 ngôn ngữ. Điểm của chương trình được đưa ra là:

(number of languages)1.5 / (length of program)

Điểm số cao nhất sẽ thắng, không sớm hơn 10 ngày sau câu trả lời hợp lệ đầu tiên.


Việc sử dụng một giải pháp như sử dụng print()cho Perl, Python, PHP, Xử lý và R có thể được coi là tầm thường hay không?
Cướp

3
Không thể nhìn thấy một vấn đề với nó. Khó khăn sẽ là chuyển đổi đầu vào in trên mỗi ngôn ngữ.
mjgpy3

Tôi nên có trọng số cao hơn cho số lượng ngôn ngữ ... có vẻ như chọn có chính xác 5 ngôn ngữ là tối ưu nhất. Tôi tự hỏi có bao nhiêu ngôn ngữ sẽ có trong mục chiến thắng nếu điểm số làn * n / length
vsz

Tôi cũng sẽ đề nghị điều đó. Dựa trên các câu trả lời được cung cấp, tôi không tin rằng tôi đã giải thích đúng câu hỏi của bạn.
Cướp

Câu trả lời:


39

Bash, C, C ++, Obj-C, Obj-C ++, Perl, PHP, Ruby, 183 ký tự

điểm ~ 0,1236

Đối với mã giống C và C, tôi nợ một khoản nợ cho @ baby-rabbit. Những người khác được truyền cảm hứng bởi sự thừa nhận rằng nhiều ngôn ngữ có một evaltuyên bố sẽ miễn cưỡng chấp nhận cú pháp không hợp lệ.

Xuất tên ngôn ngữ thành đầu ra tiêu chuẩn. Đôi khi tạo ra rất nhiều thông báo lỗi về lỗi tiêu chuẩn, vì vậy hãy loại bỏ chúng 2>/dev/nullkhi bạn chạy chúng.

#if 0
'PHP<?/*';eval "print\$=?'Perl':'Ruby';echo Bash";exit
__END__
#endif
#include <stdio.h>
main(){puts(
#ifdef __OBJC__
"obj-"
#endif
"C"
#ifdef __cplusplus
"++"
#endif
);}//*/?>'

Các đầu ra giải pháp php 'PHP'(bao gồm các trích dẫn đơn), có thể uốn cong các quy tắc một chút.

Chỉnh sửa cuối: cạo 12 chars từ cái nhìn sâu sắc mà $=falsetrong Ruby, 60Perl, và print$=?...gần như chắc chắn là một lỗi trong Bash. Đã cạo thêm 7 từ cái nhìn sâu sắc, bài kiểm tra Perl / Ruby / Bash giờ đây có thể đi vào một tuyên bố eval duy nhất.

Nếu các quy tắc có thể chịu được uốn cong nhiều hơn, tôi trình bày 8 ngôn ngữ này, giải pháp 43 ký tự (điểm 0,5262)

print("phperluarscriptrubypythoncatebg13");

mà đầu ra bao gồm tên của người phiên dịch cho php, perl, lua, rscript, ruby, python, cat, và rot13.


1
TI-Basic hỗ trợ cái cuối cùng; chỉ cần thêm 6 ký tự và nhậnprint("phperluarscriptrubypythontibasicatebg13");
Timtech

1
@Timtech không, TI-Basic sử dụng Disphoặc Output(hoặc text(thẻ, không có print(lệnh. Và bao gồm một chuỗi như là một phần của biểu thức có giá trị thực khác dẫn đến một ERR:INVALID SYNTAX, không hiển thị chuỗi (thậm chí không phải là giá trị trả về). (Ngoài ra, không có ;; TI-Basic sử dụng :)
AJMansfield

@AJMansfield Quá đúng, làm sao tôi có thể quên :?
Timtech

12
Bạn có thể thay thế echo Bashbằng ps -ocomm= -p$$? Điều này sẽ xuất tên của shell cho ít nhất là bash, zsh, ksh, csh và tcsh, có thể là những cái khác.
Chấn thương kỹ thuật số

19

C, C ++, BF, BASH và Ruby; 280 ký tự

Điểm số khoảng 0,040

#include "stdio.h"
#define s "C"
#ifdef __cplusplus
#define s "C++"
#endif
#ifndef s
#"+++++++++[>++++++++++>+++++++++<<-]>>-.<++++.>-.++++++++.<----.>---.<+++++++.>---.++++++++.<<++++++++++.[-]"
if [ 1 == 2 ];then
puts "Ruby"
exit
fi
echo "BASH"
exit
end
#endif
main(){puts(s);}

Lưu ý rằng tôi đang sử dụng một hệ thống Linux.

Mã được chạy hoặc biên dịch với các lệnh sau (tên tệp là test.c)

C:

gcc test.c

Khi chạy với ./a.out, đầu ra làC

C ++:

c++ test.c

Khi chạy với ./a.out, đầu ra làC++

BASH:

./test.c

Đầu ra: BASH

Ruby:

ruby test.c

Đầu ra: Ruby

BrainF ***:

Xác minh bằng cách sử dụng như sau:

Đầu ra: brainfuck

Lưu ý rằng nếu trình gỡ lỗi JS được sử dụng, thì hai dấu trừ đầu tiên cần được loại bỏ. Chúng được bao gồm để bù các dấu cộng trong chuỗi ký tự "C++". Đây là một dự án rất thú vị, tôi đang làm việc để thêm nhiều ngôn ngữ.

Để thêm rõ ràng hơn, đây là thông số kỹ thuật / trình biên dịch của tôi:

  • phiên bản gcc 4.6.3

  • ruby 1.9.3p194 (phiên bản 2012-04-20 35410) [x86_64-linux]

  • GNU bash, phiên bản 4.2.24 (1) -release (x86_64-pc-linux-gnu)

GHI CHÚ

Sử dụng thủ thuật @ baby-rabbit, tôi có thể mở rộng mã của mình để có thể thực thi được bằng 7 ngôn ngữ (object-C và object-c ++ được thêm vào). Đây không phải là giải pháp của tôi vì tôi đã sao chép một số, nhưng tôi nghĩ rằng tôi sẽ thể hiện nó ra.

Cập nhật 9.12 Đã thêm SmallTalk chạy với gnu-smalltalk!

SmallTalk, C, C ++, Objective-C, Objective-C ++, BASH, BF, Ruby; 384 ký tự (Điểm: 0,059)

#if (a)
##(true) ifTrue: ['SmallTalk' printNl]
##(ObjectMemory quit)
#"+++++++++++[>++++++++++>+++++++++<<-]>>-.<++++.>-.++++++++.<----.>---.<+++++++.>---.++++++++.<<++++++++++.[-]"
if [ 1 == 2 ];then
puts 'Ruby'
exit
fi
echo 'BASH'
exit
end
=begin
#endif
#include "stdio.h"
main(){puts(
#ifdef __OBJC__
"Objective-"
#endif
"C"
#ifdef __cplusplus
"++"
#endif
);}
#ifdef b
=end
#endif

Trong đoạn mã trên, bạn sẽ cần đổi tên tệp để tạo tên của langauge cho object-c, obj-c ++, c và c ++.


nó sẽ ngắn hơn nếu bạn đầu ra brainf***?
mob

Có nó, tôi tin.
mjgpy3

Bạn nên sử dụng if [ 1 = 2 ]thay vì if [ 1 == 2 ], bởi vì các tập lệnh không có hashbang được thực thi bởi sh, không phải bash. sh có thể hoặc không thể bash, trên Debian nó là dấu gạch ngang.
nyuszika7h

12

bash, c, c ++, obj-c, obj-c ++; 134 ký tự; điểm = 0,083

#if x
echo "bash"
exit
#endif
#include <stdio.h>
int main(){puts(
#ifdef __OBJC__
"obj-"
#endif
"c"
#ifdef __cplusplus
"++"
#endif
);}

đổi tên tập tin và chạy / biên dịch thành:

  • tập tin sh
  • tập tin cc
  • cc file.cpp
  • tập tin cc
  • tập tin cc.mm

(trong đó cc là clang-421.10.42)


+1 vì nhiều câu trả lời nâng cao khác được lấy cảm hứng từ bạn.
Kevin

11

Lua, Ruby, VimL, ​​Sed, Befunge (129 ký tự; ~ 0,087 điểm)

Không chắc chắn nếu điều này được tính - phần sed được nhúng trong dòng shebang, được cho là một bản hack để vượt qua giới hạn. Điều này cũng có nghĩa là nó nên được chạy như một tệp thực thi và không trực tiếp với sed.

Tôi đã may mắn khi tất cả các ngôn ngữ khác (sans Befunge) tự động bỏ qua dòng shebang (mặc dù rõ ràng Ruby từ chối chạy tệp nếu nó có dòng shebang không chứa chuỗi 'ruby' trong đó).

#!sed sanava;s/.*/sed/;q;ruby
--"".to_i#>"egnufeB">:#,_@
if 0
then
if IO
then
puts"Ruby"
else
print"Lua"
end
else
echo"VimL"
end

Sử dụng mẫu:

% lua tmp/glot.poly
Lua
% ruby tmp/glot.poly
Ruby
% ./tmp/glot.poly
sed
% cfunge tmp/glot.poly       # Requires Befunge-98
Befunge

:source tmp/glot.poly        # from vim
VimL                         # displayed as message

5
Ồ, một giải pháp không bao gồm C
vsz

8

BF, Bash, Batch, C, vi (163 ký tự; điểm .0686)

( <ESC>viết tắt của mã ASCII 27.)

rem (){ ((0));};true /*
rem ;goto(){ rem;}
rem ivi<ESC>ZZ'++++++++[>NUL ++++++++<NUL -]>NUL ++.++++.*/;main(){puts("C");}/*'
goto a
echo Bash
exit
:a
echo Batch
rem */

Tôi đã thử nghiệm điều này, dưới dạng một tệp bó, với phiên bản MS-DOS 6.22 của HOL.COM. Theo mặc định, trình thông dịch đó trộn các dòng mã nguồn với đầu ra. Để ngăn điều đó xảy ra, hãy thực thi echo offtrước khi chạy tệp bó.

Để thực thi mã vi mà tôi chỉ kiểm tra bằng Vim, hãy sử dụng lệnh sau:

cat /dev/null > tmpfile && vi -s polyglot.sh tmpfile > /dev/null 2>&1 && cat tmpfile

1
Bạn có thể sử dụng touch tmpfilehoặc : > tmpfilethay vì cat /dev/null > tmpfile.
nyuszika7h

5

bash, zsh, ksh, csh, tcsh, 15 ký tự, điểm 0,745

Điều này hơi khó khăn vì tất cả chúng đều là các ngôn ngữ liên quan, nhưng có những khác biệt:

ps -ocomm= -p$$

Thế còn dấu gạch ngang?
Elliot A.

4

Mỗi bản phát hành Python, 18,37291 điểm

import sys
print('Python '+'.'.join(map(str,sys.version_info[:-2])))

Về mặt kỹ thuật, nếu bạn coi tất cả các phiên bản python là các ngôn ngữ khác nhau. Hiện tại có 116 phiên bản python, mà tôi tin rằng mang lại cho tôi số điểm khoảng 18.37291.

(Ngoài ra tôi hiểu nếu đây không được coi là một câu trả lời hợp lệ, đây chỉ là cho vui)


bạn vẫn nhận được +1 của mình chỉ để giải trí.
vsz

Là in số phiên bản hoàn chỉnh khả thi? (Golf này giảm 4 byte và mở rộng các phiên bản Python có thể.)
A _

Ngoài ra điều này có ổn không? tio.run/##K6gsycjPM/7/ khăn
A _

3

Bash, C, Gawk, Perl, vi (145 ký tự; điểm .077)

( <BS>viết tắt của mã ASCII 8. <ESC>là viết tắt của mã ASCII 27.)

#define echo//<BS><BS><BS>vi<ESC>ZZ
#define BEGIN A()
#define B\
{
echo Bash ;exit;
#define C\
}
BEGIN {printf(A=="A"?"Perl":"Gawk");exit;}
main(){puts("C");}

Để thực thi mã vi mà tôi chỉ thử nghiệm bằng Vim, hãy sử dụng lệnh này:

cat /dev/null > tmpfile && vi -s polyglot.sh tmpfile > /dev/null 2>&1 && cat tmpfile

3

Đây là một lựa chọn ngôn ngữ giá rẻ, nhưng ở đây đi:

CoffeeScript, JScript, Mozilla Javascript (≈ JavaScript 1.3), ECMAScript Phiên bản 5, ECMAScript Phiên bản 3, 223 ký tự, điểm số ≈ 0,0501)

a="undefined"
x="ECMAScript 3"
if(Array.prototype.map)
 x="ECMAScript 5"
if(typeof CoffeeScript!=a)
 x="CoffeeScript"
if(typeof uneval!=a)
 x="Mozilla JavaScript"
if(typeof WScript!=a)
 WScript.echo("JScript")
else alert(x)

5
JavaScript, JavaScript, JavaScript (JavaScript), JavaScript, JavaScript, ký tự 263, (điểm 0). bạn cũng có thể làm cho nó ngắn hơn a="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...oh và bạn cũng có thể thử chơi gôn ....
làm lạnh toán học

@tryingToGetProgrammingSt dán Đặt mọi thứ trên một dòng như thế không phải là cú pháp hợp lệ trong CoffeeScript (là ngôn ngữ riêng biệt với Javascript). Những người khác thì có thể tranh cãi, nhưng vì nó không được chỉ định các ngôn ngữ phải khác nhau như thế nào, tôi nghĩ rằng việc triển khai khác nhau có các hành vi được chỉ định khác nhau cho phép chúng được coi là riêng biệt.
Peter Olson

Tôi cũng không thể viết một bình luận nhiều dòng, việc chơi golf duy nhất mà bạn dường như đã sử dụng là bỏ đi {/ }/ ;... ý tưởng là sử dụng ađể tránh tái sử dụng "undefined", bạn cũng có thể làm b=alertvà sau đó b("this is also still just javascript"). dù sao đi nữa The golden rule of CoffeeScript is: "It's just JavaScript"(từ coffeescript.org ), bạn cũng có thể sử dụng một số câu đố để thêm ngôn ngữ thứ sáu ....
làm lạnh toán học

1
@tryingToGetProgrammingSt dán Thêm jQuery sẽ là vô lý, vì jQuery là một thư viện, không phải là ngôn ngữ. CoffeeScript chắc chắn không phải là ngôn ngữ giống như ECMAScript. Định nghĩa của một ngôn ngữ là một tập hợp các chuỗi hữu hạn trên một bảng chữ cái hữu hạn. Tập hợp các chuỗi đại diện cho các chương trình CoffeeScript hợp lệ không giống với tập hợp các chuỗi đại diện cho ECMAScript hợp lệ.
Peter Olson

1
Bạn có thể làm [].mapthay vì Array.prototype.map?
Sản xuất ETH

3

Java, Lisp, khoảng trắng, Intercal, PHP, Befunge-98; điểm = 0,0189

Đây ban đầu là một câu trả lời cho điều này .

 ;\\0"egnufeB">:#,_@SSSTTTSTTTL
;TL
;SSSSSTTSTSSSL
;TL
;SSSSSTTSTSSTL
;TL
;SSSSSTSTSTSSL
;TL
;SSSSSTTSSTSTL
;TL
;SSSSSTSTSSTTL
;TL
;SSSSSTTTSSSSL
;TL
;SSSSSTTSSSSTL
;TL
;SSSSSTTSSSTTL
;TL
;SSSSSTTSSTSTL
;SSL
;L
;L
;L
;public class H{ public static void main(String []a){System.out.println("JAVA");}}
;/*
(print "LISP")
;*/
;//<?php
; echo "PHP"
;//?>
;/*
#|
DO ,1 <- #8
DO ,1 SUB #1 <- #110
DO ,1 SUB #2 <- #32
DO ,1 SUB #3 <- #72
DO ,1 SUB #4 <- #136
DO ,1 SUB #5 <- #88
DO ,1 SUB #6 <- #136
PLEASE DO ,1 SUB #7 <- #64
DO ,1 SUB #8 <- #80
PLEASE READ OUT ,1
PLEASE NOTE |#
;*/
;// PLEASE GIVE UP

Điều này sẽ không hoạt động trong Java; mỗi dòng cho đến khi public class...gây ra một vấn đề biên dịch.
Ypnypn

Thật thú vị ... Tôi nhớ rất rõ việc thử nghiệm cái này trong một trình biên dịch và nó hoạt động ... hoặc có lẽ bộ nhớ của tôi làm tôi thất vọng ...
Juan Sebastian Lozano

@Ypnypn Hãy nhớ rằng "T" là một tab, "S" là một khoảng trắng và "L" là một nguồn cấp dữ liệu trong khoảng trắng, đó là lý do tại sao nó không gây ra lỗi trình biên dịch.
Juan Sebastian Lozano

Oh; Điều đó có ý nghĩa.
Ypnypn

3

Windows Batch, TI-Basic, Golf-Basic 84 , QuomplexGTB 5 * 2/93 = 0.11

::¤Quomplex¤:"'*[]'":~"GTB":g;1:d`"GOLF-BASIC 84":g`1:"TI-BASIC":Lbl 1:End
echo Windows Batch

Làm thế nào nó hoạt động

Windows Batch là dễ nhất, bởi vì ::bắt đầu một bình luận. Khá đơn giản để thực hiện.

TI-Basic không hỗ trợ các chữ cái viết thường hoặc backticks, khiến nó bỏ qua các câu lệnh d`"GOLF-BASIC 84":g`1mà Golf-Basic đưa ra, Hiển thị thông báo và chuyển tiếp đến Nhãn 1, khi nó kết thúc nhanh chóng. Điều này tương tự với GTB, với ký tự hiển thị tiện dụng của nó , ~. Nhân tiện, một chuỗi không có màn hình sẽ được đưa vào Ans. Nếu không có lệnh Display theo sau nó, Anssẽ được xuất ra (không phải trường hợp ở đây).

Quomplex đã được sử dụng ngay từ đầu vì cú pháp phức tạp của nó sẽ không cho phép bỏ qua nhiều thứ. Tất cả những gì nó làm là thêm "Quomplex"vào đầu ra, và sau đó để làm chủ chương trình ...

Sự thành thạo của cú pháp lập trình

:"'*[]'"

Thiên tài thuần túy. Quomplex bỏ qua :và lấy "''"làm chuỗi, để nó xuất ra ngăn xếp và diệt vong trong một vòng lặp while vô hạn ( []). Trong khi đó, Golf-Basic và TI-Basic lấy toàn bộ "'*[]'"làm một chuỗi, bởi vì 'là toán tử toán học, không phải là toán tử chuỗi.


Nói đúng ra, :chỉ ra một nhãn trong một tệp bó, không phải là một bình luận. Mặc dù đúng là nó không tự thực hiện bất cứ điều gì.
Đánh dấu

@Mark Đúng, nhưng là ::(mặc dù vẫn là nhãn). Tôi thích sử dụng nó hơn REM, đặc biệt là vì nó được yêu cầu trong TI-Basic.
Timtech

Phải - tôi chỉ là người phạm tội. Ngoài ra, +1 để sử dụng các tệp bó ở vị trí đầu tiên. :-)
Đánh dấu

2

JScript, EcmaScript Phiên bản 3, 5, 6, 2016, Node, Mozilla JavaScript (điểm 0,1342)

Câu trả lời này ban đầu dựa trên câu trả lời của Peter Olson, nhưng trừ CoffeeScript (vì các ngôn ngữ có ý nghĩa khoảng trắng có thể là khủng khiếp đối với việc chơi golf).

Tôi cũng đã thêm Node , ES6ES2016 và đánh mã số một chút, gần gấp ba số điểm ban đầu.

$=this,y="EcmaScript ",x=$.module?"Node":$.uneval?"Mozilla JavaScript":"".padStart?y+2016:$.Map?y+6:[].map?y+5:y+3,($.WScript||$.alert)(x)

2

16 ngôn ngữ, 348 byte, điểm: 0.183908046

#include <stdio.h>
#if 0
#replace "C(gcc)" "C(ecpp)"
#replace "C++(gcc)" "C++(ecpp)"
#endif
#ifdef __clang__
#define d 2
#elif __TINYC__
#define d 4
#else
#define d 0
#endif // rk:start print: "rk" \
ps -ocomm= -p$$; exit;
int x=sizeof('a')%2+d;char*arr[]={"C(gcc)","C++(gcc)","C(clang)","C++(clang)","C(tcc)"};int main(){puts(arr[x]);}

Điều này hoạt động trong C (gcc), C ++ (gcc), C (ecpp), C ++ (ecpp), C (clang), C ++ (clang), C (tcc), sh, dash, bash, zsh, ksh, csh, tcsh, rk và SIL.


0

JScript, EcmaScript Phiên bản 3, 5, 6, 2016, 2017, Node, Mozilla JavaScript (điểm = .174193548387), CoffeeScript (vì các ngôn ngữ có ý nghĩa khoảng trắng có thể là khủng khiếp khi chơi golf).

$=this,y="EcmaScript ",($.WScript||alert)(x=Object.values?y+2017:$.module?"Node":$.uneval?"Mozilla JavaScript":[].includes?y+2016:$.Map?y+6:[].map?y+5:y+3)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.