Поліглот з обмеженими можливостями


20

Поліглоти - це програми, які діють в декількох мовах програмування одночасно. Більшість таких поліглотів написані таким чином, що певні конструкції однієї мови інтерпретуються як коментарі іншої мови (наприклад, #defineв C інтерпретується як коментар у кількох мовах скрипту).

Мені цікаво побачити, чи можна зробити нетривіальний поліглот, який не містить коментарів, але також негайно змінюється, коли ви видаляєте будь-який непробільний символ, тому я закликаю вас придумати таку програму.

Конкретні правила такі:

  1. (Вихід). Ваша програма повинна виробляти деякий вихід на консолі під кожною з ваших мов. Тобто у вашій програмі заборонено просто виходити, не надрукуючи нічого.
  2. (Варіантність). Як послаблення стандартного визначення поліглота, вихід програми може відрізнятися між мовами.
  3. (Помилки). Ваша програма не повинна створювати помилок (широко визначених) на будь-якій з ваших мов. Для більшості мов це визначається як повернення ненульового коду виходу з компілятора та / або інтерпретатора.
  4. (Обмеження). Видалення будь-якого символу, який не є пробілом, з вашого коду має спричинити зміну своєї поведінки програми відповідно до кожної з ваших мов. Програма може "змінитися", ставши недійсною для цієї мови або змінивши отриманий вихід.
  5. Це виклик коду . Winner - програма, яка діє в більшості мов програмування. Зв'язки будуть розбиті на користь меншої тривалості програми.

Правило обмеження не поширюється на видалення кількох символів. Тобто, це добре, якщо видалення декількох символів одночасно не призведе до жодної зміни для однієї з ваших мов.

Зауважте, що правило обмеження передбачає, що ви не можете використовувати Whitespace як одну зі своїх мов, оскільки видалення будь-якого символу, який не є пробілом, не змінить поведінку програми Whitespace.

Ось простий приклад програми, яка виконує всі перераховані вище обмеження для мов Python 2 та Python 3:

print("Hello World!")

Видалення будь-якого символу в printобох мовах викине a NameError; вилучення будь-якої дужки або цитати призведе до SyntaxErrorвиведення a , а видалення будь-якого з символів рядка змінить вихід на обох мовах. (Зауважте, що print("hello", "world")це більш тонка, але все ж дійсна програма згідно з вищезазначеними правилами).

Цей приклад трохи кульгавий, оскільки Python 2 та Python 3 дуже схожі, тому я не прийму жодних інших рішень, які використовують лише різні версії однієї мови (особливо Python 2 та Python 3).


@ IngoBürk: Правило заважає писати функціональний поліглот, що включає пробіли , якщо якимось іншим мовою також не є пробіл.
nneonneo

1
FWIW ваш приклад, print("Hello World!")також дійсний код Ruby
Крістіан Лупаску

Трохи прикро, що прості відповіді (як моя) на [поліглот], як правило, можуть мати так багато мов.
Джастін

5
Щоб уникнути безлічі варіантів мови або мов із подібним синтаксисом, було б цікавіше вимагати, щоб дві мови вважалися різними, лише якщо програма виробляє різний вихід.
Жил "ТАК - перестань бути злим"

Відповіді:


13

Bash + GolfScript + CJam

"echo" []
{ cat<&3;} \
3<""<("echo" 'p'~)

Вихідні дані

Bash:

[]
p~

GolfScript:

"echo"
echo{ cat<&3;}0

CJam:

echo{ cat<&3;}-1echop

Є \x7fкінець виходу CJam.


... зачекайте, як це працює на всіх трьох мовах, не будучи зайвим?
nneonneo

@nneonneo Він просто друкує весь невикористаний код іншими мовами.
jimmy23013

8

Bash + Befunge

"echo" $,$,"ol":,,,@

друкує "привіт" у настрої.


1
Я можу засвідчити, що кожен персонаж (крім місця) робить щось у Befunge. Я не можу зробити це для Bash, хоча. Це вражає.
Джастін

7

bc, GolfScript, Homespring, так, Octave, Scilab (0 байт)

Гарантовано дотримуватися правила 4. Не переможець, але добре зробить у тайм-перерві.

Вихідні дані

до н.е.

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

GolfScript


Домашня пружина

In Homespring, the null program is not a quine.

так

?

Октава

GNU Octave, version 3.6.4
Copyright (C) 2013 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "x86_64-redhat-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.

For information about changes from previous versions, type `news'.

Scilab

Startup execution:
  loading initial environment

-->

2
Я знаю, що є esolang, який спеціально заважає лайкам 0 довжини, роблячи подібні речі (о, зачекайте, це Homespring ). Я вірю, так? виводить щось.
Джастін

Спасибі! На жаль, я не можу переконати так? для запуску на Linux ...
Денніс

1
Все, що мені було потрібно, - це додатковий пакет для моно. Ваша програма What?\n?, до речі, друкує .
Денніс

1
Також працює в GNU Make (якщо це мова програмування):make: *** No targets. Stop.
jimmy23013

1
@ user23013: Правильно. У цьому випадку це невірний запис, оскільки вихідний код make є 2.
Dennis

6

GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Octave + Matlab + Scilab + Numeric Topline +? Фуе + ха?

10

У Golscript, PHP, CJam, Mathematica, bc, Pyth, /// та TI-Basic він виводить 10.

У R він виводить [1] 10

У Octave він виводить ans = 10

У програмах Matlab і Scilab це виводиться ans = 10.

У числовій верхній лінії це виводить 0.

Якщо я правильно зрозумів Fueue, він виводить новий рядок, а потім діє як програма для котів.

Так, це виводить

What?
?

1
Також працює в CJam
серпень

5
Я не думаю, що інтерактивних перекладачів не слід рахувати.
nneonneo

2
Це чудово працює на багатьох мовах, але не дає виводу на стільки ...
Джастін,

1
Це також справедливо в HTML , bc , Matlab та Scilab . Якщо ви перейдете 72до цього 10, він повинен надрукувати 0у цифровій верхній лінії .
Денніс

HTML не є мовою програмування відповідно до мета-дискусії, оскільки не має засобів простої арифметики чи циклів.
Інго Бюрк

3

Здається, ця відповідь не є абсолютно правильною.
Я частково це виправив, і збираюся покращити іншу частину за кілька днів.

C ++ та Javascript

Ідея така:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");
int
main()
{
puts("Hi from C++!");
}

C ++: http://codepad.org/SK2wbIDL
Javascript: Просто скопіюйте код на консоль браузера

І набір виправлень, щоб його задовольнити

(Обмеження). Видалення будь-якого символу, який не є пробілом, з вашого коду має спричинити зміну своєї поведінки програми відповідно до кожної з ваших мов. Програма може "змінитися", ставши недійсною для цієї мови або змінивши отриманий вихід.

З боку Javascript:

Зміна int, mainабо putsстанеться збій при читанні неоголошеної змінної. Але boolі Hi from C++!сміливо можна змінювати. Давайте виправимо:

puts=function(){}
puts=function(s){s=='Hi from C++!'?bool:nope}

Якщо рядки рівні, він перевіряє існування bool, інше, якщо він руйнується з незадекларованим nope.

Тепер є 2 крапки з комою, які можна видалити. Перший - це виправлений esyly - просто видаліть новий рядок раніше int:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");int

Друге - раніше }, тому мені потрібне певне звуження, дійсне для обох мов і не вимагає крапки з комою в кінці в C ++ або форсування крапки з комою в js. Штраф:

while(0);

Неможливо пропустити крапку з комою в js, як це whileпотрібно організму.

Отже, програма на даний момент така:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(s){s=='Hi from C++!'?bool:nope};int=0");int
main()
{
puts("Hi from C++!");while(0);
}

З боку С ++:

Є дві проблеми: evalможе мати будь-яке ім'я, і ​​весь js-код можна змінити.

Я спробую виправити їх через кілька днів.


2

CJam + Golfscript

Гаразд, це дещо нудно, але це початок.

1,

Друкує "0" на обох мовах. Видалення 1причин спричиняє помилку, видаляючи ,натомість "1".

Те саме можна зробити з 1)або 1(. Є багато альтернатив.

(Так, я знаю, що це не код-гольф)


2

C і C ++

#include <stdio.h>
int main() { puts("Hello!"); return 0; }

C і C ++ - це різні мови, майже сумісні одна з одною - всупереч тому, що ви можете почути, C ++ не є сукупністю C. Подивіться на http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B, щоб дізнатися про деякі відмінності . Наведений вище приклад не є ідіоматичним C ++, але він працює і дає однаковий вихід як у C, так і у C ++.


Ви можете видалити 0для C.
Денніс


@Gilles: Якщо основна функція виконує повернення, яке не задає значення, статус припинення, повернутий у середовище хоста, не визначений. ( Проект C89 - 2.1.2.2 Розташоване середовище ) Це не робить програму недійсною та не змінює її вихід, тому для цілей цього питання її 0можна видалити.
Денніс

@Dennis Я вважаю, що не визначений код виходу вважає програму недійсною відповідно до правил цього питання. Якщо це не так, зробіть, що реалізація C89, де ця програма повертає ненульовий код виходу, наприклад, gcc -ansiна x86 (або багато інших архітектур: що трапляється, що повернене значення в putsкінцевому підсумку знаходиться в реєстрі, де час виконання читає значення повернутися з mainфункції).
Жил "ТАК - перестань бути злим"

@Gilles: Моя інтерпретація правила 3 ​​полягає в тому, що компілятор повинен повертати 0, а не програму.
Денніс

2

JavaScipt, Lua, R і Python 3 - 24 байти

Можу працювати на деяких інших мовах, я перевіряю останні.

alert=print;alert(1)

JavaScript був протестований на консолі Firefox та інших мовах тут , тут і тут


1

Perl + Ruby + Python

Я думаю, що в PHP це знадобиться крапкою з комою, якщо ви працюєте з -R.

print "Hello World!"

Це працює і в Python.
серпня

1
Також працює з Lua.
Trebuchette

1

Bash + sh + zsh + ksh, 4 байти:

echo

Дійсно просте і відповідає кожному правилу:

  1. Виводить новий рядок на кожній з мов.
  2. Наразі вихідні дані між різними мовами не відрізняються.
  3. Не створює помилок у жодній із мов ...
  4. ... за винятком випадків, коли будь-який із символів видаляється / змінюється.

0

Bash + sh + zsh + ksh + Batch Windows, 4 байти:

echo

Дійсно просте і відповідає кожному правилу:

Виводить новий рядок, який не варіюється в кожній з мов (але Windows Batch, який виводиться ECHO is on, на мові, яку ви використовуєте), не помиляється, за винятком випадків, коли будь-яка літера видаляється чи змінюється.


1
Здається, ваша відповідь майже ідентична цій: codegolf.stackexchange.com/a/100654/65326
Uriel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.