Dilin adını yazdıran bir polyglot yazın


65

Göreviniz, olabildiğince çok sayıda, mümkün olduğunca çok sayıda dilde çalışan bir program yazmaktır. Önemsiz çözümlerden kaçınmak için, programın çalıştırıldığı dilin adını yazdırması gerekir.

puanlama

Programınız en az 5 dilde çalışmalıdır. Bir programın puanı şöyle verilir:

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

En yüksek puan, ilk geçerli cevaptan 10 gün sonra geçmez.


print()Perl, Python, PHP, Processing ve R için kullanmak gibi bir çözüm kullanmak önemsiz sayılabilir mi yoksa kabul edilebilir mi?
Rob,

3
Bir sorun göremiyorum. Buradaki zorluk baskının girişini dil başına değiştirmesi olabilir.
mjgpy3 11:12

Dil sayısına daha fazla ağırlık vermeliydim ... en uygun olanı seçmeliydim. Eğer skorn * n / length
vsz

Bunu da önerecektim. Verilen cevaplara dayanarak, sorunuzu doğru yorumladığımı sanmıyorum.
Rob

Yanıtlar:


39

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

puan ~ 0.1236

C ve C benzeri kodlar için @ tavşan-tavşan borcum var. Diğerleri, birçok dilin evalgeçersiz sözdizimini kabul edecek bir ifadeye sahip olmalarının tanınmasından ilham almıştır .

Dil adını standart çıktıya verir. Bazen standart hatada çok fazla hata mesajı oluşturur, bu nedenle 2>/dev/nullçalıştırırken bunları bastırın .

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

Php çözümü 'PHP'(kuralları tek bir alıntı da dahil olmak üzere), kuralları biraz büküyor olabilir.

Son düzenleme: içgörü 12 karakter traş $=olup false, Ruby 60Perl ve print$=?...neredeyse kesinlikle Bash bir hatadır. Perl / Ruby / Bash testinin artık tek bir değerlendirme ifadesine girebileceği konusundaki görüşlerinden 7'sini daha kazandın.

Kurallar daha fazla bükülmeyi tolere ederse, bu 8 dili, 43 karakter çözümünü sunarım (puan 0.5262)

print("phperluarscriptrubypythoncatebg13");

kendisi için çıkış için tercüman adını içerir php, perl, lua, rscript, ruby, python, cat, ve rot13.


1
TI-Basic sonuncuyu destekliyor; sadece 6 karakter ekleyin ve print("phperluarscriptrubypythontibasicatebg13");
kazanın

