Schreiben Sie ein Polyglot, das den Namen der Sprache ausgibt

65

Ihre Aufgabe ist es, ein Programm zu schreiben, das mit so wenig Zeichen wie möglich in so vielen Sprachen wie möglich ausgeführt wird. Um triviale Lösungen zu vermeiden, muss das Programm den Namen der Sprache ausgeben, in der es ausgeführt wurde.

Wertung

Ihr Programm muss in mindestens 5 Sprachen arbeiten. Die Punktzahl eines Programms wird wie folgt angegeben:

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

Die höchste Punktzahl gewinnt, frühestens 10 Tage nach der ersten gültigen Antwort.

vsz
quelle
Würde die Verwendung einer Lösung wie print()Perl, Python, PHP, Processing und R als trivial angesehen, oder ist sie akzeptabel?
Rob
3
A kann kein Problem damit sehen. Die Schwierigkeit würde darin bestehen, die Druckeingabe pro Sprache zu wechseln.
mjgpy3
Ich hätte der Anzahl der Sprachen ein höheres Gewicht beimessen sollen ... es scheint, als wäre die Wahl, genau 5 zu haben, die beste. Ich frage mich, wie viele Sprachen im n * n / length
Siegerbeitrag enthalten gewesen
Das würde ich auch vorschlagen. Aufgrund der gegebenen Antworten glaube ich nicht, dass ich Ihre Frage richtig interpretiert habe.
Rob

Antworten:

39

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

Ergebnis ~ 0,1236

Für die C- und C-ähnlichen Codes bin ich @ baby-rabbit schuldig. Die anderen sind von der Erkenntnis inspiriert, dass viele Sprachen eine evalAussage haben, die widerwillig ungültige Syntax akzeptiert.

Gibt den Sprachnamen zur Standardausgabe aus. Es kann vorkommen, dass bei Standardfehlern viele Fehlermeldungen angezeigt werden. Unterdrücken Sie sie daher beim 2>/dev/nullAusführen mit.

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

Die PHP-Lösung gibt 'PHP'(einschließlich der einfachen Anführungszeichen), die die Regeln ein wenig biegen können.

Letzte Änderung: 12 Zeichen aus der Erkenntnis rasiert, $=die falsein Ruby, 60in Perl und print$=?...fast sicher ein Fehler in Bash ist. Der Perl / Ruby / Bash-Test kann jetzt in einer einzigen Bewertung zusammengefasst werden.

Wenn die Regeln mehr Biegen tolerieren, präsentiere ich diese 8-sprachige Lösung mit 43 Zeichen (Punktzahl 0.5262).

print("phperluarscriptrubypythoncatebg13");

enthält , für die der Ausgang der Namen des Interpreters für php, perl, lua, rscript, ruby, python, cat, und rot13.

