Коли була випущена ця мова?


92

Ваше завдання просте. Вам потрібно написати програму, яка друкує або STDOUT, або файл, у якому було випущено рік, на якому вона виписана. Оскільки це таке просте завдання, поворот полягає в тому, що він повинен бути написаний якомога більше різних мов.

Ваш бал - це загальна кількість різних років, які правильно надруковані.

Для кожної мови, якою ви користуєтесь, ви повинні

  • Вкажіть, яку версію мови ви використовуєте. (Якщо є кілька версій)

  • Вкажіть, у якому році ця версія була вперше випущена, і

  • Надайте посилання на сторінку, що підтверджує дату вашої версії / мови.

Будь-яка з них вважається доказовою датою випуску, якщо вона вказує номер версії (якщо це застосовується) та дату випуску.

  • Сторінка вікіпедії.

  • Esolangs сторінка.

  • Офіційний веб-сайт мови. Сторінка github або подібне число до тих пір, поки вона має дату випуску. (Остання фіксація не враховується, якщо в коді є номер версії)

Якщо не існує декількох версій або версій мови, просто використовуйте початкову дату випуску мови.

Незначні версії одного і той же мови дійсно вважаються різними мовами, до тих пір , як вони приходять з різних років , і до цих пір проводять правильний висновок. Ви не можете використовувати будь-які вбудовані дані, що дають вам інформацію (включаючи дату випуску) про поточну версію мови, якою ви користуєтесь. Наприклад, це недійсне подання python:

import platform
i = platform.python_version()
if i == '3.5':
    print(2015)
if i == '3.4':
    print(2014)
if i == '3.3':
    print(2012)
...

Незалежно від подання, яка надрукує найбільш виграшні роки!

Правила

  • Кожна програма повинна роздрукувати мовний рік та нічого більше . Дозволена нова лінія (стиль Windows або * nix).

  • Жодна програма не може брати жодної інформації.

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

  • Будь-яка з програм може надрукувати на STDERR або викинути під час виконання / компілювати помилки та попередження часу, доки правильний вихід все ще надрукується в STDOUT або файл.

  • Різні мови можуть використовувати різні методи вводу-виводу, але вони найчастіше є повноцінними програмами (функції не дозволені для цього виклику) та дотримуйтесь одного з наших дозволених методів вводу-виводу за замовчуванням .

Щасливого поліголінгу в гольф !


