Поліглоти - це програми, які діють в декількох мовах програмування одночасно. Більшість таких поліглотів написані таким чином, що певні конструкції однієї мови інтерпретуються як коментарі іншої мови (наприклад, #define
в C інтерпретується як коментар у кількох мовах скрипту).
Мені цікаво побачити, чи можна зробити нетривіальний поліглот, який не містить коментарів, але також негайно змінюється, коли ви видаляєте будь-який непробільний символ, тому я закликаю вас придумати таку програму.
Конкретні правила такі:
- (Вихід). Ваша програма повинна виробляти деякий вихід на консолі під кожною з ваших мов. Тобто у вашій програмі заборонено просто виходити, не надрукуючи нічого.
- (Варіантність). Як послаблення стандартного визначення поліглота, вихід програми може відрізнятися між мовами.
- (Помилки). Ваша програма не повинна створювати помилок (широко визначених) на будь-якій з ваших мов. Для більшості мов це визначається як повернення ненульового коду виходу з компілятора та / або інтерпретатора.
- (Обмеження). Видалення будь-якого символу, який не є пробілом, з вашого коду має спричинити зміну своєї поведінки програми відповідно до кожної з ваших мов. Програма може "змінитися", ставши недійсною для цієї мови або змінивши отриманий вихід.
- Це виклик коду . 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).
print("Hello World!")
також дійсний код Ruby