Mob
quelle
1
TI-Basic unterstützt den letzten; addieren Sie einfach 6 Buchstaben und erhalten Sieprint("phperluarscriptrubypythontibasicatebg13");
Timtech
1
@Timtech nein, TI-Basic verwendet das Dispoder Output(oder text(Token, gibt es keinen print(Befehl. Wenn Sie eine Zeichenfolge als Teil eines ansonsten reellen Ausdrucks einfügen ERR:INVALID SYNTAX, wird die Zeichenfolge nicht angezeigt (auch nicht als Rückgabewert). (Auch gibt es keine ;; TI-Basic verwendet :)
AJMansfield
@ Ajmansfield Zu wahr, wie könnte ich vergessen:?
Timtech
12
Können Sie ersetzen echo Bashmit ps -ocomm= -p$$? Dadurch wird der Name der Shell für mindestens bash, zsh, ksh, csh und tcsh ausgegeben, möglicherweise für andere.
Digitales Trauma
19

C, C ++, BF, BASH und Ruby; 280 Zeichen

Der Wert liegt bei 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);}

Beachten Sie, dass ich ein Linux-System verwende.

Der Code wird mit den folgenden Befehlen ausgeführt oder kompiliert (der Name der Datei lautet test.c)

C:

gcc test.c

Wenn mit ausgeführt ./a.out, wird ausgegebenC

C ++:

c++ test.c

Wenn mit ausgeführt ./a.out, wird ausgegebenC++

BASH:

./test.c

Ausgänge: BASH

Rubin:

ruby test.c

Ausgänge: Ruby

Gehirn ***:

Verifiziert mit:

Ausgänge: brainfuck

Beachten Sie, dass bei Verwendung des JS-Debuggers die ersten beiden Minuszeichen entfernt werden müssen. Sie wurden eingefügt, um die Pluszeichen im Zeichenfolgenliteral auszugleichen "C++". Dies war ein sehr lustiges Projekt, ich arbeite daran, weitere Sprachen hinzuzufügen.

Zur weiteren Verdeutlichung hier die Angaben meines Interpreters / Compilers:

  • gcc version 4.6.3

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

  • GNU Bash, Version 4.2.24 (1) -Release (x86_64-pc-linux-gnu)

RANDNOTIZ

Mit dem Trick von @ baby-rabbit konnte ich meinen Code so erweitern, dass er in 7 Sprachen ausführbar ist (Objective-C und Objective-C ++ werden hinzugefügt). Dies ist nicht meine Lösung, da ich einige kopiert habe, aber ich dachte, ich würde es vorführen.

Update 9.12 SmallTalk mit gnu-smalltalk hinzugefügt!

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

Im obigen Code müssen Sie die Datei umbenennen, um den Namen der Sprache für Objective-C, Obj-C ++, C und C ++ zu erzeugen.

mjgpy3
quelle
Wäre es kürzer, wenn Sie ausgeben brainf***?
Mob
Ja, das würde ich glauben.
mjgpy3
Sie sollten if [ 1 = 2 ]anstelle von verwenden if [ 1 == 2 ], da Skripte ohne Hashbang von sh und nicht von bash ausgeführt werden. sh darf oder darf nicht bash sein, auf Debian ist es dash.
nyuszika7h
12

bash, c, c ++, obj-c, obj-c ++; 134 Zeichen; Punktzahl = 0,083

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

Datei umbenennen und ausführen / kompilieren als:

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

(wobei cc clang-421.10.42 ist)

Baby-Kaninchen
quelle
+1, da viele andere Antworten von Ihnen inspiriert wurden.
Kevin
11

Lua, Ruby, VimL, ​​Sed, Befunge (129 Zeichen; ~ 0,087 Punkte)

Ich bin mir nicht sicher, ob dies zählt - der Sed-Teil ist in die Shebang-Linie eingebettet, was wohl ein Hack ist, um die Einschränkung zu umgehen. Dies bedeutet auch, dass es als ausführbare Datei und nicht direkt mit ausgeführt werden sollte sed.

Ich hatte das Glück, dass alle anderen Sprachen (ohne Befunge) die shebang-Zeile automatisch ignorieren (obwohl Ruby sich anscheinend weigert, die Datei auszuführen, wenn sie eine shebang-Zeile enthält, in der die Zeichenfolge 'ruby' nicht enthalten ist).

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

Beispielnutzung:

% 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
quelle
5
Wow, eine Lösung ohne C
vsz
8

BF, Bash, Batch, C, vi (163 Zeichen; Punktzahl ≈ .0686)

( <ESC>steht für ASCII-Code 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 */

Ich habe dies als Batchdatei mit der MS-DOS 6.22-Version von COMMAND.COM getestet. Standardmäßig mischt dieser Interpreter Quellcodezeilen mit der Ausgabe. echo offFühren Sie vor dem Ausführen der Batchdatei die folgenden Schritte aus, um dies zu verhindern .

Verwenden Sie den folgenden Befehl, um den vi-Code auszuführen, den ich nur mit Vim getestet habe:

cat /dev/null > tmpfile && vi -s polyglot.sh tmpfile > /dev/null 2>&1 && cat tmpfile
PleaseStand
quelle
1
Sie könnten touch tmpfileoder : > tmpfileanstelle von verwenden cat /dev/null > tmpfile.
nyuszika7h
5

bash, zsh, ksh, csh, tcsh, 15 Zeichen, Score 0,745

Das ist ein bisschen schwierig, da sie alle verwandte Sprachen sind, aber es gibt Unterschiede:

ps -ocomm= -p$$
Digitales Trauma
quelle
Was ist mit Dash?
Elliot A.
4

Jedes Python-Release enthält 18.37291 Punkte

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

Technisch gültig, wenn Sie alle Python-Versionen als verschiedene Sprachen betrachten. Derzeit gibt es 116 Python-Versionen, von denen ich glaube, dass sie eine Punktzahl von etwa 18,37291 ergeben.

(Auch ich verstehe, wenn dies keine gültige Antwort ist, war dies nur zum Spaß)

EdgyNerd
quelle
du bekommst immer noch meine +1 nur zum Spaß.
vsz
Ist es möglich, die vollständige Versionsnummer auszudrucken? (Diese golfs 4 Bytes nach unten und erstreckt sich die möglichen Versionen Python.)
A _
Auch ist das in Ordnung? tio.run/##K6gsycjPM/7/…
A _
3

Bash, C, Gawk, Perl, vi (145 Zeichen; Punktzahl ≈ .077)

( <BS>steht für ASCII-Code 8. <ESC>steht für ASCII-Code 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");}

Verwenden Sie diesen Befehl, um den vi-Code auszuführen, den ich nur mit Vim getestet habe:

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

Dies ist eine billige Auswahl an Sprachen, aber hier geht's:

CoffeeScript, JScript, Mozilla Javascript (≈ JavaScript 1.3), ECMAScript Edition 5, ECMAScript Edition 3, 223 Zeichen, Punktzahl ≈ 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
quelle
5
JavaScript, JavaScript, JavaScript (≈ JavaScript), JavaScript, JavaScript, 263 Zeichen, (Punktzahl ≈ 0). Sie können es auch kürzer machen, a="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...oh, und Sie können es auch versuchen, Golf zu spielen ...
Math chiller
@tryingToGetProgrammingStraight Wenn Sie alles so in eine Zeile setzen, ist die Syntax in CoffeeScript (das ist eine andere Sprache als Javascript) ungültig. Die anderen sind fraglich, aber da nicht angegeben wurde, wie unterschiedlich die Sprachen sein müssen, denke ich, dass die verschiedenen Implementierungen ein unterschiedliches angegebenes Verhalten aufweisen, das es ihnen ermöglicht, als getrennt behandelt zu werden.
Peter Olson
i kann nicht auch einen mehrzeilige Kommentar schreiben, die nur Golf Sie verwendet zu haben scheinen ist das Weglassen {/ }/ ;... die Idee ist , zu verwenden , azu vermeiden , die Wiederverwendung "undefined", könnten Sie auch tun , b=alertund dann b("this is also still just javascript"). sowieso The golden rule of CoffeeScript is: "It's just JavaScript"(von coffeescript.org ), können Sie auch einige Jquery verwenden , um eine sechste Sprache .... hinzuzufügen
Math Kühler
1
@tryingToGetProgrammingStraight Das Hinzufügen von jQuery wäre absurd, da jQuery eine Bibliothek und keine Sprache ist. CoffeeScript ist definitiv nicht dieselbe Sprache wie ECMAScript. Die Definition einer Sprache ist eine Menge von endlichen Zeichenketten über einem endlichen Alphabet. Die Zeichenfolgen, die gültige CoffeeScript-Programme darstellen, stimmen nicht mit den Zeichenfolgen überein, die gültiges ECMAScript darstellen.
Peter Olson
1
Können Sie [].mapanstelle von tun Array.prototype.map?
ETHproductions
3

Java, Lisp, Whitespace, Intercal, PHP, Befunge-98; score = .0189

Dies war ursprünglich eine Antwort darauf .

 ;\\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
quelle
Dies funktioniert in Java nicht. Jede Zeile bis public class...verursacht ein Compilerproblem.
Ypnypn
Interessant ... Ich erinnere mich noch genau, wie ich das in einem Compiler getestet habe und es funktionierte ... oder vielleicht fällt mir mein Gedächtnis aus ...
Juan Sebastian Lozano
@Ypnypn Denken Sie daran, dass "T" ein Tabulator ist, "S" ein Leerzeichen und "L" ein Zeilenvorschub in Leerzeichen, weshalb es keinen Compilerfehler verursacht.
Juan Sebastian Lozano
Oh; Das macht Sinn.
Ypnypn
3

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

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

Wie es funktioniert

Windows Batch war am einfachsten, da ::fängt ein Kommentar an. Ziemlich einfach zu implementieren.

TI-Basic unterstützt keine Kleinbuchstaben oder Backticks und überspringt die Anweisungen d`"GOLF-BASIC 84":g`1, die Golf-Basic auswertet, zeigt die Nachricht an und leitet sie an Label 1 weiter, wo sie umgehend beendet wird. Ähnliches gilt für GTB mit seinem handlichen Displaycharakter ~. Übrigens wird eine Zeichenfolge ohne Anzeige eingegeben Ans. Wenn keine Anzeigebefehle folgen, Answird ausgegeben (hier nicht der Fall).

Quomplex hat sich am Anfang eingeschlichen, weil aufgrund seiner komplexen Syntax nicht viel übersprungen werden kann. Alles, was es tut, ist "Quomplex"die Ausgabe und dann für die Beherrschung des Programms hinzufügen ...

Die Beherrschung der Programmiersyntax

:"'*[]'"

Einfach genial. Quomplex ignoriert :und nimmt "'und '"als Zeichenketten und gibt den Stack aus und geht in einer unendlichen while-Schleife zugrunde ( []). Währenddessen nehmen Golf-Basic und TI-Basic das Ganze "'*[]'"als String, da 'es sich um einen mathematischen Operator handelt, nicht um einen String-Operator.

Timtech
quelle
Streng genommen :bezeichnet ein Etikett in einer Batch-Datei, keinen Kommentar. Es stimmt jedoch, dass es nichts alleine ausführt.
Mark
@Mark Stimmt, ist aber ::(trotzdem ein Label). Ich würde es lieber benutzen als REM, zumal es in TI-Basic benötigt wird.
Timtech
Richtig - ich war nur pedantisch. Auch +1 für die Verwendung von Batch-Dateien an erster Stelle. :-)
Mark
2

JScript, EcmaScript Edition 3, 5, 6, 2016, Knoten, Mozilla JavaScript (Punktzahl score 0,1342)

Diese Antwort basiert ursprünglich auf der Antwort von Peter Olson, jedoch ohne das CoffeeScript (da für das Golfen Whitespace-relevante Sprachen schrecklich sein können).

Ich habe auch Node , ES6 und ES2016 hinzugefügt und den Code ein wenig golfen, wodurch sich die ursprüngliche Punktzahl fast verdreifacht hat.

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

16 Sprachen, 348 Bytes, Score: 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]);}

Dies funktioniert in C (gcc), C ++ (gcc), C (ecpp), C ++ (ecpp), C (clang), C ++ (clang), C (tcc), sh, dash, bash, zsh, ksh, csh, tcsh, rk und SIL.

MD XF
quelle
0

JScript, EcmaScript Edition 3, 5, 6, 2016, 2017, Node, Mozilla JavaScript (Score = .174193548387), CoffeeScript (da Whitespace-signifikante Sprachen für das Golfen schrecklich sein können).

$=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)
user75200
quelle