Оскільки Pip не має сторінки Вікіпедії або Esolangs, просто має GitHub і не має жодних "випусків" у розумінні цього слова GitHub, чи він не придатний для використання в цьому виклику? (У нього є номер версії, який оновлюється під час кожної
комісії

1
@dlosc Ну, я не хочу зайво виключати будь-які мови, але хочу переконатися, що "дата випуску" залишається цілком об'єктивною. Чи можете ви придумати будь-які кращі способи застосування дати випуску, яка включала б більше мов?
DJMcMayhem

4
(випадково вставляє код Whitespace для друку 2003 року в основному в кожному окремому поданні)
Value Ink

8
"Ви не можете використовувати будь-які вбудовані файли, які дають вам інформацію про поточну версію мови, яку ви використовуєте." Мій акцент. Чи можу я шукати дату складання у файлі інтерпретатора?
Адам

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

Відповіді:


159

Коротка історія 2D мов програмування: 16 (+2) років

v19977/2{@{{4{\_______>/02&&&#????        *    P+++++1P1P-1P+1E     *                         *
\'\02'oo100@n590@n;                       *                         *                         *
>"8991",,,;5-;,@                          *                         *                         *
   *                                      *                         *                         *
  \ *              ++++++++++++++++++++++++  ++++++++++++++++++++++++  ++O--OO++++++++OX*******      *
     *   #2018O@       *                  *      *                  *      *                  *      *
      *                *                  *      *                  *      *                  *      *
       *               *                  *      *                  *      *                  *      *
        *           ****    ****          *   ****    ****          *   ****    ****          *   ****    *****
         *         *   *   *    *         *  *   *   *    *         *  *   *   *    *         *  *   *   *
          *        *   *  *      *        *  *   *  *      *        *  *   *  *      *        *  *   *  *
           *      *    * ****     *       * *    * ****     *       * *    * ****     *       * *    * ****
            *     *    *     *            * *    *     *            * *    *     *            * *    *     *
R"2014";     *****      *******       ******      *******       ******      *******       ******      *******

 x
x%"2010"x
 x

$'main'        \/\/\/\
 \-[2005]o-#   \++++++\
               /++++++/
               \++++++\
               /++++++/
               \/\/\/\++.--..+++.#

S1^2^2^6^8MAOUOAOOF

      /K:0:1:@

  >      "7102"4&o@

|        }+++++[>++++++++++<-]>.--..++++++.@

Я згадав, що мені подобаються 2D мови програмування?

1993: Befunge

Мова, яка (нібито, див. Останній розділ) почала все це. У Befunge ви можете перенаправляти керуючий потік за допомогою <v>^, але тепер всюдисущих дзеркал \і /ще нічого не було. Інтерпретатор Befunge, який використовується на Anarchy Golf, ігнорує невідомі команди. Ми можемо скористатися цим, щоб відрізнити родину Бефунге від родини> <>. Отже, код, виконаний Befunge, такий:

v
\
>"8991",,,;5-;,@

"8991"Розсовує окремі символи в стек. ,,,друкує перші три з них. Тоді ;невідомо (що ми будемо використовувати для того, щоб відрізнити його від Befunge 98), 5-перетворює 8на a 3і ,друкує, що ще до @завершення програми.

1997: Wierd

Написання цієї частини рішення зайняло мене, ймовірно, до тих пір, як написати всі інші та прилаштувати їх разом ...

Wierd знає лише два символи: простір та все інше. Вказівник вказівки намагається прослідкувати шлях, утворений непробільними символами, починаючи діагонально з верхнього лівого кута і завжди намагаючись пройти якомога прямо. Згини в контурі утворюють фактичні вказівки (із градусами повороту, що визначають, яку інструкцію виконати). Отже, код, який бачив Wierd, такий:

v1997                                     *                         *                         *
 '                                        *                         *                         *
  8                                       *                         *                         *
   *                                      *                         *                         *
    *              ++++++++++++++++++++++++  ++++++++++++++++++++++++  ++O--OO++++++++OX*******      *
     *                 *                  *      *                  *      *                  *      *
      *                *                  *      *                  *      *                  *      *
       *               *                  *      *                  *      *                  *      *
        *           ****    ****          *   ****    ****          *   ****    ****          *   ****    *****
         *         *   *   *    *         *  *   *   *    *         *  *   *   *    *         *  *   *   *
          *        *   *  *      *        *  *   *  *      *        *  *   *  *      *        *  *   *  *
           *      *    * ****     *       * *    * ****     *       * *    * ****     *       * *    * ****
            *     *    *     *            * *    *     *            * *    *     *            * *    *     *
             *****      *******       ******      *******       ******      *******       ******      *******

1997На самому верху на насправді не виконується, але Wierd дозволяє нам читати його з вихідного коду, який є набагато коротше , ніж намагатися будувати коди символів для себе чотирьох цифр (навіть якщо він не схожий на нього .. .). Мені не подобається зламати всю цю річ, але ви чітко бачите чотири повторювані розділи. Це означає, що ми спочатку зберігаємо 1на стеці, а потім збільшуємо кожен із цих чотирьох розділів 1, а потім гілки. Нижня гілка штовхає іншу1, отримує вихідний символ за цими координатами і друкує його, тоді як верхня гілка перенаправляється до наступного розділу. Вам може бути цікаво, чому кінці шляхів настільки непотрібні довгі, але це тому, що, коли Wierd потрапляє в кінець шляху, він намагається перейти на сусідній шлях, перш ніж вирішити, що він повинен припинити поточну гілку. Щоб цього уникнути, нам потрібно перемістити ці кінці досить далеко від будь-якого іншого коду.

1998: Befunge 98

Befunge отримав досить відоме оновлення в 1998 році з дуже жорсткою специфікацією, яку можна узагальнити до довільних розмірів (і, думаю, також довільних топологій). Це значною мірою назад сумісно з Befunge, що робить його досить простим на поліглот. У цьому Befunge досі не було дзеркал, тому виконаний шлях такий же, як і для Befunge 93:

v
\
>"8991",,,;5-;,@

Різниця в тому, що Befunge 98 не ігнорує ;. Натомість це трохи нагадує коментар у тому, що всі команди до наступної ;ігноруються. Таким чином, ми не зменшуємо , що 8до 3і друкувати 1998як є.

2001: Космічний од ... PingPong

2001 рік - рік Піта, але я справді не відчував, як поліглотувати файл зображення з усіма іншими програмами, тому ось менш відома 2D мова. Здається, має досить багато функцій (якими ми не збираємось користуватися). Спасибі Sp3000 за те, що він знайшов оригінального перекладача (який є єдиним мертвим посиланням на архівній версії офіційного веб-сайту).

PingPong дещо незвично тим, що в ньому є лише дзеркала та відсутні <v>^перенаправлення. Таким чином, це рухається по початку v19977на початку, а потім потрапляє в дзеркало, яке обгортає його донизу. Тоді відповідний код:

v19977/

...

      /K:0:1:@

...

Фактичний код досить простий: Kнатискає 20, цифри натискають на себе, :друкує ціле число та @припиняє програму.

2003: СНУСП

Це перша мова, де все стає простіше, оскільки SNUSP підтримує явну точку входу. Ця точка входу позначена символом $. Судячи з деяких статей про езоланг, ця мова надихнула декількох інших, але, на жаль, наприкінці дня це лише похідне Brainfuck. З цього приводу, я думаю, що спосіб встановлення поточної комірки до 48 є досить акуратним (і був викрадений із статті esolangs). Ось відповідна частина коду:

$'main'        \/\/\/\
               \++++++\
               /++++++/
               \++++++\
               /++++++/
               \/\/\/\++.--..+++.#

Це 24 +с, і дзеркала надсилають IP через кожне рівно двічі.

2004: Axo

З якої - то причини, ця мова дійсно є <^>редиректори , але замість звичайного vвін використовує %. Отже, це просто переміщується через перший рядок. Відповідний код:

v19977/2{@{{4{\

Для початку натискаємо кілька цифр, виконуємо ділення. Потім 2{друкує 2, @очищає стек. {{друкує два (неявні) 0s. 4{друкує 4та \припиняє програму.

2005: Залізничний

2005 рік був важким вибором. В жодному іншому році я не знайшов стільки 2D мов, і є ADJUST та Archway, обидва вони починаються в нижньому лівому куті (що полегшило б їх доповнення). Мені подобається Rail, але, оскільки він має чітку точку входу, теж не важко додати. Rail шукає лінію, що починається, $'main'і починає рухатися на південний схід від $. Це означає, що відповідний код:

$'main'
 \-[2005]o-#

The \і -є лише треками (no-ops). Це [2005]рядковий літерал, який oдрукується до #завершення програми.

2006: BestFriends.js

Двомірний Brainfuck. Є ще одна цікава мова цього року під назвою Black, яка починається з координати (3,3)(на основі 1), яка також зробила б використання цього в поліглоті також цікавим. Я не зміг знайти перекладача. Тож нам доведеться працювати з іншою похідною BF ...

Цікавим у цьому є те, що він не форматує сітку у рядки із стрічковими каналами, як у більшості інших двовимірних мов. Замість цього |використовується як роздільник рядків. Оскільки я не використовував |жодні інші мови, я міг просто поставити |на останній рядок, що робить всю решту програми єдиною лінією, що стосується BF.js. Відповідним кодом є такий (перетворюючи |на фактичну стрічку):

v19977/2{...
        }+++++[>++++++++++<-]>.--..++++++.@

BF.js не використовує <v>^ні дзеркала. Єдиний спосіб перенаправити керуючий потік - {}це повернути напрямок IP на 90 °. Тож ці брекети переміщують IP на другий рядок. Залишок - це звичайне рішення Brainfuck (не особливо добре гольф), яке встановлює клітинку 50(кодова точка 2), а потім друкує 2006, зміщуючи значення на трохи. @припиняє програму.

2008: BrainSpace 1.0

В цьому році я дійсно хотів би використовувати DOBELA , який використовує кілька точок входу і виглядає як Lovechild з РОЗПОДІЛУ і Ziim . На жаль, мені не вдалося змусити перекладача працювати. Отже ось ще одна похідна BF (остання, обіцяю).

На відміну від останнього, це один знає , як <v>^ і дзеркала, так що відповідний код:

v
\'\
  8

  \ *              ++++++++++++++++++++++++  ++++++++++++++++++++++++  ++O--OO++++++++OX

У цьому немає звичайного []циклу в стилі BF (замість цього вам потрібно буде сформувати фактичний цикл 2D), тому я просто вирішив жорстко ввімкнути, 50оскільки у мене все-таки було багато символів підряд від Wierd. Зауважте, що 'і 8ігнорується, *це умовний батут, який ми можемо ігнорувати, і Oце Brainfuck's .. XЗавершує програму.

2009: > <>

Мабуть, найпопулярніший Fungeoid (крім самого Befunge) принаймні навколо цих частин. > <> має <v>^і дзеркала, але і рядкові літерали, тому виконаний код такий:

v
\'\02'oo100@n590@n;

Буквальний рядок здебільшого служить для пропуску \ми, які ми використовували для BrainSpace 1.0, але, поки ми знаходимося на цьому, ми можемо також натиснути перші два символи. ooдрукує їх. Потім 100натискає три цифри, підсуває @верхню донизу і nдрукує 0знизу. Знову робимо те ж саме, з 590яким друкується 9. Якщо вам цікаво, чому я не просто друкую так, 2009як є, зачекайте на 2015 рік. ;Закінчується програма.

2010: Кардинал

Це було просто, тому що він має чітку точку входу на %. Однак цей створює 4 IP-адреси в усіх напрямках (звідси, гадаю, назва мови), і нам потрібно позбутися 3-х з них. Ось відповідний код:

 x
x%"2010"x
 x

Ну так. (У кардиналі рядковий режим друкується безпосередньо замість натискання символів на стек.)

2011 р .: RunR

Ще одна мова з чіткою точкою входу ( Девід Кетт, який створив кілька інших дуже приємних езолангів), на цей раз о S. Це робить відповідний код цією частиною:

S1^2^2^6^8MAOUOAOOF

RunR трохи цікаво, тому що більшість операцій працює з таким реєстром і значення повинні бути переміщені в стек явно для двійкових операцій. Цифри встановлюють значення регістру для себе і ^виштовхує поточний регістр до стеку. Тоді Mвідбувається множення (реєструвати значення часу, вискочене з стека), Uвіднімання, Aдодавання, Oвиводиться. Fприпиняє програму.

2012 рік: Ropy

Як і Вердер, Ропі намагається слідувати розділам непробільних символів, але тут вигини не визначають команди. Насправді виявляється, що Ропі більше схожий на мій власний Лабіринт тим, що обраний напрямок залежить від вершини стека. Однак нам насправді не потрібно про це турбуватися, тому що Ропі просто рухається по першій лінії:

v19977/2{@{{4{\_______>/02&&&#????

Є багато речей, які ми можемо ігнорувати >. Все, що нам потрібно знати, - це те, що верхня частина стека в цьому місці буде a, 4а там буде 2внизу.

>дублює 4, /є поділ, перетворюючи його на a 1. Потім натискаємо 02. &&&приєднується до чотирьох перших чисел стека у зворотному порядку, надаючи 2012. #виводить його. ????просто очищає стек, оскільки в іншому випадку також виводиться верхня частина стека.

Один із цікавих моментів полягає в тому, що другий 7в 19977доданий через Ропі. Розділ /у Ropy робить top / second(навпаки звичайному порядку в багатьох мовах, що базуються на стеках ), де можна 7 / 9було б дати 0. Якби у нас був нуль на вершині штабеля, Ропі робив би якісь дикі речі зі своїм напрямком руху, тому нам потрібно штовхнути іншого, 7щоб переконатися, що вершина штабу залишається позитивною, а Ропі продовжує рухатися на схід.

2014: Fission

З його чіткими точками входу це легко. RDLUстворити атоми (покажчики інструкцій) у відповідному напрямку, тож відповідний біт саме такий:

R"2014";

Зауважте, що Uв вихідному коді також є, але цей атом врешті-решт потрапляє на один *з Wierd, який припиняє програму (а цей атом займає набагато більше часу, ніж Rпотрібно друкувати 2014).

2015: Gol> <>

Потужніша <>> похідна Sp3000. Він значною мірою назад сумісний з> <>, тому виконаний код все ще:

v
\'\02'oo100@n590@n;

Однак напрямок обертання @змінено, що є стандартним трюком для розрізнення> <> і Gol> <> у поліглотах, тому цей друкується 15замість 09. Звідси дивність у другій половині програми.

2016: CSL

CSL дуже цікавий тим, що команди виконуються не відразу. Натомість кожна команда висувається на командний стек eі Eможе використовуватися для виконання команд з неї. Відповідним кодом стає:

v19977/2{@{{4{\_______>/02&&&#????        *    P+++++1P1P-1P+1E

Так Eвиконується весь стек команд, а це означає, що матеріал перед ним виконаний у зворотному порядку. Нам потрібно лише придивитися до *:

1+P1-P1P1+++++P*

В 1s випинати себе на стек даних. +і -є декрементом / збільшенням. Pдрукує верхню частину стека. Потім *намагається помножити два перших значення стека. Однак стек порожній, тому програма припиняє роботу.


У цей момент ми переходимо до мов, які були випущені після публікації цього виклику, тому я насправді не рахую їх за рахунок, тим більше, що я створив їх сам (не маючи на увазі цього виклику). Однак у них є якась нова семантика руху ІР, завдяки якій було легко вписати їх у поліглот, а також додати щось цікаве до цієї вітрини 2D мов.

2017: Аліса

Аліса була розроблена як багатофункціональний Fungeoid. Одне цікаве відмінність більшості (але не всіх) інших 2D мов полягає в тому, що IP може переміщуватися або ортогонально, або по діагоналі. Перемикання між ними також змінює семантику майже всіх команд у мові. Крім того, Alice підтримує як традиційні налаштування <^>vнапрямку, так і \/дзеркала, але дзеркала мають дуже унікальну поведінку в Alice (що дозволяє легко привести IP Alice до поки що невикористаної частини коду).

Хоча більшість мов трактують \і /як би дзеркала під кутом 45 °, а ІР - як промінь світла, що відбивається від нього, Аліса розглядає їх як кут 67,5 ° (що ближче до кута фактичних косих глифів) , і IP також рухається через дзеркало (звідси назва мови). Завдяки цьому куту дзеркала перемикаються між рухом по ортогональному або діагональному напрямкам. Крім того, перебуваючи в звичайному режимі (тобто в той час, коли IP рухається по діагоналях), сітка не загортається, і натомість IP відскакує від країв (тоді як у режимі Кардинала вона обертається навколо).

Загалом, код, виконаний Алісою, такий:

v19
\ \

...

  >      "7102"4&o@

...

IP починається у верхньому лівому куті, як зазвичай, vнадсилає його на південь. Тепер \відображається IP для переміщення на північний захід, де він негайно відскакує від лівого краю сітки (і замість цього рухається на північний схід). 1можна ігнорувати, IP відскакує від верхнього краю, щоб перейти на південний схід далі. Ми потрапили на інший, \який відображає північ IP. 9можна також ігнорувати, і тоді IP перегортається до нижньої частини сітки. Через пару ліній ми перенаправляємо його на схід >для зручності. Потім "7102"натискає кодові точки 2017, 4&oдрукує ці чотири символи та @припиняє програму.

2018: Wumpus

Wumpus - це перша двовимірна мова в трикутній сітці, яка робить рух по коду зовсім іншим (і знову дозволяє нам легко дістатися до невикористаної частини коду). Тож замість того, щоб мислити кожного символу в сітці як про маленький квадрат, слід думати про них як про чергування трикутників вгору та вниз. У верхньому лівому куті завжди є висхідний трикутник.

У Wumpus немає встановлених напрямків <^>v, але у них є дзеркала \/. Однак завдяки трикутній сітці вони працюють відмінно від більшості інших мов. ІР відштовхується від них, як промінь світла (як зазвичай), але ви повинні думати про них як кут 60 °. Таким чином, IP, що рухається на схід, в кінцевому підсумку рухатиметься по північно-західній осі мережі.

Як ще одна відмінність від більшості інших мов, краї сітки не обертаються, але IP-адреса замість цього відскакує від країв (як якщо б ці клітинки краю містили відповідні дзеркала). Ще одна прикольна маленька деталь - те, що діагоналі через трикутну сітку насправді виглядають як сходи у вихідному коді.

Зважаючи на це, код, виконаний Wumpus, наступний (де я замінив пробіли .на ясність:

v19977/
   02
  89
 ..
..
.....*...#2018O@

Це v19977лише мотлох, який ми можемо ігнорувати. /передає IP на північний захід, де він рухається через 977(праворуч) знову, відхиляючись від верхнього краю. Потім IP пересувається на південний захід через 2089пробіл і купу, перш ніж він потрапить на лівий край, щоб знову відобразити схід. *також є мотлохом. Потім нарешті #2018натискає 2018, Oроздруковує його і @припиняє програму.


Пропали роки

Нарешті, кілька записок про роки я не висвітлював.

Під час дослідження 2D мов, щоб знайти підходящі мови протягом багатьох років, які можна було б використовувати в поліглоті, я виявив, що всупереч поширеній думці, Befunge не була першою двовимірною мовою. Таку назву, схоже, займає Біота, яка була створена в 1991 році. На жаль, мова не має жодного виводу, тому я не зміг використати її для цього завдання.

Наскільки я можу сказати, жодні 2D мови не були створені у 1992 та 1995 роках. Це залишає кілька років, які я не охоплював:

  • 1994: Ортагонал був створений незалежно від Бефунге. Насправді мови є семантично досить схожими, але ортогонал насправді не викладає вихідний код у 2D. Натомість кожен рядок - (x, y, instruction)кортеж. Я навіть отримав специфікацію мови та оригінального перекладача від творця Джеффа Еплера, але, врешті-решт, той факт, що синтаксис не 2D, зробив мову непридатною для цього поліглоту.
  • 1996: Ортогонал , наступник Ортагоналу (створений кимось іншим), був створений, але для цілей цього поліглота виникає ті ж проблеми, що і Ортагонал.
  • 1999 рік: Єдиною мовою, яку я міг знайти, був стільниковий автомат Кріса Пресі РЕДГРЕН . На жаль, на відміну від свого попередника RUBE, він, схоже, не має семантики вводу / виводу.
  • 2000 рік: Є ще один стільниковий автомат Кріса Пресі, який називається noit o 'mnain worb, але він також не має жодного вводу-виводу. Є також Numberix, який я не намагався запустити, і я не впевнений, чи не буде він ігнорувати не шістнадцяткові символи у вихідному коді.
  • 2002: Там є Clunk без вводу / виводу та ZT , специфікація якої мене лякає.
  • 2007: Тут я знайшов три мови. Zetaplex базується на зображенні (так що ні), і RubE On Conveyor Belts, схоже, вимагає заголовка з досить строгим форматом, який би переплутався з першим рядком програми. Також є Cellbrain від Quintopia, але, здається, він вимагає і конкретного заголовка.
  • 2013 рік: Я знову знайшов три мови. Риболовля може бути можливою при значній кількості реструктуризації, але це вимагатиме початку програми з дійсного доку. Quipu , з пам’яті, занадто суворий щодо свого синтаксису, щоб дозволити багато поліглотування. А Swordfish - ще один член сім'ї> <>, але, на жаль, мені не вдалося знайти перекладача. В іншому випадку це, мабуть, буде досить легко додати.

Якщо когось цікавить, ось повний перелік впроваджених 2D мов, відсортованих за роками , наскільки я міг їх знайти (на той момент, коли ця відповідь була розміщена). Якщо у цьому списку відсутні будь-які, будь ласка, повідомте мене в чаті, оскільки я був би дуже зацікавлений у повному списку.


8
Ого. Це дійсно вражає
DJMcMayhem

@MartinEnder Чи обмірковували ви розміщення свого списку 2D мов програмування за роком на самому Esolang?
doppelgreener

@doppelgreener Я не зовсім впевнений, як би це там помістилося. По суті це просто перетин 2D-категорії з різними категоріями року.
Мартін Ендер

Я виправлю заголовок RubE On Conveyor Belts, якщо у вас є машина часу, я можу позичити, щоб навчити 13-річного мене читати файл, не знаючи розміру заздалегідь. (Це єдина причина, що з'явився рядок заголовка; IMO ви можете не вважати заголовок розміру частиною програми, навіть якщо це строго кажучи)
immibis

1
@cairdcoinheringaahing Там ви йдете. І Wumpus за 2018 рік, поки я був на ньому.
Мартін Ендер

117

15 років, Пітон

Версії: 0.9.1 , 2.0.0 , 2.2.0, 2.2.2, 2.5.0, 2.5.1, 3.0.0, 3.1.0, 3.1.3, 3.2.1, 3.3.0, 3.3.3, 3.4.0, 3.5.0 та 3.6.0a4 . Версії, які не пов'язані, можна знайти на сторінці завантажень .

Дату випуску 0.9.1 можна знайти тут . На жаль, мені довелося пропустити велику купу років через відсутні старі версії та проблеми з компіляцією на моєму комп’ютері. Представлені роки - 1991, 2000-2002 та 2006-2016 роки.

Тестується на Arch Linux, використовуючи gzipped версії.

# Note: This file needs a trailing newline due to 0.9.1

# 0.9.1: No bitwise operators
# This one errors out by division by zero.
try:
    eval('1&2')
except:
    print(1991)
    1/0

import sys

# 2.0.0: repr('\n') gives "'\012'" instead of "'\n'"
# == doesn't exist until Python 0.9.3 and <> doesn't exist in Python 3, hence we
# use <. Also, 0.9.1 doesn't have double quoted strings.
if repr('\n') < '\'\\n\'':
    print(2000)
    sys.exit()

# 2.2.0: email module still has a _Parser class - module revamped in 2.2.2
# I would use whether or not True exists as a name here, but weirdly "True"
# worked in 2.2.2 even though the docs say it was introduced in 2.3...
try:
    import email
    email._Parser
    print(2001)
    sys.exit()
except AttributeError:
    pass

# 2.2.2: a in b only works for strings a of length 1.
try:
    eval('"art" in "Martin"')
except TypeError:
    print(2002)
    sys.exit()

# 2.5.0: int() allows null bytes in integer to convert when given an explicit
# base.
try:
    print(int('2006\x00Hello, World!', 10))
    exit()
except ValueError:
    pass

# 2.5.1: pow overflows
# Note that we can't use ** here since that doesn't exist in 0.9.1.
if pow(2, 100) < 1:
    print(2007)
    exit()

# 3.0.0: round returns a float rather than an int.
if str(round(1, 0)) > '1':
    print(2008)
    exit()

# 3.1.0: bug caused complex formatting to sometimes drop the real part.
if format(complex(-0.0, 2.0), '-') < '(-':
    print(2009)
    exit()

# 3.1.3: str of a float is shorter than the repr of the same float.
if str(1.0/7) < repr(1.0/7):
    print(2010)
    exit()

# 3.2.1: For some weird reason, u'...' Unicode strings were disabled then
# re-enabled later.
try:
    eval('u"abc"')
except:
    print(2011)
    exit()

# 3.3.0: int still works without a first argument.
try:
    int(base=10)
    print(2012)
    exit()
except TypeError:
    pass

# 3.3.3: no enum module :(
try:
    import enum
except ImportError:
    print(2013)
    exit()

# 3.4.0: PEP 448 (additional unpacking generalisations) not implemented yet
try:
    eval('[*[1], *[2], *[3]]')
except SyntaxError:
    print(2014)
    exit()

# 3.5.0: No f-strings
try:
    eval('f"abc"')
except SyntaxError:
    print(2015)
    exit()

print(2016)

18
... Ого. Мене все ще дивує, наскільки добре деякі люди знають свої мови. Це як
озирнутися

Чи підтримує python 0 спробу / крім ??
OldBunny2800

8
@ OldBunny2800 Дивно, але так
Sp3000

54

Короткий і солодкий; три APL s ( K , J201 , Dyalog 7.1 ) у 8 байт

1993+1^2

1993 плюс ...

K: перше 1 ціле число {0} за винятком {2}, тобто {0}; 1993 - Спробуйте в Інтернеті!

J: 1 2 = 1; 1994 - Спробуйте в Інтернеті!

APL: LCM (1,2) = 2; 1995 - Спробуйте в Інтернеті!


Дуже хороша! Думаєте, ви могли б поєднати більше мов Іверсона?
миль

@miles Стає важко з K, і APL2 / APLX / APL * PLUS занадто схожі.
Адам

@miles Ви знаєте версію J з 2000 року? Якщо так, ми можемо зробити 2e3+?1з Dyalog 9.0.1.
Адам

Ще одна крута перспектива X^Yдля деяких чисел X і Y, як ^і потужність у J, але LCM в APL.
Адам

2
Я знайшов сторінку функцій щодо випусків з їх датами до 2000 року, jsoftware.com/release/status.htm
миль

46

10 років, 12 мов, 2430 байт

Ця відповідь - це співпраця між собою та користувачем 1000000000 .

Короткий список мов:

Brainfuck    1993
Befunge      1993
Piet         2001
Whitespace   2003
Braincopter  2005
Grass        2007
Starry       2008
Paintfuck    2008
Brainbool    2010 (11111011010)
Python 2.7.2 2011
Fission      2014
Brainflak    2016 

Ось код:

P3v="";print(sum([ord(x)for x in"~~~~~~~~~~~~~~~y"]));"""{}{}     + + +---[.     + +..  '.. +. +.. +. +. +.] + + + + + + +(((((()()()()){}){}){}){})({({} +-[<() + + + + + + +>-()])}{}<[. + + + + + + + +..-------  `             +.[-]]>)[< '
 17 12 
# > 7*::,8 +:,,2 +,@<>R"2014";]*ne*e*es*s*swWWW*swWWWW*sw*e*e*e*eeev*wn*n*n*n*ne*e*se*s*s*s*sWWwWWWw**e*eeee*vwn*n*n*n*ne*e*se*s*s*s*sWWWw*eeee*e*ne*n*nWWWWWw*ne*nWWWWWWw*w*sw*se*sWWWWWWWw*s*WWWWWWwwwWWWWWWWWWWwWWWWWWWWWWwvwWWWwWWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwwwwwwwwwwwWWWwWWWWWwWWWWWWWwWWWWWWWWWwWWWWWWWWWWWWWWWwWWWWWWWWWWWWwv `
255 0 255 255   0   192 192 0   192 192 0 192 192   192 255
255 192
255 255 192
255
255
0 255 255 0 255 255 0 255 255 0 255 255 0 192 192 192 255 255 255 255 255 0 192 192 0 0 255 255 255
255 0 0 255 0 192 192 0 192 192 0 192 192 192 255 255 192 255 255 192 255 255 192 255 255 0 255 255 0 255 255 0 255 255 0 192 192 255 255 255 255 255 255 255 255 255 255 255 255 0 192
192 0 0 255 0 192 192 0 192 192 0 192 192 0 192 192 192 255 255 192 255 255 192 255 255 0 255 255 0 255 255 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0
255 0 192 192 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255
255 0 192 192 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 0 192
192 0 192 192 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 0 0
255 0 192 192 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 255 255 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 255 255
255 0 192 192 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 0 192
192 0 192 192 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 0 0
192 0 192 192 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 0 0 0 0 0 0 255 255
255 0 192 192 0 0 255 0 0 255 255 255 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 255 255 0 0 255 0 0 255 0 255 255 0 0 0 0 192 192 0 0
255 0 192 192 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 255 0 0 0 0 192 192 0 192 192
#   """

Для того, щоб це вписати у відповідь, я відмовився від цілих посилань TIO і скоріше просто розміщую посилання на дійсний інтерпретатор, де код може бути введений користувачем. Ось посилання Pastebin для цієї мети.

Пієт

Формат файлу PPM , один із форматів зображень, з якого може прочитати інтерпретатор Piet, має простий текст ASCII. Використовуючи це, ми змогли вставити код інших мов як мотлох у файл зображення, прочитаний Piet та Braincopter.

Зображення виглядає приблизно так:

Сире зображення

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

Пієтна стежка

Незважаючи на дещо складні методи створення програми, сама програма є досить простою. По верху зображення воно штовхається 1 10 10 10 2до стека; уздовж сторони він множиться тричі і додає один раз. У нижньому куті він виводить результат (2001), а потім зупиняється.

Braincopter

Braincopter - інша візуальна мова. Вона також покладається на той самий ppmфайл зображення для запуску. Через дуже жорсткі обмеження в npiet, наш код Braincopter може використовувати лише підмножину оригінальних операцій Braincopter. Ми обмежені у використанні кольорів, які є дійсними ops в Piet. Це видаляє -оператора з Braincopter.

Ось шлях, простежений кодом Braincopter:

Брейнкоптер шлях

Програма Braincopter дещо дивна через відсутність -оператора. Стінки блакитного і темного блакитного служать для перенаправлення вказівника, окрім того, що він ідентичний наступному мозковому голові:

++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++..+++++.

Це друкує 2005 рік.

Paintfuck

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

Оскільки Paintfuck ігнорує нерелевантні символи, так як немає, більшість коду є неважливими. Відповідний розділ коду:

nsn**ne*e*es*s*sw*sw*sw*e*e*e*eee*wn*n*n*n*ne*e*se*s*s*s*sww**e*eeee*wn*n*n*n*ne*e*se*s*s*s*sw*eeee*e*ne*n*nw*ne*nw*w*sw*se*sw*s*wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwnsn**ne*e*es*s*sw*sw*sw*e*e*e*eee*wn*n*n*n*ne*e*se*s*s*s*sww**e*eeee*wn*n*n*n*ne*e*se*s*s*s*sw*eeee*e*ne*n*nw*ne*nw*w*sw*se*sw*s*wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

Незважаючи на те, що вони не є wоперативними, в кінці коду нічого не робити. Вони є там для трав’яної частини розчину. n, e, s, І wвикористовуються для переміщення зображення і *використовуються для побудови точки в певному місці. Програма виводить:

Paintfuck вихід

Більша версія:

Болісний вихід, але його більше

Брейнфук

Як і Paintfuck Brainfuck ігнорує більшість персонажів. Ще раз тут важливі:

 []+++---[.++....+.+..+.+.+.]++++++++-[<+++++++>-]<[.++++++++..-------+.[-]]>[<>,+,,+,<>]

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

+++++++[<+++++++>-]<[.++++++++..------.[-]]

Це досить просто друкує 1993.

Brainbool

Brainbool дуже схожий на Brainfuck за своїм підбором персонажів. Велика різниця, яка дозволяє обом -сплеститися разом, - це відсутність у Brainbool. Важливими персонажами для Brainbool є:

[]+++[.++....+.+..+.+.+.]++++++++[<+++++++>]<[.++++++++..+.[]]>[<>,+,,+,<>]

Виходи Brainbool та brainfuck взаємовиключні. Brainbool приховує свій результат у другому наборі []. Brainfuck стикається, +++---перш ніж він досягне [встановлення до нуля і змушує його пропустити вихід, тоді як Brainbool бачить лише +++встановлення його на 1, через що він проходить через цикл. Аналогічно Brainbool встановлюється на нуль у 4-му циклі, що призводить до його пропускання, тоді як Brainfuck переходить у цикл зі значенням 49.

Оскільки Brainbool не має десяткових показників, він виводить 2010 у двійковій формі:

11111011010

Ділення

Єдиною частиною коду, яка важлива для поділу, є:

R"2014";

В Rпорядку в атомі рухається вправо, на "2014"принти 2014і ;зупиняє виконання.

Befunge

Befunge проходить лише через наступні символи:

P3v
  7
  > 7*::,8 +:,,2 +,@

Вони P3необхідні для створення дійсного .ppm-зображення для піт-файлу і сукупно натисніть 3 на стек. the vрозміщується для перенаправлення вказівника вниз. Потім він проходить через 7в 17використовується для вказівки ширини .ppm зображення. >Перенаправляє покажчик вправо. 7*помножує верхню частину стека на 7, залишаючи 49 (значення ASCII 1) на верхній частині стека. ::дублює верхню частину стека двічі. 1Виводиться ,. 8 +додає 8 до верхнього приросту до ASCII 9. :,,виходить 9двічі. 2 +збільшує ASCII 1до ASCII 3і ,друкує. Нарешті @припиняє програму.

Загалом він друкує 1993.

Пробіл

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

[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][LF]
[Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Tab][Tab][Tab][Tab][Tab][Space][Tab][Space][Space][Tab][Tab][LF]
[Tab][LF]
[Space][Tab][LF]
[LF]
[LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][Space][LF]
[Space][Space][Space][LF]

Більшість того, що робить цей код, не має значення для виконання програми (усі рядки, що містять лише пробіли, просто натискають нуль на стек). Важлива частина:

[Space][Space][Space][Tab][Tab][Tab][Tab][Tab][Space][Tab][Space][Space][Tab][Tab][LF]
[Tab][LF]
[Space][Tab][LF]
[LF]
[LF]

Перший рядок підштовхує 2003 рік до стека. Після цього [Tab][LF][Space][Tab]друкує верхню частину стека (2003) як число. Нарешті, три останні канали рядків закінчують виконання програми.

Трава

Трава ігнорує весь символ , поки перший wу файл і після цього всіх символів, які не є w, Wабо v. Перекладач трави говорить:

wWWWwWWWWwv
wWWwWWWwv
wWWWwWWWWWwWWWWWWwwwWWWWWWWwWWWWWWwwwWWWWWWWWWWwWWWWWWWWWWwv
wWWWwWWWWwv
wWWwWWWwv
wWWwWWWwv
wWWwWWWwv
wWWwwwwwwwwwwwWWWwWWWWWwWWWWWWWwWWWWWWWWWwWWWWWWWWWWWWWWWwWWWWWWWWWWWWwv

Перший рядок визначає функцію, яка додає два до того, що він передається. Другий рядок визначає функцію, яка додає чотири до того, що вона передається. Третя визначає функцію, яка друкує два плюс аргумент, друкує аргумент двічі, потім нарешті друкує сім плюс аргумент (Трава роздруковує символи на основі значення ASCII). Четвертий, п'ятий та шостий рядки визначають функції, які додають вісім, додають 16, додають 32 та додають 64 до їх аргументу відповідно. Заключний рядок визначає головну функцію, яка приймає символ w(єдине заздалегідь визначене число у Grass, значення ASCII 119) і додає 185 до нього за допомогою функцій додавання, визначених у програмі, а також вбудованої функції додавання однієї функції. Трава обертає цифри на 256, тому результат дорівнює 48 (відповідає символу0). Потім функція передає цю функцію третьому рядку, який видає 2007 рік.

Зоряний

Зоряні ігнорує все , за винятком простору, +, *, ., ,, `, і '. Таким чином, зоряний перекладач бачить лише:

       + + +.     + +..  '.. +. +.. +. +. +. + + + + + + + + + + + + + + +. + + + + + + + +..  `             +. '
     *, +,, +,************************************************* `

Однак інструкція з міткою та стрибком використовується для пропускання розділів коду, що може спричинити проблеми при запуску, тому код фактично такий:

       + + +.     + +..  '  `             +. ' `

Цей код підштовхує двох до стеку, дублює його двічі, а потім вискакує та друкує один із них як число. Потім натискає нуль, дублює його і друкує обидві нулі як числа. Далі він вискакує один з двох і стрибає, а потім штовхає сім до стека, і вискакує і друкує як число. Нарешті він вискакує останні два на стек і стрибає до кінця програми.

Python 2.7.2

Код Python відповідає формату:

P3v="";print(sum([ord(x)for x in"~~~~~~~~~~~~~~~y"]));"""..."""

де ...стоїть на всіх інших мотлох.

Перший рядок P3v=""є, тому що для того, щоб бути дійсним .ppmфайлом, наш код повинен починатися з P3цього, як правило, помилка, але якщо ми скажемо python, це декларація змінної, вона буде ігнорувати її.

Далі треба роздрукувати 2011. Однак із-за способу .ppmформатування a ми не можемо включати жодних чисел у цей рядок. Щоб обійти це, ми підсумовуємо всі значення ASCII рядка "~~~~~~~~~~~~~~~y"і друкуємо результат. Нарешті, ми використовуємо потрійні лапки багаторядкового коментаря, щоб python ігнорував все інше.

Брейнфлак

Ми зберегли найкраще для останнього.

Brainflak, як і інші, ігнорує більшість персонажів. Відповідні символи:

(([()])){}{}[](((((()()()()){}){}){}){})({({}[<()>()])}{}<[[]]>)[<><>]

Код python (([()])), натискає -1 на стек двічі, тому його потрібно видалити до того, як програма почне обробляти.

Після цього Brainbool використовує []нилад, який нічого не робить, і програма починається.

(((((()()()()){}){}){}){})({({}[<()>()])}{}<[[]]>)[<><>]штуршок 2016. Останній - залишки Befunge та Brainfuck, але на щастя нічого не робить.

Коли програма завершується, вона друкує вміст стеку, тобто друкує 2016.


Блискуче! Я сподівався, що Піет якось виступить, вбудовуючи речі в PPM - це геніально. Молодці!
cincodenada

1
+1 для We saved the best for last. : D
DJMcMayhem

38

5 років

#define q/*-[>+<-----]>--.++++++++..------.[-][
print('2010'if len(bin.__doc__)==86else'2015')
"""*/
main(c){c=-4.5//**/
-4.5;printf("19%d",90-c);}
#define w/*]
*/"""

1989: C89 [1] , і 1999: C99

Коментар до єдиного рядка //додано в C99, тому компілятор C89 прочитав би той код як c=-4.5 / /*comment*/ -4.5, який є тим же самим c=-4.5 / -4.5, а компілятор C99 читав би як c=-4.5 //comment/**/
- 4.5, що таке саме c=-4.5 - 4.5.
Частина Python - це коментар до програми C.

2010: Python 2.7 та 2015: Python 3.5

Документи змінюються між Python 3 та 2, ця програма використовує довжину документів для виявлення версії Python.
Частина C знаходиться в рядку програми Python.

1993 р. [2] : Brainfuck

Він в основному ігнорує все, що ні .,[]+-<>. Оскільки програма C має ,в собі, мені довелося змусити Brainfuck відхилити цю частину, встановивши поточний байт 0.


  1. Специфікація C89 була випущена в 1990 році. Детальніше .
  2. Я не зміг знайти офіційну дату випуску, тому я вважаю, що Esolangs та Wikipedia .

4
Це чудово, особливо -4.5/-4.5та -4.5-4.5. Створення двох версій кожної з двох основних мов є досить вражаючим, навіть не кидаючи туди BF :-)
ETHproductions

Це не кодогольф, але a=лінія 2 зайва
TheInitializer

@TheInitializer так, я спробував без, a=і це дало помилку, тому я вирішив зберегти це. Не знаю, чому це дало помилку, мабуть, помилка друку.
betseg

@betseg, якщо цей код виконується лише в Python, він повинен працювати.
Ініціалізатор

17

15 років, JavaScript

Оскільки цикл випуску JavaScript дуже незвичний і непослідовний, я збираюся скористатися реалізацією Firefox. Будь ласка, дайте мені знати, якщо це заборонено.

Версії: Phoenix 0.1 , Firebird 0.6 , Firefox 1.0.0 , 1.5.0 , 2.0.0 , 3.0 Beta 1 , 3.0.0 , 3.5.0 , 3.6.0 , 4.0.0 , 10.0.0 , 18.0.0 , 27.0 .0 , 35.0.0 , 44.0.0 (усі перевірені на Windows 7)

Важлива примітка. Встановлення та відкриття Firefox 1.0.0 або будь-якої пізнішої версії може видалити всі збережені дані Firefox , включаючи історію та закладки.

Також, починаючи з 1.0.0, ви можете одночасно відкривати лише одну версію; спроба відкрити іншу версію призводить до нового вікна вже відкритої версії.

Інструкції

  • Варіант 1. Збережіть код нижче на своєму комп’ютері як HTML-документ і відкрийте його в кожному браузері.
  • Варіант 2: відкрийте https://ethproductions.github.io/js-year-test.html у кожному веб-переглядачі.

Код

<script onbeforeunload="123">
// This uses document.write because alert does nothing in Phoenix (Firefox) 0.1.
document.write((function () {
    function assert (code) {
        try {
            eval(code);
            return true;
        } catch (e) {
            return false;
        }
    }

    // Firefox 44 supports octal and binary literals in Number(); Firefox 35 does not.
    if (Number("0o1") === 1)
        return 2016;

    // Firefox 35 supports template strings; Firefox 27 does not.
    if (assert("`abc`"))
        return 2015;

    // Firefox 27 supports argument spreading; Firefox 18 does not.
    if (assert("Math.max(...[1, 2, 3])"))
        return 2014;

    // Firefox 18 supports default arguments; Firefox 10 does not.
    if (assert("function q(a = 1) { }"))
        return 2013;

    // Firefox 10 has basic WeakMap support; Firefox 4 does not.
    if (assert("WeakMap.a"))
        return 2012;

    // Firefox 4 has basic typed array support; Firefox 3.6 does not.
    if (assert("Int8Array.a"))
        return 2011;

    // Firefox 3.6 added the async attribute to script elements.
    if (assert("document.getElementsByTagName('script')[0].async.a"))
        return 2010;

    // Firefox 3.5 added the String.prototype.trim() method.
    if (assert("'abc'.trim()"))
        return 2009;

    // Firefox 3.0 added partial support for object destructuring.
    if (assert("var {c} = {c: 7}"))
        return 2008;

    // Firefox 3.0 beta 1 added the Array.prototype.reduce() and Array.prototype.reduceRight() methods.
    if (assert("[].reduce.a"))
        return 2007;

    // Firefox 2.0 added support for restricted words as properties.
    if (assert("({if:1}).if"))
        return 2006;

    // Firefox 1.5 added the Array.prototype.indexOf() methods, along with a couple other Array methods.
    if (assert("[1].indexOf(1)"))
        return 2005;

    // Practically the only JS difference between v0.6 and v1.0 is the addition of the onbeforeunload event.
    if (assert("document.getElementsByTagName('script')[0].onbeforeunload.a"))
        return 2004;

    // The Object.prototype.eval() method was removed in Firebird 0.6.
    if (!assert("'abc'.eval()"))
        return 2003;

    // We're all the way back to the good old Phoenix 0.1 browser...
    return 2002;
})());
</script>

Ви можете додати 16-й рік, включивши BF: <!--<<<<-[>+<-----]>--.++++++++..------.[-][-->перед сценарієм та ще одним коментарем HTML, що містить лише ]згодом.
Стівен Х.

6
@StevenH. Гм ... вау, я ніколи навіть не замислювався про те, щоб включити в це езоланг. І це дійсно розумний спосіб включити BF :-) Але я не впевнений, що мені дуже хочеться ...
ETHproductions

13

6 мов, Turtlèd та brainfuck , Python 3.5, Python 2.7, > <> , Fission

Turtlèd не існував до цього року, і це легко об'єктивно, навіть якщо github зобов’язання не рахується, і BF має докази сторінки esolang, випущені 1993 року. Python 3.5 - 2015, 2.7 - 2010 року. , зазначаючи 2009 рік, як і Fission, 2014 рік

#-[>+<-----]>--.++++++++..------#"2016"/
print(2015 if len(len.__doc__)==42 else 2010)
#;                           oooo"2009"/
#;"4102"L

Я, мабуть, повинен дати кредит на константах bf на esolangs ... ¯ \ _ (ツ) _ / ¯

Як це працює, вид:

Turtlèd:

Turtlèd насправді нічого не робить для ліній, крім перших:

#-[>+<-----]>--.++++++++..------#"2016"/
  ^sets string variable to this   ^ prints 2016

/ є ноп

Брейнфук

Brainfuck ігнорує символи не у своїх командах

він бачить -[>+<-----]>--.++++++++..------.(останнє. з частини пітона)

що тільки робить Brainfuck речі, він використовує обгортку, щоб ділити 255 на 5, потім відняти 2 з результату, надрукувати, збільшити 8 разів, надрукувати двічі, декремент 6 разів, друкувати

Пітон 2 і 3

print(2015 if len(len.__doc__)==42 else 2010)

довжина документів для len варіюється в різних версіях, тому він друкує рік для версії 3, якщо це правильна довжина, інакше для версії 2.

> <>

# відображає вказівник назад, тому він потрапляє на / з іншого боку цієї лінії, проходить через пробіл між, elseа 2010потім знову відбивається, щоб потрапити на "2009", висуваючи 9,0,0,2 на стек, потім друкуючи перевернутим .

Ділення

У ділення є породжувачі, тож ми можемо мати лінію внизу, яку він виконує самостійно:

#;"4102"L
        L spawn left moving atom
  "4102"  print this right to left
 ;        halt
# python comment

13

3 роки, 3 мови: C, TeX, MIXAL

*main(){puts("1990");}/*\newwrite\O\openout\O=O\write\O{1982}\bye                                                                                                                              
START   ENTA    1997
        CHAR
        STX     6
        OUT     6(19)
        HLT
        END     START   */ 

Назвіть файл date.mixal.

  1. C (1990) - Укладає з попередженнями та відбитками 1990до stdout.
  2. TeX (1982) - компілювати з tex date.mixal; друкує 1982у файл O.tex(ігнорує вихід DVI).
  3. MIXAL (1997) - компілюйте за допомогою GNU Mix Development Kit mixasm date.mixalі запустіть з mixvm -r date.mix; друкує 1997на телевізійний пристрій (= stdout).

Програми TeX і MIXAL містяться в коментарі до програми C; програма MIXAL з'являється після \byeтого, як TeX ігнорує її. Програми C і TeX - коментар до програми MIXAL. Чомусь gccготовий прийняти *main.


Я забув про MIXAL, +1: D
кіт

13

3 роки (GolfScript, CJam, MATL), 24 23 байти

[A11]Wd%;200 1e2/0 8_+(

Це виводить

  • 2007 в GolfScript.

  • 2015 в CJam (версія 0.6.5).

  • 2016 в MATL (версія 19.2.0).

Пояснення

Гольфскрипт

Не визначені лексеми є жодними елементами у GolfScript . Єдиними частинами коду, які насправді щось роблять, є:

200      Push 200
           STACK: 200
1        Push 1
            STACK: 200, 1
/        Divide
           STACK: 200
0        Push 0
           STACK: 200, 0
8        Push 8
           STACK: 200, 0, 8
+        Add
           STACK: 200, 8
(        Subtract 1
           STACK: 200, 7
         Implicitly display 200, 7 as "2007"

CJam

[A11]    Push array [10 11]
           STACK: [10 11]
W        Push -1
           STACK: [10 11], -1
d        Convert to double
           STACK: [10 11], -1.0
%        Select elements from array
           STACK: [11 10]
;        Pop
           STACK is empty
200      Push 200
           STACK: 200
1e2      Push 100
           STACK: 100
/        Divide
           STACK: 2
0        Push 0
           STACK: 2, 0 
8_       Push 8 and duplicate
           STACK: 2, 0, 8, 8
+        Add
           STACK: 2, 0, 16
(        Subtract 1
           STACK: 2, 0, 15
         Implicitly display 2, 0, 15 as "2015" 

MATL

Все %далі, це коментар.

[A11]    Push array [5 11]
           STACK: [5 11]
W        2 raised to that
           STACK: [32 2048]
d        Compute increment
           STACK: 2016
         Implicitly display as "2016"

Виправлення: у CJam після %отримання [11 10]. Не те, щоб це мало значення.
aditsu

@aditsu Whoops! Спасибі, відредаговано
Луїс Мендо

12

2 мови, Python 2.7 та Python 3.5

Python 2.7 вийшов у 2010 році .

Python 3.5 вийшов у 2015 році .

print('2010'if 3/2==1else'2015')

Це спирається на PEP 238, де оператор /був змінений з цілого поділу в Python 2 на поділ з плаваючою комою в Python 3.


3
Це може бути цікавим викликом, якщо воно передбачає виявлення помилок / змін в операторах між версіями
миль

1
@TuukkaX Це працює для мене як в Python 2.7.12, так і в Python 3.5.1 на Fedora 24.
милі

1
Ви не можете зробити це '2010'if 3/2>1else'2015'замість цього?
Qwerp-Derp

15
Або нам математику:print(int(2010+1/2*10))
Якубе

2
print('2015'if 1/2else'2010')краще
Cyoce

12

8 років, TI-Basic

Disp 1996           <-- TI-83
Text(-1,1,1,1
ClrHome
Disp 1999           <-- TI-83+ OS 1.03 (initial OS)
sub(1
ClrHome
Disp 2002           <-- TI-83+ OS 1.15
isClockOn
ClrHome
Disp 2004           <-- TI-84+ OS 2.21
invT(e,1
ClrHome
Disp 2005           <-- TI-84+ OS 2.40
CLASSIC
ClrHome
Disp 2009           <-- TI-84+ OS 2.53
BackgroundOn
ClrHome
Disp 2013           <-- TI-84+ Color Silver Edition
Send({1
ClrHome
2015                <-- TI-84+ Color Edition OS 5.1

"Будь-яка з програм може надрукувати на STDERR або викинути під час виконання / компілювати помилки та попередження часу, доки правильний висновок все ще надрукується в STDOUT або файл." Наразі єдиним показником без помилок є рік, тому ми дотримуємося цього правила. Однак, якщо ви хочете записати на пам'ять, замініть Disp (date)на (date)->I.

Список літератури:

  1. Дати випуску калькулятора - https://epsstore.ti.com/OA_HTML/csksxvm.jsp?nSetId=74258
  2. Дата виходу TI-83 + OS 1.15 - http://wikiti.brandonw.net/index.php?title=83Plus:OS:VersionDifferences#TIOS_1.15
  3. Сумісність калькулятора - http://tibasicdev.wikidot.com/ сумісність
  4. Дата випуску TI-84 + CSE - https://www.amazon.com/Texas-Instruments-Silver-Graphing-Calculator/dp/B00AWRQKDC
  5. Дата випуску TI-84 + CE - http://www.prnewswire.com/news-releases/texas-instruments-unveils-the-new-ti-84-plus-ce-300026266.html та https: // www. cemetech.net/forum/viewtopic.php?t=8870

9

5 років, Go 1.0, 1.1, 1.4, 1.5, 1.6: 285 257 байт

(1.2 було випущено у 2013 році, як 1.1, у 2014 році - 1.3, а у 2016 - 1.7, як 1.6.)

Не перевіряв цього на кожній версії, бо я можу отримати доступ лише до 1.6, але це має працювати теоретично! Зміни мови, ймовірно, призвели до некомпіляції програми, тому я покладався на стандартні зміни в бібліотеці.

package main
import(."fmt"
."reflect"
."time")
func main(){s:="6"
if _,e:=Parse("2016-Sep-30","2016-Sep-31");e==nil{s="5"}
if Sprint(ValueOf(0))!="0"{s="4"}
if Sprint(&map[int]int{1:1})[0]!='&'{s="3"}
if string(0xd800)==string(0xfffd){s="2"}
Print("201"+s)}

Негольфірованний і прокоментував:

package main

import (
    "fmt"
    "reflect"
    "time"
)   package main

import (
    . "fmt"
    . "reflect"
    . "time"
)

func main() {
    s := "6"
    // 1.6: time.Parse rejects invalid days
    if _, e := Parse("2016-Sep-30", "2016-Sep-31"); e == nil {
        s = "5"
    }
    // 1.5: A reflect.Value now prints what it holds, rather than use
    // its String() method
    if Sprint(ValueOf(0)) != "0" {
        s = "4"
    }
    // 1.4: Printing pointers to maps gives the map instead of the address
    if Sprint(&map[int]int{1: 1})[0] != '&' {
        s = "3"
    }
    // 1.1: Unicode surrogate halves are no longer allowed
    if string(0xd800) == string(0xfffd) {
        s = "2"
    }
    Print("201" + s)
}

7

4 роки, 99 байт / 77 символів

v=1//1;"""
 1991/*"""
for i in[0]:print 2010#🔟😃😇🔟😗➕➕😨
"""
"
>9002nnnn;
"""#*/

Зауважте: я не впевнений, чи правильні роки

  • Пітон 2.7, 2010
  • Javascript, 1991 рік
  • Емотінікон, 2015
  • ><>, 2009

Мені знадобилось певний час, щоб зрозуміти, як змусити Python та JS працювати разом.

Пояснення

v=1//1;"""встановлює змінну vна 1розділену на 1в Python і на 1Javascript ( //запускає коментар у Javascript), і ;"""запускає рядок багаторядкової в Python. Його ;не можна замінити новим рядком, оскільки це призведе до припинення роботи Javascript.

1991/*"""- решта багаторядкової рядок. Місце потрібно для того, щоб> <> не натискав 1на стек. Оскільки початок рядка багаторядкових був частиною коментаря у Javascript, він друкує 1991та запускає багаторядковий коментар.

for i in[0]:print 2010#🔟😃😇🔟😗➕➕😨в Python - це цикл for, який повторює список [0]і запускається print 2010. Коментар - це лише код Emotinomicon (він ігнорує все, що не є емодзі або рядком). У> <> він ( f) натискає 15 на стек.

Цикл for не може бути видалений, тому що IP-код> <> знижується в колонці 1 і pне є дійсною командою в <<. Ви також не можете замінити його на ifоператор, тому що iце команда для введення в <<>.

""" - це початок багаторядкового рядка.

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

>9002nnnn;в> <>, змінює напрямок IP - направо, штовхає 9, 0, 0і 2, вивести як числа і завершує програму.

"""#*/в Python, закінчує багаторядковий рядок і починає коментар. У Javascript */завершується багаторядковий коментар.


Версія бонусу з Gol> <>:

5 мов, 4 роки, 118 114 байт / 96 92 символів

v=1//1;"""
 1991/*"""
for i in[0]:print 2010#🔟😃😇🔟😗➕➕😨
"""
`
"
>9002nnnn;
"
>5102nnnn;
"""#*/
  • Golfish v0.4.2, 2015

Пояснення²

IP починається з верхнього лівого кута, йде праворуч. vРобить це піти вниз.

fштовхає 15.

" починається рядок.

` використовується для втечі символів, чого> <> не має.

"має закрити рядок, але ми використали `, так що це не буде.

> частина струни.

" закінчується рядок.

>5102nnnn;фактичний код. >робить IP йти прямо, 5102штовхає 5, 1, 0і 2, і nnnn;друкує число і закінчує програму.


Помилки Python на символах unicode без відповідного заголовка. ( SyntaxError: Non-ASCII character '\xf0' in file test.txt on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details)
сріотчілізм О'Заїк

@WheatWizard Збережіть файл як UTF-8
acrolith

7

7 років, 8 браузерів

Не точно дати випуску мови, тому що в CSS насправді немає версій, але версії браузера (можна вважати версії компілятора?)

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

Я міг би надрукувати використаний номер версії, але я вважав за краще показати першу версію, де введена використана функція.

  • IE6
  • IE7
  • IE8
  • IE9 (не перевірено, не має IE9 навколо)
  • Firefox 4
  • Firefox 3.6
  • Chrome 18
  • Chrome 21
  • Сучасні браузери

FF3.6 FF4 Хром19 Хром22 IE8-примхи Сумісність IE8-IE7 IE8

index.html

<!DOCTYPE html>
 <html>
  <head>
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <link rel=stylesheet href=style.css>
  </head>
  <body>
    <div class=borderbox>
      <div class="inlineblock">
        &nbsp;IE6-2001
      </div>

      <div class="white">
        <div class="outofbox">
          <a href="#">IE8-2009</a>
        </div>
        <div class="inherit">
          <a href="#">IE7-2006</a>
        </div>
      </div>
    </div>
    <div class="white">
      <header class="filter-quirk filter-blur filter-blur-url">
        IE9
      </header>
    </div>
    <div class="flex white">
      Modern Browsers - 2017
    </div>
    <div class="webkit-flex">
      <div class="">
        Chrome 21-2012
      </div>
    </div>
    <div class="webkit-invert white flexdisable">
      <div class="">
        Chrome 18-2012
      </div>
    </div>

    <svg style="position: absolute; top: -99999px" xmlns="http://www.w3.org/2000/svg">

    </svg>

    <div class="filter">
      <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
        <g
           transform="scale(8)"
           aria-label="FF4"
           id="text8419">
           <rect
              style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.79374999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
              id="rect21965"
              width="17.005648"
              height="3.9855044"
              x="-0.16825682"
              y="-0.025296567" />
          <path
             d="m 1.0052634,1.5511362 v 0.7639843 h 0.4564063 q 0.092604,0 0.092604,0.066146 0,0.069453 -0.092604,0.069453 H 0.69107072 q -0.089297,0 -0.089297,-0.069453 0,-0.066146 0.089297,-0.066146 h 0.1785938 V 0.72431329 h -0.1785938 q -0.089297,0 -0.089297,-0.069453 0,-0.066146 0.089297,-0.066146 H 2.1793519 V 1.0484278 q 0,0.089297 -0.069453,0.089297 -0.066146,0 -0.066146,-0.089297 V 0.72431329 H 1.0052634 V 1.4155373 H 1.4848207 V 1.2667091 q 0,-0.089297 0.066146,-0.089297 0.069453,0 0.069453,0.089297 v 0.4332552 q 0,0.089297 -0.069453,0.089297 -0.066146,0 -0.066146,-0.089297 V 1.5511362 Z"
             style="fill:#000000;stroke-width:0.79374999"
             id="path8421" />
          <path
             d="m 2.9883464,1.5511362 v 0.7639843 h 0.4564063 q 0.092604,0 0.092604,0.066146 0,0.069453 -0.092604,0.069453 h -0.770599 q -0.089297,0 -0.089297,-0.069453 0,-0.066146 0.089297,-0.066146 H 2.8527475 V 0.72431329 H 2.6741537 q -0.089297,0 -0.089297,-0.069453 0,-0.066146 0.089297,-0.066146 H 4.1624349 V 1.0484278 q 0,0.089297 -0.069453,0.089297 -0.066146,0 -0.066146,-0.089297 V 0.72431329 H 2.9883464 V 1.4155373 H 3.4679037 V 1.2667091 q 0,-0.089297 0.066146,-0.089297 0.069453,0 0.069453,0.089297 v 0.4332552 q 0,0.089297 -0.069453,0.089297 -0.066146,0 -0.066146,-0.089297 V 1.5511362 Z"
             style="fill:#000000;stroke-width:0.79374999"
             id="path8423" />
          <path
             d="M 5.6692683,1.8917872 H 4.7729923 V 1.7363445 l 0.754062,-1.28322911 h 0.277813 V 1.7561883 h 0.112448 q 0.0893,0 0.0893,0.069453 0,0.066146 -0.0893,0.066146 h -0.112448 v 0.4233333 h 0.112448 q 0.0893,0 0.0893,0.066146 0,0.069453 -0.0893,0.069453 h -0.499402 q -0.0893,0 -0.0893,-0.069453 0,-0.066146 0.0893,-0.066146 h 0.251355 z m 0,-0.1355989 V 0.58871439 h -0.07938 L 4.9019713,1.7561883 Z"
             style="fill:#000000;stroke-width:0.79374999"
             id="path8425" />
          <path
             d="M 8.2881171,1.6077068 H 6.9585859 q -0.089297,0 -0.089297,-0.069453 0,-0.066146 0.089297,-0.066146 h 1.3295312 q 0.089297,0 0.089297,0.066146 0,0.069453 -0.089297,0.069453 z"
             style="stroke-width:0.79374999"
             id="path8422" />
          <path
             d="m 8.9582054,0.90656104 q 0,-0.14882812 0.1785937,-0.31749999 0.1819011,-0.17197916 0.4365625,-0.17197916 0.2414323,0 0.4233333,0.17197916 0.1852081,0.17197916 0.1852081,0.39687498 0,0.14882817 -0.0893,0.28111977 Q 10.006617,1.3960402 9.7056533,1.67716 L 9.0210439,2.3154672 v 0.00992 H 10.059533 V 2.2063266 q 0,-0.089297 0.06945,-0.089297 0.06614,0 0.06614,0.089297 V 2.460988 H 8.8920596 V 2.2625506 L 9.6725804,1.5283318 q 0.2315104,-0.2282031 0.3009635,-0.3307291 0.07276,-0.102526 0.07276,-0.21497396 0,-0.17197916 -0.1422132,-0.30096353 -0.1422136,-0.12898437 -0.3307292,-0.12898437 -0.1686718,0 -0.3075781,0.0992188 -0.1355989,0.0992188 -0.1752864,0.24804686 -0.019844,0.0661458 -0.069453,0.0661458 -0.023151,0 -0.042995,-0.0165365 -0.019844,-0.0198437 -0.019844,-0.0429948 z"
             style="stroke-width:0.79374999"
             id="path8424" />
          <path
             d="m 12.207981,1.3001287 v 0.3307292 q 0,0.3902604 -0.171979,0.6349999 -0.171979,0.2447396 -0.446484,0.2447396 -0.274506,0 -0.446485,-0.2447396 Q 10.971054,2.0211183 10.971054,1.6308579 V 1.3001287 q 0,-0.39356766 0.171979,-0.63830724 0.171979,-0.24473957 0.446485,-0.24473957 0.274505,0 0.446484,0.24473957 0.171979,0.24473958 0.171979,0.63830724 z M 11.589518,0.55268084 q -0.224896,0 -0.353881,0.22820312 -0.128984,0.22489584 -0.128984,0.53578124 v 0.2943489 q 0,0.3241146 0.132292,0.5457031 0.135599,0.2182813 0.350573,0.2182813 0.224895,0 0.35388,-0.2248959 0.128984,-0.2282031 0.128984,-0.5390885 V 1.3166652 q 0,-0.32411458 -0.135599,-0.54239582 -0.132292,-0.22158854 -0.347265,-0.22158854 z"
             style="stroke-width:0.79374999"
             id="path8426" />
          <path
             d="M 13.642054,0.43692564 V 2.3253891 h 0.459713 q 0.0893,0 0.0893,0.066146 0,0.069453 -0.0893,0.069453 h -1.055026 q -0.0926,0 -0.0926,-0.069453 0,-0.066146 0.0926,-0.066146 h 0.459714 V 0.61551938 l -0.373724,0.37372394 q -0.02646,0.0264584 -0.06945,0.0264584 -0.02646,0 -0.0463,-0.0198438 -0.01654,-0.023151 -0.01654,-0.056224 0,-0.0297656 0.03638,-0.0661458 l 0.436562,-0.43656248 z"
             style="stroke-width:0.79374999"
             id="path8428" />
          <path
             d="M 15.625137,0.43692564 V 2.3253891 h 0.459713 q 0.0893,0 0.0893,0.066146 0,0.069453 -0.0893,0.069453 h -1.055026 q -0.0926,0 -0.0926,-0.069453 0,-0.066146 0.0926,-0.066146 h 0.459714 V 0.61551938 l -0.373724,0.37372394 q -0.02646,0.0264584 -0.06945,0.0264584 -0.02646,0 -0.0463,-0.0198438 -0.01654,-0.023151 -0.01654,-0.056224 0,-0.0297656 0.03638,-0.0661458 l 0.436563,-0.43656248 z"
             style="stroke-width:0.79374999"
               id="path8430" />
          </g>
      </svg>
    </div>
    <div class="white gradient msfilter" style=color:white>
      FF3.6-2010
    </div>
  </body>
 </html>

style.css

.borderbox {
    height: 40px;
    overflow: hidden;
    padding-bottom: 100px;
}
.outofbox {
    background: blue none repeat scroll 0 0;
    margin-top: 20px;
    opacity: 0;
}
.white {
    color: white;
}
.outofbox a, .inherit a, .inherit a:visited, .outofbox a:visited {
    color: inherit;
}
.inlineblock {
    display: inline;
    width: 100%;
    zoom: 1;
    display: inline-block;
    margin-left: 100px;
    text-align: right;
}
.white header{
  color: black;
}
.absolute{
  position: absolute;
}
.flex{
  display: none;
  display: flex;
}
.flex.white{
  filter: invert(100%)
}
.webkit-flex{
  display: none;
  display: -webkit-flex;
  overflow: hidden;
  flex-flow: column;
  height: 3em;
  justify-content: flex-end;
}
.webkit-flex div{
  margin-bottom: -1.1em;
}
.flexdisable{
  display: -webkit-flex;
  overflow: hidden;
  -webkit-flex-flow: column;
  -webkit-justify-content: flex-end;
  height: 60px;
}
.flexdisable div{
  margin-bottom: -30px;
}
.filter-quirk{
  filter: url(#quirk);
}
.filter-blur{
  filter: blur(100px);
  -webkit-filter: blur(100px);
}
.webkit-blur{
  -webkit-filter: blur(100px);
}
.webkit-invert{
  -webkit-filter: invert(100%);
  filter: none;
}
.filter-url-dark{
  -webkit-filter: url(filter.svg#Invert);
  filter: url(filter.svg#Invert) invert(100%);
}
.filter-blur-url{
  filter: url(filter.svg#blur) url(filter.svg#brightness);
}
.filter{
  filter: invert(100%) brightness(100%);
  -webkit-filter: invert(100%) brightness(100%) blur(100px);
}
.filter svg{
  position: absolute;
}
.filter svg rect{
  filter: invert(100%);
  -webkit-filter: invert(100%);
}
.msfilter{
    /* IE 8 */
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
  /* IE 5-7 */
  filter: alpha(opacity=0);
}
.opacity{

}
.black{
  background: black;
}
.gradient{
  width: 100px;
  background: -moz-linear-gradient( 45deg, #000, #000 );
  font-weight: bold;
}

filter.svg

    <!DOCTYPE html>
 <html>
  <head>
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <link rel=stylesheet href=style.css>
  </head>
  <body>
    <div class=borderbox>
      <div class="inlineblock">
        &nbsp;IE6-2001
      </div>

      <div class="white">
        <div class="outofbox">
          <a href="#">IE8-2009</a>
        </div>
        <div class="inherit">
          <a href="#">IE7-2006</a>
        </div>
      </div>
    </div>
    <div class="white">
      <header class="filter-quirk filter-blur filter-blur-url">
        IE9
      </header>
    </div>
    <div class="flex white">
      Modern Browsers - 2017
    </div>
    <div class="webkit-flex">
      <div class="">
        Chrome 21-2012
      </div>
    </div>
    <div class="webkit-invert white flexdisable">
      <div class="">
        Chrome 18-2012
      </div>
    </div>

    <svg style="position: absolute; top: -99999px" xmlns="http://www.w3.org/2000/svg">

    </svg>

    <div class="filter">
      <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
        <g
           transform="scale(8)"
           aria-label="FF4"
           id="text8419">
           <rect
              style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.79374999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
              id="rect21965"
              width="17.005648"
              height="3.9855044"
              x="-0.16825682"
              y="-0.025296567" />
          <path
             d="m 1.0052634,1.5511362 v 0.7639843 h 0.4564063 q 0.092604,0 0.092604,0.066146 0,0.069453 -0.092604,0.069453 H 0.69107072 q -0.089297,0 -0.089297,-0.069453 0,-0.066146 0.089297,-0.066146 h 0.1785938 V 0.72431329 h -0.1785938 q -0.089297,0 -0.089297,-0.069453 0,-0.066146 0.089297,-0.066146 H 2.1793519 V 1.0484278 q 0,0.089297 -0.069453,0.089297 -0.066146,0 -0.066146,-0.089297 V 0.72431329 H 1.0052634 V 1.4155373 H 1.4848207 V 1.2667091 q 0,-0.089297 0.066146,-0.089297 0.069453,0 0.069453,0.089297 v 0.4332552 q 0,0.089297 -0.069453,0.089297 -0.066146,0 -0.066146,-0.089297 V 1.5511362 Z"
             style="fill:#000000;stroke-width:0.79374999"
             id="path8421" />
          <path
             d="m 2.9883464,1.5511362 v 0.7639843 h 0.4564063 q 0.092604,0 0.092604,0.066146 0,0.069453 -0.092604,0.069453 h -0.770599 q -0.089297,0 -0.089297,-0.069453 0,-0.066146 0.089297,-0.066146 H 2.8527475 V 0.72431329 H 2.6741537 q -0.089297,0 -0.089297,-0.069453 0,-0.066146 0.089297,-0.066146 H 4.1624349 V 1.0484278 q 0,0.089297 -0.069453,0.089297 -0.066146,0 -0.066146,-0.089297 V 0.72431329 H 2.9883464 V 1.4155373 H 3.4679037 V 1.2667091 q 0,-0.089297 0.066146,-0.089297 0.069453,0 0.069453,0.089297 v 0.4332552 q 0,0.089297 -0.069453,0.089297 -0.066146,0 -0.066146,-0.089297 V 1.5511362 Z"
             style="fill:#000000;stroke-width:0.79374999"
             id="path8423" />
          <path
             d="M 5.6692683,1.8917872 H 4.7729923 V 1.7363445 l 0.754062,-1.28322911 h 0.277813 V 1.7561883 h 0.112448 q 0.0893,0 0.0893,0.069453 0,0.066146 -0.0893,0.066146 h -0.112448 v 0.4233333 h 0.112448 q 0.0893,0 0.0893,0.066146 0,0.069453 -0.0893,0.069453 h -0.499402 q -0.0893,0 -0.0893,-0.069453 0,-0.066146 0.0893,-0.066146 h 0.251355 z m 0,-0.1355989 V 0.58871439 h -0.07938 L 4.9019713,1.7561883 Z"
             style="fill:#000000;stroke-width:0.79374999"
             id="path8425" />
          <path
             d="M 8.2881171,1.6077068 H 6.9585859 q -0.089297,0 -0.089297,-0.069453 0,-0.066146 0.089297,-0.066146 h 1.3295312 q 0.089297,0 0.089297,0.066146 0,0.069453 -0.089297,0.069453 z"
             style="stroke-width:0.79374999"
             id="path8422" />
          <path
             d="m 8.9582054,0.90656104 q 0,-0.14882812 0.1785937,-0.31749999 0.1819011,-0.17197916 0.4365625,-0.17197916 0.2414323,0 0.4233333,0.17197916 0.1852081,0.17197916 0.1852081,0.39687498 0,0.14882817 -0.0893,0.28111977 Q 10.006617,1.3960402 9.7056533,1.67716 L 9.0210439,2.3154672 v 0.00992 H 10.059533 V 2.2063266 q 0,-0.089297 0.06945,-0.089297 0.06614,0 0.06614,0.089297 V 2.460988 H 8.8920596 V 2.2625506 L 9.6725804,1.5283318 q 0.2315104,-0.2282031 0.3009635,-0.3307291 0.07276,-0.102526 0.07276,-0.21497396 0,-0.17197916 -0.1422132,-0.30096353 -0.1422136,-0.12898437 -0.3307292,-0.12898437 -0.1686718,0 -0.3075781,0.0992188 -0.1355989,0.0992188 -0.1752864,0.24804686 -0.019844,0.0661458 -0.069453,0.0661458 -0.023151,0 -0.042995,-0.0165365 -0.019844,-0.0198437 -0.019844,-0.0429948 z"
             style="stroke-width:0.79374999"
             id="path8424" />
          <path
             d="m 12.207981,1.3001287 v 0.3307292 q 0,0.3902604 -0.171979,0.6349999 -0.171979,0.2447396 -0.446484,0.2447396 -0.274506,0 -0.446485,-0.2447396 Q 10.971054,2.0211183 10.971054,1.6308579 V 1.3001287 q 0,-0.39356766 0.171979,-0.63830724 0.171979,-0.24473957 0.446485,-0.24473957 0.274505,0 0.446484,0.24473957 0.171979,0.24473958 0.171979,0.63830724 z M 11.589518,0.55268084 q -0.224896,0 -0.353881,0.22820312 -0.128984,0.22489584 -0.128984,0.53578124 v 0.2943489 q 0,0.3241146 0.132292,0.5457031 0.135599,0.2182813 0.350573,0.2182813 0.224895,0 0.35388,-0.2248959 0.128984,-0.2282031 0.128984,-0.5390885 V 1.3166652 q 0,-0.32411458 -0.135599,-0.54239582 -0.132292,-0.22158854 -0.347265,-0.22158854 z"
             style="stroke-width:0.79374999"
             id="path8426" />
          <path
             d="M 13.642054,0.43692564 V 2.3253891 h 0.459713 q 0.0893,0 0.0893,0.066146 0,0.069453 -0.0893,0.069453 h -1.055026 q -0.0926,0 -0.0926,-0.069453 0,-0.066146 0.0926,-0.066146 h 0.459714 V 0.61551938 l -0.373724,0.37372394 q -0.02646,0.0264584 -0.06945,0.0264584 -0.02646,0 -0.0463,-0.0198438 -0.01654,-0.023151 -0.01654,-0.056224 0,-0.0297656 0.03638,-0.0661458 l 0.436562,-0.43656248 z"
             style="stroke-width:0.79374999"
             id="path8428" />
          <path
             d="M 15.625137,0.43692564 V 2.3253891 h 0.459713 q 0.0893,0 0.0893,0.066146 0,0.069453 -0.0893,0.069453 h -1.055026 q -0.0926,0 -0.0926,-0.069453 0,-0.066146 0.0926,-0.066146 h 0.459714 V 0.61551938 l -0.373724,0.37372394 q -0.02646,0.0264584 -0.06945,0.0264584 -0.02646,0 -0.0463,-0.0198438 -0.01654,-0.023151 -0.01654,-0.056224 0,-0.0297656 0.03638,-0.0661458 l 0.436563,-0.43656248 z"
             style="stroke-width:0.79374999"
               id="path8430" />
          </g>
      </svg>
    </div>
    <div class="white gradient msfilter" style=color:white>
      FF3.6-2010
    </div>
  </body>
 </html>

2
CSS насправді має випуски. Є 1.0, 2.0, 2.1, 3.0 та 4.0. Питання навіть говорило про те, щоб використовувати Вікіпедію або мовний сайт як доказ дати виходу, тому ви повинні перевірити. Початкова дата випуску: 17 грудня 1996 р.
mbomb007

Це не означає, що немає жодного з цих рівнів (вони навіть не називаються релізами, оскільки вони не є, ви повинні перевірити посилання, яке ви опублікували). А CSS3 і 4 навіть не мають дати випуску, оскільки вони створюються в режимі "польоту" і переходять між проектами, кандидатами та рекомендаціями. Крім того, жоден браузер не реалізує конкретний рівень 100% і 0% наступного рівня, тому найкраща дата, яку ви можете придумати, - це дата виходу браузера.
qwazix

Тоді вибрана мова не відповідає необхідним специфікаціям для цього завдання. Не так, як ви намагаєтеся це зробити. Мова визначається її реалізацією, тому вам потрібно вибрати браузер і дотримуватися його, використовуючи різні версії браузера , а не різні браузери. Я б все-таки просив ОП.
mbomb007

ОП не сказала, що різні версії вважаються різними мовами, вони просто сказали роздрукувати рік випуску мовної версії, яка використовується для різних мов . Однак ~ половина відповідей ґрунтувалася на припущенні, що різні версії досить різні, щоб рахуватися як мови. Якщо python 2.5.0 і 2.5.1 вважаються досить різними, я не можу зрозуміти, наскільки IE і Chrome не є.
qwazix

6

3 роки, 89 байт

Python 2, JavaScript (ES6) та Perl

eval((["1","print=_=>console.log(1995)"])[+(2/3>0)]);print(eval(("1991",1987)["$$">"0"]))

Перший evalбуде працювати 1на Python 2 та print=_=>console.log(1995)JavaScript та Perl, використовуючи функцію цілого поділу Python 2. Це створює printфункцію в JavaScript, а Perl лише мовчки піклується про синтаксичні помилки та працює незалежно.

Другий evalпокладається на інтерполяцію змінної $$(поточного PID) Perl у рядок, що буде істинним при порівнянні (з використанням >оператора) проти "0"(Python вимагає рядка в цьому порівнянні, тоді як Perl неявно перетворюється на ціле число).

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

Я використовував цю сторінку Вікіпедії, щоб знайти роки, які слід використовувати.


2

3 мови, 3 роки

Спеціальна відповідь для задоволення.

2002!~+++++++[<+++++++>-]<[.++++++++..------.[-]] 2016 !.
  • Миша-2002 : все після~- це коментар, і перша частина, яка також могла бути написанаC0U!!!, друкує2002.

  • ця команда Calc перед викликом : що є інтерпретатором калькулятора на основі стеку, який я щойно розробив у C11 для програмування II, частина програми перед першим пробілом надрукує помилку (дозволено під специфікацією виклику) та2016 !.друкує2016.

  • Brainfuck : друкує 1993 рік, як видно з інших відповідей. Остаточне сторонне .ігнорується beef.

Зауважте, що показ Calc поточного стеку < stackз кожним не порожнім рядком вводу є частиною підказки >, а не частиною виводу.


Де я можу дізнатися про Мишу-2002? Схоже, у github немає специфікацій.
Сріотчилізм О'Заїк

@WheatWizard README сховища містить посилання на оригінальну музику доктора Грогоно та перезавантаження Девіда Сімпсона 2002 року , які разом малюють картинку ОК.
кіт

2

Microsoft Excel / Google Таблиці, 22 байти

Функція анонімного робочого листа, яка не приймає вводу та виводу 1987в Microsoft Excel та 2006в Google Таблицях

=IfError(M(2006),1987)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.