Prezentacja języków


507

Notatki

  • Wątek jest otwarty i odblokowany tylko dlatego, że społeczność postanowiła zrobić wyjątek . Proszę nie używać tego pytania jako dowód, że można zadawać pytania podobne tutaj. Proszę nie tworzyć dodatkowych pytania.

  • To nie jest już , ani długości fragmentów nie są ograniczone przez liczbę głosów. Jeśli znasz ten wątek wcześniej, zapoznaj się ze zmianami.

Wątek ten poświęcony jest pokazaniu interesujących, użytecznych, niejasnych i / lub unikalnych funkcji, które oferują Twoje ulubione języki programowania. Nie jest to ani wyzwanie, ani konkurs, ale wysiłek współpracy mający na celu zaprezentowanie jak największej liczby języków programowania.

Jak to działa

  • Wszystkie odpowiedzi powinny zawierać nazwę języka programowania u góry postu, poprzedzoną znakiem #.

  • Odpowiedzi mogą zawierać jeden (i tylko jeden) faktoid, tj. Kilka zdań bez kodu opisującego język.

  • Oprócz faktoidu odpowiedzi powinny składać się z fragmentów kodu, które mogą (ale nie muszą) być programami lub funkcjami.

  • Fragmenty nie muszą być powiązane. Fragmenty, które są zbyt powiązane, mogą być zbędne.

  • Ponieważ nie jest to konkurs, wszystkie języki programowania są mile widziane, ilekroć zostały utworzone.

  • Odpowiedzi, które zawierają więcej niż kilka fragmentów kodu, powinny używać fragmentu kodu stosu, aby zwinąć wszystko oprócz faktoidu i jednego fragmentu kodu .

  • O ile to możliwe, powinna być tylko jedna odpowiedź na język programowania. To jest wiki społeczności, więc dodaj fragmenty odpowiedzi do dowolnej odpowiedzi, nawet jeśli nie stworzyłeś jej samodzielnie. Istnieje fragment kodu stosu do kompresji postów , który powinien złagodzić efekt limitu 30 000 znaków.

Odpowiedzi sprzed tych wytycznych powinny być edytowane. Pomóż zaktualizować je w razie potrzeby.

Aktualne odpowiedzi, posortowane alfabetycznie według nazwy języka

$.ajax({type:"GET",url:"https://api.stackexchange.com/2.2/questions/44680/answers?site=codegolf&filter=withbody",success:function(data){for(var i=0;i<data.items.length;i++){var temp=document.createElement('p');temp.innerHTML = data.items[i].body.split("\n")[0];$('#list').append('<li><a href="/a/' + data.items[i].answer_id + '">' + temp.innerText || temp.textContent + '</a>');}}})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><base href="http://codegolf.stackexchange.com"><ul id="list"></ul>

Odpowiedzi:


414

Matematyka

Możesz przeczytać ten tekst od dołu do góry, ponieważ jest to kolejność, w jakiej został napisany, a niektóre objaśnienia odnoszą się do poprzednich fragmentów lub zakładają wyjaśnienia z dalszej części.

Lista rośnie dość długo. Zacząłem usuwać mniej interesujące fragmenty i zacznę teraz pomijać fragmenty. Zobacz historię zmian, aby uzyskać pełną listę urywków do 41. Niektóre prawdziwe klejnoty znajdziesz w urywkach 81 , 64 , 44 , 23 , 19 , 12 i 8 .

Długość 143 i 144 fragmentów

Wreszcie ... Czekałem na to od dłuższego czasu (i grałem w golfa tak długo, więc nie muszę czekać dłużej). Wspomniałem wcześniej, że możesz także równania numeryczne i że możesz także rozwiązywać równania różniczkowe. Chciałem pokazać nietrywialny przykład tego.

Rozważ podwójne wahadło na pręcie (tj. Wahadło przymocowane do drugiego). Każdy pręt ma długość jednostkową, a każdy z dwóch obciążników wahadłowych ma masę jednostkową. Użyłem również grawitacji jednostkowej, aby skrócić równanie. Poniższy fragment ze 143 znakami rozwiązuje równania Lagrange'a ruchu dla takiego układu (pod względem kątów wahadła i momentu pędu). Pochodność można znaleźć w tym pliku PDF , chociaż jest to dość proste ćwiczenie, jeśli znasz mechanikę Lagrangian.

Jest to dość nieczytelne, ponieważ musiałem dużo grać w golfa:

d@t@t;NDSolve[{#''@t==-#4#2''[t]Cos@d-##3#2'@t^2Sin@d-Sin@#@t&@@@{{θ,φ,1,.5},{φ,θ,-1,1}},θ@0==2,φ@0==1,θ'@t==φ'@t==0/.t->0},{θ,φ},{t,0,60}]

Co ciekawe, Mathematica natychmiast wyświetla miniaturowy wykres tego, jak z grubsza wyglądają rozwiązania:

wprowadź opis zdjęcia tutaj

Okej, ale to trochę kiepskie. Chcemy wiedzieć, jak naprawdę wygląda ruch wahadła. Oto fragment 144 znaków, który animuje wahadło, jednocześnie śledząc trajektorię dolnego wahadła:

Graphics@{Line@{{0,0},p=θ~(h={Sin@#@#2,-Cos@#@#2}&)~t,p+φ~h~t},White,{0,0}~Circle~2.2}~Show~ParametricPlot[θ~h~u+φ~h~u,{u,0,t}]~Animate~{t,0,60}

Powstała animacja wygląda następująco:

wprowadź opis zdjęcia tutaj

Musiałem lekko oszukiwać: jeśli kreślisz dalej t = 30, ParametricPlotdomyślnie używa zbyt mało punktów, a linia staje się dość poszarpana. Ale większość interesującej dynamiki dzieje się po tym czasie, więc skorzystałem z opcji, PlotPoints -> 200aby druga połowa animacji wyglądała płynniej. To nic zasadniczo innego, a pierwsza połowa i tak wyglądałaby nie do odróżnienia.

Myślę, że to będzie mój ostatni fragment, chyba że wymyślę coś naprawdę oszałamiającego. Mam nadzieję, że ci się podobało!

Długość 100 fragmentu kodu

GeoGraphics[{GeoStyling[Opacity[0.5]], NightHemisphere[]}, GeoBackground -> GeoStyling["ReliefMap"]]

Myślałem o fajnych Geofunkcjach dla fragmentu 100, ale ostatecznie znalazłem coś naprawdę fajnego na Tweet-a-Program , który po prostu musiałem ukraść. Powyższe generuje bardzo ładnie wyglądającą mapę słoneczną Ziemi na bieżącą godzinę i dzień, nakładając półprzezroczysty kształt półkuli nocnej na mapę reliefową:

wprowadź opis zdjęcia tutaj

Długość 81 fragmentu kodu

CellularAutomaton[{{0,2,3,If[0<Count[#,1,2]<3,1,3]}[[#[[2,2]]+1]]&,{},{1,1}},i,n]

Obiecuję, że to ostatni automat komórkowy. Ale właśnie tam jest Wireworld w 81 postaciach. Tym razem nie zakodowałem reguły w jednym numerze, a) ponieważ uważam, że byłoby to absurdalnie ogromne (nie zawracałem sobie głowy jej rozszyfrowaniem) ib) pokazać ci kolejne użycie CellularAutomaton. Tym razem reguła jest po prostu określona jako czysta funkcja, która odbiera sąsiedztwo komórek i zwraca nową wartość komórki. Jest to znacznie bardziej wykonalne podejście do automatów komórkowych z więcej niż 2 kolorami / stanami.

W każdym razie ustawiłem przykład z Wikipedii w i(dwa zegary generujące sygnały i bramkę XOR) i pozwól mi działać przez około 50 kroków:

wprowadź opis zdjęcia tutaj

Jeśli jesteś zainteresowany, rzeczywisty wykres i animacja mogą być fragmentem 77:

ListAnimate[ArrayPlot[#,ColorRules->{0->Black,1->Blue,2->Red,3->Yellow}]&/@w]

Długość 69 fragmentu kodu

DSolve[r^2*R''[r]+2r*R'[r]-R[r]==0&&(R[r]==1&&R'[r]==2/.r->1),R[r],r]

Wróć do czegoś pożytecznego. Oprócz normalnych układów równań Mathematica może także rozwiązywać układy równań różniczkowych. Powyższe jest technicznie tylko jednym równaniem różniczkowym z warunkami brzegowymi, ale można je również dostarczyć jako układ trzech równań. Podobne do funkcji integrujących DSolvejest dla dokładnych rozwiązań NDSolve, ale rozwiąże system numerycznie. Powyższe daje jedno rozwiązanie

{{R[r] -> 1/2 r^(-(1/2) - Sqrt[5]/2) (1 - Sqrt[5] + r^Sqrt[5] + Sqrt[5] r^Sqrt[5])}}

które można teraz łatwo wykorzystać do dalszych obliczeń lub wydrukować.

Długość 64 fragmentu kodu

CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},i,n]

Obiecałem ci więcej CellularAutomatonmagii! Ten fragment oblicza grę życia Conwaya z warunkiem wstępnym idla nkroków i daje wynik dla wszystkich pośrednich kroków czasowych.

Kilka słów o parametrach: 2to liczba stanów komórek. {{2,2,2},{2,1,2},{2,2,2}}podaje wagi 9 komórek w sąsiedztwie 3x3. Zapewnia to, że samą komórkę można odróżnić od sumy 8 sąsiadów. {1,1}mówi, że reguła CA zależy od komórek oddalonych o 1 krok w dowolnym kierunku. Wreszcie, 224rzeczywista reguła aktualizacji jest zakodowana w jednym numerze. Ustalenie tej liczby może być nieco trudne, ale w dokumentacji znajduje się dość przydatny samouczek . W przypadku bardziej skomplikowanych automatów pojedynczy numer go nie wycina (ponieważ liczba byłaby ogromna). Może dotrzemy tam jutro! ;)

W każdym razie, jeśli wprowadzę losową siatkę do ii 200 ni wyślę wynik za pomocą animacji ArrayPlot, możemy zobaczyć, że to naprawdę działa:

wprowadź opis zdjęcia tutaj

Długość 59 fragmentu kodu

SphericalPlot3D[Re[Sin[θ]Cos[θ]Exp[2I*φ]],{θ,0,π},{φ,0,2π}]

Pamiętasz działkę polarną z fragmentu 26? Możemy zrobić to samo w 3D! (W rzeczywistości istnieją dwie funkcje: RevolutionPlot3Ddla biegunów cylindrycznych i SphericalPlot3Ddla biegunów sferycznych.) Podobnie jak Graphics3Dwszystkie trójwymiarowe wykresy są automatycznie obracane w Mathematica, więc nie musisz się martwić o dobry kąt kamery z góry. Powyższy wykres przedstawia coś w rodzaju sferycznej harmonicznej (choć nie do końca) i wygląda następująco:

wprowadź opis zdjęcia tutaj

Długość 52 fragmentu kodu

Manipulate[Plot[x^2a+x*b,{x,-3,3}],{a,.1,3},{b,0,3}]

Ten jest całkiem fajny. Manipulatepobiera dowolne wyrażenie, parametryzuje je za pomocą szeregu zmiennych, a następnie daje widżet, w którym można dostosować parametry i zobaczyć na żywo, jak zmienia się to wyrażenie. Jako wyrażenie zwykle masz jakiś wątek. Jest to szczególnie przydatne, jeśli używasz Mathematica na wykładach, aby zademonstrować, jak rodziny rozwiązań reagują na modyfikację parametrów. Powyższe pokazuje, w jaki sposób ai bwspółczynniki skalują i przesuwają parabolę:

wprowadź opis zdjęcia tutaj

Długość 48 fragmentu kodu

Import["http://www.google.com/doodles","Images"]

Importjest dość potężnym poleceniem. Służy zarówno do ładowania plików z dysku, jak iz Internetu. Zna całkiem wiele różnych formatów plików, a dla niektórych z nich (np. Stron HTML) może od razu wyodrębnić dane. Powyższe pobiera wszystkie obrazy ze strony doodle Google.

Długość 45 fragmentu kodu

EdgeDetect@ExampleData@{"TestImage","Splash"}

Czas na przetwarzanie obrazu. Mathematica zawiera całą masę przykładowych danych, w tym obrazy (takie jak Lena), tekstury, modele 3D i fragmenty audio. Najpierw ładujemy jeden z tych:

wprowadź opis zdjęcia tutaj

Chcesz wykryć krawędzie? Jest to pojedyncze wywołanie funkcji:

wprowadź opis zdjęcia tutaj

Długość 44 fragmentu kodu

ArrayPlot@CellularAutomaton[110,{{1},0},100]

Wreszcie mam wystarczająco dużo znaków, aby użyć, CellularAutomatona także renderować wynik. :) O ile mi wiadomo, CellularAutomatonjest to jedyna funkcja w Mathematica związana z CA. Ale Stephen Wolfram wydaje się być facetem numer jeden, jeśli chodzi o automaty komórkowe, więc ta funkcja jest niezwykle potężna. Powyższe pokazuje prawie najprostsze użycie. To symuluje automat komórkowy 1D na 100 kroków - i faktycznie przywróci stan automatu na każdym z tych kroków, więc wynik jest dwuwymiarowy. Reguła jest pierwszym parametrem, który można albo szczegółowo określić za pomocą list, albo po prostu zakodować w jednym numerze. W tym przykładzie wybrałem dość znaną, pełną regułę Turinga, zasadę 110 . {{1},0}określa warunek początkowy: pojedynczy1przed tłem zer. Może pokażę więcej funkcji CellularAutomatonw przyszłości, gdy będę mieć więcej dostępnych postaci: może symulować CA w większych wymiarach, używając większych dzielnic i więcej niż dwóch stanów.

ArrayPlotto kolejne ładne narzędzie do drukowania, które po prostu drukuje listę 2D jako siatkę jednolitych kolorów wskazującą ich wartość. W najprostszym przypadku 0jest odwzorowany na biały i 1czarny. Wynik fragmentu jest następujący:

wprowadź opis zdjęcia tutaj

Długość 43 fragmentu kodu

HighlightGraph[graph,FindVertexCover@graph]

Minęło trochę czasu, odkąd wspomniałem o wykresach. Istnieje wiele typowych problemów teoretycznych związanych z grafem wbudowanych w Mathematica, a także ładne narzędzia do wizualizacji. Powyższe, dla danego graph, znajdzie minimalną osłonę wierzchołka wykresu, a następnie wyrenderuje wykres z tymi wierzchołkami o wysokim poziomie. Na przykład, jeśli graphjest PetersenGraph[7,2]się od fragmentu 18, otrzymujemy:

wprowadź opis zdjęcia tutaj

Długość fragmentu 42

Animate[Plot[Sin[t-x],{x,0,10}], {t,0,10}]

Animowanie rzeczy w Mathematica jest dość proste (i nawet nie muszą to być obrazy). Po prostu nadajesz mu wyrażenie do oceny dla każdej klatki i wiązkę parametrów, które powinny się różnić w poszczególnych klatkach. Powyższe po prostu animuje fabułę poruszającej się fali sinusoidalnej. Animacja będzie wyglądać podobnie do następującego GIF:

wprowadź opis zdjęcia tutaj

Długość 40 fragmentu kodu

SortBy[PlanetData[#, "EscapeVelocity"]&]

SortByrobi to, czego oczekujesz: sortuje listę na podstawie wartości uzyskanych przez mapowanie danej funkcji na każdy element listy. Ale czekaj, powyższe połączenie w ogóle nie zawiera listy. Od Mathematica 10 jest obsługiwane curry lub częściowe zastosowanie niektórych funkcji. To nie jest funkcja językowa, jak w bardziej purystycznych językach funkcjonalnych, ale jest po prostu implementowana ręcznie dla całej gamy funkcji, gdzie jest to często przydatne. Oznacza to, że powyższy fragment kodu zwraca nową funkcję, która pobiera tylko listę, a następnie sortuje według podanej funkcji. Może to być bardzo przydatne, jeśli ta kolejność sortowania będzie używana częściej w całym kodzie.

I tak, jest jeszcze jedna fajna *Datafunkcja - powyższe posortuje nazwy planet według prędkości ucieczki planet .

Długość 39 fragmentu kodu

f[1]=1
f[2]=1
f[n_]:=f[n]=f[n-1]+f[n-2]

Obiecałem usprawnić działanie Fibonacciego. Ten fragment pokazuje, jak prosta jest matematyka w zapamiętywaniu. Pamiętaj, że wszystko, co zostało zmienione, jest dodatkowym f[n]=w trzecim wierszu. Więc kiedy fzostanie wezwany do nowej wartości (powiedzmy f[3]), wtedy f[3]=f[3-1]+f[3-2]zostanie oceniony. To oblicza f[2]+f[1], a następnie przypisuje go do f[3](z =, nie z :=!) I ostatecznie zwraca wartość dla naszego pierwszego wywołania. Wywołanie tej funkcji dodaje nową definicję tej wartości, która jest oczywiście bardziej szczegółowa niż ogólna reguła - i dlatego będzie używana dla wszystkich przyszłych wywołań fz tą wartością.

Pamiętasz, że inna funkcja Fibonacciego zajęła 4 sekundy dla 30 wartości? Potrzeba 3 sekund na 300 000 wartości.

Długość 37 fragmentu kodu

l//.{a___,x_,b___,x_,c___}:>{a,x,b,c}

W ostatnim fragmencie wspomniałem o wzorach. Są one najczęściej używane w regułach , które (między innymi) mogą być używane do modyfikowania struktur pasujących do określonego wzorca. Spójrzmy więc na ten fragment kodu.

{a___,x_,b___,x_,c___}:>{a,x,b,c}jest regułą. x_z pojedynczym podkreśleniem jest wzorzec, który odnosi się do pojedynczej arbitralnej wartości (która sama może być listą lub podobną). a___to wzorzec sekwencji (patrz także fragment 15), który odnosi się do sekwencji 0 lub więcej wartości. Zauważ, że używam x_dwa razy, co oznacza, że ​​te dwie części listy muszą mieć tę samą wartość. Więc ten wzór pasuje do każdej listy, która zawiera wartość dwukrotnie, wywołuje ten element xi wywołuje trzy sekwencje wokół tych dwóch elementów a, bi c. To jest zastąpione przez {a,x,b,c}- to znaczy sekunda xjest upuszczana.

Teraz //.zastosuje regułę, dopóki wzór nie będzie już pasował. Tak więc powyższy fragment usuwa wszystkie duplikaty z listy l. Jest jednak nieco potężniejszy: //.stosuje regułę na wszystkich poziomach. Więc jeśli lsam zawiera listy (do dowolnej głębokości), duplikaty z tych list podrzędnych również zostaną usunięte.

Długość 36 fragmentu kodu

f[1]=1
f[2]=1
f[n_]:=f[n-1] + f[n-2]

Czas na nowe funkcje językowe! Mathematica ma kilka fajnych rzeczy na temat definiowania funkcji. Na początek możesz podać wiele definicji funkcji dla tej samej nazwy, dla różnych liczb lub typów argumentów. Za pomocą wzorców można opisać, jakiego rodzaju argumentów dotyczy definicja. Ponadto można nawet dodawać definicje pojedynczych wartości. Mathematica wybierze następnie najbardziej odpowiednią definicję dla dowolnego wywołania funkcji i pozostawi niezdefiniowane wywołania bez oceny. Pozwala to (między innymi) na pisanie funkcji rekurencyjnych w znacznie bardziej naturalny sposób niż przy użyciu Ifprzełącznika w przypadku podstawowym.

Kolejną rzeczą, na którą należy zwrócić uwagę w powyższym fragmencie, jest to, że używam zarówno =i :=. Różnica polega na tym, że prawa strona =jest oceniana tylko raz, w momencie definicji, natomiast :=jest ponownie oceniana za każdym razem, gdy odwołuje się do lewej strony. W rzeczywistości :=działa nawet podczas przypisywania zmiennych, które wówczas będą miały wartość dynamiczną.

Więc powyższe, oczywiście, jest tylko funkcją Fibonacciego. I w tym bardzo nieefektywny. Obliczenie pierwszych 30 liczb zajmuje około 4 sekund na moim komputerze. Wkrótce przekonamy się, jak możemy poprawić wydajność bez konieczności pozbycia się definicji rekurencyjnej.

Długość fragmentu 35

StreamPlot[{x^2,y},{x,0,3},{y,0,3}]

Bardzo schludny wykres, który generuje usprawnienia pola wektorowego 2D. Jest to podobne do normalnego wykresu wektorowego, ponieważ każda strzałka jest styczna do pola wektorowego. Jednak strzałki nie są umieszczane na stałej siatce, ale łączone w linie (linie usprawnienia). Znaczenie tych linii polega na tym, że wskazują one trajektorię cząstki (powiedzmy w płynie), jeśli pole wektorowe było polem prędkości. Powyższe dane wejściowe wyglądają następująco:

wprowadź opis zdjęcia tutaj

Długość 34 fragmentu kodu

Solve[a*x^4+b*x^3+c*x^2+d*x==0, x]

Mathematica może także rozwiązywać równania (lub układy równań, ale w tej chwili mamy tylko tyle znaków). Wynik, jak zwykle, będzie symboliczny.

{
  {x -> 0}, 
  {x -> -(b/(3 a)) - (2^(1/3) (-b^2 + 3 a c))/(3 a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) + (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)/(3 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 + I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 - I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/(6 2^(1/3) a)}, 
  {x -> -(b/(3 a)) + ((1 - I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 + I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/( 6 2^(1/3) a)}
}

Pamiętaj, że rozwiązania podano jako reguły , które prawdopodobnie pokażę bardziej szczegółowo w przyszłym fragmencie.

Długość 33 fragmentu kodu

Dynamic@EdgeDetect@CurrentImage[]

Dzięki benwaffle za ten pomysł. CurrentImage[]ładuje bieżący obraz z kamery internetowej. EdgeDetectzamienia obraz w obraz czarno-biały, w którym krawędzie są białe, a reszta jest czarna (patrz przykładowy fragment 45). Pochodzi prawdziwa zabawa, dzięki Dynamicktórej samo wyrażenie jest aktualizowane. Rezultatem tego będzie faktycznie przesyłanie strumieniowe zdjęć z kamery internetowej i wykrywanie na nich krawędzi na żywo.

Długość 32 fragmentu kodu

NumberLinePlot[x^2<2^x,{x,-2,5}]

Raczej niezwykły rodzaj fabuły. Może wykreślić wiele różnych rzeczy wzdłuż linii liczbowej, takich jak punkty i interwały. Możesz również nadać mu warunek, który pokaże region, w którym warunek ten jest spełniony:

wprowadź opis zdjęcia tutaj

Strzałka wskazuje, że region kontynuuje do nieskończoności. Białe kółka wskazują, że są to otwarte interwały (punkty końcowe nie są częścią interwału). W przypadku zamkniętych końców koła zostaną wypełnione.

Długość 28 fragmentu kodu

Graphics3D@{Sphere[],Cone[]}

Czas na trochę grafiki 3D. Powyższe renderuje narzuconą kulę i stożek z domyślnymi parametrami, które wyglądają jak kryształowa kula:

wprowadź opis zdjęcia tutaj

W Mathematica możesz kliknąć i przeciągnąć ten mały widget, aby go obrócić.

Długość 27 fragmentu kodu

CountryData["ITA", "Shape"]

Więcej *Data! CountryDatajest dość szalony. Uzyskiwanie kształtu kraju nie jest nawet wierzchołkiem góry lodowej. Jest tyle danych o krajach, że prawdopodobnie możesz napisać całą książkę o tej funkcji. Jak ... jest FemaleLiteracyFraction. Możesz również wyszukiwać te dane dla różnych punktów w czasie. Pełna lista znajduje się w odnośniku.

wprowadź opis zdjęcia tutaj

Długość 26 fragmentu kodu

PolarPlot[Sin[5θ],{θ,0,π}]

Czas na ciekawszą fabułę. PolarPlotto po prostu wykres we współrzędnych biegunowych. Zamiast określać y dla danego x, podajesz promień r dla danego kąta θ:

wprowadź opis zdjęcia tutaj

Długość 25 fragmentu kodu

{{1,5},{2,3},{7,4}}.{8,9}

W końcu mamy wystarczającą liczbę postaci do niektórych matematyki wektorowej. Powyższe oblicza mnożenie macierzy macierzy 2x3 i wektora rzędu 2:

{53, 43, 92}

Długość 23 fragmentu kodu

Rotate[Rectangle, Pi/2]

Heh Hehe Myślisz, że wiesz, co to robi. Ale ty nie. Rectanglesama w sobie jest tylko nazwaną funkcją. Aby otrzymać obiekt reprezentujący prostokąt, musisz wywołać tę funkcję z pewnymi parametrami. Jak myślisz, co się stanie, gdy spróbujesz się obracać Rectangle? To:

wprowadź opis zdjęcia tutaj

Długość 22 fragmentu kodu

30~ElementData~"Color"

Kolejna z wbudowanych *Datafunkcji. Tak, w przypadku pierwiastków chemicznych nie otrzymuje się takich rzeczy, jak ich liczba atomowa, temperatura topnienia i nazwa ... w rzeczywistości można uzyskać ich kolor w temperaturze pokojowej. Powyżej daje kolor cynku:

SlateGray

Długość 21 fragmentu kodu

Integrate[E^(-x^2),x]

Jakiś czas temu mieliśmy różnicowanie. Czas na integrację. Matematyka obsługuje zarówno całki określone, jak i nieokreślone. W szczególności Integrateda ci dokładne rozwiązanie i może poradzić sobie z mnóstwem standardowych całek i technik integracji (dla wyników numerycznych, jest NIntegrate). Jeśli znasz swój rachunek różniczkowy, zauważysz, że powyższa całka Gaussa w rzeczywistości nie ma zamkniętej postaci całki nieoznaczonej ... chyba że weźmiesz pod uwagę funkcję błędu zamkniętą postać, to znaczy. Zwraca Mathematica:

1/2 Sqrt[π] Erf[x]

Długość 20 fragmentu kodu

"Sun"~StarData~"Age"

Powrót do wbudowanych danych . Muszą być co najmniej dwa tuziny *Datafunkcji dla wszystkiego, co możesz wymyślić. Każdy z nich pobiera identyfikator rzeczy, dla której chcesz dane, oraz właściwość (lub listę właściwości) do pobrania. Powyższe jest tylko jednym z najkrótszych, jakie można uzyskać Sun, Stari Agewszystko jest dość krótkie, ponieważ nie mogłem się doczekać, aby pokazać tę funkcję.

O tak, i czy wspominałem, że Mathematica (od 9) obsługuje ilości za pomocą jednostek? (Więcej na ten temat później.) Powyższe dotyczy:

Quantity[4.57*10^9, "Years"]

który jest wyświetlany jako

wprowadź opis zdjęcia tutaj

Długość 19 fragmentu kodu

MandelbrotSetPlot[]

Tak ... bardzo przydatna funkcja ... Używam jej cały czas. (Czasami ich chęć wspierania wszystkiego, co jest możliwe do obliczenia, może pójść trochę dalej ...)

Grafika matematyczna

W ich obronie funkcja jest nieco bardziej przydatna: możesz nadać jej określoną sekcję wykresu, którą chcesz narysować.

Długość 18 fragmentu kodu

PetersenGraph[7,2]

Od wersji Mathematica 8 rozumie, czym jest wykres, dlatego jest wyposażony w różnego rodzaju funkcje związane z teorią grafów. I to nie Mathematica, gdyby nie zawierała mnóstwa wbudowanych. Powyżej generuje dane wykresu dla uogólnionego wykresu Petersena . Tworzy rzeczywistą strukturę danych, którą można manipulować, ale Mathematica natychmiast wyświetla dane wykresu ... graficznie:

Grafika matematyczna

Długość 17 fragmentu kodu

Plot[x^x,{x,0,2}]

W końcu wystarczająca liczba postaci, aby wykonać spisek. Powyższe jest naprawdę najprostszym przykładem jednowymiarowej fabuły. Obiecuję później pokazać fajniejsze wątki

Grafika matematyczna

Długość 15 fragmentu kodu

{##4,#,#2,#3}&

To pokazuje dwie bardziej zaawansowane funkcje (a także przydatne podczas gry w golfa). Całość jest czystą, nienazwaną funkcją , porównywalną ze lambdas w Pythonie lub Procs w Ruby. Funkcja czysta jest po prostu zakończona przez &. Ten operator ma bardzo niski priorytet, dlatego zwykle zawiera prawie wszystko, co z niego zostało. Argumenty funkcji czystej są przywoływane #, czasem następują po nich inne rzeczy. Pierwszy argument to #lub #1, drugi to #2i tak dalej.

Inną funkcją jest Sequences. Zasadniczo są to ikony w innych językach. Sekwencja jest jak lista bez otaczającej ją listy - to dosłownie tylko sekwencja wartości, która może być używana w listach, argumentach funkcyjnych itp. ##W szczególności jest sekwencją wszystkich argumentów czysto funkcyjnych. ##2jest sekwencją wszystkich argumentów rozpoczynających się od drugiego. Więc jeśli nazwaliśmy powyższą funkcję fi nazwaliśmy ją tak

f[1,2,3,4,5]

Dostalibyśmy

{4,5,1,2,3}

więc funkcja obraca argumenty wejściowe o 3 elementy w lewo. Zauważ, że ##4o których mowa 4,5zostały spłaszczone na liście.

Długość 12 fragmentu kodu

D[x^y^x,x,y]

Częściowe zróżnicowanie. Drozróżni pierwsze wyrażenie sukcesywnie w stosunku do innych argumentów, dając wynik symboliczny. Tak więc powyższe to d² (x ^ y ^ x) / dxdy (gdzie d s są częściowe), co Mathematica podaje jako

x^y^x (y^(-1 + x) + y^(-1 + x) Log[x] + x y^(-1 + x) Log[x] Log[y]) + 
  x^(1 + y^x) y^(-1 + x) Log[x] (y^x/x + y^x Log[x] Log[y])

Długość 9 fragmentu kodu

Exp[I*Pi]

Nie wykonaliśmy jeszcze żadnej złożonej arytmetyki! Jak widać, w πrzeczywistości był to po prostu pseudonim Pi. W każdym razie powyższe faktycznie poprawnie zwróci liczbę całkowitą -1 .

Długość 8 fragmentu kodu

Sunset[]

Tak. Mów o zwariowanych wbudowaniach. Bez parametrów, które faktycznie dają Ci obiekt daty i godziny następnego zachodu słońca w Twojej bieżącej lokalizacji. Pobiera również parametry dla innych dat, innych lokalizacji itp. Oto, jak teraz wygląda dla mnie:

wprowadź opis zdjęcia tutaj

Długość 7 fragmentu kodu

9!/43!!

Ten fragment pokazuje kilka fajnych rzeczy.

Mathematica ma nie tylko wbudowany operator silni !, ale ma także podwójną silnię !!(która zwielokrotnia każdą inną liczbę od ndo do 1). Ponadto obsługuje liczby całkowite o dowolnej dokładności. 43!!Będą oceniane dokładnie, aż do ostatniej cyfry. Ponadto liczby wymierne również zostaną dokładnie ocenione. Ponieważ zarówno licznik, jak i mianownik są liczbami całkowitymi, Mathematica zredukuje ułamki tak dalece, jak to możliwe, a następnie przedstawi ci

128/198893132162463319205625

Oczywiście można używać liczb zmiennoprzecinkowych w dowolnym momencie, ale ogólnie, jeśli dane wejściowe nie zawierają liczb zmiennoprzecinkowych, wynik będzie dokładny.

Długość 4 fragmentu kodu

Here

Najwyższy czas zacząć od bogactwa szalonych wbudowań Mathematiki. Powyższe robi to, co mówi na puszce i (dla mnie) ocenia GeoPosition[{51.51, -0.09}].

Długość 3 fragmentu kodu

x-x

Aby tylko pokazać oryginalny Factoid : powyższe działa, nawet jeśli xnie zostało jeszcze zdefiniowane i faktycznie spowoduje 0w takim przypadku.

Długość 2 fragmentu kodu

3x

Mnożenie przez zestawienie! Jeśli jasne jest, że identyfikator się kończy, a zaczyna inny, nie potrzebujesz *ani nawet białych znaków, aby je pomnożyć. Działa to z prawie wszystkim, w tym ciągami i zmiennymi, które nie mają jeszcze wartości. Bardzo wygodny do gry w golfa. ;)

Długość 1 fragmentu

π

Zgadnij co, to Pi. I w rzeczywistości nie jest to przybliżona reprezentacja liczb zmiennoprzecinkowych, to jest dokładnie Pi - więc wszelkiego rodzaju złożone i trygonometryczne funkcje, w których są używane, dają dokładne wyniki, jeśli są znane.

Faktoid

Mathematica może wykonywać manipulacje symboliczne, więc zmienne nie potrzebują wartości, aby z nimi pracować.


19
Snippet 23 jest dość ciekawy. Gdybyś tak zrobił, Translate[Scale[Rectangle, 80], {0, 0, 100}]czy wielkie słowo Rectanglepojawiłoby się unoszące się przed monitorem?
Calvin's Hobbies

53
@ Calvin'sHobby Po prostu spróbowałem ... wybrałem niefortunne zprzesunięcie ... uderzyło mnie prosto w twarz.
Martin Ender

45
Oficjalna strona internetowa Mathematica powinna bezwzględnie link do tego.
Caridorc

7
@ durron597 Utrzymując go jako symbol i uświadamiając wszystkie funkcje trygonometryczne i złożone, co zrobić z π.
Martin Ender

16
Kiedy zobaczyłem, że legendarny Martin Büttner opublikował odpowiedź Mathematica, wiedziałem, że nie mam szans na wygranie konkursu popularności. Pan jest prawdziwym czarodziejem.
Alex A.

187

Niesławny język programowania Szekspira

Shakespeare Programming Language został stworzony w 2001 roku przez dwóch szwedzkich studentów, Karla Hasselströma i Jona Åslunda i łączy, jak głoszą autorzy ,

wyrazistość języka BASIC z przyjaznym dla użytkownika językiem asemblera.

Odpowiedzi idą od góry do dołu. Często zdarza się, że odnoszę się do starszych lub wcześniejszych fragmentów.

( link dla mnie: edycja )

Faktoid:

Kod Szekspira przypomina, jak można się spodziewać, sztukę Szekspira, w której zmienne są znakami w grze, a ich wartość zmienia się, gdy są „obrażane” lub wychwalane.

Długość 1 fragmentu:

I

Kod Szekspira jest podzielony na Akty, a same akty są podzielone na Sceny, dla przyczynowych „przeskoków”. Zdefiniowanie aktu jako Act Ioznacza, że ​​będzie to na przykład pierwszy fragment kodu, który należy uruchomić - ale nie tylko.

Długość fragmentu 2:

as

Używany w porównaniu dwóch „znaków”.

Długość fragmentu 3:

day

Do tej pory możesz mieć wrażenie, że SPL jest bardzo gadatliwy. I dziwne. I jeszcze nic nie widziałeś. day, w SPL wynosi 1. Wszystkie rzeczowniki „pozytywne” i „neutralne” są uważane za 1, podobnie jak wszystkie „negatywne” -1.

Długość 4 fragmentu:

rich

Co to jest rich? Przymiotnik. W języku SPL przymiotniki określają wartość rzeczownika, do którego są przyłączone, mnożąc je przez dwa. Zobacz implementację we fragmencie 14.

Długość fragmentu 5:

Act I

Implementacja pierwszego fragmentu kodu. Wszystkie akty mogą otrzymać tytuł, np. Act I: Hamlet must die!Ponieważ wszystko po cyfrze rzymskiej jest ignorowane przez analizator składni.

Długość fragmentu 6:

better

Każdy język ma określone warunki, a SPL nie jest wyjątkiem. Tyle że, ponieważ jest to język o długiej składni (a czy wspominałem, że jest dziwny?), Jego instrukcje warunkowe będą długie. Zapytanie Ofelii o Juliet Am I better than you?jest jak if (Ophelia > Juliet)w większości „normalnych” języków. I oczywiście możesz zapytać na odwrót: Am I not better than you?jest odpowiednikiem if (Ophelia < Juliet). I już możesz zgadnąć, jak to =jest przetłumaczone na SPL: as good as- użycie fragmentu kodu 2.

Jednak good/betternie jest to jedyny sposób dokonywania porównań w tym języku shakesperian, możesz użyć dowolnego przymiotnika. Obowiązuje tu również ta sama zasada fragmentu 3, przy czym przymiotniki „pozytywne” mają wartość >, a „przeczące” - przymiotniki <.

Długość 7 fragmentu:

Juliet:

To jest wywołanie zmiennej; potem jego / jej instrukcje / deklaracje / cokolwiek nastąpi.

Ograniczeniem SPL jest to, że ma ograniczoną liczbę zmiennych: Romeo, Juliet, Hamlet, Ofelia, MacBeth i tak dalej to kilka przykładów „znaków”, które pojawią się w programie Shakesperian.

Długość 8 fragmentu:

[Exeunt]

[Exeunt]jest umieszczany, gdy wszystkie „postacie” opuszczają „scenę”. Mam nadzieję, że będę mógł później rozwinąć nieco więcej na temat interakcji między postaciami. Zasadniczo jest to ostatnia instrukcja dowolnego programu SPL, chociaż [Exeunt]nie jest to konkretnie „znak” terminala języka. Aby zobaczyć inny przykład, zobacz fragment 27.

Długość 9 fragmentu:

as bad as

Dziewięć znaków, które mają reprezentować zwykły =- za pomocą fragmentu 2. Czy wspomniałem, że SPL jest dziwny? Przykłady: patrz fragment 30. (i tak, istnieje więcej niż jeden sposób na wydruk)

Długość 10 fragmentu:

difference

Fantazyjny sposób przedstawiania -, odejmowanie. Możesz wykonywać operacje matematyczne na SPL, chociaż prawdopodobnie będziesz potrzebować całego dnia, aby wszystko było dobrze.

Faktoid (ponieważ udało mi się jakoś dotrzeć do dziesięciu fragmentów kodu, zróbmy sobie przerwę i zróbmy kolejny faktoid na temat SPL)

Jeśli chcesz uruchomić swój kod shakesperian w pełnej krasie, jest ta strona - wciąż go testuję, ponieważ odkryłem go jeszcze pięć minut temu. Istnieje również sposób na przetłumaczenie go do C przy użyciu translatora .

Inną witryną do uruchamiania kodu SPL jest ta, która działa poprzez wewnętrzne tłumaczenie kodu SPL na inny ezoteryczny język: Oracle PL / SQL.

Długość fragmentu 11:

[Exit Romeo]

Tak! Nareszcie mogę mówić o interakcji między postaciami! Aby zmienić jego wartość lub wejść w interakcję z innymi, „postać” musi być na scenie - wchodzić z nią [Enter Romeo]. Jeśli znak jest adresowany, ale nie jest obecny, występuje błąd czasu wykonywania i program zatrzymuje się. Ponieważ w SPL wartość zmiennych jest ustalana na podstawie nazw, którymi są chwaleni - lub obrażani - przez inne postacie na scenie. Wydaje mi się, że powinienem podać przykład, aby wyjaśnić pewne zamieszanie, które może powodować moje kiepskie wyjaśnienie, ale być może najlepiej jest opóźnić kilka krótkich fragmentów.

Długość 12 fragmentu:

Remember me.

SPL jest dość „podstawowy”, w porządku - ale ma stosy! Kiedy na przykład Romeo mówi Juliet, aby „go zapamiętała”, tak naprawdę mówi swojej ukochanej, aby zwiększyła wartość Romea na jej stosie. Podawanie wartości odbywa się za pomocą Recall your happy childhood!, lub Recall your love for me, w zasadzie, dowolnego zdania, które zaczyna się od Recall- reszta jest po prostu artystycznym motorem, jak fragment 22

Długość 13 fragmentu kodu

Let us return

Szekspirowski sposób posiadania goto. I tu przydają się Akty i Sceny. Jeśli Romeo powie Juliet we shall return to Act II(tak, znowu, istnieje wiele sposobów na napisanie tego), program przejdzie do tej konkretnej części kodu. Widać to również obok instrukcji warunkowych.

Długość 14 fragmentu kodu

my little pony

Tak, to była seria z lat 80. Tutaj jest 2*1. Dlaczego? Ponieważ a ponyjest (nieco) pozytywnym rzeczownikiem i littlejest przymiotnikiem. Pamiętając fragmenty 3 i 4, mamy little = "2 *"i pony = "1".

Długość 15 fragmentu kodu

Speak thy mind!

W programie SPL zobaczysz to (lub Speak your mind!to samo) bardzo często . Zasadniczo wyprowadza wartość każdego „znaku” w postaci cyfr, liter lub czegokolwiek innego, w zależności od zestawu znaków używanego przez komputer. Jest też to, Open your mind.co robi prawie to samo, aczkolwiek wypisywane jest tylko w postaci liczbowej.

Długość 16 fragmentu kodu

You are nothing!

Kiedy ktoś powie ci to w prawdziwym życiu, poczujesz się przygnębiony. Kiedy Ofelia mówi o tym Hamletowi w programowaniu szekspirowskim, Hamlet czuje się bezwartościowy. Co to znaczy? Że Hamlet = 0.

Długość 17 fragmentu kodu

Ophelia, a wench.

W scenariuszu, zanim rozpocznie się faktyczna gra, postacie muszą zostać przedstawione. W większości języków programowania zmienne należy również zadeklarować przed użyciem. Widząc, że SPL jest językiem programowania, który przypomina scenariusz, w ten sposób deklarujesz jego zmienne, stwierdzając, które z nich pojawiają się podczas programu.

Ale co znaczy „dziewka”? Czy to oznacza, że ​​jest to konkretna (i fajna) nazwa typu danych? Cóż ... Nienawidzę cię rozczarowywać, ale to nic nie znaczy: wszystko po przecinku jest ignorowane przez analizator składni, co oznacza, że ​​możesz umieścić tam najbardziej oburzający napęd, jaki możesz wymyślić.

Długość 18 fragmentu kodu

lying sorry coward

-4dla wszystkich ziemskich stworzeń. Dlaczego? Ponieważ 2*2*(-1) = -4.

Długość 19 fragmentu kodu

Romeo:
 Remember me.

W końcu!!! Mogę w końcu wypisać pełną poprawną instrukcję składni (choć krótką)! W ten sposób używasz fragmentu 12: najpierw deklarujesz, kto mówi, a następnie w następnym wierszu piszesz „dialog”. Zwykle tylko dwie „postacie” są na scenie, aby uniknąć parsera smutnego i zagubionego. Kiedy potrzebujesz innej „postaci”, bierzesz jedną ze sceny i zastępujesz ją nową.

Długość 20 fragmentu kodu

cube of thy codpiece

Chciałem rozwinąć nieco więcej na ten temat, ale, prawdę mówiąc, rzeczy, które wymyśliłem, są wciąż zbyt krótkie, aby zmieścić się w tym fragmencie. I tak, przynoszę wam to, co w końcu jest -1- ponieważ (-1) 3 = -1 (i codpiecejest rzeczownikiem „negatywnym”, ponieważ są niewygodne i tak dalej). SPL rozumie kilka bardziej skomplikowanych operacji arytmetycznych jako pewne potęgowanie i pierwiastki kwadratowe.

Faktoid (jeszcze jeden, ponieważ osiągnęliśmy kolejny kamień milowy)

„Hello World Program” w Shakesperian ma 89 linii i ponad 2400 znaków, jak pokazano tutaj .

Długość 21 fragmentu kodu

Listen to your heart.

We fragmencie 15 wydałeś coś; tutaj wprowadź liczbę do programu. Jeśli chcesz wprowadzić znak, użyjesz go Open your mind.zamiast tego. I, rzecz jasna, ta wartość zostanie zapisana w „postaci”, z którą się rozmawia.

Długość 22 fragmentu kodu

Recall your childhood!

Wyrzucanie liczby całkowitej ze stosu odbywa się w ten sposób, jak wyjaśniono we fragmencie 12. Kiedy, na przykład, Ofelia mówi Hamletowi wspomniane zdanie, powoduje, że Hamlet bierze liczbę całkowitą ze swojego stosu i przyjmuje tę wartość.

Oczywiście, dopóki słowo recallzaczyna się od zdania, możesz wypełnić resztę praktycznie wszystkim, czego pragnie twój twórczy, wstrząsający umysł.

Długość 23 fragmentu kodu

Are you better than me?

Implementacja fragmentu 6. Gdy „znak” zadaje takie pytanie drugiemu, to, co robi, jest równoważny z if (x > y)bardziej popularnymi językami programowania. Wykonanie tej instrukcji musi zostać opóźnione, dopóki nie będę mieć więcej dostępnych znaków.

Długość 24 fragmentu kodu

[Enter Romeo and Juliet]

Tak, „znaki” można wprowadzać parami. Nie jest wymagane, aby jedna „postać” wchodziła na scenę, a za nią następowała inna.

Długość 25 fragmentu kodu

remainder of the quotient

25 znaków tylko do napisania %. 25 znaków, aby pozostała część podziału. I z niego korzystać? To jest jeszcze większe - patrz fragment 75.

Długość 26 fragmentu kodu

Let us return to scene II.

Oto on, gotow SPL, który działa tak, jak można się spodziewać w języku programowania. Rzecz w tym: możesz przeskakiwać między scenami w tym samym akcie i między aktami; ale nie można przeskakiwać między scenami w różnych aktach.

Długość 27 fragmentu kodu

[Exeunt Ophelia and Hamlet]

Kiedy więcej niż jedna „postać” opuszcza scenę, zamiast pozostać Exitw tradycji teatralnej SPL, używa się łacińskiego słowa „Exeunt”. Czasami można go zastąpić tylko fragmentem 8.

Długość 28 fragmentu kodu

Scene I: Ophelia's flattery.

Deklaracja sceny. Jak możesz się już spodziewać, jeśli ze mną poradziłeś, ważne jest to Scene I, że reszta to artystyczny puch.

Powstało kilka kompilatorów (takich jak ten, który kompiluje od SPL do C, napisanych w Pythonie ), które zamiast tego odnoszą się do tekstu po numeracji aktu / sceny. Choć bardziej logiczne (w końcu podczas gry, gdy postacie mówiące w stylu „wracajmy do aktu I” mogą być uważane za głupie), trzymam się pierwotnego sposobu.

Długość 29 fragmentu kodu

You pretty little warm thing!

Tak, jeszcze jedna stała (ponieważ potrzebujemy znacznie więcej znaków, aby wykonywać operacje arytmetyczne). Ten jest równy 8, ponieważ 2*2*2*1 = 8.

Długość 30 fragmentu kodu

You are as cowardly as Hamlet!

Mówiąc to na przykład Romeo, oznacza to Romeo = Hamlet. Jak fragment 9.

Faktoid (tak, kolejny punkt orientacyjny osiągnięty!)

Ten język został stworzony do zadania na kursie analizy składni - dlatego autorzy nie utworzyli kompilatora SPL. Więcej: wydaje się, że autorzy SPL zerwali więzi z ich twórczością, ponieważ nic nie wydaje się być zmodyfikowane w języku od 2001 roku ...

Długość 31

Am I as horrid as a flirt-gill?

Tak, wiem, to trochę powtarzający się fragment 23, chociaż tutaj porównujemy „postać”, która mówi „flirtującą blaszką” (jeśli wolisz if (Ophelia == -1)). Rzecz w tym...

Długość 32 fragmentu kodu

If so, let us return to scene I.

... teraz mogę przedstawić thenSPL, warunkową metodę przeskakiwania oraz shakeperowski sposób implementacji pętli. Możesz na przykład zmusić Romeo do przyjęcia wartości 0, zwiększyć jego wartość podczas wykonywania innego zadania i zatrzymać się, gdy osiągnie 10, a następnie kontynuować program.

Długość 33 fragmentu kodu

If not, let us return to scene I.

Przypominamy, że zamiast tego możemy przejść do innej sceny, jeśli testowany przez nas warunek jest fałszywy .

Długość 34 fragmentu kodu

Open your mind! Remember yourself.

Dwie instrukcje z rzędu, yippie! Pierwszy odczytuje znak, drugi wpycha go do stosu pamięci drugiego znaku.

Długość fragmentu 35

Act I: Death!

Scene I: Oh, shit.

Właściwy sposób deklarowania aktu i sceny. Gustownie dodaj artystyczną papkę.

Długość 36 fragmentu kodu

Thou art as sweet as a summer's day!

Innym sposobem na powiedzenie, że „postać”, do której się mówi, nabierze wartości 1- ponieważ letnie dni są miłe i przyjemne.

Długość 37 fragmentu kodu

Art thou more cunning than the Ghost?

Ophelia tym pytaniem do środków wiosce, tłumacząc to do mniej czytelnym języku programowania if (Hamlet > the Ghost). Jest to fragment 23 od nowa, tak - ale pokazuje, że nie trzeba pytać „bohaterów”, czy są od siebie lepsi: każde inne pytanie też zadziała.

Długość 38 fragmentu kodu

[Enter the Ghost, Romeo and the Ghost]

Tak, dzwonię do „znaku” dwa razy - ponieważ chciałem, aby program dał mi błąd. Wywołanie „postaci”, która jest już na scenie lub nieobecności, aby wyjść, spowoduje wielki smutek dla parsera / kompilatora.

Długość 39 fragmentu kodu

the sum of a fat lazy pig and yourself!

Pełna instrukcja wygląda lepiej niż to, dam ci to, ale ... oto nasza pierwsza operacja arytmetyczna! Co to właściwie wszystko znaczy? Cóż, pigjest brudnym zwierzęciem (choć smacznym), więc jest równoważne -1, ma dwa przymiotniki, co oznacza fat lazy pigrówne 2*2*(-1) = -4. Ale co z yourself? To zaimek zwrotny, a nie nazwa ani przymiotnik. Pamiętaj, że SPL opiera się na dialogach między „postaciami”; w ten sposób yourselfodnosi się do innej „postaci” na scenie. Dochodzimy do końca i odkrywamy, że „suma tłustej leniwej świni i ciebie” to w rzeczywistości -4 + x.

Długość 40 fragmentu kodu

the sum of a squirrel and a white horse.

Tak, kolejna suma, ale ta jest prostsza niż fragment 39. To tylko 1 + 2- 3jeśli moja matematyka jest poprawna.

Faktoid (wciąż ze mną po tych czterdziestu fragmentach artystycznego puchu? Zasługujesz na nagrodę).

SPL w wersji 1.2.1 można pobrać tutaj .

Długość 41 fragmentu kodu

Juliet:
 Speak thy mind!

[Exit Romeo]

Czasami „postacie” są wzywane tylko na scenie, aby zmienić ich wartość - co w prawdziwej grze byłoby dziwne. W każdym razie Juliet sprawia, że ​​jej ukochany Romeo drukuje swoją przechowywaną wartość, po czym wychodzi ze sceny.

Długość fragmentu 42

Speak YOUR mind! You are as bad as Hamlet!

Znowu dwie instrukcje w jednym wierszu (możemy mieć wiele, ale długość fragmentu jeszcze na to nie pozwala); tutaj mamy „znak”, który mówi drugiemu, aby wypisał swoją wartość i przyjął dowolną wartość, jaką ma Hamlet. Mylące? Mayhap.

Długość 43 fragmentu kodu

Am I as horrid as a half-witted flirt-gill?

Pytanie Juliet nie oznacza, że ​​ma niski szacunek (choć może tak być w życiu); to po prostu kolejny if, jak fragmenty 23 i 37. Och, prawie zapomniałem: to się tłumaczy if (Juliet == -2).

Długość 44 fragmentu kodu

You are as evil as the square root of Romeo!

Tak, pierwiastki kwadratowe są złe, nie wiedziałeś? W każdym razie ta instrukcja jest wystarczająco prosta, aby zrozumieć, co robi: przypisuje „znak” wypowiedzianej wartości pierwiastkowi kwadratowemu wartości przechowywanej w Romeo.

Długość 45 fragmentu kodu

Hamlet:
 Art thou more cunning than the Ghost?

Snippet 37 poprawnie napisany z postacią, która mówi wiersz.

Długość 46 fragmentu kodu

the product of a rural town and my rich purse.

Dobra ... zresztą SPL może być jedynym językiem na świecie, który pozwala pomnożyć miasta za pomocą torebek. Oznacza to (2*1)*(2*1), że jeśli się nie mylę, jest to równe 4.

Długość 47 fragmentu kodu

Romeo:
 Speak your mind.

Juliet:
 Speak YOUR mind!

Dam ci to: może to być jeden z najdziwniejszych dialogów w historii. Ale to właśnie dostajesz, gdy wybierasz dziwny język do zaprezentowania. W skrócie Romeo i Julia mówią sobie nawzajem, aby przedstawili swoje wartości.

Długość 48 fragmentu kodu

You lying fatherless useless half-witted coward!

Tłumaczenia go bezpośrednio 2*2*2*2*(-1). -16, dobrze?

Długość 49 fragmentu kodu

Scene V: Closure.

Hamlet:
 Speak your mind!

[Exeunt]

Przykład zakończenia programu w SPL. Możesz zadeklarować scenę specjalnie dla niego (chociaż nie jest to wymagane), następnie Hamlet prosi inną „postać” o podanie swojej wartości, a następnie wszyscy opuszczają scenę. I tak, wszyscy muszą zejść ze sceny.

Długość 50 fragmentu kodu

Othello, a young squire.
Lady Macbeth, an old fart.

Więcej prezentacji „postaci”, przed prawidłowymi instrukcjami. Jak zawsze, jedyną rzeczą, która ma znaczenie dla kompilatora to Othelloi Lady Macbethtak reszta linii jest do wzięcia ...

Jeszcze jedno: „postacie” nie muszą być ze sobą powiązane, aby pojawić się w programie SPL - dzięki temu możesz mieć Romeo, Othello i Hamleta w tej samej grze.

Factoid (pół wieku tych rzeczy? Uff! Po tym, myślę, że nienawidzę Williama Szekspira ...)

Tłumacz SPL na C, wspomniany przed chwilą i opracowany przez twórców SPL, był oparty na Flex i Bison .

Długość 51 fragmentu kodu

Othello:
 Recall your great dreams. Speak your mind!

(Mam dość Romea, Julii i Hamleta ... przynieśmy Othello, dla odmiany!)

Recall, jak można się domyślić, jest tutaj kluczem. „Postać”, do której zwraca się Othello, pobierze wartość ze swojego stosu, przyjmie tę wartość, a następnie ją wyśle.

Długość 52 fragmentu kodu

Thou art as pretty as the sum of thyself and my dog!

Kolejna suma. Ziewać. Zakładając, że ten adresowany jest do Hamleta, oznacza to Hamlet = Hamlet + 1. Lub Hamlet += 1. Lub Hamlet++.

Długość fragmentu 53

Romeo:
 You are as vile as the sum of me and yourself!

Ach, tak, coś, o czym wcześniej zapomniałem: mówiące „postacie” mogą się wymieniać na własnych liniach.

Długość 54 fragmentu kodu

Juliet:
 Is the sum of Romeo and me as good as nothing?

Kolejny przykład poprzedniego fragmentu kodu, dołączony do warunku. Więc mamy tutaj if (Romeo + Juliet == 0).

Długość 55 fragmentu kodu

Juliet:
 You are as lovely as the sweetest reddest rose.

Tutaj Julia chwali „bohatera”, z którym rozmawia (załóżmy, że to Romeo, ze względu na Szekspira), oświadczając, że ma 4 lata. Tak, kolejne przypisanie wartości.

Długość 56 fragmentu kodu

Othello:
 You lying fatherless useless half-witted coward!

Snippet 48 poprawnie wykonany, z „postacią”. Jeśli jesteś zbyt leniwy, aby przewijać w górę (tak jak ja), oznacza to, że obrażany otrzymuje wartość -16.

Długość 57 fragmentu kodu

Romeo:
 If not, let us return to Act I. Recall thy riches!

Wyjaśniłem już, w jaki sposób warunki działają na SPL ogólnie; potrzebna jest jednak bardziej szczegółowa analiza. Nie mamy elsetutaj: na przykład, w tym przykładzie, jeśli warunek się nie powiedzie, program powróci do aktu I; ale gdyby to była prawda, kontynuowałaby do następnej instrukcji, czyli Recallpop-upu ze stosu, to znaczy.

Długość 58 fragmentu kodu

Romeo:
 You are as disgusting as the square root of Juliet!

Chwytanie fragmentu 44 i prezentowanie sposobu prezentacji instrukcji. Gdyby to był dialog między Romeo i Othello, moglibyśmy przetłumaczyć to na Javę jako Othello = Math.sqrt(Juliet).

Długość 59 fragmentu kodu

Othello:
 You are as vile as the sum of yourself and a toad!

OK, jeśli Othello rozmawia z Romeo, byłoby to równoważne z Romeo+(-1); Romeo--w skrócie. Całkiem proste, prawda? To SPL dla ciebie.

Długość 60 fragmentu kodu

Is the quotient between the Ghost and me as good as nothing?

W skrócie, if (The Ghost/Hamlet == 0)zakładając, że „ja” należy do Hamleta.

Długość 61 fragmentu kodu

Thou art as handsome as the sum of yourself and my chihuahua!

Kiedy oderwasz warstwy i warstwy słów i obelg, zauważysz, że SPL jest prawie podstawową rzeczą, bez fajnych funkcji i innych rzeczy. Mamy więc mnóstwo funkcji arytmetycznych na ciele programu. Więc jeśli ten adresowany byłby do Julii, byłby to odpowiednik Juliet++.

Długość fragmentu 62

twice the difference between a mistletoe and a oozing blister!

Tak, tak, więcej operacji arytmetycznych. Z grubsza te 62 bajty SPL można przetłumaczyć 2*(1-2*(-1)). To byłby niesamowity język golfowy, prawda? Dobrze.

Długość 63 fragmentu kodu

You lying stupid fatherless rotten stinking half-witted coward!

Fragment 48 wyprowadzane -16, ten jest równa -64: 2*2*2*2*2*2*(-1).

Długość 64 fragmentu kodu

your coward sorry little stuffed misused dusty oozing rotten sky

Z tego, co rozumiem na temat SPL, jest to całkowicie uzasadnione. Masz wiele obraźliwych przymiotników, które stanowią rzeczownik „pozytywny”. Ponieważ przymiotniki nie mają specjalnego rozróżnienia, czy są ujemne, czy nie (ich jedyną wartością jest pomnożenie liczby po ich prawej stronie przez dwa), możemy mieć całkowicie głupie zdania takie jak ten. Co odpowiada 256. Ponieważ 2*2*2*2*2*2*2*2*1=256.

Długość 65 fragmentu kodu

You are nothing! You are as vile as the sum of thyself and a pig.

Hmm, tyle nienawiści, prawda? To, co mamy tutaj, jest równoważne y=0; y=y+(-1);Prawdopodobnie mógł zostać „zagrany w golfa” You are a pig!, ale heh.

Długość fragmentu 66

You are as beautiful as the difference between Juliet and thyself.

Więc odejmij Juliet od siebie, heh? Ten jest dość prosty do odkodowania: Romeo=Juliet-Romeo;zakładając, że rozmawia się z Romeo.

Długość 67 fragmentu kodu

Juliet:
 Am I better than you?

Romeo:
 If so, let us proceed to Act V.

Jak większość warunków działa na SPL. Testujesz wyrażenie i, jeśli jest to prawda (lub nie: patrz fragment 33), przeskakujesz do innej części programu; w przeciwnym razie przejdziesz do następnego zdania.

Długość 68 fragmentu kodu

The Ghost:
 You are as small as the sum of yourself and a stone wall!

Tak, tak, robię się trochę monotonna. Ale SPL jest taki. Jak powiedziałem nieco wcześniej, jego wyrażenia są mieszanką operacji arytmetycznych. Jest to zatem kolejna inkrementacja - ponieważ stone walljest neutralnym „rzeczownikiem”.

Długość 69 fragmentu kodu

Thou art as disgusting as the difference between Othello and thyself!

Zamiast sumy mamy odejmowanie między dwiema postaciami, Othello i tym, z kim się rozmawia.

Długość 70 fragmentu kodu

You are as handsome as the sum of Romeo and his black lazy squirrel!

Wracamy do dodatków, tak - zadzwoń do mnie formalnie, heh. Tłumaczymy to na Romeo + 2*2*1.

Długość 71 fragmentu kodu

Scene I: Dialogues.

[Enter Juliet]

Othello:
 Speak your mind!

[Exit Juliet]

Scena może być tak mała jak ta. Julietwchodzi na scenę, Othello mówi jej, aby przekazała zapisaną wartość, a następnie ponownie schodzi ze sceny.

Długość 72 fragmentu kodu

twice the difference between a mistletoe and an oozing infected blister!

Jeszcze jedna operacja arytmetyczna - ponieważ SPL jest na nich zagadką. Możemy to przetłumaczyć na 2*(1-2*2*(-1)).

Długość 73 fragmentu kodu

You are nothing! Remember me. Recall your unhappy story! Speak your mind!

Cztery instrukcje z rzędu ?! Właściwie jestem z siebie dumny. W każdym razie, załóżmy, że jest to dialog między Romeo i Julią (a on mówi): oznacza to, że wartość Julii zaczyna się od 0; następnie Juliet wepchnie wartość Romea do stosu pamięci, wrzuci go i wyśle ​​we wprowadzonej formie. Proste, prawda?

Długość 74 fragment

You are as sweet as the sum of the sum of Romeo and his horse and his cat!

Tak, tak, nudny przykład, wiem. Ale to jest X = (Romeo + 1) + 1.

Długość 75 fragmentu kodu

Is the remainder of the quotient between Othello and me as good as nothing?

Cóż, jest to całkiem proste. Jeśli twoje umiejętności dekodowania są nieprawidłowe, przekłada się to na if (Othello % X == 0).

Długość 76 fragmentu kodu

Thou art as rich as the sum of thyself and my dog! Let us return to scene I.

Skok z fragmentu 26 z wyrażeniem przed nim. A gotona SPL nie zawsze znajduje się w pobliżu warunku, może tak być - i, oczywiście, tego typu gotozawsze będzie można znaleźć na końcu aktu lub sceny, ponieważ instrukcje po nim nigdy nie zostaną skompilowane / wykonane. Pierwsza instrukcja jest dość prosta: x=x+1.

Długość 77 fragmentu kodu

[Exit Hamlet]

[Enter Romeo]

Juliet:
 Open your heart.

[Exit Juliet]

[Enter Hamlet]

Mamy na scenie Juliet i Hamleta; ale potrzebujemy wartości z Romeo. Tak więc, aby oszczędzić kompilatorowi przed bardzo nieprzyjemnym bólem głowy, najpierw usuwamy Hamleta ze sceny (chociaż to mogła być Juliet), mówimy Romeo, aby wszedł na scenę, Juliet daje mu instrukcję, aby wyprowadził numer (patrz objaśnienie fragmentu 21), a następnie Romeo schodzi ze sceny i Hamlet wraca. Całkiem proste i proste.

Długość 78 fragmentu kodu

The Ghost:
 Speak thy mind.

Lady Macbeth:
 Listen to thy heart! Remember thyself.

Tak więc Duch (zmarły ojciec Hamleta) mówi Lady Makbet, aby przekazała swoją wartość, podczas gdy rozkazuje Duchowi odczytać liczbę i wcisnąć ją na stos.


32
To niezwykle interesujące, a twoje zdjęcie profilowe idealnie pasuje, wygląda dokładnie tak, jak wyobrażam sobie, jak mógłby wyglądać programista SPL.
overactor

3
@overactor Nie wiem, czy powinienem być obrażany, czy dumny, że można go przyrównać do Gumby'ego. ^ _ ^
Rodolfo Dias,

9
Dziwnie, nie jest to tutaj najbardziej niejasny przykład do czytania ... i wydaje się, że jest związany z „najmniej praktycznym”.
HRRambler

6
ROFL daje +1, aby pomóc Ci w drodze - Jeszcze raz do naruszenia Rodolfo!
HRRambler

3
@RodolfoDias Możesz zacząć. Czekam na ich zobaczenie. Masz 120 głosów oddanych.
ghosts_in_the_code

176

Piet

Faktoid

Piet to język programowania, w którym kod źródłowy składa się z obrazów. Przebieg programu rozpoczyna się od lewego górnego piksela i porusza się po obrazie między pikselami i grupami pikseli, aż się kończy.

Dla czytelności programy Piet są zwykle wyświetlane w powiększonej wersji. W takim przypadku termin codeljest używany do opisania grupy pikseli o tym samym kolorze, które odpowiadają pojedynczemu pikselowi na obrazie źródłowym.

W przypadku tego wyzwania, ponieważ Piet nie używa znaków, jeden przykładowy kod na głos zostanie użyty dla przykładowych programów.

1 Kod

1 Kod

To jest poprawny program, nic nie robi i kończy się. Przepływ sterowania rozpoczyna się w lewym górnym (tylko) pikselu i nie ma wyjścia, co kończy program.

Piksel może w tym przypadku mieć dowolny kolor, aby uzyskać dokładnie ten sam efekt.

2 kody

2 kody

Spowoduje to ciągłe odczytywanie znaków ze standardowego wejścia i zachowanie bieżącej sumy ich wartości Unicode (chociaż nic nie jest zrobione z tą sumą i nie jest wyświetlane).

Przepływ progamu przesuwa się do przodu i do tyłu między dwoma kodami, ponieważ jedyne wyjście z każdego z nich jest do drugiego. Polecenia w piecie są wykonywane przez ruch z jednego kodu lub regionu do drugiego, w zależności od różnicy odcienia i jasności 2 regionów. Jest inputto polecenie poruszające się od lewej do prawej, a następnie od addprawej do lewej. Przy pierwszym addpoleceniu nic się nie stanie, ponieważ na stosie jest tylko jedna wartość, a specyfikacja mówi, że polecenia bez wystarczającej liczby dostępnych wartości są ignorowane.

Ten program jest pętlą, która nigdy się nie kończy, ponieważ większość programów pietowych ma bardzo małe rozmiary, ponieważ potrzeba co najmniej kilku koderów, aby poprawnie „zatrzymać” przepływ programu i go zakończyć.

3 kody

3 kody

Jest to podstawowy program typu echo, odczytuje znak ze standardowego wejścia i drukuje go na standardowe wyjście.

Ponownie jest to nieskończona pętla. Program rozpoczyna się od podróży od lewej do prawej, co robi inputwtedy output. Program będzie kontynuował przepływ w tym samym kierunku, gdy tylko będzie to możliwe. W jasnozielonym kodzie jedynym wyjściem jest przejście w drugą stronę. Wracając od prawej do lewej, próbuje wykonać polecenia subtracti addpolecenia, ale stos jest pusty, więc nie można ich przerwać.

4 kody

4 kody

Drukuje 2 na standardowe wyjście w nieskończoność.

Nie jest to szczególnie interesujący program funkcjonalnie, ale teraz, gdy w końcu mamy złożoną liczbę koderów, możemy pochwalić się nieco bardziej zaawansowanym przepływem niż od lewej do prawej. Kiedy program próbuje wyjść z kodera, najpierw próbuje sprawdzić bieżący kierunek. Jeśli nie jest to możliwe (w tym przypadku z powodu krawędzi obrazu), obraca się o 90 stopni w kierunku zgodnym z ruchem wskazówek zegara i próbuje ponownie wyjść. W takim przypadku program obchodzi 1 kodek naraz zgodnie z ruchem wskazówek zegara, umieszczając push1 na stosie dwa razy, addłącząc te razem, a następnie outputzapisując wynik.

5 kodów

5 kodów

Wielokrotnie odczytuje znak ze standardowego wejścia i śledzi sumę ich wartości Unicode.

Jest to zasadniczo ta sama funkcjonalność, co wersja 2-kodelowa, ale to wyzwanie polega na prezentacji języka, a jedną z fajnych rzeczy w piecie jest to, że możesz mieć różne zdjęcia, które robią to samo.

Tutaj widzimy biały kod po raz pierwszy, który pozwala na przesuwanie się programu po nim bez wykonywania instrukcji. Kodery purpurowy i niebieski wykonują tu całą pracę. Podróż z niebieskiego na czerwony nic nie robi, ponieważ przecina biały kodel pośrodku. Dwa czerwone są tylko pushnumerem 1 na stosie i popwycofują się, gdy przemieszczają się od lewej do prawej, a następnie od prawej do lewej, a następnie przez biały kod, więc żadna instrukcja nie jest wykonywana.

6 kodów

6 kodów

Ponownie, powtarzając wcześniejszą funkcjonalność z innym wyglądem. Jest to kolejny program echa, który odczytuje znak jednocześnie ze standardowego wejścia na standardowe wyjście.

Tutaj widzimy nasz pierwszy czarny kod. Przepływ programu nie może wejść do czarnego kodu, więc z jasnopurpurowego kodu w prawym górnym rogu program nie wyjdzie w prawo ze względu na krawędź obrazu, nie wyjdzie w dół z powodu czarnego kodu i odbije się z powrotem w lewo w czerwonym kodzie . Niebieskie i zielone kody są czysto dekoracyjne, program nigdy ich nie wprowadzi.

7 kodów

7 kodów

Kolejny program echa o innym wyglądzie.

Widzimy tutaj nasze pierwsze bloki kodowania większe niż rozmiar 1. W piecie, każdy ciągły blok kodów tego samego koloru jest traktowany jako pojedynczy blok. Rozmiar bloku nie ma znaczenia, z wyjątkiem wykonywania pushinstrukcji, więc program ten jest traktowany dokładnie tak, jak wersja 3-kodowa, z wyjątkiem różnych kolorów.

8 kodeków

8 kodeków

Odczytuje liczbę ze standardowego wejścia i wielokrotnie wysyła kwadrat do standardowego wyjścia.

Przepływ sterowania jest podstawowym wzorcem zgodnym z ruchem wskazówek zegara, tak jak w programie 4-kodelowym. Zaczynając od lewego górnego, operacje w kolejności są input, duplicate(popycha dodatkową kopię górnej wartości stosie na stosie) multiply, output. Następnie pushokreśla wartość 1 na stosie, przesuwa się po białym, aby żadne polecenie nie zostało wykonane, a następnie popodsuwa 1 od stosu podczas przechodzenia z lewego dolnego do górnego lewego kodu. Powoduje to powrót do początku programu z pustym stosem i powtarza się.

9 kodów

9 kodów

Dodaje 1 + 2 = 3, a następnie kończy.

Teraz, gdy mamy program z więcej niż 2 kodami w obu wymiarach, możemy w końcu ustawić region, który zatrzyma program i zakończy go zamiast zapętlać na zawsze. Pierwsza operacja przejścia z czerwonego kodu do ciemnoczerwonego obszaru to push1, następnie program obraca się i przepływa w dół do jasnoczerwonego kodu w środku i przyjmuje pushwartość 2. Przepływ z jasnoczerwonego do jasnożółtego jest wykonywany addoperacja. Dolny jasnożółty pasek powoduje zakończenie programu, ponieważ nie ma możliwości wypłynięcia, ponieważ wszystkie rogi są zablokowane.


Programy 1- i 2-wysokie szybko stają się brzydkie i nieciekawe, więc od tego momentu skupię się na liczbach, które pozwalają na co najmniej kilka koderów w każdym kierunku.

12 kodów

12 kodów

Wreszcie program, który robi coś, co można by uznać za użyteczne (choć nadal jest to trochę skomplikowane). Odczytuje kolejno 2 liczby ze standardowego wejścia, a następnie wyświetla ich sumę i robi to wielokrotnie.

Program przepływa od lewej do prawej przez 4 kolorowe paski perfoming 2, inputspo których następuje addpolecenie. Następnie przechodzi do prawego dolnego kodu i wykonuje an output, a następnie przesuwa się w lewo przez biały region z powrotem do początku.

Można to zrobić w 8 kodach, ale ponieważ mamy dodatkową przestrzeń, możemy stworzyć coś, co nieco zainspiruje stary, pozbawiony sygnału wyświetlacz telewizyjny.

15 kodeków

15 kodeków

Odczytuje liczbę ze standardowego wejścia i wyświetla jej „kwadrat”.

Wykorzystuje kilka sztuczek, aby uzyskać nieco symetryczny wygląd programu, który faktycznie coś robi. Najbardziej wysunięty na lewo czerwony pasek ma inny kolor na dolnym kodzie niż reszta, wykorzystując fakt, że (przynajmniej dla mnie) te 2 odcienie czerwieni wyglądają bardzo podobnie. program przejdzie od jaśniejszego czerwonego obszaru do jasnoniebieskiego kodu, a następnie prosto przez środek programu do jasnozielonego po prawej stronie, gdzie jest uwięziony. Wykonuje input, duplicate, multiplyoraz outputoperacje.

Ciemniejszy czerwony kod, wraz ze średnimi zielonymi kodami na górze i na dole środkowej kolumny, są ozdobne i program nigdy ich nie osiągnie.

20 kodeków

20 kodeków

Odczytuje liczby od standardowego do odczytu 0, w którym to momencie wyświetla sumę wszystkich wprowadzonych liczb i kończy działanie.

W końcu mamy wystarczająco dużo miejsca, aby wykonać kontrolę przepływu w formie pointeroperacji. W 4 codels wzdłuż górnej wykonania input, duplicatei noteksploatacji, a następnie kolejna notoperacja przenoszenia z magenta w prawym górnym rogu, do 2-CODEL żółtego poniżej. notDziałanie pojawia górną wartość ze stosu i umieszcza na 1, gdy górna wartość wynosiła 0, i 1 w przeciwnym razie. Dlatego dwukrotne notzastąpienie dowolnej niezerowej wartości wartością 1. Przejście z żółtego paska w dół do ciemnoniebieskiego wykonuje pointeroperację, która zrywa najwyższą wartość ze stosu i przesuwa wskaźnik kierunku zgodnie z ruchem wskazówek zegara tyle razy.

Jeśli najwyższą wartością jest 1 (tzn. Nie wprowadziliśmy zera), wskaźnik kierunku będzie wskazywał w lewo, przechodząc do koderów magenta dla addoperacji (która zostanie zignorowana po raz pierwszy z powodu tylko jednej wartości na stosie) i następnie przez biały powrót do początku programu.

Jeśli najwyższą wartością stosu jest zero przy operacji wskaźnika, wskaźnik kierunku nie zmieni się, a program będzie kontynuował w dół. Przejście do jaśniejszego niebieskiego paska spowoduje pop0, które zostało wpisane ze stosu, pozostawiając tylko sumę zgromadzonych liczb. Przejście do niebieskiego paska na dole będzie outputsumą, a następnie zakończy się, ponieważ przepływ programu jest uwięziony.

25 kodeków

25 kodeków

Odliczanie! Odczytuje liczbę ze standardowego wejścia, a następnie drukuje odliczanie do 1, aby ustawić stałą liczbę na raz. Na przykład, jeśli 5 zostanie odczytane, wydrukuje 54321.

Pierwszą operacją od cyjan do żółtej jest input. Następnie żółty zaczyna się od „pętli” programu. Żółty> Magenta> Niebieski to duplicatewtedy an output, więc drukuje najwyższą wartość na stosie, ale zachowuje kopię. Przesuwanie w dół po prawej stronie, to pushwartość 1 na stosie następnie wykonać subtraction, zmniejszając naszą wprowadzoną wartość o 1. Dalej jest duplicate, noti inny notprzejście od jasnopurpurowy w prawym dolnym rogu, aby ciemny żółty obok niego. Jest to to samo sprawdzenie zerowe / niezerowe jak w poprzednim programie. Przesunięcie w lewo do jasnoniebieskiego kodu wykonuje pointeroperację, która albo przesunie się w lewo do ciemnobłękitnego, aby zakończyć program, jeśli skończymy, lub w górę do żółtego, aby ponownie uruchomić naszą pętlę bez początkowego wejścia, ale pierwotna wartość spadła o 1.

Wszystkie 3 czerwone kody są dekoracyjne i mogą mieć dowolny kolor.

30 kodeków

30 kodeków

Generator Fibonacciego. Drukuje warunki sekwencji Fibonacciego na standardowe wyjście i nie zatrzymuje się.

Jest to pierwsze wprowadzenie rolloperatora, a także pierwszy raz, gdy pushoperator używa rozmiaru regionu większego niż 1 , aby uzyskać określoną wartość na stosie.

Jak zawsze zaczyna się w lewym górnym rogu w prawo. Pierwsze 2 operacje push1 na stosie, a następnie outputod momentu, gdy sekwencja Fibonacciego zaczyna się od dwóch 1, ale główna pętla programu wydrukuje 1 tylko raz. Następnie pushna stosie pojawiają się jeszcze 2 1s, aby znaleźć się w ciemnej magenty w prawym górnym rogu i uruchomić główną pętlę programu.

Przechodząc w dół po prawej stronie my duplicatei outputwydrukujemy następny termin sekwencji, a następnie duplicateponownie, aby uzyskać kopię bieżącej wartości sekwencji. Przesunięcie w lewo na dole wykonuje 2 pushoperacje. Ponieważ jasnoczerwony obszar w prawym dolnym rogu ma rozmiar 3 koderów, pierwszy pushzepchnie 3 na stos zamiast 1.

Przejście do jasnoniebieskiego jest rolloperacją. Spowoduje to zerwanie 2 najwyższych wartości ze stosu i wykonanie liczby rzutów równej pierwszej podanej wartości na głębokość równą drugiej podanej wartości. W takim przypadku wykona 1 rzut na głębokość 3. Rzut na głębokość nprzyjmuje najwyższą wartość stosu (naszą zduplikowaną bieżącą wartość) i zakopuje go ngłęboko. Nasz stos ma teraz tylko 3 głębokości, więc pochowa najwyższą wartość na dole.

Ponowne przejście w górę wykonuje addoperację sumującą bieżącą wartość sekwencji z poprzednią wartością sekwencji. Nasz stos ma teraz następną (nową bieżącą) wartość sekwencji na górze, a ostatnią wartość poniżej. Program przesuwa się teraz w poprzek bieli do ciemnej magenty, aby ponownie rozpocząć pętlę.

Żółty wzór na środku nigdy nie jest używany.

54 Kody

54 Kody

Drukuje „cześć!” na standardowe wyjście

Niezbyt długa wiadomość, ale drukowanie w trybie pieta zajmuje zaskakująco dużo miejsca. Drukowanie odbywa się przy użyciu wartości Unicode, a liczby całkowite są wypychane na stos przy użyciu rozmiaru opuszczanego regionu. Ponieważ mamy bardzo ograniczoną liczbę kodów do tego wyzwania, używamy matematyki, aby uzyskać pożądany zakres wydruku.

Program zaczyna się pushod 5 z niebieskozielonego regionu po lewej stronie. Odtąd płynie wzdłuż szczytu z 6 duplicateoperacjami, aby zalać stos za pomocą paczki 5. Dalej jest push1, subtractaby umieścić 4 na stosie, a następnie 2 multiplyoperacje, aby umieścić 4 * 5 * 5 = 100 na stosie. Potem a duplicateprzez 2 100s.

Teraz program odbija się od czerni i zaczyna pracować w lewo wzdłuż dna. Pushoperacje 3 i 2, a następnie a, rollaby zakopać 2 100s poniżej 5. Następnie push1, odejmij i dodaj, aby uzyskać 100 + 5-1 = 104 na szczycie stosu, który jest unicode „h”. Następne 2 operacje to push1, pointeraby przejść za róg i zacząć przesuwać się wzdłuż środka, a następnie outputwydrukować „h”.

Dalej jest add100 + 5 = 105 na górze stosu i outputwydrukować „i”. Stos zawiera teraz dwie 5. Push1 add, multiplydaje (1 + 5) * 5 = 30. Wreszcie push3 i add33 oraz outputkońcowe „!”. Następnie program przechodzi przez pozostałą białą spację i kończy się na zielono po prawej stronie.


5
Hah tak, czekałem na to :)
Sp3000,

Czym różni się to od języka znaków 2D? To tylko sposób, w jaki przekazujesz wartości komórek.
JDługosz

25
@jdlugosz Wiele ezoterycznych języków programowania, kiedy się do tego zabierasz, to tylko kilka podstawowych poleceń manipulacji stosami z unikalnym sposobem kodowania poleceń. Osobiście uważam, że kodowanie ich na obrazie to dobry pomysł.
Spencer,

13
Jeśli mówimy o równoważności funkcjonalnej, możesz zapytać „Jak to się różni od maszyny Turinga?” ale wtedy możesz postawić to samo pytanie
kotowi

3
Przykład 9 kodeli wygląda jak mini-pokeball. Miły.
The_Basset_Hound

155

> <> (Ryby)

(Uwaga: niektóre fragmenty bazują na poprzednich fragmentach, więc w przeciwieństwie do większości odpowiedzi postanowiłem je umieścić od najwcześniejszego do najnowszego).

Faktoid:

Podobnie jak Befunge,> <> jest językiem 2D opartym na stosie. Oznacza to, że instrukcje nie są wykonywane liniowo, jak większość tradycyjnych języków - przepływ programu może być w górę, w dół, w lewo lub w prawo!

Długość 1 fragmentu:

X

Xjest niepoprawnym poleceniem w> <>, więc komunikat o błędzie something smells fishy...jest drukowany. W rzeczywistości jest to jedyny komunikat o błędzie w> <>, niezależnie od tego, czy przyczyną jest dzielenie przez zero, czy próba zniszczenia pustego stosu.

Długość fragmentu 2:

1n

Przebieg programu w> <> rozpoczyna się od lewego górnego rogu i początkowo jest prawy. 1wypycha 1 na stos, a następnie ndrukuje go jako liczbę (w przeciwieństwie do znaku ASCII). Ale programy> <> są toroidalne, co oznacza, że ​​wskaźnik instrukcji zawija się, gdy osiąga koniec linii. Więc po nzawinięciu do początku, wciśnij 1, wydrukuj, zawiń do początku, wciśnij 1, wydrukuj ... i skończymy drukować na 1zawsze!

Długość fragmentu 3:

"o;

Oto "parsowanie ciągów, owyjście jako znak ASCII i ;zakończenie programu. Ale co tak naprawdę program robi jako całość?

Najpierw zaczynamy parsowanie łańcuchów, wypychając każdy znak, który widzimy na stos, aż znajdziemy zakończenie ". Naciskamy o, a następnie ;... i zawijamy wskaźnik instrukcji z powrotem do początku. Ale teraz jesteśmy na "tyle, więc przestajemy parsować łańcuchy i wreszcie wykonujemy oi ;jak zwykle, aby wydrukować górę stosu (the ;) i zakończyć.

Tak, właśnie użyliśmy tego samego znaku cytatu, aby rozpocząć i zakończyć ciąg znaków!

Długość 4 fragmentu:

42n;

Na podstawie tego, co widzieliśmy do tej pory, możesz spodziewać się, że spowoduje to wypchnięcie 42, wyjście jako liczba, a następnie zakończenie. Ale wszystkie instrukcje w> <> są pojedynczymi znakami, więc w rzeczywistości wypycha 4 i 2 , a następnie wysyła górę stosu jako liczbę (tylko 2) i kończy.

Długość fragmentu 5:

<v
;>

Pamiętaj, że> <> to język 2D. Oznacza to, że muszą istnieć sposoby zmiany kierunku przebiegu programu!

Podobnie jak Befunge, możesz to zrobić za pomocą strzałek >^v<. Aby zilustrować ich działanie, spójrzmy na powyższy program:

  • Przebieg programu jest początkowo prawy
  • < sprawia, że ​​program płynie w lewo - idziemy w lewo i zawijamy się do v
  • v sprawia, że ​​program płynie w dół - schodzimy do >
  • > sprawia, że ​​program płynie w prawo - idziemy w prawo i owijamy się w stronę ;
  • Wreszcie kończymy.

Długość fragmentu 6:

";"00p

Kolejną fajną cechą> <> jest to, że jest zwrotna - program może modyfikować swój własny kod źródłowy w locie!

Tutaj wciskamy a ;, po której następują dwa zera. pNastępnie zdejmuje trzy główne elementy y, x, v( ybędące górną stosu) i miejsca vw położeniu x,y. Innymi słowy, pw tym programie umieszcza średnik na pozycji 0,0, zamieniając kod na ;;"00p. Pozwala to na zakończenie programu, ponieważ wskaźnik instrukcji otacza się i wykonuje nowo umieszczony ;.

Długość 7 fragmentu:

\7*n;
6

W przeciwieństwie do Befunge,> <> ma także mirrors ( \/|_#), które odzwierciedlają kierunek przebiegu programu. Więc tutaj:

  • Zacznij od prawej, ale \odzwierciedla nas w dół
  • Naciśnij 6 i zawiń
  • Uderz w tył \i odbij w prawo
  • Naciśnij 7
  • Pomnóż dwie górne części stosu
  • Wyjście i zakończenie

Poruszanie się w poziomie przez _lustro lub pionowo przez |lustro nie jest możliwe.

Długość 8 fragmentu:

"r00g>o<

Prawdopodobnie najprostszy> <> quine, jeśli dopuszczalny jest błąd. Dwie nowe instrukcje tutaj to:

  • r: Odwróć stos
  • g: Get - pop y, xi naciskać na znak x,yna stosie (odpowiednik p)

Korzystając z wcześniejszej sztuczki owijania łańcuchów, program początkowo wypycha, r00g>o<a następnie ponownie uderza pierwszy cytat. Stos jest następnie odwracany, dając <o>g00r. Po tym możemy naciskać na char 0,0, ", aby dać <o>g00r". Na koniec łapiemy pułapkę omiędzy dwiema strzałkami, wyprowadzając górę stosu, dopóki nic nie pozostanie i otrzymamy błąd.

Długość 9 fragmentu:

x0\>
\1n>

x(małe litery) przesuwa wskaźnik instrukcji w losowym kierunku, a program pokazuje tę funkcję, drukując losowe bity na zawsze. Spróbuj śledzić strzałki i lustra, aby dowiedzieć się, jak to działa! (Nie zapomnij sprawdzić wszystkich czterech kierunków, w tym w górę i w lewo)

Długość 10 fragmentu:

;a comment

W> <> nie ma składni komentarza - nie jest potrzebny. Po prostu napisz co chcesz gdziekolwiek i upewnij się, że nie zostanie wykonane jako kod!

Długość fragmentu 11:

1!X2!X+!Xn;

!to trampolina, która omija instrukcje. Jest to szczególnie przydatne w przypadku korzystania z ?, o warunkowym trampolinie, które się pojawi na szczyt stosu i wykonuje następną instrukcję jeżeli pojawiło elementem jest niezerowe. Zobaczymy, jak to działa później.

Powyższy kod drukuje 3, pomijając Xs, tylko wykonując 1! 2! +! n;.

Długość 12 fragmentu:

01v
ao>:@+:n

Drukuje liczby Fibonacciego na zawsze, zaczynając od drugiego 1, po jednym w każdej linii. Nowe polecenia to:

  • a: Wciśnij 10, czego potrzebujemy do nowej linii. a-fNaciśnij odpowiednio 10 do 15.
  • :: Duplikat góry stosu
  • @: Obróć górne trzy elementy stosu, np [5 4 3 2 1] -> [5 4 1 3 2].

Śledzenie pierwszych kilku iteracji:

wprowadź opis zdjęcia tutaj

Długość 13 fragmentu:

i:d=?v
l?!;o>

Program „tac”, który wczytuje wiersz wejściowy i wysyła go w odwrotnej kolejności. Dzięki @tomsmeding dla fragmentu.

=wysuwa dwa górne elementy i przesuwa 1, jeśli są równe, 0 w przeciwnym razie. Pierwszy wiersz odczytuje dane wejściowe, dopóki nie zostanie znaleziony znak ASCII 13 (powrót karetki), w którym to momencie przechodzi do drugiego wiersza.

l?!;oPętli jest ważnym konstrukt> <>, który wysyła cały stos. W przeciwieństwie do >o<tego nie powoduje żadnych błędów. Tak to działa:

  • l przesuwa długość stosu
  • Sprawdzamy długość za pomocą ?:
    • Jeśli długość była różna od zera, !wykonywana jest następna instrukcja , pomijając;
    • Jeśli długość wynosiła zero, nie wykonujemy !i nie kończymy z powodu;

Zauważ, że nic się nie dzieje, dopóki nie naciśniesz powrotu karetki.

Długość 14 fragmentu:

32.

   X67*n;

Oprócz zmiany kierunku przebiegu programu, możesz faktycznie przesunąć wskaźnik instrukcji w dowolne miejsce!

.pops y, xi teleportuje wskaźnik dyspozycję x,y, utrzymując kierunek. Pamiętaj jednak, że musisz przejść do jednego kwadratu przed miejscem, do którego chcesz się udać - wskaźnik instrukcji jest aktualizowany przed wykonaniem następnej instrukcji. Więc tutaj wskaźnik instrukcji wyląduje na niepoprawnym X, ale wszystko jest w porządku, ponieważ wskaźnik przesuwa się do 6przed kontynuowaniem wykonywania.

.umożliwia konwertowanie większości programów> <> na jednowierszowe, ale dlaczego chcesz stracić przyjemność z 2D? :)

Długość 15 fragmentu:

01+:aa*=?;:nao!

Drukuje liczby 0na 99, po jednym w każdym wierszu. Ten program demonstruje staranne użycie !trampoliny - aby upewnić się, że początkowe 0 jest wciśnięte tylko raz.

Długość 16 fragmentu:

"r00g!;oooooooo|

Odpowiedni quine, który nie rzuca błędów, zainspirowany quine na stronie esolang .

Jeśli zastanawiałeś się, jak zmodyfikować poprzedni quine (fragment nr 8), aby nie spowodował on błędu, i pomyślałeś „dlaczego nie dodam po prostu mnóstwa oinstrukcji?”, Możesz zauważyć, że przy każdym ododaniu , musisz wydać inny o! Quine starannie rozwiązuje problem, umieszczając |na końcu lustro, które umożliwia dwukrotne użycie każdego oz nich .

Jeśli przejdziemy do pojedynczych cudzysłowów (które również służą do analizowania ciągów), wówczas alternatywnym quine, który nie gjest używany, jest

'r3d*!;oooooooo|

Długość 17 fragmentu:

b2,63,.

   17,n;

Mamy add ( +), odejmowanie ( -), mnożenie ( *), modulo ( %) ... ale co z dzieleniem? Jest tam, ale ponieważ /jest już lustrem, podziałowi został przypisany ,symbol. Co ciekawe, podział jest dzieleniem zmiennoprzecinkowym , a nie dzieleniem całkowitym!

Powyższy program bada niektóre niezdefiniowane zachowania, próbując do nich przejść 11/2, 6/3. Python intepreter wydaje się w porządku, jeśli pierwsza współrzędna nie jest liczbą całkowitą (choć skacze do złym miejscu), ale dławiki jeśli drugi nie jest.

Długość 18 fragmentu:

123456${{$}nnnnnn;

Widzieliśmy, rktóry odwraca stos i @który obraca trzy górne elementy. Oto kilka innych poleceń, które przenoszą elementy na stosie:

  • $: Zamień dwa górne elementy
  • {: Przesuń cały stos w lewo
  • }: Przesuń cały stos w prawo

Aby pokazać, jak to działa, oto ślad programu:

123456 ------> 123465 ------> 234651 ------> 346512 ------> 346521 ------> 134652
       $ Swap        { L shift      { L shift       $ Swap        } R shift

Następnie produkujemy, dając 256431.

Długość fragmentu 19:

"reward"4[roooo]oo;

Do tej pory mówiłem „stos”, „stos” ...

Chociaż większość programów używa tylko jednego stosu,> <> może faktycznie mieć wiele stosów! Oto odpowiednie instrukcje:

  • [: Wyskakuje xi przenosi górne xelementy na nowy stos
  • ]: Usuwa bieżący stos i przenosi jego wartości do stosu leżącego poniżej.

Oto ślad dla powyższego programu:

       [r e w a r d]       Push "reward"
4[     [r e] [w a r d]     Move four elements to a new stack
r      [r e] [d r a w]     Reverse the current stack
oooo   [r e] []            Output "ward"
]      [r e]               Remove the current stack, no values to move
oo     []                  Output "er", giving "warder" altogether

Zwróć uwagę, że po prostu naciśnięcie, rewarda następnie ponowne wysłanie go za pomocą oooooospowoduje wydrukowanie drawer, ze względu na charakter stosów „pierwsze weszło, ostatnie wyszło”.

Długość 20 fragmentu:

aa*5+\
7a*2+\
oo;  \

Mało znaną cechą> <> jest to, że podobnie jak Python, odwrotne ukośniki mogą być używane w wielu przypadkach do kontynuacji linii. *

Powyższy kod jest funkcjonalnie taki sam jak

aa*5+7a*2+oo;

* Oświadczenie: Powodem, dla którego to działa, może być lub nie być z zupełnie innego powodu

Długość fragmentu 22:

1&fv ;n&<
&1->:0=?^:&*

Oprócz stosów,> <> ma również rejestry (po jednym dla każdego stosu), których można użyć do przechowywania wartości. Wywołanie &po raz pierwszy przenosi najwyższą wartość stosu do rejestru, a &ponowne wykonanie powoduje cofnięcie wartości. Może to być bardzo przydatne przy kumulowaniu wartości, na przykład sum i silni.

Powyższy program oblicza silnię f(15), drukując 1307674368000. Oto ślad dla fzastąpionego przez 4:

wprowadź opis zdjęcia tutaj

Długość 24 fragmentu:

"Hello, World!"rl?!;of0.

Mamy wystarczająco dużo znaków dla każdego ulubionego programu! Tutaj używamy .teleportera do pętli wyjściowej.

Długość 25 fragmentu:

0i:0(?v$a*$"0"-+!
   ;n~<

Niestety> <> pozwala na odczyt ze STDIN tylko jednego znaku na raz, co sprawia, że ​​czytanie liczb jest nieco trudne. W przypadku danych wejściowych składających się z cyfr 0–9 program ten jest zasadniczo atoi, konwertując ciąg cyfr ze STDIN na liczbę na stosie (która jest następnie drukowana).

Inna uwaga jest taka, że ​​na EOF iwypycha -1 na stos. To sprawia, że ​​sprawdzanie EOF jest łatwe przez porównanie do 0 za pomocą (lub „mniej niż”.

Ten fragment kodu również używa ~, który wyskakuje i odrzuca górny element stosu.

Długość fragmentu 33:

i>:nao:1=?;\
 ^  ,2v?%2:/
 ^+1*3<

Do tej pory większość urywków była względnie liniowa lub była prostym przykładem demonstrującym funkcjonalność> <>. Teraz mogę podać przykład, który pokazuje, jak łatwo jest wizualizować przebieg programu w> <> za pomocą dobrze zorganizowanego programu.

Program wczytuje pojedynczy znak ASCII i uruchamia 3x+1algorytm w punkcie kodowym (w> <> znaki są w zasadzie liczbami całkowitymi). Każdy krok algorytmu jest drukowany, dopóki nie osiągniemy 1.

Oto ślad dla pierwszych kilku iteracji z danymi wejściowymi a(punkt kodowy 97):

wprowadź opis zdjęcia tutaj

Długość fragmentu 44:

a&>i:0(?v"+"$\
/&^?=0l< "a*"/
\:1+&2p/\0
n
;

Nie wydaje mi się, że wykonałem ppolecenie sprawiedliwości, ponieważ użyłem go tylko raz w skrypcie nr 6, więc oto inna funkcja atoi. Co jest w tym fajnego? Program zapisuje wyrażenie potrzebne do obliczenia liczby podczas odczytu danych wejściowych!

Tak więc dla danych wejściowych 573, po odczytaniu wszystkich znaków, będzie wyglądać koniec trzeciego wiersza \0a*5+a*7+a*3+, który daje wynik 573!

Po raz kolejny oczekuje się, że wprowadzane będą tylko cyfry. Śledź GIF tutaj .

Długość 74 fragment:

>i:'A'(?v:'N'(?v:'['(?v\
  :'a'(?v:'n'(?v:'{'(?v\
^      o<    +d<  -d-d<o

Jeśli udało ci się do tego dojść, możesz się ze mną zgodzić, gdy powiem, że jest to jeden z bardzo czytelnych programów ROT13. Biorąc pod uwagę znak c1, znajdujemy pierwszy znak c2w AN[an{, więc c1 < c2następnie zastosuj odpowiednie przesunięcie przez dodanie / odjęcie d(13). Zauważ, że [i {są znakami bezpośrednio po Zi zodpowiednio.

Wypróbuj w konsoli i obserwuj, jak litery zmieniają się podczas pisania!

(Możesz również wprowadzić dane wejściowe, ale ponieważ brakuje mi sprawdzenia EOF :0(?;, zatrzyma się z błędem, gdy spróbuje wydrukować -1 jako znak)


Pomysł na fragment 13: i:d=?v NEWLINE o;!?l<- wypisuje linię wejściową do tyłu
tomsmeding

12
Chciałbym móc oddać więcej głosów, jestem teraz zainspirowany do nauki> <> ...
Robobenklein

6
+1 za rozpoczęcie od góry i zejście (a także dlatego, że fajnie jest czytać).
mbomb007,

5
@ mbomb007 szkoda, że ​​zamówienie nie może przejść w lewo / prawo i zawinąć na dół strony: P
krs013

Twój fragment o długości 8 byłby prawdziwym quine, gdybyś napisał something smells fishy...w następnym wierszu.
wizzwizz4

148

C - edycja

Dzięki za głosy! W porównaniu do innych języków i tego, co potrafią robić w ograniczonej liczbie bajtów, C wygląda na przestarzałą, wybredną i zbyt zależną od programisty. Na wiele sposobów: języki skryptowe i wyższe z automatycznym zarządzaniem pamięcią są o wiele bardziej ekspresyjne i szybsze w produkcji niż kiedykolwiek będzie C.

Dlaczego więc funkcja C?

Ukryty sekret wszystkich tych języków skryptowych polega na tym, że tłumacze są prawdopodobnie napisani w C (lub ostatnio w C ++ lub Java). Pierwsze kompilatory C ++ faktycznie skompilowane do kodu C. W rzeczywistości, dopóki nie będzie rynku dla bezpośredniego kompilatora, zwykle bardziej opłacalne jest napisanie kompilatora do wygenerowania C, a następnie skompilowanie go.

Jeśli pracujesz na bardzo małych platformach, może nawet bez dostępnego systemu operacyjnego, prawdopodobnie pracujesz w C. W dzisiejszych czasach prawie każde urządzenie ma wbudowany mikrokontroler, bez wątpienia zaprogramowany w C. Kiedy tego potrzebują mały i szybki, C jest właściwą drogą. (Również POZA, dla masochistów.)

Znajomość C zabiera cię tak blisko metalu, jak tylko możesz, bez wchodzenia w asembler i pomaga w innych językach. Masz dobry pomysł, jak prawdopodobnie działa funkcja wirtualna C ++. Wiesz, kiedy piszesz te funkcje rekursywne typu pass-by-value w PHP, że wewnętrznie robi dużo alokacji pamięci i kopiowania, więc instynktownie wypróbowujesz pass-by-referencję. Callbacki i referencje nie przerażają programistów C, może jednak Haskell tak.

Jak wspomnieli Kernighan i Ritchie we wstępie do klasycznego języka programowania C , druga edycja, C nie jest dużym językiem i nie jest dobrze obsługiwana przez dużą książkę. Staram się postępować zgodnie z tą radą: przykłady wykonują podwójny, potrójny lub większy obowiązek, jeśli to możliwe.

Wszystkie fragmenty można przynajmniej kompilować samodzielnie. Te, które można połączyć i są oznaczone jako takie. Wiem, że nie jest to wymóg, ale upraszcza to niż próba wyjaśnienia struktury wymaganej do działania dowolnego fragmentu kodu.

Próbowałem również upewnić się, że każdy fragment kodu jest tak krótki, jak to możliwe, aby nie wprowadzać dodatkowych spacji tylko po to, aby padać na określoną długość. W przypadkach, gdy kod jest wcięty, wcięcia nie są uwzględniane w długości, tylko jeden znak dla każdej nowej linii.

Faktoid

C skały.

Długość fragmentu 0

Najkrótszy na świecie program do samoreprodukcji http://www.ioccc.org/1994/smr.hint

Długość 1 fragmentu

;

C rozróżnia kompilowanie i łączenie. Wiele jednostek w C jest po prostu kompilowanych i łączonych później - przykładem są wszystkie biblioteki statyczne i dynamiczne.

Inne jednostki są po prostu uwzględnione i same nie generują kodu.

Powyższy średnik z pewnością wkompiluje się w kod obiektowy i nic nie zrobi!

Długość 2 fragmentu kodu

x;

C, jako starszy język programowania, przeszedł kilka iteracji. Najwcześniejsze w powszechnym użyciu zostały opracowane przez Kernighan i Ritchie i skrócone K&R. K&R C wyróżnia się przyjmowaniem wielu założeń dotyczących twojego kodu, jeśli nie podasz ich wprost.

W szczególności w K&R C zakłada się, że powyższy kod jest globalną liczbą całkowitą xzainicjowaną na 0. Kompilacja go w trybie K&R spowoduje utworzenie pliku obiektowego, który udostępni dowolny program łączący się z tą zmienną w celu jego wykorzystania.

Długość 3 fragmentu kodu

??/

C jest tak rozpowszechniony, że musi zapewniać funkcje kompatybilności dla systemów, które nie mają wszystkich używanych znaków. Powyżej jest trójkąt dla odwrotnego ukośnika, który jest używany w C jako znak kontynuacji linii. Powyższe zostanie skompilowane, prawdopodobnie z ostrzeżeniem, że nie ma linii po nim.

Powszechną kulturą w C jest ignorowanie ostrzeżeń kompilacyjnych, a wiele dużych baz kodu niezmiennie ma kilka lub więcej ostrzeżeń podczas ich tworzenia.

Długość 4 fragmentu kodu

f();

Ponownie w K&R powyższe jest „wypełnione”, co oznacza po kompilacji, że „Istnieje, z globalnym łączeniem, funkcję f, która zostanie zapewniona później, która pobiera stałą, ale nieokreśloną liczbę argumentów i zwraca liczbę całkowitą”.

Zwróć uwagę na podstawowe różnice między tym a f;.

Długość 5 fragmentu kodu

s="";

K&R C wyróżnia się tym, że naprawdę wybacza. Po kompilacji kod ten zapewni liczbę całkowitą sdla globalnego powiązania, która jest inicjowana na adres początkowy pustego ciągu (myślę). K&R po cichu obsługuje wszystkie koercje, w tym obcinanie, jeśli liczba całkowita nie jest wystarczająco duża, aby pomieścić adres.

Takie konstrukcje wygenerowały wiele trudnych do znalezienia błędów i dały wiele inspiracji w konkursach IOCCC.

Długość 6 fragmentu kodu

o=042;

Gotcha nawet starych timerów, wiodące 0 w literalnej liczbie oznacza, że ​​następujące cyfry są w bazie ósemkowej. Powyższy kod, po kompilacji, zapewni liczbę całkowitą odla globalnego powiązania zainicjowanego do liczby dziesiętnej 34.

Ta funkcja języka C pogryzła wielu programistów, którzy starają się uzupełnić swoje liczby, aby ich szeregi były ładne i równe!

Długość 7 fragmentu kodu

f(){f;}

Powyższy kod jest funkcją z ciałem. Ale co to robi? Pobiera adres funkcji i nic z tym nie robi! Zwykle to, co funkcja zwróci, jest niezdefiniowane. Taki nienazwalny kod często może się kompilować bez ostrzeżenia.

Długość 8 fragmentu kodu

main(){}

Reprezentuje to najkrótszy kompilowalny i możliwy do połączenia kod w C. Podczas gdy we współczesnych wersjach C funkcje zwykle nie mogą być zdefiniowane domyślnie, z powodów historycznych ograniczenie to jest złagodzone main.

Ten cud programu, który nic nie robi, ale zwraca 0, skompiluje się do nie mniej znaczącego rozmiaru i połączy w różnych procedurach środowiska wykonawczego C. Możesz skompilować i połączyć z gadatliwością ustawioną na pełną, aby zobaczyć, co się dzieje pod maską.

Długość 9 fragmentu kodu

#define Z

Podstawą plików nagłówkowych C jest #definedyrektywa preprocesora. Programy C kompilują się na różnych etapach, a na jednym z tych etapów definicje te są zastępowane ich rzeczywistymi wartościami.

Gdy brakuje argumentu, C implikuje 1, więc powyższe zastąpi 1gdziekolwiek Zjest używany w kodzie źródłowym.

Powyższe zazwyczaj umieszcza się w pliku nagłówkowym #includeid zgodnie z wymaganiami.

Długość 10 fragmentu kodu

enum{P,Q};

Słowo enumkluczowe zapewnia czasem bezpieczny sposób definiowania szeregu stałych. Podobnie jak definicje, są często używane w plikach nagłówkowych. Powyższy kod, jeśli zostanie uwzględniony, zdefiniowałby Pjako liczbę całkowitą 0 i Q1.

Długość 11 fragmentu kodu

volatile v;

Słowo volatilekluczowe ma poinformować kompilator o tym, że zmienna może zostać zmieniona przez innych agentów, a nie zakładać, że pozostanie stała między dostępami.

Długość 12 fragmentu kodu

#pragma once

#pragma once to niestandardowa, ale szeroko obsługiwana dyrektywa preprocesorowa wskazująca, że ​​bieżący plik źródłowy zostanie dołączony tylko raz w jednej kompilacji.

Tradycyjną i w pełni obsługiwaną techniką jest używanie #includeosłon z wadami dodanego kodu i możliwych konfliktów nazw.

Długość 13 fragmentu kodu

w(){for(;;);}

W C istnieje wiele konwencji, a jedną z nich jest reprezentowanie nieskończonych pętli. W tym przypadku for(;;)wskazuje brak inicjalizacji, brak kontroli wyjścia, która domyślnie wynosi 1, co oznacza prawdę - tzn. Nie przerywaj i nie ma kodu pętli.

Czasami można zrobić wszystko wewnątrz ()pętli, a sama pętla nie potrzebuje ciała. W tym przypadku na końcu dodawany jest atrapa średnika.

W powyższym kodzie, po skompilowaniu, zapewni funkcję, która wejdzie w ciasną pętlę zajętości - jedną z nie-nie w projektowaniu oprogramowania - i nigdy nie powróci.

Długość 14 fragmentu kodu

int a[]={1,2};

Tablice w C nie wymagają podanych długości. Puste nawiasy kwadratowe []informują kompilator, aby „sam się zorientował”. Jednak w C, w przeciwieństwie do innych języków, nie ma wbudowanego sposobu zapobiegania dostępowi do tablicy poza tymi granicami, co prowadzi do metafory „strzelaj sobie w nogę”, z której znany jest C.

Powyższy kod po skompilowaniu dostarczy globalną zmienną tablicę adwóch liczb całkowitych zainicjowanych 1 i 2.

Długość 15 fragmentu kodu

const long k=7;

constSpecifer jest późniejszym dodatkiem do C zapożyczona z C ++. Często zadawane pytanie brzmi: „Czy sensowne jest definiowanie zmiennej jako volatile const?”. constwraz z enumi inlinemają na celu ograniczenie polegania na #defineproblemach z bezpieczeństwem typu.

Długość 16 fragmentu kodu

extern void **q;

externsłuży do wskazania, że ​​zmienna jest zadeklarowana w innym miejscu. void *Typ jest standardowy typ rodzajowy w C, co oznacza, że nie muszą być wyraźnie oddane lub odlewane z w instrukcji przypisania. **Sekwencję operatora oznacza wskaźnik na wskaźnik, co często wdmuchuje zmysły początkujących użytkowników, ale jest w pełni uzasadniona i często stosowane C.

Długość 17 fragmentu kodu

double d=4/3-1/3;

Gdybyś wydrukował powyższe, wynik byłby jeden, i pomyślałbyś, super! Zmień się double d=4/3-2/3;i jaka jest odpowiedź? To wciąż jeden! C używa arytmetyki liczb całkowitych do obliczenia 4/3 → 1 i 2/3 → 0 oraz 1 - 0 → 1!

Długość 18 fragmentu kodu

main(){puts("!");}

Wreszcie dochodzimy do kodu, który faktycznie coś robi! putsjest ulubieńcem golfistów C, ponieważ nie wymaga użycia pliku nagłówka.

putsdoda również wyjście do wiersza. I odwrotnie, jego odpowiednik getsusunie kreski. Nigdy nie należy używać, getsz wyjątkiem ściśle kontrolowanych okoliczności - nie ma ochrony przed przepełnieniem bufora i jest główną przyczyną wielu exploitów.

Długość 19 fragmentu kodu

#include <stdlib.h>

Dołączanie plików nagłówkowych jest często osobistym podpisem programistów. Wiele obejmuje libi ioniezależnie od tego, czy są one potrzebne. Niektóre porządkują pliki nagłówkowe, więc ich długość rośnie lub maleje. Najczęściej stawiane <>wcześniej "". Osobiście korzystałem z tego podpisu w dniach TA, aby sprawdzić, czy oszukałem studentów: ten sam podpis nagłówka? przyjrzyj się bliżej!

Długość 20 fragmentu kodu

char*p=(char*)0x300;

C jest przeznaczony do stosowania na bardzo podstawowych platformach podstawowych. W niektórych przypadkach może być konieczne uzyskanie bezpośredniego dostępu do specjalnych portów zmapowanych w pamięci.

W powyższym kodzie adres portu jest zdefiniowany jako szesnastkowy 300. Dostęp do wartości portu można uzyskać za pomocą *p, jak w *p=0xff;celu włączenia wszystkich bitów lub v=*p;pobrania bieżącej wartości.

Długość 21 fragmentu kodu

int w=sizeof(double);

sizeofOperator dostarcza rozmiar bajtów typu. W nazwach zmiennych nawiasy nie są wymagane, np double d;int w=sizeof d;.

Długość 22 fragmentu kodu

asm("xorl %ecx,%ecx");

Sposób asmużycia określa kompilator. Powyżej jest przykładem kodu wbudowanego gcc dla Linuksa na platformie Intel.

Oryginalny Uniks miał małą, ale nie bez znaczenia ułamek swojego kodu w asemblerze. Nawet dzisiaj, jeśli szybkość jest najważniejsza, a przenośność absolutnie nie jest, zobaczysz, że jest używana.

W kompatybilnych systemach powyższy kod zostanie skompilowany i będzie dosłownie izolowaną instrukcją montażu bez konwencjonalnych środków dostępu do niego! BTW xor R,Rjest popularnym idiomem języka asemblera do szybkiego czyszczenia rejestru.

Długość 23 fragmentu kodu

union u{char c;int i;};

A unionzapewni przynajmniej wystarczającą ilość miejsca dla największego elementu. Możesz zobaczyć, że jest używany w połączeniu z, void *aby zapewnić wspólny typ „nieprzezroczysty” w niektórych bibliotekach. W takim przypadku połączenie będzie zwykle częścią większej struktury, przy czym struktura będzie miała pole identyfikujące typ połączenia.

Długość 24 fragmentu kodu

/*INTS*/int i,j,k;//INTS

Oryginalny komentarz C został rozdzielony jako /* comment */i pożyczył // comment to end of lineformat od C ++.

Długość 25 fragmentu kodu

int main(void){return 1;}

To jest bardziej zgodna wersja powyższego fragmentu o długości 8. Typ zwracanego typu i typy funkcji są określone i ma jawnie zwróconą wartość.

Konwencja w C polega na użyciu wartości zwracanej 0dla sukcesu i 1niepowodzenia, lub jeśli chcesz być ściśle zgodny EXIT_SUCCESSi EXIT_FAILUREjak zdefiniowano w stdlib.h.

Długość 26 fragmentu kodu

typedef struct{int x,y;}P;

typedefjest szczególnie przydatne, w szczególności typedef struct. Współczesnymi terminami można to nazwać „światłem obiektowym”.

Po uwzględnieniu powyższego kod może być używany Pjako zwykły typ w deklaracjach i funkcjach, z pełną kontrolą typu. Jednak w przeciwieństwie do C ++, nie można zdefiniować operatorów takich jak +, * lub <<, stąd „obiekt-orientacja-światło”.

Długość 27 fragmentu kodu

#define C(x,y)(((x)+1)*(y))

C ma wygodną #defineskładnię makr .

Częstym błędem początkującego jest pomijanie nawiasów wewnętrznych i / lub zewnętrznych, co powoduje trudne do znalezienia błędy pierwszeństwa operatora.

Długość 28 fragmentu kodu

struct f{int s:1,e:8,m:23;};

C może jawnie definiować pola bitowe, które można przypisywać, odczytywać i manipulować jak dowolną liczbą całkowitą.

Powyższe jest przybliżeniem struktury danych zmiennoprzecinkowych o pojedynczej szerokości IEEE.

Długość 36 fragmentu kodu

f(unsigned x){return!!x&!(x&(x-1));}

W wielu językach nie musisz przejmować się reprezentacją liczb. W C musisz dokładnie wiedzieć o ich wewnętrznej reprezentacji.

Najlepszym przykładem tego, jaki mogę wymyślić, jest ustalenie, czy liczba całkowita jest potęgą dwóch {1, 2, 4, 8, ...}. Ci, którzy nie znają C, będą wykonywać pętle i przesunięcia oraz wszelkiego rodzaju rzeczy dla czasu wykonania O (log (n)), nieźle, ale powyżej jest funkcja, która zrobi to samo w czasie wykonywania O (1). Zostawię to jako ćwiczenie dla czytelnika, aby potwierdzić, że działa, ale naprawdę działa ...

!!Konwencja jest często używany w celu zmuszenia liczbę całkowitą od zera i nie zera do 1 i 0 odpowiednio. Wielu programistów C lubi takie sztuczki (często wbrew tym, którzy cenią sobie przejrzystość kodu).

Super zapaleni programiści C mogą potwierdzić, że powyższe będzie działać na skompresowanym i podpisanym sprzęcie. Dla tych, którzy zastanawiają się, prawie na pewno pracujesz teraz nad sprzętem z dwoma komplementami. Tylko prawdziwie szczęśliwi (lub pechowi, zależnie od twojej perspektywy) muszą się o to martwić!

Długość 48 fragmentu kodu

#include<complex.h>
double complex c=3.0+I*4.0;

C99 obejmuje obsługę liczb zespolonych. Jak widać z kodu, ma on postać modyfikatora dla prawdziwego typu. Można również użyć, int complex c=3+I*4;ale wewnętrznie wymusza to typ zmiennoprzecinkowy. Powyższy kod zostanie skompilowany w gcc przy użyciu gcc -std=c99 -c length-48.c.

Jeśli chcesz zobaczyć więcej elementów wewnętrznych, spróbuj skompilować za pomocą przełącznika -E. W mojej wersji gcc powyższa deklaracja staje się double _Complex c=3.0+(__extension__ 1.0iF)*4.0;. Zauważ, że typ złożony jest znaczącym dodatkiem do języka, a nie tylko kilkoma tanimi makrami.

To tylko zwiastun, gdy dojdziemy do ponad 125 znaków, możemy zacząć dobrą zabawę ze złożonymi liczbami!

Długość 51 fragmentu kodu

#include <math.h>
main(){double d=sqrt(sin(3.2));}

Z różnych powodów C nie łączy się automatycznie ze standardowymi funkcjami matematycznymi, takimi jak sin, cos, tan, sqrt itp. Więc jeśli są używane, ale nie połączone, programista zostanie wyświetlony z błędem linkera niezdefiniowanym odniesieniem do „sqrt” lub inny błąd.

W gcc powyższy kod zostanie skompilowany i użyje linku gcc length-51.c -lm.

Uwaga sin(3.2)zwróci liczbę ujemną, której pierwiastek kwadratowy nie jest dozwolony w prawdziwej domenie. W C zwracana NaNjest specjalna wartość wskazująca ten błąd, który program może zignorować!

W C99 dostępnych jest wiele nowych funkcji obsługi wyjątków, które zapewniają bardzo bezpieczną i precyzyjną kontrolę tego rodzaju błędów matematycznych, z których prawie nikt nie korzysta!

Długość 63 fragmentu kodu

static int w;static int X(int x){static int s=0;s^=x;return s;}

Lub sformatowane bardziej rozsądnie:

static int w;
static int X(int x)
{
    static int s=7;
    s^=x;
    return s;
}

Jak można się domyślić, chodzi tu o słowo kluczowe, staticktóre ma więcej niż jedno znaczenie w C.

W pierwszych dwóch przypadkach staticinformuje kompilator, że liczba całkowita wi funkcja Xnie są widoczne poza tym plikiem lub jednostką kompilacji, tj. Są one wewnętrzne.

Funkcje te nie mają być wywoływane zewnętrznie, więc mogą nie sprawdzać poprawności argumentów i przecinać inne rogi. Ponieważ mają one zakres wewnętrzny, można przedefiniować wi Xw innych plikach, i zwykle będą one osobne.

W ostatnim przypadku staticwskazuje, że liczba całkowita szachowuje swoją wartość między wywołaniami funkcji. Przy pierwszym Xwywołaniu, sbędzie to jego wartość początkowa 7, gdy zostanie wyłączna z ORed x, nowa wartość zostanie zachowana.

Wewnętrznie, chociaż jest zależne od implementacji, zwykła organizacja pamięci znajduje ssię na stercie, a konkretnie pamięć zainicjowana, podczas gdy argument xznajduje się na stosie. Miejsce, w którym znajdują się zmienne, jest ważne, jeśli chcesz na przykład zaimplementować algorytmy rekurencyjne.

Gotcha w C to zderzenia ze zmiennymi globalnymi. Do wi Xsą zdefiniowane jako static, jeśli są gdzieś zdefiniowane globalnie, wtedy wi Xbędą odnosić się do jednostek globalnych.

Tutaj qi wnie mogą być inicjowane na tej samej wartości, ponieważ globalny wjest używany do ustawiania q:

static int q = w;
static int w;

Jeśli globalny wnie istnieje, kompilacja powinna zakończyć się niepowodzeniem.

Tutaj qi wzostanie zainicjowany na tę samą wartość:

static int w;
static int q = w;

Zazwyczaj projektanci ograniczają konflikty nazw, dodając charakterystyczny prefiks lub sufiks do swoich globalnych zmiennych i funkcji.

W C99 staticzyskał inne zastosowanie, np. int Y(int a[static 10]);Co oznacza, że ​​istnieje funkcja, Yktóra przyjmuje tablicę co najmniej 10 liczb całkowitych.

Długość 74 fragment

void f(register int*p,register int*q,register int l){while(l--)*p++=*q++;}

Lub ładnie ułożone:

void f(register int *p, register int *q, register int l)
{
    while (l--)
        *p++ = *q++;
}

Słowo kluczowe registerdaje kompilatorowi wskazówkę, że skorzystanie z rejestrów sprzętowych byłoby tutaj korzystne. Powyższa funkcja skopiuje lliczby całkowite z qdo p, używając rejestrów sprzętowych, jeśli to możliwe.

Czasami przyspieszenia mogą być znaczące. Na przykład, w rodzinie mikroprocesorów 68K, linia *p++ = *q++może zostać przetłumaczona na jedną instrukcję w MOVE.W (Ap)+,(Aq)+porównaniu do sześciu lub ośmiu, jeśli nie użyjesz register. 68K mikroprocesor miał wyraźny postinkrementacji i tryby pre-Decrement, więc doświadczonych dewelopera, gdyby wiedział platformę, by dostosować za pomocą kodu x++i --yvs. ++xi y--.

Obecnie kompilatory przeważnie ignorują register, poza tym, że nie pozwalają na pobranie adresów (np. Powyższe &lspowodowałoby błąd kompilatora).

Długość fragmentu kodu 88

#include<stdio.h>
int f(int x){return(x>1)?x*f(x-1):1;}int main(){printf("%d\n",f(12));}

Lub z bardziej rozsądnym układem:

#include <stdio.h>

int f(int x)
{
    return (x > 1)? x * f(x - 1): 1;
}

int main()
{
    printf("%d\n", f(12));
}

Ach, rekurencja! Snippet to kompletny program do kompilacji, łączenia i uruchamiania. Funkcja foblicza silnię swojego argumentu xza pomocą rekurencyjnej formuły f (x) = x * f (x - 1). Czynniki stają się duże naprawdę szybko, więc na przykład f(12)jest to największa wartość, jaką można uzyskać w 32-bitowej liczbie całkowitej ze znakiem.

Aby zobaczyć przykład naprawdę rekurencyjnego kodu, spójrz na naiwne implementacje funkcji Ackermann .

Inteligentne kompilatory mogą zoptymalizować funkcję, używając podpowiedzi inlinei „rozwijając” funkcję, gdy stałe są podawane jako argumenty, dzięki czemu:

f(12)

Staje się:

12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

Bez żadnych wywołań funkcji!

Inne kompilatory mogą reorganizować funkcję:

int f(int x)
{
    return (x < 2)? 1: f(x - 1);
}

I zaimplementuj coś, co nazywa się rekurencją ogona. To w efekcie zastępuje ostatnie wywołanie funkcji prostym goto i pozwala tej funkcji zająć się zwrotem. Korzyścią jest mniejsze nakładanie stosu, szybszy i mniejszy kod.

W języku asemblera tego rodzaju możliwości optymalizacji są naprawdę łatwe do wykrycia i można je wdrożyć za pomocą czegoś zwanego „optymalizatorem dziurki od klucza”, który zasadniczo szuka małych wzorów i zamienia je na coś szybszego i / lub mniejszego.

Długość 117 fragmentu kodu

#include<stdio.h>
int main(int c,char**v){int a,b;sscanf(v[1],"%d%*[\t ,]%d",&a,&b);printf("%d\t%d\n",a,b);return 0;}

Lub:

#include <stdio.h>

int main(int c, char **v)
{
    int a, b;

    sscanf(v[1], "%d%*[\t ,]%d", &a, &b);
    printf("%d\t%d\n", a, b);

    return 0;
}

C zapożyczony z ówczesnych języków, koncepcja uniwersalnego I / O, który może być konsekwentnie stosowany do dowolnego urządzenia, czy to konsoli, karty dziurkacza, taśmy, dysku lub drukarki, ale w prawdziwej formie C, pozwolił twórcy stworzyć bardzo zwięzłe, ale potężne stwierdzenia.

W powyższym fragmencie pobierze dane z wiersza poleceń, przeanalizuje dwie liczby całkowite oddzielone spacjami, tabulatorami lub przecinkami i wyświetli je. Wykorzystuje nowszy scanfspecyfikator, %*[\t ,]który: [\t ,]wyciągnie wszystkie tabulatory, spacje i przecinki oraz: *zignoruje je.

Pamiętam, jak zmieniłem kod C ++, w którym programista robił wszystko „czysto” w C ++ <<i arsenał metod takich jak findi substr. Miał co najmniej tuzin linii i nadal nie mógł obsługiwać przecinków jako ograniczników. Cały ten nieporęczny kod zastąpiłem pojedynczą sscanflinią jak wyżej!

Długość fragmentu 132

#include<stdio.h>
int main(int c,char**v){while(--c){++v;printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n",*v,*v,*v,*v,*v);}return 0;}

Lub:

#include <stdio.h>

int main(int c, char **v)
{
    while (--c)
    {
        ++v;
        printf("|%s|\n|%5s|\n|%-5s|\n|%.5s|\n|%5.5s|\n", *v, *v, *v, *v, *v);
    }

    return 0;
}

Funkcje printf, sprintf, fprintfitd. Format Użyj Specyfikatory aby określić szerokość i wyściółkę wyjścia.

Skompiluj i uruchom powyższe, używając argumentów wiersza poleceń, aby zobaczyć różne dane wyjściowe:

> main xyz 123456
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                              
|xyz  |                                                                                                                                              
|xyz|                                                                                                                                                
|  xyz|                                                                                                                                 
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|123456|                                                                                                                                             
|12345|                                                                                                                                              
|12345| 

Zanotuj .5ogranicza wyjście specyfikatorem do w większości pięciu znaków, natomiast wiodącym 5zapewnia wyjście jest na co najmniej pięć znaków, z -oznaczający lewy wyrównanie. Połączenie ich ustawia wynik na dokładnie pięć znaków.


4
Nie sądzę, że trzeba było dodać nowy faktoid dla każdego upvote :)
Optimizer

28
Powszechną kulturą w C jest ignorowanie ostrzeżeń dotyczących kompilacji , nie sądzę, aby było to bliskie prawdy!
Shahbaz

4
Jeśli masz duży projekt i rozważasz wiele kompilatorów, próba wyeliminowania wszystkich ostrzeżeń może być dość daremna.
feersum

5
To jest doskonałe
Kik

4
Jestem programistą języka C i nie boję się Haskella.
Shahbaz

138

Kod maszynowy x86

Faktoid:

Kod maszynowy x86 to zmontowana wersja zestawu x86, który procesor faktycznie uruchamia. Został on opracowany, gdy pamięć i miejsce do przechowywania były drogie, i został zaprojektowany tak, aby był nieco kompatybilny wstecz aż do Intel 8008. Utrzymanie małego kodu wykonywalnego było jednym z celów i wykorzystuje instrukcje o zmiennej długości oraz architekturę CISC, aby pomóc Osiągnij to (co miało tę wadę, że utrudniło poprawę wydajności nowoczesnych procesorów). To, wraz z samą zasadą asemblera i ogólnie kodem maszynowym, daje programom x86 możliwość bycia wyjątkowo kompaktowym.

Długość 1:

Teraz pierwszy program:

0xC3

Otwórz edytor szesnastkowy, wprowadź ten bajt i zapisz go jako test.com.

Masz teraz prawidłowy program MS-DOS, który natychmiast wraca bez robienia czegokolwiek, ponieważ 0xC3 jest instrukcją „RET”. Pokazuje to jednak inny interesujący aspekt gry w golfa z x86: format pliku .com. Ten format wykonywalny absolutnie nie ma nagłówka - plik jest po prostu ładowany do pamięci, poczynając od adresu 0x100, a następnie wykonywanie rozpoczyna się od 0x100. Oznacza to brak bajtów zmarnowanych na metadane!

Długość 2:

Nasz następny program:

0x4D 0x5A

lub „MZ” w ASCII.

Ok, oszukałem trochę, to naprawdę nie jest przydatny program, ponieważ odpowiada instrukcjom

DEC     BP
POP     DX

Które w rzeczywistości nie są przydatne do uruchomienia programu .com. W rzeczywistości to jest sedno tych dwóch wartości - żaden rozsądny plik .com nie powinien zaczynać się od nich! Pliki .com miały rozmiar do 65280 bajtów (64 KB - 0x100), więc kiedy zaczęły być potrzebne większe programy, trzeba było opracować nowy format. To był format pliku .exe, który ma nagłówek. Jednak MS-DOS musiał zachować rozszerzenie .com na niektórych komponentach w celu zachowania kompatybilności wstecznej, więc potrzebował sposobu na wykrycie, czy plik .com był naprawdę .exe. Wybrano żądło „MZ” jako tę magiczną liczbę i do dziś, jeśli otworzysz plik .exe (lub .dll) systemu Windows w edytorze szesnastkowym, zobaczysz, że zaczynają się od tych dwóch bajtów. Bawi mnie, że nawet najnowocześniejszy program Windows zaczyna się od ograniczenia kompatybilności z lat 70-tych.

Długość 3:

Teraz nieskończona pętla:

41 E2 FD

Co przekłada się na

start:
inc cx
loop start 

Ten program zwiększa wartość CX (która na początku będzie wynosić> 0), a następnie wykonuje instrukcję pętli. Pętla jest doskonałym przykładem instrukcji CISC, ponieważ łączy 3 proste operacje w jedną operację specjalnego przeznaczenia: zmniejsza wartość CX, sprawdza, czy wynosi 0, i przeskakuje do etykiety docelowej, jeśli nie. Istnieją również formy pętli, które sprawdzają inne flagi oprócz kończenia, gdy CX wynosi 0. Mogliśmy zrobić „skok startowy” dla 2-bajtowej nieskończonej pętli, ale było to bardziej interesujące.

Długość 4:

Program, który jest minimalnie przydatny:

40 CD 10 C3

Przetłumaczone na montaż:

inc ax    ; 1 byte
int 10h   ; 2 bytes
ret       ; 1 byte

Ten program ustawia konsolę na 40x25 znaków, czyści ekran, a następnie wraca do wiersza poleceń. AX jest ustawiony na żądany tryb wideo (1), następnie wywoływane jest przerwanie systemu BIOS 10h, aby faktycznie ustawić tryb wideo i wyczyścić okno, przed powrotem. Spodziewaj się, że w przyszłości pojawi się więcej takich przerwań BIOS.

Długość 5:

Możemy teraz wdrożyć program pauzy:

B4 01 CD 21 C3

Przetłumaczone na montaż:

mov ah,1  ; 2 bytes
int 21h   ; 2 bytes
ret       ; 1 byte

Ten program informuje system BIOS, aby czekał na naciśnięcie klawisza, i wyświetla go na ekranie przed powrotem. Pokazuje to również, jak na x86 niektóre rejestry można częściowo odczytać lub zapisać. W takim przypadku ustawiamy górny bajt AX (AH) na 1. W procesorach 32-bitowych można także operować na niskich 16 bitach bez wpływu na górne 16 bitów. Ta możliwość modyfikowania rejestrów częściowych może być przydatna dla programistów asemblacyjnych, ale ma wady dla współczesnych procesorów próbujących wykonać wykonanie poza kolejnością , ponieważ mogą one wprowadzać fałszywe zależności danych.

Długość 9:

Teraz, aby faktycznie wyświetlić dane wyjściowe:

68 00 B7 07 AB 40 79 FC C3

Przetłumaczone na montaż:

; These two instructions set up ES, the 'extra segment'
push 0xb700 ; 3 bytes
pop  es     ; 1 byte
label:
stosw       ; 1 byte, Store Word - Copy AX to [ES:DI] then add 2 to DI
inc  ax     ; 1 byte
jns  label  ; 2 bytes, Jump Not Signed - Jump unless the sign flag is set (when inc AX yields 0x8000
ret         ; 1 byte

Dane wyjściowe to domyślny zestaw znaków powtarzany w różnych kolorach. Niższy bajt AX to kod znaku, a wysoki bajt określa kolory, które mają być użyte. Domyślny zestaw znaków powtarzany w różnych kolorach

Programy 16-bitowe mogą adresować bezpośrednio tylko do 64 KB. Aby obejść ten problem, x86 użył „segmentów” - specjalnych rejestrów, które zostaną pomnożone przez 16 i dodane do wszystkich dostępów do pamięci, aby uzyskać 20 bitów pamięci adresowalnej. Program może zmienić wartości tych rejestrów segmentów w celu uzyskania dostępu do większej ilości pamięci - lub specjalnych obszarów pamięci: ten program modyfikuje dodatkowy segment w celu zapisu do pamięci wideo. Różne typy dostępu do pamięci wykorzystywały różne rejestry segmentów, umożliwiając dostęp do kodu, danych i stosu jednocześnie w różnych częściach pamięci. Domyślny segment można również zastąpić w przypadku wielu instrukcji.

Długość 20:

Zróbmy coś rozpoznawalnego - użyjemy „Reguły 90” do narysowania trójkątów Sierpińskiego.

B0 13 CD 10 68 0F A0 1F AC 31 C2 88 94 3E 01 87 D3 93 EB F4

W montażu:

mov al,13h      ; 2b
int 10h         ; 2b - Set the video mode to 13h

push    0xA00F  ; 3b
pop     ds      ; 1b - Set the data segment to video memory

start:          ; This loop runs 'Rule 90' to draw Sierpinski triangles
lodsb           ; 1b - load al with [ds:si] then increment si

xor     dx,ax   ; 2b - xor the left and right values of the previous row of pixels
mov     [si+318],dl ;4b - store result to memory

xchg    dx,bx   ; 2b - swap register values
xchg    ax,bx   ; 1b - swapping with ax is 1 byte shorter

jmp     start   ; 2b - infinite loop

Przykładowe dane wyjściowe: Trójkąty Sierpińskiego

W tym programie używamy nieco znanego „Trybu 13” - trybu graficznego o rozdzielczości 320 x 200 z 256 kolorami. Był używany przez wiele popularnych gier DOS , takich jak Doom.

Długość 21

Zobaczmy, kto wyprodukował procesor, na którym działamy.

0F A2 66 60 BB EE FF B9 0C 00 8A 17 43 B4 02 CD 21 E2 F7 FF E1

Przetłumaczone na montaż:

cpuid         ; 2b  CPU ID - retrieve processor information based on the value in AX. For AX=0,
              ;     the 12 bytes in EBX, ECX, and EDX are loaded with a vendor identification string
pushad        ; 2b  Push all registers on the stack (32 bit version)
mov  bx,0xffee; 3b  Start of the vendor identification string on the stack
mov  cx,12    ; 3b  12 characters to print
print:    
mov  dl,[bx]  ; 2b  Character to print
inc  bx       ; 1b  Advance string position
mov  ah,2     ; 2b  Set AH to the 'Print character to STDOUT' value
int  21h      ; 2b  Call the bios interrupt to print
loop print    ; 2b  Decrement CX and jump if it is not zero
jmp  cx       ; 2b  Instead of restoring the stack, just jump right to the exit point

Przykładowe dane wyjściowe:

c:\misc>cpuid.com
GenuineIntel

Ten program używa instrukcji CPUID, aby uzyskać informacje o procesorze, na którym jest uruchomiony, w szczególności ciąg identyfikacyjny dostawcy. Większość ludzi zobaczy „GenuineIntel” lub „AuthenticAMD”, chyba że ma nietypowego producenta procesora lub działa na niektórych maszynach wirtualnych.

Długość 26

Możemy teraz tworzyć ciekawe animacje

B0 13 CD 10 C4 07 BB 40 01 59 99 89 F8 F7 F3 31 D0 AA E2 F6 26 FE 05 47 EB FA

W Zgromadzeniu

mov al,13h     ;2b
int 10h        ;2b Enter Video Mode 13h

les ax,[bx]    ;2b Set ES to (roughtly) video memory
mov     bx,320 ;3b Set up  BX asdivisor
pop     cx     ;1b Zeroize CX

start:
cwd            ;1b Sign extend AX to DX, AX will never have the sign bit set so this zeroizes DX in 1 byte
mov     ax,di  ;2b Copy video memory pointer
div     bx     ;2b Divide by width to get AX = Y pos, DX = X pos
xor     ax,dx  ;2b X pos ^ Y pos
stosb          ;1b Store and increment video pointer
loop    start  ;2b CX starts at 0, so this will loop until it wraps around

cycle:
inc     byte [es:di];3b Increment value in video memory to animate
inc     di     ;1b Increment video memory pointer
jmp     cycle  ;2b Infinite loop 

Wyjście będzie wyglądać następująco:

Marsz XOR

Funkcja X pos ^ Y pos tworzy interesujący fraktal, zwłaszcza gdy jest animowany

Długość 27

Nie tylko możesz generować tekst i grafikę w małym programie x86 .com, ale także generować dźwięk i muzykę:

BA 31 03 B0 3F EE BA 30 03 B0 93 EE B4 01 CD 21 3C 1B EE 3C 1B B0 7F EE 75 EC C3

W montażu:

    mov dx,0x331            ; value for the midi control port
    mov al,0x3F             ; command value to set midi mode to UART
    out dx,al               ; output the command to the midi control port
play_loop:
    mov dx,0x330            ; value for the midi data port
    mov al,0x93             ; midi instrument value (piano)
    out dx,al               ; output to midi data port
    mov ah,1
    int 0x21                ; read character from stdin, with echo
    cmp al,27               ; test if it is escape
    out dx,al               ; output the ascii value as the midi note to play
    mov al,0x7F             ; note duration
    out dx,al               ; output note duration
    jne play_loop           ; loop if escape was not pressed
    ret  

Ten program używa karty midi do zmiany klawiatury w fortepian. Aby to zrobić, karta midi jest ustawiona na tryb UART, który odtwarza nuty midi, gdy tylko zostaną odebrane. Następnie program czeka na naciśnięcie znaku i wysyła wartość ASCII jako notatkę do karty midi. Program działa do momentu naciśnięcia klawisza Escape.

Długość 29

Użyjmy iterowanego systemu funkcji, aby wygenerować fraktal Dragon Curve:

B0 13 CD 10 89 D0 01 CA 29 C1 D1 FA D1 F9 73 03 83 E9 7A B4 01 CD 16 B8 02 0C 74 E6 C3

Przetłumaczone na montaż:

mov  al,13h
start:
int  0x10    ; This does double duty, setting the video mode to 13h at program start,
             ; and calling the 'draw pixel at coordinates' interrupt when looping
mov  ax,dx   ; The next couple instructions are our IFS, the algorithm is aproximately
add  dx,cx   ; f(y) = 0.5x + 0.5y
sub  cx,ax   ; f(x) = 0.5x - 0.5y OR f(x) = 0.5x - 0.5y - 1
sar  dx,1    ;
sar  cx,1    ;
jnc  skip    ; This jump handles pseudo-randomly switching between the two functions for x,
             ; based on if the previous value of x was odd or not.
sub  cx,122  ; Magic number, chosen since it provides sufficent 'randomness' for a filled in
             ; fractal and a good scale to the fractal. 102 and 130 also work.
skip:
mov  ah,1
int  0x16    ; Get keyboard state, zero flag will be set if no key has been pressed
mov  ax,0xC02; Set up AH for the draw pixel function when int 0x10 is executed,
             ; AL = color, CX = column, DX = row
jz   start   ; Loop if a key hasn't been pressed
ret  

Wynik:

Dragon Curve

Naciśnięcie klawisza niekontrolowanego spowoduje zamknięcie programu. Jest to oparte na Fire Coral by Desire na Pouet.net.

Długość 52

Ten program jest trochę podwójną funkcją, pokazuje trochę koprocesora zmiennoprzecinkowego x87 i samodomodyfikującego się kodu.

B3 07 D9 E8 B1 11 DE 0E 32 01 E2 FA BE 0A 24 56 B1 09 DF 34 AC D4 10 
86 E0 05 30 30 50 E2 F5 44 B4 2E 50 89 E2 B4 09 CD 21 FE 06 03 01 4B
75 D2 CD 20 0A 00

Po uruchomieniu program wyświetli kilka stałych matematycznych:

1.00000000000000000
3.32192809488736235
1.44269504088896341
3.14159265358979324
0.30102999566398120
0.69314718055994531
0.00000000000000000

Są to One, Log2 (10), Log2 (e), Pi, Log10 (2), Log e (2) i Zero.

W montażu:

org 100h

mov     bl,7         ;Counter for the total number of constants to print
start:
fld1                 ;Floating point constant to load on the FP stack,
                     ;start with 1 since it's op-code is the lowest

mov     cl,17        ;Multiply the constant by 10, 17 times to get the
mult:                ;printing part as an integer
fimul   word[ten]
loop    mult

mov     si,10+'$'*256;ASCII new line (10) and the end-of-string ($)
                     ;characters. These are used both as
push    si           ;a constant memory location, and stored to the
                     ;stack to format and printing

mov     cl,9         ;print 18 digits (9 pairs)
fbstp   [si]         ;store the integer part of the floating point
                     ;number on top of the FP stack as a packed
                     ;binary-coded decimal number (1 digit/nibble),
                     ;and then pop the number off the FP stack

convert:
lodsb                ;load a pair of packed digits

db 0xd4,16 ; AAM 16  ;ASCII Adjust For Multiply instruction using
                     ;non-standard base 16. This puts AL/16 in AH,
                     ;and AL%16 in AL, unpacking the digit pair.

xchg    ah,al        ;Swap the digit order
add     ax,'00'      ;Convert the digits to ASCII values
push    ax           ;Store digits on the stack
loop    convert

inc     sp           ;AX now holds the 1st 2 digits to print,
mov     ah,'.'       ;so to insert a decimal point, the 2nd digit
push    ax           ;is replaced with a '.', the stack pointer
                     ;is adjusted to overwrite 1 byte, and then
                     ;AX is pushed on the stack

mov     dx,sp        ;Load DX with the start of the print string
mov     ah,9         ;Load AH with the 'Print String' constant
int     21h          ;Call the 'Print String' interrupt to display
                     ;the constant

inc     byte[start+1];Self-modifying code - increment the load
                     ;floating point constant op-code to iterate
                     ;through all of them

dec     bx
jnz     start        ;Exit when all 7 constants have been printed
int     20h


ten: dw  10

Matematyka zmiennoprzecinkowa w systemach x86 była pierwotnie obsługiwana przez opcjonalny koprocesor x87, dopiero 486 został przeniesiony na ten sam układ. X87 miał również inną architekturę, był oparty na stosie, z 8 dostępnymi rejestrami 80-bitowymi. Miał także różne tryby zaokrąglania, precyzję i możliwe do maskowania wyjątki, które można ustawić.

Ten program wypisuje wartości dla siedmiu stałych upieczonych w procesorach. Może wydawać się dziwne, że przestrzeń instrukcji byłaby marnowana na proste stałe, takie jak 0 i 1, ale należy pamiętać, że zestaw instrukcji został utworzony, gdy pamięć była mała, a instrukcje te są zwykle o 2 bajty mniejsze niż równoważne operacje. Program wykorzystuje również niejasną instrukcję, FBSTP -'Store BCD Integer and Pop '. Kiedy opracowywano x86, operacje na numerach BCD były bardziej powszechne, a x86 / x87 ma kilka instrukcji specjalnie w celu uproszczenia matematyki BCD, takich jak instrukcja AAM „ASCII Adjust for Multiple” również używana w programie.

W niechronionym modelu pamięci stosowanym we wczesnych programach x86 nie ma rozróżnienia między danymi a kodem. Z tego powodu łatwo jest iterować sekwencyjnie zakodowane instrukcje „Stała obciążenia”, po prostu zwiększając odpowiednią wartość.

Długość 64

Przesyłając mój wpis do Mandelbrot Challenge , można napisać program, który wyświetla kolorowy fraktal Mandelbrot 320 x 200 w zaledwie 64 bajtach.

B0 13 CD 10 C4 07 99 89 F8 B9 40 01 F7 F1 83 E8 64 FE CE 31 DB 31 F6 
89 F5 0F AF F3 01 F6 0F AF DB 70 19 0F AF ED 70 14 01 EB 70 10 29 EB
29 EB C1 FB 06 01 D3 C1 FE 06 01 C6 E2 DB 91 AA EB C6

W montażu:

mov al,13h ; set up graphics mode 13
int 10h

les ax,[bx]; trick to set video memory

FillLoop:
cwd
mov ax,di  ; di is the current position on screen
mov cx,320 ; convert di int x,y screen coordinates
div cx     ; CX is the iteration counter, exit the loop if it hits
           ; zero before the value escapes.
sub ax,100 ; center the fractal vertically
dec dh     ; center the fractal horizontally

xor bx,bx
xor si,si

MandelLoop: ; Fairly standard Mandelbrot routine,
mov bp,si   ; exits if the values overflow
imul si,bx
add si,si
imul bx,bx
jo MandelBreak
imul bp,bp
jo MandelBreak
add bx,bp
jo MandelBreak
sub bx,bp
sub bx,bp

sar bx,6   ; We use fixed point math with the lowest 6
add bx,dx  ; bits being the fractional portion, so this
sar si,6   ; rescales the values after multiplication
add si,ax

loop MandelLoop

MandelBreak:
xchg ax,cx ; Write the escape itteraction as the color
stosb
jmp FillLoop

Efektem końcowym jest ten obraz:

Fraktal Mandelbrota

Ten program używa matematyki stałoprzecinkowej do generowania fraktala, ponieważ zajmuje mniej bajtów. Najniższe 6 bitów z 16-bitowych rejestrów uważa się za ułamkową część liczby, a wartości są ponownie skalowane po pomnożeniu.


7
Ze wszystkich języków, które można zobaczyć w PPCG, nie spodziewałem się tego.
Alex A.

23
Łał. Plus inne postacie, aby dodać komentarz. Ale poważnie. Łał.
krs013

2
@Michael Edenfield Do tego właśnie służy DOSBox!
Sir_Lagsalot

1
20 bajtów Sierpińskiego robi wrażenie.
qwr

1
Uważam się za dobrego programistę, ale kiedy na to patrzę, muszę przyznać się do porażki.
Stephan Bijzitter

121

Haskell

Możesz przeczytać od podstaw. Czasami odnoszę się do niższych fragmentów, ale nigdy do wyższych, więc może to pomóc w zrozumieniu.

Czytelnicy, którzy nie znają Haskell: czy jestem czysty? Kiedy nie jestem jasny? Nie umiem powiedzieć

Długość fragmentu 86

Składana instancja naszej struktury danych drzewa (fragment 23). Foldable to klasa typów - jak w klasie (/ group) typów. Są one równoległe do interfejsów w Javie. Zasadniczo uogólniają na typy, jednocząc typy, które mają wspólne cechy; na przykład można je dodawać razem ( Monoid), pojemniki ( Functor), mogą być drukowane jako tekst ( Show, który już poznaliśmy, w showfunkcji) i tak dalej. Ten ujednolica typy danych, które są podobne do list, dzięki czemu można je iterować lub spłaszczać na liście.

W tym fragmencie definiujemy instancję poprzez zdefiniowanie foldr, które zasadniczo iteruje typ danych od prawej do lewej. Teraz możemy użyć wielu ogólnych gotowych kodów. Po pierwsze, możemy zdefiniować funkcję pomocnika, aby uzyskać singleton drzewa, aby uniknąć bałaganu: s a = N E a E. Teraz:

sum (N (s 3) 7 (N E 5 (s 8))     === 23
product (N (s 3) 7 (N E 5 (s 8)) === 840
toList (N (s 3) 7 (N E 5 (s 8))  === [3,7,5,8]

i tak dalej.

Oto zdjęcie naszego drzewa:

7
| \
3  5
    \
     8

Długość 70 fragmentu kodu

primes=sieve[2..] where
 sieve(p:xs)=p:sieve(filter(\x->x`mod`p/=0)xs)

To główne sito!

(uwaga: /=jest to, co !=jest w innych językach)

Działa to poprzez zdefiniowanie funkcji, sievektóra filtruje listę i zachowuje tylko liczby, które nie są podzielne przez żadną poprzednią liczbę pierwszą. Jest definiowany rekurencyjnie - sievedefiniowany jest jako podział listy na pierwszy element pi ogon, filtrowanie z ogona dowolnej liczby podzielnej przez p, sievepozostały bit, dołączanie pdo początku tego i powrót.

Ponownie pracujemy tutaj z nieskończonymi listami - ale obliczenia zostaną zatrzymane w czasie, o ile nie będziesz musiał obliczać nieskończonej liczby liczb pierwszych.

take 4 primes === [2,3,5,7]

Długość 68 fragmentu kodu

Wreszcie quine!

main=do putStr s;print s where s="main=do putStr s;print s where s="

Po raz pierwszy czytając ten tekst, możesz pomyśleć, że w wynikach tego quinu brakuje znaków cudzysłowu i dlaczego miałbyś pisać putStrraz, a raz print? Brzmi tak samo.

W Haskell putStrjest funkcją, która po prostu drukuje zawartość ciągu, który dostaje na standardowe wyjście; printdrukuje jednak rzeczy na standardowe wyjście. Jest więc print 4równoważne putStr "4\n", ale putStr 4bezsensowne - 4nie jest łańcuchem! Kiedy więc printpobiera wartość, najpierw konwertuje ją na ciąg, a następnie drukuje ten ciąg. Ogólnie rzecz biorąc, sposobem konwersji rzeczy na ciągi znaków jest znalezienie sposobu zapisania ich w kodzie. Więc sposób, w jaki napisałbyś ciąg abcw ciągu w kodzie Haskell, jest "abc"taki, że tak print "abc"naprawdę drukuje "abc", a nie abc.

Całe szczęście, że mam teraz wystarczającą liczbę głosów, nie będę musiał grać w golfa

Długość fragmentu 33:

main=go 0
go n=do print n;go(n+1)

Należy zauważyć, że nie korzystaliśmy z pętli. Haskell nie zapętla się. Haskell powraca. Haskell nie ma pętli. To jest głębsze: Haskell nie ma nawet kontroli . Jak możesz zapytać? Cóż, nie potrzebuje żadnych.

Dalej ze szczegółami. Ten program wypisuje nieskończenie rosnącą sekwencję liczb całkowitych, zaczynając od 0. gowypisuje je zaczynając od swojego wejścia, a następnie mainwywołuje 0.

dojest specjalną mocą syntaktyczną Haskell. W tym scenariuszu po prostu łączy on operacje we / wy, tak jak to >>robi (patrz fragment 22).

Długość fragmentu 26:

map f=foldr(\x y->f x:y)[]

To definiuje mapfunkcję, prawdopodobnie znaną wszystkim, używającą foldr. Zauważ, że chociaż nie zadeklarowaliśmy maptypu, komputer w jakiś sposób wie, że jest to typ (a -> b) -> [a] -> [b], tzn. Biorąc pod uwagę funkcję od ado bi listę as, zwraca listę bs.

Skąd to wiedział? ;-)

Długość 25 fragmentu:

main=putStr"Hello World"

Standardowy Hello World. Zwróć uwagę na typy: mainma typ IO ()i putStrma typ String -> IO ()(funkcja od ciągów znaków po działania we / wy, które nic nie zwracają).

Długość fragmentu 23:

data T a=E|N(T a)a(T a)

To jest standardowa definicja drzewa. O ile łatwiejsze niż wszystkie te wiersze wymagane do zdefiniowania drzewa w Javie, C lub cokolwiek innego.

(patrz fragment 10)

Rozbijmy to:

data- ta deklaracja deklaruje typ danych. T a- drzewo zawierające elementy typu a. To jest typ, który definiujemy. =- każda wartość T abędzie dowolną z poniższych, oddzieloną potokiem |. E- jedna z możliwych wartości T s- pustego drzewa. N (T a) a (T a)- inna możliwa wartość drzewa - węzeł. Każdy węzeł składa się z lewego (T a)elementu potomnego ( ), elementu ( a) i prawego elementu potomnego ( (T a)).

Długość fragmentu 22:

main=putStrLn"y">>main

Funkcja Haskella yes. >>jest operatorem, który łączy i sekwencjonuje dwie akcje We / Wy. Ma rodzaj >> :: IO a -> IO b -> IO b.

maindefiniuje się rekurencyjnie jako działanie I / O, które najpierw drukuje, "y"a następnie robi wszystko main, co robi.

Długość 18 fragmentu:

fix f=r where r=f r

Lepsza definicja fix. (Zobacz fragment 14.) Problem z pierwszej definicji, fix f = f(fix f)jest to, że za każdym razem nazywamy fix f fixprzywołania fix f, która przypomina fix f, tworząc niekończące się kopie tego samego obliczenia. Ta wersja naprawia to, definiując r(wynik) jako wynik; jako taki f r = r,. Zdefiniujmy r = f r. Teraz wracamy r.

Długość 17 fragmentu:

f n=product[1..n]

Jest to funkcjonalny sposób definiowania silni.

Długość 16 fragmentu:

f n=(\x->x+x+x)n

(\x -> x + x + x)jest lambda (ktoś pomyślał, że \przypomina literę).

(\x -> x + x + x) nto zastosowana lambda n(jest dokładnie taka sama jak n + n + n).

fjest funkcją mnożenia przez trzy (też f = (*3))

Długość 15 fragmentu:

sum=foldl (+) 0

Definiuje to sumfunkcję za pomocą złożenia. Fold jest w zasadzie pętlą nad elementami listy z jednym akumulatorem.
foldlprzyjmuje jako argumenty pewną funkcję fi pewną wartość początkową xdla akumulatora i listy xs. Funkcja fpowinna otrzymać jako wejście poprzednią wartość akumulatora i bieżącą wartość listy, i zwraca następny akumulator.
Następnie fałd przechodzi do wartości listy, odnosząc fsię do poprzedniego akumulatora, a następnie zwraca ostatni akumulator.

Innym sposobem myślenia o fałdach jest to, że fałd „wstawia” fwartości z listy i z początkowym akumulatorem po jednej stronie. Na przykład foldl (*) 1 [4,2,5]ocenia na 1 * 4 * 2 * 5.

Długość 14 fragmentu:

fix f=f(fix f)

ySyntezatora. Zwykle nazywa się fixgo, ponieważ znajduje punkt stały równania f x = x. Zauważ, że x = infinite loopczasem może to być rozwiązanie, więc fix (\x -> x^2 + 5*x + 7)nie rozwiąże równania, x^2 + 4*x + 7 = 0ale zwróci nieskończoną pętlę.

Możesz również zauważyć, że nie zawsze x = infinite loopjest to rozwiązanie ze względu na lenistwo Haskella.

Ta wersja to wyciek czasu i przestrzeni; przedefiniujemy go w dłuższym fragmencie.

Długość 13 fragmentu:

f=sum.map(^2)

Definiuje funkcję, f która podana liście zwraca sumę jej kwadratów. Jest to funkcja skład funkcji sum i funkcjimap(^2) , która z kolei jest funkcją map stosowane do funkcji (^2) (The kwadratowy funkcji ), który jest z kolei odcinek funkcji ^ (sekcje wprowadzono na fragmencie 2 i Skład w fragmencie 3 ).

Jak widać, funkcje są bardzo ważne w funkcjonalnym języku, takim jak Haskell. W rzeczywistości powiedziano, że Haskell jest językiem z najbardziej standardowymi funkcjami bibliotecznymi, które otrzymują funkcje jako dane wejściowe lub zwracają funkcje jako dane wyjściowe (jest to powszechnie znane jako funkcja wyższego rzędu .

Nawiasem mówiąc, technicznie każda funkcja dwóch lub więcej argumentów jest funkcją, która zwraca funkcje jako dane wyjściowe (nazywa się to curry).

Długość 10 fragmentu:

data B=T|F

To jest definicja boolejczyków Haskell o różnych nazwach. Nazwa typu boolean ma nazwę B.
Ta definicja wprowadza dwa konstruktory: true ( T) i false ( F).
Ten fragment kodu zasadzie informuje kompilator, że każda logiczna ( B) jest albo prawdziwe ( T) lub false ( F), czyli innymi słowy B=T|F.

W rzeczywistości wszystkie typy danych mogą być kiedykolwiek zdefiniowane w Haskell, gdy w innych językach liczba, referencje i typy danych tablicowych wymagają specjalnego wsparcia ze strony kompilatora. W praktyce Haskell ma specjalne wsparcie, ponieważ w przeciwnym razie byłoby bardzo niewygodne, ale na przykład Booltyp danych jest zdefiniowany całkowicie w języku.

Długość 9 fragmentu:

main=main

Ten bezsensowny program określi mainjako główny. Ponieważ Haskell jest leniwy, wartości, które do oceny wymagałyby nieskończonej pętli, można swobodnie wykorzystywać, jeśli nie użyjemy ich rzeczywistej wartości. Takie wartości, które zawierają nieskończone pętle, takie jak nasze main, nazywane są „dnem”.

Zabawnym faktem jest to, że kompilator GHC Haskell może wykrywać tego rodzaju nieskończone pętle i rzucać wyjątkowy (!) Wyjątek po uruchomieniu.

Długość 8 fragmentu:

f(x:_)=x

Definiuje to funkcję, fktóra przy niepustej liście zwróci głowę.

Wzory w Haskell są jak rozpakowywanie sekwencji Pythona, ale uogólnione dla wszystkich typów. Wzory mogą odrzucać lub dopasowywać wartość, a jeśli pasuje, mogą wiązać zmienne z wartościami.

Wzory w tym fragmencie to:

  • _: wzorzec, który pasuje do czegokolwiek i nie wiąże żadnej zmiennej.
  • x: wzorzec, który wiąże cokolwiek i wiąże go ze zmienną x.
  • :: ten wzór dotyczy wzorów potomnych, to znaczy jednego dla głowy i jednego dla ogona. Jeśli lista nie jest pusta, dopasowuje je do głowy i ogona.

Dopasowywanie wzorców jest bardzo ogólne. W rzeczywistości samo zdefiniowanie nowych typów danych automatycznie wprowadzi wzorce do pracy z nimi.

Długość fragmentu 5:

x=2:x

Whoa, jest tyle do wyjaśnienia na ten temat.

Po pierwsze, Haskell jest leniwy. Oznacza to, że podwyrażenia będą oceniane tylko wtedy, gdy będzie to absolutnie konieczne.

Uwaga: ten fragment kodu nie pokazuje przypisania, ale definicję. Haskell nie ma przydziału.

Ten fragment kodu zdefiniowany x, nieskończona lista złożona w całości 2. Zwykle w innych językach xnależy oceniać, zanim będzie 2:xmożna je kiedykolwiek ocenić, ale w Haskell możemy to zrobić.

Listy nieskończone Haskell są swego rodzaju mieszanką iteratorów i zwykłych list połączonych: działają one jak oba (na przykład iteracja w zakresie będzie wymagać stałej pamięci).

Długość 4 fragmentu:

2:[]

Ten fragment kodu po prostu koduje listę singletonów [2]. :jest operatorem Cons w Haskell. W rzeczywistości regularna składnia listy to po prostu cukier składniowy dla operatora minusów i literał pustej listy. Jest to ściśle powiązane ze sposobem, w jaki Haskell radzi sobie z dopasowywaniem wzorców i typami danych (szczególnie pojęcie konstruktora).

Długość fragmentu 3:

f.g

W Haskell .oznacza kompozycję funkcji. Haskell może być napisany w stylu „bez punktów”, który charakteryzuje się tym, że nie nazywa argumentów funkcji i zamiast tego używa .operatora do manipulowania przepływem danych.

Długość fragmentu 2:

1-

Kiedy ten kod jest owinięty w nawiasy (z powodów składniowych), nazywa się go „sekcją”. Jest to funkcja, która podała pewną liczbę, „wypełnia” puste miejsce i zwraca jeden minus tę liczbę. To pojęcie jest czasem przydatne w funkcjonalnym języku, takim jak Haskell, w przeciwnym razie potrzebna byłaby lambda.

Długość 1 fragmentu:

1

W Haskell, 1może być zarówno Int, Float, Double, Wordi tak dalej. W rzeczywistości możesz napisać kod, aby zdefiniować wersję 1dowolnego typu i używać go swobodnie.
dzieje się tak również w JavaScript, Python i tak dalej, ale w przeciwieństwie do tych, odbywa się to z pełnym bezpieczeństwem typu.

factoid:

Początkowo komitet Haskell zamierzał nazwać język „Curry” po nazwisku Haskell B. Curry, ale postanowił zmienić nazwę na Haskell, ponieważ mogą pojawić się pewne kalambury. Dopiero później zauważyli podobieństwo Haskella do „Pascal” i „Hassle”!


nie wiem, czy powinienem zastąpić faktoid faktem, że Haskell ma najwięcej funkcji / operatorów w swojej standardowej bibliotece, które generują funkcje z innych funkcji (i że technicznie każda taka funkcja co najmniej dwóch parametrów jest taka). Czy powinienem?
dumny haskeller

Pokaż go we fragmencie i dodaj do wyjaśnienia.
Martin Ender

f=0:1:zipWith(+)f(tail f) -- 25 chars, funkcja, która zwraca leniwie wyliczoną liczbę liczb Fibonacciego.
chamini2

ugh, dodałem kilka fragmentów, a potem mój komputer został zamknięty
dumny haskeller

@proudhaskeller Saving op. Nigdy nie robiłem tego osobiście, ale jeśli masz dużą edycję do zrobienia od razu, możesz wykonać edycję w dokumencie zewnętrznym z zapisaniem, a następnie wkleić go po zakończeniu.
mbomb007

99

DO#

C # to zabawna, szalona mieszanka funkcji Java, C, Haskell, SQL i mnóstwa innych języków, i oferuje wiele naprawdę fajnych funkcji i interfejsów API. Tutaj jest również znany z tego, że jest dość gadatliwy, ale zobaczymy, co możemy zrobić!

Zignoruję zwykły wymagany bojler:

class Program { public static void Main(string[] args) { ... } }

Długość 1:

;

Polecenia są zakończone średnikami w języku C #! Pusta linia to idealnie poprawna składnia.

Długość 5:

x=5f;

Gdy określisz liczby literalne w języku C #, kompilator przyjmie, że są to liczby całkowite lub podwójne (na podstawie tego, czy mają przecinek dziesiętny). Jeśli chcesz użyć dosłownego zmiennoprzecinkowego, powinieneś to określić, dodając „f” do liczby, w przeciwnym razie będzie rzutowany w czasie wykonywania, co pociągnie za sobą niewielki koszt.

Długość 7 (bajty):

s=@"
";

Jeśli literał ciąg znaków poprzedzony jest znakiem @, staje się on dosłownym ciągiem literału. Normalne literały łańcuchowe analizują sekwencje specjalne, takie jak „\ n”, na znaki specjalne, ale literały dosłowne nie, pozwalając na użycie znaku ukośnika odwrotnego bez ucieczki. Mogą również zawierać znaki powrotu linii, jak pokazano. To może zaoszczędzić kilka bajtów w golfie lub sprawić, że twoje wieloliniowe literały łańcuchowe będą bardziej czytelne. Uważaj tylko na wcięcie w łańcuch.

Długość 8:

()=>x=y;

To wyrażenie jest funkcją anonimową. Zwraca obiekt typu, Actionktóry można przekazać, a także wywołać jak funkcję. Funkcje anonimowe dziedziczą zakres, w którym zostały zadeklarowane, i pobierają ze sobą dowolne zmienne lokalne w tym zakresie, gdziekolwiek się znajdują.

Długość 9:

(a)=>a.p;

Oto kolejna anonimowa funkcja wykorzystująca parametr i zwracaną wartość. Wyrażenie zwraca obiekt typu Func(sam Func zwraca typ a.p. Będziesz dużo używał Funcdo interfejsu z Linq.

Długość 10:

enm.Any();

To jest nasze pierwsze wprowadzenie do Linq! Linq to zestaw metod rozszerzenia, które można wywołać dla dowolnego obiektu, który jest wyliczalny (implementując interfejs IEnumerable) - jak Arrayi List. IEnumerable stosuje leniwą ocenę: przegląda kolekcję po jednym elemencie, nie wiedząc o kolekcji jako całości - może być nawet nieskończona!

Tam właśnie Anyprzychodzi - zwraca, truejeśli Enumerable zawiera co najmniej 1 przedmiot. Znacznie lepiej niż obliczanie całej długości.

Długość 11:

var a=1.5f;

Słowo varkluczowe instruuje kompilator, aby automatycznie określał typ a. aw takim przypadku zostanie wpisany jako Single. Bardzo przydatny do gry w golfa kodowego, ponieważ jest krótszy niż prawie jakakolwiek nazwa typu, choć wielu nie lubi używać go w kodzie produkcyjnym.

Długość 15:

yield return 0;

Oto szalone stwierdzenie, z którym możesz być mniej zaznajomiony. Wiesz, że obiekty mogą być policzalne przez dziedziczenie IEnumerable, ale czy wiesz, że funkcje mogą być policzalne? Zadeklaruj funkcję z typem zwracanym IEnumerablei miej ją yield returntyle razy, ile chcesz. Kiedy dostaniesz Enumerator do funkcji, każde wywołanie do GetNextspowoduje, że program wykona cały kod do następnego yield return, zwróci tę wartość, a następnie zatrzyma się, aż ponownie ją przejdziesz. Służysz yield breakdo zakończenia iteracji.

Długość 16:

[Obsolete]int a;

Ten fragment pokazuje atrybut. Atrybut to rodzaj znacznika, który można przykleić do dowolnej deklaracji w kodzie. Niektórzy instruują kompilator, aby zrobił pewne rzeczy, na przykład ten, który emituje przestarzałe ostrzeżenie, jeśli zadzwonisz a. Możesz stworzyć swój własny, rozszerzając Attribute, i możesz wyszukiwać je za pomocą Reflection (więcej na ten temat później). Możesz przejść do meta i ograniczyć rodzaj deklaracji, których można użyć w AttributeUsageatrybucie.

Długość 17

c.Count(t=>t==3);

Oto przydatna metoda golfa. Biorąc pod uwagę Func, że mapuje elementem przeliczalny cna boolto zwraca liczbę elementów w codniesieniu do których dana Funcpowraca true. O wiele ładniejsze niż pisanie pętli.

Długość 18:

foreach(T t in c);

To jest pętla dla każdego. Przy tych wszystkich rozmowach na temat wielu rzeczy jest to bardzo potrzebna struktura. foreachto cukier składniowy, który utworzy moduł wyliczający dla c(który musi być wyliczalny) i będzie iterował po nim jeden element tna raz. Możesz zmieniać lub badać każdy pojedynczy element, ale zmiana samej kolekcji spowoduje unieważnienie modułu wyliczającego.

Długość 19

c.Select(t=>t.a/2);

To jest twoja funkcja „mapy” dla fanów programowania funkcyjnego. Select to przyjemny, zwięzły sposób na wykonanie dowolnej arbitralnej konwersji (zdefiniowanej przez Funcprzekazany) na każdym elemencie wyliczenia. Zwraca IEnumerable, który wypluje „przekonwertowane” elementy podczas iteracji.

Długość 21

Console.Write("Hi!");

Ta linia wypisuje tekst na standardowe wyjście i jest prawdopodobnie jednym z głównych powodów, dla których C # nie jest często używany do gry w golfa!

Długość 23

typeof(T).GetMethods();

C # obsługuje bardzo potężną funkcję o nazwie Reflection. Refleksja pozwala zbadać strukturę kodu w czasie wykonywania. Na przykład to wywołanie zwróci tablicę wszystkich metod określonego typu. Możesz zbadać te metody, wywołać je, a nawet zmodyfikować wartości pól i właściwości. Atrybuty (patrz Długość 16) to dobry sposób na oznaczenie części kodu do użycia z Reflection.

Długość 25

from t in c select t.a/2;

Czy to SQL? W kodzie C #? Całkiem blisko. To wyrażenie robi to samo, co w Długość 19.

Długość 27

for(var l;;l=new object());

C # to język śmieci, co oznacza, że ​​każda pamięć, którą przydzielisz (za pomocą newsłowa kluczowego), może zostać zwolniona automatycznie, o ile nie istnieją żadne odniesienia do niej. Ten kod będzie działał długo i szczęśliwie, chociaż nigdy nie zwalniam jawnie utworzonej pamięci. Śmieci mają jednak swoje koszty - przeszukaj internet, aby dowiedzieć się więcej.

Długość 29

var e=Enumerable.Range(0,99);

Enumerable.Rangejest potencjalnie przydatną funkcją golfa. Zwraca strukturę, którą można wyliczyć i da każdą liczbę w określonym zakresie, w kolejności. Drugi parametr to liczba, a nie indeks.

Długość 31

public int pr{get;private set;}

Tutaj możemy pokazać prostą „właściwość”, funkcję OOP i kolejną cechę C #. Jeśli kiedykolwiek korzystałeś z Javy, prawdopodobnie stworzyłeś metody „get” i „set” dla pola, aby oddzielić ich dostępność lub uruchomić kod, gdy zostanie zmieniony. C # pozwala ci zadeklarować ten kod tuż nad polem, a także ustawić osobne modyfikatory dostępu do pobierania i ustawiania. Ten konkretny fragment automatycznie tworzy domyślny moduł pobierający i ustawiający, ale ustawia go jako prywatny.

Długość 32

public static void m(this T o){}

Ten fragment pokazuje funkcję C #, która jest przyjemna w projektowaniu API. Przez zastosowanie thismodyfikatora do pierwszego parametru metody statycznej metoda ta staje się metodą „rozszerzającą”. Po zadeklarowaniu T.mmożna teraz wywołać dowolny obiekt typu T, tak jakby to była metoda T. Można go użyć do dodania nowej funkcjonalności do dowolnej istniejącej klasy, bez modyfikowania, a nawet dostępu do jej kodu źródłowego.

Długość 38

int f(int a,ref int b,out int c){c=0;}

Ta metoda pokazuje różne typy przekazywania parametrów, które możesz mieć w C #. Niezmodyfikowane parametry są przekazywane przez wartość . Parametry poprzedzone znakiem refsą przekazywane przez odwołanie: możesz przypisać do nich zupełnie nowy obiekt, który przeniesie go z powrotem z metody. Parametry poprzedzone znakiem outsą jak dodatkowe zwracane wartości: wymagane jest przypisanie im wartości w metodzie i są one przeprowadzane podobnie jak parametry ref.

Długość 42

Console.Write("It is \{DateTime.Now()}.");

Nowy standard C # 6 pozwala zaoszczędzić niektóre znaki, gdy trzeba wyprowadzać złożone ciągi, używając interpolacji ciągów. Ta funkcja umożliwia pisanie dowolnego wyrażenia w nawiasach klamrowych wewnątrz literału ciągu, a ciąg zostanie automatycznie złożony z wartościami tych wyrażeń w czasie wykonywania.

Długość 48

IEnumerable f(){for(int a=0;;)yield return a++;}

Wystarczająca liczba postaci, aby zrobić coś z rzeczywistym celem! Ta metoda wykorzystuje niektóre z pomysłów, które zbadaliśmy powyżej, aby stworzyć nieskończony Enumerable, który po prostu zwróci liczby całkowite, jeden po drugim, zaczynając od 0. Pamiętaj, że C # stosuje leniwą ocenę z Enumerables, więc nieskończona sekwencja jest całkowicie poprawna - możesz powtarzaj tyle sekwencji, ile chcesz, i wybuchaj w dowolnym momencie.

Długość 56

int p{get{return mP;}set{mP=Math.Max(value,0);}};int mP;

Oto kolejny przykład „właściwości” (patrz fragment 31). Tutaj faktycznie zdefiniowałem różne fragmenty kodu dla geti setzamiast używać tych automatycznych jak poprzednio. W tym przykładzie pokazano, jak można użyć właściwości do sprawdzania poprawności wartości przypisanej do zmiennej - tutaj wartość nie może być mniejsza niż 0. Inne dobre zastosowania właściwości obejmują powiadamianie o zdarzeniu, gdy wartość zostanie zmieniona, lub przebudowywanie buforowanych wartości który może być oparty na tym.

Długość 65

int v;public static implicit operator int(Program o){return o.v;}

Ta funkcja nazywa się niejawną obsadą. Jest to coś w rodzaju metody rozszerzającej, ponieważ jest to kod statyczny, który działa na określonej klasie (patrz fragment 32). Jednak rzutowanie niejawne nie jest używane przez wywoływanie go - jest używane po prostu przez traktowanie Programobiektu jako liczby całkowitej (np int i=new Program().). Gdy to zrobisz, obiekt zostanie po cichu przekonwertowany na typ, którego używasz, na podstawie kodu w niejawnej rzutowaniu. Najlepsza praktyka mówi, aby robić to tylko wtedy, gdy w wyniku konwersji nie zostaną utracone żadne informacje.


1
Zobaczmy, co będziesz mógł zrobić z tymi postaciami ... ;-)
dumny haskeller

9
Powiedziałbym, że w rzeczywistości jest bliżej javy niż C
dumny haskeller

Znakomity. Myślę, że prawie mamy dość, by zrobić Linq - już dziś wieczorem!
BMac

publiczny statyczny niejawny operator int (MyClass o) {return o.objVal;} // 65. W przypadku tego kodu ta linia jest poprawna: MyClass o1 = new MyClass (10); int o2 = o1; // o2 ma teraz 10 lat. msdn.microsoft.com/en-us/library/85w54y0a.aspx
Zukki


98

Jawa


Długość 44 fragmentu kodu

Object a=System.out.append("Hello, World!");

Drukuje Hello, World!do STDOUT.

Długość 43 fragmentu kodu

float[][][][][]a=new float[5][3][7][2][10];

azawiera 10 tablic, z których każda zawiera 2 tablice, z których każda zawiera 7 tablic, z których każda zawiera 3 tablice, z których każda zawiera 5 floats.

Długość fragmentu 42

interface A{static void main(String[]a){}}

Kompletny program. Ponieważ wszystko w interfacejest z natury public, możemy pominąć słowo publicw głównej metodzie.

Długość 36 fragmentu kodu

class A{class B extends A{B.B.B b;}}

Ama klasę wewnętrzną B. Oznacza to, że możemy zadeklarować zmienną typu A.B.

Ale Bjest podklasą A, co oznacza, że ma wszystkie metody, pola i wewnętrznych klas z A. W związku z tym możemy również odnosić się do tego typu B.B.

W tym kodzie idziemy o krok dalej i podajemy Bzmienną instancji typu B.B.B.

Morał: zadawanie gorących pytań na temat SO może nauczyć cię wielu interesujących, choć bezcelowych, technik.

Długość fragmentu 35

l.stream().map("a"::equals).count()

Jeśli ljest to lista ciągów, mówi nam to, ile z nich jest równych "a".

Długość 34 fragmentu kodu

public static void main(String[]a)

Podpis metody głównej metody programu. Jeszcze tylko 11 znaków i możemy stworzyć kompletny program!

Długość 33 fragmentu kodu

enum D {NORTH, EAST, SOUTH, WEST}

NORTH, EAST, SOUTH, I WESTsą stałymi typu D.

Długość 32 fragmentu kodu

Files.readAllBytes("hello.txt");

Odczytuje cały plik, zwracając a byte[]zawartość.

Długość 31

new String(new char[]{'h','i'})

Odpowiednik "hi". Przydatne, jeśli "klucz jest uszkodzony.

Długość 30 fragmentu kodu

new JFrame().setVisible(true);

Tworzy nową widoczną ramkę, w której można umieścić inne komponenty.

Długość 29 fragmentu kodu

throws ClassNotFoundException

Zmusza każdą metodę, która to wywołuje, do użycia bloku try- catchlub przekazania błędu do stosu. Sprawdzone wyjątki są jedną z najbardziej kontrowersyjnych decyzji projektantów Java.

Długość 28 fragmentu kodu

int f(int x){return f(x-1);}

Ta funkcja nie działa wiecznie; w rzeczywistości na typowym komputerze zajmuje to mniej niż sekundę. Dzięki, przepełnienie stosu.

Długość 27 fragmentu kodu

Object a=new String[]{"a"};

Tworzy nową tablicę ciągów.

Długość 26 fragmentu kodu

Object.class.newInstance()

Tworzy nowy Object.

Długość 25 fragmentu kodu

((Supplier)()->-~0).get()

Najlepiej unikać stałych kodujących. Jest to zorientowany obiektowo sposób uzyskiwania wartości 1bez użycia stałych innych niż 0.

Długość 24 fragmentu kodu

(Function<Long,?>)x->x+1

Funkcja następcy.

Długość 23 fragmentu kodu

l.removeIf(x->x%10==0);

Jeśli ljest listą liczb całkowitych, to usuwa wszystkie wartości podzielne przez 10.

Długość 22 fragmentu kodu

int i=(new int[7])[5];

Tworzy nową tablicę siedmiu liczb całkowitych i otrzymuje piąty element.

Długość 21 fragmentu kodu

Arrays.asList(2L,"a")

Tworzy ArrayList z tymi elementami.

Długość 20 fragmentu kodu

System.out.print(s);

Wydruki s.

Długość 19 fragmentu kodu

import java.util.*;

Pozwala zwięzłą wykorzystanie klas takich jak List, Map, Scanner, Timer, i Random.

Długość 18 fragmentu kodu

Math.addExact(x,y)

Dodaje dwie liczby całkowite xi y. Jeśli nastąpi przepełnienie, metoda zgłasza wyjątek, zamiast podawać niepoprawną odpowiedź.

Długość 17 fragmentu kodu

Double.MIN_NORMAL

Najmniejsza dodatnia wartość typu double, w której bit wiodący znaczenia jest równy 0.

Długość 16 fragmentu kodu

System.in.read()

Odczytuje pojedynczy znak z konsoli.

Długość 15 fragmentu kodu

Long.reverse(x)

Odwraca bity w reprezentacji binarnej x.

Długość 14 fragmentu kodu

int x=050+120;

xwynosi teraz 160, ponieważ wszystko, co zaczyna się od, 0jest traktowane jako ósemkowe.

Długość 13 fragmentu kodu

private C(){}

Prywatny konstruktor zapobiega tworzeniu go przez inne klasy. Ten wzorzec jest używany między innymi przez klasy Systemi Math. Prywatny konstruktor może także służyć do egzekwowania Wzorca Singletona.

Długość 12 fragmentu kodu

static class

Umożliwia tworzenie klas wewnętrznych bez zamykającej klasy zewnętrznej - rozwiązanie problemu, przed którym stoi wielu programistów .

Długość 11 fragmentu kodu

throw null;

Często trzeba rzucić NullPointerException, ale jest to również dość trudne. To jest znacznie prostsza alternatywa.

Długość 10 fragmentu kodu

int[]a,b[]

Definiuje dwie zmienne: ai b. ajest typu int[]i bjest typu int[][].

Długość 9 fragmentu kodu

switch(x)

Idzie do miejsca, w zależności od wartości x.

Długość 8 fragmentu kodu

break a;

Wyłamuje się z bloku oznaczonego a.

Długość 7 fragmentu kodu

goto x;

Słowo gotokluczowe jest zastrzeżone w C, C ++ i Java. Jeśli xjest to etykieta, ten kod wysyła program do odpowiedniej etykiety - w C i C ++. Ale to Java, wyzwala tajemniczy RuntimeException. W rzeczywistości nie ma możliwości użycia gotosłowa kluczowego w Javie.

Długość 6 fragmentu kodu

\u003b

Kończy wypowiedź. Java jest dziwna .

Długość 5 fragmentu kodu

a-=-a

Podwaja asię, odejmując jego negację.

Długość 4 fragmentu kodu

a&=b

Ustawia wartość abitową oraz of ai b.

Długość 3 fragmentu kodu

...

Dowolna liczba argumentów skonsolidowana w tablicę.

Długość 2 fragmentu kodu

<>

Pozwala kompilatorowi dowiedzieć się, jaki typ ogólny prawdopodobnie masz na myśli. Bardzo nie przypomina Java.

Długość 1 fragmentu

@

Wskazuje adnotację, która umożliwia wyświetlanie dodatkowych informacji o metodach i klasach.

Faktoid

W Javie nieskończone pętle czasami powodują błędy kompilatora. Na przykład pętla while(true);nie może zostać zakończona bez wyjścia z metody, więc każdy kod po tym spowoduje błąd „nieosiągalnej instrukcji”. Jak wskazał @Optimizer, tylko niektóre nieskończone pętle zostaną przechwycone w ten sposób.


5
W Javie nieskończone pętle nie powodują błędu kompilatora. To twoje IDE wykrywa je i powoduje błąd. Java ma po prostu pojęcie instrukcji nieosiągalnych, więc jeśli masz coś takiego while(true);w kodzie, wszystko wstawione po tym wierszu spowoduje błąd kompilacji instrukcji nieosiągalnych. Logika kryjąca się za takimi stwierdzeniami jest bardzo surowa, więc w żaden sposób nie rozpozna wszystkich nieskończonych pętli
Optimizer

4
Właśnie przegłosowano, myślę, że to oznacza, że ​​będziesz musiał usunąć fragment kodu! ;) (Głos był za „Java jest dziwna”)
Simon Forsberg

1
Wygląda na to, że fragment 36 jest rekurencyjny i może być przedłużany w nieskończoność: class A{class B extends A{B.B.B.B.B.B.B b;}}nadal się kompiluje.
Natix

3
Głosowałem za pomoc w stworzeniu kompletnego programu;)
durron597

1
But it Java, [goto] triggers a mysterious RuntimeExceptionŹle. gotonawet się nie kompiluje.
dorukayhan

93

Pyton

Teraz zaczynamy od najnowszej dla Twojej wygody! Aby przeczytać długość 30, zaczynając od najwcześniejszej, przejdź do historii wersji.

Jeśli ktoś ma sugestie, prosimy o komentarz.

Długość 52:

i=0
while s[i-n:]:print(' '*n+s)[i:n+i];i+=1;i**7**7

Zaczerpnięte z mojego wpisu w konkursie Fake Marquee Text . si nnależy wcześniej ustawić ciąg i liczbę całkowitą. W rzeczywistości nie działa dobrze w darmowym interpreterze Python 2, którego używałem, więc dodałem nawiasy(' '*n+s)[i:n+i] i możesz zobaczyć, jak działa w interpreterie Python 3 tutaj .

Długość 43:

#-*-coding:rot13-*-
cevag h"Una fubg svefg"

W Pythonie możesz zakodować źródło za pomocą określonego kodeka. To pokazuje, jak można zapisać źródło w Rot13. Ogólna składnia jest następująca: # -*- coding: <codec-name-goes-here> -*-.

Oto tłumaczenie:

#-*-coding:rot13-*-
print u"Han shot first"

W uOkreśla, że następujący ciąg dosłowny jest ciąg Unicode. Jest to konieczne, jeśli chcesz, aby twoje ciągi również znajdowały się w Rot13, w przeciwnym razie każdy ciąg w źródle będzie czytelny pomimo szyfrowania. Alternatywnie możesz użyć .encode("Rot13")po każdym ciągu (nie zapomnij również użyć Rot13 na tym.) Zgodnie z tym artykułem niektóre alternatywne kodowania to „base64 ″,„ uuencode ”,„ zlib ”lub„ bz2 ″.

Długość 33:

import cmath
print cmath.sqrt(-1)

To jest moduł Pythona dla liczb zespolonych (urojonych) . Drukuje 1j, ponieważ Python jest zgodny ze standardami inżynierii i wykorzystuje jjako jednostkę urojoną, choć wolę i, która jest powszechnie stosowana w matematyce, a przy użyciu ji kdodatkowo idla kwaterniony , ale błądzić. Przeczytaj zamówienie na błąd / zmianę tutaj (nie będzie zmieniana).

Długość 30:

f=lambda n:n*f(n-1)if n else 1

Teraz definiujemy naszą własną funkcję czynnikową za pomocą rekurencji i potrójnego if-else! O ile mi wiadomo, jest tak golfa, jak to możliwe w Pythonie. Można to również napisać w ten sposób f=lambda n:n and f(n-1)*n or 1:, pokazując kilka operatorów boolowskich Pythona (i również wykonanych w 30 znakach). Aby uzyskać informacje na temat fragmentu o długości 15lambda składni można .

Długość 29:

import math
math.factorial(7)

Znajduje silnię z 7, powracającą 5040.

Długość 25:

import math
print math.pi

Moduł matematyczny Pythona zapewnia wiele przydatnych funkcji i stałych. Oto PI. Powraca 3.14159265359. (W powyższym kodzie policzyłem znak nowej linii jako znak).

Długość 24:

f=lambda y:lambda x:x**y

To jest przykład zamknięcia. Wywołanie cube = f(3)spowoduje utworzenie funkcji sześciennej, którą można następnie wywołać za pomocą print cube(24)drukowania 13824.

Długość 19:

print"Hello World!"

Wreszcie wystarczająco dużo miejsca na wydrukowanie podstawowych danych wyjściowych! Spacja nie jest tutaj wymagana, ponieważ cudzysłowy i nawiasy są również ogranicznikami. printDziała to tylko w Pythonie 2, ponieważ Python 3 zmienił funkcję, aby była wywoływana jak każda inna funkcja. W Pythonie 3 użyj print("Hello World!"). Aby uzyskać więcej informacji na temat funkcji drukowania i różnic między Python 2 i 3, zobacz Co nowego w Python 3.0 .

Długość 16:

[x*3 for x in l]

Ponownie załóżmy, że ljest to lista lub dowolny inny iterowalny obiekt, taki jak ciąg znaków lub generator. To stwierdzenie jest znane jako zrozumienie listy . Jest znacznie krótszy niż użycie standardowej struktury pętli. Zwraca tutaj listę ze wszystkimi liczbami pomnożonymi przez 3. RÓWNIEŻ, ciągi znaków można pomnożyć! Tak więc dowolny ciąg na liście zostanie dodany (połączony z sobą) tyle razy.

Długość 15:

import this #:)

Właściwie jest to długość 11 urywek, ale zdałem sobie sprawę, że zapomniał do zaprezentowania Pythona (niesamowite) jajko ! Importowanie tego modułu powoduje wydrukowanie Zen of Python (patrz fakt). Ciekawostka: moduł this.pyzostał zakodowany w pliku rot13, który, mam nadzieję, zaprezentuję później.

Długość 14:

lambda x:x**.5

Definiuje funkcję pierwiastka kwadratowego przy użyciu lambdaskładni Pythona dla literału funkcji. Literały funkcyjne w Pythonie mogą zawierać tylko wyrażenia, a nie instrukcje. Ta lambda może być przypisana do zmiennej, przekazana do funkcji lub wykonana w linii z (lambda x:x**.5)(9), która zwraca 3.0. Stosowanie wykładników do pierwiastka kwadratowego jest alternatywą dla importowania sqrtfunkcji w mathmodule.

Długość 13:

1 if x else 0

To jest przykład trójskładnikowego operatora if Pythona. Zostało to dodane w Pythonie 2.5, aby zniechęcić programistów do ręcznego wdrażania go za pomocą operacji logicznych. Zwraca tutaj, 1jeśli xewaluuje True, w przeciwnym razie 0jest zwracany.

Długość 12:

s=input(">")

Spowoduje to wydrukowanie >tekstu zachęty i pozwoli użytkownikowi wprowadzić wartość. Python 2 interpretuje dowolną wprowadzoną wartość, więc każdy ciąg potrzebuje cudzysłowów. Python 3 zmienił to, więc wprowadzone dane wejściowe nie są automatycznie interpretowane. Aby wprowadzić dane wejściowe bez interpretowania ich w Pythonie 2, użyj raw_input(). W Python 2input() jest równoważne z eval(raw_input()).

Długość 11:

eval("2e3")

2e3jest notacją naukową dla pływaka 2 x 10³. evalFunkcja interpretuje i ocenia dowolny ciąg znaków jako wyrażenie. W tym przypadku ma ten sam wynik, co użycie literału 2e3lub float("2e3"). Powraca2000.0 .

Długość 10:

range(013)

Ta funkcja zwraca listę liczb całkowitych od 0do wartości ósemkowej 013, która jest 11(wyłączna), co oznacza, że ​​lista będzie [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Funkcja przyjmuje do trzech parametrów podobnych doslice funkcji, którą sprawdziliśmy wcześniej:range(start, stop[, step]) . Różnica polega na tym, że przy tylko jednym parametrze parametr reprezentuje wartość zatrzymania.

Zauważ, że Python 3.x nie ma odpowiednika. Jest rangepodobny, ale w rzeczywistości jest taki sam jak Python 2xrange , zwracając obiekt generatora zamiast listy.

Długość 9:

a,b = b,a

Wiele zadań. Jest to prosta, ale elegancka funkcja, pozwalająca na przypisanie wielu wartości jednocześnie. W dostarczonym fragmencie zamienia się aib . A co z kolejnością oceny, pytasz? Wszystkie wyrażenia po prawej stronie operatora przypisania są oceniane przed wykonaniem dowolnego przypisania. To pokonuje wiele języków, które wymagają pośredniego przypisania do zmiennej tymczasowej.

Długość 8:

#comment

Wiesz co to jest ... Czekaj, nie wiesz? Wiesz, te rzeczy, które pozwalają ci wpisać dowolny tekst w celu opisania linii kodu, co ułatwia zrozumienie? Nie? No dobrze ...

Długość 7:

l[::-1]

Ponownie zakładając l jest to lista, spowoduje to zwrócenie listy w odwrotnej kolejności. Trzeci argument wskazuje rozmiar kroku. Ponieważ wszystkie trzy argumenty mogą być wartościami ujemnymi, ujemny rozmiar kroku oznacza iterację w odwrotnej kolejności. Puste argumenty pierwszy i drugi wskazują, że iterujemy całą listę.

Dochodzimy do miejsca, w którym możemy zacząć używać bardziej interesujących konstrukcji!

Długość 6:

l[-6:]

Nazywa się to operacją wycinania . Jeśli ljest to lista, zwróci nową listę zawierającą sześć ostatnich elementów ljako listę. -6reprezentuje indeks początkowy (6 od końca), a dwukropek oznacza kontynuowanie aż do końcowego indeksu po nim (który pozostawiliśmy puste, więc do końca). Gdyby nasza lista zawierała liczby od 1 do 10, to by to zwróciło [5, 6, 7, 8, 9, 10].

Długość 5:

1<x<5

Jedną z niesamowitych funkcji Pythona jest łączenie operatorów porównania. W wielu innych językach byłoby to oznaczone jako 1 < x && x < 5. Jeszcze lepiej, gdy weźmiesz pod uwagę wiele porównań: 1 < x < y < 5jest całkowicie poprawny!

Długość 4:

0256

Liczba całkowita z wiodącym zerem to dosłowna wartość ósemkowa. To także niezła sztuczka w zaciemnianiu kodu. Zwraca wartość dziesiętną 174. W Pythonie 3.x wartość ósemkowa byłaby zapisana jako 0o256.

Długość 3:

`3`

Otaczanie wyrażenia w backticks jest takie samo, jak using repr(), który zwraca ciąg reprezentujący obiekt. Funkcja próbuje zwrócić ciąg w taki sposób, że gdy zostanie przekazany jako argument do evalfunkcji, zwróci oryginalny obiekt. Nie jest to to samo, co używanie str(), chociaż czasami wyniki są takie same. Dla tego wejścia '3'zwracane jest w obu przypadkach. To mój ulubiony golf kod!

Działa tylko w Python 2!

Długość 2:

[]

Pusta lista.

Długość 1:

_

Znak podkreślenia jest często używaną nazwą zmiennej wyrzucanej. Jeśli jednak używasz powłoki Pythona (interpretera interaktywnego), przechowuje on wynik ostatniej wykonanej instrukcji (i zwróciłby ją ponownie). Ponadto, zgodnie z tym wątkiem , jest również używany do wyszukiwania tłumaczeń w i18n.

Fakt : Python jest językiem podobnym do Java i C. Został zbudowany zgodnie ze specyficzną filozofią projektowania (zaczerpniętą z „ PEP 20 - Zen of Python ”:

  • Piękne jest lepsze niż brzydkie
  • Jawne jest lepsze niż niejawne
  • Prosty jest lepszy niż złożony
  • Kompleks jest lepszy niż skomplikowany
  • Liczy się czytelność

Z tego powodu, chociaż średniki są dozwolone jako ograniczniki instrukcji, zwykle są one pomijane na korzyść używania wielu wierszy dla zapewnienia czytelności. Również wcięcie linii jest bardzo ważne!


W każdej chwili! Nie będę już dodawał krótkich fragmentów (nie mogłem się oprzeć jednemu z odcinków o długości 9!), Ponieważ już świetnie sobie z tym radzisz. Powodzenia!
nasser-sh

1
długość 6: zwróci [5, 6, 7, 8, 9, 10](ostatnie 6 liczb na liście)
Vincent

Długość 16: lnie musi być listą, może być dowolnym obiektem iterowalnym; krotki, listy i generatory na przykład wszystkie działają
nasser-sh

@ Sp3000: Używałem go z wyzwaniami [zastrzeżonego źródła].
Robbie Wxyz

4
Brak miłości do starego dobrego import antigravity?
Szyfr

87

JavaScript

Od najnowszego do najstarszego. Link do siebie: [ edytuj ]

Długość 51 fragmentu:

console.log(require('fs').readFileSync(__filename))

Quine Node.JS tym razem, choć nie spełniłoby żadnych wymagań „ścisłej quine” z powodu odczytu własnego kodu źródłowego.

Długość 50 fragmentu:

a=new XMLHttpRequest;a.open('GET','file');a.send()

Wreszcie! Żądanie AJAX (przy użyciu Vanilla.JS ). Inicjujemy, otwieramy i wysyłamy żądanie, ale zabrakło mi miejsca, aby dodać programy obsługi i faktycznie zrobić wszystko z wynikiem.

Długość fragmentu 49:

msg=new SpeechSynthesisUtterance('Hello World!');

Przygotuj wokal „Hello World!”. Właściwie to będzie trochę więcej pracy. Możemy również dostosować głośność, wysokość, tempo i akcent. Zobacz API syntezy mowy na HTML5Rocks . Nie jest jeszcze obsługiwany przez Firefox, z pewnością nie IE .

Długość fragmentu 48:

function repeat(){setTimeout(repeat,48)}repeat()

Symuluj setIntervalprzez rekurencyjne setTimeouting.

Długość 47 fragmentu:

module.exports=function MyModule(a) {this.a=a};

Znowu NodeJS, ale zasada jest taka sama wszędzie w JS. Jest to bardzo podstawowa funkcja konstruktora, która tworzy obiekt z jedną właściwością ( a). Ustawienie module.exportseksportuje funkcję do użycia przez require()jej naciśnięcie.

Długość fragmentu 46:

canvas.getContext('2d').fillRect(46,46,46,46);

To wymaga <canvas id="canvas"></canvas>elementu. Wykorzystuje fakt, że elementy o identyfikatorach są zapełniane jako zmienne globalne, więc element jest dostępny canvasod JS. Następnie wypełniamy go kwadratem 46 x 46 o wartości x = 46, y = 46.

Długość fragmentu 45:

JSON.parse(require('fs').readFileSync('jsn'))

Powrót do węzła. W tym miejscu analizujemy plik JSON o nazwie jsnz bieżącego katalogu.

Długość fragmentu 44:

(a=document.createElement('a')).href="/url";

Opierając się na # 39. Teraz tworzymy element i przypisujemy atrybut. Jednak nadal nie ma go w DOM.

Długość fragmentu 43:

sq=[1,2,3,4,5].map(function(n){return n*n})

Tworzy tablicę pierwszych 5 kwadratów, używając map().

Długość fragmentu 42:

six="1+5",nine="8+1";eval(six+' * '+nine);

Działa to na tej samej zasadzie co ta , ale JS brakuje, #definea więc jest brzydszy. Zwraca oczywiście odpowiedź na życie, wszechświat i wszystko .

Długość 41 fragmentu:

c=function(){var i;return function(){}}()

Początek zamknięcia. cjest teraz funkcją (wewnętrzną) z dostępem do zmiennej wewnętrznej i, ale nic nie robi.

Długość 40 fragmentu:

$('p').click(function(){$(this).hide()})

Całkowicie usuwamy te akapity i używamy jQuery.

Długość 39 fragment:

script=document.createElement('script')

To jest początek dodawania nowego skryptu zewnętrznego. Utwórz pusty <script>element i zachowaj odniesienie do niego.

Długość fragmentu 38:

document.getElementsByClassName('abc')

Znajdź wszystkie .abcelementy w dokumencie. Oczywiście w jQuery jest to tylko $('.abc')...

Długość fragmentu 37:

b=JSON.parse(JSON.stringify(a={3:7}))

Tworzy dwa identyczne, ale oddzielone obiekty a, oraz b. Jeśli byś zrobił

a={a:1};
b=a;
b.a=3;

skończyłbyś z a=={a:3}, ponieważ ai bwskaż ten sam obiekt. Używamy JSON, aby je oddzielić.

Długość fragmentu 36:

(function f(){return "("+f+")()"})()

Quine . Drukuje własny kod źródłowy.

Długość fragmentu 35:

document.body.style.display="none";

Zobacz # 32. Ten po prostu ukrywa dokument bez nadpisywania zawartości.

Długość fragmentu 34:

Object.prototype.toString.call(34)

Wywołanie Object.prototype.toStringto dobry sposób na określenie typu obiektu. Chociaż 34..toString()jest "34", fragment jest [object Number].

Długość fragmentu 33: (uznanie dla tego dotyczy anonimowego użytkownika )

+0%-0.&(v\u0061r=~void[{}<<!(0)])

Myślisz, że to nie jest prawidłowy JavaScript? Lepiej wypróbuj ... (użyj Chrome);)

Długość fragmentu 32:

document.body.innerHTML="hacked"

Halp! Hazxxors! Jedenaście !! 11!

Długość fragmentu 31:

a=[];for(i=0;i<31;i++)a.push(i)

Bez żartów, tak długo czekałem na możliwość użycia forpętli! Ten tworzy tablicę od 0-30.

Długość fragmentu 30:

new Date().getDay()==1?"S":"E"

Pierwszy raz przy użyciu operatora trójskładnikowego. Nie mogłem zmieścić więcej niż to w 30 postaciach, więc wiemy tylko, czy dzisiaj jest niedziela, czy coś jeszcze. : P

Długość fragmentu 29:

Object.keys(window).push('i')

Object.keys(window)otrzyma tablicę zmiennych globalnych (właściwości window). .push()doda element do tej tablicy. Myślisz, że to odpowiednik window.i=undefined? Nie!

Długość fragmentu 28:

setTimeout("a=confirm()",28)

Oczekiwanie 28 milisekund nie jest tak przydatne, z wyjątkiem tworzenia nowego wątku.

Długość 27 fragmentu:

document.querySelector('a')

Szkoda, że ​​nazwy DOM są tak długie. Mogłem uzyskać tylko jeden link tutaj.

Długość fragmentu 26:

JSON.stringify({twenty:6})

Zobacz # 16. Teraz otrzymujemy rzeczywisty JSON - ciąg znaków.

Długość 25 fragmentu:

new Badge("Good Answer");

Zakładając, że Badge()jest to funkcja konstruktora przyjmująca argument ... właśnie utworzono znaczek Dobra odpowiedź !

Długość 24 fragmentu:

do {alert(24)} while(!1)

Właściwie wcale nie używam do..whiledużo, ale niektórzy tak. Gdyby to była zwykła whilepętla, niczego by nie zaalarmowała, ponieważ zawsze jest fałszywa. do..whilezawsze będzie działać przynajmniej raz, więc widzimy 24.

Długość fragmentu 23:

window.parent==self.top

Wszystkie odnoszą się do tego samego obiektu, ogólnie znanego jako window. Jeśli wywołujesz funkcję w normalny sposób, jest tam również this. To 5 sposobów na uzyskanie dostępu do obiektu globalnego!

Długość fragmentu 22:

for(i in self)alert(i)

Zaalarmuj wszystkie zmienne globalne. Tak się składa self==window. (Zobacz następny fragment).

Długość fragmentu 21:

"2"+1==21 && 2+1=="3"

Och, spójrz, to znowu zasady rzutowania JS. To stwierdzenie jest prawdziwe, przy okazji.

Długość 20 fragmentu:

Math.random()<.5?0:1

Wybierz losową liczbę od 0-1 i zaokrąglij za pomocą operatora trójskładnikowego. Chociaż byłoby łatwiejsze w użyciu Math.round...

Długość fragmentu 19:

[1,2,3].map(i=>i*i)

Ten jest nowy. Naprawdę nowy. Używa funkcji strzałek ES6 do obliczania kwadratów 1, 2 i 3. Obecnie wydaje się, że jest obsługiwany tylko przez Firefox.

Długość 18 fragmentu:

location.href="/";

Jak # 15, ale tym razem trafia na stronę główną PPCG, a nie SE.

Długość 17 fragmentu:

(function(){})()

To fragment kodu z 14, ale lepiej! Teraz jest to IIFE.

Długość 16 fragmentu:

obj={not:'json'}

To tłumaczy jeden z moich petów. To jest obiekt , nie JSON ! JSON to format wymiany danych oparty na obiektach JavaScript, ale przyjmujący bardziej ścisły format.

Długość 15 fragmentu:

open('//s.tk/')

Wyobraź sobie, że. Otwórz stronę główną SE, korzystając z przekierowania http://s.tk/ .

Długość 14 fragmentu:

function f(){}

W00t! Funkcje! Szkoda, że nie ma miejsca, aby zrobić cokolwiek.

Długość 13 fragmentu:

Math.random()

Wygeneruj losową liczbę od 0 do 1. Chcesz zdefiniować własne limity? Pech. (Nie bardzo, to łatwe.)

Długość 12 fragmentu:

new Date<=12

To stwierdzenie nigdy nie było prawdziwe w JS. JS powstał dopiero w 95 roku (patrz faktoid), długo po 1/1/1970 00: 00: 00.012.

Długość fragmentu 11:

Math.PI*121

Obszar koła o promieniu 11.

Długość 10 fragmentu:

if('j')9+1

Jeśli nie zauważyłeś, lubię robić coś z numerem kodu w kodzie. Ten zwraca 10 i używa j, dziesiątej litery alfabetu.

Długość 9 fragmentu:

[9].pop()

Zrób tablicę z jednym przedmiotem. popidzie łasica 9.

Długość 8 fragmentu:

document

Podstawa całej pracy DOM. Ale nic nie możemy zrobić, bo to za długo. :( Idź jQuery!

Długość 7 fragmentu:

alert()

O chłopie! Wywołanie funkcji! Nareszcie będę mógł robić rzeczy!

Długość fragmentu 6:

var x=6

Na podstawie nr 3. Znacznie lepiej jednak, ponieważ teraz globalny jest jawny . : P

Długość fragmentu 5:

[][5]

Jeszcze krótszy niż void 0do zdobycia undefined. BTW: ''.ajest jeszcze krótszy; tylko 4 znaki.

Długość 4 fragmentu:

+"4"

Spowoduje to utworzenie liczby 4z ciągu "4". Możesz użyć dokładnie tych samych 4 znaków w innej kolejności, aby zrobić odwrotnie!

Długość fragmentu 3:

x=3

O rany, właśnie stworzyliśmy domyślną zmienną globalną ...

Długość fragmentu 2:

{}

Co to robi? Jeśli powiedziałeś, że tworzy literał obiektu, jesteś w błędzie. To właściwie pusty blok. Otwórz konsolę i wypróbuj! Zwraca ona undefinednie {}.

W 2018 r. W {}konsoli Chrome faktycznie zwraca pusty obiekt.

Długość 1 fragmentu:

1

Otóż ​​to. Dowolna liczba jest prawidłowym wyrażeniem JS.

Fakt: JavaScript był pierwotnie nazywany LiveScript. Został zmieniony na JavaScript, aby w tym czasie wykorzystać popularność Javy (1995). Osobiście powinni byli zachować starą nazwę; Od tego czasu JavaScript jest źródłem zamieszania. Faktem jest, że Java i JavaScript są tak podobne jak „samochód” i „dywan” .


1
Snippet 33 nie działa w przeglądarce Firefox. Czy to naprawdę ważne JS?
Oriol

Uważam, że obiekt i narzędzie do kopiowania są tak brudne. ECMAScript 6 wprowadza Object.assign, więc fragment 37 staje się b = Object.assign({ }, a = {3 : 7}).
Oriol

@Oriol Tak, cóż, tylko Firefox obsługuje go teraz, więc na razie musimy trzymać się brudnej drogi. Przynajmniej jest to lepsze niż eval(uneval(a)), prawda? ;)
Scimonster,

Około 38, zawsze jest document.querySelectorAll("element#id.classname[attribute]:not(somethingwedontwant)"). (Obsługuje dowolny prawidłowy selektor CSS).
Mateon1,

Sam fragment nr 40 nie jest tak interesujący, ale komentarz jest bezcenny.
Scimonster,

85

R

Fakt : Język programowania R zaczął się jako implementacja GNU języka programowania S. Jest używany głównie do statystyk i powiązanych aplikacji.

Uwaga: Chociaż nie jest to wymóg zawodów, każdy fragment kodu można uruchomić samodzielnie w R.


Długość 32:

`[.data.frame`(swiss,3,2,drop=F)

To wygląda trochę tajemniczo ... i rzeczywiście powinno! Jest o wiele lepszy sposób na napisanie tego:

swiss[3, 2, drop = FALSE]

To powinno wyglądać nieco bardziej znajomo. Oto, co dzieje się, gdy uruchamiamy jeden z tych fragmentów kodu:

> `[.data.frame`(swiss,3,2,drop=F)
             Agriculture
Franches-Mnt        39.7

Te swissstatki ramka danych z R jak kilku innych, które widzieliśmy do tej pory. Zawiera wskaźniki płodności i wskaźniki społeczno-ekonomiczne dla 47 francuskojęzycznych prowincji Szwajcarii z około 1888 roku. Trzeci rząd dotyczy prowincji Franches-Mnt, a druga kolumna to odsetek mężczyzn zaangażowanych w rolnictwo jako zawód w każdej prowincji. Tak więc w 1888 r. 39,7% mężczyzn w szwajcarskiej prowincji Franches-Mnt pracowało w rolnictwie.

Kiedy wyodrębniasz wiersze lub kolumny z ramki danych za pomocą prostszej notacji, R faktycznie używa [.data.framew tle. Jak widzieliśmy we fragmencie 24, prawie wszystko można zdefiniować jako nazwę funkcji, o ile jest ona otoczona tylnymi tyknięciami, więc nasz fragment jest prawidłowy, mimo że nazwa funkcji zawiera niepasujące nawiasy.

drop=Argumentem mówi R czy chcesz go upuścić wynik do niższego wymiaru, jeśli to możliwe. Rzeczywiście, jeśli mówimy drop=TRUE, otrzymujemy to:

> `[.data.frame`(swiss,3,2,drop=T)
[1] 39.7

Tam, gdzie poprzednio wynikiem była ramka danych, R daje nam teraz podwójną liczbę.


Długość 31:

print(fortune("hadleywickham"))

Ta fortune()funkcja pochodzi z wszechwiedzącego fortunespakietu, który zawiera wiele mądrych cytatów od różnych mądrych ludzi. Ten fragment zapewni ci następujący klejnot z Hadley Wickham (23), drukując na konsoli:

That's a casual model, not a causal model - you can tell the difference by looking
for the word "excel".
    -- Hadley Wickham (commenting on an Excel chart showing student's SAT score
       increases with family income, without considering future covariates)
       http://twitter.com/#!/hadleywickham (February 2012)

Długość 30:

pie(rep(1,12),col=rainbow(12))

Kto nie lubi dobrego wykresu kołowego? Ta pie()funkcja wyświetli świeżo upieczony wykres kołowy oparty na wektorze liczb. rep()tworzy wektor, powtarzając pierwszy element r razy, gdzie r jest drugim argumentem. Ten col=parametr mówi, pie()jak pokolorować plastry. Funkcja magiczna rainbow()generuje wektor o określonej długości zawierający kody szesnastkowe dla „równo rozmieszczonych” kolorów tęczy.

To, co masz tutaj, to podstawowa tabela „Ilość każdego koloru w tej tabeli”:

wprowadź opis zdjęcia tutaj


Długość 29:

summary(lm(mag~depth,quakes))

Dzieje się tutaj kilka rzeczy, więc zróbmy je krok po kroku.

quakesjest zestawem danych dostarczanym z R. Zawiera informacje o 1000 zdarzeniach sejsmicznych o wielkości większej niż 4,0 w skali Richtera w pobliżu Fidżi od 1964 r. Dwie kolumny w zestawie danych to mag, co jest wielkością trzęsienia ziemi, i depthktóra jest głębokość epicentrum w kilometrach.

lm()Funkcji, jak wspomniano we fragmencie 28, pasuje do modeli liniowych. Zwraca lmobiekt, a ściślej obiekt klasy lm. Istnieją dwa sposoby określenia predyktora (lub zmiennej niezależnej ) i odpowiedzi (lub zmiennej zależnej ), a ja wybrałem metodę formuły. To przybiera formę response ~ predictor. Wiele predyktorów jest określonych jako y ~ x1 + x2. Obiekty w formule są oceniane w kontekście podanym w następnym argumencie.

Tak więc lm(mag ~ depth, quakes)dopasowuje się model liniowy przy użyciu zwykłej regresji metodą najmniejszych kwadratów, gdzie wielkość jest odpowiedzią, a głębokość jest predyktorem. Wie co magi depthjest, ponieważ powiedzieliśmy, że pochodzą quakes.

summary()to ogólna funkcja używana przede wszystkim do podsumowywania wyników dopasowanych modeli. Wywołuje metodę specyficzną dla klasy jej argumentu. Ponieważ minęliśmy lmobiekt, w rzeczywistości wywołuje on funkcję o nazwie summary.lm().

Podsumowując, otrzymujemy podsumowanie modelu liniowego próbującego wyjaśnić trzęsienie ziemi z głębokości trzęsienia ziemi. Dokładnie to wypluwa R:

> summary(lm(mag~depth,quakes))

Call:
lm(formula = mag ~ depth, data = quakes)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.72012 -0.29642 -0.03694  0.19818  1.70014 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  4.755e+00  2.179e-02 218.168  < 2e-16 ***
depth       -4.310e-04  5.756e-05  -7.488 1.54e-13 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3921 on 998 degrees of freedom
Multiple R-squared:  0.05319,   Adjusted R-squared:  0.05225 
F-statistic: 56.07 on 1 and 998 DF,  p-value: 1.535e-13

Zauważ, jak pierwszą rzeczą, którą ci mówi, jest wywołanie funkcji? To dlatego, że lm()funkcja używa match.call(), tak jak zrobiliśmy to we fragmencie 28!


Długość 28:

f<-function(x,y)match.call()

Funkcje R często lubią śledzić to, co im mówisz. Rzeczywiście, czasami przesłane polecenie jest zwracane jako atrybut zwracanego obiektu. (Przykładem jest lm()tworzenie modeli liniowych.) Przywołanie dokładnych instrukcji odbywa się za pomocą match.call()funkcji. Przechwytuje lub dopasowuje interpretowane wywołanie funkcji.

Tutaj zdefiniowaliśmy funkcję, f()która pobiera dwa argumenty, a następnie mówi, co zobaczyła.

> f(1,2)
f(x = 1, y = 2)

Jest to szczególnie przydatne podczas opracowywania funkcji do użytku ogólnego (a nie tylko dla Ciebie), na przykład podczas tworzenia pakietów. Jeśli chcesz zobaczyć przykład match.call()na wolności, poszukaj kodu źródłowego lm(), przesyłając stats:::lm. Jedną z pierwszych rzeczy, które robi, jest przechwytywanie wywołania funkcji za pomocą match.call().


Długość 27:

install.packages("ggplot2")

Może się to wydawać trywialne, ale pokazuje jeden z powodów, dla których R jest tak popularny: jest bardzo łatwo rozszerzalny poprzez pakiety. I każdy może rozwijać i swobodnie udostępniać swoje pakiety!

install.packages()robi dokładnie to, co sugeruje jego nazwa. Poszukuje pakietów korzystających z domyślnego serwera lustrzanego CRAN (Comprehensive R Archive Network), a następnie instaluje je w systemie, w którym R może je znaleźć. Możesz także zainstalować pakiety z lokalnego kodu źródłowego.

Pamiętasz fragment 23, w którym użyliśmy ggplot2paczki? Ten pakiet nie jest dostarczany z literą R, ale w zaledwie 27 znakach możesz spełnić wszystkie swoje ggplot2marzenia, instalując go.


Długość 26:

filled.contour(t(volcano))

Zestaw volcanodanych jest dostarczany z R. Jest to matryca zawierająca informacje topograficzne na wulkanu Maungawhau (lub Mount Eden) w Auckland w Nowej Zelandii. Rzędy macierzy odpowiadają liniom siatki biegnącym ze wschodu na zachód, a kolumny to linie siatki biegnące z południa na północ.

Dla dezorientacji zamieńmy kierunki, aby kolumny były teraz wschód-zachód, a rzędy południe-północ. Możemy to zrobić za pomocą transpozycji macierzy, dokonanej za pośrednictwem t(). A dlaczego nie zrobić mapy konturowej, gdy na niej jesteśmy? filled.contour()robi tylko to.

wprowadź opis zdjęcia tutaj


Długość 25:

pmatch("s",c("n","size"))

Ta pmatch()funkcja zapewnia magię kryjącą się za częściowym dopasowaniem, które widzieliśmy do tej pory. Pierwszy argument jest łańcuchem, który jest porównywany z każdym elementem drugiego argumentu, wektorem. Jeśli istnieje unikalne dopasowanie, indeks dopasowanego elementu jest zwracany, w przeciwnym razie otrzymasz NA.

Fragment tutaj jest przykładem użycia tej funkcji w „świecie rzeczywistym”. Wróć do fragmentu 13, w którym użyliśmy tej sample()funkcji. Przyjmuje argumenty n, size, replace, i prob, ale wymaga tylko dwóch pierwszych. We fragmencie 13 użyliśmy go s=jako skrótu size=. To, co faktycznie dzieje się w tle, to taki fragment kodu, w którym to, co udostępniliśmy, jest porównywane z oczekiwaniami. Ponieważ „s” jest jednoznacznie dopasowane do „rozmiaru”, używanie go s=jako skrótu jest całkowicie uzasadnione .


Długość 24:

`(`=function(x)9;2*(3-1)

Idealny przykład czegoś, czego nie powinieneś robić! Zawsze!

Możesz przypisywać znaki jako funkcje, o ile otaczasz je tylnymi paskami podczas definiowania funkcji. Tutaj powiedzieliśmy R, że (jest to funkcja, która zawsze zwraca 9 niezależnie od danych wejściowych. Podobnie jak w wielu innych językach, ;można użyć dwóch poleceń w jednym wierszu. Więc powiedzieliśmy R, aby zdefiniować funkcję (, a następnie wydrukować 2*(3-1).

Teraz prawie każda osoba powiedziałaby ci, że 2 * (3-1) powinno wynosić 4, ponieważ robisz 3-1 = 2, a następnie 2 * 2 = 4. Ale powiedzieliśmy R, że cokolwiek w nawiasach wynosi 9. Więc podczas gdy 3-1 = 2, teraz mamy (3-1) = 9. Następnie otrzymujemy 2 * (3-1) = 2 * 9 = 18.

Ponieważ takie okropne rzeczy są możliwe, za każdym razem, gdy przesyłasz kod, który zawiera nawiasy w wyrażeniu (tj. Nie wywołanie funkcji), interpreter R faktycznie szuka jakichkolwiek wywoływanych funkcji, (niezależnie od tego, czy zdefiniowałeś (jako funkcję. Ogólnie rzecz biorąc, im więcej piszesz, tym więcej pracy wykonuje tłumacz języka R.


Długość 23:

qplot(Na,y=RI,data=fgl)

Wreszcie wystarczająca liczba głosów na (bardzo) prosty ggplot2przykład. ggplot2Pakiet jest implementacją R gramatyki Grafiki, stworzony przez legendarnego R bóstwa Hadley Wickham . Ogólnie rzecz biorąc, składnia jest bardzo różna od podstawowej grafiki R i wymaga trochę czasu, aby się przyzwyczaić. Jednak qplot()jest prostszy interfejs do niektórych podstawowych funkcji pakietu i ma składnię zbliżoną do plot()bazy R. Ale w przeciwieństwie do wielu przykładów pokazanych mam cię qplot()nie obsługuje częściowe dopasowanie nazw parametrów funkcji.

Zestaw fgldanych pochodzi z MASSpakietu. Zawiera pomiary właściwości kryminalistycznych fragmentów szkła. Tutaj używamy zmiennych Na, które są procentem sodu (Na) wagowo i RIktóry jest współczynnikiem załamania szkła.

wprowadź opis zdjęcia tutaj


Długość 22:

unique(presidential$n)

unique()Zwraca wektor zawierający unikatowe wartości z jego wektora wejściowego w kolejności, w jakiej występują na wejściu. Zestaw presidentialdanych jest dostarczany z ggplot2pakietem (27). (Dzięki Jemus42 za naprawienie tego!) Jego opis:

Nazwiska każdego prezydenta, datę rozpoczęcia i zakończenia ich kadencji oraz ich partii 10 prezydentów USA od Eisenhowera do Busha W.

presidentialjest ramką danych, a ramki danych zawierają kolumny, podobnie jak listy zawierają elementy. Kolumny są przywoływane według nazwy przy użyciu $. Ten konkretny zestaw danych ma kolumnę o nazwie name, zawierającą nazwisko prezydenta. Ale czekaj, wymieniliśmy tylko n! W rzeczywistości jest to kolejny przykład częściowego dopasowania (13, 16), więc njest całkowicie uzasadniony.

Przesłanie tego ma interesujący wynik:

[1] "Eisenhower"  "Kennedy"  "Johson"   "Nixon"  "Ford"  "Carter"
[7] "Reagan"      "Bush"     "Clinton"

Zwróć uwagę, jak pisze się nazwisko Lyndon B. Johnson ... Ups.

(Uwaga: ponad rok po opublikowaniu zwróciłem uwagę na to, że literówka Johnsona została naprawiona. RIP humor.)


Długość 21:

integrate(dexp,0,Inf)

R ma wbudowaną funkcję adaptacyjnej kwadratury funkcji pojedynczej zmiennej w przedziale skończonym lub nieskończonym. W R nieskończoność jest określona jako Infdla + nieskończoności i -Infdla -nieskończoności . Ta dexp()funkcja jest funkcją rozkładu prawdopodobieństwa dla rozkładu wykładniczego. Ponieważ obsługa rozkładu wykładniczego wynosi [0, + nieskończoność), a rozkłady prawdopodobieństwa całkują się do 1, spodziewalibyśmy się, że wynik wyniesie 1. Oto oczekiwany wynik!

1 with absolute error < 5.7e-05

Długość 20:

deriv(~cos(x^3),"x")

R może robić symboliczne pochodne! Zwraca to:

expression({
    .expr1 <- x^3
    .value <- cos(.expr1)
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
    .grad[, "x"] <- -(sin(.expr1) * (3 * x^2))
    attr(.value, "gradient") <- .grad
    .value
})

Przeglądając to, możesz zobaczyć, jak analizuje funkcję i używa reguły łańcucha. Wszystko, co powinna wykonać funkcja rachunku pierwszego roku, powinno być w stanie wykonać! Pierwszym argumentem deriv()funkcji jest wyrażenie R (które jest faktycznym typem R) pod względem pewnej zmiennej, w tym przypadku x. Drugim argumentem jest tutaj nazwa zmiennej, w odniesieniu do której pochodna jest pobierana "x".

Chcesz zobaczyć coś naprawdę porządnego? Powiedzmy, przypisz powyższą zmienną dx. Zdefiniuj zmienną xjako wektor numeryczny. Następnie prześlij eval(dx). R ocenia pochodną na x!


Długość 19:

c(matrix(1,3,3),"a")

W R c()skrót od „połącz” lub „konkatenuj” tworzy wektor z jego argumentów. Elementy wektorów muszą być tego samego typu i wszystkie mają długość 1. Ale zamiast się na ciebie wściekać, R spłaszczy element ze strukturą, w tym przypadku matrycą, i rzuci wszystko na ten sam typ.

Jeśli argumenty c()zawierają tylko jeden typ, rzutowanie typu nie występuje, np. Jeśli wszystkie argumenty są logiczne ( TRUEi FALSE), wektor będzie logiczny. Jeśli zawiera logikę i liczby, będą to wszystkie liczby. Jeśli zawiera postać i cokolwiek, będzie to cała postać. Nasz fragment kodu daje nam to:

> c(matrix(1,3,3),"a")
[1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "a"

Zauważ, że macierz 3 na 3 została spłaszczona, a dodanie „a” przekształciło wszystko w postacie.


Długość 18:

(1-1/3-1/3-1/3)==0

Lekcja precyzji maszyny. To powraca FALSE.


Długość 17:

example(readline)

example()Funkcja daje przykład jak używać wbudowanych funkcji. Jeśli musisz dowiedzieć się, jak używać readline(), R ma dla ciebie zadowoloną odpowiedź.

> example(readline)

readln> fun <- function() {
readln+   ANSWER <- readline("Are you a satisfied R user? ")
readln+   ## a better version would check the answer less cursorily, and
readln+   ## perhaps re-prompt
readln+   if (substr(ANSWER, 1, 1) == "n")
readln+     cat("This is impossible.  YOU LIED!\n")
readln+   else
readln+     cat("I knew it.\n")
readln+ }

readln> if(interactive()) fun()
Are you a satisfied R user?

Sposób na skromność, R.


Długość 16:

acf(lh,t="part")

acf()Zwraca funkcję autokorelacji dla szeregów czasowych. lhto zestaw danych dostarczany z R. Jego opis:

Regularne szeregi czasowe z podaniem hormonu luteinzing w próbkach krwi w odstępach 10-minutowych od ludzkiej kobiety, 48 próbek.

W tym przykładzie częściowe dopasowanie jest używane dwukrotnie : raz z parametrem funkcji i raz z wartością ciągu przekazywaną do parametru. Pełna nazwa parametr typei uznanych wartości "correlation", "covariance"oraz "partial". Należy podać tylko tyle ciągu, aby można go było jednoznacznie zidentyfikować, więc możemy go użyć "part"do "partial", co daje nam częściową funkcję autokorelacji (PACF).

wprowadź opis zdjęcia tutaj


Długość 15:

p3d(bunny,p=99)

Ponownie widzimy niesławnego króliczka (11). onionPakiet daje nam nawet ładniejszy sposób przeglądania najbardziej użyteczny zestaw danych kiedykolwiek, używając funkcji kreślenia 3D p3d(). To wywołuje podstawową funkcję graficzną persp()w tle, która przyjmuje argument obrotowy phi. Stosując częściowe dopasowanie nazw parametrów (13), możemy podać tylko p=zamiast phi=.

wprowadź opis zdjęcia tutaj


Długość 14:

stats:::rgamma

R jest open source, ale nie musisz być czarodziejem, aby zobaczyć kod źródłowy; możesz po prostu wpisać nazwę pakietu i funkcję, której kod chcesz wyświetlić, oddzielone trzema dwukropkami ( :::). Daje to kod definiujący rgamma()funkcję, która generuje losowe odchylenia od rozkładu gamma. Przesłanie tego daje:

function (n, shape, rate = 1, scale = 1/rate)
{
    if (!missing(rate) && !missing(scale)) {
        if (abs(rate * scale - 1) < 1e-15)
            warning("specify 'rate' or 'scale' but not both")
        else stop("specify 'rate' or 'scale' but not both")
    }
    .External(C_rgamma, n, shape, scale)
}
<bytecode: 0x00000000098cd168>
<environment: namespace:stats>

Zauważ, że używa funkcji .External(). To wywołuje funkcje napisane w innych językach, zwykle C i Fortran, które stanowią znaczną część podstaw R. Znalezienie tego kodu źródłowego wymaga trochę wiedzy. Edycja: @Vlo zwrócił uwagę, że zwykli śmiertelnicy rzeczywiście mogą zobaczyć podstawowy kod C wywoływany .Internal()i .Primitive()korzystający z pryrpakietu. Dzięki, @Vlo!


Długość 13:

sample(9,s=4)

Nie wygląda to zbyt wiele, ale ilustruje potężną koncepcję w R: częściowe dopasowanie parametrów funkcji . Nazwane parametry w sample()funkcji to size, replacei prob, ale wystarczy podać wystarczającą liczbę liter nazwanego parametru, aby go jednoznacznie zidentyfikować. Dlatego dla sample()możesz użyć s=zamiast, size=ponieważ żadne inne nazwy parametrów nie zaczynają się na literę „s”. Kod tutaj wybiera losową próbkę wielkości 4 z liczb całkowitych od 1 do 9.


Długość 12:

LETTERS[-pi]

Istnieje wbudowany wektor o nazwie, LETTERSktóry zawiera wszystkie wielkie litery angielskie uporządkowane alfabetycznie. W przeciwieństwie do wielu innych języków, można indeksować wektor, używając liczby zmiennoprzecinkowej. Nie dzieje się nic ekscytującego; R po prostu bierze część całkowitą. Użycie -poprzedzającego indeksu wektora usuwa element o tym indeksie z wektora. pijest wbudowaną stałą zawierającą - zgadłeś - liczbę niewymierną π. To usuwa element 3 z wektora i zwraca „A” do „Z” z pominięciem „C”.


Długość 11:

plot(bunny)

W onionpakiecie znajduje się zestaw danych o nazwie bunny. Wykreślenie go daje ci najbardziej przydatną grafikę wszechczasów:

wprowadź opis zdjęcia tutaj


Długość 10:

????sample

Powiedz, że NAPRAWDĘ masz wątpliwości co do sample()funkcji i desperacko potrzebujesz pomocy. Zamiast zwykłego ?sampleotwierania strony podręcznika R. wybijasz cztery znaki zapytania. R słyszy twój trud i próbuje pomóc ...

Contacting Delphi...the oracle is unavailable.
We apologize for any inconvenience.

Niestety.


Długość 9:

isTRUE(1)

Na początku wygląda to na sprzeczne z konwencją w pozostałej części pakietu podstawowego R, aby oddzielić isi następujące słowo w nazwie funkcji za pomocą .. Dotyczy to jednak tylko logicznego testu, czy argument jest określonego typu, jak poniżej (8). W tym przypadku testujemy, czy tak jest TRUE, co nie jest typem. Wykorzystuje to ścisłą definicję TRUE, tj. 1 nie jest „prawdziwe” w zwykłym znaczeniu. isTRUE(1)zwraca FALSE.


Długość 8:

is.na(8)

W przeciwieństwie do większości innych języków programowania, .jest poprawnym znakiem w nazwach funkcji i zmiennych. Nie oznacza żadnej metody ani dziedziczności; to tylko część nazwy. is.na()Funkcja sprawdza, czy jej argument ma wartość NA(brak) i zwrotów TRUElub FALSE.


Długość 7:

stop(7)

To powoduje błąd w danych wejściowych jako komunikat o błędzie. Wywołanie wewnątrz funkcji spowoduje zatrzymanie wykonywania funkcji. Ale wywołanie go poza funkcją nie zatrzyma skryptu. W tym przypadku wynikiem jest Error: 7.


Długość 6:

x < -1

Chociaż może się to wydawać trywialne, pokazuje poważną krytykę operatora przypisania <-: mianowicie znaczenie zmienia się w zależności od rozmieszczenia spacji. Jak wspomniano, x <- 1przypisuje 1 do x. Oddzielenie <i -pojedyncza spacja jak wyżej zmienia logiczny test, czy xjest mniejsza niż -1. Z tego powodu wielu woli =przydział.


Długość 5:

x<<-1

Podobnie jak z <-wyjątkiem <<-zawsze przypisuje zmienną do zakresu globalnego, niezależnie od bieżącego zakresu.


Długość 4:

x<-1

R używa <-do przypisywania zmiennych w bieżącym zakresie. Ten fragment kodu przypisuje wartość 1 do x.


Długość 3:

!0i

!Operatora: R „Nie”, i 0ijest liczbą zespoloną 0+0iAKA 0 w płaszczyźnie zespolonej. Przesłanie tej instrukcji zwraca, TRUEponieważ 0 jest fałszem.


Długość 2:

NA

Zwraca specjalną wartość R NA, która oznacza „niedostępne”, oznaczające brakującą wartość.


Długość 1:

T

To powraca TRUE. W R Ti Fsą synonimami odpowiednio wartości boolowskich TRUEi FALSE.


Yay R "!"(T)!
Vlo,

@ Vlo: "!"(T)ocenia na FALSE. Jednak stwierdzenie „Yay R” nigdy nie jest fałszywe. ;)
Alex A.

Jak mogę głosować więcej za więcej wpisów? „Znalezienie tego kodu źródłowego wymaga trochę magii” jest trywialne .Internali .Primitive->pryr::show_c_source(.Primitive("sum"))
Vlo

@Vlo: Nie słyszałem o pryrpaczce. Bardzo fajny! Dzięki za zwrócenie na to uwagi. Cieszę się, że do tej pory podobały Ci się wpisy, dzięki za wsparcie. :)
Alex A.

2
@ Jemus42 Ah, wygląda na to, że najpierw musisz to zrobić data(bunny).
Alex A.

75

Brainfuck

Factoid: Brainfuck (znany również jako brainf * ck) był eksperymentalnym językiem ezoterycznym do tworzenia najmniejszego kompletnego tłumacza językowego, jaki kiedykolwiek stworzył Urban Müller, i jest obecnie najbardziej znanym językiem tego rodzaju. Ma tylko osiem poleceń, jest łatwy do nauczenia, ale trudny w użyciu.

Brainf * ck ma pamięć podstawy taśmy z 30000 komórkami i ruchomym wskaźnikiem, i można go wizualizować w następujący sposób:

0 0 0 0 0 0
    ^

Ze ^znakiem reprezentującym wskaźnik, a 0 oznacza wartości dla każdej komórki.

Brainfuck ma osiem instrukcji:

Instruction  C Equivalent              Description
+            mem[ptr]++;               Add one to the value under the cell
-            mem[ptr]--;               Subtract one from the value under the cell
>            ptr++;                    Go on cell to the right
<            ptr--;                    Go on cell to the left
,            mem[ptr] = getchar();     Read a ASCII character from input and put the result in the value under the cell
.            putchar(mem[ptr]);        Write a ASCII character to the output using the value under the cell
[            while (mem[ptr]) {        Start a while loop: Continue to matching ']' when value under the cell is 0
]            }                         End a while loop: Go back to matching '[' when value under the cell is NOT 0

Brainfuck do C:

#include <stdlib.h>

int main(void) {
    unsigned char* mem = calloc(30000, sizeof(unsigned char));
    unsigned int ptr = 0;

    // Put your brainfuck code here, converted to the matching expressions under "C equivalent"

    return 0;
}

Długość 1 Snippet

Przeczytaj jeden znak i umieść go w bieżącej komórce.

,

Pamięć (z wejściem: abc)

0 0 97 0 0 0
    ^

Długość 2 Snippet

Dodaj jeden do bieżącej komórki i przesuń wskaźnik w prawo.

+>

Pamięć

0 0 1 0 0 0
      ^

Długość 3 Snippet

Usuń jedną z bieżącej komórki, aż wyniesie zero; Ustaw bieżącą komórkę na zero

[-]

Możliwa pamięć:

Pamięć: (przed)

0 0 100 0 0 0
    ^

Pamięć: (po)

0 0 0 0 0 0
    ^

Długość 4 Snippet

Komentarze: W bezruchu wszystko, co nie jest instrukcją, jest ignorowane. Z tego powodu następujący program jest całkowicie poprawnym (ale pustym) programem do pieprzenia mózgów:

Hey!

Długość 5 Snippet

Prosty program dla kotów (Zapisz dane wejściowe na wyjściu)

,[.,]

Dzięki tomsmede za komentarz

Długość 6 Snippet

Przenieś wartość bieżącej komórki do komórki w prawo (Zakładając, że komórka po prawej stronie ma wartość 0, w przeciwnym razie doda wartość bieżącej komórki do wartości komórki po prawej):

[>+<-]

Ogólnie rzecz biorąc, ludzie używają tego kodu do przenoszenia zmiennej.

Pamięć: (przed)

10 0 100 0 0 0
     ^

Pamięć: (po)

10 0 0 100 0 0
     ^

Długość 25 Snippet

Odwróć sześcioznakowy znak i wydrukuj go, a następnie każdy znak ASCII (N-1) .. 1 (gdzie N jest wartością pierwszego znaku wejściowego).

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

Długość 53 Snippet

main(){i=0;j=0;if(i>=0){if(j<=i)i+=1;i-=1;}return 0;}

Ten zminimalizowany program C jest także programem Brainfuck w przebraniu i odwrotnie! W rzeczywistości (prawie) robią to samo. Oto kod Brainfuck bez „komentarzy” (kod C).

><+-

Pozwól mi wyjaśnić kod Brainfuck (i kod C). Jak widać, wykorzystuje dwie komórki ( ii j). Przyrost pierwszej komórki (przyrost io 1). Następnie zmniejsza tę samą komórkę (zmniejsza się io 1).

To tylko głupiutki przykład, że jakiś kod źródłowy można skompilować jako dwa różne języki i uruchomić (praktycznie) w tym samym.


2
,[.,]- 5 znaków, program dla kotów
tomsmeding

13
To może być najlepszy „Brainfuck 101”, jaki kiedykolwiek widziałem.
hoosierEE

długość 6: wstawiłoby sumę do prawej komórki, a zero do lewej. Nie ruszaj się, prawda?
Filip Haglund,

Dodano zmienną fikcyjną do długości 6, aby lepiej wyjaśnić pojęcie. Program faktycznie doda komórkę nr 3 do komórki nr 4 i
utworzy

58 głosów - czy możesz zaktualizować? :)
Conor O'Brien

65

C ++

Dzięki preprocesorowi, szablonom, lambdom, cechom pisma i niezliczonym innym złożonym funkcjom, których nikt nie jest w stanie zrozumieć w całości, C ++ jest ponownie odkrywany przez każdą nową generację tego standardu. Wykorzystując liczne sposoby robienia rzeczy w czasie kompilacji, można napisać zerowe abstrakcyjne narzuty, takie jak biblioteka, która umożliwia dołączanie jednostek fizycznych do numerycznych typów danych w celu sprawdzenia ich poprawności w czasie kompilacji (np. Nie można przypisać wyniku kg* mdo N)

Długość 1

#

Zazwyczaj wprowadzając instrukcję preprocesora, # może samo stać na linii. Zasadniczo nic nie znaczy i wydaje się być tak nieznany, że większość znaczników składni, które widzę, nie wie o tym.

Długość 2

%:

Oczywiście nie każdy ma #klucz, więc C ++ jest (cóż, naprawdę odziedziczył go po starożytnym C) hojny, aby umożliwić Ci napisanie go za pomocą tego alternatywnego tokena (aka digraph )

Długość 3

??=

To jest kurs historyczny na C ++. Te dni niekoniecznie są już aktualne, choć implementacje mogą je wspierać, są to trójwymiarowe. Ta sekwencja jest tłumaczona #na te systemy, które ją obsługują, ale aby nie zakłócać literałów ciągów surowych, nie jest w nich dozwolona. Implementacje mogą całkowicie zrezygnować z obsługi.

Długość 4

auto

Jest jednym z nowszych (od C ++ 11) wynalazków ułatwiających pracę z ogólnym kodem. Służy do dedukcji rodzaju wyrażenia, a od C ++ 14 może nawet służyć do dedukcji parametrów lambda i typu zwracanych funkcji.

Długość 5

 catch

Jest słowem kluczowym znanym również z wielu innych języków, obecnym w C ++, ale dobry idiomatyczny programista C ++ prawie nigdy go nie używa. W swoich konstruktorach i destruktorach idiomatic C ++ wykorzystuje zasadę powszechnie zwaną RAII (Resource Acquisition is Initialization) lub jak lubię czasami nazywać ją bardziej odpowiednio: SBRM (Scope Bound Resource Management). Dzięki klasom takim jak inteligentne wskaźniki, można powiązać żywotność dynamicznie przydzielanych zasobów (to nie tylko pamięć!) Z innymi obiektami. Gdy te wykraczają poza zakres (np. Zgłoszony wyjątek), obiekty te automatycznie oczyszczają zasoby. Pozwala to na wyjątkowy, bezpieczny i łatwy w użyciu kod, którego nie trzeba używać catch.

Długość 6

[](){}

[]{}()

Jak stefan wspomniał w komentarzach, możesz użyć []{}jako najkrótszego obiektu lambda, dlatego jest to najkrótsza forma do wywołania lambda. Poniższy tekst dotyczy starej wersji:

jest prawdopodobnie najkrótszą formą lambda. Lambdy w C ++ są obiektami (typu zdefiniowanego w implementacji), które są w stanie uchwycić część zakresu, w którym zostały utworzone (kontroluje to składnia []) i są wywoływalne (kontroluje to składnia ()). Ich kod (część {}) ma dostęp do tych zmiennych, tak jakby były w swoim zakresie. Z ich opcjonalnie typ zwracany dedukcja i parametr auto odliczenie wprowadzone w C ++ 14, są narzędzie do wykorzystania do wszystkich standardowych algorytmów bibliotecznych, które oczekują wywoływalnym (np trzeci parametr std :: sort).

Długość 7

virtual

Jest słowem kluczowym, aby zacząć korzystać z polimorfizmu środowiska uruchomieniowego w C ++, jednym z podstawowych bloków programowania obiektowego. Jest to zgodne z zasadą „nie płać za to, czego nie używasz”, ponieważ w innych językach wszystkie funkcje są domyślnie wirtualne. Będąc językiem opartym na paradygmacie, może być zaskoczeniem dla osób myślących, że „C ++ jest zorientowany obiektowo”, widząc programy lub biblioteki, które prawie nie używają tego słowa kluczowego, np. Ponieważ przestrzegają ogólnej zasady programowania.

Długość 8

override

Współdziałanie z wirtualnym słowem kluczowym overridejest jednym z późniejszych dodatków do C ++, aby kompilator mógł dla ciebie więcej pracować. Korzystając z niego, wyrażasz zamiar zastąpienia funkcji wirtualnej w klasie bazowej, a kompilator popełni błąd, jeśli popełnisz błąd, a klasa ta nie ma określonej funkcji. Ogólnie rzecz biorąc, uważa się za dobry styl, jeśli kod wyraża zamiar, zamiast bawić się bitami.

Długość 9

constexpr

Będąc również późniejszym dodatkiem do C ++, constexprpozwala programiście wyrazić funkcje lub zmienne, które są znane w czasie kompilacji i powinny być obliczalne w czasie kompilacji. Pozwala to na użycie tych funkcji w kontekstach wymagających wyrażeń czasowych kompilacji (np. Jako parametry szablonu lub rozmiary tablic). Wiele standardowych funkcji bibliotecznych (jeśli to możliwe) jest już constexpr, więc można ich tutaj użyć.

Długość 10

for(i:c){}

Jest pełną pętlą nad kontenerem lub konstrukcją podobną do kontenera, która obsługuje std::begini std::endpobiera iteratory (w tym tablice w stylu C). Jest to w zasadzie odpowiednik for(auto __i = std::begin(c); __i != std::end(c); ++__i){ auto& i = *__i; }. Pozwala to na łatwe zapętlanie kodu ogólnego.

Długość 11

void f()&&;

To nowy sposób deklarowania funkcji składowych i właściwości obiektu, do którego można je wywoływać. W poprzednich wersjach C ++ mieliśmy możliwość wybrania, void f() const;aby informować kompilator, aby mógł wywoływać funkcję na obiektach const (dlatego bez const nie można wywoływać ich na obiektach const). W ten sam sposób mamy teraz &&składnię odwołań do wartości r, aby móc wywoływać te funkcje w wartościach r.

Długość 12

int main(){}

Jest to prawdopodobnie najkrótszy kompletny program, który można skompilować i uruchomić. Nic nie da i zwróci 0. Zwrot ten jest jednym z wielu specjalnych przypadków, które można napotkać w C ++. Zwykle zwracanie niczego nie jest niezdefiniowanym zachowaniem, ale dla funkcji punktu wejścia main, zwracanie niczego oznacza zwracanie 0.

Długość 13

auto f()->int

jest raczej nowym sposobem deklarowania typu zwracanego przez funkcję. Zwykle nie zrobiłbyś tego, jeśli znasz już typ, ale w programowaniu ogólnym istnieje wiele sytuacji, w których typ zależy od parametrów szablonu i używanych zmiennych. Wykonanie tego w ten sposób pozwala na nieco łatwiejszy dostęp do tych parametrów jak w template<class T> auto f( const T& t ) -> decltype(t.foo())zamiasttemplate<class T> decltype(std::declval<T>().foo()) g( const T& t ) { return t.foo(); }


2
Sugerowałbym użycie ;jako alternatywnego fragmentu 1-znakowego, ponieważ nie jest to makro preprocesora, a fakt, że możesz mieć 1-znakową instrukcję w C ++, wydaje się w ogóle zaskakujący.
Joe Z.

1
[](){}nie jest najkrótszą formą lambda: Ponieważ lista parametrów jest pusta, można ją pominąć. Stąd []{}jest najkrótsza lambda. Trywialnie, []{}()to najkrótsza egzekucja lambda ;-) ideone.com/k8fAvs
stefan

@stefan: rzeczywiście, zawsze o tym zapominam, ponieważ nie wygląda to tak, jak wtedy;) Dodałem go do odpowiedzi.
PlasmaHH

@PlasmaHH Absolutnie nienawidzę tego, bo rzeczywiście nie wygląda jak funkcja .. ;-)
Stefan

59

Regex

Długość 2 fragmentu kodu

[]

JavaScript : pusta klasa znaków, która nie pasuje do niczego.

PCRE , Java , Pythonre , Ruby (testowany w wersji 2.0): Błąd składniowy.

Długość 1 fragmentu

.

., o nazwie kropka-wszystko, jest dostępny we wszystkich smakach, na które miałem okazję spojrzeć.

Co to pasuje?

I̧n͟ g̨͜e҉̡͞n̵͢e͜͝r̷͝a͘l̢҉, ̡͟ ̕̕ ̴.̸̴̢̛́ ̸̡̢m͞ąt̴̨c͞h̛e͢͡s̶͘ ͘a҉n̛͜͠ỳ̸ ͢c̵̡hár͘͝a̕͢ćt͘͠e͏̀͠r̷̀ ̴̕͢ex͝͞͞c҉ep̀t̛ ̕f̴҉o͟͜r̴͢ ͞n͏ę͟w̢̕͜ ͡l͝i͟n͢͡e.

JavaPattern : W trybie domyślnym kropka-wszystko pasuje do dowolnego punktu kodowego, z wyjątkiem tych 5 punktów kodowych \r\n\u0085\u2028\u2029. Przy UNIX_LINESwłączonym trybie (ale bez DOTALL) kropka-wszystko pasuje do dowolnego punktu kodowego, z wyjątkiem \n. Przy DOTALLwłączonym trybie kropka-wszystko pasuje do dowolnego punktu kodowego. W Javie 5 Patterndziała na punkcie kodowym, więc znaki astralne są dopasowywane przez kropkę.

Pythonre (testowany w wersjach 2.7.8 i 3.2.5, może być inny w wersji 3.3+): W trybie domyślnym, kropka-wszystko pasuje do dowolnej jednostki kodu UTF-16 (od 0000 do FFFF włącznie), z wyjątkiem \n. re.DOTALLznosi wyjątek i .dopasowuje dowolną jednostkę kodu UTF-16. W tych wersjach redziała na jednostkach kodu UTF-16, więc .tylko jedna jednostka znaków może dopasować kod w płaszczyźnie astralnej.

.NET : Taki sam jak Python. Tryb kropka-wszystko w .NET jest nazywany Singleline.

JavaScript (C ++ 11 <regex>) : W trybie domyślnym kropka-wszystko pasuje do dowolnej jednostki kodu UTF-16, z wyjątkiem tych 4 punktów kodowych \n\r\u2028\u2029. Po swłączeniu flagi kropka-wszystko pasuje do dowolnej jednostki kodu UTF-16. JavaScript działa również na jednostkach kodu UTF-16.

PCRE : w zależności od wariantu wykonania, punkt wszystko można wykluczyć \r, \nalbo \r\n, 3 albo wszystkie sekwencje CR LF lub każdą sekwencję nowej linii Unicode w trybie domyślnym. W trybie domyślnym silnik działa na jednostce kodu (może być 8, 16 lub 32-bitowa jednostka kodu), więc kropka-wszystko pasuje do dowolnej jednostki kodu, z wyjątkiem sekwencji nowego wiersza. W trybie UTF silnik działa na punkcie kodowym, więc kropka-wszystko pasuje do dowolnego punktu kodowego, z wyjątkiem sekwencji nowego wiersza. Wywoływany jest tryb kropkowania PCRE_DOTALL.

PHP (testowany na ideone): PCRE skompilowany jako biblioteka UTF-8 i \ndomyślnie jest jedyną sekwencją nowego wiersza. Tryb Dot-all jest dostępny poprzez sflagę.

Postgres : W trybie domyślnym kropka-wszystko pasuje do dowolnego punktu kodowego bez wyjątku.

Ruby (testowany w wersji 2.0.0): W trybie domyślnym .dopasowuje dowolny punkt kodowy oprócz \n. Tryb kropki jest dostępny poprzez mflagę (!).

s Flaga jest używana do wskazania kodowania Windows-31J w Rubim.


Faktoid

Ŗ͞e̡͟҉ǵ͟͢e̴̢͘͡x̡́͞ ̛̀҉҉̢c҉̷̨a̸̛͞n҉̛͠ ̷̸̀p̴͠͡҉̵ą̧͜͢r̸̸̷̢͝s̢̀͡e̷̷̷͘͞ ̨̧̀H̨̧͜͜T̷͞M̷̛͜L͢. ”Powtórz za mną. R̶̶̢̧̰̞̻̮̳̦̥ͭͯ̓̈ͯͤ̇͊͊͟ĕ̹̩̪͈͈͍̗͎̝͚̽̈ͨ̐̽ͪͮ̍͐ͮͧ̔̏̓ͣĝ̵̢̢̖̤̜̭͔͊͒ͦ͛ͤ͗ͬͧͪ̾͘͟eͦ̄ͭ̑̾҉̨̨̝̬̹̘̭͔͟͢x̣̻͓̠͈͕̥̜͚̝̫͚̳̾̍ͦ̑̈̋̌̉͊ͮ͗̄̆̒̚̚ ̸̦͈̥̬̺͇ͧͧ͐ͮ̌ͤ̈̒̆ͣ̈̏̔͊̐ç̨̬̪̳̦͎̖͕̦͔ͨ̿̓̈ȁ̸̳̺̠̭ͮ̓̐͘̕͜͡ņ̨̫͔͍̬̤̘͎͚̣̟̦͍̜ͭͭ̈ͦ̈̽͗ͥ̑͝͡ analizowania ͉̭̫̰͔̝͓̼̮͚̻͎͎͉̐͗͗͊̇ͣ͒͗͑̆͐̐ͬ͛ͮ͝H̢̥͕̼͓̫͙̺̼̮ͣͦ̍ͨ͒̔̌T̪̦̻̦͖̞̤͒̑ͭ̐̑ͭͣ͐̒̉͊͜͜M̞̪͇͕̩͉͗ͧ̌ͯ͋̉̍ͭ̓̇̐̌͜͠Ĺ̷̨̳̘̯͚͓͛͌ͭ̉̍.ͯ͆̊ ͯ̇̓̏͐ͪ̋̈͑̕҉̷̠̰̼̤


35
Żal mi każdego, kto nie otrzymuje referencji faktoidu.
Robobenklein,

6
@robobenklein Znam tajny lek na twój ból: Po prostu nas oświeć!
flawr

24
@flawr Dla tych, którzy nie znają słynnego pytania: pierwsza odpowiedź na stackoverflow.com/questions/1732348/… jest tym, czego szukasz.
Robobenklein,

1
Możesz przeczytać tekst Zalgo, ale nie bierz ich zbyt poważnie w obu kierunkach. To oczywiste, że ślepo podążać drogą Zalgo, ale tekst Zalgo nie jest cały czas zły.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳

12
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳, czy nie użyjesz tych wszystkich głosów, aby pokazać nam, jak analizować HTML?
mbomb007

57

jot

PS: Fragmenty są teraz połączone z tryJ.tk, dzięki czemu możesz się nimi bawić w przeglądarce JavaScript bez instalowania J.

PPS: Zamieniłem zamówienie; ma to większy sens dla osób przyłączających się i do wykorzystania w przyszłości.

PPS: Myślę, że z powodu ograniczeń czasowych dodam jeden fragment dziennie

factoid:

J jest potomkiem APL (patrz tutaj dla historii rodziny) minus zestawu znaków śmieszne.

Długość 1 fragmentu

_

J używa _zarówno jako wskaźnika nieskończoności, jak i jako wskaźnika ujemnego , gdy jest dołączony do literałów liczbowych (w przeciwieństwie do czasownika -).

Długość 2 fragmentu kodu

a.

a.nazywa się Alfabet , zawierający wszystkie 1-bajtowe znaki. Jako taki J nie zawiera funkcji takich jak atoi, ponieważ są to proste wyszukiwania w alfabecie:a. i. 'z' =122

Długość 3 fragmentu kodu

i.9

i.jest liczbą całkowitą, gdy jest używana monadycznie (tj. tylko jeden argument, właściwy, zwykle nazywany y). Przy stopniowym stosowaniu służy jako wskaźnik , jak w powyższym przykładzie.

Długość 4 fragmentu kodu

!!6x

J obsługuje liczby całkowite i wymierne o dowolnej dokładności . Oblicza silnię silni z 6 (liczba 1747 cyfr).

Długość 5 fragmentu kodu

^.^:_ 

Gęsty ... Po pierwsze, czasowniki (jako funkcje wywołań J) są uporządkowane tematycznie. Wszystkie ^ czasowniki są powiązane z potęgowaniem. ^do potęgowania (i expgdy jest używane monadycznie, ^.dla logarytmów .) ^:jest specjalnym, koniunkcją Mocy (funkcja wyższego rzędu), która stosuje funkcję kilka razy. Gdy argument prawym jest nieskończonością ( _), wykonuje lewy argument (w przykład ^.) na własnym wyjściu, aż się zbiegnie. W efekcie ^.^:_jest to czasownik rozwiązujący, x = ln(x)gdy zastosowany do dowolnego argumentu oprócz 1, daje 0.318132j1.33724.

Długość 6 fragmentu kodu

^0j1p1

lub równoważnie

^o.0j1

Tożsamość Eulera w J. Jak cytowano powyżej, ^to exp(). Oprócz liczb całkowitych i wymiernych o dowolnej precyzji, obsługuje również potęgę liczb pi i liczb zespolonych oraz ich kombinacje jako literały. 0j1p1oznacza (0 + j) * pi ^ 1.

Długość 7 fragmentu kodu

+/&.:*:

Czasownik przyjmujący 2-normę dowolnego wektora. To pokazuje 2 rzeczy:

  • Insert przysłówek czasownik włącza Dodaj +do Sum, wstawiając go między każdym elementem swojego argumentu. Stąd (0+1+2+3) = +/ i.4.

  • Koniunkcja Under, gdy jest używana jako, v &.: u yjest równoważna z vi u v y, gdzie vijest awers (ogólnie odwrotność).

Tak, J wie o funkcjonalnych inwersjach. Połączenie ich sprawia, że ​​czasownik we fragmencie jest równoważny %: @: (+/) @: *:lub sqrt(sum(y.^2))na przykład w Matlabie.

Długość 8 fragmentu kodu

$#:I.@:,

Widelec składa się z 3 czasowników bez jakiegokolwiek odniesienia do argumentów. Pozwala to na to, co w J nazywa się programowaniem ukrytym (bez punktów). Rozwidlenie f g h, w przypadku monadycznym (jak w tym przykładzie) jest równoważne z (f y) g (h y). Jak widelce, tablice wielowymiarowe są nieodłączną częścią J. „Indeksy” zwracają indeksy jedności w wektorze, ale nie rozciągają się na wyższe wymiary jako takie. W tym przykładzie zastosowano Shape , Antibase i I.@:,jako 3 zęby widelca implementujące I. dla tablic o wyższych wymiarach, na przykład:

 ($#:I.@:,) 5 = i. 5 5 NB. indices of 5 in i. 5 5

Długość 9 fragmentu kodu

<"1 i.4 6 

Tablice w ramkach są typem danych w J, pozwalającym łączyć heterogeniczną zawartość (zarówno typ, jak i rozmiar) w jedną wartość. Monadyczne < pudełka to argument. Ranga jest centralną koncepcją w J i pozwala automatycznie rozciągać czasowniki w kierunku tablic o większych wymiarach. Zarówno rzeczowniki, jak i czasowniki mają rangę.

Ranga rzeczownika to liczba wymiarów dowolnego rzeczownika, którą czasownik $@$może powiedzieć. Na przykład i. 2 3 4jest tablica rangi 3.

Ranga czasownika to ranga, na którą zastosuje się czasownik. Każdy czasownik ma wewnętrzną rangę, do której można uzyskać zapytanie za pomocą spójnika podstawowego . v b. 0zwraca 3 liczby dla monadycznej, dyadycznej lewej i dyadycznej prawej rangi czasownika v.

Czasownik działa na komórkach rzeczownika o randze równej czasownikowi i zastępuje wyniki w rank-verb rankramce rzeczownika . Rangę czasownika można ograniczyć za pomocą koniunkcji Ranga , tak jak to się dzieje tutaj, bokserskie komórki rangi 1 (wiersze) zamiast pracować nad rangą _, tj. boksowanie całej tablicy. Więcej informacji na temat rangi można znaleźć tutaj .

Długość 10 fragmentu kodu

<./ .+~^:_

Ten fragment jest czasownikiem obliczającym najkrótszą ścieżkę nad ważonym wykresem. Wprowadza koniunkcję minimum ( <./) i kropki . Kropka jest uogólnieniem produktu macierzowego, który można zapisać jako +/ . *. Ogólnie rzecz biorąc, u . vjest równoważne z tym, u@(v"(1+lv,_))gdzie lv jest lewą rangą czasownika v. Lub słowami „u stosuje się do wyniku v na listach„ lewych komórek argumentu ”i prawego argumentu toto”. (Patrz wyżej dla rang)

W związku z tym czasownik wewnętrzny <./ .+~zamienia element y(i,j)na minimum y(i,k)+y(k,j)dla wszystkich k.

^:_ iteruje ten krok aż do konwergencji.

Przykład wyświetlania oryginalnej i najkrótszej odległości ścieżki:

(]; <./ .+~^:_ ) wtm=: _6]\0 2 5 _ _ _ _ 0 4 1 3 _ _ _ 0 _ _2 _ _ _ 4 0 _ 5 _ _ _ _1 0 6 _ _ _ _ _ 0

Długość 11 fragmentu kodu

<.@o.10x^99

Ten fragment kodu wprowadza specjalny kod : Niektóre kody J są obsługiwane przez kod specjalnie napisany dla określonego przypadku użycia, rozpoznany w czasie analizy i zoptymalizowany; albo dla wyższej dokładności (jak w tym przypadku) lub wyższej wydajności (patrz Specjalne kombinacje )

Ta fraza daje 99 cyfr pi (choć przesunięto 99 miejsc po przecinku). Kod specjalny zależy od dokładnego sformułowania, to, co normalnie byłoby równoważne, nie jest tak precyzyjne jak kod fragmentu: <.o.10x^99 traci rozszerzoną precyzję.

Długość 12 fragmentu kodu

($-.1:)($,)]

Od czasu do czasu trafiasz na sytuacje, w których z powodu wyborów dokonanych w danych przeszkadzają pojedyncze wymiary. To przydatne narzędzie, zwane ściśnięciem w Matlabie, wyciska wszystkie wymiary singletonu. Lewy ząb widelca ($-.1:)daje wszystkie wymiary bez tych, podczas gdy środkowy ($,) przekształca zniszczoną tablicę do zachowanych wymiarów. Właściwy ząb ]służy tylko do uczynienia z niego rozwidlenia i odwołuje się do właściwego argumentu.

Długość 13 fragmentu kodu

1 :'-u%u d.1'

Metoda Newtona znajduje przybliżenie pierwiastka funkcji różniczkowalnej. To jawne przysłówek ma być stosowane do funkcji, której poszukiwany jest root, i reprezentuje jeden etap procedury iteracyjnej. ujest argumentem odnoszącym się do funkcji, zastępowanym w momencie zastosowania przysłówka. d. jest koniunkcją wyprowadzającą funkcje symbolicznie i może być tutaj zastąpiona przez to, D.co robi to samo liczbowo (ale różni się w przypadku zastosowania do funkcji wyższego rzędu). Rezultatem jest haczyk odejmujący widelec ( upodzielony przez jego pochodną) od argumentu.

Na przykład:

(_2 + *:) (1 :'-u%u d. 1')^:_ ] 1 NB. root of x^2-1; ] is there to avoid combining _ and 1 into an array.

Długość 14 fragmentu kodu

(%-.-*:)t.i.10

Pierwsze 10 liczb z serii Fibonacciego według rozszerzenia Taylora z x / (1 - x - x^2). Analiza haka %-.-*:daje (y % (-.-*:) y) = (y % ( (1 - y) - *: y).

Długość 15 fragmentu kodu

(#{.+//.)!/~i.9

Kolejne spojrzenie na serię Fibonacciego. Tym razem pod innym kątem; zaczynając od trójkąta Pascale „! /~i.9”.

/w przypadku dyadycznego użycia oznacza Tabelę , zastosowanie czasownika, do którego jest ona powiązana między każdą komórką jej argumentów, co daje tabelę operacji między argumentami x i y. W tym przypadku !stosuje się go stopniowo, jako połączenie (lub brak) . ~czyni czasownik Refleksyjny , tj. użyj jego prawego argumentu jako lewego.

Przysłówek /.jest nieparzysty, stosuje swój czasownik wzdłuż anty-przekątnych tablicy (np. Spróbuj </.!/~i.5tutaj )

Tak więc ten fragment pobiera sumy z 9 pierwszych anty przekątnych w trójkącie Pascala, co jest kolejnym przypadkiem serii Fibonacciego.

Długość 16 fragmentu kodu

;/@~.,. <"0@#/.~:

Ok, dodałem spację, żeby dostać się do 16 :). Ten fragment pokazuje rozwidlenie za pomocą klucza : wyświetlenie wszystkich pozycji w argumencie i ich częstotliwości.

x u/. ystosuje u do y na fragmentach, w których x jest unikalny, lub w J:, (=x) u@# ygdzie =jest Self-Classify , który generuje tablicę boolowską zawierającą 1 w pozycjach, w których występują w nub ~. Tutaj jest stosowany odruchowo, stąd wykonywanie Tally na każdym unikalnym elemencie w y, licząc liczbę wystąpień.

Ponieważ większość czasowników w J zachowuje porządek nub (kolejność pojawiania się nowych unikalnych przedmiotów, w przeciwieństwie do na przykład uniquew Matlabie, który sortuje swój argument), można to wykorzystać do zszycia przedmiotów do ich częstotliwości, tak jak to tutaj zrobiono. ;/@~.służy do utworzenia pudełkowej listy wszystkich elementów.

Zauważ, że ponieważ jest to powszechna koncepcja rangi , ten kod działa dla dowolnej wielkości .

Długość 17 fragmentu kodu

*./ @:(#&>)@C.@A.

J obsługuje kilka podstawowych operacji dotyczących permutacji:

  • Anagram A. Monadycznie znajduje indeks Anagram, dynastycznie stosuje permutację określoną przez indeks anagram w lewym argumencie do prawego argumentu.
  • Cykl - Permute C. konwertuje między bezpośrednią i cykliczną reprezentacją permutacji.

Ten fragment jest czasownikiem, który przenosi indeks anagramu w lewo (od 0 do !#y) i prawy argument y tablicy do permutacji. Następnie oblicza LCM *./ długości cyklu #&>, tj. okres, po którym odzyskujesz oryginalną tablicę:

]n=: (p=:?!9) *./ @:(#&>)@C.@A. i.9 NB. period of a random permutation
p&A.^:n i.9 NB. applies permutation n times.

Długość 21

<:@(#/.~)@(i.@#@[,I.)

Ten mały czasownik pochodzi z dodatku „stats / base” i nazywa się histogram . Robi to dokładnie tak, że biorąc pod uwagę listę uruchomień bin, sumuje wszystkie wystąpienia danych pomiędzy w przedziale, w ]bn-1,bn]którym bn jest początkiem bin liczby n.

Wykorzystuje wskaźnik interwałowyI. do znajdowania przedziału:

Jeśli y ma kształt elementu x, to x I. y jest najmniej nieujemnym j, tak że j {x podąża za y w porządku, lub #x jeśli y podąża {: x w porządku lub jeśli x ma żadnych przedmiotów.

Sumowanie poszczególnych przedziałów odbywa się za pomocą klucza opisanego we fragmencie 16.

Fragment powiązany z tryj.tk demonstruje centralne twierdzenie o granicy przy użyciu tego histogramu:

(bins=:(%~>:@i.)10) ( [ (graph=:(,&":"0 1 '#'#"0 1~])) (histogram=:<:@(#/.~)@(i.@#@[,I.)) ) (+/%#) ?5 200 $ 0

Długość 22

=,&(+/)(~:#[)e.&~.~:#]

Zabawa w J. To implementuje silnik mastermind, biorąc tajną tablicę jako lewy argument i zgadnij jako prawy. Zwracane wartości to liczba białych i czarnych kołków. Rozebrane:

NB.   ExactMatch: checks where digits correspond:
ExactMatch =: =

NB.   GoodDigitWrongPlace: Copies non-matched numbers from both arguments (left and right
NB.   pairs of parentheses, and checks them for same elements(e.), after eliminating
NB.   doubles in both (&~.)
GoodDigitWrongPlace =: (~: # [) (e.&~.) (~: # ])

NB.   Piecing the conditions together, after summing the booleans:
mm =: ExactMatch ,&(+/) GoodDigitWrongPlace

Do użycia jak

secret (=,&(+/)(~:#[)e.&~.~:#]) guess

Gdzie secreti gdzie guessjest dowolna tablica. Właściwie działa z dowolnym typem danych.


17
Cóż, albo otrzymujesz nieczytelną stertę dziwnych symboli, albo otrzymujesz nieczytelną stertę symboli ASCII. Wybierz swoją truciznę.
John Dvorak,

16
@JanDvorak Wszystkie języki są nieczytelne, dopóki się ich nie nauczysz. ;-)
Gareth

5
Kiedyś myślałem, że długie opisowe nazwy pomagają w zrozumieniu kodu. Potem został oświecony .
hoosierEE

@Gareth Ale nie wszyscy są nieczytelne nawet po ich nauczyć. Nie wymienia żadnych imion.
flawr

45

RPL (Redstone Programming Language) [i Minecraft]

Jest to duży problem, czy możemy uznać to za prawdziwy język programowania, czy nie, ale i tak spróbujemy. Ponieważ te dwa „języki” są praktycznie takie same, połączę je, czasami publikując fragmenty w języku „Minecraft” (Redstone itp.), A czasem w RPL. Ponadto, ponieważ wiele fragmentów będzie w Minecraft, opublikuję linki do zdjęć zamiast do samych zdjęć, aby zaoszczędzić miejsce. Dodatkowo, wszystkie fragmenty będą dotyczyły koncepcji programistycznych w Minecraft, a nie ogólnego redstone (tzn. Nie pojawią się drzwi redstone). Postacie będą liczone w bajtach (w RPL) lub zgodnie z tym (w Minecraft).

Faktoid:

RPL to język programowania opracowany przez Tossha the Inventor, który konwertuje kod na Redstone Redstone i bloki poleceń. Może wykonywać operacje wejścia i wyjścia, pętle, manipulowanie liczbami całkowitymi, funkcje triggera, root i wiele więcej.

Długość 1:

Przycisk (1 bajt) jest najprostszą formą wprowadzania w Minecraft. Może także uruchomić lub zatrzymać „program”. Podobnie dźwignia (również 1 bajt) jest inną formą wprowadzania i może być również używana do uruchamiania i zatrzymywania programu, ponieważ ma on stan „włączony” i „wyłączony”. Należy pamiętać, że Minecraft jest dosłownie językiem programowania 3D, więc gdzie przycisk / dźwignia znajduje się w programie, może mieć ogromną różnicę.

Długość 2:

Przycisk przymocowany do lampy z czerwonego kamienia to właściwie bardzo podstawowy program dla kotów. Zajmuje wejściowe (z przycisku lub dźwigni, albo 0czy 1( offi on)) i przesyła je w postaci światła z lampy, jak też 0i 1( offlub on).

wprowadź opis zdjęcia tutaj

Długość 3:

Jak widać poniżej, jest to jeden z najkrótszych programów modyfikujących kod źródłowy (ponieważ możesz zmodyfikować źródło w czasie wykonywania za pomocą Minecraft!). Teraz ten konkretny naprawdę nie ma sensu, ale koncepcję można łączyć z innymi, aby tworzyć niesamowite programy (aby uzyskać więcej głosów pozytywnych). Po uruchomieniu program usuwa źródło danych wejściowych i uniemożliwia jego ponowne uruchomienie. wprowadź opis zdjęcia tutaj

Długość 4

Ten „fragment” pokazuje w rzeczywistości dwie koncepcje: opóźnienie i bramkę NIE. Opóźnienia dokonuje się za pomocą pewnych elementów redstone, które mają opóźnienie tykania redstone . Redstone-tick jest równy jednej dziesiątej sekundy. Różne komponenty Redstone mają różne opóźnienia: latarka ma opóźnienie 1rt (1 tyknięcie Redstone), komparator ma opóźnienie 1rt, repeater może mieć opóźnienie 1, 2, 3 lub 4rt, w zależności od konfiguracji. W tym przykładzie repeater Redstone jest ustawiony na opóźnienie 4rt.

Dalej jest bramka NOT. Bramka NOT przyjmuje dane wejściowe i odwraca je. Więc w tej konfiguracji wyjście będzie włączone, jeśli wejście jest wyłączone, a wyjście będzie wyłączone, jeśli wejście będzie włączone.

Długość 5

Bramkę OR można bardzo łatwo osiągnąć w Minecraft. Dwa wejścia są podłączone do tego samego wyjścia. To jest to. Żadnych zabawnych sztuczek ani nic, to całkiem proste.

wprowadź opis zdjęcia tutaj

Długość 6

Oto wskazówka dotycząca kompaktowania „kodu”. Jeśli wiesz, że siła sygnału na dwóch wejściach jest wystarczająco mała, aby nie zakłócać odpowiadających im wyjść, możesz połączyć ze sobą prawy redstone. W poniższym przykładzie istnieje prosty licznik czasu leja, który przesyła elementy tam i z powrotem w ciągu około 0,5 s w każdym leju, połączony z komparatorami, które wytwarzają siłę sygnału wynoszącą 1. Oznacza to, że dwa wyjścia nie będą ze sobą kolidować. W tym przykładzie lampy są tylko w celach demonstracyjnych i nie liczą się do całkowitej liczby bloków.

wprowadź opis zdjęcia tutaj


7
Masz 13 pozytywnych opinii, mogę zaryzykować 10 programów moar?
Rɪᴋᴇʀ

4
Żaden z twoich programów nie jest napisany w RPL, więc nie przekazuj go jako takiego. Jest to wyłącznie „kod” Minecrafta.
mbomb007 20.04.16

2
Masz deficyt 14 programów m8. Chciałbym zobaczyć, co masz na myśli;)
Conor O'Brien

4
Masz 21 głosów pozytywnych, mogę zranić 15 programów moar?
wizzwizz4

1
Masz 29 pozytywnych opinii, mogę zaryzykować 23 programy moar?
bb010g,

42

TI-BASIC

[Język różni się w zależności od używanego kalkulatora, ale używają one TI-84, chyba że zaznaczono inaczej.]

Długość 31

Menu("","1",A,"2",B
Lbl A
Lbl B

To pokazuje użycie menu. Powyższy jest dość bezużyteczny, ponieważ nic nie robi, ale można ich użyć do nawigacji w różnych częściach programu. Pierwszym argumentem jest tytuł menu, po którym następują pary opcji (wyświetlany ciąg, po którym następuje etykieta 1- lub 2-literowa). Oto bardziej intuicyjny przykład:

Menu("CHOOSE VALUE","AREA",A,"CIRCUMFERENCE",C
Lbl A
Disp πR²
Stop
Lbl C
2πR

Lblmoże być również używany do rozgałęziania za pomocą Goto. Menu ma pewne ograniczenia, które sprawiają, że korzystanie z nich jest denerwujące: może być tylko siedem pozycji menu, a każdy tytuł może zawierać najwyżej czternaście znaków, więc całość zmieści się na jednym ekranie.

Długość 29 fragmentu kodu

Real
√(-16
a+bi
Ans
re^θi
Ans

Real(domyślnie włączone) ustawia kalkulator w trybie liczb rzeczywistych, więc obliczenia obejmujące liczby zespolone powodują NONREAL ANSbłąd. Po a+biwłączeniu trybu kalkulator wyświetla odpowiedzi jako liczby zespolone, jeśli mają zastosowanie, więc drugi przykład powraca 4i. re^θiTryb używa biegunowych zamiast prostokątnych współrzędnych, więc wyświetla dane wyjściowe 4e^(1.570796327i).

Długość 23 fragmentu kodu

If A≥9
Then
1→X
7→Y
End

To tylko prosty warunek, chociaż może istnieć Elsestwierdzenie. Theni Endnie są wymagane, jeśli jest to tylko jedna instrukcja.

Długość 21 fragmentu kodu

(-B+√(B²-4AC))/(2A)→X

Ulubiona przez wszystkich, kwadratowa formuła. Przechowuje pierwsze rozwiązanie równania kwadratowego, ponieważ Xprzy założeniu, że a, b i c są przechowywane w odpowiednich zmiennych, jak w ax 2 + bx + c .

Długość 20 fragmentu kodu

Shade(|X/2|-3,5-X²,0

Zacienia to przecięcie dwóch funkcji, z kilkoma opcjonalnymi parametrami: minimalną i maksymalną wartością x oraz kierunkiem i odległością między liniami cieniowania.

Długość 18 fragmentu kodu

LinReg(ax+b) L1,L2

Tutaj obliczamy równanie regresji liniowej lub równanie liniowe, które najlepiej pasuje do grupy punktów, z wartościami x zapisanymi jako lista w, L1a wartościami y w L2. Dostępnych jest wiele innych opcji regresji, w tym kwadratowych, sześciennych i wykładniczych.

Długość 17 fragmentu kodu

dbd(1.2711,1.2115

Oblicza liczbę dni między dwiema datami, w tym przypadku 27 stycznia 2011 r., W dniu uruchomienia tej witryny, i 21 stycznia 2015 r., W dniu, w którym została napisana. (Dla leniwych to 1455 dni). Sposób kodowania dat jest trochę dziwny: albo DDMM.RR, albo MM.DDRR, zera wiodące opcjonalne.

Długość 16 fragmentu kodu

For(A,0,5
Disp A

To pokazuje dwie części strony programowania. Pierwsza to typowa forpętla, podobnie jak for(var A=0;a<5;a++)w innych językach. (Powinieneś także użyć Endpolecenia, aby wyjść z pętli.) Drugi jest oczywisty: wyświetla A, w tym przypadku 5 razy z powodu pętli.

Długość 15 fragmentu kodu

Y1=|X³-4|
Y2=3X

Oto dwa przykłady znanego cechą graficznych kalkulatorów graficznych: równań. Możesz mieć 10 różnych równań wykreślonych na tej samej płaszczyźnie, i istnieje wiele przydatnych poleceń do znalezienia przecięć, maksimów, wartości x , itp. Te równania wyglądają tak, gdy są wykreślane w standardowym oknie:

Wykres

Długość 14 fragmentu kodu

[[1,2][34,5]]T

Nawiasy są używane do tworzenia macierzy, a Ttranspozycja macierzy:

[[1 34]
 [2 5]]

Długość 13 fragmentu kodu

dayOfWk(9,1,6

To jest dzień tygodnia 6 stycznia 9 roku naszej ery. Dane wyjściowe to liczba, gdzie 1 to niedziela, 2 to poniedziałek i tak dalej. Ta konkretna data była wtorek, więc wynik jest 3.

Długość 12 fragmentu kodu

Circle(1,3,5

Pierwsze z podstawowych narzędzi do rysowania rysuje okrąg na wykresie o środku w (1,3) i promieniu 5.

Długość 11 fragmentu kodu

randInt(0,8

Generuje to (pseudo-) losową liczbę całkowitą od 0 do 8 włącznie. Istnieje opcjonalny trzeci argument, który mówi, ile liczb całkowitych ma zostać wygenerowanych. Istnieje kilka innych funkcji losowych, w tym funkcje dla rozkładów normalnych i dwumianowych, jedna dla macierzy losowej i jedna dla losowo uporządkowanej listy bez powtórzeń. randIntmoże być zaszczepiany przy przechowywaniu wartość jako rand: 2→rand.

Długość 10 fragmentu kodu

4>5 or 2≠7

Tutaj mamy (nie) operatory równości i logiki TI-BASICA. Instrukcje nierówności oceniają najpierw 0 or 1i orzwracają wartość true, jeśli którakolwiek ze stron jest prawdziwa, więc jest to wyświetlane 1.

Długość 9 fragmentu kodu

.656▶F◀▶D

To może konwertować z dziesiętnego na ułamkowy i odwrotnie, co jest bardzo przydatne. Istnieją również dedykowane ▶Fraci▶Dec funkcje, które tylko udają jeden sposób. Drukuje 82/125w tym przypadku.

Długość 8 fragmentu kodu

lcm(14,6

Spowoduje to wydrukowanie najmniejszą wielokrotność 14 i 6, czyli 42.

Długość 7 fragmentu kodu

getDate

Dość oczywiste, po prostu drukuje bieżącą datę systemową jako listę, w tym przypadku {2015 1 19} .

Długość 6 fragmentu kodu

√({4,9

Tablice (lub listy) są otoczone nawiasami klamrowymi i oddzielone przecinkami. Jest to podobne domap funkcji wielu języków, w której iteruje się przez każdy element listy i stosuje do niej operację poza nawiasami klamrowymi, w tym przypadku pierwiastek kwadratowy, więc wynik jest następujący {2 3}. Pamiętaj, że nawiasy zamykające są opcjonalne, więc odtąd będą pomijane.

Długość 5 fragmentu kodu

4iii6

Mamy tu kilka fajnych rzeczy. Najpierw mnoży się części rzeczywiste, 4 i 6, a następnie mnoży się części wyobrażone: i^3lub -i. Te pomnożone dają-24i . Przedstawia to funky wyglądające mnożenie zestawień i obsługę wyimaginowanych liczb przez TI-BASIC.

Długość 4 fragmentu kodu

8°5′

Jest to 8 stopni, 5 minut łukowych, które są konwertowane na stopnie as 8.0333 ...

Długość 3 fragmentu kodu

8→T

To pokazuje, jak liczby mogą być przechowywane jako zmienne, co jest dość niezwykłe, ponieważ liczba jest pierwsza, następnie strzałka zapisu, a następnie nazwa zmiennej. Jak wspomniano w factoid, θ(theta) może być również użyte jako zmienna, a zmienne mogą być tylko jedną wielką literą.

Długość 2 fragmentu kodu

4M

Podobnie jak w przypadku Mathematica, można pomnożyć przez zestawienie, bez *potrzeby. Wszystkie zmienne są domyślnie inicjowane na 0, więc wyświetli się 0, chyba że w tej zmiennej zapisałeś coś innego (patrz fragment 3).

Długość 1 fragmentu

e

Jest to stała dla liczby Eulera , która wyświetla się jako 2.718281828.

Faktoid

Zmienne mogą przechowywać tylko niektóre typy danych. Na przykład A- Z(i θ) przechowują wartości liczbowe, str0- str9przechowują ciągi, i [A]- [J]przechowują macierze (tablice 2-wymiarowe).


Nawiasem mówiąc, małe litery n(nie n) mogą być również używane jako zmienne.
Ypnypn

Ciekawy. Nigdy nie użyłem tej zmiennej.
NinjaBearMonkey

3
Można spierać się o str0bycie 1 postacią lub byciem 4. Wszystkie instrukcje w TI-BASIC mają długość 1 znaku.
Ismael Miguel

@ IsmaelMiguel Myślałem o tym, ale mają 1 lub 2 bajty i postanowiłem liczyć znaki normalnie.
NinjaBearMonkey

1
Szanuję twoją decyzję. W tym przypadku bardzo pomaga. Naprawdę podobało mi się programowanie na moim starym TI-83. (Nawet zaprojektowałem w nim program do malowania!)
Ismael Miguel

41

GNU Sed

Nakładam na siebie bardziej restrykcyjny wymóg - wszystkie fragmenty będą kompletne sed programami.

Faktoid

sed jest kompletnym językiem Turinga. Oto dowód.

Długość 0 Snippet

Nie sądzę, aby fragment kodu o długości 0 był wymagany, ale ponieważ faktycznie robi coś w sed, oto on:

Sed jest „Stream EDitor”, tzn. Odczytuje strumień (linia po linii) ze STDIN, edytuje, a następnie wysyła do STDOUT. Program sed o zerowej długości po prostu kopiuje STDIN do STDOUT. Zatem catużyteczność może być emulowana przez sed. Następujące są równoważne:

cat a.txt b.txt > c.txt

i

sed '' a.txt b.txt > c.txt

Długość 1 Snippet

=

Ten program sed wypisuje numer linii każdego wiersza do STDOUT. Jest to w przybliżeniu równoważne z:

nl

lub

cat -n

chociaż wersja sed umieszcza numer linii na własnej linii.

Długość 2 Snippet

5q

Kopiuje STDIN do STOUT i qwyświetla się po wierszu 5. Jest to równoważne z:

head -n5

Być może zaczynasz widzieć trochę wzorca tutaj - sedmożesz go użyć do emulacji wielu standardowych narzędzi typu core-utils.

Długość 3 Snippet

iHi

inserts „Cześć \ n” przed każdą linią. Meh

Długość 4 Snippet

/a/d

Dużo mocy sed ma zdolność wyrażania regularnego. Ten program powoduje, że wszystkie linie dopasowania regex abyć deleted ze strumienia. Wszystkie pozostałe linie będą nadal wysyłane do STDOUT. Jest to równoważne z:

grep -v "a"

Długość 5 Snippet

:l;bl

To jest nieskończona pętla. Wszyscy uwielbiamy nieskończone pętle napędzające procesor. Definiuje etykietę l, a następnie brancza (skacze) do niej. Ad infinitum.

Długość 7 Snippet

s/a/A/g

Domyślnie sed stosuje spolecenia tak, aby pasowały tylko do pierwszego wystąpienia w każdej linii. Jeśli potrzebujesz dopasować (i zastąpić) każde wystąpienie w linii, to gflaga na końcus zrobi to polecenia.

Długość 8 Snippet

y/01/10/

Mało używane ypolecenie jest podobne do trnarzędzia powłoki (choć nie tak elastyczne). Ten program przełączy wszystkie 0s przy pomocy 1s i vice versa.

Długość 9 Snippet

1!G;$p;h

Ten fragment ma w rzeczywistości 8 bajtów, ale wymaga parametru -n, aby ukryć domyślne wyjście, więc zgodnie ze standardowymi regułami golfa liczę to jako 9. Ten program odwraca linie w strumieniu. Więc:

sed -n '1!G;$p;h'

jest dokładnie równoważny z:

tac

Długość 10 Snippet

s/[ <TAB>]+$//

Jest to ponowna wersja (niepoprawnego) fragmentu o długości 6. To usuwa końcowe spacje (spacje i tabulatory) z linii.


2
Zobacz także PRZYDATNE SKRZYDŁA W JEDNEJ LINII DO SED , czyli w zasadzie tak się nauczyłemsed
Adam Katz

Masz więcej głosów. Czy możemy mieć coś więcej?
luser droog

2
Twój faktoid 404.
Wauzl,

1
Fajnie, ale pamiętaj, że wiele z nich używa rozszerzeń GNU i nie są one standardowe - w szczególności długość 3 (standard to i\<newline>Hi<newline>), długość 5 (standard to sed -e :l -e bllub :l<newline>bl<newline) i długość 10 (która w ogóle wymaga zmiany +na a *). Pamiętaj, że fragment kodu o długości 9 -n '1!G;$p;h' jest standardem, a nietac jest . :)
Wildcard,

1
@Wildcard Tak - ograniczyłem to do GNU sed.
Digital Trauma

39

Pyton

( post mbomb007 zawiera już mnóstwo fragmentów kodu w Pythonie, ale myślałem, że przyłapię się na kilku dziwniejszych faktach)

Faktoid

Python jest językiem dynamicznie pisanym z naciskiem na czytelność.

Długość 1 fragmentu

1

W Pythonie 3 powyższe jest równoważne Truew tym sensie, że 1 == True(i także 0 == False). Zauważ, że nie musi to być prawdziwe w Pythonie 2, w którym możesz ponownie zdefiniować wartośćTrue .

Długość 2 fragmentu kodu

<>

<>jest przestarzałym operatorem porównania równoważnym z !=. Nadal działa w Pythonie 2 (chociaż jego użycie jest odradzane) i został całkowicie usunięty z Pythona 3.

Długość 3 fragmentu kodu

...

Python ma wiele funkcji, których nie używa żadne wbudowane oprogramowanie, ale jest on dostępny wyłącznie dla bibliotek firm trzecich. Ten Ellipsisobiekt jest jednym z nich i zwykle służy do krojenia. Na przykład, jeśli mamy następującą tablicę numpy 3D :

array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

następnie a[..., 0](odpowiednik a[:,:,0]) daje wszystkie pierwsze elementy:

array([[1, 4], [7, 10]])

W Pythonie 3 ...literał może być używany poza składnią krojenia, co w zabawny sposób pozwala używać go jako znacznika „do zrobienia” zamiast passlub NotImplemented:

def f(x):
    ... # TODO

Długość 4 fragmentu kodu

(1,)

Krotka jednoelementowa w Pythonie.

Python ma listy (np [1, 2, 3, 4]), które są zmienne, a krotki (np (1, 2, 3, 4)), które są im zmienny. Jednym z powszechnych zastosowań krotek są klucze słownika, ponieważ listy nie są mieszalne.

Częstym błędem początkującego jest pominięcie przecinka powyżej, tzn. (1)Liczby 1 otoczonej nawiasami. Krotka jednoelementowa to jedyny czas, w którym potrzebujesz przecinka przed zamykającymi parens - podnosi, SyntaxErrorjeśli próbujesz umieścić jeden w pustym krotce (), i jest opcjonalna dla krotek o długości co najmniej 2.

Długość 5 fragmentu kodu

0or x

W tym fragmencie dzieje się kilka rzeczy, więc spójrzmy!

orjest jak ||w wielu językach. W Pythonie, A or Bzwarcie, wracając A(bez oceny B), jeśli Ajest truthy, w przeciwnym wypadku zwraca B. Na przykład 1 or xzawsze zwraca 1, jak 1zawsze jest prawdą, a nawet działa, jeśli xnie jest zdefiniowane. Z drugiej strony 0 or xzwraca albo xjeśli xjest zdefiniowane, albo rzuca a NameErrorjeśli nie jest.

Podczas gry w golfa zwykle możemy upuścić białe znaki między liczbą a aną or, takie jak 1 or xstawanie się 1or x. Jest to możliwe, ponieważ 1orzaczyna się od cyfry, co czyni go niedozwolonym identyfikatorem języka Python.

Jest jednak jeden wyjątek - 0orktóry w tajemniczy sposób rzuca SyntaxError. Dlaczego? Ponieważ literał ósemkowy w Pythonie zaczyna się od 0o(np. 0o20 == 16), A parser dusi się, gdy osiągnie r!

Uwaga: W Pythonie 2 literały ósemkowe mogą również zaczynać się od wiodącego zera, np 020.

Długość 6 fragmentu kodu

*x,y=L

Ten fragment pokazuje specjalny typ przypisania w Pythonie, gdzie Ljest listą, krotką lub innym rodzajem iteracji.

W Pythonie możesz „rozpakowywać” krotki i listy w następujący sposób:

a,b = [1,2]

To przypisuje 1 do ai 2 do b. Ta składnia jest również używana do wielokrotnego przypisywania, np

a,b = b,a+b

co jest przydatne podczas pisania programu obliczającego serię Fibonacciego.

Jeśli długości po obu stronach się nie zgadzają, wówczas ValueErrorrzuca się a. Jednak Python 3 wprowadził nową składnię, rozszerzone iterowalne rozpakowywanie (lub bardziej potocznie, „przypisanie oznaczone gwiazdką”), które pozwala robić takie rzeczy:

*x,y = [1, 2, 3, 4, 5]

Ten przypisuje ydo ostatniego elementu, 5, a xdo pozostałej części listy , tj [1, 2, 3, 4]. Możesz nawet zrobić coś takiego:

a,b,*c,d,e = [1, 2, 3, 4, 5, 6, 7]

1, który nadaje się do aod 2 do b, [3, 4, 5]na c6 do d7, aby e.

Długość 7 fragmentu kodu

zip(*x)

zip to funkcja, która pobiera kilka list i, cóż, zamyka je:

>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

Uwaga: W Pythonie 3 zipzamiast tego zwracany jest obiekt, więc jeśli chcesz mieć listę taką jak powyżej, musisz zawinąć wywołanielist()

Jest to dość wygodna funkcja, jeśli masz dwie lub więcej powiązanych list i chcesz połączyć odpowiednie wpisy.

Teraz powiedz, że chcesz rozpakować listę - jak byś to zrobił? Możemy spróbować użyć zipponownie, ale niestety daje to:

>>> zip([(1, 4), (2, 5), (3, 6)])
[((1, 4),), ((2, 5),), ((3, 6),)]

Problem polega na tym, że wszystko znajduje się na jednej liście, ale zipprzyjmuje poszczególne listy jako osobne argumenty funkcji. Aby to naprawić, wprowadzamy *operatora splat, który pobiera listę / krotkę / etc. i rozpakowuje je jako argumenty funkcji:

f(*[1,2]) ==> f(1, 2)

Rezultat to:

>>> zip(*[(1, 4), (2, 5), (3, 6)])
[(1, 2, 3), (4, 5, 6)]

Długość 8 fragmentu kodu

x='a''b'

Gdy zobaczyłem to po raz pierwszy, byłem trochę cofnięty - co to znaczy mieć dwa ciągi obok siebie? Odpowiedź była prosta:

>>> x
'ab'

Python po prostu łączy te dwa ciągi! Jest to niezwykle przydatne ze względu na czytelność, ponieważ pozwala na łamanie długich ciągów znaków (zwróć uwagę na otaczające nawiasy):

x = ('This is a very long sentence, which would not look very nice '
     'if you tried to fit it all on a single line.')

Długość 9 fragmentu kodu

0!=2 is 2

Być może już wiesz, że Python umożliwia tworzenie łańcuchów operatorów porównania, więc 5 < x <= 7jest to prawdą tylko wtedy, gdy 5 < xi x <= 7. Jeśli tego nie wiesz ... niespodzianka!

W każdym razie mniej znany jest fakt, że ponieważ is/ is not/ in/ not insą również operatorami porównania, można je również połączyć w łańcuch. Innymi słowy, powyższy kod jest równoważny (0 != 2) and (2 is 2), czyli True.

Uwaga: Istnieje jednak kilka subtelności z 2 is 2połową, ponieważ issprawdza, czy dwie rzeczy są tym samym obiektem , a nie czy dwie rzeczy mają tę samą wartość . Python buforuje małe liczby całkowite, tak 1+1 is 2jest True, ale 999+1 is 1000jest False!

Długość 10 fragmentu kodu

x=[];x+=x,

Co się stanie, gdy dodasz listę do siebie? Jeśli spróbujemy wydrukować x, otrzymamy:

[[...]]

Na szczęście Python printjest na tyle inteligentny, że nie eksploduje, próbując wydrukować listy rekurencyjne. Możemy wtedy zrobić mnóstwo zabawnych rzeczy, takich jak:

>>> x[0][0][0][0][0]
[[...]]
>>> x[0] == x
True

Ta funkcja działa również ze słownikami i jest jednym ze sposobów tworzenia struktur danych z cyklami, np. Wykresu.

Długość 11 fragmentu kodu

help(slice)

Ta helpfunkcja jest bardzo przydatna do debugowania w Pythonie. Po wywołaniu bez argumentów w REPL, help()rozpoczyna sesję pomocy, w której możesz wyszukać dokumentację funkcji / typów danych / itp. Gdy zostanie wywołany z konkretnym argumentem, helppoda informacje na temat powiązanego elementu.

Na przykład help(slice)podaje następujące informacje (obcięte, ponieważ są dość długie):

Help on class slice in module __builtin__:

class slice(object)
 |  slice(stop)
 |  slice(start, stop[, step])
 |  
 |  Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).
 |  
 |  Methods defined here:
 |  
 |  __cmp__(...)
 |      x.__cmp__(y) <==> cmp(x,y)
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |
 | ...

Co do tego slice, jak widzimy, możemy tworzyć sliceobiekty do indeksowania. Na przykład:

>>> L = list(range(10))
>>> L[slice(2, 5)]         # L[2:5]
[2, 3, 4]
>>> L[slice(2, None)]      # L[2:]
[2, 3, 4, 5, 6, 7, 8, 9]

Kolejną przydatną funkcją do debugowania jest dir()zwracanie wszystkich nazw w bieżącym zakresie, gdy są wywoływane bez argumentu, i zwracają wszystkie atrybuty danego obiektu, gdy są wywoływane z argumentem.

Długość 12 fragmentu kodu

round(5.0/2)

Co to ocenia? Odpowiedź zależy od wersji Pythona!

W Pythonie 2 podział na dwie liczby całkowite powoduje dzielenie liczb całkowitych (tj. 5/2 == 2), Podczas gdy w Pythonie 3 otrzymujemy dzielenie zmiennoprzecinkowe (tj 5/2 == 2.5.). Jest to jednak podział na liczbę zmiennoprzecinkową i liczbę całkowitą, co zawsze powinno skutkować liczbą zmiennoprzecinkową. Dlaczego mielibyśmy wtedy uzyskiwać różne wyniki?

Jeśli spojrzymy na dokumentację rounddla obu wersji Pythona, znajdziemy odpowiedź:

  • W Pythonie 2 , roundtiebreaks przez zaokrąglenie od 0.
  • W Pythonie 3 , roundtiebreaks zaokrąglając ku najbliższej parzystej liczby całkowitej .

Innymi słowy, 5.0/2 = 2.5zaokrągla do 3w Pythonie 2, ale zaokrągla do 2w Pythonie 3. Zaokrąglanie w kierunku najbliższej liczby całkowitej może wydawać się dziwne, ale tak naprawdę nazywa się to zaokrąglaniem bankowca i próbuje traktować wartości dodatnie i ujemne podobnie, aby zmniejszyć błąd systematyczny.

Długość 13 fragmentu kodu

class C:__x=1

Python, zorientowany obiektowo, ma klasy. Powyżej jest klasa, Cktóra ma pojedynczy atrybut __xustawiony na 1.

Możemy uzyskać dostęp do atrybutów klasy za pomocą notacji kropkowej. Na przykład, jeśli mamy klasę

class MyClass(): my_attr = 42

następnie drukowanie MyClass.my_attrdałoby 42, zgodnie z oczekiwaniami.

Jeśli jednak zrobimy to samo i spróbujemy uzyskać dostęp, C.__xjak określono powyżej, otrzymamy:

AttributeError: type object 'C' has no attribute '__x'

Co się dzieje? Cwyraźnie ma __xatrybut!

Powodem jest to, że atrybuty zaczynające się od __emulacji zmiennych „prywatnych”, czego nie ma w Pythonie . Python zmienia nazwę dowolnego atrybutu zaczynając od __, dodając nazwę klasy, aby uniknąć konfliktów ponownego użycia nazwy. W powyższym przykładzie, gdybyśmy byli naprawdę zdeterminowani, aby to uzyskać 1, musielibyśmy to zrobić

>>> C._C__x
1

Długość 14 fragmentu kodu

NotImplemented

Python nie tylko ma klasy, ale także przeciąża operatora. Na przykład możesz mieć klasę

class Tiny():
    def __lt__(self, other):
        return True

gdzie __lt__jest mniej niż operator. Teraz, jeśli zrobimy instancję Tiny, możemy to zrobić

>>> t = Tiny()
>>> t < 1
True
>>> t < "abc"
True

ponieważ __lt__postanowiliśmy zawsze wracać True. Pamiętaj, że możemy to zrobić

>>> 42 > t
True

ale następujące przerwy:

>>> t > 42
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    t > 42
TypeError: unorderable types: Tiny() > int()

Zaraz, jak to działa? Nie określiliśmy zachowania większego niż z Tiny, więc nic dziwnego, że ostatni przypadek się psuje. Ale skąd int(42) wie, że jest większy niż nasz Tinyobiekt?

Python ma wbudowaną stałą NotImplemented, którą można zwrócić specjalną metodą porównania. Wypróbujmy to:

class Unknown():
    def __gt__(self, other):
        # __gt__ for greater-than
        print("Called me first!")
        return NotImplemented

Teraz, jeśli stworzymy instancję naszej nowej klasy:

>>> u = Unknown()

Możemy to zrobić:

>>> t < u
True
>>> u > t
Called me first!
True

Jak widzimy, stało się u > ttak, że Python po Unknownraz pierwszy próbował wywołać metodę większą niż , stwierdził, że nie została zaimplementowana i Tinyzamiast tego spróbował użyć metody mniejszej niż dla drugiej klasy ( )!

Długość 15 fragmentu kodu

x=[],;x[0]+=[1]

To trochę zabawne. Najpierw przypisujemy xbe, [],który jest pustą listą w krotce, tj ([],). Następnie wykonujemy x[0]+=[1]próbę rozszerzenia pustej listy o drugą listę [1].

Teraz należy pamiętać, że listy są zmienne i krotki są im zmienny - co się dzieje, gdy próbujesz zmienić zmienny obiekt wewnątrz niezmiennej obiektu?

>>> x=[],;x[0]+=[1]
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    x=[],;x[0]+=[1]
TypeError: 'tuple' object does not support item assignment

Och, więc daje błąd, myślę, że należy się tego spodziewać. Ale co, jeśli spróbujemy wydrukować x?

>>> x
([1],)

Co? Lista się zmieniła!

Jeśli jesteś ciekawy, co się tutaj dzieje, koniecznie sprawdź ten post na blogu .

Długość 16 fragmentu kodu

@lru_cache(None)

Po prostu dodaj pamięć podręczną! Jest to prosty przykład dekoratora dostępnego w Pythonie 3.

Załóżmy, że mamy następującą naiwną implementację Fibonacciego:

def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Jak może powiedzieć większość wstępów do kursów programistycznych, jest to bardzo zły sposób implementacji Fibonacciego, prowadzący do wykładniczego czasu wykonywania, ponieważ skutecznie dodajemy dużo 1 w przypadku podstawowym. f(10)? Działa w ułamku sekundy. f(32)? Poświęć chwilę, ale dotrze. f(100)? Nie.

Ale jeśli buforujemy wyniki, wszystko powinno być znacznie szybsze. Zawsze możemy użyć słownika do pamięci podręcznej, ale spróbujmy czegoś innego:

from functools import lru_cache

@lru_cache(None)
def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Jak widać, wszystko, co zrobiłem, to zaimportowanie lru_cachez functoolsmodułu i dodanie @lru_cache(None)przed moją funkcją. @oznacza dekorator, który otacza funkcję, w tym przypadku do zapamiętywania. lru_cachePierwszym argumentem jest maxsizemaksymalny rozmiar bufora - tutaj ustawiliśmy go tak, Noneaby wskazywał brak maksymalnego rozmiaru.

Teraz, jeśli spróbujemy go użyć:

>>> f(100)
573147844013817084101

I to nie zajęło nawet sekundy!

Uwaga: f(1000)prowadzi do błędu głębokości rekurencji, ale to historia na inny czas


Jaki zakres małych liczb całkowitych „łapie” Python dla isoperatora?
mbomb007

@ mbomb007 Z tego pytania wynika, że ​​ma on wartość od -5 do 256. Możesz spróbować -5-1 is -6i 255+2 is 257przetestować.
Sp3000,

37

Krztyna

Fakt: Mogę zdefiniować Jota za pomocą 2 głosów pozytywnych i udowodnić, że jest to Turing wraz z 8 (nie używając długości 4, 6 lub 7).

Długość 1

1

To jest przykład dwóch funkcji w Jot. Pierwszym z nich jest pusty ciąg znaków, którego wynikiem jest funkcja tożsamości. Drugi to 1operator grupowania Jota. 1zwraca wartość λxy.[F](xy)( notacja rachunku lambda ), gdzie [F]jest program przed 1(tutaj pusty ciąg). Tak więc ten program jest funkcją, λxy.(λz.z)(xy)która upraszcza λxy.xy.

Długość 2

10

Teraz wprowadzamy inny symbol w Jot: 0. Ponownie jeśli [F]reprezentuje wartość programu do tej pory, 0ocenia [F]SK, gdzie Si Ksą z logiki kombinatorycznej . Zdefiniowałem teraz cały język.

Długość 5

11100

Udowodnię teraz, że Jot kończy Turinga, definiując odwzorowanie od logiki kombinatorycznej do Jota. Ten program Jot jest syntezatora K .

Długość 8

11111000

To jest kombinator S.

Długość 3

1AB

Tutaj, Ai Bnie są częścią Jot, ale raczej symbole zastępcze dla dowolnego wyrażenia. Wyrażenie ABw kombinacyjnych mapach logicznych 1ABw Jot, z Ai Brekurencyjnie przekształcane przez te trzy reguły. CO BYŁO DO OKAZANIA

Długość N.

1
10
11
100
101
110
[...]

Każda liczba naturalna, wyrażona binarnie, jest poprawnym programem Jot. W związku z tym mogę algorytmicznie generować więcej fragmentów o dowolnej długości. Biorąc pod uwagę wystarczającą liczbę głosów, mogę rozwiązać problem zatrzymania .


2
Podano dwa głosy poparcia. Teraz zdefiniuj język.
John Dvorak,

@ JanDvorak nad tym pracuje ... minęło tak dużo czasu, odkąd badałem to, że zapomniałem o tym wszystkim :)
Phil Frost

1
Nie rozumiem, dlaczego to powinno nadal zyskać na popularności. Po prostu wygenerujesz losowe liczby binarne o coraz większej długości: |
Optymalizator

1
Powiedziałeś to o przegłosowaniu numeru 4. Ale tutaj patrzymy na „liczbę losową, którą właśnie wygenerowałeś”
Optimizer

1
jak możesz rozwiązać problem zatrzymania? Zgaduję, że ma to coś wspólnego z używaniem programu nieskończonego (liczba nieskończonych)?
Filip Haglund

37

Grzmotnąć

Faktoid:

Niezwykle poważny błąd ShellShock był obecny w Bash od 1989 roku i pozostawał nieodkryty przez ćwierć wieku. Dużą radość z pisania Basha mierzy się z wieloma osobliwościami i niekonsekwencjami.

Długość 1 fragmentu:

[

Alias ​​dla testwbudowanego, pozwalający na kod formatu if [ a == b ]; then- w rzeczywistości [jest samodzielnym poleceniem, a nie elementem składniowym i ]ma charakter wyłącznie dekoracyjny (chociaż jest wymagany przez [, jego wymaganie jest dowolne i można go zlikwidować za pomocą alias [=test).

Długość fragmentu 2:

||

Jak logiczne orw większości języków, ale dla procesów. Wykona polecenie po ||jedynym, jeśli polecenie przed nim zwróci wartość niezerową.

Długość fragmentu 3:

x=y

Zadanie. Ładne i przewidywalne ... ale w przeciwieństwie do większości innych języków, dodatkowe spacje są niedozwolone. Co jest dość zabawne, ponieważ możesz wstawić dodatkowe spacje praktycznie wszędzie indziej w bash, tylko nie wokół =.

Długość 4 fragmentu:

$IFS

Internal Field Separator - ta zmienna wpływa na to, w jaki sposób Bash dzieli dane dla wielu wbudowanych działań, takich jak iteracja dla pętli i zapełnianie tablic ciągami. Prawidłowo użyty może być bardzo mocny; ale częściej jest przyczyną subtelnych i nieprzewidywalnych błędów.

Długość fragmentu 5:

${x^}

Zamień ciąg na x, ale z pierwszym znakiem pisanym wielką literą! Tak często używana funkcja, że ​​ma własną dedykowaną składnię języka.

Długość fragmentu 6:

x=($y)

Wypełnij tablicę, x, ciągiem znaków lub listą elementów y, dzieląc na wszystko, co IFS jest obecnie ustawione - domyślnie spacja. Bardzo przydatna funkcja do zaawansowanego programowania bash.

Długość 7 fragmentu:

${x[y]}

Tablice! Ale czekaj, co to jest ... y jest ciągiem, a nie indeksem liczbowym? Tak, rzeczywiście, Bash obsługuje tablice asocjacyjne! Wiele osób tego nie wie. Musisz tylko declare -A xnajpierw.

Długość 8 fragmentu:

${x##*,}

Zastąp x, wszystko do ostatniego ,znaku (lub cokolwiek podasz). Przydatne, aby uzyskać ostatnie pole csv - jest to coś, z czym nie można tak łatwo zrobić cut, który liczy tylko pola od lewej. % i %% pozwala to samo wyciąć z prawej strony; % i # zostały wybrane ze względu na lokalizację na klawiaturze amerykańskiej, więc byłoby jasne, co oznacza lewą, a która prawą, ale nie ma to dużej wartości dla wszystkich, którzy nie używają klawiatury amerykańskiej :)

Długość 9 fragmentu:

[ a = b ]

W większości innych języków pojedynczy znak równości w operacji porównania spowodowałby niezamierzone zachowanie w postaci przypisania. Jednak nie w Bash. Po prostu nie pomijaj żadnych spacji, cokolwiek robisz!

Długość 10 fragmentu:

if [ a=b ]

Tak się stanie, jeśli zapomnisz o obowiązkowych miejscach. Nie wyrzuci błędu. Zawsze zwracają prawdę - nawet jeśli ai bsą zmiennymi, które są ustawione, lub cokolwiek one ustawione, nie ma znaczenia - będzie to zawsze zwraca wartość true. Pomyśl o kodzie, if [ "$password"="$correctpass" ]aby zobaczyć zabawny potencjał tej „funkcji”.

Długość fragmentu 11:

x=${y//a/b}

Wymiana podciągów w stylu Regex! Ustaw x na wartość y, ale za każdym razem zastąpione przez b.

Długość 12 fragmentu:

[[:upper:]]*

Pasujące do wzorca - nie ograniczają się tylko do korzystania z * wieloznaczny w powłoce, można użyć dowolnego standardowego POSIX mecz takie jak alnum, alpha, digititd.

Długość 13 fragmentu:

function x(){

W tajemniczy sposób wkradło się trochę składni C! Jedno z wielu zupełnie różnych zastosowań nawiasów klamrowych i kolejny przykład opcjonalnych elementów dekoracyjnych, które sprawiają, że Bash wygląda bardziej jak inne języki - albo tutaj, ()albo functionmożna je pominąć (ale nie oba). Również więcej zabawy z niespójnymi spacjami - przestrzeń po {jest obowiązkowa, ale nie przed zamknięciem }, jak wfunction x { y;}

Długość 14 fragmentu:

echo {Z..A..3}

Kolejne zupełnie niezwiązane użycie nawiasów klamrowych. Rozszerza zakres o określony krok. W takim przypadku będzie generować co 3 litery od Z do A. Przydatne do generowania sekwencji bez użycia seq, ale nie może być używane ze zmiennymi, więc ma ograniczoną funkcjonalność.

Długość 15 fragmentu:

echo {a,b,c,d}x

Kolejne podobne, ale nie identyczne zastosowanie dla nawiasów klamrowych w generowaniu sekwencji; wypisuje ax bx cx dxi jest przydatny do generowania listy ciągów z sekwencji lub listy w jednym poleceniu. Ponownie jednak ograniczona użyteczność, ponieważ nie można jej używać ze zmiennymi wewnątrz nawiasów klamrowych.


W rzeczywistości ]nie jest czysto dekoracyjny. [odmówi działania, jeśli jego ostatnim argumentem nie jest ].
FUZxxl,

Tak, ale służy to wyłącznie celom kosmetycznym; a jeśli zastąpisz [inną formą test, wtedy ]można ją pominąć bez zmiany czegokolwiek w wywołaniu - po prostu podkreślam, że nie jest to rzeczywista składnia bash, tylko wizualny cukier.
Riot

Masz rację, ponieważ nie jest to składnia bash, ale końcowa ]jest [składnią i musisz ją podać tak, jak musisz zakończyć instrukcję w C średnikiem.
FUZxxl

To prawda, że ​​jest to obowiązkowe, ale wcale nie w taki sam sposób, jak średnik C. Wymóg jest całkowicie arbitralny, jak widać, gdy alias [=testpiszesz, a potem piszesz if [ 1 = 1; thenitd. Ale wyjaśnię moje sformułowania, aby wziąć pod uwagę twój punkt :)
Riot

1
Odnośnie function x(){składni: Możesz upuścić parens, jak mówisz, ale możesz też po prostu upuścić functionczęść. W ten sposób powłoka POSIX definiuje funkcje, dzięki czemu jest bardziej przenośna. Możesz zdefiniować pełną funkcję za pomocą 13 znaków. Na przykład:x(){ startx;}
kojiro

37

APL

Faktoid

APL (ang. A P rogramming L anguage) zaczął jako tłumacz ustny dla formuły notowanej przez Kena Iversona . Kiedy język został zaprojektowany, ludzie używali teletypów do komunikacji z komputerami. Zestaw znaków był ograniczony, ale ze względu na ich konstrukcję można było umieścić wiele znaków w tej samej pozycji, aby skomponować złożone znaki. Ta funkcja jest szeroko używana przez APL, przyczyniając się do jej niesławnej reputacji jako języka tylko do odczytu.

Możesz wypróbować większość przykładów na http://www.tryapl.org .

Długość 1

Postać zwana abażurem, zarówno ze względu na swój kształt, jak i na oświecenie, które można uzyskać z jego obecności, wprowadza komentarz. Historycznie rzecz biorąc, stworzono go przez zastąpienie (jota) i (buta w górę).

Długość 2

⍳3

Funkcja monadyczna (jeden argument) (iota) generuje wektor pierwszych kilku liczb naturalnych. Na przykład wyżej wspomniany ⍳3dałby 1 2 3wektor trzech pierwszych liczb naturalnych. W niektórych implementacjach APL, to wydajność 0 1 2zamiast, to zależy od wartości ⎕IOtego, ja Ota o Rigin.

Długość 3

5\3

W przeciwieństwie do funkcji monadycznej funkcja dyadyczna \(rozwiń) kopiuje argument po prawej stronie tak często, jak argument po lewej; w ten sposób 5\3daje 3 3 3 3 3. Możesz bawić się argumentami wektorowymi (np. 1 2 3\4 5 6), Aby zobaczyć, co wtedy robi.

Długość 4

A←⍳3

Przypisuje to Awartość ⍳3. (lewa strzałka) jest operatorem przypisania. Zadanie nie musi być najbardziej lewą stroną oświadczenia; przypisania są analizowane jak wywołania funkcji i dają przypisaną wartość do dalszego wykorzystania.

Długość 5

∘.×⍨A

Tabliczka mnożenia trzy na trzy, czyli

1 2 3
2 4 6
3 6 9

To trochę skomplikowane, więc wyjaśnię. ⍺∘.f⍵(następujący: a jota omega punkt F) oznacza zewnętrzny iloczyn z i powyżej f. Produkt zewnętrzny jest tabelą wyników zastosowania fdo każdej możliwej pary elementów z i . W tym przykładzie fjest ×(pomnóż), co daje tablicę mnożenia. Operator (tylda dierezą) dojeżdża argumenty, to znaczy ⍺f⍨⍵jest równa ⍺f⍵i f⍨⍵nie lewy argument jest równa ⍵f⍵. Bez operatora dojazdów byłby to fragment kodu a∘.×a. Zewnętrzny operator produktu jest bardzo wszechstronny; sprawdzić, co się dzieje, jeśli podstawić =za ×!

Długość 6

{×/⍳⍵}

Funkcja silnia. Para nawiasów klamrowych obejmuje dfn (funkcja dynamiczna), to znaczy funkcję anonimową (por. Wyrażenia lambda). Argumenty dfn są powiązane ze zmiennymi i / lub tylko wtedy, gdy dfn jest wywoływany jako funkcja monadyczna (pojedynczy argument, w przeciwieństwie do funkcji dwadargumentowej, dwad argumentowej). Stosujemy odpowiedni argument, zwracając liczby całkowite od 1do . Operator /(ukośnik) zmniejsza, czyli f/⍵wstawia fmiędzy elementy . Na przykład +/⍳5jest sprawiedliwy 1+2+3+4+5. W tym przypadku zmniejszamy za pomocą ×, uzyskując iloczyn przedmiotów ⍳⍵, co jest po prostu silnią .

Długość 7

2×3*4+5

Plony 39366. ⍺*⍵(alfa gwiazda omega) jest podniesiony do potęgi . APL ma bardzo prostą zasadę pierwszeństwa: wszystko jest oceniane od prawej do lewej, wszystkie funkcje są skojarzone z prawą. Operatory łączą się silniej niż funkcje i są oceniane od lewej do prawej. Zatem powyższe wyrażenie z wyraźnymi nawiasami zostanie zapisane 2×(3*(4+5))w przeciwieństwie do zwykłego (2×(3*4))+5.

Długość 8

¯1+3 3⍴A

Ten fragment kodu się sprawdza

0 1 2
3 4 5
6 7 8

i demonstruje dwie ważne koncepcje: Pierwsza koncepcja to funkcja (rho), która przekształca swój prawy argument na kształt określony w lewym argumencie. Kształt tablicy jest wektorem długości każdej osi w tablicy. Kształt skalara jest pustym wektorem. Zatem 3 3⍴Aprzekształca Asię w macierz trzy na trzy. Druga koncepcja polega na tym, w jaki sposób stosuje się tutaj dodawanie: Dodajemy ¯1(overbar one), co oznacza, że ​​jeden ¯jest ujemny ( jest przedrostkiem określającym liczby ujemne, podczas gdy -jest operatorem) do tablicy. Dwa operandy mają różne kształty, więc operand o mniejszym kształcie jest rozdzielany na drugi operand, odejmując jeden z każdego elementu w wygenerowanej macierzy.

Długość 9

+.×⍨3 3⍴A

A, przekształcony w macierz 3 na 3, pomnożony przez siebie. Operator .(kropka) przyjmuje dwie funkcje i konstruuje an iloczyn wewnętrzny , w którym pierwsza funkcja reprezentuje dodawanie, a druga mnożenie funkcji . Proste, stare mnożenie macierzy jest +.×, powszechnym wariantem jest ≠.∧(gdzie nie jest równe, a (góra) jest logiczne i) dla macierzy boolowskich; wiele interesujących rzeczy można modelować jako wewnętrzny produkt z pewnymi operatorami zamiast +i ×.

Długość 10

(.5×⊢+÷)⍣≡

(czytaj: lewy nawias kropkę pięć pomnożyć prawego halsu Plus podzielić prawy nawias star-diaeresis samo) Oblicza pierwiastek kwadratowy z prawdziwą pomocą metody babilońskiej . Lewy argument to liczba, dla której chcesz obliczyć pierwiastek kwadratowy, prawy argument to początkowe przypuszczenie pierwiastka kwadratowego. Początkowo chciałem podać sensowne początkowe zgadywanie, ale zabrakło mi znaków (dodaj, aby użyć samego numeru jako początkowego zgadnięcia).

Jak to działa? Zacznijmy od lewej części,(.5×⊢+÷)Najpierw . W tym wyrażeniu używana jest milcząca notacja pochodząca z J, która została później przeniesiona z powrotem do Dyalog APL. Milcząca notacja jest nieco trudna dla początkujących, dlatego prosimy o uważne przeczytanie tego rozdziału. Izolowana sekwencja, taka jak +/÷≢, której „normalne” reguły analizowania nie rozwiązują pojedynczej części mowy, nazywa się pociągiem. Ciąg dwóch lub trzech funkcji tworzy funkcję i (poprzez powtarzane rozdzielanie) ciąg funkcji o dowolnej długości również wytwarza funkcję. Ciąg trzech funkcji fghzachowuje się jak {(⍺f⍵)g⍺h⍵}, to jest fi hjest stosowany do argumentów funkcji wynikowej, a wynik z nich jest stosowany do , to znaczy:g . Ciąg tablicy i dwie funkcje podobneAfgzachowuje się tak, jakby{Af⍺g⍵}gjest stosowany do argumentów funkcji wynikowej Ai ten wynik jest stosowany do f. Ciąg dwóch funkcji ma również semantyczny, co zostało wyjaśnione w dokumentacji, ale nie zostało użyte w tym przykładzie.

W tym konkretnym pociągu używana jest jedna nowa funkcja (prawy hals). Zachowuje się {⍵}, podając właściwy argument. Zatem całe wyrażenie jest równe {.5×⍵+⍺÷⍵}, co jest tylko krokiem iteracji formuły babilońskiej. Łatwo jest zobaczyć, jak milcząca notacja przynosi korzyści golfistom; umożliwia golenie kilku cennych postaci, w stosownych przypadkach.

Ostatnim elementem układanki jest (gwiazda diæresis), operator mocy . Jeżeli prawy argument jest tablicą, f⍣A⍵stosuje fsię w sumie Aczasów. Na przykład f⍣3⍵jest równy fff⍵. Liczba może być ujemna, w którym to przypadku APL próbuje wywnioskować funkcję odwrotną fi stosuje ją. Jeśli poprawny argument to również funkcja, f⍣g⍵ma zastosowanie fdo momentu, w (fY)gYktórym Yjest wynikiem wielokrotnego zastosowania fdo . W szczególności, jeśli gjest =(równy) lub (taki sam), f⍣≡oblicza punkt stały zf. Właśnie tego potrzebujemy do metody babilońskiej! Chcemy iterować, aż wynik się zbiegnie. Na koniec, jeśli zastosowany do pary rzeczy jest wywoływany jako funkcja diadadowa, lewy argument jest przypisany do flewej, tzn. ⍺f⍣g⍵Jest równy miejscu, w (⍺∘f)⍣g⍵którym się A∘fzachowuje {Af⍵}.


Masz więcej głosów! Czy możemy mieć coś więcej?
luser droog

@luserdroog Jasne, pozwól mi pomyśleć o kilku innych.
FUZxxl

Czy mogę to edytować i rozszerzyć?
Adám

@ Adám Tak, proszę.
FUZxxl

∘.×⍨a daje mi błąd wartości . Czy używam go poprawnie?
Cyoce,

37

Matlab

Snippet 26 - iteracja po macierzach

To właśnie odkryłem niedawno. Zwykle iterujesz w pętli dany wektor. Ale zamiast wektorów można również użyć macierzy ( rand(10)tworzy macierz 10x10 o równomiernie rozłożonych liczbach od 0 do 1).

for k=rand(10);disp(k);end

Następnie wyświetla jeden wektor kolumny losowej macierzy na iterację.

Snippet 25 - łatwe drukowanie

Wiemy, że kreślenie jest łatwe w Matlabie, ale istnieje super łatwa funkcja ezplot( E-Zrozumiesz? Zajęło mi to sporo czasu, zanim w końcu go dostałem, ponieważ pisałem Zzawsze tak jak sedzamiast c, cokolwiek ...) Każdy lubi krzywe eliptyczne:

ezplot('y^2-x^3+9*x-10.3')

krzywa eliptyczna

Snippet 24 - integracja

Staroświeckie słowo (ale wciąż używane w obliczeniach numerycznych) do integracji to „kwadratura”, czy możesz zgadnąć, jaki jest wynik następnego?

quad(@(x)4./(1+x.^2),0,1)

Snippet 23 - obrazy

Oczywiście Matlab jest również bardzo popularny wśród naukowców, którzy muszą pracować z obrazami (np. Medyczną analizą obrazu), więc tutaj jest to bardzo przydatna funkcja. Pierwszy argument to obraz, drugi kąt, a trzeci opcjonalny argument mówi funkcji, aby przyciąć go do oryginalnego rozmiaru.

imrotate(rand(99),9,'c')

tutaj

Snippet 22 - muzyka

load handel;sound(y,Fs)

Brzmi mniej więcej tak (link do youtube)

Snippet 21 - wyróżnij i zintegruj

polyint(polyder(p),c)

Za pomocą tych dwóch funkcji można łatwo różnicować i integrować wielomiany. Podczas integracji możesz przekazać drugi argument, który będzie stałą.

Snippet 20 - powrót do wielomianów

p=poly(r);cp=poly(A)

Chcesz wielomian z pierwiastkami r? Proste: p=poly(r). Chcesz charakterystyczny wielomian macierzy A? Proste: cp=poly(A). Tak roots(p)jest dokładnie r(lub permutacja r).

Snippet 19 - kolejna magiczna sztuczka

fminsearch(fun,x0);

Są ludzie, którzy absolutnie kochają tę funkcję. To po prostu wyszukuje minimum funz wartością początkową x0(może być wektorem) bez żadnych warunków fun. Jest to idealne rozwiązanie do dopasowania małych modeli, w których nie możesz (lub jesteś zbyt leniwy), aby rozróżnić funkcję błędu / kary / celu. Wykorzystuje algorytm simpleksowy Neldera-Meada który jest dość szybki dla funkcji, w których nie można przyjmować żadnych założeń.

Snippet 18 - wprowadzenie do wielomianów

p=polyfit(x,y,deg)

Matlab ma fajne rozwiązanie do radzenia sobie z wielomianami. Z polyfitdostać najmniejszych kwadratów wielomianu stopnia degzbliżonych do punktów x,y. Otrzymujesz wektor, pktóry przechowuje współczynniki wielomianów, ponieważ jest to jedyna rzecz, której potrzebujesz do reprezentowania wielomianu. Jeśli wrócisz do fragmentu 15, możesz zrobić to samo, pisząc c = polyfit(x,y,2). Więc np. [1,-2,3]Reprezentuje wielomianx^2 - 2*x+3 . Oczywiście istnieją również funkcje dopasowania innych funkcji elementarnych lub dowolnych.

Snippet 17 - kąty i nieciągłości

unwrap(angle(c))

Jeśli chcesz uzyskać argument „ciągłego” wektora liczb zespolonych, często otrzymujesz wartości, które wydają się mieć nieciągłość. Np. angle([-1-0.2i,-1-0.1i,-1,-1+0.1i,-1+0.2i])Dostanie cię, [-2.94,-3.04,3.14,3.04,2.94]ponieważ anglezwraca tylko kąty między -pii pi. Zajmie się tym funkcja unwrap! Jeśli pojawi się taka nieciągłość, wystarczy dodać wielokrotność 2*pi, aby usunąć te: „[-2,94, -3,04, -3,14, -3,24, -3,34]” Działa to nawet w przypadku matryc 2d! Jeśli po prostu wykreślisz argument liczb zespolonych z ujemną częścią rzeczywistą, otrzymasz pierwszą grafikę, otrzymasz pierwszy obraz, a po rozpakowaniu otrzymasz drugi:

bez rozpakowywania z rozpakowaniem

[x,y] = meshgrid(-1:0.01:0,-0.5:0.01:0.5);
z = x+i*y;
imagesc(angle(z))
imagesc(unwrap(angle(z)))

Snippet 16 - produkt skalarny

[1;2;3]'*[4;5;6]

Oczywiście istnieją wbudowane metody (jak dot), ale z operatorem transformacji macierzy 'jest to tak proste. Jeśli nie wiesz, czy masz wektory wierszy czy kolumn, możesz po prostu użyć opcji, a(:)'*b(:)gdzie a(:)zawsze zwraca wektor kolumny.

Snippet 15 - liniowy najmniej kwadratów, brzydka metoda z różdżką

[x.^2,x,x.^0]\y

xto wektor (kolumna) z wartościami na osi x, yzaszumionymi wartościami y. Wpisz, c=[x.^2,x,x.^0]\ya otrzymasz współczynniki wielomianu 2 stopnia. Oczywiście możesz użyć jednej z miliardów wbudowanych funkcji dopasowania Matlaba (jak nudne). Dlaczego nie użyć magicznej różdżki? =)

x = (-1:0.1:2)';
y = 3*x.^2-2*x+1+randn(size(x)); %add some gaussian (normal) noise
A = [x.^2,x,x.^0];
c = A\y              %output: c = ]3.0049; -2.3484; 1.1852]
plot(x,y,'x',x,A*c,'-')

linreg

Snippet 14 - wykresy

gplot(graph,x)

Tak wykreślić wykres. graphpowinien zawierać kwadratową macierz przylegania i xpowinien być macierzą nx2, która zawiera współrzędne każdego węzła. Zróbmy losowy wykres: graph = triu( rand(8)>.7)(utwórz Matrycę, która zawiera 0 i 1, uzyskaj tylko górny trójkąt dla interesującego wykresu). x = rand(8,2)następnie knuj w fantazyjnych stylachgplot(graph,x,'k-.d')

wykres (Deklaruję to jako sztukę współczesną).

Snippet 13 - siatka

meshgrid(a,b)

Jest to jedna z najbardziej niesamowitych funkcji, prosta, ale przydatna. Jeśli chcesz wykreślić funkcję o wartościach rzeczywistych w zależności od dwóch zmiennych, możesz po prostu zdefiniować wektor wartości dla osi x i jedną dla osi y (a i b). Następnie za pomocą siatki siatki można utworzyć dwie macierze o rozmiarze len (a) x len (b), gdzie jedna ma tylko wektor ajako kolumnę, a druga ma tylko kolumnę, a wektory mają tylko brzędy. Przykład użycia: a = -3:0.2:3;[x,y]=meshgrid(a)(jeśli oba wektory są takie same, wystarczy przekazać jeden.) Następnie możesz po prostu wpisaćz=x.^2+-y.^2 i np.mesh(x,y,z). Działa to dla dowolnej liczby wymiarów! Jest to więc świetne nie tylko do kreślenia, ale także do uzyskiwania wszystkich możliwych kombinacji różnych wektorów itp. (Więc jeśli chcesz stworzyć nowy język golfa kodowego, powinien on tam być, po prostu upewnij się, że używasz krótszego nazwa funkcji ...)

siatka

Snippet 12 - kreślenie

plot(x,x.^2)

Weź wektor x=-3:0.5:3i niech plotzrobi resztę. Istnieje wiele innych funkcji do kreślenia, jest to bardzo podstawowa funkcja, z której można korzystać cały czas. Wystarczyłoby już napisać, plot(v)a dane vzostaną wykreślone na podstawie wskaźników tablicy. Jakie to proste? Jeśli chcesz stylizować wykres, po prostu dodaj ciąg jako trzeci argument: np. 'r:o'Utworzy czerwoną kropkowaną linię z okręgami wokół punktów danych. Jeśli chcesz wielu wykresów, po prostu dodaj więcej argumentów lub użyj macierzy zamiast wektorów. Niezawodny.wątek

Snippet 11 - uchwyty funkcyjne

f=@(x,y)x+y

To jest przykład uchwytu funkcji, który zostaje zapisany f. Teraz możesz zadzwonić f(1,2)i odebrać 3. Uchwyty funkcji w matlabie są bardzo przydatne dla funkcji matematycznych (np. Kreślenia) i można je zdefiniować w jednym wierszu. Ale jedną wadą jest to, że nie możesz mieć warunków warunkowych lub częściowych (a zatem nie ma rekurencji). Jeśli tego chcesz, musisz użyć functioninstrukcji i zadeklarować nową funkcję, a każda z nich musi być zapisana w osobnym pliku ... (DLACZEGO RRRR?

PS: Dostaniesz kolejne śmieszne pisanki, jeśli wpiszesz whyw konsoli: Stworzyli ogromną funkcję, która generuje losowe wiadomości, takie jak:

The tall system manager obeyed some engineer.
The programmer suggested it.
It's your karma.
A tall and good and not excessively rich and bald and very smart and good tall and tall and terrified and rich and not very terrified and smart and tall and young hamster insisted on it.

... co jest bardzo pocieszające, jeśli jesteś wystarczająco zdesperowany, aby poprosić konsolę why...

Snippet 10 - Jak wygląda moja matryca?

spy(eye(9))

Jak już wiesz, eye(9)tworzy matrycę tożsamości 9x9. spypo prostu tworzy wartość, która pokazuje zero / niezerowe wpisy matrycy. Ale możesz go również użyć do wyświetlania dowolnych danych binarnych 2d. Jeśli zadzwonisz spybez argumentu, dostaniesz fajne małe pisanki =)

szpiegować tożsamość szpieg easteregg

Snippet 9

kron(a,b)

kronFunkcja analizuje produkt Kronecker dwóch macierzy. Jest to bardzo przydatne dla dyskretnych wielowymiarowych operatorów liniowych. Od czasu do czasu używałem go również do gry w golfa kodowego. Chcesz wszystkie możliwe produkty wpisów ai b? kron(a,b), proszę bardzo.

Snippet 8

5*a\b.*b

Ok tutaj pomieszałem 3 różnych operatorów. Wystarczy pomnożyć dowolną macierz przez skalar *. (Następnie każdy wpis macierzy zostaje pomnożony przez ten skalar). Ale *wykonuje także mnożenia macierzy. Jeśli wstawisz kropkę, otrzymasz .*operator, który pomnoży dwie macierze tego samego rozmiaru, ale pod względem wpisu . (Można to również zrobić za pomocą operatorów podziału, takich jak /i \.)

Następnie operator odwrotnego ukośnika może być używany jako lewy podział (w przeciwieństwie do tego, /który wykonuje prawy podział, tak jak jesteś przyzwyczajony), ale jest również najpotężniejszym i charakterystycznym operatorem matlaba: wykonuje „podział macierzy”. Powiedzmy, że masz układ równań liniowych A*x=bi chcesz go rozwiązać x, a następnie możesz po prostu wpisać x=A\b. I \(możesz również użyć, /ale jest to mniej powszechne w przypadku macierzy) najpierw szybko analizuje macierz i wykorzystuje wyniki, aby znaleźć najszybszy algorytm do wykonania tego odwrotnego mnożenia! (Zobacz np. Tutaj )

Ale możesz go również użyć do niedostatecznie lub zbyt zdefiniowanych systemów (gdzie nie ma odwrotności lub gdzie macierz nie jest nawet kwadratowa, np. Dla metody najmniejszych kwadratów). To naprawdę magiczna różdżka Matlaba.

Snippet 7

[a,b;c]

Ok, to nie wygląda dużo, ale jest to bardzo wygodne narzędzie: konkatenacja macierzy. Przecinek między dwoma wyrażeniami oznacza, że ​​łączą się one poziomo (co oznacza, że ​​muszą mieć tę samą wysokość), a średnik oznacza, że ​​poprzednia „linia” będzie powyżej następnej „linii” (przez linię rozumiem wszystko między dwoma średnikami. Prosty przykład: a = [1,2;3,4]; b = [5;6]; c =[7,8,9]; d=[a,b;c];spowoduje, że będzie taki sam djak d=[1,2,5; 3,5,6; 7,8,9]. (Rozumiesz?)

Snipped 6

eye(7)

Ta funkcja tworzy pełną macierz tożsamości 7x7. To takie proste. Istnieją inne funkcje, nan,inf,ones,zeros,rand,randi,randnktóre działają w ten sam sposób. (Jeśli przekażesz dwa argumenty, możesz ustawić wysokość / szerokość wynikowej macierzy.) Jak pokażę później, możesz łatwo tworzyć i (i to w bardzo wizualny sposób) łączyć macierze (tablice 2d), co jest tak cholernie przydatne i łatwe, jeśli trzeba rozwiązać liczbowo równania różniczkowe cząstkowe. (Kiedy rozwiązujesz PDE, ogólne podejście polega na dyskretyzacji operatorów pochodnych, w zasadzie otrzymasz tylko ogromny system równań liniowych, który należy rozwiązać. Matryce te są zwykle rzadkie (tylko bardzo niewiele elementów niezerowych) i mają pewien rodzaj symetria. Dlatego możesz łatwo „skomponować” potrzebną macierz.

Snippet 5

a(a>0.5)

Mam nadzieję, że nie zmęczyły Cię wszystkie sposoby dostępu do tablic. To pokazuje prosty sposób na uzyskanie wszystkich elementów tablicy, które spełniają pewne warunki. W takim przypadku otrzymujesz wektor wszystkich elementów, aktóre są większe niż 0,5. Wyrażenie a>0.5po prostu zwraca macierz tego samego rozmiaru co az jednością dla każdego elementu, który spełnia warunek i 0dla każdego elementu, który nie spełnia.

Snippet 4

a(:)

To ponownie zwraca zawartość ajako wektor kolumny (macierz nx1). Jest to przydatne, jeśli nie wiesz, czy dane zostały zapisane jako wektor kolumny lub wiersza, czy dane są dwuwymiarowe (np. Dla metod różnic różnicowych 2d).

Snippet 3

1:9

Możesz łatwo tworzyć wektory (w tym przypadku macierze 1xn) za pomocą operatora średnika. W tym przypadku otrzymujesz wektor [1,2,3,4,5,6,7,8,9]. Jest to również szczególnie przydatne do uzyskiwania dostępu do wycinków innych wektorów, ponieważ np. a(2:4)Uzyskuje dostęp do drugiego, trzeciego i czwartego elementu wektora a. Możesz go również użyć z krokiem wielkości, 0:0.5:10lub mniej więcej.

Snippet 2

i;

Średnik tłumi wyjście do konsoli. Możesz to uznać za dobrą lub złą rzecz, ale lubię to do debugowania rzeczy. Dowolna linia obliczeniowa itp. Automatycznie wydrukuje swój wynik na konsoli, o ile nie pomijasz danych wyjściowych średnikiem.

Snippet 1

i

Liczba zespolona to podstawowy typ liczb. (Szkoda, że ​​wiele osób używa ijako zmiennej liczącej dla pętli, w którym to przypadku jest ona zastępowana).

Wprowadzenie

Dla tych, którzy nie wiedzą, MatLab to język programowania (z ładnym IDE, który nazywa się również MatLab?), Który jest przede wszystkim przeznaczony do obliczeń numerycznych * i manipulacji danymi. (Istnieje odpowiednik typu open source o nazwie „Octave”). Ponieważ jest tylko ** interpretowany, nie jest zbyt szybki, ale jego siła polega na tym, że można łatwo manipulować matrycami, a wiele algorytmów jest implementowanych w zoptymalizowany sposób, dzięki czemu działają one dość szybko po nałożeniu na matryce. Jest to również bardzo łatwy do nauczenia się język, ale nie polecam go jako języka początkowego, ponieważ przyjmujesz dość złe nawyki związane z programowaniem.

* Ponieważ jest to język interpretowany, może być bardzo powolny w przypadku kosztownych projektów, ale masz wbudowane metody paralelizacji, a także możesz używać wielu komputerów razem, aby uruchomić program. Ale jeśli naprawdę chcesz być szybki, myślę, że nadal polegasz na C, Fortran lub podobnych szalonych rzeczach. Ale wciąż wiele zaimplementowanych algorytmów (mnożenie macierzy, rozwiązywanie układów równań liniowych itp.) Jest mocno zoptymalizowanych i działa całkiem dobrze. Ale jeśli zaprogramujesz te same algorytmy w samym Matlabie, będziesz musiał poczekać =) (Coś naprawdę nieintuicyjnego, gdy pochodzisz z innych języków, polega na tym, że jeśli wektoryzujesz swoje operacje zamiast używać pętli, możesz zaoszczędzić dużo czasu w Matlabie .)

** Możesz w pewnym stopniu skompilować swoje programy, ale to głównie konwertuje kod źródłowy do pliku nieczytelnego (dla ludzi), który nie jest znacznie szybszy po uruchomieniu.


1
Bardzo często mam ten problem ... ustawienie się ina coś, a następnie nieoczekiwane zachowanie, gdy nie jest to jednostka złożona.
feersum

3
Niezłe pisanki! Jeśli wpiszesz „edytuj szpiega”, znajdziesz przykład zaciemnienia kodu :-)
Abulafia

1
Poszedłem głosować za tym i zdałem sobie sprawę, że już to zrobiłem. Niestety, gdybym tylko mógł to jeszcze raz głosować. Nadal nadchodzą, @flawr!
Alex A.

2
Jeśli zabrakło Ci inspiracji do pokazania rzeczy, mogę polecić blog Mathworks: W Art of MATLAB autorstwa Lorena Vershure Często opisują najlepsze praktyki, które można pokazać w ramach limitu postaci. Dla ciekawości rozważ Abandon Matlab , a dla funkcji nieudokumentowanych możesz przejść do Nieudokumentowanej Matlab
Yaira

1
@flawr - Dla faktoidu może być również fajne wspomnieć fakt, że historycznie MATLAB został pierwotnie stworzony dla studentów informatyki na Uniwersytecie w Nowym Meksyku (Cleve Moler był wówczas prezesem) jako łatwy interfejs do LINPACK i EISPACK (... obecnie zastępowane przez LAPACK ) bez konieczności uczenia się FORTRAN ... a ze względu na łatwość obsługi bardzo szybko rozprzestrzenił się na inne instytucje akademickie :)
rayryeng

35

CJam

Wypróbuj poniższe fragmenty tutaj

Długość 20 fragmentu:

q~{]__~z\z<=\~*0>*}*

Kalkulator min-mod . Fragment pytania:

Funkcja minmod jest wariantem znanej min , która pojawia się w schematach wysokiej rozdzielczości ograniczających nachylenie dla równań różniczkowych cząstkowych. Biorąc pod uwagę liczbę stoków, wybiera najbardziej płaskie zbocze, jednocześnie dbając o względne znaki między stokami.

Funkcja przyjmuje dowolną liczbę parametrów. Następnie minmod (x 1 , x 2 , ..., x n ) definiuje się jako:

  • min (x 1 , x 2 , ..., x n ) , jeśli wszystkie x i są ściśle dodatnie
  • max (x 1 , x 2 , ..., x n ) , jeśli wszystkie x i są ściśle ujemne
  • 0 , w przeciwnym razie.

Długość 18 fragmentu:

l'[,65>Dm>_el+_$er

Enkoder ROT13. Przesuwa tylko a-zA-Zznaki z ciągu wejściowego przez STDIN

Długość 15 fragmentu:

T1{_2$+}ri2-*]p

Pełny program do drukowania pierwszych Nliczb z serii Fibonacciego, Ndostarczany jako dane wejściowe przez STDIN.

Długość 12 fragmentu:

{{_@\%}h;}:G

Prosta funkcja GCD. Można tego użyć tak, 2706 410 Gaby uzyskać GCD na stosie.

Długość fragmentu 11:

123456 789#

#jest operatorem mocy. Ten fragment pokazuje fajną funkcję CJam, że obsługuje BigInts dla prawie wszystkich operacji matematycznych. Wyjście powyższego kodu to

1596346205622537943703716803040694151242100030904924074732295184521676912291137885341977590649991707684635184329980991487148618486236239062505001539322685142817506810040361209550544146292158784625519911512640361780862459268161619223326802388689703997604303632605734938879647069477372395799326590488746599202521617640394227957532720581758771344616555153473551874187964029973716015080326283503474062024803237072761129557356772954771383125420283743787215768524095651476398918270831514362626616089349128838080859262141293069421199363839940462244772673481244848208112002212957221705577938865719802035511067875502253218277834350725436729497351901219311577128600087062378434520948898301738545267825952998284599001356281260973911216650526574435975050678439968995805415462116669892745933523276658479456263859786003695570642598885206779863730608803831608206418317758451327165760242416052588688579435998154295782751455020445483571514197850814391880423853968520336337963918534259580183058727377932419280412466915889059399591196961188841001024998633317094826403760131868252088477018937989608302521450181593409274231460335072324865982559395114735391976545471553525054490202974741119144469523879456646833238659929705233941114530149037245274032070536718197592615630616792756562341411027203615235147973615347081993563361626845258162606172599728677944001956482301240050182368840648532697569098833480384074404562991348377266778603059081932412368912313845464302833428950934701568958836851009236647605585910687215977468114323293396641238344799575626940766355697576957869656153567798618227770961980620119004224798449940378878601283741944503399682599666873704888519152796472231721010884561046439019823540214190109829183178504573391524533915085342799888899681052113605127068137552531204917650779012455136663716975904242872042805633443567570913936237754642040107392687168596924804730637819953463737212774674563401663682370631910559669378413063684132477269578881395521544729393136204246705936061735379354437327940116154383441927197123218522827575163913310005036963663583344508839784971260123709283218409462028161021477446586507813599051643059982983426688872855309396405653159417356549291603532443699350168178837164682957610433456205211423600319694496115159970718912091395232327389520091646132878609779171226748990343349416763319432268713023302555895744813731889452605219001900815755497209921418814092923394321459962373890912709775151652200071533644718727513889263907829300496554849544461628702471995210369421320165755673222520834013956492183306187393652197405863508709529644837118590847002900783148394313160749018413291215958936871830666201928218294362550829287373305552379418641499562597137520153409556227576809855521876196531587454478159211299517511047868125975115347272184123454929507976958328038242400918390689757262398695703472270927183494613959476164389143107240083171566284628032072645081703351075328092783401422849512230275075331561337345714881104575020436358133210849231625973013523497330004645467493618279226202227586584610761439335895760888873155403816627190368675397978355381544497413492223577022267403347927237298551052219150516984577176643706356698282552857754120841266435149587248192704898338826251727748499150285409036076919533685800933215325289882260771526293167171975367192287689881199864600661035143522211647660445960687046757311913589429739868592726372013684511683081229044622752191694278221303073075505531920922815724661725685493922212700535444400760813940151761980008355835574184921854364539924999643954874549857103642483664109073938527328920827803218865362851320233433429604394590974694396314165313743853607609394553133883545319222169958204731303672940856293527174545435349105954532301106962634516087237739490953930886293289854731305112253177512851251930821765454042415085420000484369355605183062368648992392499663861508991984554431113080399485470268940148600970493633737364443822752829774334511729579419931500217970224646496435527826186627011323464848141074486509849545954714213290443775688291020289759390171236344528896

Długość 10 fragmentu:

"`%W_"_W%`

Zrobiliśmy już quine, odwróćmy to! Jest to jeden z najkrótszych zwrotnych quinów w CJam. Quine Reverse to quine, która drukuje kod źródłowy w odwrotnej kolejności.

Długość 9 fragmentu:

5,K,+_&S*

Ten fragment zawiera wiele funkcji CJam,

5, "create an array of numbers 0 to 4"
K, "create an array of numbers 0 to 19"
+  "List concatination"
_  "Duplicate top stack element"
&  "Set distinct operator in this case"
S* "Join array elements with space character"

Długość 8 fragmentu:

"`_~"`_~

Jedna z najmniejszych możliwych quinesów w CJam. Jest to prawdziwa quine w tym sensie, że nie odczytuje w żaden sposób kodu źródłowego. (Czytanie kodu źródłowego nie jest nawet możliwe w CJam)

Długość 7 fragmentu:

"AB"_m*

m*tworzy wszystkie produkty kartezjańskie z dwóch górnych elementów stosu. Na przykład powyższy kod zostanie umieszczony ["AA" "AB" "BA" "BB"]na stosie, który jest kartezjańskim produktem "AB"i "AB".

Długość fragmentu 6:

"_~"_~

Ładnie wyglądający powtarzający się kod. NIE uruchamiaj tego :). Ta reprezentacja kodu jest podstawą najprostszego quine w CJam. Układasz ciąg znaków "_~"na stosie, tworzysz kopię ( _) i oceniasz ją. Który z kolei robi to samo ponownie (i znowu ..), aż do osiągnięcia wyjątku maksymalnej rekurencji.

Długość fragmentu 5:

{A}:F

Tak działa podstawowa funkcja w CJam. Powyższe wyrażenie przypisuje blok kodu {A}do zmiennej F. Teraz w kodzie możesz umieścić w Fdowolnym miejscu, aby uruchomić blok kodu (i uzyskać 10w tym przypadku)

Długość 4 fragmentu:

"A"~

Za pomocą można ocenić dowolny blok kodu lub ciąg znaków, a nawet pojedynczy znak ~. Powyższe wyrażenie powoduje10

Długość fragmentu 3:

Kmr

Typowy generator liczb losowych z zakresu od 0 do Ktj. 20.

Długość fragmentu 2:

es

Daje to bieżący znacznik czasu (milisekundy od epoki). CJam ma również etczas lokalny w bardziej użytecznym formacie, który zwraca tablicę zawierającą różne części bieżącego czasu (dzień, godzina itp.).

Długość 1 fragmentu:

A

CJam ma prawie wszystkie duże alfabety jako predefiniowane zmienne. Ajest 10, Bjest 11 i aż Kwynosi 20. PJest pi (3.141592653589793), Njest nową linię i wiele innych . Mogą one być bardzo przydatne, gdy potrzebujesz wartości początkowych w zmiennych, a nawet gdy potrzebujesz dwucyfrowej liczby w 1 bajcie.

Faktoid

CJam jest zainspirowany GolfScript, ale zawiera wiele funkcji, w tym obsługę połączenia sieciowego GET: D

PS: Postaram się aktualizować odpowiedź co 5 głosów poparcia lub co 2 godziny (kiedykolwiek wcześniej)


Z twoim przykładem ROT13 są pewne problemy: p Ale jestem pod wrażeniem quine, myślę, że go pożyczę :)
aditsu

@aditsu o co chodzi?
Optymalizator

Zmienia wielkość liter nz. Ma też @ bez powodu, możesz zamiast tego umieścić tam D.
aditsu

@aditsu Dość pewny, że jest to ROT 13 w całym zakresie a-zA-Z i to jest powód zmiany skrzynki. Nie umiesz tego przeczytać? jest to tylko twój własny język: P @ jest dostępny dla 18 znaków Chyba: D
Optymalizator

ROT13 zwykle tak nie działa. Nie rozumiem, dlaczego pytasz, czy potrafię czytać w swoim języku, nie chodzi o zrozumienie tego, co robi program, ale o to, że nie robi tego, co się spodziewano.
aditsu

34

Common Lisp

Lisp (z LISt Processing) jest jednym z najstarszych obecnie używanych języków (tylko FORTRAN jest starszy). Warto zauważyć, że jest to pierwszy język, w którym kod to dane, a dane to kod; zwany homoiconicity. Był to także pierwszy język, w którym można wyrzucać śmieci. Pierwotnie zaprojektowany przez Johna McCarthy'ego w artykule z 1958 roku jako język całkowicie teoretyczny, stał się prawdziwym językiem, gdy Steve Russel zdał sobie sprawę, że funkcję eval można zaimplementować na komputerze. Jest najbardziej rozpowszechniony w sztucznej inteligencji i jest natychmiast rozpoznawalny po przewadze w nawiasach. Common Lisp został zaprojektowany w celu ujednolicenia wielu starszych dialektów Lisp w bardziej znormalizowanej formie.

Będę starał się, aby każdy fragment mógł być uruchamiany sam, choć niekoniecznie robi coś wartościowego. Dodatkowo, ponieważ używam Common Lisp, podstawowe pojęcia i duża część składni mają zastosowanie w innych dialektach, ale niektóre funkcje nie będą działać, powiedzmy, w schemacie.

Długość 1

*

Ze względu na nacisk na użycie S-wyrażeń i list do kodowania, w Lisp jest bardzo niewiele poprawnych wyrażeń, które nie zawierają nawiasów zwanych atomami. Wszystko wpisane bezpośrednio w REPL (pętla read-eval-print) jest traktowane jako zmienna i jako takie oceniane. *przechowuje poprzednią wartość wydrukowaną przez REPL.

Długość 2

()

To jest pusta lista, jeden z najważniejszych symboli w Lisp. Każda właściwa lista w Lisp jest zakończony z pustej listy, podobnie jak każdy właściwy ciąg w C kończy \0.

Długość 3

(*)

Jest to podstawowe wywołanie funkcji, które składa się z symbolu owiniętego w nawiasy. Lisp nie zawiera operatorów, to tylko funkcje. Wybrałem mnożenie specjalnie dlatego, że tak naprawdę nie jest to funkcja binarna; operator mnożenia w Lisp przyjmuje nieokreśloną liczbę argumentów. Jeśli nie podano żadnych argumentów, zwraca 1operator identyfikatora do pomnożenia.

Długość 4

`(1)

To komórka przeciw, która jest po prostu innym sposobem na powiedzenie, że jest to para elementów. W Lisp każda lista składa się z komórek Cons połączonych z komórkami Cons, gdzie pierwszy element (the car) jest wartością, a drugi element (the cdr) wskazuje na następną komórkę cons. To stanowi podstawę dla Lisp opartego na połączonych listach. Ta konkretna komórka przeciw ma 1jako samochód, a pusta lista jako jego cdr.

Długość 7

(not t)

Chcę dotknąć wartości prawdy w Lisp. To by wróciło nil. We wspólnym Lisp tjest symbolem „prawda” nili „ ()fałsz” i są sobie równe, ale zauważ, że ta definicja nie jest standardowa dla wszystkich dialektów Lisp; Na przykład w schemacie rozróżnia się #fjako fałsz i '()pusta lista.

Długość 9

(cdr ())

Jak powiedziałem wcześniej, cdr to element tail listy, który można uzyskać za pomocą funkcji cdr. Podobnie możesz uzyskać element głowy, samochód, z funkcją car. Całkiem proste, prawda? Samochód i cdr pustej listy są oba nil.

Długość 10

(cons 1 2)

Wreszcie wystarczająca długość, aby rozpocząć pracę z listami. constworzy komórkę przeciw z pierwszym parametrem jako samochodem, a drugim jako cdr. Ale zamiast drukować (1 2), daje (1 . 2). Wracając do fragmentu o długości 2, właściwa lista powinna kończyć się pustą listą, więc cdr ostatniej komórki przeciwnej powinien wskazywać na pustą listę. W tym przypadku wskazuje ostatnia komórka przeciw 2, więc Lisp informuje nas, że mamy niewłaściwą listę, ale nadal pozwala nam to zrobić, na przykład, w jaki sposób można utworzyć ciąg C bez znaku \0.

Długość 11

(cons 1 ())

Teraz stworzyliśmy naszą pierwszą prawidłowo utworzoną listę. Jest to jednocelowa komórka z samochodem 1i cdr (). Zauważysz, że dla każdej innej listy prowadzę ją z odwrotnym cytatem / haczykiem; każda inna właściwa lista próbowałaby ocenić swój pierwszy argument jako funkcję z pozostałymi elementami jako parametrami. Ściśle mówiąc, ()nie jest to jednak lista; jest to symbol składający się z (ai, )który reprezentuje pustą listę. Lisp pozwala na użycie niemal każdego znaku do wydrukowania w nazwie symbolu i pozwoli ci na nowo zdefiniować dowolny symbol, jak chcesz.

Długość 12

(cdr `(1 2))

To dałoby wynik (2), nie 2jak niektórzy by się domyślali. Pamiętaj, że każdy cdr powinien wskazywać albo inną komórkę przeciw, albo pustą listę; oczywiście 2nie jest pusta lista, więc musi to być kolejna wada dla samochodu 2i cdr ().

Długość 13

'#1=(1 . #1#)

Spowoduje to utworzenie okrągłej listy zawierającej tylko jedną wartość 1. Jeśli zostanie wydrukowana, wydrukuje „(1 1 1 1 ...”) na zawsze, tak że w praktyce można ją uznać za listę nieskończoną (na której można wykonać cdrnieskończone czasy) aby uzyskać zawsze ten sam wynik!). O ile nie zostanie przypisany Tdo zmiennej globalnej *print-circle*, w takim przypadku zostanie wydrukowany jako #1=(1 . #1#).


Ta ostatnia edycja! Szybko, ktoś zrobi esolang o tematyce Beatlesów: D
fede s.

1
@fedes. John McCarthy, Paul McCartney ... język nazywa się CarthyCartney.
kot

33

Marka GNU

Wyjdę na tym kończynie. Myślę, że może to być pierwszy raz, kiedy makepojawił się w PPCG.

Faktoid

Marka może być uważana za język funkcjonalny.

Długość fragmentu 0

Nie sądzę, aby wymagane były fragmenty długości 0, ale i tak jest jeden. Myślę, że może to być najbardziej użyteczny ze wszystkich programów o długości 0. Z pustym plikiem Makefile (lub nawet bez pliku Makefile), make wciąż ma wiele wbudowanych reguł. Np. Istnieją domyślne wbudowane reguły kompilowania pliku .c do .o lub pliku binarnego, biorąc pod uwagę, że plik .c istnieje w bieżącym katalogu. Więc jeśli zrobimy:

make hello.o

make znajdzie regułę .c do .o i skompiluje hello.c, aby uzyskać hello.o

Podobnie jeśli zrobimy:

make goodbye

Jeśli w bieżącym katalogu znajduje się plik goodbye.c, zostanie on skompilowany do pliku binarnego goodbye.

Długość 1 Snippet

TAB

Tak, znak TAB. Chociaż samo w sobie niewiele to robi, ma duże znaczenie w Make. W szczególności wszystkie wiersze receptury zgodne z definicją celu w regule MUSZĄ zaczynać się od TAB. Powoduje to wszelkiego rodzaju frustracje podczas debugowania plików makefile, gdy tabele TAB i spacje się pomieszają.

Długość 2 Snippet

$@

Jest to zmienna automatyczna do stosowania w przepisach. Rozwinie się do nazwy pliku docelowego reguły. Istnieją inne przydatne zmienne automatyczne .

Długość 3 Snippet

a:=

Najkrótsze po prostu rozszerzone przypisanie zmiennych. Zmienna a jest ustawiana na „” natychmiast po pierwszej analizie pliku Makefile. Jeśli zamiast tego zrobimy a=, przypisanie jest rekurencyjnie rozszerzane, tzn. Rozszerzanie jest odraczane do czasu, aż zmienna zostanie faktycznie odwołana.

Długość 4 Snippet

W:;w

Najkrótsza marginalnie przydatna kompletna specyfikacja reguły. Definiuje to cel Wza pomocą reguły, która po prostu uruchamia wpolecenie powłoki. A zatem

make W

jest równa:

w

Jest to alternatywna składnia reguły polegająca na tym, że przepis podąża za celem w tym samym wierszu oddzielonym nowym wierszem. Częściej wiersze receptury następują bezpośrednio po osobnej linii docelowej, a TABznaki rozpoczynają każdą linię przepisu.

Długość 5 Snippet

$(@D)

Kolejna zmienna automatyczna. Podobne do $@, ale rozwija się do katalogu ścieżki, z nazwą pliku i końcowym / usuniętym.


Może niektóre funkcje łańcuchowe, takie jak $(basename )lub $(patsubst )? ( np. )
luser droog

32

Cudowny

Długość 14 fragmentu kodu

}0}1
Mulx
HxHx

Ten fragment prezentuje więcej bibliotek Marbelous i wprowadza nową koncepcję, a mianowicie tablice wielokomórkowe. MulxPłyta ma dwa kulki na wejściu i na wyjściu 2 kulki. Kulki, które wchodzą do lewej komórki, Mulxbędą odpowiadały }0urządzeniom na tej płycie i komórce, która znajduje się najbardziej na prawo }1. Analogicznie wyjścia również będą pochodzić z różnych komórek. Szerokość planszy można obliczyć, ponieważ MAX(1, highest output device + 1, highest input device + 1)komórki, które nie odpowiadają urządzeniu wejściowemu, usuwają marmur, który spadnie na nie.

Długość 13 fragmentu kodu

7E
??
>Y!!
{0

Jest to plansza, która wypluwa losową postać ascii do wydrukowania na każdym tiku. Marbelous ma dwa sposoby generowania losowych wartości. Jest to, ??co zwraca losową wartość między 0 a marmurem wejściowym, który otrzymuje, włącznie, i ?n: odpowiednio ?0do ?Z. Które działają bardzo podobnie ??. Mamy również, !!który kończy płytkę, nawet jeśli nie wszystkie wyjścia są wypełnione. Czy możesz dowiedzieć się, w jaki sposób ?nmożna zaimplementować urządzenia jako tablice w Marbelous ???

Długość 12 fragmentu kodu

}0}1
Fb//
Dp

Tutaj widzimy kilka funkcji bibliotecznych Marbelous w akcji. Fbwyprowadza n-tą liczbę Fibonacciego, gdzie n jest marmurem wejściowym. Dpdrukuje marmur wejściowy do STDOUT jako liczbę dziesiętną. Oba są zaimplementowane w Marbelous i można je wywoływać, gdy sprawdzisz dołączanie bibliotek do interpretera online , w przypadku interpretera python musisz jawnie dołączyć każdy plik. Dodatki do tych tablic można znaleźć na github . Zauważ, że ten konkretny program wymaga 2 wejść i wywoła tablicę Fibonacciego dwa razy. Wywołane tablice powracają w obrębie jednego tiku planszy, która je wywołała.

Długość 11 fragmentu kodu

}0}0
{<{0{>

Ten wymaga wyjaśnienia. Te }0urządzenia są imputs, ponieważ mają ten sam numer (0), będą zawierać taką samą wartość, gdy ta płyta jest wywoływana. Trzy urządzenia w dolnym rzędzie są wyjściami. {<wyjścia po lewej stronie płyty, {0wyjścia pod pierwszą komórką płyty i {>wyjścia po prawej stronie. Wyjście jest wypychane tylko wtedy, gdy wszystkie odrębne urządzenia wyjściowe są wypełnione. W takim przypadku jednak właściwe urządzenie wyjściowe nigdy nie zostanie osiągnięte. Płyta wyjdzie z powodu braku aktywności i wyśle ​​dwie wartości, które ma. Czy potrafisz sobie wyobrazić, jak można wprowadzić /\w życie jako cudowną tablicę?

Długość 10 fragmentu kodu

..40
FF
\\

W Marbelous jest kilka rzeczy, które odgrywają ważną rolę. Po pierwsze jest dodatek. Jeśli prześledzisz ścieżkę dwóch kulek na planszy, zauważysz, że trafią do tej samej komórki w tym samym czasie. Kiedy tak się stanie, zostaną dodane. (fajny fakt: w pewnym momencie uważano, że zamiast sumować kulki, powinny one tworzyć stos). Jednak Marbelous jest językiem 8-bitowym, więc dodanie marmuru do FFjest równoważne odjęciu 1 od niego.

Długość 9 fragmentu kodu

00
\\/\]]

To najkrótszy sposób na wdrożenie podstawowej wersji kota w Marbelous. 00 \ / \ To pętla, która co sekundę umieszcza 00marmur wartości na ]]urządzeniu. To jest urządzenie STDIN. Kiedy marmur ląduje na tym urządzeniu, próbuje odczytać pierwszy znak ze STDIN, jeśli taki istnieje, zostaje zepchnięty (iw tym przypadku wydrukowany ponownie). Jeśli go nie ma, oryginalny amrble zostaje przesunięty w prawo. (w tym przypadku jest kasowane)

Długość 8 fragmentu kodu

}0
~~
{0

Ten fragment pokazuje kilka funkcji. Najpierw pobiera dane wejściowe przez} 0. W tym przypadku jest to płyta główna, która zostanie zastąpiona wprowadzeniem z wiersza poleceń. Możesz także wywołać tę funkcję, w takim przypadku argument zostanie pobrany zamiast danych wejściowych z wiersza poleceń. Jest jeszcze coś ~~, co nie jest operatorem. Następnie przechodzimy do }0: Jeśli wszystkie }nurządzenia są wypełnione, wartości te są zwracane, ponieważ funkcje zwracają wartości. (Marbelous obsługuje więcej niż jedną wartość zwracaną na funkcję)

Długość 7 fragmentu kodu

00
\\/\

Jest to najbardziej kompaktowa nieskończona pętla, którą możesz stworzyć w Marbelous. \\Urządzenie popycha każdą kulkę w prawo, /\kopie marmuru i odpycha jedną kopię na lewo, a drugi w prawo. Ponieważ plansza ma tylko dwie komórki, marmur po prawej stronie zostaje zniszczony.

Długość 6 fragmentu kodu

46MB75

Oto przykład rekurencji MB(domyślnie nazwana płyta główna jest wywoływana przy każdym zaznaczeniu, ale nie przed drukowaniem Fudo STDOUT przy każdym wywołaniu. (W rezultacie: FuFuFuFuFuFu...Oczywiste jest, że przepełnia stos wywołań.

Długość 5 fragmentu kodu

2A
++

Trochę arytmetyki, Marmur o wartości 2Aspada na pierwszy tyk i znajduje się na ++komórce. To jest operator. Ten konkretny operator zwiększa każdy lądujący na nim marmur i pozwala mu spaść. Marmur ma teraz wartość 2Bi spada z planszy. Spowoduje to wydrukowanie +do STDOUT.

Długość 4 fragmentu kodu

:
24

Dwóch tłumaczy nie zgadza się tutaj, w tym przykładzie nadałem pierwszej płycie pliku nazwę (nazwa jest pustym ciągiem). Interpretator python zakłada, że ​​jest to płyta główna i wywołuje tę płytę po uruchomieniu programu (który drukuje $). Tłumacz javascript nie znajduje płyty głównej, a zatem nie ma punktu wejścia. Może to być przydatne podczas pisania pliku biblioteki dla Marbelous.

Długość 3 fragmentu kodu

:Bo

To jest tablica nazwana, bez ciała, możemy nazwać tę tablicę, pisząc Bow komórce dowolnej tablicy (w tym Bosamej)

Długość 2 fragmentu kodu

3A

Ten kod jest ciałem komórki 1x1 (każda komórka ma szerokość dwóch znaków), domyślnie nazwaną MB(dla płyty głównej). Drukuje wartość ascii wartości szesnastkowej, 3Akiedy marmur spada z planszy. Takim wyjściem tego programu jest kod źródłowy:

Długość 1 fragmentu

:

Wraz z #tym jest to jeden z dwóch jedynych prawidłowych programów 1 postaci w cudowny. #jest wskaźnikiem komentarza i dlatego niezbyt interesujący. :informuje cudowne, że masz zamiar ogłosić tablicę. Żaden z dwóch kompilatorów nie dba o to, abyś nie nazwał ani nie zdefiniował płytki. Program nic nie robi.

factoid:

Marbelous został opracowany przez ludzi na tej stronie, niektóre nazwy, które były w biegu dla tego języka to Rube i po prostu Marbles .


2
pobił mnie do tego. fajne fragmenty!
Sparr,

Twój fragment o długości 12 wydaje się przyjmować dwa wejścia i wypisać dwie różne liczby Fibonacciego. czy to było zamierzone?
Sparr

@Sparr, tak, to miało pokazać nieco, jak działają funkcje w Marbelous.
overactor

może dodać to do wyjaśnienia? z tego, co napisałeś, spodziewam się, że fragment weźmie jedno wejście i wyjdzie jeden numer Fib.
Sparr

Naprawdę mam nadzieję, że zdobędziesz 40 punktów, więc moja funkcja fibonacciego będzie pasować ...
Sparr

31

Naprzód

Forth ma tylko dwa typy, liczby całkowite i zmiennoprzecinkowe (i zmiennoprzecinkowe są opcjonalne!), Ale nadal udaje się mieć znaki, ciągi, długie długie wartości całkowite, wskaźniki, wskaźniki funkcji, struktury i więcej; wszystko zależy od tego, jak z niego korzystasz!

Długość 1

.

.Poleceń (lub „słowo”, jak my to nazywamy) wypisuje wartość całkowitą na szczycie stosu danych; jeśli stos jest pusty, pojawia się błąd czasu wykonywania. Usuwa również wartość ze stosu - upvote, aby zobaczyć, jak możemy ją zachować!

Długość 2

.s

.sSłowo wyświetla wartości aktualnie na stosie, bez usuwania żadnej z nich. Wyświetla również całkowitą liczbę wartości. W Gforth .sjest domyślnie ograniczony do pokazywania tylko 9 najlepszych wartości; może dowiemy się, jak pokazać więcej?

Długość 3

see

Wpisz, seea następnie dowolne czwarte słowo, aby zobaczyć kod źródłowy tego słowa. Najczęstsze słowa są zdefiniowane w samym Forth, a tylko kilka prymitywów jest zdefiniowanych w asemblerze.

Długość 4

1 0=

Czy wspominałem, że Forth jest językiem stosowym z operatorami Postfiksa? Wpisanie 1 0=wypycha 1na stos, a następnie wykonuje 0=słowo, które wyrywa najwyższą wartość ze stosu i wypycha, truejeśli jest równe 0, falsejeśli nie. 0=to słowo oznaczające wygodę 0 =; istnieje kilka takich skrótów dla wspólnych wartości + kombinacji słów, takich jak 1+i 0<>. Ponadto, podczas gdy falsew Forth wynosi 0 i każda niezerowa wartość jest prawdą, wbudowane słowa testowe zwracają trueprawdziwe wyniki i trueidą na całość - jest to wartość z ustawionymi wszystkimi bitami, tj. -1!

Długość 5

-1 u.

Wciśnij -1na stos, a następnie wysuń go i wydrukuj jako liczbę całkowitą bez znaku. Można tego użyć, aby szybko zobaczyć maksymalną wartość liczby całkowitej bez znaku w twojej wersji Forth (ale nie maksymalną wartość całkowitą, którą natywnie obsługuje!). Być może pytasz: „Skąd wiemy, kiedy należy int wydrukować, .a kiedy u.?” Odpowiedź: .kiedy jest podpisany, u.gdy jest niepodpisany. „Nie to miałem na myśli” - mówisz. „Skąd wiemy, kiedy wartość na szczycie stosu jest podpisana, a kiedy niepodpisana?” Odpowiedź: Jesteś programistą - to twoja praca! Musisz wiedzieć, czy każda liczba całkowita na stosie reprezentuje liczbę całkowitą, liczbę całkowitą bez znaku, liczbę int*achar*, wskaźnik funkcji lub inny, albo dostaniesz demony do nosa. Forth nie będzie dla ciebie tego śledził; co to jest, C?

Długość 6

." Hi"

Wydruki Hi. ."jest słowem czwartym (które, podobnie jak wszystkie słowa czwarte, po którym musi znajdować się biała spacja lub EOF), które odczytuje strumień wejściowy do następnego "i drukuje między nimi bajty. Jeśli umieścisz więcej niż jedno miejsce po .", ."zostaną wydrukowane wszystkie oprócz miejsca bezpośrednio po nim . Sekwencje specjalne nie są obsługiwane (więc nie można wypisać łańcucha ze znakiem "w nim za pomocą ."), ale Gforth dodaje .\"do języka, który je obsługuje.

Długość 7

: + - ;

Zdefiniuj własne słowa w Forth, pisząc dwukropek, nazwę słowa, słowa, które chcesz wykonać, a następnie średnik. Słowo może być dowolną sekwencją znaków innych niż białe znaki (białe znaki to sposób, w jaki Forth mówi, gdzie jedno słowo się kończy, a drugie zaczyna w końcu), nawet interpunkcja, a nawet operatory (które są przecież tylko słowami). Powyższy fragment na nowo definiuje +znaczenie -, więc teraz, gdy spróbujesz dodać, odejmujesz. Nie +ma to wpływu na wszystkie istniejące wcześniej słowa , które zawierają odniesienie do oryginalnej definicji +.

Uwaga: Niektóre słowa robią różne rzeczy w definicjach innych słów niż na zewnątrz, ale inne niż struktury kontrolne, wszystkie są dość ezoteryczne. Większość słów robi to samo w definicji jak na zewnątrz, ale czasami to nie jest oczywiste - : show-see see see ;nie zrobi tego, co myślisz!

Długość 8

: 42 - ;

Kiedy powiedziałem, że słowo może być dowolną sekwencją białych znaków, miałem na myśli dowolną sekwencję. Nie, Forth nie ma słowa dla każdego numeru; liczby są tylko trochę wyjątkowe. Kiedy Forth napotyka sekwencję spacji, najpierw sprawdza, czy jest to znane słowo; jeśli nie jest, próbuje parsować go jako liczbę; jeśli to się nie powiedzie, tylko wtedy pojawi się błąd. Zdefiniowanie słowa, które jest pisane tak samo jak cyfra, oznacza, że ​​nie będziesz już mógł wprowadzić tej pisowni bezpośrednio bez uzyskania tego słowa, ale Gforth i różne inne Forths i tak dają ci wiele sposobów na pisownię liczb .

Długość 9

IF 1 THEN

Wreszcie coś znajomego! Oczywiście ten kod sprawdza, czy jego argument 1jest prawdziwy, a jeśli tak, wykonuje to, co następuje po THEN, prawda? Źle. Kiedy wykonanie osiągnie IF, wartość na górze stosu jest usuwana, a jeśli ta wartość jest prawdziwa (tj. Niezerowa), wykonywanie jest kontynuowane z tym, co jest w środku, IF ... THENa następnie z tym, co jest po THEN; jeśli wartość wynosi zero, po prostu przechodzimy do następnego THEN. Zwróć uwagę, że ze względu na sposób, w jaki słowa te są implementowane wewnętrznie (co dotyczy innych słów Forth!), IFI THENmogą być używane tylko w definicji słowa, a nie w „stanie interpretacji”.

Długość 12

( x y -- y )

To jest komentarz. Przechodzi od razu (do następnego ). (W interpretatorze nowy wiersz może go także zakończyć.) To nie jest „wbudowane” w składnię Fortha (czy coś?); (to po prostu inne słowo, które odrzuca wszystko ze strumienia wejściowego w górę do następnego ). (Zgadza się - Forth może manipulować sposobem odczytu kodu źródłowego. Perl nie jest jedynym językiem, którego nie można przeanalizować bez jego wykonania!) Ponieważ jest to słowo, musisz podążać za nim spacją, w przeciwnym razie Forth narzeka, że (xjest niezdefiniowany. Możemy również przedefiniować (w ramach naszej ciągłej kampanii strzelania sobie w stopę.

Treść komentarza jest jednak bardziej interesująca. Ten komentarz określa efekt stosu dla jakiegoś słowa; część po lewej stronie --list, która powinna znajdować się na górze stosu przed uruchomieniem słowa (góra znajduje się po prawej stronie), a prawa strona --opisuje, jak później będzie wyglądać góra stosu (ponownie , góra jest po prawej stronie). Powszechną konwencją jest dodawanie takiego komentarza do źródła dowolnego zdefiniowanego słowa, zaraz po : namebicie, a także istnieje bardzo silna konwencja dotycząca nazewnictwa elementów stosu, aby wskazać ich typ , po którym następuje nawet standard .

Nawiasem mówiąc, pokazany efekt stosu dotyczy nipsłowa. Powinieneś być w stanie powiedzieć, co robi po prostu z komentarza.

Długość 13

1 2 3 4 d+ d.

Jak wcześniej wskazano, typ wartości Forth zależy od tego, jak go używasz - jeśli traktujesz wartość jako wskaźnik, jest to wskaźnik, a jeśli ta wartość nie jest dobrym wskaźnikiem, to twoja wina jest traktowana jako jedna. Jednak niezależnie od tego, jakiego typu traktujesz wartość, zawsze zajmie ona jedną komórkę na stosie danych; wyjątkami są liczby całkowite podwójnej komórki lub podwójnej precyzji . Są to liczby całkowite reprezentowane przez dwie wartości na stosie, co pozwala wykonywać arytmetykę z dwukrotnie większą liczbą bitów niż zwykle. Bardziej znacząca lub wyżej-bitowa komórka jest umieszczana na górze mniej znaczącej lub mniej-bitowej 1 0komórki , więc jest to reprezentacja podwójnej komórki 1i0 1wynosi 2 ^ 32 lub 2 ^ 64, w zależności od wielkości regularnych komórek twojego Fortha. Oczywiście, aby traktować wartość podwójnej komórki jako taką, musimy użyć słów, które jawnie działają na wartościach podwójnej komórki; są to zazwyczaj tylko d(lub w udprzypadku niepodpisanych), po których następuje nazwa odpowiadającego jednokomórkowego słowa: d+do dodania, d<do porównania, d.do drukowania itp.


+1 dla Naprzód. Zaczynałem szukać języków, które nie zostały jeszcze zrobione. Cieszę się, że już to widzę.
mbomb007,

2
Ponadto, jeśli kiedykolwiek dojdziesz do +1675, mam ładny obraz ASCII do wydrukowania. : D
mbomb007,

31

Pyt

W celu uzyskania dalszych fragmentów opublikuję rozwiązania problemów golfowych i link do problemu.

Długość 17:

<ussC,cG\_GUQ*zQQ

Znajdź pierwsze nznaki nieskończonej sekwencji utworzonej przez powtarzanie ciągu wejściowego na zawsze, a następnie wypełnianie jego podkreśleniami samą sekwencją, a następnie powtarzanie tego na zawsze.

Wypełnij puste pola

Długość 14:

#QX=Qhf>FT.:Q2

Biorąc pod uwagę listę unikalnych elementów, posortuj listę, zamieniając pary sąsiednich elementów, drukując wszystkie wyniki pośrednie.

Zmiana kolejności liczb w kolejności

Długość 13:

?hu]+HG_UQYQY

Utwórz następującą strukturę: [0, [1, [2, [3]]]].

Strona główna w zakresie list

Długość 12:

uxyG*HQjvz2Z

Mnożenie XOR.

Mnożenie XOR

Długość 11:

lfqSzST.:wz

Policz, ile podciągów pierwszego słowa to anagramy drugiego słowa.

Wykrywanie anagramów w ciągu nadrzędnym

Długość 9:

fqJjQT_J2

Znajdź najniższą podstawę, w której wejściem jest palindrom.

Palindrom o najniższej podstawie

Długość 5:

!%lQ1

Sprawdź, czy na wejściu jest potęga 2. Weź bazę log 2, weź mod wynik 1, a logiczne nie.

Sprawdź, czy liczba całkowita jest potęgą 2 bez użycia operacji +, -

Długość 4:

sjQ2

Oblicza masę młota wejścia, sumując reprezentację podstawy 2 wejścia.

Policz liczbę jedynek w 16-bitowej liczbie całkowitej bez znaku

Długość 3:

^G2

^ na sekwencji, int, daje iloczyn kartezjański pierwszego argumentu z samym sobą n razy, gdzie n jest drugim argumentem.

W tym przypadku, ponieważ Gjest to alfabet ( abcdefghijklmnopqrstuvwxyz), ^G2podaje wszystkie 2 ciągi literowe, aaprzez zz.

Długość 2:

lT

l, podczas gdy normalnie służy jako len(), może być również użyty jako podstawa logu 2. Ponieważ Tzmienna jest inicjalizowana 10, drukuje 3.3219280948873626, logarytm podstawa 2 z 10.

Długość 1:

H

Hjest pustym słownikiem (tablicą skrótów) w języku Pyth i jest jedynym sposobem na uzyskanie słownika w języku Pyth, bez użycia v(eval) lub $(literału Pythona).

Faktoid:

Pyth nie ma konstrukcji wieloznakowych innych niż literały. Ponadto Pyth kompiluje w zasadzie jeden do jednego w Pythonie.


Czy Twój faktoid został dodany przed wprowadzeniem komend .?
Leaky Nun

@LeakyNun Tak ..
isaacg
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.