Kiedy wydano ten język?


92

Twoje wyzwanie jest proste. Musisz napisać program, który drukuje do STDOUT lub pliku w roku, w którym został wydany język, w którym został napisany. Ponieważ jest to tak proste zadanie, zwrot musi być napisany w jak największej liczbie różnych języków.

Twój wynik to łączna liczba różnych lat, które zostały poprawnie wydrukowane.

Dla każdego używanego języka musisz

  • Określ, której wersji języka używasz. (Jeśli istnieje wiele wersji)

  • Podaj rok wydania tej wersji oraz

  • Podaj link do strony potwierdzającej datę twojej wersji / języka.

Każdy z tych elementów liczy się jako dowód daty wydania, o ile określa numer wersji (jeśli dotyczy) i datę wydania.

  • Strona Wikipedii.

  • Esolangs strona.

  • Oficjalna strona tego języka. Liczy się strona github lub podobna, o ile ma datę wydania. (Ostatnie zatwierdzenie się nie liczy, chyba że gdzieś w kodzie jest numer wersji)

Jeśli nie ma wielu wersji lub wydań danego języka, wystarczy użyć początkowej daty wydania danego języka.

Mniejsze wersje tego samego języka liczone jako różne języki, o ile pochodzą z różnych lat i nadal zapewniają poprawne wyniki. Być może nie korzystać z żadnych pomocy poleceń wbudowanych, które dają Ci informacji (w tym data wydania) na temat aktualnej wersji języka używanego. Na przykład jest to nieprawidłowe przesłanie Pythona:

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

Niezależnie od tego, które zgłoszenie prawidłowo wydrukuje najbardziej wyraźne lata, wygrywa!

Zasady

  • Każdy program musi wydrukować rok językowy i nic więcej . Końcowy znak nowej linii (styl Windows lub styl * nix) jest dozwolony.

  • Żaden program nie może przyjmować żadnych danych wejściowych.

  • W przypadku remisu wygrywa najkrótszy kod liczony w bajtach. Możesz użyć do tego dowolnego kodowania, ale wszystkie programy muszą używać tego samego kodowania.

  • Każdy z programów może drukować do STDERR lub generować błędy czasu wykonania / błędów kompilacji i ostrzeżenia, dopóki prawidłowe wyjście jest nadal drukowane do STDOUT lub pliku.

  • Różne języki mogą używać różnych metod We / Wy, ale większość z nich to pełne programy (funkcje niedozwolone dla tego wyzwania) i postępują zgodnie z jedną z naszych domyślnych dozwolonych metod We / Wy .

Szczęśliwego golfowego poliglota!


Ponieważ Pip nie ma strony w Wikipedii ani Esolangs, ma tylko GitHub i nie miał żadnych „wydań” w znaczeniu tego słowa w GitHub, czy nie można go użyć w tym wyzwaniu? (Ma numer wersji, który jest aktualizowany przy każdym zatwierdzeniu.)
DLosc

1
@dlosc Cóż, nie chcę niepotrzebnie wykluczać żadnych języków, ale chcę się upewnić, że „data wydania” pozostaje całkowicie obiektywna. Czy możesz wymyślić lepszy sposób egzekwowania daty wydania, która obejmowałaby więcej języków?
DJMcMayhem

4
(od niechcenia wstawia kod białych znaków, aby wydrukować 2003 w zasadzie w każdym pojedynczym zgłoszeniu)
Value Ink

8
„Być może nie korzystać z żadnych pomocy poleceń wbudowanych, które dają informację o aktualnej wersji języka używasz.” Mój nacisk. Czy mogę wyszukać datę kompilacji w pliku interpretera?
Adám

2
Nie sądzę, żeby ten w ogóle był duplikatem. Nawet jeśli tak, to wyzwanie należy uznać za „oryginalne”, ponieważ w odróżnieniu od drugiego wyzwanie zachęca użytkowników do wyjścia i dowiedzenia się, czego używają.

Odpowiedzi:


159

Krótka historia języków programowania 2D: 16 (+2) lat

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@

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

Czy wspomniałem, że lubię języki programowania 2D?

1993: Befunge

Język, który (rzekomo patrz ostatnia sekcja) zaczął to wszystko. W Befunge możesz przekierować kontrolę za pomocą <v>^, ale teraz wszechobecne lustra \i /jeszcze nie były niczym. Interpreter Befunge używany w Anarchy Golf ignoruje nieznane polecenia. Możemy to wykorzystać do odróżnienia rodziny Befunge od rodziny> <>. Dlatego kod wykonywany przez Befunge jest następujący:

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

"8991"Popycha poszczególne znaki na stos. ,,,drukuje pierwsze trzy z nich. Wtedy ;jest nieznane (którego użyjemy, aby odróżnić go od Befunge 98), 5-zamienia a 8na 3i ,drukuje to również przed @zakończeniem programu.

1997: Wierd

Napisanie tej części rozwiązania zajęło mi chyba tyle, ile napisanie wszystkich pozostałych i połączenie ich razem ...

Wierd zna tylko dwa symbole: przestrzeń i wszystko inne. Wskaźnik instrukcji próbuje podążać ścieżką utworzoną przez znaki spacji, zaczynając po przekątnej od lewego górnego rogu i zawsze próbując iść tak prosto, jak to możliwe. Zakręty na ścieżce tworzą rzeczywiste instrukcje (ze stopniami zakrętu określającymi, która instrukcja ma zostać wykonana). Więc kod widziany przez Wierda jest następujący:

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

U 1997góry nie jest właściwie wykonywane, ale Wierd pozwala nam odczytać go z kodu źródłowego, który jest o wiele krótszy niż próba skonstruowania kodów znaków dla samych czterech cyfr (nawet jeśli nie wygląda to tak ... .). Nie mam ochoty rozbijać tego wszystkiego, ale wyraźnie widać cztery powtarzające się sekcje. To powoduje, że najpierw przechowujemy 1na stosie, a następnie każda z tych czterech sekcji zwiększa to 1, a następnie rozgałęzia. Dolna gałąź popycha inną1, pobiera znak źródłowy na tych współrzędnych i drukuje go, podczas gdy górna gałąź jest przekierowywana do następnej sekcji. Być może zastanawiasz się, dlaczego końce ścieżek są tak niepotrzebnie długie, ale dzieje się tak, ponieważ gdy Wierd dotrze do końca ścieżki, próbuje przeskoczyć na pobliską ścieżkę, zanim zdecyduje, że powinna zakończyć obecną gałąź. Aby tego uniknąć, musimy przenieść te końce wystarczająco daleko od jakiegokolwiek innego kodu.

1998: Befunge 98

Befunge otrzymało dość znaną aktualizację w 1998 roku z bardzo rygorystyczną specyfikacją, którą można uogólnić na dowolne wymiary (i myślę, że także arbitralne topologie). Jest jednak w dużej mierze kompatybilny wstecz z Befunge, co sprawia, że ​​dość łatwo można poligotować te dwa. To Befunge wciąż nie miało żadnych mirrorów, więc wykonywana ścieżka jest taka sama jak dla Befunge 93:

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

