Напишіть поліглот, який друкує назву мови


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

За коди, подібні до С та С, я зобов’язаний боргу @ 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в Рубі, 60в Перлі, і print$=?...майже напевно є помилкою у Баша. Поголений ще 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 ні, TI-Basic використовує Dispабо Output(або 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++

БАШ:

./test.c

Виходи: BASH

Ruby:

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 мовах (додаються target-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 ], тому що скрипти без хешбангу виконуються sh, а не bash. sh може бути, а може і не бути, на 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.mm

(де куб.см - 421.10.42)


+1, оскільки багато інших схвалених відповідей були натхнені вашими.
Кевін

11

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

Не впевнений, чи зараховується цей - седальна частина вбудована в лінію 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
vs

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

Я перевірив це, як пакетний файл, з версією MS-DOS 6.22 COMMAND.COM. За замовчуванням цей інтерпретатор змішує рядки вихідного коду з вихідними. Щоб цього не сталося, виконайте 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 версій пітона, які, на мою думку, дають мені оцінку приблизно в 18,37291.

(Також я розумію, якщо це не вважається правильною відповіддю, це було просто для задоволення)


ви все одно отримуєте мій +1 просто для розваги.
vsz

Чи можливий друк повного номера версії? (Це гольфи вниз 4 байта і розширює можливі версії Python.)
A _

Також це гаразд? 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...і ви також можете спробувати гольф ....
Математичний чиллер

@tryingToGetProgrammingStraight Введення всього в один рядок не є коректним синтаксисом у 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
@tryingToGetProgrammingStraight Додавання jQuery було б абсурдом, оскільки jQuery - це бібліотека, а не мова. CoffeeScript, безумовно, не є тією ж мовою, що і ECMAScript. Визначення мови - це набір кінцевих рядків над скінченним алфавітом. Набір рядків, що представляють дійсні програми CoffeeScript, не збігається з набором рядків, що представляють дійсні ECMAScript.
Пітер Олсон

1
Ви можете зробити [].mapзамість цього Array.prototype.map?
ETHproductions

3

Java, Lisp, Whitespace, Intercal, PHP, Befunge-98; оцінка = .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 Batch, 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 Batch був найпростішим, тому що ::починається коментар. Досить простий у виконанні.

TI-Basic не підтримує малі літери чи зворотні посилання, внаслідок чого він пропускає заяви d`"GOLF-BASIC 84":g`1, які Golf-Basic евакуює, Відображаючи повідомлення та пересилаючи до мітки 1, де вона негайно закінчується. Це схоже на GTB, зі зручним характером відображення ~. До речі, рядок без дисплея буде вставлено Ans. Якщо за ним не буде команд Display, Ansбуде виведено (тут справа не в тому випадку).

Quomplex був викрадений на початку, оскільки його складний синтаксис не дозволить багато пропустити. Все, що він робить, це додати "Quomplex"до виводу, а потім для оволодіння програмою ...

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

:"'*[]'"

Чистий геній. Quomplex ігнорує :і приймає "'і '"як рядки, залишаючи його для виведення стека і гинуть у нескінченному циклі while ( []). Тим часом Golf-Basic і TI-Basic сприймають ціле "'*[]'"як струну, тому що 'це математичний оператор, а не струнний оператор.


Строго кажучи, :вказує мітку в пакетному файлі, а не коментар. Це правда, що вона нічого не виконує самостійно.
Марк

@Mark True, але є ::(все ж мітка, хоча). Я вважаю за краще використовувати його REM, тим більше, що це вимагається в TI-Basic.
Тімтех

Правильно - я просто був педантичним. Також +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.