Напишите полиглот, который печатает название языка


65

Ваша задача - написать программу, которая будет работать на максимально возможном количестве языков, используя как можно меньше символов. Чтобы избежать тривиальных решений, программа должна напечатать название языка, на котором она была запущена.

счет

Ваша программа должна работать как минимум на 5 языках. Оценка программы дается как:

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

Наивысший балл выигрывается не раньше, чем через 10 дней после первого правильного ответа.


Будет ли использование такого решения, как использование print()для Perl, Python, PHP, Processing и R, считаться тривиальным или это приемлемо?
Роб

3
Не вижу проблемы с этим. Трудность будет заключаться в переключении ввода печати на языке.
mjgpy3

Мне следовало бы придать большее значение количеству языков ... кажется, что выбор именно 5 является наиболее оптимальным. Интересно, сколько языков было бы в записи победителя, если бы счет былn * n / length
vsz

Я тоже собирался это предложить. Судя по предоставленным ответам, я не думаю, что правильно истолковал ваш вопрос.
Роб

Ответы:


39

Bash, C, C ++, Obj-C, Obj-C ++, Perl, PHP, Ruby, 183 символа

оценка ~ 0,1236

За C и C-подобные коды я задолжал @ baby-rabbit. Другие вдохновлены признанием того, что во многих языках есть evalутверждение, которое неохотно принимает неверный синтаксис.

Выводит название языка на стандартный вывод. Иногда генерирует много сообщений об ошибках стандартной ошибки, поэтому подавляйте их при 2>/dev/nullзапуске.

#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 'PHP'(включая одинарные кавычки), который может немного изменить правила.

Последнее редактирование: побрили 12 символов из проницательности, которая $=есть falseв Ruby, 60в Perl, и print$=?...почти наверняка ошибка в Bash. Из-за понимания побольше на 7 тест Perl / Ruby / Bash теперь может войти в один оператор eval.

Если правила могут терпеть больше изгибов, я представляю это 8 языков, 43 символа решения (оценка 0.5262)

print("phperluarscriptrubypythoncatebg13");

для которой выходной сигнал включает в себя имя для переводчика php, perl, lua, rscript, ruby, python, cat, и rot13.


1
TI-Basic поддерживает последний; просто добавьте 6 символов и получитеprint("phperluarscriptrubypythontibasicatebg13");
Timtech