1
@Timtech no, TI-Basic, Dispveya Output(veya text(jetonlarını kullanır, print(komut yoktur . Ve bir dize, aksi takdirde gerçek değere sahip bir ifadenin parçası olarak dahil ERR:INVALID SYNTAXedilmesi, dize görüntüsüne değil (bir dönüş değeri olarak bile) sonuçlanır . (Ayrıca, hiçbiri yoktur ;; TI-Basic kullanır :)
AJMansfield

@AJMansfield Çok doğru, nasıl unutabilirim ki?
Timtech

12
Eğer değiştirebilir miyim echo Bashile ps -ocomm= -p$$? Bu, en azından bash, zsh, ksh, csh ve tcsh, belki de diğerleri için kabuğun adını çıkartacaktır.
Dijital Travma

19

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

Puan yaklaşık 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);}

Bir Linux sistemi kullandığımı unutmayın.

Kod çalıştırmak veya aşağıdaki komutlarla derlenmektedir (dosyanın adıdır test.c)

C:

gcc test.c

Çalıştırıldığında ./a.outçıktıC

C ++:

c++ test.c

Çalıştırıldığında ./a.outçıktıC++

BASH:

./test.c

Çıktılar: BASH

Yakut:

ruby test.c

Çıktılar: Ruby

Brainf ***:

Aşağıdakileri kullanarak doğrulandı:

Çıktılar: brainfuck

JS hata ayıklayıcısının kullanılması durumunda ilk iki eksi işaretinin kaldırılması gerektiğini unutmayın. Dize değişmezindeki artı işaretlerini dengelemek için dahil edildiler "C++". Bu çok eğlenceli bir projeydi, daha fazla dil eklemeye çalışıyorum.

Daha fazla netlik eklemek için, işte tercümanım / derleyicinin özellikleri:

  • gcc sürümü 4.6.3

  • yakut 1.9.3p194 (2012-04-20 revizyon 35410) [x86_64-linux]

  • GNU bash, sürüm 4.2.24 (1) - yeniden yayın (x86_64-pc-linux-gnu)

KENAR NOTU

@ Baby-rabbit's hilesini kullanarak, kodumu 7 dilde çalıştırılabilir şekilde uzatabildim (objektif-C ve objektif-c ++ ekleniyor). Bazılarını kopyaladığımdan beri bu benim çözümüm değil ama göstereceğimi düşündüm.

Güncelleme 9.12 gnu-smalltalk ile çalıştırılan SmallTalk!

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

Yukarıdaki kodda, dilbilgisinin adını object-c, obj-c ++, c ve c ++ için üretmek için dosyayı yeniden adlandırmanız gerekir.


çıktı verirseniz daha kısa olur brainf***mu?
mob

Evet olur, inanıyorum.
mjgpy3

Bunun if [ 1 = 2 ]yerine kullanmalısınız if [ 1 == 2 ], çünkü hashbang olmayan komut dosyaları bash değil, sh ile yürütülür. sh bash veya bash olmayabilir, Debian'da bu tire.
nyuszika7h

12

bash, c, c ++, obj-c, obj-c ++; 134 karakter; puanı = 0.083

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

dosyayı yeniden adlandırın ve aşağıdaki gibi çalıştırın / derleyin:

  • sh dosyası.sh
  • cc file.c
  • cc file.cpp
  • cc file.m
  • cc file.mm

(buradaki cc, clang-421.10.42'dir)


+1, diğer birçok olumlu cevaplar sizinkinden ilham aldı.
Kevin

11

Lua, Yakut, VimL, ​​Sed, Befunge (129 karakter; ~ 0.087 puan)

Bu sayılırsa emin değilim - sed-kısım, kısıtlamaların üstesinden gelmek için muhtemelen bir hack olan shebang hattına gömülüdür. Bu aynı zamanda doğrudan çalıştırılmaması ve çalıştırılabilir olarak çalıştırılması gerektiği anlamına gelir sed.

Diğer bütün dillerin (Befunge sans) otomatik olarak shebang çizgisini görmezden geldiği için şanslıydım (görünüşe göre Ruby, içinde 'ruby' dizesi bulunmayan bir shebang çizgisine sahipse dosyayı çalıştırmayı reddediyor).

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

Örnek kullanım:

% 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
Vay, C
vsz

8

BF, Bash, Küme, C, vi (163 karakter; puan ≈ .0686)

( <ESC>ASCII kod 27 anlamına gelir.)

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

Bunu bir toplu iş dosyası olarak COMMAND.COM MS-DOS 6.22 sürümü ile sınamak. Varsayılan olarak, bu yorumlayıcı kaynak kod satırlarını çıktıyla karıştırır. Bunun olmasını önlemek için echo off, toplu iş dosyasını çalıştırmadan önce yürütün .

Sadece Vim kullanarak test ettiğim vi kodunu çalıştırmak için aşağıdaki komutu kullanın:

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

1
Kullanabilir touch tmpfileveya : > tmpfileyerine cat /dev/null > tmpfile.
nyuszika7h

5

bash, zsh, ksh, csh, tcsh, 15 karakter, puan 0.745

Bunların hepsi birbiriyle alakalı diller olduğundan biraz gergin, ancak farklılıklar var:

ps -ocomm= -p$$

Çizgi ne olacak?
Elliot A.

4

Her Python Yayını, 18.37291 puan

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

Tüm python sürümlerinin farklı diller olduğunu düşünüyorsanız teknik olarak geçerlidir. Şu anda bana 18.37291 puan verdiğine inandığım 116 piton versiyonu var.

(Bunun geçerli bir cevap olarak kabul edilip edilmediğini de anlıyorum, bu sadece eğlence içindi)


hala eğlenmek için + 1'imi aldın.
vsz

Tam sürüm numarasını yazdırmak uygun mudur? (Bu, 4 bayt golf aşağı ve olası Python sürümlerini genişletir.)
A _

Ayrıca bu iyi mi? tio.run/##K6gsycjPM/7/…
A _

3

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

( <BS>ASCII kodu 8. <ESC>, ASCII kodu 27 anlamına gelir.)

#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");}

Sadece Vim kullanarak test ettiğim vi kodunu çalıştırmak için bu komutu kullanın:

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

3

Bu ucuz bir dil seçimi, ancak işte burada:

CoffeeScript, JScript, Mozilla Javascript (≈ JavaScript 1.3), ECMAScript Edition 5, ECMAScript Edition 3, 223 karakter, puan score 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, 263 karakter, (puan ≈ 0). Ayrıca kısaltabilirsin a="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...oh ve ayrıca golf oynamayı deneyebilirsin ....
Math chiller

@tryingToGetProgrammingStraight Her şeyi böyle bir satıra koymak CoffeeScript'te (Javascript'ten ayrı bir dildir) geçerli bir sözdizimi değildir. Diğerleri tartışılabilir, ancak dillerin ne kadar farklı olması gerektiği belirtilmediğinden, farklı uygulamaların farklı belirlenmiş davranışlara sahip oldukları gerçeğinin onların ayrı olarak ele alınmasına izin verdiğini düşünüyorum.
Peter Olson

Ben de çok satırlı bir yorum yazamıyorum, kullanmış göründüğünüz tek golf oyunu {/ }/ ;... adışlamak "undefined", fikri yeniden kullanmaktan kaçınmak için kullanmak , bunu b=alertve sonrasında da yapabiliyorsunuz b("this is also still just javascript"). Yine de The golden rule of CoffeeScript is: "It's just JavaScript"( coffeescript.org ' dan ), altıncı bir dil eklemek için bazı jquery kullanabilirsiniz ....
Math chiller

1
@tryingToGetProgrammingStraight jQuery'yi eklemek saçma olur, çünkü jQuery bir kütüphanedir, bir dil değildir. CoffeeScript kesinlikle ECMAScript ile aynı dilde değil. Bir dilin tanımı sonlu bir alfabe üzerindeki sonlu dizeler kümesidir. Geçerli CoffeeScript programlarını temsil eden dizi kümesi, geçerli ECMAScript'i temsil eden dizi dizisi ile aynı değildir.
Peter Olson

1
Yapabilir misin [].mapyerine Array.prototype.map?
ETHproductions

3

Java, Lisp, Boşluk, Intercal, PHP, Befunge-98; puan = 0,0189

Bu başlangıçta bir cevap oldu bu .

 ;\\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

Bu Java ile çalışmayacak; kadar her satır public class...derleyici sorununa neden olacaktır.
Ypnypn

İlginç ... Bunu bir derleyicide test ettiğimi ve çalıştığını açıkça hatırlıyorum ... ya da belki de
Juan Sebastian Lozano

@Ypnypn "T" nin bir sekme olduğunu, "S" nin bir boşluk olduğunu ve "L" nin beyaz boşlukta bir satır beslemesi olduğunu ve bu nedenle derleyici hatasına neden olmadığını unutmayın.
Juan Sebastian Lozano,

Ah; bu mantıklı.
Ypnypn

3

Windows Toplu İş, TI-Basic, Golf-Basic 84 , Quomplex ve GTB 5 * 2/93 = 0,11

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

Nasıl çalışır

Windows Batch en kolayıydı, çünkü ::bir yorum başlattı. Uygulaması oldukça basit.

TI-Basic küçük harfleri veya arka harfleri desteklemiyor d`"GOLF-BASIC 84":g`1, Golf-Basic'in uyardığı ifadeleri atlamıyor, mesajı görüntülüyor ve derhal sona erdiği Etiket 1'e iletiyor. Bu, kullanışlı ekran karakteriyle GTB'ye benzer ~. Bu arada, ekranı olmayan bir dize konacaktır Ans. Bunu izleyen hiçbir Ekran komutu yoksa, bunun Ansçıktısı alınacaktır (burada değil).

Quomplex başlangıçta gizlice girmişti çünkü karmaşık sözdizimi atlanmaya izin vermiyor. Yaptığı tek şey "Quomplex"çıktıya eklemek ve ardından programın ustalığı için ...

Programlama Sözdiziminin Ustalığı

:"'*[]'"

Saf dahi. Quomplex, görmezden gelir :ve karakter dizileri olarak alır "'ve '"istif çıktısını alır ve sonsuz bir süre içinde döngü sırasında yok olur ( []). Bu arada, Golf-Basic ve TI-Basic "'*[]'"bir dize olarak kabul eder, çünkü 'matematiksel bir operatördür, bir string operatör değil.


Kesin konuşursak, :bir toplu iş dosyasındaki bir etiketi belirtir, yorum yapmaz. Yine de hiçbir şeyi kendi başına yürütmediği doğrudur.
Mark

@Mark Doğru, ancak öyle ::(yine de bir etiket). REMÖzellikle TI-Basic'te gerekli olduğundan daha çok kullanmayı tercih ederim .
Timtech

Doğru - Sadece bilgiçlik yapıyordum. Ayrıca, toplu iş dosyalarını ilk etapta kullanmak için +1. :-)
Mark

2

JScript, EcmaScript Sürümü 3, 5, 6, 2016, Düğüm, Mozilla JavaScript (puan ≈ 0.1342)

Bu cevap aslında Peter Olson'ın cevabına dayanıyor , ancak eksi CoffeeScript (boşluk açısından önemli olan diller golf oynamak için korkunç olabilir).

Ayrıca Node , ES6 ve ES2016'yı da ekledim ve kodu az önce golf oynadım, neredeyse orijinal skoru üçe katladı.

$=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 dil, 348 bayt, puan: 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]);}

Bu, C (gcc), C ++ (gcc), C (ecpp), C ++ (ecpp), C (clang), C ++ (clang), C (tcc), sh, çizgi, bash, zsh, ksh, csh içerisinde çalışır. tcsh, rk ve SIL.


0

JScript, EcmaScript Sürümü 3, 5, 6, 2016, 2017, Düğüm, Mozilla JavaScript (puan = .174193548387), CoffeeScript (boşluk açısından önemli diller golf oynamak için korkunç olabilir).

$=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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.