Tulis polyglot yang mencetak nama bahasa

65

Tugas Anda adalah menulis sebuah program yang mengeksekusi dalam sebanyak mungkin bahasa, dengan sesedikit mungkin karakter. Untuk menghindari solusi sepele, program harus mencetak nama bahasa yang digunakannya.

Mencetak gol

Program Anda harus bekerja dalam setidaknya 5 bahasa. Skor suatu program diberikan sebagai:

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

Skor tertinggi menang, tidak lebih cepat dari 10 hari setelah jawaban valid pertama.

vsz
sumber
Apakah menggunakan solusi seperti menggunakan print()untuk Perl, Python, PHP, Processing dan R dianggap sepele atau apakah itu dapat diterima?
Rob
3
A tidak dapat melihat masalah dengan itu. Kesulitannya adalah mengganti input cetak per bahasa.
mjgpy3
Saya seharusnya memberi bobot lebih tinggi pada jumlah bahasa ... sepertinya memilih untuk memiliki tepat 5 adalah yang paling optimal. Saya bertanya-tanya berapa banyak bahasa dalam entri pemenang jika skornyan * n / length
vsz
Saya akan menyarankan itu juga. Berdasarkan jawaban yang diberikan, saya tidak percaya saya menafsirkan pertanyaan Anda dengan benar.
Rob

Jawaban:

39

Bash, C, C ++, Obj-C, Obj-C ++, Perl, PHP, Ruby, 183 karakter

skor ~ 0,1236

Untuk kode C dan seperti C, saya berutang pada @ baby-kelinci. Yang lain terinspirasi oleh pengakuan bahwa banyak bahasa memiliki evalpernyataan yang dengan enggan menerima sintaks yang tidak valid.

Keluarkan nama bahasa menjadi keluaran standar. Terkadang menghasilkan banyak pesan kesalahan pada kesalahan standar, jadi tekan dengan mereka 2>/dev/nullsaat Anda menjalankannya.

#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
);}//*/?>'

Solusi php menghasilkan 'PHP'(termasuk tanda kutip tunggal), yang mungkin sedikit menekuk aturan.

Sunting terakhir: mencukur 12 karakter dari wawasan yang $=ada falsedi Ruby, 60di Perl, dan print$=?...hampir pasti merupakan kesalahan di Bash. Dicukur 7 lebih banyak dari wawasan tes Perl / Ruby / Bash sekarang bisa masuk ke pernyataan eval tunggal.

Jika aturan dapat menoleransi lebih banyak tekukan, saya menyajikan 8 bahasa ini, solusi 43 karakter (skor 0,5262)

print("phperluarscriptrubypythoncatebg13");

yang output meliputi nama interpreter untuk php, perl, lua, rscript, ruby, python, cat, dan rot13.