Różnica polega na tym, że Befunge 98 nie ignoruje ;. Zamiast tego zachowuje się trochę jak komentarz, ponieważ wszystkie polecenia do następnego ;są ignorowane. W ten sposób, nie zmniejszamy że 8do 3i wydrukować 1998jak jest.

2001: A Space Od ... PingPong

Rok 2001 to rok Piet, ale tak naprawdę nie miałem ochoty poligotować pliku obrazu za pomocą wszystkich innych programów, więc tutaj jest mniej znany język 2D. Wygląda na to, że ma sporo funkcji (z których nie będziemy korzystać). Podziękowania dla Sp3000 za znalezienie oryginalnego tłumacza (który jest jedynym martwym linkiem w zarchiwizowanej wersji oficjalnej strony internetowej).

PingPong jest nieco niezwykły, ponieważ ma tylko kopie lustrzane i nie ma <v>^przekierowań. Więc to przesuwa się v19977na początku, a następnie uderza w lustro, które owija go do dna. Odpowiedni kod to:

v19977/

...

      /K:0:1:@

...

Rzeczywisty kod jest dość prosty: Kpopycha 20, cyfry pchają się, :wypisuje liczbę całkowitą i @kończy działanie programu.

2003: SNUSP

Jest to pierwszy język, w którym sprawy stają się nieco łatwiejsze, ponieważ SNUSP obsługuje wyraźny punkt wejścia. Ten punkt wejścia jest oznaczony $. Sądząc z niektórych artykułów na temat esolangów, ten język zainspirował kilka innych, ale niestety pod koniec dnia jest tylko pochodną Brainfuck. To powiedziawszy, myślę, że sposób, w jaki ustawia obecną komórkę na 48, jest dość schludny (i został skradziony z artykułu esolangs). Oto odpowiednia część kodu:

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

Są to 24 +s, a mirrory wysyłają adres IP dokładnie dwa razy.

2004: Axo

Z jakiegoś powodu, ten język nie mają <^>przekierowań ale zamiast zwykle vużywa %. Dlatego po prostu przesuwa się on w pierwszej linii. Odpowiedni kod to:

v19977/2{@{{4{\

Na początek wciskamy kilka cyfr, dokonujemy podziału. Następnie 2{drukuje 2, @usuwa stos. {{wypisuje dwa (niejawne) 0. 4{drukuje 4i \kończy program.

2005: Kolej

2005 był trudnym wyborem. Przez żaden inny rok nie znalazłem tylu języków 2D, a jest też REGULACJA i Archway, które zaczynają się w lewym dolnym rogu (co ułatwiłoby im dodawanie). Lubię Rail, a ponieważ ma wyraźny punkt wejścia, nie było trudno go dodać. Rail szuka linii zaczynającej się od $'main'i zaczyna poruszać się na południowy wschód od $. Oznacza to, że odpowiedni kod to:

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

\I -są tylko tory (nie-OPS). Jest [2005]to literał łańcuchowy, który owypisuje się przed #zakończeniem programu.

2006: BestFriends.js

Dwuwymiarowy Brainfuck. Jest jeszcze jeden interesujący język na ten rok, zwany Czarnym, który zaczyna się od współrzędnych (3,3)(oparty na 1), co sprawiłoby, że użycie tego w poliglocie też jest interesujące. Nie mogłem jednak znaleźć tłumacza. Więc zamiast tego będziemy musieli pracować z inną pochodną BF ...

Ciekawą rzeczą w tym jest to, że nie formatuje siatki na linie z liniami, jak w większości innych języków 2D. Zamiast tego |służy jako separator linii. Ponieważ nie korzystałem |z żadnego innego języka, mogłem po prostu wstawić |ostatni wiersz, co czyni całą resztę programu jedną linią, jeśli chodzi o BF.js. Odpowiedni kod jest więc następujący (zamieniając go |w rzeczywisty wysuw linii):

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

BF.js nie używa <v>^ani mirrorów. Jedynym sposobem na przekierowanie przepływu sterującego jest {}obrócenie kierunku IP o 90 °. Te nawiasy klamrowe przenoszą adres IP do drugiej linii. Pozostała część to proste rozwiązanie Brainfuck (niezbyt dobrze golfowane), które ustawia komórkę na 50(punkt kodowy 2), a następnie drukuje 2006, przesuwając nieco wartość. @kończy program.

2008: BrainSpace 1.0

W tym roku naprawdę chciałem użyć DOBELA który korzysta z wielu punktów wejścia i wygląda jak LoveChild z rozszczepienia i Ziim . Niestety nie udało mi się przekonać tłumacza do pracy. Oto kolejna pochodna BF (ostatnia, obiecuję).

W przeciwieństwie do ostatniego, ten zna oba <v>^ i mirrory, więc odpowiedni kod to:

v
\'\
  8

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

Ten nie ma zwykłej []pętli w stylu BF (zamiast tego musisz utworzyć rzeczywistą pętlę 2D), więc po prostu zdecydowałem się na hardcode, 50ponieważ i tak miałem mnóstwo znaków z rzędu od Wierda. Zauważ, że 'i 8są ignorowane, *jest to trampolina warunkowa, którą możemy zignorować, i Ojest Brainfuck .. XKończy program.

2009: > <>

Prawdopodobnie najpopularniejszy fungeoid (inny niż sam Befunge) przynajmniej wokół tych części. > <> ma zarówno <v>^i mirrory, ale także literały łańcuchowe, więc wykonany kod jest następujący:

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

Dosłowny ciąg znaków służy głównie do pominięcia \stosowanego w BrainSpace 1.0, ale gdy już to robimy, równie dobrze możemy przesuwać pierwsze dwa znaki. oodrukuje je. Następnie przesuwa 100trzy cyfry, @przesuwa górną na dolną i ndrukuje 0pod spodem. Robimy to samo, 590co drukuje 9. Jeśli zastanawiasz się, dlaczego nie tylko drukuję w tej 2009postaci, poczekaj na 2015 r., ;Kończy program.

2010: Kardynał

Ten był prosty, ponieważ ma wyraźny punkt wejścia na %. Jednak ten tworzy 4 adresy IP we wszystkich kierunkach (stąd nazwa języka, jak sądzę) i musimy pozbyć się 3 z nich. Oto odpowiedni kod:

 x
x%"2010"x
 x

No tak. (W Cardinal tryb strun drukowany jest bezpośrednio zamiast wypychania znaków na stos.)

2011: RunR

Kolejny język z wyraźnym punktem wejścia ( David Catt, który stworzył kilka innych bardzo miłych esolangów), tym razem o S. To sprawia, że ​​odpowiedni kod jest tą częścią:

S1^2^2^6^8MAOUOAOOF

RunR jest nieco interesujący, ponieważ większość operacji działa z rodzajem rejestru, a wartości muszą zostać jawnie przeniesione na stos w celu wykonania operacji binarnych. Cyfry same ustawiają wartości rejestru i ^wypychają bieżący rejestr na stos. Potem Mjest mnożenie (rejestr razy wartość wyskakująca ze stosu), Uto odejmowanie, Adodawanie, Owyprowadzanie. Fkończy program.

2012: Ropy

Podobnie jak Wierd, Ropy próbuje śledzić sekcje znaków spacji, ale tutaj zakręty nie określają poleceń. W rzeczywistości okazuje się, że Ropy jest bardziej podobny do mojego własnego Labiryntu , ponieważ wybrany kierunek zależy od wierzchu stosu. Jednak tak naprawdę nie musimy się tym martwić, ponieważ Ropy przesuwa się wzdłuż pierwszej linii:

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

Istnieje wiele rzeczy, które możemy zignorować aż do >. Wszystko, co musimy wiedzieć, to że na górze stosu będzie w tym miejscu a, 4a będzie 2poniżej.

>powiela 4, /jest podział zamieniający go w 1. Potem pchamy 02. &&&łączy cztery pierwsze cyfry stosu w odwrotnej kolejności, dając 2012. #wyprowadza to. ????po prostu usuwa stos, ponieważ w przeciwnym razie górna część stosu również jest wyprowadzana.

Jednym punktem zainteresowania jest to, że drugi 7w 19977został dodany z powodu ropy. /Podział w ropy nie top / second(naprzeciwko zwykłym celu, w wielu językach, na stosie), gdzie 7 / 9da 0. Gdybyśmy mieli zero na szczycie stosu, Ropy zrobiłby jakieś dzikie rzeczy z jego kierunkiem ruchu, więc musimy popchnąć drugi, 7aby upewnić się, że szczyt stosu pozostaje dodatni, a Ropy porusza się na wschód.

2014: Rozszczepienie

Dzięki wyraźnym punktom wejścia ten jest łatwy. RDLUtwórz atomy (wskaźniki instrukcji) w odpowiednim kierunku, więc odpowiedni bit jest następujący:

R"2014";

Zauważ, że jest też Ukod źródłowy, ale ten atom w końcu uderza w jeden *z Wierd, który kończy program (i ten atom zajmuje dużo więcej czasu niż Rpotrzeba do wydrukowania 2014).

2015: Gol> <>

Silniejsza pochodna Sp3000> <>. Jest w dużej mierze wstecznie kompatybilny z> <>, więc wykonywany kod jest nadal:

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

Jednak zmieniono kierunek obrotu @, co jest standardową sztuczką do rozróżnienia> <> i Gol> <> w poliglotach, więc ten drukuje 15zamiast 09. Stąd dziwność w drugiej połowie programu.

2016: CSL

CSL jest dość interesujące, ponieważ polecenia nie są wykonywane natychmiast. Zamiast tego każde polecenie jest wypychane na stos poleceń ei Emoże być używane do wykonywania poleceń z niego. Odpowiedni kod staje się:

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

Więc Ewykonuje cały stos poleceń, co oznacza, że ​​rzeczy przed nim są wykonywane w odwrotnej kolejności. Musimy tylko spojrzeć na *:

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

Do 1s wcisnąć się na stosie danych. +i -są zmniejszanie / zwiększanie. Pdrukuje górę stosu. Następnie *próbuje pomnożyć dwie najwyższe wartości stosu. Jednak stos jest pusty, więc to kończy działanie programu.


W tym momencie przechodzimy do języków, które zostały wydane po opublikowaniu tego wyzwania, więc tak naprawdę nie liczę ich za wynik, zwłaszcza że sam je stworzyłem (choć nie z myślą o tym wyzwaniu). Mają jednak nowatorską semantykę ruchu IP, która ułatwiła dopasowanie ich do poliglota, a także dodanie czegoś interesującego do tej prezentacji języków 2D.

2017: Alice

Alice została zaprojektowana jako bogaty w fungeoid. Jedną interesującą różnicą w stosunku do większości (ale nie wszystkich) języków 2D jest to, że IP może poruszać się ortogonalnie lub ukośnie. Przełączanie się między nimi zmienia również semantykę prawie wszystkich poleceń w języku. Co więcej, Alice obsługuje zarówno tradycyjne <^>vnastawniki kierunku, jak i \/mirrory, ale mirrory mają bardzo wyjątkowe zachowanie w Alice (co ułatwia poprowadzenie IP Alice do dotychczas nieużywanej części kodu).

Podczas gdy większość języków leczyć \i /jak gdyby były lustra w kącie 45 °, a IP jako promienia świetlnego odbijając się od niego, Alice traktuje je jako posiadające 67,5 ° kąt (która jest bliżej kątem rzeczywistych glifów ukośnik) , a adres IP również przechodzi przez lustro (stąd nazwa języka). Ze względu na ten kąt lustra przełączają się między ruchem wzdłuż kierunków prostopadłych lub ukośnych. Ponadto, podczas gdy w trybie zwykłym (tzn. Gdy IP porusza się wzdłuż przekątnych), siatka nie zawija się, a zamiast tego IP odbija się od krawędzi (podczas gdy w trybie kardynalnym zawija się).

Podsumowując, kod wykonywany przez Alice jest następujący:

v19
\ \

...

  >      "7102"4&o@

...

Adres IP zaczyna się jak zwykle w lewym górnym rogu i vwysyła na południe. Teraz \odzwierciedla IP, aby przejść na północny zachód, gdzie natychmiast odbija się od lewej krawędzi siatki (i zamiast tego przesuwa się na północny wschód). 1można zignorować, IP odbija się od górnej krawędzi, aby przejść dalej na południowy wschód. Uderzyliśmy inny, \który odzwierciedla północ IP. 9można również zignorować, a następnie IP zawija się w dolnej części siatki. Po kilku wierszach przekierowujemy go na wschód >dla wygody. Następnie "7102"przesuwa punkty kodowe 2017, 4&odrukuje te cztery znaki i @kończy działanie programu.

2018: Wumpus

Wumpus to pierwszy język 2D na trójkątnej siatce, który sprawia, że ​​poruszanie się po kodzie jest zupełnie inne (i ponownie pozwala nam łatwo dotrzeć do nieużywanej części kodu). Dlatego zamiast myśleć o każdej postaci w siatce jako małym kwadracie, powinieneś myśleć o nich jako naprzemiennych trójkątach w górę i w dół. Lewy górny róg jest zawsze trójkątem skierowanym w górę.

Wumpus nie ma takich ustawień <^>v, ale ma lustra \/. Jednak ze względu na trójkątną siatkę działają one inaczej niż większość innych języków. IP odbija się od nich jak promień światła (jak zwykle), ale powinieneś myśleć o nich jako o kącie 60 °. Tak więc IP przemieszczające się na wschód kończy się przemieszczaniem wzdłuż północno-zachodniej osi siatki.

Kolejną różnicą w stosunku do większości innych języków jest to, że krawędzie siatki nie zawijają się, ale zamiast tego IP odbija się od krawędzi (tak jakby te komórki krawędzi zawierały odpowiednie kopie lustrzane). Kolejnym zabawnym szczegółem jest to, że przekątne przez trójkątną siatkę faktycznie wyglądają jak schody w kodzie źródłowym.

Mając to na uwadze, kod wykonywany przez Wumpusa jest następujący (w celu zastąpienia spacji .dla przejrzystości:

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

To v19977tylko śmieci, które możemy zignorować. /wysyła adres IP na północny zachód, gdzie ponownie przechodzi przez 977(z prawej), odbijając się od górnej krawędzi. Następnie IP przesuwa się na południowy zachód przez 2089i kilka przestrzeni, zanim trafi w lewą krawędź, aby ponownie odbić się na wschód. *jest również śmieciami. Następnie w końcu #2018naciska 2018, Odrukuje i @kończy działanie programu.


Brakujące lata

Na koniec kilka notatek o latach, których nie opisałem.

Podczas badań języków 2D w celu znalezienia odpowiednich języków, które mogłyby być używane w poliglocie, dowiedziałem się, że wbrew powszechnemu przekonaniu Befunge nie był pierwszym językiem 2D. Wydaje się, że tytuł ten należy do Bioty, która została już stworzona w 1991 roku. Niestety, język nie ma żadnych wyników, więc nie mogłem go użyć do tego wyzwania.

O ile wiem, w 1992 i 1995 r. Nie utworzono języków 2D. Pozostało kilka lat:

  • 1994: Powstaje Orthagonal , niezależnie od Befunge. Języki są semantycznie całkiem podobne, ale Ortogonalnie tak naprawdę nie przedstawia kodu źródłowego w 2D. Zamiast tego każda linia jest (x, y, instruction)krotką. Otrzymałem nawet specyfikację języka i oryginalnego tłumacza od twórcy Jeffa Eplera, ale ostatecznie fakt, że składnia nie jest 2D, sprawił, że język nie był odpowiedni dla tego poliglota.
  • 1996: Utworzono ortogonalnego następcę ortagonalnego (stworzonego przez kogoś innego), ale na potrzeby tego poliglota występują te same problemy co ortagonalne.
  • 1999: Jedynym językiem, jaki mogłem znaleźć, był automat komórkowy Chris Pressey REDGREEN . Niestety, w przeciwieństwie do swojego poprzednika RUBE, nie ma on żadnej semantyki we / wy.
  • 2000: Istnieje inny automat komórkowy Chrisa Presseya o nazwie noit o 'mnain worb, ale nie ma również żadnych wejść / wyjść. Jest też Numberix, którego nie próbowałem uruchomić i nie jestem pewien, czy zignorowałby znaki inne niż szesnastkowe w kodzie źródłowym.
  • 2002: Jest Clunk bez I / O i ZT, których specyfikacja językowa mnie przeraża.
  • 2007: Znalazłem tutaj trzy języki. Zetaplex jest oparty na obrazie (więc nie), a RubE On Conveyor Belts wydaje się wymagać nagłówka o dość ścisłym formacie, który pomieszałby się z pierwszą linią programu. Istnieje również Cellbrain firmy Quintopia, ale wydaje się również, że wymaga określonego nagłówka.
  • 2013: Znów znalazłem trzy języki. Połowy mogą być możliwe z dużą ilością restrukturyzacji, ale wymagałoby to rozpoczęcia programu od ważnego doku. Quipu , z pamięci, jest zbyt surowe pod względem składni, aby pozwolić na wiele poliglotów. A Swordfish jest kolejnym członkiem rodziny> <>, ale niestety nie udało mi się znaleźć tłumacza. W przeciwnym razie ten prawdopodobnie byłby dość łatwy do dodania.

Jeśli ktoś jest zainteresowany, oto pełna lista zaimplementowanych języków 2D posortowana według lat, o ile mogłem je znaleźć (w momencie opublikowania tej odpowiedzi). Jeśli czegoś brakuje na tej liście, daj mi znać na czacie, ponieważ naprawdę byłbym zainteresowany pełną listą.


8
Łał. To naprawdę imponujące
DJMcMayhem

@MartinEnder Czy zastanawiałeś się nad umieszczeniem swojej listy języków programowania 2D na samym Esolang?
doppelgreener

@doppelgreener Nie jestem do końca pewien, jak by się tam zmieściło. Zasadniczo jest to przecięcie kategorii 2D z różnymi kategoriami roku.
Martin Ender

Naprawię wiersz nagłówka RubE On Conveyor Belt, jeśli masz maszynę czasu, mogę pożyczyć, aby nauczyć mnie 13-latka, jak czytać plik, nie znając z góry jego rozmiaru. (To jedyny powód, dla którego istniała linia nagłówka; IMO może nie liczyć nagłówka rozmiaru jako części programu, nawet jeśli jest to ściśle mówiąc)
immibis

1
@cairdcoinheringaahing Proszę bardzo. I Wumpus na 2018 rok, kiedy byłem przy tym.
Martin Ender

117

15 lat, Python

Wersje: 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 i 3.6.0a4 . Wersje niepowiązane można znaleźć na stronie pobierania .

Data wydania 0.9.1 można znaleźć tutaj . Niestety musiałem pominąć wiele lat z powodu braku starych wersji i problemów z kompilacją na moim komputerze. Przedstawione lata to 1991, 2000-2002 i 2006-2016.

Testowany na Arch Linux, używając wersji spakowanych gzipem.

# 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
... Łał. Nadal dziwi mnie to, jak dobrze niektórzy ludzie znają swoje języki. To jak spoglądanie w przeszłość ...
wizzwizz4

Czy Python 0 obsługuje try / oprócz?
OldBunny2800,

8
@ OldBunny2800 O dziwo, tak, robi
Sp3000,

54

Krótkie i słodkie; trzy APL- y ( K , J201 , Dyalog 7.1 ) w 8 bajtach

1993+1^2

1993 plus ...

K: pierwsza 1 liczba całkowita {0} oprócz {2}, tj. {0}; 1993 - Wypróbuj online!

J: 1,2 = 1; 1994 - Wypróbuj online!

APL: LCM (1,2) = 2; 1995 - Wypróbuj online!


Bardzo dobrze! Myślisz, że możesz połączyć więcej języków Iverson?
mile

@miles Get jest trudny z K, a APL2 / APLX / APL * PLUS są zbyt podobne.
Adám

@miles Czy znasz wersję J z 2000 roku? Jeśli tak, możemy to zrobić za 2e3+?1pomocą Dyalog 9.0.1.
Adám

Kolejna fajna perspektywa dotyczy X^Yniektórych liczb X i Y, podobnie jak ^moc w J, ale LCM w APL.
Adám

2
Znalazłem stronę funkcji dotyczących wydań z datami do 2000 r., Jsoftware.com/release/status.htm
mile

46

10 lat, 12 języków, 2430 bajtów

Ta odpowiedź to współpraca między mną a użytkownikiem 1000000000 .

Krótka lista języków:

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 

Oto kod:

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

Aby dopasować to do odpowiedzi, zrezygnuję z całych linków TIO i raczej po prostu opublikuję link do ważnego interpretera, w którym użytkownik może wprowadzić kod. Oto link do tego Pastebin .

Piet

Format pliku PPM , jeden z formatów graficznych, które interpreter Piet używaliśmy może odczytywać, posiada wersję zwykłego tekstu ASCII. Dzięki temu mogliśmy osadzić kod innych języków jako śmieci w pliku obrazu odczytanym przez Piet i Braincopter.

Obraz wygląda następująco:

Surowy obraz

Nie wszystkie zdjęcia są ważne dla Piet. Oto wersja z linią podkreślającą ścieżkę, którą Piet podąża za kodem:

Ścieżka pieta

Pomimo nieco skomplikowanych metod tworzenia programu sam program jest dość prosty. Wzdłuż górnej krawędzi obrazu przesuwa 1 10 10 10 2się na stos; wzdłuż boku mnoży się trzykrotnie i dodaje raz. W dolnym rogu wyświetla wynik (2001), a następnie zatrzymuje się.

Braincopter

Braincopter to drugi język wizualny. Do ppmuruchomienia działa również ten sam plik obrazu. Ze względu na bardzo surowe ograniczenia np. Nasz kod Braincopter może używać tylko podzbioru oryginalnych operacji Braincopter. Jesteśmy ograniczeni do używania kolorów, które są ważne w Piet. To usuwa -operatora z Braincopter.

Oto ścieżka wyznaczona przez kod Braincoptera:

Ścieżka Braincoptera

Program Braincopter jest nieco dziwny z powodu braku -operatora. Ściany niebieskozielonego i ciemnobłękitnego służą do przekierowania wskaźnika, ale poza tym są identyczne z następującym pieprzeniem mózgu:

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

To drukuje 2005.

Paintfuck

Paintfuck jest trzecim wizualnym językiem programowania na naszej liście, jednak zamiast pobierania obrazu i wysyłania tekstu, Paintfuck pobiera tekst i wysyła obraz.

Ponieważ Paintfuck ignoruje nieistotne znaki, ponieważ brak operacji, większość kodu jest nieistotna. Odpowiednia sekcja kodu to:

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

Chociaż nie są to żadne operacje, ws na końcu kodu nic nie robią. Są tam po trawiastą część roztworu. n, e, s, I wsłużą do poruszania się po obrazie i *służy do wykreślić punkt w określonym miejscu. Program generuje:

Wyjście Paintfuck

Większa wersja:

Wydajność Painfuck, ale jest większa

Brainfuck

Podobnie jak Paintfuck Brainfuck ignoruje większość postaci. Jeszcze raz najważniejsze są:

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

Większość z nich jest dodatkowo nieistotna z uwagi na okoliczności i po prostu są to znaki, których potrzebuje inny język. Węższa wersja tego kodu to:

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

To po prostu drukuje 1993.

Brainbool

Brainbool jest bardzo podobny do Brainfuck w doborze postaci. Dużą różnicą, która pozwala na połączenie tych dwóch elementów, jest brak -Brainbool. Ważnymi postaciami dla Brainbool są:

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

Wyniki Brainbool i brainfuck wykluczają się wzajemnie. Brainbool ukrywa swoje wyjście w drugim zestawie []. Brainfuck napotyka, +++---zanim osiągnie wartość [zerową i powoduje pominięcie wyjścia, podczas gdy Brainbool widzi +++ustawienie tylko na 1, powodując przejście przez pętlę. Podobnie Brainbool jest ustawiony na zero w czwartej pętli, co powoduje przeskakiwanie, gdy Brainfuck wchodzi do pętli o wartości 49.

Ponieważ Brainbool nie ma wyjścia dziesiętnego, wypisuje 2010 w postaci binarnej:

11111011010

Rozszczepienie

Jedyną częścią kodu, która jest ważna dla rozszczepienia, jest:

R"2014";

Na Rwezwanie w atomie porusza się w prawo, z "2014"nadrukami 2014i ;wstrzymuje wykonania.

Befunge

Befunge przechodzi tylko przez następujące postacie:

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

P3one niezbędne do utworzenia prawidłowego obrazu .ppm dla polecenia piet i kumulacyjnego wypychania 3 na stos. vumieszcza przekierować wskaźnik w dół. Następnie przechodzi przez 7w 17użyte w celu wskazania szerokości obrazu .ppm. >Przekierowuje kursor w prawo. 7*mnoży górę stosu przez 7, pozostawiając 49 (wartość ASCII z 1) na szczycie stosu. ::dwukrotnie duplikuje górę stosu. Dane 1wyjściowe są generowane przez ,. 8 +dodaje 8 do górnego przyrostu do ASCII 9. :,,wysyła 9dwa razy. 2 +inkrementuje ASCII 1do ASCII 3i ,drukuje. Wreszcie @kończy program.

W sumie drukuje 1993.

Biała przestrzeń

Biała spacja, jak może sugerować nazwa, używa tylko białych znaków w swoich programach. Oto, co widzi tłumacz 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]

Większość tego, co robi ten kod, nie ma znaczenia dla wykonania programu (wszystkie wiersze zawierające tylko spacje po prostu wypychają zero na stos). Ważna część:

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

Pierwsza linia wypycha 2003 na stos. Następnie [Tab][LF][Space][Tab]drukuje górną część stosu (2003) jako liczbę. Na koniec trzy ostatnie przejścia liniowe kończą wykonywanie programu.

Trawa

Trawa ignoruje wszystko aż pierwszy znak ww pliku i po, że wszystkie znaki, które nie są w, Wlub v. Tłumacz Grassa brzmi:

wWWWwWWWWwv
wWWwWWWwv
wWWWwWWWWWwWWWWWWwwwWWWWWWWwWWWWWWwwwWWWWWWWWWWwWWWWWWWWWWwv
wWWWwWWWWwv
wWWwWWWwv
wWWwWWWwv
wWWwWWWwv
wWWwwwwwwwwwwwWWWwWWWWWwWWWWWWWwWWWWWWWWWwWWWWWWWWWWWWWWWwWWWWWWWWWWWWwv

Pierwszy wiersz definiuje funkcję, która dodaje dwa do wszystkiego, co jest przekazywane. Druga linia definiuje funkcję, która dodaje cztery do tego, co jest przekazywane. Trzeci definiuje funkcję, która wypisuje dwa plus argument, dwa razy argument, następnie wreszcie siedem plus argument (Grass wypisuje znaki na podstawie wartości ASCII). Czwarta, piąta i szósta linia definiują funkcje, które odpowiednio dodają osiem, 16, 32 i 64. Ostatni wiersz definiuje główną funkcję, która przyjmuje znak w(jedyna predefiniowana liczba w Grass, wartość ASCII 119) i dodaje do niej 185 za pomocą funkcji add zdefiniowanych w programie, a także wbudowanej funkcji add one. Trawa zawija liczby na 256, więc wynik to 48 (odpowiadający znakowi0). Następnie funkcja przekazuje to do funkcji trzeciego wiersza, który wypisuje 2007.

Gwiaździsty

Gwiaździste ignoruje wszystko, z wyjątkiem miejsca, +, *, ., ,, `, i '. Tak więc gwiaździsty tłumacz widzi tylko:

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

Jednak etykiety i instrukcje skoku są używane do pomijania części kodu, które mogą powodować problemy, jeśli zostaną uruchomione, więc kod działa w następujący sposób:

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

Ten kod wypycha dwa na stos, duplikuje go dwukrotnie, a następnie wyskakuje i drukuje jeden z nich jako liczbę. Następnie wypycha zero, powiela je i drukuje oba zera jako liczby. Następnie wyskakuje jedno z nich i skacze, a następnie przesuwa siódemkę na stos, a wyskakuje i drukuje jako liczbę. W końcu wyskakuje dwa ostatnie na stosie i przeskakuje na koniec programu.

Python 2.7.2

Kod Python ma następujący format:

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

gdzie ...oznacza wszystkie inne śmieci.

Pierwszy wiersz P3v=""jest tam, ponieważ aby być poprawnym .ppmplikiem, nasz kod musi zaczynać się od P3tego, zwykle będzie to błąd, ale jeśli powiemy Pythonowi, że jest to deklaracja zmiennej, zignoruje go.

Następnie musimy wydrukować 2011. Jednak ze względu na sposób .ppmformatowania nie możemy w tym wierszu zawierać żadnych liczb. Aby obejść ten problem, sumujemy wszystkie wartości ASCII łańcucha "~~~~~~~~~~~~~~~y"i wypisujemy wynik. Wreszcie używamy potrójnych cytatów komentarza wielowierszowego, aby python ignorował wszystko inne.

Brainflak

Najlepsze zostawiliśmy na koniec.

Brainflak, podobnie jak inne, ignoruje większość postaci. Odpowiednie postacie to:

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

Kod python (([()])), wypycha -1 do stosu dwukrotnie, więc należy go usunąć, zanim program zacznie przetwarzać.

Następnie Brainbool używa []nilada, który nic nie robi i program się rozpoczyna.

(((((()()()()){}){}){}){})({({}[<()>()])}{}<[[]]>)popycha 2016. Ostatni [<><>]to resztki Befunge i Brainfuck, ale na szczęście nic nie robi.

Po zakończeniu programu drukuje zawartość stosu, czyli drukuje 2016.


Znakomity! Miałem nadzieję, że Piet jakoś się pojawi, osadzanie rzeczy w PPM jest genialne. Dobra robota!
cincodenada

1
+1 dla We saved the best for last. : D
DJMcMayhem

38

5 lat

#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] i 1999: C99

Komentarz jednowierszowy //został dodany w C99, więc kompilator C89 odczytałby ten kod jako c=-4.5 / /*comment*/ -4.5, który jest taki sam jak c=-4.5 / -4.5, podczas gdy kompilator C99 odczytałby jako c=-4.5 //comment/**/
- 4.5, który jest taki sam jak c=-4.5 - 4.5.
Część Python jest komentarzem w programie C.

2010: Python 2.7 i 2015: Python 3.5

Dokumenty różnią się w Pythonie 3 i 2, ten program wykorzystuje długość dokumentów do wykrycia wersji Pythona.
Część C znajduje się w ciągu znaków w programie Python.

1993 [2] : Brainfuck

Zasadniczo ignoruje wszystko, co nie jest .,[]+-<>. Ponieważ program C ma ,w sobie, musiałem zmusić Brainfuck do odrzucenia tej części poprzez ustawienie bieżącego bajtu na 0.


  1. Specyfikacja C89 została wydana w 1990 roku. Więcej informacji .
  2. Nie mogłem znaleźć oficjalnej daty premiery, więc uwierzę w Esolangs i Wikipedię .

4
To jest świetne, zwłaszcza -4.5/-4.5i -4.5-4.5. Łączenie dwóch wersji każdego z dwóch głównych języków jest imponujące, nawet bez wrzucania tam BF :-)
ETHproductions

To nie jest codegolf, ale a=linia 2 nie jest potrzebna
TheInitializer,

@TheInitializer tak, próbowałem bez a=i dało to błąd, więc postanowiłem go zatrzymać. Nie wiem jednak, dlaczego wystąpił błąd, prawdopodobnie literówka.
betseg

@betseg, jeśli ten kod jest wykonywany tylko w Pythonie, powinien działać.
TheInitializer,

17

15 lat, JavaScript

Ponieważ cykl wydawania JavaScript jest bardzo nietypowy i niespójny, zamierzam użyć implementacji Firefoksa. Daj mi znać, jeśli nie jest to dozwolone.

Wersje: 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 (wszystkie testowane w systemie Windows 7)

Ważna uwaga: instalacja i otwarcie przeglądarki Firefox 1.0.0 lub dowolnej późniejszej wersji może usunąć wszystkie zapisane dane Firefoksa , w tym historię i zakładki.

Począwszy od wersji 1.0.0, możesz mieć otwartą tylko jedną wersję na raz; próba otwarcia innej wersji powoduje otwarcie nowego okna już otwartej wersji.

Instrukcje

Kod

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

Możesz dodać 16 rok, dołączając BF: <!--<<<<-[>+<-----]>--.++++++++..------.[-][-->przed skryptem i inny komentarz HTML zawierający tylko ]później.
Steven H.

6
@StevenH. Um ... wow, nigdy nawet nie myślałem o włączeniu do tego esolangów. I to jest naprawdę sprytny sposób na włączenie BF :-) Ale nie jestem pewien, czy naprawdę chcę ...
ETHproductions

13

6 języków, Turtlèd and brainfuck , Python 3.5, Python 2.7, > <> , Fission

Turtlèd nie istniał przed tym rokiem, więc jest tak obiektywny, nawet jeśli zatwierdzenia github się nie liczą, a BF ma dowód strony esolang, wydany w 1993 roku. Python 3.5 to 2015, 2.7 to 2010.> <> także ma stronę esolang , z 2009 r., podobnie jak Fission, 2014

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

Prawdopodobnie powinienem przypisać stronę stałych bf na esolangach ... ¯ \ _ (ツ) _ / ¯

Jak to działa, rodzaj:

Turtlèd:

Turtlèd tak naprawdę nie robi nic dla linii innych niż pierwsza:

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

/ jest nop

Brainfuck

Brainfuck ignoruje znaki w swoich poleceniach

widzi -[>+<-----]>--.++++++++..------.(ostatni. pochodzi z części python)

który po prostu robi Brainfuck, używa zawijania, aby podzielić 255 przez 5, a następnie odjąć 2 od wyniku, wydrukować, zwiększyć 8 razy, wydrukować dwa razy, zmniejszyć 6 razy, wydrukować

Python 2 i 3

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

długość dokumentacji dla len różni się w zależności od wersji, więc drukuje rok dla wersji 3, jeśli jest odpowiedniej długości, w przeciwnym razie dla wersji 2.

> <>

# Odzwierciedla wskaźnik wstecz, więc uderza / po drugiej stronie tej linii, przechodzi przez przestrzeń pomiędzy elsei 2010, następnie odbija znowu uderzy „2009”, spychając 9,0,0,2 na stosie, a następnie drukowanie odwrócone .

Rozszczepienie

Rozszczepienie ma spawnery, więc możemy mieć linię na dole, którą wykonuje samodzielnie:

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

13

3 lata, 3 języki: 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   */ 

Nazwij plik date.mixal.

  1. C (1990) - Kompiluje z ostrzeżeniami i drukuje 1990do stdout.
  2. TeX (1982) - Kompiluj z tex date.mixal; drukuje 1982do pliku O.tex(zignoruj ​​wyjście DVI).
  3. MIXAL (1997) - Skompiluj za pomocą GNU Mix Development Kit mixasm date.mixali uruchom z mixvm -r date.mix; drukuje 1997na urządzeniu typu teletekstu (= stdout).

Programy TeX i MIXAL są w komentarzu w programie C; program MIXAL pojawia się później, \byewięc TeX go ignoruje. Programy C i TeX są komentarzem w programie MIXAL. Z jakiegoś powodu gccjest skłonny to zaakceptować *main.


Zapomniałem o MIXAL, +1: D
kot

13

3 lata (GolfScript, CJam, MATL), 24 23 bajty

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

To wychodzi

  • 2007 w GolfScript.

  • 2015 w CJam (wersja 0.6.5).

  • 2016 w MATL (wersja 19.2.0).

Wyjaśnienie

Golfscript

Niezdefiniowane tokeny to nuty w GolfScript . Jedyne części kodu, które faktycznie coś robią, to:

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

Wszystko od %początku jest komentarzem.

[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"

Korekta: w CJam po %zdobyciu [11 10]. To nie ma znaczenia.
aditsu 30.01.17

@aditsu Whoops! Dzięki, zredagowano
Luis Mendo

12

2 języki, Python 2.7 i Python 3.5

Python 2.7 został wydany w 2010 roku .

Python 3.5 został wydany w 2015 roku .

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

Zależy to od PEP 238, w którym operator /zmieniono z dzielenia liczb całkowitych w Pythonie 2 na dzielenie zmiennoprzecinkowe w Pythonie 3.


3
To może być zabawne wyzwanie, jeśli wiąże się z identyfikacją błędów / zmian w operatorach między wersjami
mile

1
@TuukkaX Działa dla mnie zarówno w Pythonie 2.7.12, jak i Pythonie 3.5.1 na Fedorze 24.
mile

1
Nie możesz '2010'if 3/2>1else'2015'zamiast tego zrobić ?
Qwerp-Derp,

15
Albo my matematyka:print(int(2010+1/2*10))
Jakube

2
print('2015'if 1/2else'2010')jest lepiej
Cyoce 30.09.16

12

8 lat, 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

„Każdy program może drukować do STDERR lub generować błędy czasu wykonania / błędów kompilacji i ostrzeżenia, dopóki prawidłowe wyjście jest nadal drukowane do STDOUT lub pliku.” Obecnie jedynym bezbłędnym wyświetlaniem jest rok, więc przestrzegamy tej zasady. Jednakże, jeśli chcesz napisać do pamięci zamiast wymienić Disp (date)z (date)->I.

Bibliografia:

  1. Daty wydania kalkulatora - https://epsstore.ti.com/OA_HTML/csksxvm.jsp?nSetId=74258
  2. Data wydania TI-83 + OS 1.15 - http://wikiti.brandonw.net/index.php?title=83Plus:OS:VersionDifferences#TIOS_1.15
  3. Kompatybilność kalkulatora - http://tibasicdev.wikidot.com/compatibility
  4. Data wydania TI-84 + CSE - https://www.amazon.com/Texas-Instruments-Silver-Graphing-Calculator/dp/B00AWRQKDC
  5. Data wydania TI-84 + CE - http://www.prnewswire.com/news-releases/texas-instruments-unveils-the-new-ti-84-plus-ce-300026266.html i https: // www. cemetech.net/forum/viewtopic.php?t=8870

9

5 lat, Go 1.0, 1.1, 1.4, 1.5, 1.6: 285 257 bajtów

(1.2 zostało wydane w 2013 r. Jak 1.1, 1.3 w 2014 r. Jak 1.4, a 1.7 w 2016 r. Jak 1.6.)

Nie przetestowałem tego w każdej wersji, ponieważ mogę uzyskać dostęp tylko do wersji 1.6, ale powinno to działać teoretycznie! Zmiany językowe prawdopodobnie spowodowałyby, że program się nie skompilował, więc polegałem na standardowych zmianach w bibliotece.

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)}

Nie golfił i skomentował:

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 lata, 99 bajtów / 77 znaków

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

Uwaga: Nie jestem pewien, czy lata są prawidłowe

  • Python 2.7, 2010
  • JavaScript, 1991
  • Emotinomicon, 2015
  • ><>, 2009

Zajęło mi trochę czasu, aby dowiedzieć się, jak sprawić, by Python i JS ze sobą współpracowały.

Wyjaśnienie

v=1//1;"""ustawia zmienną vna 1dzieloną przez 1w Pythonie i na 1JavaScript ( //rozpoczyna komentarz w JavaScript), i ;"""uruchamia ciąg wieloliniowy w Pythonie. Nie ;można go zastąpić nowym wierszem, ponieważ spowoduje to, że JavaScript przestanie działać.

1991/*"""jest resztą ciągu wielowierszowego. Potrzebne jest miejsce, aby> <> nie przesuwał 1się na stos. Ponieważ początek ciągu wielowierszowego był częścią komentarza w JavaScript, drukuje 1991i rozpoczyna komentarz wielowierszowy.

for i in[0]:print 2010#🔟😃😇🔟😗➕➕😨w Pythonie jest pętlą for, która iteruje listę [0]i uruchamia się print 2010. Komentarz jest po prostu kodem Emotinomicon (ignoruje wszystko, co nie jest emoji lub łańcuchem). W> <> it ( f) wypycha 15 na stos.

Pętli for nie można usunąć, ponieważ adres IP> <> spada w kolumnie 1 i pnie jest prawidłowym poleceniem w> <>. Nie można również zastąpić go ifinstrukcją, ponieważ ijest to komenda do wprowadzania danych w> <>.

""" jest początkiem ciągu wielowierszowego.

" jest częścią ciągu wielowierszowego, potrzebnego do zamknięcia ciągu, który otworzyliśmy w> <> (pierwszy znak cudzysłowu w poprzednim wierszu rozpoczął ciąg w> <>).

>9002nnnn;w> <>, zmienia kierunek IP do prawej, popycha 9, 0, 0i 2, wyjścia te jak numery i kończy program.

"""#*/w Pythonie kończy ciąg multilinii i rozpoczyna komentarz. W Javascript */powoduje , że komentarz wielowierszowy kończy się.


Wersja premiowa z Golem> <>:

5 języków, 4 lata, 118 114 bajtów / 96 92 znaków

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

Wyjaśnienie²

Adres IP zaczyna się w lewym górnym rogu, w prawo. vPozwala zejść.

fpopycha 15.

" zaczyna ciąg.

` służy do ucieczki znaków, czegoś, czego> <> nie ma.

"powinien zamknąć ciąg, ale użyliśmy `, więc nie będzie.

> część łańcucha.

" kończy ciąg.

>5102nnnn;jest rzeczywistym kodem. >czyni IP idź w prawo, 5102popycha 5, 1, 0i 2, a nnnn;drukuje numery i kończy program.


Błędy języka Python w znakach Unicode bez odpowiedniego nagłówka. ( 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)
Sriotchilism O'Zaic

@WheatWizard Zapisz plik jako UTF-8
acrolith

7

7 lat, 8 przeglądarek

Nie są to daty wydania w języku, ponieważ css tak naprawdę nie ma wydań, ale wersje przeglądarki (może to być może wersja kompilatora?)

W przypadku następujących przeglądarek drukuje nazwę przeglądarki, wersję i datę wydania i nic więcej. Drukuje to samo dla kilku późniejszych wersji (zobaczysz, że chrom jest jedną wersją późno na zrzutach ekranu, ponieważ trudno jest pobrać stare wersje chrome według numeru wersji)

Mogłem wydrukować numer wersji, którego użyłem, ale wolałem pokazać pierwszą wersję, w której wprowadzono używaną funkcję.

  • IE6
  • IE7
  • IE8
  • IE9 (nieprzetestowane, nie ma w pobliżu IE9)
  • Firefox 4
  • Firefox 3.6
  • Chrome 18
  • Chrome 21
  • Nowoczesne przeglądarki

FF3.6 FF4 Chrom19 Chrom 22 Dziwactwa IE8 Kompatybilność z 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 faktycznie ma wersje. Dostępne są wersje 1.0, 2.0, 2.1, 3.0 i 4.0. Pytanie mówiło nawet o użyciu Wikipedii lub strony językowej jako dowodu daty wydania, więc powinieneś to sprawdzić. Data pierwszego wydania: 17 grudnia 1996 r.
mbomb007

Nie ma to sensu, że nie ma implementacji żadnego z tych poziomów (nie są nawet nazywane wydaniami, ponieważ tak nie jest, powinieneś sprawdzić link, który opublikowałeś). A CSS3 i 4 nie mają nawet daty wydania, ponieważ są tworzone w locie i przechodzą między szkicami, kandydatami i rekomendacjami. Ponadto żadna przeglądarka nie implementuje określonego poziomu 100% i 0% następnego poziomu, więc najlepszą datą, jaką możesz wymyślić, jest data premiery przeglądarki.
qwazix

Wówczas wybrany język nie spełnia wymaganych specyfikacji dla tego wyzwania. Nie w sposób, w jaki próbujesz to zrobić. Język jest definiowany przez jego implementację, więc musisz wybrać przeglądarkę i pozostać przy niej, używając różnych wersji przeglądarki , a nie różnych przeglądarek. Nadal jednak pytam OP.
mbomb007

OP nie powiedział, że różne wersje liczą się jako różne języki, po prostu powiedział, aby wydrukować rok wydania używanej wersji językowej dla różnych języków . Jednak ~ połowa odpowiedzi była oparta na założeniu, że różne wersje są na tyle różne, że można je zaliczyć do języków. Jeśli python 2.5.0 i 2.5.1 są uważane za wystarczająco różne, nie mogę zrozumieć, w jaki sposób IE i Chrome nie są.
qwazix

6

3 lata, 89 bajtów

Python 2, JavaScript (ES6) i Perl

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

Pierwszy evalbędzie działał 1w Pythonie 2 oraz print=_=>console.log(1995)w JavaScript i Perlu przy użyciu funkcji dzielenia liczb całkowitych w Pythonie 2. To tworzy printfunkcję w JavaScript, a Perl tylko cicho dba o błędy składniowe i kontynuuje niezależnie.

Drugi evalpolega na interpolacji Perla przez zmienną $$(bieżący PID) w ciągu, co będzie prawdziwe, gdy zostanie porównane (za pomocą >operatora) z "0"(Python wymaga ciągu w tym porównaniu, podczas gdy Perl domyślnie konwertuje na liczbę całkowitą).

Mogłem mieć klakson w większej liczbie języków, ale chciałem mieć rozwiązanie, które nie nadużywałoby komentarzy i działało tylko w „zwykłych” językach.

Skorzystałem z tej strony w Wikipedii, aby pobrać lata użytkowania.


2

3 języki, 3 lata

Ad-hoc odpowiedź dla zabawy.

2002!~+++++++[<+++++++>-]<[.++++++++..------.[-]] 2016 !.
  • Mouse-2002 : wszystko po~jest komentarzem, a pierwsza część, którą można również napisaćC0U!!!, drukuje2002.

  • to zatwierdzenie kalkulacyjne kalkulatora oparte na stosie, które właśnie zaprojektowałem w C11 dla Programowania II, część programu przed pierwszą spacją wypisuje błąd (dozwolony w specyfikacji wyzwania) i2016 !.drukuje2016.

  • Brainfuck : drukuje 1993, jak widać w innych odpowiedziach. Ostateczne obce .jest ignorowane przez beef.

Zauważ, że wyświetlanie bieżącego stosu < stackprzez Calc z każdą niepustą linią wejściową jest częścią pytania >, a nie częścią wyniku.


Gdzie mogę dowiedzieć się o Mouse-2002? Github nie wydaje się mieć żadnych specyfikacji.
Sriotchilism O'Zaic

@WheatWizard README repozytorium zawiera łącza do oryginalnego MUSYS Dr. Grogono i do ponownego uruchomienia Davida Simpsona w 2002 r. , Które razem malują OK.
kot

2

Microsoft Excel / Arkusze Google, 22 bajtów

Anonimowa funkcja arkusza roboczego, która nie pobiera danych wejściowych i wyjściowych 1987w programie Microsoft Excel i 2006Arkuszach Google

=IfError(M(2006),1987)

0

Perl 5 i Perl 6 (2 lata)

my $a=2015;my @a=1994;print $a[0],"\n"

Pierwsze wydanie Perla 5 miało miejsce w 1994 roku

Pierwsze oficjalne wydanie Perla 6 miało miejsce w 2015 roku

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.