1
@Timtech no, TI-Basic использует токены or Dispили Output(or text(, print(команды нет . И включение строки как части выражения с вещественным значением приводит ERR:INVALID SYNTAXк отображению строки, а не к ее отображению (даже в качестве возвращаемого значения). (Также нет ;; TI-Basic использует :)
AJMansfield

@ AJMansfield Слишком верно, как я мог забыть:?
Timtech

12
Вы можете заменить echo Bashна ps -ocomm= -p$$? Это выведет имя оболочки как минимум для bash, zsh, ksh, csh и tcsh, возможно, для других.
Цифровая травма

19

C, C ++, BF, BASH и Ruby; 280 символов

Оценка около 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);}

Обратите внимание, что я использую систему Linux.

Код запускается или компилируется с помощью следующих команд (имя файла test.c)

C:

gcc test.c

При запуске с ./a.outвыводомC

C ++:

c++ test.c

При запуске с ./a.outвыводомC++

BASH:

./test.c

Выходы: BASH

Рубин:

ruby test.c

Выходы: Ruby

BrainF ***:

Проверено с использованием следующего:

Выходы: brainfuck

Обратите внимание, что если используется отладчик JS, то первые два знака минус необходимо удалить. Они были включены для смещения знаков плюс в строковом литерале "C++". Это был очень веселый проект, я работаю над добавлением новых языков.

Просто для большей ясности, вот спецификации моего интерпретатора / компилятора:

  • gcc версия 4.6.3

  • ruby 1.9.3p194 (редакция 2012-04-20 35410) [x86_64-linux]

  • GNU bash, версия 4.2.24 (1) -релиз (x86_64-pc-linux-gnu)

ПРИМЕЧАНИЕ

Используя трюк @ baby-rabbit, я смог расширить свой код, чтобы он был исполняемым на 7 языках (добавлены Objective-C и target-C ++). Это не мое решение, так как я скопировал некоторые из них, но подумал, что смогу их показать.

Обновление 9.12 Добавлен запуск SmallTalk с помощью gnu-smalltalk!

SmallTalk, C, C ++, Objective-C, Objective-C ++, BASH, BF, Ruby; 384 символа (оценка: 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

В приведенном выше коде вам нужно будет переименовать файл, чтобы получить имя языка для target-c, obj-c ++, c и c ++.


было бы короче, если вы выводите brainf***?
моб

Да, было бы, я верю.
mjgpy3

Вы должны использовать if [ 1 = 2 ]вместо if [ 1 == 2 ], потому что сценарии без hashbang выполняются sh, а не bash. sh может быть или не быть bash, в Debian это тире.
nyuszika7h

12

bash, c, c ++, obj-c, obj-c ++; 134 знака; оценка = 0,083

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

переименуйте файл и запустите / откомпилируйте как:

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

(где cc - clang-421.10.42)


+1, так как многие другие ответы, за которые проголосовали, были вдохновлены вашими
Кевин - Восстановить Монику

11

Lua, Ruby, VimL, ​​Sed, Befunge (129 символов; ~ 0,087 балла)

Не уверен, что это считается - sed-часть встроена в линию shebang, что, возможно, является хаком, чтобы обойти ограничение. Это также означает, что он должен запускаться как исполняемый файл, а не как напрямую sed.

Мне повезло, что все остальные языки (без Befunge) автоматически игнорируют строку shebang (хотя, очевидно, Ruby отказывается запускать файл, если в нем есть строка shebang, в которой нет строки 'ruby').

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

Пример использования:

% 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
Ничего себе, решение, которое не включает C
vsz

8

BF, Bash, Batch, C, vi (163 символа; оценка ≈ .0686)

( <ESC>расшифровывается как 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 */

Я проверил это, как командный файл, с версией COMMAND.COM для MS-DOS 6.22. По умолчанию этот интерпретатор смешивает строки исходного кода с выводом. Чтобы этого не произошло, выполните echo offперед запуском командного файла.

Чтобы выполнить код vi, который я тестировал только с помощью Vim, используйте следующую команду:

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

1
Вы можете использовать touch tmpfileили : > tmpfileвместо cat /dev/null > tmpfile.
nyuszika7h

5

bash, zsh, ksh, csh, tcsh, 15 символов, оценка 0,745

Это немного натянуто, поскольку все они родственные языки, но есть различия:

ps -ocomm= -p$$

Как насчет тире?
Эллиот А.

4

Каждый выпуск Python, 18,37291 баллов

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

Технически допустимо, если вы считаете, что все версии Python являются разными языками. В настоящее время существует 116 версий Python, что, по моему мнению, дает мне оценку 18,37291.

(Также я понимаю, если это не считается правильным ответом, это было просто для удовольствия)


Вы все еще получаете мой +1 просто для удовольствия.
вс

Жизнеспособна ли печать полного номера версии? (Это ускоряет 4 байта и расширяет возможные версии Python.)
_

И это нормально? tio.run/##K6gsycjPM/7/…
A _

3

Bash, C, Gawk, Perl, vi (145 символов; оценка ≈ .077)

( <BS>обозначает код ASCII 8. <ESC>обозначает код 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");}

Чтобы выполнить код vi, который я тестировал только с помощью Vim, используйте эту команду:

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

3

Это дешевый выбор языков, но здесь идет:

CoffeeScript, JScript, Mozilla Javascript (≈ JavaScript 1.3), ECMAScript Edition 5, ECMAScript Edition 3, 223 символа, оценка ≈ 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 символа, (оценка ≈ 0). Вы также можете сделать его короче a="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...ой, и вы также можете попробовать играть в гольф ....
Математический чиллер

@tringToGetProgrammingStraight Размещение всего в одну строку, как это, не является допустимым синтаксисом в CoffeeScript (который является отдельным языком от Javascript). Другие спорны, но поскольку не было указано, какими должны быть разные языки, я думаю, что тот факт, что разные реализации имеют разные заданные поведения, позволяет рассматривать их как отдельные.
Питер Олсон

я также не могу написать многострочный комментарий, единственный вид игры в гольф, который вы использовали, - это пропустить {/ }/ ;... идея состоит в том, aчтобы избежать повторного использования "undefined", вы также можете сделать это b=alertи тогда b("this is also still just javascript"). в любом случае The golden rule of CoffeeScript is: "It's just JavaScript"сайта coffeescript.org ), вы также можете использовать jquery для добавления шестого языка ....
Math Chiller

1
@tringToGetProgrammingStraight Добавление jQuery было бы абсурдом, поскольку jQuery - это библиотека, а не язык. CoffeeScript определенно не является тем же языком, что и ECMAScript. Определение языка - это набор конечных строк над конечным алфавитом. Набор строк, представляющих допустимые программы CoffeeScript, не совпадает с набором строк, представляющих действительный ECMAScript.
Питер Олсон

1
Вы можете сделать [].mapвместо Array.prototype.map?
ETHproductions

3

Java, Lisp, Whitespace, Intercal, PHP, Befunge-98; оценка = 0,0189

Это был первоначально ответ на это .

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

Это не будет работать в Java; каждая строка до public class...будет вызывать проблему компилятора.
Ypnypn

Интересно ... Я отчетливо помню, как тестировал это в компиляторе, и он работал ... или, может быть, моя память меня подводит ...
Хуан Себастьян Лозано

@Ypnypn Помните, что «T» - это вкладка, «S» - это пробел, а «L» - это перевод строки в пробел, поэтому он не вызывает ошибку компилятора.
Хуан Себастьян Лосано

Ой; это имеет смысл.
Ypnypn

3

Пакет Windows, TI-Basic, Golf-Basic 84 , Quomplex и GTB 5 * 2/93 = 0,11

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

Как это устроено

Пакет Windows был самым простым, потому что ::начинается комментарий. Довольно прост в реализации.

TI-Basic не поддерживает строчные буквы или обратные кавычки, заставляя его пропустить операторы d`"GOLF-BASIC 84":g`1, которые Golf-Basic оценивает, отображая сообщение и перенаправляя его на метку 1, где оно быстро заканчивается. Это похоже на GTB, с его удобным отображаемым символом ~. Кстати, строка без отображения будет вставлена Ans. Если после него нет команд отображения, Ansбудет выведен результат (здесь это не так).

Quomplex был добавлен вначале, потому что его сложный синтаксис не позволяет пропускать многое. Все, что он делает, это добавляет "Quomplex"к выводу, а затем для освоения программы ...

Овладение синтаксисом программирования

:"'*[]'"

Чистый гений. Quomplex игнорирует :и принимает "'и '"как строки, оставляя его для вывода стека и погибает в бесконечном цикле while ( []). Между тем, Golf-Basic и TI-Basic воспринимают целое "'*[]'"как строку, потому что 'это математический оператор, а не оператор строки.


Строго говоря, :обозначает метку в командном файле, а не комментарий. Правда, он ничего не выполняет сам по себе.
Марка

@Mark True, но есть ::(но все же ярлык). Я предпочел бы использовать это, чем REM, тем более, что это требуется в TI-Basic.
Timtech

Да, я просто был педантиком. Кроме того, +1 для использования командных файлов в первую очередь. :-)
Отметить

2

JScript, EcmaScript Edition 3, 5, 6, 2016, Node, Mozilla JavaScript (оценка ≈ 0.1342)

Этот ответ изначально основан на ответе Питера Олсона, но за исключением CoffeeScript (так как значимые для пробелов языки могут быть ужасны для игры в гольф).

Я также добавил Node , ES6 и ES2016 и немного поиграл в код, почти в три раза превысив исходную оценку.

$=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 языков, 348 байт, оценка: 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]);}

Это работает в C (gcc), C ++ (gcc), C (ecpp), C ++ (ecpp), C (clang), C ++ (clang), C (tcc), sh, dash, bash, zsh, ksh, csh, tcsh, rk и SIL.


0

JScript, EcmaScript Edition 3, 5, 6, 2016, 2017, Node, Mozilla JavaScript (оценка = .174193548387), CoffeeScript (так как значимые для пробелов языки могут быть ужасны для игры в гольф).

$=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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.