W tym wyzwaniu użytkownicy wykonują kolejno trzy dość proste zadania kodowania w językach programowania, które mogą być stopniowo starsze.
Pierwsza odpowiedź musi korzystać z języka programowania, który został utworzony w 2015 roku. Gdy jest co najmniej jedna odpowiedź z języka 2015, odpowiedzi mogą używać języków programowania, które zostały utworzone w 2014 roku. Podobnie, odpowiedzi, które używają języków z 2013 roku są niedozwolone dopóki nie będzie co najmniej jednej odpowiedzi z 2014 r.
Zasadniczo użycie języka programowania z roku Y jest niedozwolone, dopóki nie zostanie złożona odpowiedź w języku z roku Y + 1. Jedynym wyjątkiem jest Y = 2015.
Znalezienie roku swojego języka
Aby odpowiedzieć na to pytanie, musisz znać rok, w którym Twój język programowania został „wyprodukowany”. Jest to oczywiście pojęcie subiektywne; niektóre języki były rozwijane przez wiele lat, a wiele języków wciąż jest aktualizowanych każdego roku. Niech rokiem, w którym dany język został „wyprodukowany”, będzie pierwszy rok, w którym implementacja tego języka pojawiła się w opinii publicznej.
Na przykład Python został „wyprodukowany” w 1991 r. , Choć jego rozwój trwał od 1989 r., A wersja 1.0 została wydana dopiero w 1994 r.
Jeśli ten rok jest nadal subiektywny, użyj zdrowego rozsądku, aby wybrać najbardziej odpowiedni rok. Nie daj się wciągnąć w lekkie nieporozumienia dotyczące rocznych wyborów. Podaj link do źródła, które mówi, kiedy powstał Twój język.
Różne wersje lub standardy języka programowania (np. Python 1, 2, 3) są liczone jako ten sam język z tym samym początkowym rokiem.
Tak więc, chyba że rokiem Twojego języka jest rok 2015, możesz przesłać odpowiedź dopiero po przesłaniu odpowiedzi, której rokiem jest rok tuż przed twoim.
Jeśli istnieje już prawidłowa odpowiedź z tego samego roku co twój, możesz odpowiedzieć. Nie ma znaczenia, czy Twój język został opracowany wcześniej czy później w tym roku.
Zadania
Musisz wykonać zadania od 1 do 3. Zadanie 0 jest opcjonalne.
Zadania te zostały mniej więcej wybrane tak, aby odpowiadały trzem ważnym aspektom programowania: dostarczaniu danych wyjściowych (Zadanie 1), zapętlaniu (Zadanie 2) i rekurencji (Zadanie 3).
Zadanie 0 - Historia języka (opcjonalnie)
Napisz co najmniej akapit wyjaśniający historię wybranego języka programowania: kto go opracował, dlaczego, jak itp. Jest to szczególnie zalecane, jeśli osobiście byłeś w pobliżu, kiedy powstał język, a może nawet odegrałeś rolę w jego rozwoju. Zapraszam do relacjonowania osobistych anegdot na temat wpływu, jaki język wywarł na ciebie lub twoją pracę, czy coś w tym rodzaju.
Jeśli jesteś zbyt młody, aby wiedzieć dużo o historii Twojego języka bez wielu badań, zastanów się nad pozostawieniem notatki starszym użytkownikom, która mówi, że mogą edytować Twój post i dodać trochę historii z pierwszej ręki.
Zadanie 1 - „Witaj, świecie!” Wariant
Napisz program, który drukuje
[language name] was made in [year made]!
do standardowego obszaru wyjściowego twojego języka (standardowe dla najnowszych języków).
Na przykład, jeśli językiem byłby Python, wynikiem byłoby:
Python was made in 1991!
Zadanie 2 - ASCII art
Napisz program, który pozwala użytkownikowi wprowadzić nieparzystą liczbę całkowitą dodatnią (możesz założyć, że dane wejściowe są zawsze poprawne) i wydrukuje literę N ASCII wykonaną za pomocą znaku N
.
Jeśli wejście to 1, wyjście to:
N
Jeśli wejście wynosi 3, wyjście to:
N N
NNN
N N
Jeśli wejście wynosi 5, wyjście to:
N N
NN N
N N N
N NN
N N
Jeśli wejście wynosi 7, wyjście to:
N N
NN N
N N N
N N N
N N N
N NN
N N
Wzór trwa w ten sposób. Dane wyjściowe mogą zawierać końcowe spacje.
Zadanie 3 - GCD
Napisz program, który pozwala użytkownikowi wprowadzić dwie liczby całkowite dodatnie (możesz założyć, że dane wejściowe są zawsze prawidłowe) i wypisuje ich największy wspólny dzielnik . Jest to definiowane jako największa dodatnia liczba całkowita, która dzieli obie liczby bez pozostawiania reszty. Można go łatwo obliczyć za pomocą algorytmu euklidesowego .
Przykłady:
8
, 12
→ 4
12
, 8
→ 4
3
, 30
→ 3
5689
, 2
→ 1
234
, 876
→6
Możesz użyć wbudowanej funkcji, ale spróbuj dowiedzieć się, czy była ona dostępna w pierwszej wersji Twojego języka. Jeśli nie, spróbuj go nie używać.
Zasady
- Możesz odpowiedzieć wiele razy, ale każda nowa odpowiedź musi używać języka utworzonego co najmniej 5 lat przed językiem w Twojej ostatniej odpowiedzi. Jeśli więc odpowiedziałeś językiem 2015, nie możesz odpowiedzieć ponownie, dopóki 2010 nie będą dozwolone. Jeśli zaczniesz od odpowiedzi z 2010 r., Nie możesz uczynić odpowiedzi z 2015 r. Drugą odpowiedzią, ponieważ rok 2015 nie jest wcześniejszy niż 2010.
- Jeśli to możliwe, napisz swój kod, aby działał w pierwszej wersji Twojego języka (lub tak starej, jak to możliwe). (Nie jest to wymagane, ponieważ znalezienie starych kompilatorów / tłumaczy dla niektórych języków może być trudne.)
- Powstrzymaj się od opublikowania języka, który został już opublikowany, chyba że na opublikowanej odpowiedzi są znaczące błędy lub masz zupełnie inny sposób wykonywania zadań.
- Gra w golfa jest w porządku, ale nie jest wymagana.
- Końcowy znak nowej linii w wynikach dowolnego programu jest w porządku.
- W przypadku zadań 2 i 3 wszystkie wartości wejściowe poniżej pewnego rozsądnego maksimum, takie jak 2 16, powinny działać (co najmniej 256).
- Twój język musiał istnieć przed opublikowaniem tego pytania.
- Bardzo stare języki programowania mogą mieć różne formy danych wejściowych i wyjściowych niż te, o których dziś myślimy. To jest w porządku. Wykonuj zadania najlepiej jak potrafisz w kontekście swojego języka.
Punktacja
Wynik Twojego zgłoszenia to:
upvotes - downvotes + (2015 - languageYear) / 2
W związku z tym do liczby głosów przed każdym rokiem 2015 dodaje się 0,5, co daje przewagę starszym językom. Zgłoszenie z najwyższym wynikiem wygrywa.
Lista odpowiedzi
Poniższy fragment kodu zawiera listę wszystkich poprawnych odpowiedzi według ich roku językowego.
Musisz rozpocząć swój post od tej linii Markdown , aby upewnić się, że jest poprawnie wymieniony:
#[year] - [language name]
Na przykład:
#1991 - Python
Nazwa języka może znajdować się w linku (będzie to ten sam link na liście odpowiedzi):
#1991 - [Python](https://www.python.org/)
Odpowiedzi, które nie są zgodne z tym formatem lub mają rok, który nie jest jeszcze dozwolony, lub pochodzą od użytkownika, który odpowiedział już w ciągu ostatnich 5 lat, są oznaczone jako nieprawidłowe.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>$(function(){function e(e,r){var a="https://api.stackexchange.com/2.2/questions/48476/answers?page="+e.toString()+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter=!YOKGPOBC5Yad160RQxGLP0r4rL";$.get(a,r)}function r(e){if(e.items.forEach(function(e){var r=e.link,a=e.owner.display_name,i=e.body.match(/<h1\b[^>]*>(\d{4}) - (.*?)<\/h1>/);if(i&&i.length>=3)var h=parseInt(i[1]),u=i[2];h&&u&&n>=h&&h>=t&&(!d.hasOwnProperty(e.owner.user_id)||d[e.owner.user_id]-h>=p)?(d[e.owner.user_id]=h,h==t&&--t,o.hasOwnProperty(h)||(o[h]=[]),o[h].push({language:u,user:a,link:r,score:e.score+(n-h)/2})):s.push(' <a href="'+r+'">'+a+"</a>")}),e.has_more)runQuery(++a,r);else{for(var i=n,h=[];o.hasOwnProperty(i);){for(var u=$("<tr>").append($("<td>").text(i.toString())),l=$("<td>"),c=$("<td>"),g=$("<td>"),f=0;f<o[i].length;f++){var v=o[i][f];l.append(v.language),c.append($("<a>").html(v.user).attr("href",v.link)),g.append(v.score),f+1<o[i].length&&(l.append("<br><br>"),c.append("<br><br>"),g.append("<br><br>"))}u.append(l).append(c).append(g),h.push(u),--i}$("#answers").find("tbody").append(h),s.length>0?$("#invalid").append(s):$("#invalid").remove()}}var a=1,n=2015,t=n-1,p=5,o={},s=[],d={};e(1,r)})</script><style>html *{font-family: Helvetica, Arial, sans-serif;}table{border: 4px solid #a4a; border-collapse: collapse;}th{background-color: #a4a; color: white; padding: 8px;}td{border: 1px solid #a4a; padding: 8px;}div{font-size: 75%;}</style><table id='answers'> <tr> <th>Year</th> <th>Language</th> <th>User (answer link)</th> <th>Score</th> </tr></table><div id='invalid'><br>Invalid Answers:</div>
źródło
Odpowiedzi:
2013 - Dogescript
Dogescript to język stworzony w 2013 roku przez Zach Bruggemana. Jest niczym innym jak zamiennikiem składni dla Javascript, aby czytał jak wewnętrzne monologi memetycznego Shiba Inusa.
Witaj doze
ASCII Art
GCD
źródło
s[i]
trochę!2015 - Retina
Retina jest językiem programowania opartym na wyrażeniach regularnych, który napisałem, aby móc konkurować w wyzwaniach PPCG z odpowiedziami zawierającymi tylko wyrażenia regularne, bez zbędnego narzutu wywołania wyrażenia regularnego w jakimś języku hosta. Siatkówka jest kompletna w Turinga. Aby to udowodnić, zaimplementowałem 2-tagowy solver systemowy, a także Regułę 110 . Jest napisany w języku C #, dlatego obsługuje zarówno smak .NET (domyślnie), jak i smak ECMAScript (poprzez flagę).
Siatkówka może działać w wielu trybach, ale najbardziej odpowiedni dla obliczeń (i Turing-kompletny) to tryb Zamień. W trybie Zastąp dajesz Retinie parzystą liczbę plików źródłowych. Są one następnie sparowane, pierwsza z każdej pary jest wyrażeniem regularnym, a druga zamiennikiem. Są one następnie wykonywane w kolejności, manipulując wprowadzaniem krok po kroku. Wyrażenie regularne może być również poprzedzone konfiguracją (oddzieloną znakiem
`
). Najważniejszą opcją (która sprawia, że Retina jest kompletna) jest to+
, że Retina stosuje zamianę w pętli, aż wynik przestanie się zmieniać. W poniższych przykładach również używam;
, co tłumi dane wyjściowe na etapach pośrednich.W każdym z poniższych zgłoszeń każdy wiersz znajduje się w osobnym pliku źródłowym. (Alternatywnie możesz użyć nowego
-s
opcji i umieścić wszystkie linie w jednym pliku.) Puste pliki / linie są reprezentowane jako<empty>
. Pliki / linie zawierające pojedynczą spację są reprezentowane jako<space>
.Wyjaśnienia są dość długie, więc przeniosłem je na koniec postu.
Programy
"Witaj świecie!" Wariant
ASCII Art N
Zakłada się, że STDIN jest zakończony nową linią.
GCD
Wymaga to, aby STDIN nie był zakończony znakiem nowej linii.
Objaśnienia
"Witaj świecie!" Wariant
To jest dość trywialne. Nie pobiera danych wejściowych (tzn. Pusty ciąg znaków), niczego nie dopasowuje i zamienia na
Retina was made in 2015!
. Można również sprawić, aby działał dla dowolnych danych wejściowych, zastępując[\s\S]*
na przykład wzorzec . Spowodowałoby to slurpowanie STDIN i zastąpienie go całym wyjściem.ASCII Art N
To ma dość wiele etapów. Chodzi o to, aby przekonwertować dane wejściowe na jednoargumentowe, utworzyć blok N x N
N
s, a następnie „wykroić” dwa trójkąty. Przejdźmy przez poszczególne etapy. Pamiętaj, że;
jedynie tłumi wyjścia pośrednie, ale+
powoduje, że zamiana jest stosowana w pętli.Proste: dodaj a
#
do wejścia. Zostanie on użyty jako znacznik w konwersji do jednostkowej.To zamienia jedną cyfrę na unarną. Pobiera przekonwertowane cyfry
(\d*)
i powtarza je 10 razy. A następnie pobiera następną cyfrę i dołącza odpowiednią liczbę cyfr. Rzeczywista wartość cyfr nie ma znaczenia na tym etapie. Kiedy#
osiągnie koniec liczby, wyrażenie regularne już nie pasuje, a konwersja jest zakończona. Na przykład numer127
będzie przetwarzany jakogdzie ostatni wiersz zawiera dokładnie 127 cyfr.
Dwa proste etapy, które się tego pozbywają,
#
a następnie przekształcają wszystkie cyfryN
. Poniżej wykorzystam dane wejściowe7
jako przykład. Więc teraz mamyNastępny etap
zamienia każdy
N
z nich na cały ciąg (pamiętaj, że zawiera on końcowy znak nowej linii), a także usuwa sam końcowy znak nowej linii. W ten sposób pojedynczy wiersz zamienia się w kwadratową siatkę:Teraz górny trójkąt. Po pierwsze, zaczynamy od obrócenia litery N w prawym dolnym rogu w spację:
Lookahead zapewnia, że modyfikujemy poprawne
N
. To dajeI teraz
jest wyrażeniem regularnym, które pasuje do znaku
N
powyżej lub w lewym górnym rogu znaku spacji i zastępuje go spacją. Ponieważ zamiana się powtarza, jest to zasadniczo wypełnienie zalewowe, które zamienia trzecią liczbę z początkowej przestrzeni na więcej przestrzeni:Na koniec powtarzamy to samo z dolnym trójkątem, ale używamy innej postaci, więc już istniejące spacje nie powodują nieprawidłowego wypełnienia zalewowego:
ustawia ziarno:
Następnie
wypełnia powódź.
I w końcu
Zamienia je
S
w spacje i gotowe:GCD
GCD w unary jest w rzeczywistości bardzo trywialny z wyrażeniem regularnym. Większość z nich składa się z konwersji dziesiętnej na jednostkową i jednostkowej na dziesiętną. Można to zrobić bardziej kompaktowo, ale to nie jest golf golfowy, więc ...
Etapy te są zasadniczo takie same jak powyżej, z tym wyjątkiem, że obie liczby wejściowe są konwertowane, a wynik używa
1
s zamiastN
s (nie ma to znaczenia). Więc jeśli dane wejściowe18 24
byłyby, to by to wytworzyłoTeraz
jest całym obliczeniem GCD. Dopasowujemy wspólny dzielnik, przechwytując liczbę
1
s, a następnie stosując odwołania wsteczne, aby zapewnić, że obie liczby można zapisać, powtarzając ten ciąg (i nic więcej). Ze względu na to, jak działa backtracking w silniku wyrażeń regularnych (tj..+
Jest chciwy), zawsze da to największe wspólnego dzielnika. Ponieważ dopasowanie obejmuje cały ciąg, po prostu odpisujemy pierwszą grupę przechwytującą, aby uzyskać nasz GCD.Wreszcie konwersja jednostkowa na dziesiętną ...
Dołącz znacznik
#
, separator:
i wszystkie cyfry do ciągu. Jest to konieczne, ponieważ nie można warunkowo wytwarzać nowych znaków w zastępstwie wyrażeń regularnych. Jeśli chcesz warunkowej zamiany, musisz wyciągnąć znaki z samego łańcucha, więc umieszczamy je tam.Jest to odwrotność wcześniejszego jednoznacznego rozszerzenia. Znajdujemy największą wielokrotność 10, która pasuje do bieżącego ciągu. Następnie wybieramy kolejną cyfrę na podstawie reszty i dzielimy wielokrotność przez 10, przesuwając jednocześnie znacznik.
I na koniec po prostu krok czyszczenia, aby pozbyć się znacznika, separatora i cyfr pomocnika.
źródło
2013 - Snap !
Snap ! jest językiem opartym na Scratch , opracowanym na Uniwersytecie Berkeley. Jest to aktualizacja do Scratch zawierająca najwyższej klasy dane i niestandardowe bloki (funkcje). Podobnie jak Scratch, nie jest oparty na tekście, ale raczej oparty na wizualnych „blokach”, które łączą się ze sobą.
Snap ! , napisany w JavaScript, jest następcą BYOB, który został napisany w Squeak Smalltalk. Snap ! został wydany w wersji beta do użytku publicznego w marcu 2013 r .
Snap ! w rzeczywistości nie jest językiem ezoterycznym. Jest używany jako język programowania dla Beauty and Joy of Computing (BJC) kursu AP CS w Berkeley i innych.
Pomagałem w testowaniu i tym podobnych.
Wariant „Hello World”
ASCII Art „N”
Używa stdlib dla niektórych bloków.
Całkiem proste zapętlenie tutaj. Pobiera dane wejściowe. Następnie po prostu dodajemy to wszystko razem i mówimy (wynik dla n = 5):
Wykorzystałem tu wolność, aby użyć 2 spacji zamiast 1, ponieważ Snap! nie mówi nic w monospace.
GCD
Algorytm euklidesowy nie jest bardzo szybki, ale działa i jest dość prosty. (Przepraszam, napisałem literówkę w nazwie bloku. Teraz zamknąłem kartę bez zapisywania. Po prostu będę musiał pozostać.)
Ta definicja funkcji wygeneruje następnie ten blok:
źródło
2007 - LOLKOD
Historia języka
LOLCODE został stworzony w 2007 roku przez Adama Lindsaya, badacza z Lancaster University. Jego składnia oparta jest na memach Lolcats spopularyzowanych przez Cheezburger, Inc.
"Witaj świecie!" Wariant
ASCII Art N
Wartości są odczytywane jako ciągi (YARN) ze standardowego wejścia
GIMMEH
. Można je przekonwertować na liczbę (NUMBR), mnożąc przez 1.Wartości są drukowane do standardowego przy użyciu
VISIBLE
. Domyślnie dodawany jest nowy wiersz, ale można go wyłączyć, dodając wykrzyknik.GCD
SMOOSH
wykonuje konkatenację ciągów.źródło
IM IN YR toilet UPPIN YR butt
Ładne nazwy zmiennychx1
,x2
itp1982 - PostScript
PostScript to język do tworzenia grafiki wektorowej i drukowania.
Firma Adobe została założona w 1982 r., A ich pierwszym produktem był PostScript. Język był używany w drukarkach: polecenia są interpretowane przez drukarkę w celu utworzenia obrazu rastrowego, który jest następnie drukowany na stronie. Był to bardzo powszechny element drukarek laserowych już w latach 90. Ale drukarka jest oczywiście dość obciążona procesorem, a ponieważ procesory komputerowe stały się bardziej wydajne, sensowniejsze było rasteryzowanie na komputerze niż w drukarce. PostScript w dużej mierze odszedł od drukarek konsumenckich, chociaż nadal istnieje na wielu bardziej zaawansowanych drukarkach.
Standard, który zastąpił PostScript, to mało znany format o nazwie PDF.
Kiedy zacząłem programować, PostScript wypadł z mody, ale nauczyłem się trochę, gdy byłem na uniwersytecie, jako inny sposób tworzenia dokumentów dla TeX-a. Różniło się to od innych języków programowania, których użyłem (odwrotna notacja, stos, drukowanie na stronie zamiast konsoli), ale fajnie było odkurzyć ten stary język dla zabawy.
Ponieważ PostScript jest językiem drukowania, bardziej odpowiednie wydaje się użycie go do wydrukowania czegoś, a następnie wysłania danych wyjściowych do konsoli.
Zadanie 1
Pierwsze kilka linii tworzyło płótno do rysowania. Następnie
moveto
polecenie każe PS rysować w określonej pozycji, ishow
drukuje ciąg na stronie. Zauważ, że nawiasy oznaczają ciąg znaków w PostScript, a nie cudzysłowy.Zadanie 2
Napisałem funkcję do rysowania „ASCII art” N, ale funkcje PostScript nie mogą przyjąć argumentu. Zamiast tego wypychasz argumenty na stos, a następnie je odsuwasz. To jest
/x exch def
linia.Przykład: załóżmy, że stos
8 9 2
. Najpierw wypychamy nazwę/x
na stos, więc stos jest8 9 2 /x
.exch
Operatora zamienia dwie wartości stos, tak teraz stos jest8 9 /x 2
. Następniedef
wyświetla dwie górne wartości stosu i określa,/x
że ma wartość2
. Stos jest teraz8 9
.Kiedy zacząłem używać PostScript, uznałem to za nieco mylące. Przeczytałem o stosie jako koncepcji teoretycznej, ale po raz pierwszy użyłem go w praktyce.
Reszta funkcji to kod rysunkowy: zacznij od prawego dolnego rogu, wypełniając wiersz od lewej do prawej po przekątnej.
Zadanie 3
Ponownie użyłem formy algorytmu Euclid, ale zapomniałem, że PostScript ma wbudowany operator modulo, więc musiałem napisać własny. Okazało się to przydatnym przypomnieniem ograniczeń programowania stosowego. Moja pierwsza implementacja
modulo
była oparta na rekursji:co jest w porządku, dopóki nie spróbujesz uruchomić tego, gdy
x
jest duży iy
jest mały (np. 5689 i 2). Możesz mieć tylko do 250 elementów na stosie, więc znacznie przekraczałem limit stosu. Ups Musiałem tam wrócić do deski kreślarskiej.Sam kod GCD jest dość prosty. Ale podobnie jak funkcje nie mogą przyjmować argumentów, więc nie mają zwracanych wartości. Zamiast tego musisz przesunąć wynik na stos, gdzie ktoś inny może go później wyrzucić. Właśnie to
a
ib a gcd
linie zrobić: kiedy skończysz oceny, będą forsować wartość na stosie.Jeśli umieścisz cały kod w dokumencie i wydrukujesz go, będzie wyglądać wynik:
źródło
2009 - > <>
Zainspirowany przez Befunge,> <> (Fish) to ezoteryczny język 2D oparty na stosie, tzn. Przepływ programu może być w górę, w dół, w lewo lub w prawo. Początkowa wersja> <> zawierała wielowątkowość gdzie
[
i]
stworzony i zakończył wątki, ale dla uproszczenia Powody te instrukcje zostały zmienione w celu tworzenia i usuwania nowych stosów odpowiednio.Aktualny oficjalny tłumacz dla> <> można znaleźć tutaj . Niestety link do starego interpretera na wiki Esolang jest zepsuty.
"Witaj świecie!" Wariant
Zwróć uwagę, jak ciąg jest zapisywany wstecz -> <> technicznie nie ma ciągów, a jedynym typem danych jest dziwna mieszanka char, int i float.
"
przełącza parsowanie ciągów, wypychając każdy znak na stos, aż do"
spełnienia zamknięcia .Druga połowa kodu przesuwa następnie długość stosu
l
, sprawdza, czy wynosi zero,?!
a jeśli tak, to program się kończy;
. W przeciwnym razie wskaźnik instrukcji będzie kontynuował, wysyłając górną część stosuo
przed wykonaniembb+0.
, co teleportuje wskaźnik do pozycji(22, 0)
tuż przedl
, tworząc pętlę.ASCII Art N
Z odstępami dla przejrzystości. Możesz to wypróbować w nowym tłumaczu online tutaj i zobaczyć, jak wskaźnik instrukcji porusza się w kółko - pamiętaj tylko, aby wpisać liczbę w polu tekstowym „Początkowy stos”. Jeśli korzystasz z interpretera języka Python, użyj
-v
flagi do zainicjowania stosu, npW przypadku tego programu wstawiamy dane wejściowe
n
do rejestru za pomocą&
i wciskamy 0, które będziemy wywoływać wi
celu „iteracji”. Reszta programu to gigantyczna pętla, która wygląda następująco:Następnie powtarzamy pętlę od początku.
Strzałki
^>v<
zmieniają kierunek przebiegu programu, a lustra/\
odzwierciedlają kierunek przebiegu programu.GCD
Oto przykład, jak może wyglądać program w golfa> <>. Jeszcze raz możesz wypróbować to w tłumaczu online (wpisz dwie wartości oddzielone przecinkami w polu „Początkowy stos”, np.
111, 87
) Lub używając-v
flagi interpretera Python, np.Ten program wykorzystuje algorytm euklidesowy. Oto GIF, który przygotowałem wcześniej:
Zauważ, że> <> jest toroidalny, więc kiedy
v
wykonywana jest lewa dolna instrukcja, wskaźnik instrukcji opada w dół, owija się i pojawia się ponownie u góry.Edycja: Sprawiając, że kod działa całkowicie od prawej do lewej , @randomra zdołał zgolić trzy bajty
Chyba nie grałem wystarczająco w golfa :)
źródło
><>
to palindrom.2012 - Element
Jest to język, który wymyśliłem na początku 2012 roku jako prosty język golfa. Rozumiem przez to, że przeciążenie operatora jest bardzo małe lub wcale. Operatorzy są również prostsi i mają mniejszą liczbę niż większość współczesnych języków golfowych.
Najciekawszymi cechami tego języka są jego struktury danych. Istnieją dwa stosy i skrót, które służą do przechowywania informacji.
Stos m to główny stos, w którym mają miejsce operacje arytmetyczne i większość innych operacji. Kiedy dane są wprowadzane lub drukowane, to tam idzie lub jest pobierane.
Stos c to stos kontrolny. To tutaj zachodzi arytmetyka logiczna. Najwyższe wartości stosu c są używane przez pętle If i While jako warunek.
Hash jest miejscem, w którym przechowywane są zmienne.
;
i~
przechowywania i pobierania danych z mieszania, odpowiednio.Element jest językiem bardzo słabo wpisanym. Wykorzystuje zdolność Perla do swobodnego interpretowania liczb jako ciągów znaków i odwrotnie.
W tym momencie równie dobrze mogę dołączyć całą dokumentację dla tego języka. Można znaleźć oryginalne 2012 tłumacza, napisany w Perlu, prawo tutaj . Aktualizacja: Stworzyłem bardziej użyteczną wersję, którą możesz znaleźć tutaj .
Zadanie 1 - Wydrukuj tekst
Jedną z bardziej niezręcznych części języka jest brak ograniczników ciągów, dlatego w tym ciągu potrzebne są znaki specjalne. Na
`
końcu drukuje ciąg.Zadanie 2 - ASCII art
Tutaj będziesz świadkiem manipulacji stosami. Aby wyjaśnienie było trochę łatwiejsze do sformatowania, zastąpię nowy wiersz znakiem
L
i spacją znakiemS
.Po zrobieniu ekstremalnej gry w golfa tej odpowiedzi znalazłem 39-bajtowe rozwiązanie, chociaż jest znacznie bardziej skomplikowane.
Zadanie 3 - GCD
Jest to metoda oparta na stosie.
źródło
2012 - Julia
Historia języka
Julia została opracowana w 2012 roku przez Jeffa Bezansona, Stefana Karpińskiego i Virala Shaha, podczas gdy Jeff był studentem Massachussets Institute of Technology (MIT), pod kierunkiem profesora Alana Edelmana. Ich motywacją było pragnienie języka programowania, który byłby open source, szybki i dynamiczny (między innymi), przy jednoczesnym zachowaniu łatwości użycia w różnych aplikacjach. Produktem była Julia, świeże podejście do wysokowydajnych obliczeń naukowych.
"Witaj świecie!" Wariant
Drukowanie do STDOUT w Julii jest dość proste!
ASCII Art N
Kod jest wcięty pod kątem czytelności, ale Julia nie nakłada żadnych ograniczeń na białe znaki.
GCD
Ostatnia rzecz wymieniona w funkcji jest niejawnie zwracana.
źródło
1988 - Mathematica
A może powinienem to nazwać Wolfram Language ?
Zadanie 0
Twórcą Mathematica jest Stephen Wolfram, założyciel i dyrektor generalny Wolfram Research. Przed opracowaniem Mathematica był fizykiem. W fizyce było wiele obliczeń algebraicznych, więc został użytkownikiem Macsyma .
Wolfram uzyskał tytuł doktora w 1979 roku, kiedy miał 20 lat. Myślał, że potrzebuje lepszej CAS niż Macsyma do fizyki, więc zaczął pisać SMP („Program manipulacji symbolicznych”). Pierwsza wersja SMP została wydana w 1981 roku. SMP był poprzednikiem Mathematica. Chociaż miał on głęboki wpływ na Mathematica, żaden z jego kodów nigdy nie był używany w Mathematica.
W 1986 roku Wolfram postanowił napisać „ostateczny system obliczeniowy”. Zaczął pisać kod w 1986 r., A założył Wolfram Research w 1987 r. Ostatecznie Mathematica 1.0 została wydana 23 czerwca 1988 r.
Nie znalazłem Mathematica 1.0. W rzeczywistości Mathematica 1.0 nie miała wersji Windows ani Linux. Ale znalazłem Mathematica 2.0 na chińskiej stronie internetowej. Nadal można go uruchomić w systemie Windows XP.
Zadanie 1
Lub po prostu:
Zadanie 2
W dzisiejszej Mathematica możemy napisać:
Podobnie jak Julia i R. , jest to rozwiązanie macierzowe. W Mathematica można zdefiniować rzadką macierz za pomocą dopasowania wzorca.
Jednak
SparseArray
został wprowadzony w Mathematica 5.0, więc nie możemy go używać w Mathematica 1.0.Oto rozwiązanie, które działa w Mathematica 1.0:
Nie możemy pisać,
f[i_, 1 | i_ | n] = "N"
ponieważAlternatives
został wprowadzony w Mathematica 2.0.Zadanie 3
Możemy po prostu użyć wbudowanej funkcji:
Lub możemy użyć definicji GCD:
Lub możemy użyć LCM , chociaż częściej LCM jest obliczany z GCD:
Lub możemy użyć algorytmu euklidesowego z dopasowaniem wzorca:
Lub jako funkcja anonimowa:
Wszystkie powyższe funkcje zostały wprowadzone w Mathematica 1.0.
źródło
1999 - XSLT
World Wide Web Consortium (W3C) utworzona XSLT do przekształcania danych XML do HTML, tekst, itp Poniższe przykłady zakładają wejście jest zamknięte w
<input>..</input>
znacznikach.Zadanie 1
Ten jest prosty. Dopasowuje
input
znacznik na najwyższym poziomie i zastępuje go pożądanym wyjściem.Zadanie 2
Ten definiuje 2 szablony rekurencyjne
loop
ispaces
.loop
z parametramii
in
wygeneruje pożądaną moc wyjściowąn
, zaczynając od pozycjii
.spaces
z parametremn
wygenerujen
spacje.Zadanie 3
Dane wejściowe muszą być w
<input><num>..</num><num>..</num></input>
tagach.Ten jest tylko szablonem rekurencyjnym,
gcd
który wykorzystuje algorytm euklidesowy.źródło
2014 - CJam
CJam został stworzony przez aditsu użytkownika PPCG i został wydany około kwietnia 2014 .
"Witaj świecie!" Wariant
CJam automatycznie drukuje zawartość stosu na końcu programu
ASCII Art N
Objaśnienie kodu:
Pobiera wysokość / szerokość N jako dane wejściowe przez STDIN. Wypróbuj online tutaj
GCD
Pobiera dwie liczby jako dane wejściowe za pośrednictwem STDIN. Wypróbuj online tutaj
źródło
ri_S*0'NtW'Nta1$*\,Sf*'Nf+..e>N*
współczesnego CJam.1990 - Haskell
Haskell jest popularny (a raczej powinienem powiedzieć: najbardziej popularny) ?) Czystym językiem funkcjonalnym. Wyróżnia się z głównego nurtu dzięki nietypowemu modelowi oceny (domyślnie wszystko jest leniwe lub, technicznie rzecz biorąc, nie ścisłe) oraz systemowi opartemu na Hindley-Milner, który nawet teraz jest nadal jednym z najpotężniejszych na rynku.
Zadanie 1
Zadanie 2
Demo, wydrukuj całą nieskończoną listę (dopóki użytkownik nie przerwie lub świat się nie skończy ...)
Oczywiście możesz łatwo przejść do jednego z nich, uzyskując dostęp tylko do jednego elementu nieskończonej listy:
Zadanie 3
źródło
1972 - INTERCAL
I myślałeś, że Fortran i Cobol są dziwni. To szalone!
Zadanie 1
Nie zamierzam wyjaśniać systemu wejścia i wyjścia INTERCAL; po prostu to przeczytaj i mam nadzieję, że nie umrzesz.
Zadanie 2
Dobroć łaskawa.Trochę mi to zajęło. Numery etykiet są bałaganem i dlatego odzwierciedlają to. Nie zamierzam tego wyjaśniać, chyba że ktoś zapyta.
Zadanie 3
Ten jest odrobinę prostszy. Z powodu ... dziwności INTERCAL, musisz wprowadzić następujące liczby:
Na przykład, aby uzyskać GCD 42 i 16, wpisałbym:
Drukuje również cyfry rzymskie ... ponieważ to jest INTERCAL dla ciebie!
źródło
PLEASE GIVE UP
. Już to zrobiłem .-.1967 - APL
W 1957 r. Na Uniwersytecie Harvarda Ken Iverson zaczął opracowywać notację matematyczną do manipulacji tablicami. W latach 60. jego notacja została opracowana w języku programowania w IBM. Pierwsze częściowe wdrożenie zostało stworzone w 1963 r., A nawet zostało użyte w szkole średniej do nauczania uczniów o funkcjach transcendentalnych. Pełna, użyteczna implementacja musiała poczekać do 1965 r. Przez dwa lata była używana tylko wewnętrznie przez IBM. W 1967 r. IBM wydał publicznie interpreter APL działający na komputerze IBM 1130, który został ukończony w 1966 r. Możesz zrozumieć, jak trudno jest wybrać na niego rok, jednak myślę, że powinien to być rok 1967, ponieważ jest to pierwszy rok, pełne wdrożenie zostało udostępnione opinii publicznej. Jeśli ktoś naprawdę się nie zgadza, mógłbym to zmienić.
Kod źródłowy APL \ 360 jest dostępny online , podobnie jak emulator. Właśnie tego użyłem do przetestowania tych przykładów. Pochodzi z 1967 roku i wraz z APL \ 1130 (dla wspomnianego wyżej IBM 1130) jest mniej więcej prawdziwym oryginałem. Zgodnie z oczekiwaniami jest bardzo prymitywny. Brakuje wsparcia dla takich drobiazgów jak małe litery, każdy operator działa tylko z wbudowanymi funkcjami, a zestaw wbudowanych funkcji jest bardzo rzadki (w szczególności
∨
jest tylkoor
i robi nie podwaja się jakgcd
). Oryginalny, pełny opis jest dostępny tutaj , jednak zauważyłem, że wersja, którą posiadam, nie jest nawet kompletna w odniesieniu do tego dokumentu, brakuje⍎
między innymi.Udostępniłem programy zarówno w formacie Unicode (abyś mógł je odczytać), jak i w oryginalnym kodowaniu (abyś mógł je wyciąć i wkleić w oknie APL emulatora).
Niewiarygodnie, programy te działają poprawnie bez żadnych zmian (oprócz kodowania) we współczesnych wersjach Dyalog, NARS2000 i GNU APL. Myślę, że znalazłem sposób na napisanie przenośnej APL: udawaj, że to 1967!
Zadanie 1:
Unicode:
APL \ 360:
Zadanie 2:
Unicode:
APL \ 360:
Zadanie 3:
Rozwiązałem to w standardowy sposób rekurencyjny. Teoretycznie możesz zrobić coś sprytnego i zorientowanego na tablicę, na przykład odpowiedź J; w praktyce jednak wykorzystuje ono pamięć O (N) i szybko przytłacza sprzęt i oprogramowanie z ery Flower-Power.
Unicode:
APL \ 360:
źródło
1996 - Ocaml
Czekałem ponad dzień, aby ktoś wypełnił 1996, żebym mógł wypełnić Ruby. Dlaczego więc nie nauczyć się OCaml, wydaje się podobny do haskell ...
Witaj świecie
ASCII
Zmienne struny!
GCD
Nie
==
i infixmod
, to uroczeźródło
2005 - Preludium
Prelude jest językiem bardzo zabawne, którego kod źródłowy składa się z kilku „głosy”, które są wykonywane równolegle, a które ja naprawdę cieszyć rozwiązywania problemów . Ma to być reprezentacja ASCII jego siostrzanego języka Fuga , który faktycznie bierze pliki .midi jako kod źródłowy i koduje instrukcje znalezione w Preludium jako interwały w melodiach głosów.
Preludium jest dość minimalistyczne, a Turing zakończone (pod warunkiem, że używasz co najmniej 2 głosów). Jak powiedziałem, głosy (wiersze kodu) są wykonywane jednocześnie, kolumna po kolumnie. Każdy głos działa na swoim własnym stosie, który jest inicjowany do nieskończonej liczby zer. Prelude obsługuje następujące instrukcje:
Kilka dodatkowych uwag:
^
na górze głosu kopiuje się z głosu na dole (i odwrotnie).?
i!
w tej samej kolumnie są wykonywane od góry do dołu.?
i!
odczytu i zapisu znaków z odpowiednim kodem charakter. Jednak interpreter Pythona ma również przełącznik w kodzie, aby zamiast tego drukować same liczby. Do celów testowych faktycznie używam zmodyfikowanej wersji, która może również odczytywać liczby zamiast znaków. Ale wokół panuje zgoda, że numeryczne dane wejściowe / wyjściowe mogą być faktycznie podawane jako wartości bajtów, dlatego te modyfikacje nie są konieczne do stworzenia prawidłowych programów zajmujących się liczbami.(
i)
nie muszą być w tym samym głosie. Głos używany w tym stanie jest zawsze tym, w którym(
pojawia się. Stąd położenie pionowe nie)
ma żadnego znaczenia.(
jest wykonywana tylko raz przed uruchomieniem pętli i niezależnie od tego, czy pętla została wprowadzona. Podobnie każda instrukcja w tej samej kolumnie co a)
jest wykonywana na końcu każdej iteracji, niezależnie od tego, czy pętla zostanie zakończona po tej iteracji.Najpierw pokażę ci trzy programy bez większego komentarza. Poniżej znajdziesz obszerne wyjaśnienia.
Programy
"Witaj świecie!" Wariant
Jeśli używasz interpretera Python, upewnij się, że
NUMERIC_OUTPUT = False
.ASCII Art N
Dla ułatwienia użytkowania program ten korzysta z odczytu danych wejściowych jako liczb, ale dane wyjściowe nie mogą być liczbowe. Jeśli więc używasz zmodyfikowanego interpretera języka Python, ustaw
GCD
Najlepiej stosować to przy wszystkich numerycznych wejściach / wyjściach tj
Objaśnienia
"Witaj świecie!" Wariant
Jest to dość proste. Używam 3 głosów do sukcesywnego generowania kodów znaków dla wszystkich znaków w
Prelude was made in 2005!
. Zaczynam od obliczeń8 + 9*8 = 80
, które są kodem znakówP
:Potem głównie po prostu kopiuję poprzedni kod znaku i dodam lub odejmuję różnicę do następnego. Oto kod, ale każdy z nich
!
zastępowany jest drukowanym znakiem (oraz_
spacji i%
cyfr):Finał
55+!
drukuje znak nowej linii, tylko dlatego, że jest ładniejszy.Na marginesie, liczba głosów jest dość dowolna w przypadku tego zadania, ale 3 jest dość wygodne, ponieważ jest to największa liczba, w której każdy głos może bezpośrednio uzyskać dostęp do siebie.
ASCII Art N
Z 5 głosami jest to zdecydowanie jeden z najbardziej złożonych programów, jakie do tej pory napisałem. Głosy mają z grubsza następujące cele:
N-1
do użytku w wewnętrznej pętli.32
wygodne drukowanie spacji.78
wygodne wydrukowanieN
.Przejrzyjmy kod po części. Najpierw tworzę
32
as-4 + 9*4
i78
as6 + 9*8
:Teraz drukuję singiel
N
(ponieważ zawsze go potrzebujemy) podczas czytania danych wejściowychN
i przechowywaniaN-1
orazN-2
w dwóch pierwszych głosach:Następnie uwarunkowana jest „pętla”
N-1
. Na końcu pętli drugi głos jest zawsze redukowany do0
, a pętla wychodzi po pierwszej iteracji. Zasadniczo tylko toif(N > 1){...}
. Po pętli wypisujemy pojedynczy znak nowej linii. Podsumowując, mamy teraz następujące ramy:Wewnątrz tego warunku, najpierw
N-2
spacje i pojedynczy,N
aby ukończyć pierwszy rząd, a także przechowujemyN-1
na pierwszym głosie do przyszłego użytku:Teraz prawdziwe mięso kodu. Najpierw jest zewnętrzna pętla, która drukuje
N-1
rzędy. Dla każdego wiersza najpierw drukujemy nowy wiersz iN
. Następnie zapętlamyN-2
czasy, drukując spacje lubN
s (więcej na ten temat później). I na koniec drukujemy kolejnyN
:Wreszcie fajna część: wydruk każdego rzędu (i uzyskanie pozycji
N
prawej). W Preludium nie ma tak naprawdę if / else, więc muszę zbudować go sam, używając dwóch pętli na różnych głosach. Warunek można łatwo uzyskać, odejmując zmienną pętli wewnętrznej i zewnętrznej - otrzymujemy,0
jeśli chcemy wydrukowaćN
i coś niezerowego, jeśli chcemy wydrukować spację.Podstawową ideą if / else w Prelude jest umieszczenie pętli po odpowiedniej wartości - kodzie „if” (lub niezerowym) i natychmiastowe wyjście z niego poprzez naciśnięcie a
0
. W innym głosie zachowuje się niezerową wartość i kolejną pętlę po pętli „if”. Podczas pętli „if” umieszczasz zero na tym drugim głosie, aby zapobiec wykonaniu „else”. Istnieje pewna elastyczność, czy przesuwasz wartości zerowe na wartości niezerowe, czy po prostu odrzucasz wartość niezerową, jeśli poniżej znajduje się zero, ale jest to ogólny pomysł. Być może będziesz musiał później zrobić porządki, jeśli chcesz nadal używać odpowiedniego głosu. Oto jak wygląda kod:I to wszystko!
GCD
Jest to „tylko” iteracyjna implementacja algorytmu euklidesowego. Ale modulo w Preludium jest nieco denerwujące, głównie dlatego, że nie można łatwo sprawdzić, czy liczba jest dodatnia czy ujemna. Ten kod korzysta z implementacji signum, którą napisałem jakiś czas temu . To znaczy duża część kodu po prostu zamienia liczbę na
-1
,0
lub1
. Można to łatwo zmienić w warunek dla liczb dodatnich lub ujemnych przez dodanie lub odjęcie1
.Tym razem mamy cztery głosy. Pierwszy głos po prostu śledzi
b
i zawiera główny warunek zakończenia (tj. Pętla kończy się, gdyb
staje się0
). Drugi głos zawieraa
i za pomocą głosów trzech i czterech obliczeńa % b
, przed zamianą wyniku na poprzednib
. Wreszcie!
odbitkia
kiedyb == 0
.Najpierw spójrzmy na część signum :
Numer wejściowy
n
znajduje się na pierwszym z tych głosów (drugi głos w pełnym programie). Wynik skończy na najniższym głosie. Pozostałe dwa głosy powinny być puste (tzn. Wypełnione zerami). Zauważ, że jeślin == 0
, wówczas obie pętle są pomijane, a dolny głos nadal zawiera0
tylko to, czego chcemy.Jeśli
n
jest niezerowa, wprowadzana jest pierwsza mała pętla. Naciskamy zero, aby natychmiast z niego wyjść, umieszczamy dwie kopien
na środkowym głosie i1
na dolnym. Teraz podstawową ideą jest zwiększanie jednej z kopiin
podczas zmniejszania drugiej,n
dopóki jedna z nich nie osiągnie zera. Robiąc to,1
głos na dole cały czas zmienia znak (co można łatwo zrobić, odejmując go0
spod stosu). Jest to ustawione tak, że gdy jedna z liczb osiągnie zero, głos dolny będzie zawierał prawidłowy znak.Teraz modulo jest implementowane przez odejmowanie
b
od,a
aż wynik będzie ujemny. Kiedy tak się stanie, dodajemyb
jeszcze raz. To jest to:Zwróć uwagę na konstrukcję if / else na dole, która jest podobna do tej, której użyłem w Zadaniu 2.
źródło
2007 - Scratch
Scratch to język stworzony przez MIT do celów edukacyjnych. Jestem bardzo zaangażowany w to od 5 lat; więcej na ten temat później.
Wszystkie z nich można obejrzeć tutaj .
Jestem teraz bardzo rzucony i później wyjaśnię fragmenty. Mam jednak nadzieję, że są one bardzo oczywiste.
Zadanie 1
Zadanie 2
Zadanie 3
źródło
1972 - C
Wszyscy wiemy o C, prawda? C został stworzony w Bell Labs wraz z Uniksem. Unix został napisany głównie w C. Wszystkie współczesne pochodne uniksowe są nadal w dużej mierze napisane w C. Składnia C. wpłynęła na wiele języków programowania. Jest to prawdopodobnie najstarszy język programowania, który wciąż jest szeroko stosowany w nowych projektach.
Sam C jest potomkiem B, który, mam nadzieję, również znajdzie się na tej liście. Nie było języka programowania „A”: B jest odmianą BCPL, która z kolei jest uproszczoną wersją CPL. Żaden z tych języków nigdy nie był bardzo popularny. Jednak BCPL był językiem, w którym napisano pierwszy program „Hello World”. Innym interesującym faktem jest to, że B miał zarówno komentarze, jak
/* */
i//
C, ale C je zrzucił//
. Zostały one później ponownie wprowadzone do C ze standardem C99.Programy C tutaj testowano z kompilatorem Unix V5 C od 1974 roku. Był to najstarszy kompilator C, jaki udało mi się znaleźć i zacząć działać, a programy te nie będą się kompilować na nowoczesnym kompilatorze C. (Jedną z wprowadzonych zmian jest to, że operatory mutacji takie jak
+=
kiedyś były pisane=+
).#include <
...>
jeszcze nie istniał. Żadna ze standardowych bibliotek nie zrobiła tego. Musiałem napisać własnyatoi
. Przejrzałem część kodu źródłowego V5, aby dowiedzieć się, które rzeczy są dozwolone, a które nie. Wersja, której użyłem, była pierwszą, która zawierałastruct
s, ale ponieważ ich nie użyłem, a składnia nie zmieniła się aż do V7 (jako K&R C), może to również działać z wcześniejszymi wersjami.Zrobiłem co w mojej mocy, aby napisać kod w tym samym stylu, w jakim wykorzystuje kod źródłowy V5. (Ale to nie jest strasznie konsekwentne.)
Zajrzyj tutaj, aby znaleźć łącza do emulatora Unix V5 i instrukcje dotyczące uruchamiania go na nowoczesnym komputerze.
Zadanie 1
Zadanie 2
Zadanie 3
źródło
cat > file.c
. (Jak zwykle, naciśnij Ctrl-D). Również C zmieniła się mniej niż można by pomyśleć: jeśli zamienić=*
i=+
watoi
funkcji dla nowoczesnych ekwiwalentów*=
oraz+=
, nowoczesny GCC skompiluje je dobrze, a oni biegają też. Nawet prawie żadnych ostrzeżeń.2009 - Idris
Idris jest zależnym od typu, czystym językiem funkcjonalnym, który kładzie nacisk na faktyczną użyteczność w rzeczywistych zastosowaniach, oprócz oferowania niezwykle rygorystycznych możliwości sprawdzania, które można osiągnąć przy użyciu typów zależnych.
Zadanie 1
Zadanie 2
Ten nie jest programem, ale tylko funkcją (a dokładniej wartością zależną ), wytwarzającą pożądaną literę N jako tablicę dwuwymiarową.
Zadanie 3
Zauważ, że musiałem wybrać nazwę,
gcd'
ponieważ jestgcd
ona już zdefiniowana w preludium Idris.źródło
:
i::
, i zmienił_
sięZ
.Z
jest tak naprawdę konstruktorem0 : Nat
. Podkreślenie jest używane w Idris, tak jak w Haskell.:)
2014 - Pyth
Ponieważ mamy CJam, równie dobrze możemy mieć Pyth dla kompletności :)
Pyth jest językiem golfowym autorstwa @isaacg, który kompiluje się do Pythona. Jest to godne uwagi ze względu na proceduralność i stosowanie notacji przedrostkowej. Pyth po raz pierwszy pojawił się około czerwca 2014 r .
"Witaj świecie!" Wariant
Zwróć uwagę na brak zamykającego cytatu, który jest opcjonalny, jeśli program Pyth kończy się ciągiem.
ASCII Art N
Wypróbuj online . Odpowiednikiem Pythona jest:
Lub rozwinięte (pierwsza i trzecia linia są niejawne):
GCD
Ten program wykorzystuje algorytm euklidesowy i przyjmuje dwie liczby oddzielone znakiem nowej linii. Wypróbuj online .
i.uQ
jest jeszcze krótszy, jeśli użyjemy wbudowanego GCD. Jest to równoważneprint(gcd(*eval(input())))
(przyjmowanie dwóch liczb oddzielonych przecinkami jako danych wejściowych).źródło
1964 - Dartmouth BASIC
PODSTAWOWY to rodzina uniwersalnych języków programowania wysokiego poziomu, których filozofia projektowania podkreśla łatwość użycia. W 1964 roku John G. Kemeny i Thomas E. Kurtz zaprojektowali oryginalny język BASIC w Dartmouth College w New Hampshire. Chcieli umożliwić uczniom z dziedzin innych niż przedmioty ścisłe i matematyczne korzystanie z komputerów.
Patrzę na ten podręcznik BASIC z 1964 roku i na ten emulator Darthmouth Time Sharing System, na którym działał. Serwer nadal działa, ale niestety rejestracja konta wydaje się niemożliwa. Na razie te programy powinny teoretycznie działać:
Zadanie 1
Zadanie 2
Wyprowadzanie czegoś takiego:
Zwróć uwagę, jak dane wejściowe są wpisywane jako część programu (
70 DATA 5
);READ
sposób wskazówki na górze pobiera dane stamtąd. Nie ma konkatenacji łańcuchów, ale rozdział 3.1 instrukcji opisuje, jak to zrobićPRINT
wyniki są zapisywane w tabelarycznych „strefach” na wyjściu.Zadanie 3
Wolna wersja algorytmu Euclid:
Wyjście:
źródło
2010 - WTFZOMFG
WTFZOMFG to ezoteryczne języki oparte na Brainfuck. Został stworzony przez Jaya Songdahla w 2010 roku. „WTFZOMFG” to skrót od „What's That Function? Zen Optimized Malicious File Gophers!” .
Oto kompilator dla systemów * nix .
Zadanie 1
Zadanie 2
Wyjaśnienie:
Przepraszam. Nie jestem dobry w pisaniu wyjaśnień.
Zadanie 3
Algorytm euklidesowy. WTFZOMFG nie ma polecenia mod, więc muszę użyć
d
(podzielić),m
(pomnożyć) is
(odjąć).źródło
2009 - Idź
Go to język programowania opracowany przez Google. Rozwój rozpoczął się w 2007 roku, ale Go ogłoszono w listopadzie 2009 roku.
Go to język pisany statycznie, na który wpływa C, co podkreśla zwięzłość, prostotę i bezpieczeństwo.
Zadanie 1:
Pierwszy wiersz deklaruje pakiet kodu. Nawet prosty przykład drukowania jednej linii musi być częścią jednego pakietu. Plik wykonywalny jest zawsze wywoływany
main
.Zadanie 2:
Go ma dość zwięzłą deklarację zmiennej (
i := 0
jest taka sama jakvar i int = 0
), a kompilator określa typ. Jest to zwykle funkcja bardziej powszechna w dynamicznych językach. Za pomocą tej krótkiej notacji bardzo łatwo jest również przypisywać funkcje do zmiennych (f := func(x int) int {/* Code */}
) i tworzyć Zamknięcia.Zadanie 3:
Tutaj możesz zobaczyć
a, b = b, a%b
składnię, co jest naprawdę miłe. Nie znam dokładnej nazwy, ale w Pythonie nazywa się to rozpakowywaniem krotek. W ten sam sposób możesz zwrócić wiele wartości z funkcji (func f() (int, string) { return 42, "Hallo"}
).Kolejną rzeczą występującą w tym kodzie jest pętla. Pętla for jest jedyną pętlą w Go. Pętle while i pętle do-while nie istnieją. Ale możesz łatwo utworzyć odpowiednik dla pętli while
for condition {}
lub nieskończonejfor {}
.źródło
1991 - Python
Historia języka
Pod koniec lat osiemdziesiątych Guido van Rossum zaczął wymyślać Python jako hobby. Jego nazwa pochodzi od Flying Circus Monty Pythona, brytyjskiego programu telewizyjnego, którego Rossum jest fanem. Pierwsza implementacja Pythona rozpoczęła się w 1989 roku i została wydana w 1991 roku. Z biegiem lat zyskała na popularności, stając się językiem wyboru wielu wprowadzających kursów informatyki.
"Witaj świecie!" Wariant
Zwróć uwagę na nawiasy wokół danych wejściowych do
print
. Chociaż ta składnia działa w języku Python 2, zazwyczaj w języku Python 2 można pominąć te nawiasy. Są one jednak wymagane w Pythonie 3. Zgodnie z sugestią Zacha Gatesa, w nawiasach są używane wszystkie elementy, aby zapewnić, że przedstawiony tu kod będzie działał w różnych wersjach.ASCII Art N
Funkcje są definiowane za pomocą
def
. Łączenie łańcuchów odbywa się za pomocą+
i powtarzania łańcuchów za pomocą*
.GCD
Zauważ, że Python wymaga strukturalnej białej spacji.
źródło
1968 - Algol 68
Algol 68 został zdefiniowany przez grupę roboczą IFIP 2.1 jako następca Algolu 60.
Jest to język zorientowany na wyrażenie, w którym wszystko ma wartość. Jest również ortogonalny, w którym możesz użyć dowolnego konstruktu w jakikolwiek sposób. Oznacza to, że wyrażenia mogą znajdować się na przykład w RHS i LHS zadania.
Wszystkie struktury kontrolne mają zarówno formę skróconą, jak i długą z użyciem wyrażeń. Pozwala także na definicje operatorów.
Cele języka są cytowane jako:
Programy te zostały przetestowane za pomocą interpretera Algol 68 Genie , który jest kompletną implementacją języka.
Niektóre funkcje, które mogą być inne dla współczesnych programistów, to to, że puste instrukcje nie są dozwolone. Nie możesz po prostu dodawać
;
wszędzie. Musisz użyć tegoSKIP
oświadczenia, jeśli chcesz jawnie nic nie mieć. Umożliwiło to również bardzo łatwe kodowanie współbieżnych programów. Algol 68 również w szczególności użył słów kluczowych wstecz jako terminatorów, takich jak esac , od , fi itp.Język miał reprezentację używaną do pisania kodu, który używał wielu czcionek reprezentujących pogrubione słowa kluczowe , a identyfikatory pisano kursywą . W tym czasie i prawdopodobnie nadal żaden kompilator nie wdrożył tej funkcji projektu. Język pozwalał na kilka różnych konkretnych reprezentacji programów wykorzystujących tryby stropowania . Umożliwiło to przygotowanie programów przy użyciu ograniczonych zestawów znaków, takich jak te, które można znaleźć na komputerach w latach 60. XX wieku. Rozważ krótki fragment programu, który byłby reprezentowany jako:
Można to przygotować dla kompilatora w trybie głównego stropowania, ponieważ:
W trybie stropowania kropek byłoby to:
W przypadku trybu stropowania byłoby to:
Mam wielką sympatię do tego języka, ponieważ pracowałem nad jedną z implementacji kompilatora, a także programowałem w nim wyłącznie przez wiele lat.
Zadanie 1
Należy tutaj zwrócić uwagę na podwójne nawiasy. To dlatego, że drukuj jest funkcją, która przyjmuje pojedynczy argument, który jest tablicą zmiennej długości unii wszystkich typów. Wewnętrzny nawias to konstruktor tablicy. W ten sposób obsługiwany jest polimorfizm w tym silnie typowanym języku.
W przypadku trybu stropowania:
Zadanie 2
W przypadku trybu stropowania:
Zadanie 3
W przypadku trybu stropowania:
źródło
1962 - SNOBOL
„StriNg Oriented and symBOlic Language”. Najpierw najwyraźniej nazywał się Symbolicznym Tłumaczem Wyrażeń, „SEXI”, który następnie musiał zostać zmieniony, aby zapobiec zarumienieniu się nerdów z lat 60-tych podczas przesyłania pracy. Prawdziwa historia.
Był to jeden z pierwszych języków, który mógł natywnie radzić sobie z łańcuchami i wzorcami. Rzeczywiście, pierwsza wersja SNOBOL miała ciąg jako jedyny typ danych. Matematyka została następnie wykonana przez parsowanie. Pierwszej implementacji dokonano na IBM 7090. Wydaje się, że już dawno minęła, przynajmniej nie mogłem jej znaleźć. Znalazłem oryginalny artykuł opisujący go, a także interpreter SNOBOL3 w Javie, który można uruchomić na nowoczesnym komputerze .
Pierwszy SNOBOL miał prawie tylko dopasowywanie wzorców i podstawową arytmetykę. SNOBOL 3 następnie dodał funkcje i zmienił I / O, ale poza tym wydaje się, że pozostał kompatybilny wstecz. SNOBOL 4 zmienił składnię i stamtąd rozwinął się w Icon , który utrzymuje dopasowanie wzorca, ale poza tym wygląda prawie jak „normalny” język programowania.
Programy, które napisałem, używają tylko funkcji opisanych w oryginalnym artykule, więc powinny działać z oryginalnym SNOBOL, z wyjątkiem I / O, które zrobiłem w stylu SNOBOL3, aby mógł je uruchomić interpreter Java. Z pracy wynika, że różnica polega na tym, że SNOBOL1 używa dopasowania wzorca ze specjalną
SYS
zmienną, podczas gdy SNOBOL3 używa zmiennych wejściowych i wyjściowych:SYS .READ *DATA*
DATA = SYSPPT
SYS .PRINT 'A STRING' AND VARIABLES
SYSPOT = 'A STRING' AND VARIABLES
Dokonanie tych zamian powinno dać ci „prawdziwy” SNOBOL 1. Oczywiście, nie możesz go uruchomić.
Zadanie 1
Zadanie 2
Pokazuje matematykę, obsługę łańcuchów i kontrolę przepływu. SNOBOL3 ma przydatne funkcje, takie jak
EQ
sprawdzanie równości; oryginalny SNOBOL nie, więc ich nie użyłem.Zadanie 3
Najpierw nudny. Jedyną rzeczą wartą uwagi jest sprawdzenie mniejsze niż, pokazujące dokładnie, jak naprawdę był zorientowany na łańcuch SNOBOL:
(B - A) '-'
oznacza „czy wynik BA zawiera minus?”. SNOBOL3 też możeLE(B,A)
, ale SNOBOL 1 nie mógł (przynajmniej papier o tym nie wspomina).Oczywiście, jeśli masz język oparty całkowicie na ciągach i dopasowywaniu wzorców, szkoda byłoby nie korzystać z dopasowywania i zastępowania wzorców. Tak oto jest jeden z tych GCD opartych na jednostkach, w tym procedury konwersji do i z jedności.
źródło
2012 - TypeScript
TypeScript to darmowy i otwarty język programowania opracowany i obsługiwany przez Microsoft.
Głównym celem jest: dowolna przeglądarka. Dowolny host. Dowolny system operacyjny. Otwarte źródło. Został wydany w dniu październiku 2012 roku
Witam TypeScript
ASCII Art
GCD
wypróbuj online i zrzuć go z ekranu .
źródło
2011 - Dart
Dart to język programowania Open Source opracowany przez Google, który został opracowany jako zamiennik Javascript (chociaż kompiluje się w javascript). Zostało to zaprezentowane przez Google w 2011 roku podczas konferencji GOTO.
"Witaj świecie!" Wariant:
ASCII Art N:
Metoda Bruteforce działa na 0 (n²), ale tak naprawdę nie powinna mieć znaczenia, chyba że użyjesz gigantycznej liczby.
GCD
prosta metoda Euclid przeniesiona z Snap! przykład powyżej.
źródło
2010 - Rdza
Rust to skompilowany język programowania ogólnego przeznaczenia, opracowany przez Mozilla Research, z wieloma paradygmatami. Został zaprojektowany jako „bezpieczny, współbieżny, praktyczny język”, obsługujący style czysto funkcjonalne, współbieżne z aktorem, imperatywno-proceduralne i obiektowe. Wikipedia
Zadanie 1
Zadanie 2
Wyjaśnienie:
dba o drukowanie tylko w pionie (po lewej i po prawej
|
) i po przekątnej (\
)Zadanie 3
prosta implementacja algorytmu Euclidean
źródło
2015 - Muffin MC
Muffin MC jest kompletnym, zabawnym (ale poważnym), funkcjonalnym i minimalistycznym makro-językiem Turinga napisanym przez Francka Porchera ( http://franckys.com ) w połowie lutego 2015 r. Z konieczności jako (szybkie) narzędzie do wzmocnienia arkusz kalkulacyjny, który ma być używany jako jedyny kontroler front-end do pilotowania i kierowania wszystkimi operacjami związanymi z zapasami związanymi z witryną handlową opartą na Prestashop dla nowej marki modowej Tahitian: Mutiny Tahiti ( http://mutinytahiti.com - wkrótce będzie uruchomiona).
Muffin MC jest skrótem dla MU maleńkim F unctional F lexible W linii M acro C ommand języku.
Aby spełnić nasze wymagania, podstawowe funkcje Muffin MC zostały zaprojektowane wokół elastycznych i wydajnych wbudowanych konstrukcji semantycznych pierwszej klasy, takich jak iteratory , leniwa ocena , funkcje wielofunkcyjne , łańcuch znaków .
Muffin MC wywodzi się z (pragmatycznego) programowania funkcjonalnego, FLisp i Perl. W pełni obsługuje rekurencyjność (bez jakiejkolwiek optymalizacji), jest dynamicznie typowany i dynamicznie skalowany (płytkie wiązanie). Oferuje swoim użytkownikom tylko jedną strukturę danych, oprócz podstawowych typów danych atomów (atomów, łańcuchów, cyfr): list!
Semantyka listy Muffin MC (rodzaj) zapożycza się na semantyce power-set , czyli:
Aby się z tym pogodzić, pomocne mogą być:
Dlatego dostęp do pustego elementu listy daje pustą listę, a nie błąd! Rzeczywiście, Muffin MC stara się rzucić jak najmniej błędów, rozszerzając w ten sposób semantykę wielu tradycyjnych operacji.
Zadanie 1
#(...)
to makropolecenie Muffin MC do zastosowania funkcji na nieudokumentowanej liście argumentów, tutaj wbudowana funkcjasay
zapożyczona z Perla.#(say 1 2 3 ...)
jest funkcjonalnie identyczny zmap {say $_} (1,2,3,...)
Zadanie 2
Zdefiniuj funkcję
ascii-art()
:Ascii-art()
najkrótsza forma robocza (88 bajtów):=(var val...)
to makropolecenie Muffin MC, aby zdefiniować zmienną lub przypisać ją ponownie.$(var)
to makropolecenie Muffin MC umożliwiające dostęp do wartości zmiennej. Naturalnie akceptuje formularz,$(v1 v2 ...)
aby uzyskać dostęp do wielu zmiennych jednocześnie.=(* var1 val1 var2 val2 ...)
jest rozszerzeniem makropolecenia Muffin MC=(...)
do obsługi równoległych przypisań.Zmienne
_1, _2
... mają dynamiczny zasięg (płytki mechanizm wiązania) i są automatycznie ustawiane tak, aby wiązały się z argumentami funkcji. Zapożyczone z Perl5, zmienne systemowe#
(liczba argumentów) i@
(lista argumentów) są również ustawiane automatycznie.Funkcje są po prostu zmiennymi powiązanymi z dowolną liczbą instrukcji Muffin MC .
To ciekawe rozwiązanie wynika z połączenia dwóch naturalnych funkcji Muffin MC :
Makropolecenie Muffin MC
I(...)
, aby zdefiniować iteratory cykliczne, później używane z formą funkcjonalną#(my-iterator want-number-of-values)
,Muffin MC ciąg produktem konstrukt przedłużenie naturalnego zmiennej interpolacji, które ze względu na dowolny łańcuch
"F1 F2 F3..."
, gdzie F i S są albo muffin MC literałami łańcuch lub muffin MC makro polecenia (czyli formy użytkowe) spowoduje tyle napisów jako podane przez kardynał produktu (F1) x kardynał (F2) x ...Na przykład, biorąc pod uwagę zmienną xa, która przechowuje 2 wartości, mówi aib, oraz y inna zmienna, która przechowuje 3 wartości, mówi 1 2 3, wówczas ocena ciągu
"x=$(x) y=$(y))"
da 6 różnych wartości, a mianowicie w tej kolejności:Jest to jedna z najbardziej pożądanych funkcji projektu MUTINY, dla której zaprojektowano Muffin MC .
Uruchom !
Jak to działa
Nasz algorytm opiera się na następujących elementach:
Biorąc pod uwagę wezwanie do ascii-art (n), {n = 2p + 1 | p liczba całkowita, p> = 0}, sztuka do wygenerowania zawiera n ciągów n znaków, z których dwa, najmniejsze i prawe, są stałe i zawsze takie same: „N”. Pozwala to zmniejszyć problem związany z produkcją tylko środkowych strun. Na przykład, biorąc pod uwagę n = 5, chcielibyśmy wyprodukować 5 następujących środkowych łańcuchów, z których każdy składa się z n-2 znaków (dla lepszej wizualizacji zastąpiliśmy spację znakiem „_”):
Takie środkowe struny można łatwo wytworzyć przez cykliczne przewijanie sekwencji 4 elementów
('_' '_' '_' 'N')
w 5 grupach po 3; biorąc pod uwagę n, wejście funkcji, taka sekwencja składa się z n-2 znaków'_'
, po których następuje znak'N'
. Cyklowanie tej sekwencji nie wymaga niczego innego, jak tylko osadzenie sekwencji w wbudowanym iteratorze Muffin MCI(sequence)
(iterator, który cyklicznie przewija się przez początkową sekwencję wartości).Następnie produkujemy po prostu środkowe łańcuchy o długości n-2, prosząc naszego iteratora o podanie nam kolejnych wartości n-2 (n - 2 znaków), które są łączone razem w celu uzyskania oczekiwanego środkowego łańcucha.
N środkowych łańcuchów powstaje przez powtórzenie n razy powyższego procesu, przy użyciu mapy do zebrania n wyników (n łańcuchów n-2 znaków).
Używamy kolejny potężny Muffin MC konstrukt wbudowany, a mianowicie produkt ciąg , aby wyprodukować ostateczny ciągi n:
"N#(map...)N"
.I to wszystko !
Zadanie 3
Zdefiniuj funkcję
gcd()
:gcd()
„s prawdziwa forma najkrótszy (37 bajtów - 2 bajty zyskują dzięki Rodolvertice)Uruchom !
daje 9.
Otóż to.
Dziękujemy za fajną grę i prawdopodobnie za zainteresowanie. Język jest dostępny dla każdego, kto chciałby się nim bawić, używać go, a nawet rozszerzać. Po prostu poproś o to, a ja chętnie je wyślę.
Twoje zdrowie
Franck
PS. Obecna implementacja Muffin MC znajduje się w Perl5. Kod źródłowy zawiera około 2000 wierszy współczesnego Perla, w tym komentarze, i jest dostarczany wraz z pakietem testowym bez regresji, który świetnie nadaje się do nauki praktycznych konstrukcji Muffin MC i semantyki.
źródło