massa
sumber
1
TI-Basic mendukung yang terakhir; tambahkan saja 6 karakter dan dapatkanprint("phperluarscriptrubypythontibasicatebg13");
Timtech
1
@Timtech no, TI-Basic menggunakan Dispatau Output(atau text(token, tidak ada print(perintah. Dan termasuk string sebagai bagian dari ekspresi bernilai real dinyatakan dalam ERR:INVALID SYNTAX, bukan tampilan string (bahkan sebagai nilai balik). (Juga, tidak ada ;; Penggunaan TI-Dasar :)
AJMansfield
@ AJMansfield Terlalu benar, bagaimana saya bisa lupa:?
Timtech
12
Bisakah Anda ganti echo Bashdengan ps -ocomm= -p$$? Ini akan menampilkan nama shell untuk setidaknya bash, zsh, ksh, csh dan tcsh, mungkin yang lain.
Trauma Digital
19

C, C ++, BF, BASH, dan Ruby; 280 karakter

Skor sekitar 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);}

Perhatikan bahwa saya menggunakan sistem Linux.

Kode dijalankan atau dikompilasi dengan perintah berikut (nama file adalah test.c)

C:

gcc test.c

Saat dijalankan dengan ./a.out, output adalahC

C ++:

c++ test.c

Saat dijalankan dengan ./a.out, output adalahC++

PESTA:

./test.c

Output: BASH

Rubi:

ruby test.c

Output: Ruby

BrainF ***:

Diverifikasi menggunakan yang berikut:

Output: brainfuck

Perhatikan bahwa jika debugger JS digunakan, maka dua tanda minus pertama harus dihapus. Mereka dimasukkan untuk mengimbangi tanda-tanda plus dalam string literal "C++". Ini adalah proyek yang sangat menyenangkan, saya sedang berusaha menambahkan lebih banyak bahasa.

Untuk menambah kejelasan lebih lanjut, berikut ini adalah spesifikasi juru / kompiler saya:

  • gcc versi 4.6.3

  • ruby 1.9.3p194 (2012-04-20 revisi 35410) [x86_64-linux]

  • GNU bash, versi 4.2.24 (1) -release (x86_64-pc-linux-gnu)

CATATAN SISI

Dengan menggunakan trik baby-rabbit saya dapat memperluas kode saya agar dapat dieksekusi dalam 7 bahasa (objektif-C dan objektif-c ++ ditambahkan) Ini bukan solusi saya karena saya memang menyalin beberapa, tapi saya pikir saya akan memamerkannya.

Perbarui 9,12 Ditambahkan SmallTalk dijalankan dengan gnu-smalltalk!

SmallTalk, C, C ++, Objective-C, Objective-C ++, BASH, BF, Ruby; 384 karakter (Nilai: 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

Dalam kode di atas Anda perlu mengganti nama file untuk menghasilkan nama langauge untuk objektif-c, obj-c ++, c dan c ++.

mjgpy3
sumber
apakah akan lebih pendek jika Anda output brainf***?
gerombolan
Ya itu akan, saya percaya.
mjgpy3
Anda harus menggunakan if [ 1 = 2 ]alih-alih if [ 1 == 2 ], karena skrip tanpa hashbang dieksekusi oleh sh, bukan bash. sh mungkin atau mungkin bukan bash, di Debian itu dasbor.
nyuszika7h
12

bash, c, c ++, obj-c, obj-c ++; 134 karakter; skor = 0,083

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

ganti nama file dan jalankan / kompilasi sebagai:

  • sh file.sh
  • cc file.c
  • cc file.cpp
  • file cc
  • file cc.mm

(di mana cc adalah dentang-421.10.42)

bayi-kelinci
sumber
+1 karena banyak jawaban terunggah lainnya terinspirasi oleh Anda.
Kevin
11

Lua, Ruby, VimL, ​​Sed, Befunge (129 karakter; ~ 0,087 poin)

Tidak yakin apakah yang ini diperhitungkan - bagian sed tertanam di garis shebang yang bisa dibilang merupakan peretasan untuk mengatasi batasan. Ini juga berarti bahwa itu harus dijalankan sebagai yang dapat dieksekusi dan tidak langsung dengan sed.

Saya beruntung bahwa semua bahasa lain (sans Befunge) secara otomatis mengabaikan garis shebang (meskipun tampaknya Ruby menolak untuk menjalankan file jika memiliki garis shebang yang tidak mengandung string 'ruby' di dalamnya).

#!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

Penggunaan sampel:

% 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
FireFly
sumber
5
Wow, solusi yang tidak termasuk C
vsz
8

BF, Bash, Batch, C, vi (163 karakter; skor ≈ .0686)

( <ESC>kepanjangan dari kode 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 */

Saya menguji ini, sebagai file batch, dengan versi MS-DOS 6.22 dari COMMAND.COM. Secara default, interpreter itu mencampur baris kode sumber dengan output. Untuk mencegah hal itu terjadi, jalankan echo offsebelum menjalankan file batch.

Untuk menjalankan kode vi, yang baru saya uji menggunakan Vim, gunakan perintah berikut:

cat /dev/null > tmpfile && vi -s polyglot.sh tmpfile > /dev/null 2>&1 && cat tmpfile
Tolong berdiri
sumber
1
Anda bisa menggunakan touch tmpfileatau : > tmpfilebukannya cat /dev/null > tmpfile.
nyuszika7h
5

bash, zsh, ksh, csh, tcsh, 15 karakter, skor 0,745

Yang ini agak sulit karena mereka semua bahasa terkait, tetapi ada perbedaan:

ps -ocomm= -p$$
Trauma Digital
sumber
Bagaimana dengan tanda hubung?
Elliot A.
4

Every Python Release, 18,37291 poin

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

Secara teknis valid, jika Anda menganggap semua versi python sebagai bahasa yang berbeda. Saat ini ada 116 versi python, yang saya percaya memberi saya skor sekitar 18,37291.

(Juga saya mengerti jika ini tidak dianggap sebagai jawaban yang valid, ini hanya untuk bersenang-senang)

EdgyNerd
sumber
Anda masih mendapatkan +1 saya hanya untuk bersenang-senang.
vsz
Apakah mencetak nomor versi lengkap dapat dilakukan? (Golf ini turun 4 byte dan memperluas versi Python yang mungkin.)
A _
Apakah ini juga oke? tio.run/##K6gsycjPM/7/…
A _
3

Bash, C, Gawk, Perl, vi (145 karakter; skor ≈ .077)

( <BS>singkatan dari kode ASCII 8. <ESC>singkatan dari kode 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");}

Untuk menjalankan kode vi, yang baru saya uji menggunakan Vim, gunakan perintah ini:

cat /dev/null > tmpfile && vi -s polyglot.sh tmpfile > /dev/null 2>&1 && cat tmpfile
Tolong berdiri
sumber
3

Ini adalah pilihan bahasa yang murah, tapi begini:

CoffeeScript, JScript, Mozilla Javascript (≈ JavaScript 1.3), ECMAScript Edition 5, ECMAScript Edition 3, 223 karakter, skor ≈ 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)
Peter Olson
sumber
5
JavaScript, JavaScript, JavaScript (≈ JavaScript), JavaScript, JavaScript, 263 karakter, (skor ≈ 0). Anda juga dapat membuatnya lebih pendek a="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...oh dan Anda juga dapat mencoba bermain golf ....
Math chiller
@tryingToGetProgrammingStraight Menempatkan semuanya pada satu baris seperti itu bukan sintaks yang valid dalam CoffeeScript (yang merupakan bahasa terpisah dari Javascript). Yang lain bisa diperdebatkan, tetapi karena itu tidak ditentukan seberapa berbeda bahasa harus, saya pikir fakta bahwa implementasi yang berbeda memiliki perilaku yang ditentukan berbeda memungkinkan mereka untuk diperlakukan sebagai terpisah.
Peter Olson
saya juga tidak bisa menulis komentar multi-baris, satu-satunya golf yang tampaknya Anda gunakan adalah meninggalkan {/ }/ ;... idenya adalah auntuk menghindari penggunaan kembali "undefined", Anda juga bisa melakukannya b=alertdan kemudian b("this is also still just javascript"). lagi pula The golden rule of CoffeeScript is: "It's just JavaScript"(dari coffeescript.org ), Anda juga dapat menggunakan beberapa jquery untuk menambahkan bahasa keenam ....
Math chiller
1
@tryingToGetProgrammingStraight Menambahkan jQuery tidak masuk akal, karena jQuery adalah pustaka, bukan bahasa. CoffeeScript jelas bukan bahasa yang sama dengan ECMAScript. Definisi suatu bahasa adalah seperangkat string terbatas hingga alfabet terbatas. Set string yang mewakili program CoffeeScript yang valid tidak sama dengan set string yang mewakili ECMAScript yang valid.
Peter Olson
1
Dapat Anda lakukan [].mapbukan Array.prototype.map?
ETHproduk
3

Java, Lisp, Whitespace, Intercal, PHP, Befunge-98; skor = 0,0189

Ini awalnya jawaban untuk ini .

 ;\\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
Juan Sebastian Lozano
sumber
Ini tidak akan berfungsi di Jawa; setiap baris sampai public class...akan menyebabkan masalah kompiler.
Ypnypn
Menarik ... Saya ingat dengan jelas menguji ini di kompiler dan berfungsi ... atau mungkin ingatan saya gagal ...
Juan Sebastian Lozano
@ Ypnypn Ingat bahwa "T" adalah tab, "S" adalah spasi, dan "L" adalah umpan baris dalam ruang putih, itulah sebabnya mengapa tidak menyebabkan kesalahan kompilator.
Juan Sebastian Lozano
Oh itu masuk akal.
Ypnypn
3

Windows Batch, TI-Basic, Golf-Basic 84 , Quomplex , dan GTB 5 * 2/93 = 0,11

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

Bagaimana itu bekerja

Windows Batch adalah yang paling mudah, karena ::memulai komentar. Cukup sederhana untuk diterapkan.

TI-Basic tidak mendukung huruf kecil atau backtick, menyebabkannya melompati pernyataan d`"GOLF-BASIC 84":g`1, yang dievolusikan Golf-Basic, Menampilkan pesan dan meneruskan ke Label 1, yang segera diakhiri. Ini mirip untuk GTB, dengan karakter tampilan yang praktis ~,. By the way, string tanpa tampilan akan dimasukkan Ans. Jika tidak ada perintah Tampilan yang mengikutinya, Ansakan ditampilkan (bukan yang terjadi di sini).

Quomplex terperangkap di awal karena sintaksisnya yang kompleks tidak memungkinkan untuk dilewati. Yang dilakukannya hanyalah menambah "Quomplex"output, dan kemudian untuk penguasaan program ...

Penguasaan Sintaks Pemrograman

:"'*[]'"

Jenius murni. Quomplex mengabaikan :dan mengambil "'dan '"sebagai string, membiarkannya untuk mengeluarkan stack dan binasa dalam loop while yang tak terbatas ( []). Sementara itu, Golf-Basic dan TI-Basic mengambil keseluruhan "'*[]'"sebagai string, karena 'merupakan operator matematika, bukan operator string.

Timtech
sumber
Sebenarnya, :menunjukkan label dalam file batch, bukan komentar. Memang benar bahwa ia tidak menjalankan apa pun dengan sendirinya.
Tandai
@ Markus Benar, tetapi ::masih (meskipun label). Saya lebih suka menggunakannya daripada REM, terutama karena diperlukan dalam TI-Basic.
Timtech
Benar - saya hanya menjadi tukang obat. Juga, +1 untuk menggunakan file batch di tempat pertama. :-)
Tandai
2

JScript, EcmaScript Edition 3, 5, 6, 2016, Node, JavaScript Mozilla (skor ≈ 0,1342)

Jawaban ini awalnya didasarkan pada jawaban Peter Olson, tetapi minus CoffeeScript (karena bahasa yang signifikan dengan ruang kosong dapat mengerikan untuk bermain golf).

Saya juga menambahkan Node , ES6 dan ES2016 dan sedikit kode golf , hampir tiga kali lipat skor aslinya.

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

16 bahasa, 348 byte, skor: 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]);}

Ini bekerja di C (gcc), C ++ (gcc), C (ecpp), C ++ (ecpp), C (dentang), C ++ (dentang), C (tcc), sh, tanda hubung, bash, zsh, ksh, csh, tcsh, rk, dan SIL.

MD XF
sumber
0

JScript, EcmaScript Edition 3, 5, 6, 2016, 2017, Node, Mozilla JavaScript (skor = .174193548387), CoffeeScript (sebagai bahasa yang memiliki spasi signifikan dapat menjadi hal yang mengerikan untuk bermain 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)
pengguna75200
sumber