Schaufenster der Sprachen


507

Anmerkungen

  • Dieser Thread ist nur geöffnet und entsperrt, weil die Community beschlossen hat, eine Ausnahme zu machen . Bitte nicht diese Frage als Beweismittel verwenden , die Sie ähnliche Fragen hier fragen. Bitte erstellen Sie keine zusätzlichen Fragen.

  • Dies ist kein mehr und die Länge der Snippets ist auch nicht durch die Abstimmungsergebnisse begrenzt. Wenn Sie diesen Thread bereits kennen, machen Sie sich bitte mit den Änderungen vertraut.

Dieser Thread zeigt interessante, nützliche, undurchsichtige und / oder einzigartige Funktionen, die Ihre bevorzugten Programmiersprachen bieten. Dies ist weder eine Herausforderung noch ein Wettbewerb, sondern eine Zusammenarbeit, um möglichst viele Programmiersprachen so gut wie möglich zu präsentieren.

Wie das geht

  • Alle Antworten sollten den Namen der Programmiersprache am Anfang des Beitrags enthalten, mit dem Präfix a #.

  • Antworten können einen (und nur einen) Faktoid enthalten, dh ein paar Sätze ohne Code, die die Sprache beschreiben.

  • Abgesehen vom Faktoid sollten Antworten aus Codeausschnitten bestehen, die Programme oder Funktionen sein können (aber nicht müssen).

  • Die Schnipsel müssen nicht verwandt sein. Tatsächlich können zu verwandte Snippets redundant sein.

  • Da dies kein Wettbewerb ist, sind alle Programmiersprachen willkommen, wann immer sie erstellt wurden.

  • Antworten, die mehr als eine Handvoll Code-Snippets enthalten, sollten ein Stapel-Snippet verwenden, um alles außer dem Faktoid und einem der Snippets zu minimieren.

  • Wann immer möglich, sollte es nur eine Antwort pro Programmiersprache geben. Dies ist ein Community-Wiki. Sie können also jeder Antwort Ausschnitte hinzufügen, auch wenn Sie sie nicht selbst erstellt haben. Es gibt ein Stapel-Snippet zum Komprimieren von Posts , das den Effekt der Beschränkung auf 30.000 Zeichen abmildern soll.

Antworten vor diesen Richtlinien sollten bearbeitet werden. Bitte helfen Sie, diese bei Bedarf zu aktualisieren.

Aktuelle Antworten, alphabetisch sortiert nach Sprachennamen

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

Antworten:


414

Mathematica

Vielleicht möchten Sie dies von unten nach oben lesen, da dies die Reihenfolge ist, in der es geschrieben wurde. Einige Erklärungen beziehen sich auf frühere Ausschnitte oder nehmen Erklärungen von weiter unten an.

Die Liste wächst ziemlich lang. Ich habe begonnen, weniger interessante Schnipsel zu entfernen, und ich werde jetzt anfangen, Schnipsel zu überspringen. Im Revisionsverlauf finden Sie eine vollständige Liste der Snippets bis 41. Für einige echte Edelsteine ​​lesen Sie die Snippets 81 , 64 , 44 , 23 , 19 , 12 und 8 .

Länge 143 und 144 Schnipsel

Endlich ... Ich habe eine Weile darauf gewartet (und ungefähr so ​​lange Golf gespielt, damit ich nicht noch länger warten muss). Ich habe bereits erwähnt, dass Sie auch numerische Gleichungen und Differentialgleichungen lösen können. Ich wollte ein nicht triviales Beispiel dafür zeigen.

Stellen Sie sich ein doppeltes Pendel an einem Stab vor (dh ein Pendel, das an einem anderen befestigt ist). Jede Stange hat eine Längeneinheit und jedes der beiden Pendelgewichte hat eine Masseneinheit. Ich habe auch die Einheitsgravitation verwendet, um die Gleichung zu verkürzen. Das folgende 143-stellige Snippet löst die Lagrange-Bewegungsgleichungen für ein solches System (in Bezug auf die Pendelwinkel und Drehimpulse). Eine Ableitung finden Sie in diesem PDF , obwohl es eine ziemlich einfache Übung ist, wenn Sie mit der Lagrange-Mechanik vertraut sind.

Es ist ziemlich unlesbar, weil ich viel Golf spielen musste:

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

Das Schöne daran ist, dass Mathematica sofort eine Miniaturdarstellung der Lösungen anzeigt, die ungefähr so ​​aussehen:

Bildbeschreibung hier eingeben

Okay, aber das ist ein bisschen lahm. Wir wollen wissen, wie die Bewegung der Pendel tatsächlich aussieht. Hier ist also ein 144-stelliges Snippet, das die Pendel animiert, während es die Flugbahn des unteren Pendels nachzeichnet:

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}

Die resultierende Animation sieht folgendermaßen aus:

Bildbeschreibung hier eingeben

Ich musste etwas schummeln: Wenn Sie darüber hinaus plotten t = 30, verwendet der ParametricPlotstandardmäßig zu wenige Plotpunkte und die Linie wird ziemlich gezackt. Die meisten interessanten Dynamiken treten jedoch nach dieser Zeit auf. Daher habe ich die Option verwendet PlotPoints -> 200, um die zweite Hälfte der Animation weicher darzustellen. Es ist nichts wesentlich anderes, und die erste Hälfte würde sowieso nicht zu unterscheiden sein.

Ich denke, dies wird mein letzter Ausschnitt sein, es sei denn, mir fällt etwas wirklich Verblüffendes ein. Hoffe es hat euch gefallen!

Länge 100 Schnipsel

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

Ich habe über einige nette GeoFunktionen für das 100-Snippet nachgedacht , aber letztendlich habe ich bei Tweet-a-Program etwas wirklich Raffiniertes gefunden , das ich einfach stehlen musste. Das Obige erzeugt eine sehr schön aussehende Sonnenkarte der Erde für die aktuelle Zeit und den aktuellen Tag, indem eine halbopake Form der Nachthemisphäre über eine Reliefkarte gelegt wird:

Bildbeschreibung hier eingeben

Länge 81 Schnipsel

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

Ich verspreche, das ist der letzte zellulare Automat. Aber genau das ist Wireworld in 81 Zeichen. Diesmal habe ich die Regel nicht in einer einzigen Zahl kodiert, a) weil ich denke, dass sie lächerlich groß sein würde (ich habe mir nicht die Mühe gemacht, es herauszufinden) und b) um Ihnen noch eine andere Verwendung von zu zeigen CellularAutomaton. Dieses Mal wird die Regel einfach als reine Funktion angegeben, die eine Zellenumgebung empfängt und den neuen Wert der Zelle zurückgibt. Dies ist ein viel praktikablerer Ansatz für zellulare Automaten mit mehr als 2 Farben / Zuständen.

Wie auch immer, ich habe das Beispiel von Wikipedia in i(zwei Takte, die Signale erzeugen, und ein XOR-Gatter) eingerichtet und es für ungefähr 50 Schritte laufen lassen:

Bildbeschreibung hier eingeben

Wenn Sie interessiert sind, könnte das eigentliche Plotten und Animieren Snippet 77 gewesen sein:

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

Länge 69 Schnipsel

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

Zurück zu etwas Nützlichem. Neben normalen Gleichungssystemen kann Mathematica auch Differentialgleichungssysteme lösen. Das Obige ist technisch nur eine Differentialgleichung mit Randbedingungen, aber Sie können das auch als ein System von drei Gleichungen liefern. Ähnlich wie bei den Integrationsfunktionen DSolvewird für exakte Lösungen NDSolvedas System numerisch gelöst. Das Obige ergibt eine einzelne Lösung

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

die jetzt leicht für weitere Berechnungen verwendet oder geplottet werden können.

Länge 64 Schnipsel

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

Ich habe dir mehr CellularAutomatonMagie versprochen ! Dieses Snippet berechnet Conways 'Game of Life mit der Anfangsbedingung ifür nSchritte und gibt Ihnen das Ergebnis für alle Zwischenzeitschritte.

Ein paar Worte zu den Parametern: 2ist die Anzahl der Zellzustände. {{2,2,2},{2,1,2},{2,2,2}}gibt die Gewichte für die 9 Zellen in der 3x3 Nachbarschaft an. Sie stellt sicher, dass die Zelle selbst von der Summe der 8 Nachbarn unterscheidbar ist. {1,1}sagt, dass die CA-Regel davon abhängt, dass die Zellen 1 Schritt in eine der beiden Richtungen entfernt sind. Schließlich 224ist die eigentliche Aktualisierungsregel in einer einzigen Zahl kodiert. Es kann etwas schwierig sein, diese Zahl herauszufinden, aber die Dokumentation enthält ein ziemlich nützliches Tutorial . Bei komplizierteren Automaten reicht eine einzelne Zahl nicht aus (da die Zahl sehr groß wäre). Vielleicht schaffen wir es morgen! ;)

Wie auch immer, wenn ich ein zufälliges Gitter in iund 200 in nein füge und das Ergebnis durch ein animiertes sende ArrayPlot, können wir sehen, dass es tatsächlich funktioniert:

Bildbeschreibung hier eingeben

Länge 59 Schnipsel

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

Erinnern Sie sich an die Polarkurve aus Ausschnitt 26? Wir können dasselbe in 3D machen! (Tatsächlich gibt es zwei Funktionen: RevolutionPlot3Dfür zylindrische Polare und SphericalPlot3Dfür sphärische Polare.) So wie Graphics3Dalle dreidimensionalen Diagramme in Mathematica automatisch drehbar sind, müssen Sie sich vorab keine Gedanken über einen guten Kamerawinkel machen. Die obigen Darstellungen ähneln einer sphärischen Harmonischen (allerdings nicht ganz) und sehen so aus:

Bildbeschreibung hier eingeben

Länge 52 Schnipsel

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

Dieser ist ziemlich geschickt. ManipulateNimmt einen beliebigen Ausdruck, parametrisiert ihn mit einer Reihe von Variablen und gibt Ihnen dann ein Widget, in dem Sie die Parameter optimieren und live sehen können, wie sich der Ausdruck ändert. Als Ausdruck haben Sie normalerweise eine Art Handlung. Dies ist besonders nützlich, wenn Sie Mathematica in Vorlesungen verwenden, um zu demonstrieren, wie Lösungsfamilien auf das Ändern der Parameter reagieren. Das Obige zeigt, wie die aund bKoeffizienten eine Parabel skalieren und verschieben:

Bildbeschreibung hier eingeben

Länge 48 Schnipsel

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

Importist ein ziemlich mächtiger Befehl. Es wird sowohl zum Laden von Dateien vom Datenträger als auch aus dem Internet verwendet. Es kennt ziemlich viele verschiedene Dateiformate und für einige von ihnen (wie HTML-Seiten) kann es tatsächlich Daten sofort extrahieren. Das obige Beispiel lädt alle Bilder von der Doodle-Seite von Google herunter.

Länge 45 Schnipsel

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

Zeit für einige Bildbearbeitung. Mathematica enthält eine ganze Reihe von Beispieldaten, darunter Bilder (wie Lena), Texturen, 3D-Modelle und Audio-Schnipsel. Zuerst laden wir eines davon:

Bildbeschreibung hier eingeben

Möchten Sie Kanten erkennen? Es ist ein einzelner Funktionsaufruf:

Bildbeschreibung hier eingeben

Länge 44 Schnipsel

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

Endlich habe ich genug Zeichen, CellularAutomatonum das Ergebnis zu rendern. :) Soweit ich weiß, CellularAutomatonist dies die einzige Funktion in Mathematica, die sich auf CAs bezieht. Aber Stephen Wolfram scheint sich selbst als Nummer eins zu bezeichnen, wenn es um zellulare Automaten geht, daher ist diese Funktion unglaublich leistungsstark. Das Obige zeigt so ziemlich die einfachste Verwendung. Dies simuliert einen 1D-Zellularautomaten für 100 Schritte - und gibt tatsächlich den Zustand des Automaten bei jedem dieser Schritte zurück, sodass das Ergebnis zweidimensional ist. Die Regel ist der erste Parameter, der entweder detailliert über Listen angegeben oder einfach in einer einzelnen Zahl kodiert werden kann. Für dieses Beispiel habe ich die ziemlich berühmte Regel 110 " Turing complete" gewählt . {{1},0}definiert die Ausgangsbedingung: eine einzelne1vor einem Hintergrund von Nullen. Vielleicht zeige ich CellularAutomatonin Zukunft einige weitere Funktionen, wenn ich mehr Zeichen zur Verfügung habe: Es kann Zertifizierungsstellen in höheren Dimensionen simulieren, wobei größere Nachbarschaften und mehr als zwei Zustände verwendet werden.

ArrayPlotist ein weiteres nützliches Dienstprogramm zum Zeichnen, das nur eine 2D-Liste als ein Raster aus Volltonfarben darstellt, die ihren Wert angeben. Im einfachsten Fall 0wird auf weiß und 1auf schwarz abgebildet . Das Ergebnis des Snippets ist:

Bildbeschreibung hier eingeben

Länge 43 Schnipsel

HighlightGraph[graph,FindVertexCover@graph]

Es ist schon eine Weile her, dass ich Graphen erwähnt habe. In Mathematica sind viele häufig auftretende graphentheoretische Probleme eingebaut, zusammen mit netten Visualisierungswerkzeugen. Das Obige findet für eine gegebene graphSituation eine minimale Scheitelpunktabdeckung des Diagramms und rendert dann das Diagramm mit diesen Scheitelpunkten, die hervorgehoben sind. Wenn zB graphist PetersenGraph[7,2]zurück aus Schnipsel 18, erhalten wir:

Bildbeschreibung hier eingeben

Länge 42 Schnipsel

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

In Mathematica ist es ziemlich einfach, Dinge zu animieren (und sie müssen nicht einmal Bilder sein). Sie geben lediglich den Ausdruck an, der für jeden Frame ausgewertet werden soll, und eine Reihe von Parametern, die über die Frames variieren sollen. Das Obige animiert einfach eine Handlung einer sich bewegenden Sinuswelle. Die Animation sieht ungefähr so ​​aus wie das folgende GIF:

Bildbeschreibung hier eingeben

Länge 40 Schnipsel

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

SortBytut, was Sie erwarten: Es sortiert eine Liste basierend auf Werten, die durch Zuordnen einer bestimmten Funktion zu jedem Listenelement erhalten werden. Aber warte, der obige Aufruf enthält überhaupt keine Liste. Seit Mathematica 10 gibt es für einige Funktionen Unterstützung für Currying oder Teilanwendung . Dies ist kein Sprachfeature wie in den puristischeren funktionalen Sprachen, sondern wird nur manuell für eine ganze Reihe von Funktionen implementiert, wo dies oft nützlich ist. Dies bedeutet, dass das obige Snippet eine neue Funktion zurückgibt, die nur eine Liste annimmt und dann nach der angegebenen Funktion sortiert. Dies kann sehr nützlich sein, wenn Sie diese Sortierreihenfolge im gesamten Code häufiger verwenden.

Und ja, es gibt noch eine weitere nette *DataFunktion - die obige Funktion sortiert die Planetennamen nach den Fluchtgeschwindigkeiten der Planeten .

Länge 39 Schnipsel

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

Ich habe versprochen, die Fibonacci-Funktion effizienter zu machen. Dieser Ausschnitt zeigt, wie trivial das Auswendiglernen in Mathematica ist. Beachten Sie, dass alles, was geändert wird, ein Zusatz f[n]=in der dritten Zeile ist. Also, wenn ffür einen neuen Wert aufgerufen wird (sagen wir f[3]), dann f[3]=f[3-1]+f[3-2]wird ausgewertet. Dieser berechnet f[2]+f[1], ordnet es dann zu f[3](mit =, nicht mit :=!) Und gibt schließlich den Wert für unseren ersten Aufruf zurück. Der Aufruf dieser Funktion fügt also eine neue Definition für diesen Wert hinzu, die offensichtlich spezifischer ist als die allgemeine Regel - und daher für alle zukünftigen Aufrufe fmit diesem Wert verwendet wird.

Denken Sie daran, dass die andere Fibonacci-Funktion für 30 Werte 4 Sekunden dauerte? Dies dauert 3 Sekunden für 300.000 Werte.

Länge 37 Schnipsel

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

Im letzten Ausschnitt habe ich Muster erwähnt. Diese werden am häufigsten in Regeln verwendet , mit denen (unter anderem) Strukturen geändert werden können, die einem bestimmten Muster entsprechen. Schauen wir uns also diesen Ausschnitt an.

{a___,x_,b___,x_,c___}:>{a,x,b,c}ist eine Regel. x_Bei einem einzelnen Unterstrich handelt es sich um ein Muster, das sich auf einen einzelnen beliebigen Wert bezieht (der selbst eine Liste oder Ähnliches sein kann). a___ist ein Sequenzmuster (siehe auch Snippet 15), das sich auf eine Sequenz von 0 oder mehr Werten bezieht. Beachten Sie, dass ich x_zweimal verwende, was bedeutet, dass diese beiden Teile der Liste den gleichen Wert haben müssen. Dieses Muster stimmt also mit jeder Liste überein, die einen Wert zweimal enthält, ruft dieses Element auf xund ruft die drei Sequenzen um diese beiden Elemente auf a, bund c. Dies wird ersetzt durch {a,x,b,c}- das heißt, die Sekunde xwird fallengelassen.

Wendet //.nun eine Regel an, bis das Muster nicht mehr übereinstimmt. Das obige Snippet entfernt also alle Duplikate aus einer Liste l. Es ist jedoch ein bisschen mächtiger als das: //.Wendet die Regel auf alle Ebenen an. Wenn lsich also Listen (bis zu einer beliebigen Tiefe) befinden, werden auch Duplikate aus diesen Unterlisten entfernt.

Länge 36 Schnipsel

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

Zeit für neue Sprachfunktionen! Mathematica hat ein paar nette Dinge über das Definieren von Funktionen. Zunächst können Sie mehrere Funktionsdefinitionen für denselben Namen, für verschiedene Anzahlen oder Arten von Argumenten angeben. Mithilfe von Mustern können Sie beschreiben, für welche Arten von Argumenten eine Definition gilt. Darüber hinaus können Sie Definitionen für einzelne Werte hinzufügen. Mathematica wählt dann die spezifischste zutreffende Definition für jeden Funktionsaufruf aus und lässt nicht definierte Aufrufe unbewertet. Dies ermöglicht (unter anderem) das Schreiben rekursiver Funktionen auf viel natürlichere Weise als die Verwendung eines IfSchalters für den Basisfall.

Eine andere Sache, die Sie über das obige Snippet bemerken sollten, ist, dass ich sowohl =als auch verwende :=. Der Unterschied besteht darin, dass die rechte Seite von =zum Zeitpunkt der Definition nur einmal ausgewertet wird, wohingegen sie :=jedes Mal neu ausgewertet wird, wenn auf die linke Seite verwiesen wird. In der Tat :=funktioniert auch bei der Zuweisung von Variablen, die dann einen dynamischen Wert haben.

Das Obige ist natürlich nur eine Fibonacci-Funktion. Und eine sehr ineffiziente. Das Berechnen der ersten 30 Zahlen dauert auf meinem Computer ungefähr 4 Sekunden. Wir werden in Kürze sehen, wie wir die Leistung verbessern können, ohne die rekursive Definition überhaupt entfernen zu müssen.

Länge 35 Schnipsel

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

Ein sehr ordentliches Diagramm, das die Stromlinien eines 2D-Vektorfeldes ausgibt. Dies ähnelt einem normalen Vektordiagramm, da jeder Pfeil das Vektorfeld tangiert. Die Pfeile befinden sich jedoch nicht in einem festen Raster, sondern sind zu Linien (den Stromlinien) verbunden. Die Bedeutung dieser Linien besteht darin, dass sie die Flugbahn eines Teilchens (beispielsweise in einer Flüssigkeit) angeben, wenn das Vektorfeld ein Geschwindigkeitsfeld war. Die obige Eingabe sieht folgendermaßen aus:

Bildbeschreibung hier eingeben

Länge 34 Schnipsel

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

Mathematica kann auch Gleichungen lösen (oder Gleichungssysteme, aber wir haben momentan nur so viele Zeichen). Das Ergebnis wird wie üblich symbolisch sein.

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

Beachten Sie, dass die Lösungen als Regeln angegeben werden , auf die ich in einem zukünftigen Ausschnitt wahrscheinlich näher eingehen werde.

Länge 33 Schnipsel

Dynamic@EdgeDetect@CurrentImage[]

Vielen Dank an benwaffle für diese Idee. CurrentImage[]Lädt das aktuelle Bild Ihrer Webcam. EdgeDetectverwandelt ein Bild in ein Schwarzweißbild, bei dem die Ränder weiß und der Rest schwarz sind (ein Beispiel finden Sie in Ausschnitt 45). Der wahre Spaß, mit Dynamicdem sich der Ausdruck selbst aktualisieren lässt. Das Ergebnis davon wird also Bilder von Ihrer Webcam streamen und auf ihnen eine Live-Kantenerkennung durchführen.

Länge 32 Schnipsel

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

Eine eher ungewöhnliche Handlung. Es kann eine Reihe verschiedener Dinge entlang der Zahlengeraden zeichnen, wie Punkte und Intervalle. Sie können ihm auch eine Bedingung geben und es zeigt Ihnen die Region, in der diese Bedingung zutrifft:

Bildbeschreibung hier eingeben

Der Pfeil zeigt an, dass die Region weiterhin unendlich ist. Die weißen Kreise zeigen an, dass dies offene Intervalle sind (die Endpunkte sind nicht Teil des Intervalls). Für geschlossene Enden würden die Kreise gefüllt.

Länge 28 Schnipsel

Graphics3D@{Sphere[],Cone[]}

Zeit für einige 3D-Grafiken. Oben wird eine überlagerte Kugel und ein überlagerter Kegel mit Standardparametern gerendert, die wie eine Kristallkugel aussehen:

Bildbeschreibung hier eingeben

In Mathematica können Sie auf dieses kleine Widget klicken und es ziehen, um es zu drehen.

Länge 27 Schnipsel

CountryData["ITA", "Shape"]

Mehr *Data! CountryDataist ziemlich verrückt. Die Form eines Landes zu bekommen, ist nicht einmal die Spitze des Eisbergs. Es gibt so viele Daten über Länder, dass Sie wahrscheinlich ein ganzes Buch über diese Funktion schreiben könnten. Wie ... gibt es FemaleLiteracyFraction. Sie können diese Daten auch für verschiedene Zeitpunkte abfragen. Eine vollständige Liste finden Sie in der Referenz.

Bildbeschreibung hier eingeben

Länge 26 Schnipsel

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

Zeit für eine interessantere Handlung. PolarPlotist einfach eine Darstellung in Polarkoordinaten. Anstatt y für ein gegebenes x anzugeben, geben Sie einen Radius r für einen gegebenen Winkel θ an:

Bildbeschreibung hier eingeben

Länge 25 Schnipsel

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

Wir haben endlich genug Zeichen für einige Vektor-Mathematik. Das Obige berechnet die Matrixmultiplikation einer 2x3-Matrix und eines Zeilen-2-Vektors:

{53, 43, 92}

Länge 23 Schnipsel

Rotate[Rectangle, Pi/2]

Heh. Hehe Sie glauben zu wissen, was das bedeutet. Aber du nicht. Rectanglean sich ist nur eine benannte Funktion. Um ein Objekt zu erhalten, das ein Rechteck darstellt, müssen Sie diese Funktion mit einigen Parametern aufrufen. Also, was denkst du passiert, wenn du versuchst zu drehen Rectangle? Diese:

Bildbeschreibung hier eingeben

Länge 22 Schnipsel

30~ElementData~"Color"

Eine weitere der eingebauten *DataFunktionen. Ja, für chemische Elemente erhält man nicht nur die Ordnungszahl, den Schmelzpunkt und den Namen ... man kann die Farbe tatsächlich bei Raumtemperatur erhalten. Das Obige ergibt die Farbe von Zink:

SlateGray

Länge 21 Schnipsel

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

Wir hatten vor einiger Zeit Differenzierung. Zeit für die Integration. Mathematica kann sowohl bestimmte als auch unbestimmte Integrale verarbeiten. Insbesondere erhalten IntegrateSie eine genaue Lösung, und es kann mit einer Tonne von Standardintegralen und Integrationstechniken umgehen (für numerische Ergebnisse gibt es NIntegrate). Wenn Sie Ihren Kalkül kennen, werden Sie bemerkt haben, dass das obige Gaußsche Integral keine geschlossene Form undefiniertes Integral hat ... es sei denn, Sie betrachten die Fehlerfunktion geschlossene Form, das heißt. Mathematica gibt zurück:

1/2 Sqrt[π] Erf[x]

Länge 20 Schnipsel

"Sun"~StarData~"Age"

Zurück zu den eingebauten Daten . Es müssen mindestens zwei Dutzend *DataFunktionen für alles vorhanden sein, was Sie sich vorstellen können. Jeder von ihnen benötigt eine Kennung für das Objekt, für das Sie die Daten benötigen, und eine Eigenschaft (oder eine Liste von Eigenschaften), die abgerufen werden soll. Das Obige ist nur eines der kürzesten, mit denen Sie fertig werden können Sun, Starund Agealles ist ziemlich kurz, da ich es kaum erwarten konnte, dieses Feature zu zeigen.

Oh ja, und habe ich erwähnt, dass Mathematica (seit 9) Mengen mit Einheiten unterstützt? (Mehr dazu später.) Das oben Gesagte ergibt:

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

welches angezeigt wird als

Bildbeschreibung hier eingeben

Länge 19 Schnipsel

MandelbrotSetPlot[]

Ja ... sehr nützliche Funktion ... ich benutze sie die ganze Zeit. (Manchmal geht ihr Wunsch, alles zu unterstützen, was möglicherweise berechenbar ist, ein bisschen weit ...)

Mathematica-Grafiken

Zu ihrer Verteidigung ist die Funktion etwas nützlicher: Sie können ihr einen bestimmten Abschnitt des Diagramms geben, den Sie zeichnen möchten.

Länge 18 Schnipsel

PetersenGraph[7,2]

Seit Mathematica 8 versteht es, was Graphen sind, und enthält daher alle möglichen Funktionen im Zusammenhang mit der Graphentheorie. Und es war nicht Mathematica, wenn es nicht eine Menge eingebauter Funktionen enthalten würde. Das Obige erzeugt die Diagrammdaten für ein verallgemeinertes Petersen-Diagramm . Es erzeugt die tatsächliche Datenstruktur, die manipuliert werden kann, aber Mathematica zeigt diese Grafikdaten sofort an ... grafisch:

Mathematica-Grafiken

Länge 17 Schnipsel

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

Endlich genug Zeichen, um ein wenig zu zeichnen. Das Obige ist wirklich nur das einfachste Beispiel für eine eindimensionale Darstellung. Ich verspreche, später kühlere Pläne vorzuführen

Mathematica-Grafiken

Länge 15 Schnipsel

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

Dies zeigt zwei der leistungsstärkeren Funktionen (und auch nützliche Funktionen zum Golfen). Das Ganze ist eine unbenannte reine Funktion , vergleichbar mit lambdas in Python oder Procs in Ruby. Reine Funktionen werden einfach durch a beendet &. Dieser Operator hat eine sehr niedrige Priorität, sodass er normalerweise fast alles enthält, was davon übrig ist. Auf die Argumente einer reinen Funktion wird verwiesen #, manchmal gefolgt von anderen Dingen. Das erste Argument ist #oder #1, das zweite ist #2und so weiter.

Das andere Merkmal ist Sequences. Diese sind im Grunde wie Splats in anderen Sprachen. Eine Sequenz ist wie eine Liste ohne die umgebende Liste - es handelt sich buchstäblich nur um eine Folge von Werten, die in Listen, Funktionsargumenten usw. verwendet werden kann. ##Insbesondere handelt es sich um eine Folge aller reinen Funktionsargumente. ##2ist eine Folge aller Argumente ab der Sekunde. Wenn wir also die obige Funktion benennen fund sie so nennen

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

Wir würden bekommen

{4,5,1,2,3}

so dreht die funktion die eingabeargumente 3 elemente nach links. Beachten Sie, dass ##4auf 4,5die verwiesen wurde, die in der Liste abgeflacht wurden.

Länge 12 Schnipsel

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

Teilweise Differenzierung. Ddifferenziert den ersten Ausdruck sukzessive in Bezug auf seine anderen Argumente und gibt Ihnen als Ergebnis einen symbolischen Ausdruck. So ist die oben d² (x ^ y ^ x) / dxdy (wo die d s Teil sind), die berichtet werden Mathematica

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

Länge 9 Schnipsel

Exp[I*Pi]

Wir haben noch keine komplexe Arithmetik durchgeführt! Wie man sieht, πwar das eigentlich nur ein Pseudonym für Pi. Wie auch immer, das obige Ergebnis gibt die ganze Zahl tatsächlich korrekt zurück -1.

Länge 8 Schnipsel

Sunset[]

Ja. Sprechen Sie über verrückte Einbauten. Ohne Parameter, die Ihnen tatsächlich ein Datum / Uhrzeit-Objekt für den nächsten Sonnenuntergang an Ihrem aktuellen Standort liefern. Es werden auch Parameter für andere Daten, andere Orte usw. verwendet. So sieht es momentan für mich aus:

Bildbeschreibung hier eingeben

Länge 7 Schnipsel

9!/43!!

Dieser Ausschnitt zeigt ein paar coole Dinge.

Mathematica hat nicht nur einen eingebauten Fakultätsoperator !, sondern auch eine doppelte Fakultät !!(die jede zweite Zahl von nunten bis multipliziert 1). Darüber hinaus werden Ganzzahlen mit beliebiger Genauigkeit unterstützt. Die 43!!wird genau bis zur letzten Ziffer ausgewertet. Darüber hinaus werden auch rationale Zahlen exakt ausgewertet. Da also sowohl der Zähler als auch der Nenner Ganzzahlen sind, wird Mathematica die Brüche so weit wie möglich reduzieren und Ihnen dann präsentieren

128/198893132162463319205625

Natürlich können Sie floats verwenden, wann immer Sie möchten, aber im Allgemeinen ist Ihr Ergebnis genau, wenn Ihre Eingabe keine floats enthält.

Länge 4 Schnipsel

Here

Es ist an der Zeit, dass wir mit Mathematicas Fülle verrückter Einbauten anfangen. Das obige macht was es verspricht und wertet (für mich) aus GeoPosition[{51.51, -0.09}].

Länge 3 Schnipsel

x-x

Nur um das ursprüngliche Faktoid zu präsentieren : Das Obige funktioniert auch dann, wenn xes noch nicht definiert ist und 0in diesem Fall tatsächlich resultiert .

Länge 2 Schnipsel

3x

Multiplikation durch Nebeneinander! Wenn klar ist, dass ein Bezeichner endet und ein anderer beginnt, brauchen Sie kein *Leerzeichen, um sie miteinander zu multiplizieren. Dies funktioniert mit so ziemlich allem, einschließlich Zeichenfolgen und Variablen, die noch keine Werte haben. Sehr praktisch zum Golfen. ;)

Länge 1 Snippet

π

Ratet mal, es ist Pi. Tatsächlich handelt es sich nicht um eine ungefähre Gleitkommadarstellung, sondern um Pi genau. Alle Arten von komplexen und trigonometrischen Funktionen, in denen dies verwendet wird, liefern exakte Ergebnisse, wenn sie bekannt sind.

Factoid

Mathematica kann symbolische Manipulationen ausführen, sodass Variablen keine Werte benötigen, um damit zu arbeiten.


19
Snippet 23 ist ziemlich neugierig. Wenn Sie das getan Translate[Scale[Rectangle, 80], {0, 0, 100}]hätten, würde das große Wort Rectanglevor Ihrem Monitor schweben?
Calvins Hobbys

53
@ Calvin'sHobbies Habe es gerade ausprobiert ... einen unglücklichen zVersatz ausgesucht ... mir mitten ins Gesicht geschlagen.
Martin Ender

45
Die offizielle Mathematica-Website sollte unbedingt darauf verweisen.
Caridorc

7
@ durron597 Indem Sie es als Symbol beibehalten und all Ihren trigonometrischen und komplexen Funktionen bewusst machen, was mit einem π zu tun ist.
Martin Ender

16
Als ich sah, dass der legendäre Martin Büttner eine Mathematica-Antwort gepostet hatte, wusste ich, dass ich keine Chance hatte, einen Beliebtheitswettbewerb zu gewinnen. Sie, mein Herr, sind ein wahrer Zauberer.
Alex A.

187

Die berüchtigte Shakespeare-Programmiersprache

Die Shakespeare-Programmiersprache wurde 2001 von den beiden schwedischen Studenten Karl Hasselström und Jon Åslund entwickelt und kombiniert, wie die Autoren behaupten ,

die Ausdruckskraft von BASIC mit der Benutzerfreundlichkeit der Assemblersprache.

Die Antworten gehen von oben nach unten. Es ist auch üblich, dass ich auf ältere oder frühere Snippets verweise.

( Link für mich selbst: bearbeiten )

Factoid:

Shakespeares Code ähnelt erwartungsgemäß einem Shakespeare-Spiel, bei dem die Variablen Zeichen im Spiel sind und sich ihr Wert ändert, wenn sie "beleidigt" oder "gelobt" werden.

Länge 1 Snippet:

I

Shakespeares Code ist in Acts unterteilt, und die Acts sind selbst in Scenes unterteilt, um die Kausalitäten zu "überspringen". Wenn Sie einen Act als definieren, Act Ibedeutet dies, dass er der erste Teil des Codes ist, der beispielsweise ausgeführt wird - aber nicht nur.

Länge 2 Snippet:

as

Wird in einem Vergleich zwischen zwei "Zeichen" verwendet.

Länge 3 Snippet:

day

Inzwischen haben Sie möglicherweise das Gefühl, dass die SPL sehr ausführlich ist. Und komisch. Und du hast noch nichts gesehen. dayin der SPL ist 1. Alle "positiven" und "neutralen" Substantive werden als betrachtet 1, ebenso wie alle "negativen" Substantive -1.

Länge 4 Schnipsel:

rich

Was ist rich? Ein Adjektiv. In der SPL multiplizieren Adjektive den Wert des Substantivs, an das sie gebunden sind, mit zwei. Siehe Implementierung in Snippet 14.

Länge 5 Schnipsel:

Act I

Implementierung des ersten Snippets. Allen Akten kann ein Titel zugewiesen werden, zum Beispiel Act I: Hamlet must die!, da alle nach der römischen Ziffer stehenden Elemente vom Parser ignoriert werden.

Länge 6 Schnipsel:

better

Jede Sprache hat Bedingungen und SPL ist keine Ausnahme. Da dies jedoch eine Sprache mit einer langen Syntax ist (und habe ich sie als verrückt bezeichnet?), Werden ihre bedingten Anweisungen lang sein. Ophelia nach Juliet fragen zu lassen Am I better than you?ist wie if (Ophelia > Juliet)in den meisten "normalen" Sprachen. Und natürlich können Sie auch anders herum fragen: Am I not better than you?ist das Äquivalent von if (Ophelia < Juliet). Und Sie können bereits erraten, wie das =in SPL übersetzt wird: as good as- Verwendung von Code-Snippet 2.

Es good/betterist jedoch nicht die einzige Möglichkeit, Vergleiche in dieser shakesperianischen Sprache anzustellen. Sie können jedes Adjektiv verwenden. Das gleiche Prinzip von Snippet 3 gilt auch hier, wobei "positive" Adjektive den Wert haben >, während "negative" bedeuten <.

Länge 7 Snippet:

Juliet:

Dies ist der Aufruf einer Variablen; danach seine / ihre Anweisungen / Erklärungen / was auch immer folgen wird.

Eine Einschränkung von SPL ist, dass es nur eine begrenzte Anzahl von Variablen gibt: Romeo, Julia, Hamlet, Ophelia, MacBeth und so weiter sind einige Beispiele für "Zeichen", die in einem Shakesperian-Programm vorkommen.

Länge 8 Schnipsel:

[Exeunt]

[Exeunt]wird platziert, wenn alle "Charaktere" die "Bühne" verlassen. Hoffentlich kann ich später etwas mehr über die Interaktion zwischen Charakteren erzählen. Im Allgemeinen ist dies die letzte Anweisung eines SPL-Programms, obwohl dies [Exeunt]nicht speziell das Terminal-Zeichen der Sprache ist. Ein anderes Beispiel finden Sie in Ausschnitt 27.

Länge 9 Snippet:

as bad as

Neun Zeichen, um nur ein =Snippet 2 darzustellen . Habe ich schon erwähnt, dass SPL seltsam ist? Beispiele finden Sie in Snippet 30. (und ja, es gibt mehr als eine Möglichkeit, es auszugeben)

Länge 10 Schnipsel:

difference

Eine ausgefallene Art der Darstellung -, eine Subtraktion. Sie können mit SPL mathematische Operationen durchführen, obwohl Sie wahrscheinlich einen ganzen Tag benötigen, um es richtig zu machen.

Factoid (da ich es irgendwie geschafft habe, zehn Codefragmente zu erreichen, machen wir eine kleine Pause und haben ein weiteres Factoid über SPL)

Wenn Sie Ihren Shakesperian-Code in seiner ganzen Pracht ausführen möchten, gibt es diese Site - ich teste sie immer noch, da ich sie erst vor fünf Minuten entdeckt habe. Es gibt auch eine Möglichkeit, es mit einem Übersetzer in C zu übersetzen .

Eine andere Site zum Ausführen von SPL-Code ist diese , bei der der SPL-Code intern in eine andere esoterische Sprache übersetzt wird: Oracle PL / SQL.

Länge 11 Schnipsel:

[Exit Romeo]

Ja! Endlich kann ich über die Interaktion zwischen Charakteren sprechen! Um seinen Wert zu ändern oder mit anderen zu interagieren, muss ein "Charakter" auf der Bühne stehen und mit ihm eintreten [Enter Romeo]. Wenn ein Zeichen an adressiert ist, aber nicht vorhanden ist, liegt ein Laufzeitfehler vor und das Programm stoppt. Denn in der SPL wird der Wert der Variablen durch die Anzahl der Namen festgelegt, die von den anderen Charakteren auf der Bühne gelobt oder beleidigt werden. Ich denke, ich sollte ein Beispiel geben, um die Verwirrung zu beseitigen, die meine lahme Erklärung hervorruft, aber vielleicht ist es am besten, ein paar Schnipsel aufzuschieben.

Länge 12 Schnipsel:

Remember me.

SPL ist ziemlich "einfach", in Ordnung - aber es hat Stapel! Wenn Romeo Julia sagt, sie solle sich "an ihn erinnern", sagt er seiner geliebten Person, sie solle den Wert der Romeo auf ihren Stapel schieben. Das Knacken des Werts erfolgt mit Recall your happy childhood!oder Recall your love for meoder im Grunde mit jedem Satz, der mit beginnt Recall- der Rest ist nur künstlerischer Trieb, wie in Snippet 22.

Länge 13 Schnipsel

Let us return

Die shakesperianische Art, a goto. Und hier kommen die Acts and Scenes zum Einsatz. Wenn Romeo Juliet sagt we shall return to Act II(ja, es gibt mehrere Möglichkeiten, es zu schreiben), springt das Programm zu diesem bestimmten Teil des Codes. Es wird auch zusammen mit bedingten Anweisungen angezeigt.

Länge 14 Schnipsel

my little pony

Ja, es war eine Serie in den 80ern. Hier ist es 2*1. Warum? Denn a ponyist ein (etwas) positives Substantiv und littleein Adjektiv. Wenn wir uns also an die Schnipsel 3 und 4 erinnern, haben wir little = "2 *"und pony = "1".

Länge 15 Schnipsel

Speak thy mind!

In einem SPL - Programm, sehen Sie diese (oder Speak your mind!, was dasselbe ist) viel . Dies gibt im Grunde den Wert jedes "Zeichens" in Ziffern, Buchstaben oder irgendetwas anderem aus, je nachdem, welcher Zeichensatz von Ihrem Computer verwendet wird. Es gibt auch das Open your mind., was fast dasselbe bewirkt, obwohl es nur in numerischer Form ausgegeben wird.

Länge 16 Schnipsel

You are nothing!

Wenn dir das jemand im wirklichen Leben sagt, wirst du dich deprimiert fühlen. Als Ophelia dies Hamlet im Shakespeare-Programm mitteilt, fühlt sich Hamlet wertlos. Was bedeutet das? Das Hamlet = 0.

Länge 17 Schnipsel

Ophelia, a wench.

In einem Drehbuch müssen die Charaktere präsentiert werden, bevor das eigentliche Spiel beginnt. In den meisten Programmiersprachen müssen die Variablen vor der Verwendung deklariert werden. Da SPL eine Programmiersprache ist, die einem Drehbuch ähnelt, deklarieren Sie die Variablen so, indem Sie angeben, welche während des Programms erscheinen.

Aber was bedeutet "eine Frau"? Bedeutet dies, dass es sich um einen bestimmten (und coolen) Datentyp handelt? Nun ... Ich muss Sie leider nicht enttäuschen, aber es bedeutet nichts: Alles nach dem Komma wird vom Parser ignoriert, was bedeutet, dass Sie den empörendsten Fehler machen können, den Sie sich vorstellen können.

Länge 18 Schnipsel

lying sorry coward

-4für alle irdischen Wesen. Warum? Weil 2*2*(-1) = -4.

Länge 19 Schnipsel

Romeo:
 Remember me.

Zu guter Letzt!!! Ich kann endlich eine vollständige korrekte Syntaxanweisung ausgeben (wenn auch eine kurze)! So verwenden Sie Snippet 12: Zuerst deklarieren Sie, wer gerade spricht, und dann schreiben Sie in der nächsten Zeile den "Dialog". Normalerweise sind nur zwei "Charaktere" auf der Bühne, um den Parser nicht traurig und verwirrt zu machen. Wenn du einen anderen "Charakter" brauchst, nimmst du einen von der Bühne und ersetzst ihn durch den neuen.

Länge 20 Schnipsel

cube of thy codpiece

Ich wollte noch ein bisschen mehr für dieses Stück ausarbeiten, aber um ehrlich zu sein, die Dinge, die ich mir ausgedacht habe, sind immer noch zu kurz für diesen Ausschnitt. Und so bringe ich dir das, was am Ende ist -1- weil (-1) 3 = -1 (und codpieceein "negatives" Substantiv ist, da sie unangenehm sind und alle). SPL versteht einige aufwändigere arithmetische Operationen als eine gewisse Potenzierung und Quadratwurzel.

Factoid (ein weiterer, da wir einen weiteren Meilenstein erreicht haben)

Das "Hello World Program" in Shakesperian hat 89 Zeilen und mehr als 2400 Zeichen, wie hier zu sehen ist .

Länge 21 Schnipsel

Listen to your heart.

In Snippet 15 haben Sie etwas ausgegeben; Hier geben Sie eine Zahl in das Programm ein. Wenn Sie ein Zeichen eingeben möchten, verwenden Sie Open your mind.stattdessen. Selbstverständlich wird dieser Wert in dem "Zeichen" gespeichert, mit dem gesprochen wird.

Länge 22 Schnipsel

Recall your childhood!

Hiermit wird eine Ganzzahl aus einem Stapel entfernt, wie im Snippet 12 erläutert. Wenn Ophelia Hamlet den oben genannten Satz sagt, veranlasst dies Hamlet, eine Ganzzahl aus seinem Stapel zu nehmen und diesen Wert anzunehmen.

Natürlich, solange das Wort recallden Satz beginnt, können Sie den Rest mit so ziemlich allem füllen, was Ihr kreativer Shakesperianer wünscht.

Länge 23 Schnipsel

Are you better than me?

Implementierung von Snippet 6. Wenn ein "Charakter" eine Frage wie diese an einen anderen stellt, entspricht das, was er tut, den if (x > y)üblichen Programmiersprachen. Das Follow-up dieser Anweisung muss verzögert werden, bis ich mehr Zeichen zur Verfügung habe.

Länge 24 Schnipsel

[Enter Romeo and Juliet]

Ja, "Zeichen" können paarweise eingegeben werden. Es ist nicht erforderlich, dass ein "Charakter" die Bühne betritt, gefolgt von einem anderen.

Länge 25 Schnipsel

remainder of the quotient

25 Zeichen nur zum Schreiben ein %. 25 Zeichen, um den Rest einer Division zu haben. Und um es zu benutzen? Nun, das ist sogar noch größer - siehe Ausschnitt 75.

Länge 26 Schnipsel

Let us return to scene II.

Hier ist es eine gotoin SPL, die so funktioniert, wie man es in einer Programmiersprache erwarten würde. Eine Sache ist: Sie können zwischen Szenen im selben Akt und zwischen Akten springen; Sie können jedoch nicht zwischen Szenen in verschiedenen Aktionen springen.

Länge 27 Schnipsel

[Exeunt Ophelia and Hamlet]

Wenn mehr als ein "Charakter" die Bühne verlässt, wird anstelle des Exitlateinischen Wortes "Exeunt" das lateinische Wort "Exeunt" verwendet. Manchmal kann es einfach durch Snippet 8 ersetzt werden.

Länge 28 Schnipsel

Scene I: Ophelia's flattery.

Szene deklarieren. Wie Sie bereits erwarten können, wenn Sie mit mir fertig geworden sind, ist das Wichtigste das Scene I, der Rest ist künstlerischer Flaum.

Es wurden einige Compiler erstellt (wie dieser, der von SPL nach C kompiliert und in Python geschrieben wurde ), die sich stattdessen auf den Text nach der Nummerierung des Akts / der Szene beziehen. Während logischer (immerhin, während eines Stücks, wenn die Charaktere Zeilen wie "Lass uns zu Akt I zurückkehren" sagen, kann dies als dumm angesehen werden), halte ich mich an den ursprünglichen Weg.

Länge 29 Schnipsel

You pretty little warm thing!

Ja, noch eine Konstante (da wir viel mehr Zeichen benötigen , um arithmetische Operationen auszuführen). Dieser ist gleich 8, weil 2*2*2*1 = 8.

Länge 30 Schnipsel

You are as cowardly as Hamlet!

Dies Romeo gegenüber zu sagen, bedeutet dies Romeo = Hamlet. Wie Snippet 9.

Factoid (ja, ein weiterer Orientierungspunkt erreicht!)

Diese Sprache wurde für eine Zuweisung in einem Syntaxanalysekurs erstellt - daher wurde von den Autoren kein SPL-Compiler erstellt. Mehr: Es scheint, dass die Autoren von SPL ihre Verbindungen zu ihrer Schöpfung abgebrochen haben, da seit 2001 anscheinend nichts an der Sprache geändert wurde ...

Länge 31 Schnipsel

Am I as horrid as a flirt-gill?

Ja, ich weiß, es wiederholt sich ein wenig Snippet 23, obwohl wir hier den "Charakter" vergleichen, der mit einem "Flirt-Gill" spricht (von, wenn Sie es vorziehen, if (Ophelia == -1)). Die Sache ist...

Länge 32 Schnipsel

If so, let us return to scene I.

... nun kann ich die thenvon SPL, den bedingten Sprung zu und die Shakesperian-Methode zur Implementierung von Schleifen vorstellen . Sie können beispielsweise Romeo veranlassen, den Wert anzunehmen 0, seinen Wert zu erhöhen, während er eine andere Aufgabe ausführt, und anhalten, wenn er 10 Jahre alt ist, und anschließend mit dem Programm fortfahren.

Länge 33 Schnipsel

If not, let us return to scene I.

Nur eine Erinnerung, dass wir stattdessen mit einer anderen Szene fortfahren können, wenn die Bedingung, auf die wir getestet haben, falsch ist .

Länge 34 Schnipsel

Open your mind! Remember yourself.

Zwei Anweisungen hintereinander, yippie! Der erste liest ein Zeichen, der zweite schiebt es in den Speicherstapel des anderen Zeichens.

Länge 35 Schnipsel

Act I: Death!

Scene I: Oh, shit.

Die richtige Art, eine Handlung und eine Szene zu deklarieren. Fügen Sie künstlerischen Brei geschmackvoll hinzu.

Länge 36 Schnipsel

Thou art as sweet as a summer's day!

Eine andere Art zu sagen, dass der "Charakter", mit dem gesprochen wird, den Wert erhält 1- weil die Sommertage schön und angenehm sind.

Länge 37 Schnipsel

Art thou more cunning than the Ghost?

Ophelia, die Hamlet diese Frage stellt, bedeutet, dies in eine weniger lesbare Programmiersprache zu übersetzen if (Hamlet > the Ghost). Es ist wieder Snippet 23, ja - aber es zeigt Ihnen, dass es nicht erforderlich ist, die "Charaktere" zu fragen, ob sie besser sind als die anderen: Jede andere Frage wird auch funktionieren.

Länge 38 Schnipsel

[Enter the Ghost, Romeo and the Ghost]

Ja, ich rufe ein "Zeichen" zweimal auf, weil ich wollte, dass das Programm mir einen Fehler gibt. Das Aufrufen eines "Charakters", der sich bereits auf der Bühne befindet, oder das Aufrufen eines "Charakters", der nicht zum Beenden bereit ist, bereitet dem Parser / Compiler große Sorgen.

Länge 39 Schnipsel

the sum of a fat lazy pig and yourself!

Die vollständige Anweisung sieht besser aus, ich gebe Ihnen das, aber ... hier ist unsere erste arithmetische Operation! Was bedeutet das eigentlich? Nun, pigist ein dreckiges Tier (wenn auch lecker) -1, hat also zwei Adjektive, was fat lazy piggleich bedeutet 2*2*(-1) = -4. Aber was ist mit yourself? Es ist ein reflexives Pronoum, weder ein Name noch ein Adjektiv. Denken Sie daran, dass SPL auf Dialogen zwischen "Zeichen" basiert. Somit yourselfbezieht sich auf die anderen „Zeichen“ auf der Bühne. So kommen wir am Ende an und entdecken, dass "die Summe eines fetten faulen Schweins und Sie selbst" tatsächlich ist -4 + x.

Länge 40 Schnipsel

the sum of a squirrel and a white horse.

Ja, eine andere Summe, aber diese ist einfacher als Ausschnitt 39. Dies ist nur 1 + 2- 3, wenn meine Mathematik korrekt ist.

Factoid (immer noch bei mir nach diesen vierzig künstlerischen Schnipselchen? Du hast einen Preis verdient.)

SPL in der Version 1.2.1 kann hier heruntergeladen werden .

Länge 41 Schnipsel

Juliet:
 Speak thy mind!

[Exit Romeo]

Manchmal werden "Charaktere" nur auf die Bühne gerufen, um ihren Wert zu ändern - was in einem realen Spiel etwas Seltsames wäre. Wie auch immer, Juliet lässt ihren geliebten Romeo seinen gespeicherten Wert ausdrucken, woraufhin er die Bühne verlässt.

Länge 42 Schnipsel

Speak YOUR mind! You are as bad as Hamlet!

Wieder zwei Anweisungen in einer Zeile (wir können mehrere haben, aber die Snippet-Länge erlaubt es noch nicht); Hier haben wir einen "Charakter", der einen anderen auffordert, seinen Wert auszugeben und den Wert anzunehmen, den Hamlet hat. Verwirrend? Mayhap.

Länge 43 Schnipsel

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

Juliet, die dies fragt, bedeutet nicht, dass sie ein geringes Ansehen hat (obwohl dies im wirklichen Leben der Fall sein könnte). Es ist einfach eine andere if, wie die Ausschnitte 23 und 37. Oh, ich hätte es fast vergessen: Das bedeutet übersetzt if (Juliet == -2).

Länge 44 Schnipsel

You are as evil as the square root of Romeo!

Ja, Quadratwurzeln sind böse, wusstest du nicht? Wie auch immer, diese Anweisung ist einfach genug, um zu verstehen, was sie tut: Sie schreibt das gesprochene "Zeichen" dem Wert der Quadratwurzel des in Romeo gespeicherten Werts zu.

Länge 45 Schnipsel

Hamlet:
 Art thou more cunning than the Ghost?

Snippet 37 richtig geschrieben mit dem Charakter, der die Zeile spricht.

Länge 46 Schnipsel

the product of a rural town and my rich purse.

Okay ... SPL ist wahrscheinlich die einzige Sprache auf der Welt, mit der Sie Städte mit Geldbörsen multiplizieren können. Das heißt, (2*1)*(2*1)was, wenn ich mich nicht sehr irre, gleich ist 4.

Länge 47 Schnipsel

Romeo:
 Speak your mind.

Juliet:
 Speak YOUR mind!

Ich gebe dir das: Es ist vielleicht einer der bizarrsten Dialoge in der Geschichte. Aber es ist das, was Sie bekommen, wenn Sie sich für eine seltsame Sprache entscheiden, die Sie präsentieren möchten. Romeo und Julia sagen sich kurz, dass sie ihre Werte ausgeben sollen.

Länge 48 Schnipsel

You lying fatherless useless half-witted coward!

Übersetzen es direkt 2*2*2*2*(-1). -16, richtig?

Länge 49 Schnipsel

Scene V: Closure.

Hamlet:
 Speak your mind!

[Exeunt]

Ein Beispiel zum Beenden eines Programms in SPL. Sie können eine Szene speziell für diese deklarieren (obwohl dies nicht erforderlich ist). Dann fordert Hamlet einen anderen "Charakter" auf, seinen Wert auszugeben, und alle verlassen die Bühne. Und ja, alle müssen von der Bühne verschwinden.

Länge 50 Schnipsel

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

Mehr "Charakter" -Präsentation vor der richtigen Anleitung. Wie immer ist das Einzige, was für den Compiler von Bedeutung ist, Othellound Lady Macbethso ist der Rest der Reihe zu gewinnen ...

Eine weitere Sache: Die "Charaktere" müssen nicht miteinander verwandt sein, um in einem SPL-Programm zu erscheinen - Sie können also Romeo, Othello und Hamlet im selben Stück haben.

Factoid (ein halbes Jahrhundert von diesen Dingen? Puh! Danach denke ich, ich werde William Shakespeare verabscheuen ...)

Der vor einiger Zeit erwähnte und von den SPL-Entwicklern entwickelte SPL-C-Übersetzer basierte auf Flex und Bison .

Länge 51 Schnipsel

Othello:
 Recall your great dreams. Speak your mind!

(So ​​krank von Romeo, Julia und Hamlet ... lass uns zur Abwechslung Othello holen!)

RecallWie Sie sich denken können, ist hier der Schlüssel. Das "Zeichen", das Othello anspricht, nimmt einen Wert von seinem Stapel, nimmt diesen Wert an und gibt ihn anschließend aus.

Länge 52 Schnipsel

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

Noch eine Summe. Gähnen. Vorausgesetzt, dieser ist an Hamlet gerichtet, heißt das Hamlet = Hamlet + 1. Oder Hamlet += 1. Oder Hamlet++.

Länge 53 Schnipsel

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

Ah, ja, etwas, das ich zuvor vergessen habe: Die sprechenden "Charaktere" können sich in ihren eigenen Zeilen ausdrücken.

Länge 54 Schnipsel

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

Ein weiteres Beispiel für das vorherige Snippet, das in einer Bedingung enthalten ist. Also, was wir hier haben, ist if (Romeo + Juliet == 0).

Länge 55 Schnipsel

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

Hier lobt Julia den "Charakter", mit dem sie spricht (nehmen wir an, es ist Romeo, um Shakespeares willen) und erklärt, dass er / sie 4 ist. Ja, eine andere Zuordnung von Werten.

Länge 56 Schnipsel

Othello:
 You lying fatherless useless half-witted coward!

Snippet 48 richtig gemacht, mit einem "Charakter". Wenn Sie zu faul sind, um nach oben zu scrollen (wie ich es tun würde), bedeutet dies, dass derjenige, der beleidigt wird, den Wert -16 erhält.

Länge 57 Schnipsel

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

Ich habe bereits erklärt, wie die Bedingungen bei SPL allgemein funktionieren. Es ist jedoch eine umfassendere Inline-Analyse erforderlich. Wir haben elsehier nicht: In diesem Beispiel würde das Programm, wenn die Bedingung fehlschlägt, zu Schritt I zurückkehren. aber wenn es wahr wäre, würde es mit der nächsten Anweisung fortfahren, die Recallein Pop vom Stapel ist, das heißt.

Länge 58 Schnipsel

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

Schnipsel 44 greifen und präsentieren, wie die Anweisung präsentiert werden soll. Wenn dies ein Dialog zwischen Romeo und Othello wäre, könnten wir dies auf Java als übersetzen Othello = Math.sqrt(Juliet).

Länge 59 Schnipsel

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

OK, wenn Othello mit Romeo spricht, wäre das gleichbedeutend mit Romeo+(-1); Romeo--kurz gesagt. Ziemlich einfach, oder? Das ist SPL für Sie.

Länge 60 Schnipsel

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

Kurz gesagt, if (The Ghost/Hamlet == 0)angenommen, das "Ich" gehört Hamlet.

Länge 61 Schnipsel

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

Sobald Sie die Schichten von Wörtern und Beleidigungen wegschälen, bemerken Sie, dass SPL eine ziemlich grundlegende Sache ist, ohne coole Funktionen und Sachen. Wir haben also eine Menge arithmetischer Funktionen im Körper des Programms. Wenn dieses also an Julia gerichtet wäre, wäre es gleichbedeutend mit Juliet++.

Länge 62 Schnipsel

twice the difference between a mistletoe and a oozing blister!

Ja, ja, mehr Rechenoperationen. Diese 62 Byte SPL können ungefähr in übersetzt werden 2*(1-2*(-1)). Das wäre eine ziemlich großartige Golfsprache, oder? Richtig.

Länge 63 Schnipsel

You lying stupid fatherless rotten stinking half-witted coward!

Schnipsel 48 ausgegeben -16, diese ist gleich -64: 2*2*2*2*2*2*(-1).

Länge 64 Schnipsel

your coward sorry little stuffed misused dusty oozing rotten sky

Soweit ich SPL verstehe, ist dies absolut legitim. Sie haben eine ganze Menge beleidigender Adjektive, die von einem "positiven" Nomen ausgehen. Da Adjektive keine spezielle Unterscheidung haben, ob sie negativ sind oder nicht (ihr einziger Wert ist das Multiplizieren der Zahl rechts von ihnen mit zwei), können wir völlig dumme Sätze wie diesen haben. Welches entspricht 256. Weil 2*2*2*2*2*2*2*2*1=256.

Länge 65 Schnipsel

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

Hmm, so viel Hass, nicht wahr? Also, was wir hier haben, ist gleichbedeutend mit y=0; y=y+(-1);Wahrscheinlich hätte man "golfen" können You are a pig!, aber heh.

Länge 66 Schnipsel

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

Also, zieh Julia von dir ab, was? Das hier ist ziemlich einfach zu entschlüsseln: Romeo=Juliet-Romeo;Vorausgesetzt, es ist Romeo, mit dem gesprochen wird.

Länge 67 Schnipsel

Juliet:
 Am I better than you?

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

Wie die meisten Bedingungen auf SPL funktionieren. Sie testen den Ausdruck und springen zu einem anderen Teil des Programms, wenn dies zutrifft (oder nicht: siehe Abschnitt 33). Andernfalls fahren Sie mit dem nächsten Satz fort.

Länge 68 Schnipsel

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

Ja, ja, ich werde ein bisschen eintönig. Aber SPL ist so. Wie ich bereits sagte, sind seine Ausdrücke eine Mischung aus arithmetischen Operationen. Somit ist dies eine weitere Inkrementierung - da stone walles sich um ein neutrales "Nomen" handelt.

Länge 69 Schnipsel

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

Anstelle einer Summe haben wir die Subtraktion zwischen zwei Zeichen, Othello und dem, mit dem gesprochen wird.

Länge 70 Schnipsel

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

Wir kehren zu den Ergänzungen zurück, ja - nennen Sie mich formelhaft, heh. Wir übersetzen dies zu Romeo + 2*2*1.

Länge 71 Schnipsel

Scene I: Dialogues.

[Enter Juliet]

Othello:
 Speak your mind!

[Exit Juliet]

Eine Szene kann so klein sein. JulietWenn sie die Bühne betritt, fordert Othello sie auf, ihren gespeicherten Wert auszugeben, und sie verlässt die Bühne wieder.

Länge 72 Schnipsel

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

Noch eine arithmetische Operation - weil SPL mit ihnen durchsetzt ist. Wir können dies übersetzen 2*(1-2*2*(-1)).

Länge 73 Schnipsel

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

Vier Anweisungen hintereinander ?! Eigentlich bin ich ziemlich stolz auf mich. Nehmen wir jedenfalls an, dass dies ein Dialog zwischen Romeo und Julia ist (und er spricht): Dies bedeutet, dass Julias Wert bei 0 beginnt; Dann wird Julia den Wert von Romeo in ihren Speicherstapel verschieben, ihn platzieren und in der eingegebenen Form ausgeben. Einfach, richtig?

Länge 74 Schnipsel

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

Ja, ja, langweiliges Beispiel, ich weiß. Aber das ist es X = (Romeo + 1) + 1.

Länge 75 Schnipsel

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

Nun, das ist ziemlich einfach. Wenn Ihre Dekodierungsfähigkeiten nicht ordnungsgemäß funktionieren, wird dies in übersetzt if (Othello % X == 0).

Länge 76 Schnipsel

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

Der Sprung von Snippet 26 mit einem Ausdruck davor. Ein gotoon SPL ist nicht immer in der Nähe einer Bedingung zu finden, es kann auch so sein - und diese Art von gotowird natürlich immer am Ende eines Akts oder einer Szene zu finden sein, da Anweisungen danach niemals kompiliert / ausgeführt werden. Der erste Befehl ist ziemlich einfach: x=x+1.

Länge 77 Schnipsel

[Exit Hamlet]

[Enter Romeo]

Juliet:
 Open your heart.

[Exit Juliet]

[Enter Hamlet]

Also haben wir Juliet und Hamlet auf der Bühne; aber wir brauchen den Wert von Romeo. Um den Compiler vor unangenehmen Kopfschmerzen zu bewahren, entfernen wir zunächst Hamlet von der Bühne (obwohl es Juliet gewesen sein könnte), und fordern Romeo auf, auf die Bühne zu kommen. Juliet gibt ihm die Anweisung, a auszugeben Dann verlässt Romeo die Bühne und Hamlet kehrt zurück. Ziemlich einfach und unkompliziert.

Länge 78 Schnipsel

The Ghost:
 Speak thy mind.

Lady Macbeth:
 Listen to thy heart! Remember thyself.

The Ghost (Hamlets verstorbener Vater) fordert Lady Macbeth auf, ihren Wert auszugeben, während sie The Ghost auffordert, eine Zahl zu lesen und auf seinen Stapel zu schieben.


32
Dieses unglaublich interessante und zu Ihrem Profil passende Bild sieht genau so aus, wie ich mir einen SPL-Programmierer vorstelle.
Overactor

3
@overactor Ich weiß nicht, ob ich beleidigt oder stolz darauf sein soll, mit einem Gumby verglichen zu werden. ^ _ ^
Rodolfo Dias

9
Seltsamerweise ist dies NICHT das obskurste Beispiel, das hier zu lesen ist ... und scheint als "am wenigsten praktisch" zu gelten.
HRRambler

6
ROFL hier ist +1, um dir auf dem Weg zu helfen - Noch einmal zum Durchbruch Rodolfo!
HRRambler

3
@ RodolfoDias Sie können beginnen. Ich warte darauf, sie zu sehen. Sie haben 120 positive Stimmen.
ghosts_in_the_code

176

Piet

Factoid

Piet ist eine Programmiersprache, in der der Quellcode aus Bildern besteht. Der Programmablauf beginnt mit dem oberen linken Pixel und bewegt sich zwischen Pixeln und Pixelgruppen um das Bild herum, bis es endet.

Zur besseren Lesbarkeit werden Piet-Programme häufig in einer vergrößerten Version angezeigt. In einem solchen Fall wird der Begriff codelverwendet, um eine Gruppe gleichfarbiger Pixel zu beschreiben, die einem einzelnen Pixel im Quellbild entsprechen.

Da Piet bei dieser Herausforderung keine Zeichen verwendet, wird ein Codel pro Stimme für Beispielprogramme verwendet.

1 Codel

1 Codel

Dies ist ein gültiges Programm, es macht nichts und bricht ab. Der Steuerfluss beginnt oben links (nur) im Pixel und hat keinen Ausweg, wodurch das Programm beendet wird.

Das Pixel kann in diesem Fall eine beliebige Farbe sein, um genau den gleichen Effekt zu erzielen.

2 Codels

2 Codels

Dadurch werden fortlaufend Zeichen aus stdin gelesen und eine laufende Summe ihrer Unicode-Werte gespeichert (obwohl mit dieser Summe nichts gemacht wird und sie nicht angezeigt wird).

Der Programmfluss bewegt sich zwischen den beiden Codels hin und her, da der einzige Ausweg zwischen den beiden in den anderen besteht. Befehle in piet werden ausgeführt, indem von einem Codel oder einer Region in eine andere verschoben wird, abhängig vom Unterschied in Farbton und Helligkeit der beiden Regionen. Dies inputist der Befehl, der sich von links nach rechts und dann von addrechts nach links bewegt . Beim ersten addBefehl wird nichts ausgeführt, da sich nur ein Wert auf dem Stapel befindet. In der Spezifikation wird angegeben, dass Befehle ignoriert werden, für die nicht genügend Werte verfügbar sind.

Dieses Programm ist eine Schleife, die niemals enden wird, da die meisten Piet-Programme extrem klein sein werden, da es mindestens ein paar Codels braucht, um den Programmfluss richtig "einzufangen" und zu beenden.

3 Codels

3 Codels

Dies ist ein einfaches Echo-Programm. Es liest jeweils ein Zeichen von stdin und druckt es in stdout aus.

Auch dies ist eine Endlosschleife. Das Programm beginnt mit der Bewegung von links nach rechts, was inputdann auch der Fall ist output. Das Programm wird weiterhin in die gleiche Richtung laufen, wann immer es kann. Beim hellgrünen Codel besteht der einzige Ausgang darin, sich in die entgegengesetzte Richtung zu bewegen. Bei der Wiedergabe von rechts nach links fährt er versucht , auszuführen subtractund addBefehle, aber der Stapel leer ist, so werden diese No-ops.

4 Codels

4 Codels

Druckt 2 auf unbestimmte Zeit aus.

Funktionell kein besonders interessantes Programm, aber jetzt, da wir endlich eine zusammengesetzte Anzahl von Codels haben, können wir einen etwas fortgeschritteneren Fluss als von links nach rechts zeigen. Wenn der Programmfluss versucht, einen Codel zu verlassen, versucht er zuerst die aktuelle Richtung. Wenn dies nicht möglich ist (in diesem Fall aufgrund des Bildrands), wird es um 90 Grad im Uhrzeigersinn gedreht und versucht, es erneut zu beenden. In diesem Fall bewegt sich das Programm um jeweils 1 Codel im Uhrzeigersinn, wobei 1 pushzweimal auf den Stapel gelegt wird, adddie beiden zusammen und dann outputdas Ergebnis.

5 Codels

5 Codels

Liest wiederholt ein Zeichen nach dem anderen von stdin und verfolgt die Summe ihrer Unicode-Werte.

Dies ist im Wesentlichen dieselbe Funktionalität wie die 2-Codel-Version, bei dieser Herausforderung geht es jedoch darum, die Sprache zu präsentieren, und eines der coolen Dinge an piet ist, wie Sie unterschiedlich aussehende Bilder haben können, die dasselbe tun.

Hier sehen wir zum ersten Mal den weißen Codel, der es dem Programmfluss ermöglicht, darüber zu gleiten, ohne Anweisungen auszuführen. Die magentafarbenen und blauen Kodierungen erledigen hier die ganze Arbeit. Von blau nach rot zu reisen, hat nichts zu bedeuten, da es den weißen Code in der Mitte kreuzt. Die 2 roten sind nur pushdie Nummer 1 auf dem Stapel, und popsie lösen sich wieder, wenn sie von links nach rechts und dann von rechts nach links über sie und dann über den weißen Codel laufen, sodass keine Anweisung ausgeführt wird.

6 Codels

6 Codels

Wiederholen früherer Funktionen mit einem anderen Aussehen. Dies ist ein weiteres Echo-Programm, das ein Zeichen gleichzeitig von stdin bis stdout liest.

Hier sehen wir unseren ersten schwarzen Codel. Der Programmablauf kann keinen schwarzen Codel eingeben, daher kann das Programm vom hellen Magenta-Codel oben rechts aufgrund der Bildkante nicht nach rechts, aufgrund des schwarzen Codels nicht nach unten und nach links in den roten Codel zurückspringen . Die blauen und grünen Codels sind rein dekorativ, das Programm wird sie niemals betreten.

7 Codels

7 Codels

Noch ein Echo-Programm mit einem anderen Look.

Hier sehen wir unsere ersten Codelblöcke, die größer als Größe 1 sind. In piet wird jeder zusammenhängende Codelblock derselben Farbe als ein einzelner Block behandelt. Die Größe des Blocks spielt keine Rolle, es sei denn, Sie führen den pushBefehl aus. Daher wird dieses Programm genau wie die 3-Codel-Version behandelt, nur mit unterschiedlichen Farben.

8 Codels

8 Codels

Liest eine Zahl von stdin und gibt das Quadrat wiederholt an stdout aus.

Der Kontrollfluss ist ein grundlegendes Muster im Uhrzeigersinn, genau wie im 4-Codel-Programm. Ausgehend von den oberen linken, die Operationen in Ordnung sind input, duplicate(drückt eine zusätzliche Kopie des oberen Wertes des Stapels auf den Stapel) multiply, output. Dann wird pushder Wert 1 auf den Stapel gelegt, über das Weiß popgeschoben, damit kein Befehl ausgeführt wird, und dann wird diese 1 vom Stapel entfernt, wenn vom unteren linken zum oberen linken Codel gewechselt wird. Das bringt es mit einem leeren Stapel an den Anfang des Programms zurück und es wird wiederholt.

9 Codels

9 Codels

Addiert 1 + 2 = 3 und endet dann.

Jetzt, da wir ein Programm mit mehr als 2 Codels in beiden Dimensionen haben, können wir endlich eine Region einrichten, die das Programm einfängt und beendet, anstatt eine Endlosschleife auszuführen. Die erste Operation, die vom roten Codel in den dunkelroten Bereich wechselt, ist a = push1, dann dreht sich das Programm und fließt in den hellroten Codel in der Mitte und pushes hat einen Wert von 2. Das Fließen von hellrot nach hellgelb wird ausgeführt eine addOperation. Der untere hellgelbe Balken bewirkt das Beenden des Programms, da es nicht herausfließen kann, da alle Ecken blockiert sind.


Die 1- und 2-High-Programme werden schnell hässlich und uninteressant. Ab diesem Punkt werde ich mich auf Zahlen konzentrieren, die mindestens ein paar Codierungen in jede Richtung zulassen.

12 Codels

12 Codels

Endlich ein Programm, das etwas tut, das als nützlich eingestuft werden könnte (obwohl es immer noch ein bisschen schwierig ist). Liest 2 Zahlen nacheinander aus stdin und gibt dann ihre Summe aus. Dies geschieht wiederholt.

Das Programm läuft inputsvon links nach rechts über die 4 farbigen Balken, wobei 2 gefolgt von einem addBefehl eingegeben werden . Es bewegt sich dann in den unteren rechten Codel und führt eine aus outputund geht dann über den weißen Bereich nach links zurück zum Start.

Dies hätte in 8 Codels geschehen können, aber da wir über zusätzlichen Platz verfügen, können wir etwas machen, das ein wenig von einem alten No-Signal-TV-Display inspiriert ist.

15 Codels

15 Codels

Liest eine Zahl von stdin und gibt ihr Quadrat aus.

Dies verwendet ein paar Tricks, um ein Programm, das tatsächlich etwas tut, ein bisschen symmetrischer zu machen. Der rote Balken ganz links hat im unteren Codel eine andere Farbe als der Rest und nutzt die Tatsache, dass (zumindest für mich) diese 2 Rottöne sehr ähnlich aussehen. Das Programm bewegt sich von der hellroten Region direkt in die hellblaue Codel und dann quer durch die Mitte des Programms zum hellgrünen Bereich auf der rechten Seite, wo es abgefangen wird. Es führt input, duplicate, multiply, und outputOperationen.

Der dunkelrote Codel sowie die mittelgrünen Codels oben und unten in der mittleren Spalte sind dekorativ und werden vom Programm nie erreicht.

20 Codels

20 Codels

Liest Zahlen von stdin, bis eine 0 gelesen wird. An diesem Punkt wird die Summe aller eingegebenen Zahlen ausgegeben und beendet.

Wir haben endlich genug Raum, um den Ablauf in Form der pointerOperation zu steuern . Die 4 Codel am oberen Rand führen input, duplicateund notOperationen aus, und dann eine weitere notOperation, die von Magenta oben rechts zu dem 2-Codel-Gelb darunter wechselt. Die notOperation löscht den obersten Wert vom Stapel und drückt eine 1, wenn der oberste Wert eine 0 war, und eine 1, wenn dies nicht der Fall ist. Aus diesem Grund notersetzt ein Double-Wert einen Wert ungleich Null durch eine 1. Wenn Sie vom gelben Balken nach unten in das dunkle Blau pointerwechseln, wird der oberste Wert vom Stapel entfernt und der Richtungszeiger so oft im Uhrzeigersinn verschoben.

Wenn der oberste Wert eine 1 ist (dh, wir haben keine Null eingegeben), zeigt der Richtungszeiger nach links und bewegt sich für eine addOperation zu den magentafarbenen Codierungen (die beim ersten Mal ignoriert wird, weil nur ein Wert auf dem Stapel vorhanden ist) und dann durch den weissen zurück zum start des programms.

Wenn der oberste Wert des Stapels bei der Zeigeroperation eine Null ist, ändert sich der Richtungszeiger nicht und das Programm wird abwärts fortgesetzt. Wenn Sie sich in das hellere blaue Band bewegen, wird popdie 0, die vom Stapel eingegeben wurde, nur die Summe der akkumulierten Zahlen belassen. Wenn Sie in den Cyan-Balken unten gehen output, wird diese Summe berechnet und endet, da der Programmfluss blockiert ist.

25 Codels

25 Codels

Countdown! Liest eine Zahl von stdin und druckt dann einen Countdown bis 1, um jeweils eine Zahl zu stdout. Wenn beispielsweise 5 gelesen wird, wird 54321 gedruckt.

Die erste Operation von Cyan nach Gelb ist die input. Dann beginnt in Gelb die Programmschleife. Gelb> Magenta> Blau ist duplicatedann ein output, also druckt es den obersten Wert auf dem Stapel, behält aber eine Kopie. Bewegen Sie die rechte Seite, wir pushder Wert 1 auf den Stapel durchführen dann subtractionunsere eingegebenen Wert um 1 abnimmt nächstes folgt duplicate, notund eine weitere notBewegung von der Magenta - Licht in der unteren rechten Ecke in die dunkelgelbe daneben. Dies ist die gleiche Null- / Nichtnull-Prüfung wie beim vorherigen Programm. Wenn Sie nach links in das hellblaue Codel gehen pointer, wird eine Operation ausgeführt, die entweder nach links in das dunkle Cyan verschoben wird, um das Programm zu beenden, wenn wir fertig sind, oder nach oben in das Gelbe, um unsere Schleife ohne die anfängliche Eingabe neu zu starten, wobei der ursprüngliche Wert jedoch verringert wird um 1.

Alle 3 roten Kodierungen sind dekorativ und können jede Farbe haben.

30 Codels

30 Codels

Fibonacci-Generator. Gibt Terme der Fibonacci-Sequenz als Standard aus und hört nicht auf.

Dies ist die erste Einführung des rollOperators sowie das erste Mal, dass eine Bereichsgröße größer als 1 mit dem pushOperator verwendet wird, um einen bestimmten Wert auf den Stapel zu bekommen.

Wie immer beginnt oben links die Bewegung nach rechts. Die ersten 2 Operationen pusheine 1 auf dem Stapel und dann output, da die Fibonacci-Sequenz mit zwei Einsen beginnt, wird die Hauptprogrammschleife nur 1 einmal drucken. Dann werden push2 weitere 1s auf den Stapel gelegt, um in der dunklen Magenta oben rechts zu landen und die Hauptprogrammschleife zu starten.

Wenn Sie die rechte Seite nach unten bewegen duplicateund outputden nächsten Term der Sequenz ausdrucken, erhalten Sie duplicateerneut eine Kopie des aktuellen Sequenzwerts. Wenn Sie sich nach links über den unteren Rand bewegen, werden 2 pushVorgänge ausgeführt. Da der hellrote Bereich unten rechts 3 Codels groß ist, pushdrückt der erste eine 3 anstelle einer 1 auf den Stapel.

Ins Hellblaue aufzusteigen ist eine rollOperation. Dadurch werden die obersten 2 Werte vom Stapel entfernt und es werden mehrere Rollen ausgeführt, die dem ersten Wert entsprechen, bis zu einer Tiefe, die dem zweiten Wert entspricht. In diesem Fall wird 1 Wurf bis zu einer Tiefe von 3 ausgeführt. Ein Wurf bis zur Tiefe nnimmt den obersten Wert des Stapels (unseren duplizierten aktuellen Wert) und vergräbt ihn ntief. Unser Stack ist im Moment nur 3 tief, so dass er den oberen Wert unten begräbt.

Bewegt sich wieder führt eine addOperation Addition der aktuellen Sequenzwert mit dem vorherigen Sequenzwert. Unser Stapel hat jetzt den nächsten (neuen aktuellen) Sequenzwert oben und den letzten Wert darunter. Das Programm bewegt sich nun direkt über das Weiß in das dunkle Magenta, um die Schleife erneut zu starten.

Das gelbe Muster in der Mitte wird nie verwendet.

54 Codels

54 Codels

Druckt "hallo!" zu übertreiben

Keine besonders lange Nachricht, aber das Drucken in Piet nimmt überraschend viel Platz ein. Das Drucken erfolgt unter Verwendung von Unicode-Werten, und ganze Zahlen werden unter Verwendung der Größe des Bereichs, der verlassen wird, auf den Stapel verschoben. Da wir für diese Herausforderung nur eine sehr begrenzte Anzahl von Codels haben, verwenden wir einige Berechnungen, um den gewünschten druckbaren Bereich zu erreichen.

Das Programm beginnt mit einer push5 aus der Cyan-Region links. Von hier aus fließt es direkt am oberen Rand mit 6 duplicateOperationen prime dem Stapel mit einem Bündel von 5s. Als nächstes ist push1, subtractum eine 4 auf den Stapel multiplyzu legen , und dann 2 Operationen, um 4 * 5 * 5 = 100 auf den Stapel zu legen. Dann ein duplicatefür 2 100s.

Jetzt springt das Programm vom Schwarzen ab und beginnt am unteren Rand nach links zu arbeiten. PushOperationen von 3 und 2 und dann a roll, um die 2 100er unter einer 5 zu begraben. Als nächstes ist push1, subtrahieren und addieren, um 100 + 5-1 = 104 auf dem Stapel zu erhalten, der Unicode "h" ist. Die nächsten 2 Operationen sind push1 pointer, um um die Ecke zu kommen, sich in der Mitte nach rechts zu bewegen und dann output"h" zu drucken.

Als nächstes befindet sich add100 + 5 = 105 oben auf dem Stapel und outputes wird "i" gedruckt. Der Stapel enthält jetzt zwei 5er. Push1 add, multiplygibt (1 + 5) * 5 = 30. Schließlich push3 und addfür 33 und outputfür das abschließende "!". Das Programm geht dann direkt durch den verbleibenden weißen Bereich und endet rechts im grünen Bereich.


5
Hah ja,
ich habe darauf

Wie unterscheidet sich das von einer 2D-Zeichensprache? Es ist nur die Art und Weise, wie Sie die Zellwerte vermitteln.
JDługosz,

25
@jdlugosz Viele esoterische Programmiersprachen sind nur ein paar grundlegende Stapelmanipulationsbefehle mit einer einzigartigen Art der Codierung der Befehle. Ich persönlich halte es für eine gute Idee, sie in ein Bild zu kodieren.
Spencer

13
Wenn es sich um eine funktionale Äquivalenz handelt, könnte man fragen: "Wie unterscheidet sich das von einer Turing-Maschine?" aber dann könnten Sie die gleiche Frage bei einer Katze oder dem Planeten Jupiter oder einer der anderen Sprachen stellen ...
Trichoplax

3
Das 9-Codel-Beispiel sieht aus wie ein Mini-Pokeball. Nett.
The_Basset_Hound

155

> <> (Fisch)

(Hinweis: Einige Snippets bauen auf vorherigen Snippets auf, daher habe ich mich im Gegensatz zu den meisten Antworten dafür entschieden, sie von frühestens bis spätestmöglich zu verwenden.)

Factoid:

Wie Befunge ist> <> eine stapelbasierte 2D-Sprache. Dies bedeutet, dass Anweisungen nicht wie bei den meisten herkömmlichen Sprachen linear ausgeführt werden - der Programmfluss kann nach oben, unten, links oder rechts erfolgen!

Länge 1 Snippet:

X

Xist ein ungültiger Befehl in> <>, daher wird die Fehlermeldung something smells fishy...gedruckt. Tatsächlich ist dies die einzige Fehlermeldung in> <>, unabhängig davon, ob die Ursache eine Division durch Null ist oder ob versucht wird, einen leeren Stapel zu platzieren.

Länge 2 Snippet:

1n

Der Programmablauf in> <> beginnt oben links und verläuft zunächst nach rechts. 1Drückt eine 1 auf den Stapel und ndruckt sie dann als Zahl (im Gegensatz zu einem ASCII-Zeichen). > <> -Programme sind jedoch toroidal, was bedeutet, dass der Anweisungszeiger am Ende einer Zeile umbrochen wird. Also, nachdem nwir an den Anfang gewickelt haben, drücken Sie eine 1, drucken, an den Anfang gewickelt haben, drücken Sie eine 1, drucken ... und am Ende drucken wir 1s für immer!

Länge 3 Snippet:

"o;

Hier "wird die Zeichenfolge analysiert, oals ASCII-Zeichen ausgegeben und ;das Programm beendet. Aber was macht das Programm eigentlich insgesamt?

Nun, zuerst beginnen wir mit dem Parsen der Zeichenketten und schieben jedes Zeichen, das wir sehen, auf den Stapel, bis wir einen Abschluss finden ". Wir drücken ein o, dann ein ;... und setzen den Anweisungszeiger wieder auf den Anfang. Aber jetzt sind wir auf einem, "also stoppen wir das Parsen von Strings und führen schließlich das ound ;wie gewohnt aus, um den oberen Teil des Stapels (das ;) zu drucken und zu beenden.

Ja, wir haben gerade dasselbe Anführungszeichen verwendet, um eine Zeichenfolge zu beginnen und zu beenden!

Länge 4 Schnipsel:

42n;

Basierend auf dem, was wir bisher gesehen haben, können Sie davon ausgehen, dass dies den Wert 42 erhöht, als Zahl ausgegeben und dann beendet wird. Aber alle Befehle in> <> sind einzelne Zeichen, daher werden hier tatsächlich eine 4 und eine 2 gedrückt, dann wird der obere Teil des Stapels als Zahl (nur die 2) ausgegeben und beendet.

Länge 5 Schnipsel:

<v
;>

Denken Sie daran, dass> <> eine 2D-Sprache ist. Das bedeutet, dass es Möglichkeiten geben muss, die Richtung des Programmflusses zu ändern!

Wie bei Befunge können Sie dies auch hier über die Pfeile tun >^v<. Schauen wir uns das obige Programm an, um zu veranschaulichen, wie sie funktionieren:

  • Der Programmablauf verläuft zunächst nach rechts
  • < lässt das Programm nach links fließen - wir gehen nach links und drehen uns um die v
  • v lässt das Programm nach unten fließen - wir gehen zum >
  • > Lässt das Programm nach rechts fließen - wir gehen nach rechts und biegen nach rechts ab ;
  • Schließlich beenden wir.

Länge 6 Schnipsel:

";"00p

Ein weiteres cooles Feature von> <> ist, dass es reflexiv ist - das Programm kann seinen eigenen Quellcode im laufenden Betrieb ändern!

Hier drücken wir a ;, gefolgt von zwei Nullen. pdann springt die oberen drei Elemente y, x, v( yund platziert die Spitze des Stapels ist) van der Position x,y. Mit anderen Worten, das pin diesem Programm setzt ein Semikolon an die Position 0,0und verwandelt den Code in ;;"00p. Auf diese Weise kann das Programm beendet werden, da der Anweisungszeiger jetzt die neu platzierte Anweisung umgibt und ausführt ;.

Länge 7 Snippet:

\7*n;
6

Im Gegensatz zu Befunge hat> <> auch Spiegel ( \/|_#), die die Richtung des Programmflusses widerspiegeln. Also hier wir:

  • Beginne nach rechts, aber das \spiegelt uns nach unten
  • Drücken Sie eine 6 und wickeln Sie
  • Schlagen Sie auf die Rückseite von \und reflektieren Sie nach rechts
  • Drücken Sie eine 7
  • Multiplizieren Sie die oberen zwei des Stapels
  • Ausgeben und beenden

Horizontal durch einen _Spiegel oder vertikal durch einen |Spiegel zu bewegen, ist ein No-Op.

Länge 8 Schnipsel:

"r00g>o<

Möglicherweise das einfachste> <> Quine, wenn ein Fehler geworfen werden darf. Die zwei neuen Anweisungen hier sind:

  • r: Kehre den Stapel um
  • g: Get - Pop y, xund schieben Sie den Charakter x,yauf den Stapel (Gegenstück zu p)

Unter Verwendung des zuvor beschriebenen Tricks zum Umbrechen von Zeichenfolgen drückt das Programm zunächst r00g>o<auf das erste Anführungszeichen und trifft es dann erneut. Der Stapel wird dann umgekehrt und gibt <o>g00r. Danach schieben wir den char an 0,0, den ", zu geben <o>g00r". Schließlich fangen wir einen ozwischen zwei Pfeilen ein und geben den oberen Teil des Stapels aus, bis nichts mehr übrig ist und wir einen Fehler erhalten.

Länge 9 Snippet:

x0\>
\1n>

x(Kleinbuchstaben) bewegt den Befehlszeiger in eine zufällige Richtung, und das Programm zeigt diese Funktionalität, indem es für immer zufällige Bits druckt. Folgen Sie den Pfeilen und Spiegeln, um herauszufinden, wie das funktioniert! (Vergessen Sie nicht, alle vier Richtungen zu überprüfen, einschließlich oben und links)

Länge 10 Schnipsel:

;a comment

Es gibt keine Kommentarsyntax in> <> - es wird keine benötigt. Schreiben Sie einfach, was Sie wollen, und stellen Sie sicher, dass es nicht als Code ausgeführt wird!

Länge 11 Schnipsel:

1!X2!X+!Xn;

!ist ein Trampolin, das Anweisungen überspringt. Es ist besonders nützlich, wenn es mit ?einem bedingten Trampolin verwendet wird, das oben auf dem Stapel auftaucht und die nächste Anweisung ausführt, wenn das aufgetauchte Element ungleich Null ist. Wir werden später sehen, wie das funktioniert.

Der obige Code gibt 3 aus, indem Sie das Xs überspringen und nur ausführen 1! 2! +! n;.

Länge 12 Schnipsel:

01v
ao>:@+:n

Druckt die Fibonacci-Zahlen für immer ab der Sekunde 1, eine in jeder Zeile. Die neuen Befehle sind:

  • a: Drücke 10, die wir für Newline brauchen. a-f10 bis 15 drücken.
  • :: Stapeloberseite duplizieren
  • @: Drehen Sie die oberen drei Elemente des Stapels, z [5 4 3 2 1] -> [5 4 1 3 2].

Trace für die ersten paar Iterationen:

Bildbeschreibung hier eingeben

Länge 13 Schnipsel:

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

Ein "tac" -Programm, das eine Eingabezeile einliest und umgekehrt ausgibt. Vielen Dank an @tomsmeding für das Snippet.

=Fügt die beiden obersten Elemente ein und drückt 1, wenn sie gleich sind, andernfalls 0. Die erste Zeile liest die Eingabe so lange ein, bis das ASCII-Zeichen 13 (Wagenrücklauf) gefunden wurde, und wechselt dann zur zweiten Zeile.

Die l?!;oSchleife ist ein wichtiges Konstrukt in> <>, das den gesamten Stapel ausgibt. Im Gegensatz >o<dazu verursacht es keine Fehler. So funktioniert es:

  • l schiebt die Länge des Stapels
  • Wir überprüfen die Länge mit ?:
    • Wenn die Länge ungleich Null war, wird der nächste Befehl !ausgeführt, wobei der Befehl übersprungen wird;
    • Wenn die Länge war Null, dann führen wir nicht !und beenden aufgrund des;

Beachten Sie, dass keine Ausgabe tatsächlich erfolgt, bis Sie Wagenrücklauf drücken.

Länge 14 Snippet:

32.

   X67*n;

Sie können nicht nur die Richtung des Programmflusses ändern, sondern auch den Befehlszeiger an eine beliebige Stelle bewegen!

.Pop y, xund teleports die Befehlszeiger auf x,y, die Richtung beibehalten wird . Beachten Sie jedoch, dass Sie zu einem Feld gehen müssen, bevor Sie dorthin gehen möchten - der Befehlszeiger wird aktualisiert, bevor der nächste Befehl ausgeführt wird. Hier landet der Befehlszeiger also auf dem ungültigen X, aber alles ist in Ordnung, da sich der Zeiger zu dem bewegt, 6bevor die Ausführung fortgesetzt wird.

.macht es möglich, die meisten> <> Programme in einen Einzeiler umzuwandeln, aber warum sollten Sie den Spaß an 2D verlieren wollen? :)

Länge 15 Schnipsel:

01+:aa*=?;:nao!

Druckt die Zahlen 0in 99jede Zeile. Dieses Programm demonstriert eine saubere Benutzung des !Trampolins - um sicherzustellen, dass die anfängliche 0 nur einmal gedrückt wird.

Länge 16 Snippet:

"r00g!;oooooooo|

Eine richtige Quine, die keine Fehler verursacht, inspiriert von der Quine auf der Esolang-Seite .

Wenn Sie sich gefragt haben, wie Sie das vorherige Quine (Snippet Nr. 8) so ändern sollen, dass es nicht zu Fehlern führt, und sich Gedanken machen, warum ich nicht einfach eine Menge oAnweisungen hinzufüge , dann werden Sie vielleicht feststellen, dass dies für jedes ohinzugefügte Quine gilt , müssen Sie einen anderen ausgeben o! Diese quine löst fein säuberlich das Problem , indem ein Putting |Spiegel am Ende, die jeweils ermöglicht overwendet werden zweimal .

Wenn wir zu einfachen Anführungszeichen wechseln (die auch zum Parsen von Zeichenfolgen dienen), ist dies eine alternative Methode, die nicht verwendet gwird

'r3d*!;oooooooo|

Länge 17 Snippet:

b2,63,.

   17,n;

Wir haben Addition ( +), Subtraktion ( -), Multiplikation ( *), Modulo ( %) ... aber was ist mit Division? Es ist da, aber da /es bereits ein Spiegel ist, wurde der Division ,stattdessen das Symbol zugewiesen . Interessanterweise ist Division Float Division, nicht Integer Division!

Das obige Programm untersucht ein undefiniertes Verhalten, indem es versucht, zu diesem zu springen 11/2, 6/3. Der Python-Interpreter scheint in Ordnung zu sein, wenn die erste Koordinate keine Ganzzahl ist (obwohl sie an die falsche Stelle springt), aber er drosselt, wenn die zweite nicht ist.

Länge 18 Schnipsel:

123456${{$}nnnnnn;

Wir haben gesehen, rwelches den Stapel umkehrt und @welches die oberen drei Elemente dreht. Hier sind ein paar weitere Befehle, die Elemente auf dem Stapel verschieben:

  • $: Vertausche die beiden oberen Elemente
  • {: Verschieben Sie den gesamten Stapel nach links
  • }: Verschiebe den ganzen Stapel nach rechts

Hier ist die Programmablaufverfolgung, um zu zeigen, wie dies funktioniert:

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

Dann geben wir aus und geben 256431.

Länge 19 Schnipsel:

"reward"4[roooo]oo;

Bisher habe ich "der Stapel", "der Stapel" gesagt ...

Obwohl die meisten Programme nur einen Stapel verwenden, können> <> tatsächlich mehrere Stapel haben! Hier sind die relevanten Anweisungen:

  • [: Popt xund verschiebt die obersten xElemente auf einen neuen Stapel
  • ]: Entfernt den aktuellen Stapel und verschiebt seine Werte in den zugrunde liegenden Stapel.

Hier ist der Trace für das obige Programm:

       [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

Es ist zu beachten, dass durch einfaches Drücken rewardund anschließendes erneutes Ausgeben des Stapels "first in, last out" oooooogedruckt drawerwird.

Länge 20 Schnipsel:

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

Ein wenig bekanntes Merkmal von> <> ist, dass Backslashes wie in Python in vielen Fällen für die Fortsetzung von Zeilen verwendet werden können. *

Der obige Code ist funktional derselbe wie

aa*5+7a*2+oo;

* Haftungsausschluss: Der Grund, warum dies funktioniert, kann ein ganz anderer sein

Länge 22 Schnipsel:

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

Neben Stapeln verfügt> <> auch über Register (eines für jeden Stapel), in denen Werte gespeichert werden können. Beim ersten Aufruf wird &der oberste Wert des Stapels in das Register verschoben, und beim &erneuten Ausführen wird der Wert zurückgesetzt. Dies kann sehr nützlich sein, wenn Sie einen Wert akkumulieren, z. B. Summen und Fakultäten.

Das obige Programm berechnet die Fakultät von f(15) und gibt 1307674368000 aus. Hier ist der Trace für fersetzt durch 4:

Bildbeschreibung hier eingeben

Länge 24 Schnipsel:

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

Wir haben genug Zeichen für jedermanns Lieblingsprogramm! Hier verwenden wir den .Teleporter für die Ausgangsschleife.

Länge 25 Schnipsel:

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

Leider erlaubt> <> das Lesen von STDIN immer nur für ein Zeichen, was das Einlesen von Zahlen etwas schwierig macht. Bei Eingaben, die aus den Ziffern 0 bis 9 bestehen, besteht dieses Programm im Wesentlichen aus dem Umwandeln einer Ziffernfolge von STDIN in eine Zahl auf dem Stapel (die dann gedruckt wird).

Eine weitere Anmerkung ist, dass bei EOF i-1 auf den Stapel geschoben wird. Dies macht das Prüfen auf EOF einfach, indem es mit (oder "kleiner als" mit 0 verglichen wird .

In diesem Snippet wird auch verwendet ~, um das oberste Element des Stapels zu platzieren und zu verwerfen.

Länge 33 Schnipsel:

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

Bisher waren die meisten Snippets entweder relativ linear oder waren nur einfache Beispiele für die Funktionalität von> <>. Jetzt kann ich ein Beispiel geben, das zeigt, wie einfach es ist, den Programmfluss in> <> mit einem übersichtlichen Programm zu visualisieren.

Das Programm liest ein einzelnes ASCII-Zeichen ein und führt den 3x+1Algorithmus an seinem Codepunkt aus (in> <> sind Zeichen im Grunde genommen ganze Zahlen). Jeder Schritt des Algorithmus wird gedruckt, bis wir 1 drücken.

Hier ist eine Spur für die ersten Iterationen mit Eingabe a(Code-Punkt 97):

Bildbeschreibung hier eingeben

Länge 44 Snippet:

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

Ich habe nicht das Gefühl, dass ich dem pBefehl gerecht geworden bin , da ich ihn in Snippet Nr. 6 nur einmal verwendet habe. Hier ist also eine andere atoi-Funktion. Was ist cool an diesem? Das Programm schreibt den Ausdruck, der zur Berechnung der Zahl benötigt wird, während es die Eingabe liest!

Also für Eingabe wie 573, nachdem alle Zeichen gelesen wurden, sieht das Ende der dritten Zeile so aus \0a*5+a*7+a*3+, was 573 ergibt!

Auch hier wird erwartet, dass die Eingabe nur aus Ziffern besteht. Verfolge GIF hier .

Länge 74 Schnipsel:

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

Wenn Sie es geschafft haben, hierher zu kommen, stimmen Sie mir möglicherweise zu, wenn ich sage, dass dies ein sehr lesbares ROT13-Programm ist. Bei einem gegebenen Zeichen c1finden wir das erste Zeichen c2in AN[an{, so dass c1 < c2dann der entsprechende Offset durch Addieren / Subtrahieren von d(13) angewendet wird . Beachten Sie, dass [und {die Zeichen direkt nach Zbzw. zsind.

Probieren Sie es in der Konsole aus und beobachten Sie, wie sich die Buchstaben während der Eingabe verwandeln!

(Sie können auch eine Pipe in die Eingabe einfügen, aber da mir die EOF-Prüfung fehlt, wird :0(?;sie mit einem Fehler beendet, wenn versucht wird, -1 als Zeichen zu drucken.)


Eine Idee für das 13-Snippet: i:d=?v NEWLINE o;!?l<- druckt die Eingabezeile rückwärts
tomsmeding

12
Ich wünschte, ich könnte diesbezüglich mehr Stimmen abgeben. Ich bin jetzt inspiriert, zu lernen> <> ...
Robobenklein

6
+1 für oben anfangen und runter gehen (und auch nur, weil es Spaß macht zu lesen).
mbomb007

5
@ mbomb007 es ist jedoch eine Schande, dass die Bestellung nicht nach links / rechts verschoben werden kann und am Ende der Seite steht: P
krs013 30.01.15

Ihre Länge 8 Schnipsel wäre ein wahres Quine, wenn Sie something smells fishy...in der nächsten Zeile schreiben .
wizzwizz4

148

C - bearbeiten

Danke für die Stimmen! Im Vergleich zu anderen Sprachen und dem, was sie in begrenzten Bytes können, sieht C veraltet, pingelig und zu abhängig vom Entwickler aus. In vielerlei Hinsicht ist es so: Skriptsprachen und höherwertige Sprachen mit automatischer Speicherverwaltung sind aussagekräftiger und schneller in der Produktion als C es jemals sein wird.

Warum also Feature C?

Das verborgene Geheimnis hinter all diesen Skriptsprachen ist, dass die Interpreter wahrscheinlich in C (oder neuerdings C ++ oder Java) geschrieben sind. Die ersten C ++ - Compiler, die tatsächlich zu C-Code kompiliert wurden. Bis es einen Markt für einen direkten Compiler gibt, ist es in der Regel kostengünstiger, einen Compiler zu schreiben, um C zu generieren, und diesen dann zu kompilieren.

Wenn Sie auf sehr kleinen Plattformen arbeiten, möglicherweise sogar ohne ein verfügbares Betriebssystem, arbeiten Sie wahrscheinlich in C. Heutzutage ist in fast jeder Appliance ein Mikrocontroller integriert, der zweifellos in C programmiert ist klein und schnell, C ist der richtige Weg. (Auch für die Masochisten.)

Wenn Sie C kennen, sind Sie dem Metall so nahe wie möglich, ohne in Assembler einzusteigen, und können auch in anderen Sprachen arbeiten. Sie haben eine gute Vorstellung davon, wie eine virtuelle C ++ - Funktion wahrscheinlich funktioniert. Wenn Sie diese rekursiven Pass-by-Value-Funktionen in PHP schreiben, wissen Sie, dass sie intern viel Speicherzuweisung und -kopie erfordern. Sie probieren daher instinktiv Pass-by-Reference aus. Rückrufe und Referenzen machen C-Entwicklern nichts aus, vielleicht tut Haskell das aber auch.

Wie Kernighan und Ritchie in ihrem Vorwort zur klassischen Programmiersprache C , 2. Auflage, erwähnt haben, ist C keine große Sprache und wird von einem großen Buch nicht gut bedient. Ich versuche diesen Rat zu befolgen: Beispiele tun doppelte, dreifache oder mehr Pflicht, wenn möglich.

Alle Snippets sind zumindest für sich kompilierbar. Diejenigen, die verlinkt und ausführbar sind, sind als solche gekennzeichnet. Ich weiß, dass dies keine Voraussetzung ist, aber es ist einfacher, als das Framework zu erklären, das erforderlich ist, damit ein Code-Snippet funktioniert.

Ich habe auch versucht, sicherzustellen, dass jedes Code-Snippet so kurz wie möglich ist, damit ich keine zusätzlichen Leerzeichen einfüge, nur um es auf eine bestimmte Länge abzufüllen. In Fällen, in denen Code eingerückt ist, sind die Einrückungen nicht in der Länge enthalten, sondern nur ein Zeichen für jede neue Zeile.

Factoid

C rockt.

Länge 0 Snippet

Das kürzeste sich selbst reproduzierende Programm der Welt http://www.ioccc.org/1994/smr.hint

Länge 1 Snippet

;

C unterscheidet zwischen Übersetzen und Verknüpfen. Viele Entitäten in C werden erst später kompiliert und verknüpft - ein Beispiel sind alle statischen und dynamischen Bibliotheken.

Andere Entitäten sind nur enthalten und generieren selbst keinen Code.

Das obige Semikolon wird sicherlich in Objektcode kompiliert und nichts tun!

Länge 2 Schnipsel

x;

C, eine ältere Programmiersprache, hat mehrere Iterationen durchlaufen. Die früheste weit verbreitete Anwendung wurde von Kernighan und Ritchie entwickelt und mit K & R abgekürzt. K & R C ist bekannt dafür, viele Annahmen über Ihren Code zu treffen, wenn Sie diese nicht explizit angeben.

Insbesondere wird in K & R C angenommen, dass der obige Code eine globale Ganzzahl ist, die xmit 0 initialisiert ist. Wenn Sie ihn im K & R-Modus kompilieren, wird eine Objektdatei erstellt, die ein beliebiges Programm bereitstellt, das diese Variable für die Verwendung damit verknüpft.

Länge 3 Schnipsel

??/

C ist so weit verbreitet, dass es Kompatibilitätsfunktionen für Systeme bereitstellen muss, die nicht alle verwendeten Zeichen enthalten. Das obige ist ein Trigraph für den Backslash, der in C als Zeilenfortsetzungszeichen verwendet wird. Das obige wird kompiliert, wahrscheinlich mit einer Warnung, dass keine Zeile folgt.

Eine gängige Kultur in C ist das Ignorieren von Kompilierungswarnungen, und viele große Codebasen haben beim Erstellen ausnahmslos einige oder mehr Warnungen.

Länge 4 Schnipsel

f();

Wiederum wird bei K & R das Obige "ausgefüllt", um beim Kompilieren zu bedeuten, dass "es bei globaler Verknüpfung eine Funktion gibt f, die später bereitgestellt wird und eine feste, aber nicht spezifizierte Anzahl von Argumenten annimmt und eine ganze Zahl zurückgibt".

Beachten Sie die grundsätzlichen Unterschiede zu f;.

Länge 5 Schnipsel

s="";

K & R C ist bekannt dafür, dass es wirklich verzeiht. Beim Kompilieren liefert dieser Code eine Ganzzahl sfür die globale Verknüpfung, die mit der Startadresse einer leeren Zeichenfolge initialisiert wird (glaube ich). K & R handhabt alle Zwänge, einschließlich Abschneiden, wenn eine Ganzzahl nicht groß genug ist, um die Adresse zu halten.

Es sind Konstrukte wie diese, die viele schwer zu findende Bugs hervorgebracht und viele Inspirationen für IOCCC-Wettbewerbe geliefert haben.

Länge 6 Schnipsel

o=042;

Eine ganze Reihe von Oldtimern, eine führende 0 in einer Literalzahl, bedeutet, dass sich die folgenden Ziffern in der Oktalbasis befinden. Der obige Code liefert beim Kompilieren eine Ganzzahl ofür die globale Verknüpfung, die auf Dezimal 34 initialisiert ist.

Diese Funktion von C hat viele Entwickler gebissen, die sich bemühen, ihre Zahlen aufzufüllen, damit sie schön und gleichmäßig aneinandergereiht sind!

Länge 7 Schnipsel

f(){f;}

Der obige Code ist eine Funktion mit einem Körper. Aber was macht es? Es ruft die Adresse der Funktion ab und tut nichts damit! In der Regel ist nicht definiert, was die Funktion zurückgibt. Unsinniger Code wie dieser kann oft ohne Vorwarnung kompiliert werden.

Länge 8 Schnipsel

main(){}

Dies ist der kürzeste kompilierbare und verknüpfbare Code in C. Während in modernen Versionen von C Funktionen normalerweise nicht implizit definiert werden können, wird diese Einschränkung aus historischen Gründen gelockert main.

Dieses Wunderwerk eines Programms, das nur 0 zurückgibt, wird auf eine nicht zu vernachlässigende Größe kompiliert und in verschiedene C-Laufzeitroutinen eingebunden. Sie können die Ausführlichkeitsstufe auf "Voll" setzen und verknüpfen, um zu sehen, was unter der Haube vor sich geht.

Länge 9 Schnipsel

#define Z

Eine Hauptstütze von C-Header-Dateien ist die #definePräprozessor-Direktive. C-Programme werden in verschiedenen Phasen kompiliert, und in einer dieser Phasen werden diese Definitionen durch ihre tatsächlichen Werte ersetzt.

Wenn ein Argument fehlt, wird C implizieren 1, so dass das Obige ersetzen würde, 1wo Zimmer im Quellcode verwendet wird.

Das oben Genannte wird normalerweise in eine Header-Datei und #includenach Bedarf in d gestellt.

Länge 10 Schnipsel

enum{P,Q};

Das enumSchlüsselwort bietet eine manchmal typsichere Möglichkeit, eine Reihe von Konstanten zu definieren. Wie bei Defines werden sie häufig in Header-Dateien verwendet. Wenn der obige Code enthalten ist, wird er Pals Ganzzahl von 0 und Q1 definiert.

Länge 11 Schnipsel

volatile v;

Das volatileSchlüsselwort soll den Compiler darüber informieren, dass eine Variable von anderen Agenten geändert werden kann, und nicht davon ausgehen, dass sie zwischen den Zugriffen konstant bleibt.

Länge 12 Schnipsel

#pragma once

#pragma once ist eine nicht standardmäßige, aber allgemein unterstützte Präprozessor-Direktive, die angibt, dass die aktuelle Quelldatei nur einmal in einer einzelnen Kompilation enthalten sein soll.

Die traditionelle und vollständig unterstützte Technik besteht darin, #includeSchutzvorrichtungen mit den Nachteilen von hinzugefügtem Code und möglichen Namenskonflikten zu verwenden.

Länge 13 Schnipsel

w(){for(;;);}

In C gibt es zahlreiche Konventionen. Eine davon ist die Darstellung von Endlosschleifen. In diesem Fall for(;;)bedeutet dies keine Initialisierung, keine Exit-Prüfung, die standardmäßig 1 bedeutet, dass sie wahr ist, dh nicht unterbrochen wird, und keinen Schleifencode.

Manchmal ist es möglich, alles innerhalb ()der Schleife zu tun, und die Schleife selbst braucht keinen Körper. In diesem Fall wird am Ende ein Dummy-Semikolon hinzugefügt.

Im obigen Code wird beim Kompilieren eine Funktion bereitgestellt, die in eine enge Busy-Schleife eintritt - eine der No-Nos im Software-Design - und niemals zurückkehrt.

Länge 14 Schnipsel

int a[]={1,2};

Arrays in C benötigen nicht die angegebenen Längen. Die leeren eckigen Klammern []weisen den Compiler an, "es selbst herauszufinden". Im Gegensatz zu anderen Sprachen gibt es in C jedoch keine integrierte Möglichkeit, den Zugriff auf ein Array außerhalb dieser Grenzen zu verhindern, was zu der Metapher "Erschieß dich selbst im Fuß" führt, für die C bekannt ist.

Der obige Code liefert beim Kompilieren ein globales veränderbares Array avon zwei mit 1 und 2 initialisierten Ganzzahlen.

Länge 15 Schnipsel

const long k=7;

Der constSpecifer ist eine spätere Ergänzung zu C, die von C ++ entlehnt wurde. Eine häufig gestellte Interviewfrage lautet: "Ist es sinnvoll, eine Variable als zu definieren volatile const?". constzusammen mit enumund inlinesollen die Abhängigkeit verringern, auf #definedie Probleme mit der Typensicherheit zurückzuführen sind.

Länge 16 Schnipsel

extern void **q;

externwird verwendet, um anzuzeigen, dass eine Variable an einer anderen Stelle deklariert wird. Der void *Typ ist der generische Standardtyp in C, dh er muss nicht explizit in Zuweisungsanweisungen umgewandelt werden. Die **Operatorsequenz bedeutet Zeiger auf einen Zeiger, der Neulinge oft in den Bann zieht, aber vollkommen gültig ist und häufig verwendet wird.

Länge 17 Schnipsel

double d=4/3-1/3;

Wenn Sie das Obige ausdrucken würden, wäre das Ergebnis eins, und Sie würden denken, super! Wechseln zu double d=4/3-2/3;und wie lautet die Antwort? Es ist immer noch einer! C verwendet eine Ganzzahlarithmetik, um 4/3 → 1 und 2/3 → 0 und 1 - 0 → 1 zu berechnen!

Länge 18 Schnipsel

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

Schließlich kommen wir zu einem Code, der tatsächlich etwas bewirkt! putsist ein Favorit von C-Golfern, da für die Verwendung keine Header-Datei erforderlich ist.

putsfügt dem Ausgang auch einen Zeilenvorschub hinzu. Umgekehrt wird sein Gegenstück getsZeilenvorschübe entfernen. Man sollte es getsnur unter sehr kontrollierten Umständen verwenden - es bietet keinen Schutz vor Pufferüberläufen und ist die Hauptursache für viele Exploits.

Länge 19 Schnipsel

#include <stdlib.h>

Das Einfügen von Header-Dateien ist häufig eine persönliche Signatur der Entwickler. Viele enthalten libund iounabhängig davon, ob sie benötigt werden. Einige ordnen die Header-Dateien so an, dass die Längen zunehmen oder abnehmen. Die meisten <>davor gestellt "". Persönlich habe ich diese Signatur in meinen TA-Tagen verwendet, um zu überprüfen, ob Schüler betrogen haben: Dieselbe Header-Signatur? Schau genauer hin!

Länge 20 Schnipsel

char*p=(char*)0x300;

C ist für den Einsatz auf sehr niedrigen rudimentären Plattformen ausgelegt. In einigen Fällen müssen Sie möglicherweise direkt auf spezielle Speicheranschlüsse zugreifen.

Im obigen Code ist die Adresse eines Ports als hexadezimal 300 definiert. Sie können auf den Wert des Ports zugreifen, indem Sie *p, as in *p=0xff;, verwenden, um alle Bits einzuschalten oder v=*p;den aktuellen Wert abzurufen.

Länge 21 Schnipsel

int w=sizeof(double);

Der sizeofOperator gibt die Größe in Bytes eines Typs an. Bei Variablennamen werden die Klammern nicht benötigt, z double d;int w=sizeof d;.

Länge 22 Schnipsel

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

Die asmVerwendung wird vom Compiler festgelegt. Das Obige ist ein Beispiel für Linux-GCC-Inline-Code auf einer Intel-Plattform.

Das ursprüngliche Unix hatte einen kleinen, aber nicht zu vernachlässigenden Teil seines Codes in Assembler. Selbst heute, wenn Geschwindigkeit von größter Bedeutung ist und Portabilität absolut nicht, werden Sie feststellen, dass sie genutzt wird.

Auf kompatiblen Systemen wird der obige Code kompiliert und es handelt sich buchstäblich um eine isolierte Montageanleitung ohne herkömmliche Zugriffsmöglichkeit! BTW xor R,Rist eine gebräuchliche Assemblersprache zum schnellen Löschen eines Registers.

Länge 23 Schnipsel

union u{char c;int i;};

A unionbietet mindestens genügend Platz für das größte Element. Möglicherweise wird es zusammen mit verwendet void *, um in bestimmten Bibliotheken einen allgemeinen "undurchsichtigen" Typ bereitzustellen. In diesem Fall ist die Vereinigung normalerweise Teil einer größeren Struktur, wobei die Struktur ein Feld zum Identifizieren des Vereinigungstyps aufweist.

Länge 24 Schnipsel

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

Der ursprüngliche C-Kommentar wurde als begrenzt /* comment */und entlehnte das // comment to end of lineFormat von C ++.

Länge 25 Schnipsel

int main(void){return 1;}

Dies ist die konformere Version des obigen Längen-8-Snippets. Der Rückgabetyp und die Funktionstypen werden angegeben und es wird explizit ein Wert zurückgegeben.

Die Konvention in C besteht darin, einen Rückgabewert 0für Erfolg und 1Misserfolg zu verwenden, oder wenn Sie streng konform EXIT_SUCCESSund EXIT_FAILUREwie in definiert sein möchten stdlib.h.

Länge 26 Schnipsel

typedef struct{int x,y;}P;

typedefist äußerst nützlich, insbesondere typedef struct. In modernen Begriffen könnte man es "Objektorientierungslicht" nennen.

Nach dem Einbeziehen des Obigen kann der Code Pals regulärer Typ in Deklarationen und Funktionen verwendet werden, mit vollständiger Typprüfung. Im Gegensatz zu C ++ können Sie jedoch keine Operatoren wie +, * oder << definieren, daher "Objektorientierungslicht".

Länge 27 Schnipsel

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

C hat eine komfortable Makrosyntax #define.

Ein häufiger Anfängerfehler ist das Weglassen innerer und / oder äußerer Klammern, was zu schwer auffindbaren Fehlern bei der Rangfolge von Operatoren führt.

Länge 28 Schnipsel

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

C kann explizit Bitfelder definieren, die wie eine ganze Zahl zugewiesen und gelesen und manipuliert werden können.

Das Obige ist eine Annäherung an eine IEEE-Gleitkomma-Datenstruktur einfacher Breite.

Länge 36 Schnipsel

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

In vielen Sprachen müssen Sie sich nicht darum kümmern, wie Zahlen dargestellt werden. In C müssen Sie sich ihrer internen Repräsentation genau bewusst sein.

Das beste Beispiel dafür ist die Bestimmung, ob eine Ganzzahl eine Potenz von zwei {1, 2, 4, 8, ...} ist. Diejenigen, die nicht mit C vertraut sind, werden Schleifen und Verschiebungen und alle möglichen Dinge für die O (log (n)) - Laufzeit ausführen, nicht schlecht. Ich überlasse es dem Leser als Übung, um zu bestätigen, dass es funktioniert, aber es funktioniert wirklich ...

Die !!Konvention wird oft verwendet, um eine ganze Zahl von ungleich Null und Null auf 1 bzw. 0 zu zwingen. Viele C-Entwickler verwenden diese Art von Tricks gerne (oft im Widerspruch zu denen, die Wert auf Klarheit legen).

Sehr begeisterte C-Entwickler können bestätigen, dass das oben Genannte auf Hardware mit eigener Ergänzung und Signatur funktioniert. Für diejenigen, die sich fragen, sind Sie fast sicher, dass Sie gerade an Hardware mit zwei Komponenten arbeiten. Nur die wirklich glücklichen (oder unglücklichen, je nach Ihrer Perspektive) müssen sich darum kümmern!

Länge 48 Schnipsel

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

C99 unterstützt auch komplexe Zahlen. Wie Sie dem Code entnehmen können, hat er die Form eines Modifikators für einen realen Typ. Sie können es auch verwenden, int complex c=3+I*4;aber intern erzwingt es einen Gleitkommatyp. Der obige Code wird mit gcc kompiliert gcc -std=c99 -c length-48.c.

Wenn Sie mehr von den Interna sehen möchten, versuchen Sie, mit der Option -E zu kompilieren. Für meine Version von gcc wird die obige Erklärung double _Complex c=3.0+(__extension__ 1.0iF)*4.0;. Beachten Sie, dass der komplexe Typ eine bedeutende Erweiterung der Sprache darstellt, nicht nur einige wenige billige Makros.

Dies ist nur ein Vorgeschmack, wenn wir mehr als 125 Zeichen haben, können wir mit komplexen Zahlen richtig Spaß haben!

Länge 51 Schnipsel

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

Aus verschiedenen Gründen wird C nicht automatisch mit den mathematischen Standardfunktionen wie sin, cos, tan, sqrt usw. verknüpft. Wenn sie verwendet, aber nicht verknüpft werden, wird dem Entwickler der Linker-Fehler undefinierter Verweis auf angezeigt 'sqrt' oder ein anderer Fehler.

In gcc wird der obige Code mit compiliert und verlinkt gcc length-51.c -lm.

Note sin(3.2)gibt eine negative Zahl zurück, deren Quadratwurzel in der realen Domäne nicht zulässig ist. In C wird ein spezieller Wert NaNzurückgegeben, der auf diesen Fehler hinweist, den das Programm ignorieren kann!

In C99 gibt es viele neue Ausnahmebehandlungsfunktionen, die eine sehr sichere und differenzierte Kontrolle dieser Art von Rechenfehlern ermöglichen, die so gut wie niemand benutzt!

Länge 63 Schnipsel

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

Oder besser formatiert:

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

Wie Sie vielleicht erraten haben, handelt es sich um das Schlüsselwort, staticdas in C mehr als eine Bedeutung hat.

In den ersten beiden Fällen staticteilt der Compiler mit, dass Integer wund Funktion Xaußerhalb dieser Datei oder Kompilierungseinheit nicht sichtbar sind, dh sie sind intern.

Diese Funktionen sollen nicht extern aufgerufen werden, daher prüfen sie möglicherweise nicht die Argumente auf Gültigkeit und schneiden andere Ecken ab. Da sie über einen internen Bereich verfügen, können Sie sie neu definieren wund Xin anderen Dateien speichern. In der Regel sind sie getrennt.

Gibt im letzten Fall an, staticdass die Ganzzahl sihren Wert zwischen den Funktionsaufrufen beibehält. Das erste Mal Xaufgerufen wird, swird sein Anfangswert sein 7, wenn es mit Exklusiv-ODER verknüpft wird x, wird der neue Wert beibehalten.

Intern befindet sich, obwohl dies von der Implementierung abhängig ist, die übliche Speicherorganisation sauf dem Heap, insbesondere auf dem initialisierten Speicher, während sich das Argument xauf dem Stapel befindet. Wo sich Variablen befinden, ist wichtig, wenn Sie beispielsweise rekursive Algorithmen implementieren möchten.

Ein GOTCHA in C sind Kollisionen mit globalen Variablen. Bis wund Xsind tatsächlich definiert als static, wenn sie global irgendwo definiert sind, wund Xbeziehen sich stattdessen auf die globalen Entitäten.

Hier qund wmöglicherweise nicht auf denselben Wert initialisiert, da ein globaler Wert wzum Festlegen verwendet wird q:

static int q = w;
static int w;

Wenn es keine globale wgibt, sollte die Kompilierung fehlschlagen.

Hier qund wwird auf den gleichen Wert initialisiert:

static int w;
static int q = w;

In der Regel reduzieren Designer Namenskonflikte, indem sie ihren globalen Variablen und Funktionen ein eindeutiges Präfix oder Suffix hinzufügen.

In C99 statichat eine andere Verwendung gewonnen, int Y(int a[static 10]);was z. B. bedeutet, dass es eine Funktion gibt, Ydie ein Array von mindestens 10 ganzen Zahlen annimmt .

Länge 74 Schnipsel

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

Oder schön angelegt:

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

Das Schlüsselwort registergibt dem Compiler einen Hinweis, dass die Verwendung von Hardwareregistern hier von Vorteil wäre. Die obige Funktion kopiert lganze Zahlen von qnach p, wenn möglich unter Verwendung von Hardware-Registern.

Manchmal können die Beschleunigungen erheblich sein. In der 68K-Mikroprozessorfamilie *p++ = *q++könnte die Zeile beispielsweise in eine einzelne Anweisung im MOVE.W (Ap)+,(Aq)+Vergleich zu sechs oder acht übersetzt werden, wenn Sie sie nicht verwenden register. Der 68K-Mikroprozessor verfügte über explizite Post-Inkrement- und Pre-Dekrement-Modi, sodass der versierte Entwickler, wenn er die Plattform kannte, den Code mithilfe von x++und --ygegen ++xund anpassen würde y--.

Heutzutage ignorieren Compiler meistens register, außer dass sie nicht zulassen , dass Adressen von ihnen genommen werden (z. B. &lwürde dies einen Compilerfehler verursachen).

Länge 88 Schnipsel

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

Oder mit einem saneren Layout:

#include <stdio.h>

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

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

Ach, Rekursion! Das Snippet ist ein vollständiges Programm zum Kompilieren, Verknüpfen und Ausführen. Die Funktion fberechnet die Fakultät ihres Arguments xunter Verwendung der rekursiven Formel f (x) = x * f (x - 1). Factorials werden sehr schnell groß, so ist zum Beispiel f(12)der größte Wert, den Sie in einer 32-Bit-Ganzzahl mit Vorzeichen erhalten können.

Ein Beispiel für wirklich rekursiven Code finden Sie in naiven Implementierungen der Ackermann-Funktion .

Intelligente Compiler können die Funktion optimieren, indem sie den Hinweis verwenden inlineund die Funktion "ausrollen", wenn Konstanten als Argumente bereitgestellt werden, sodass:

f(12)

Wird:

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

Ohne Funktionsaufrufe!

Andere Compiler können die Funktion neu organisieren:

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

Und implementieren Sie eine sogenannte Schwanzrekursion. Dies ersetzt in der Tat den letzten Funktionsaufruf eines einfachen Goto und ermöglicht es dieser Funktion, sich mit der Rückgabe zu befassen. Der Vorteil ist weniger Stack-Thrashing, schnellerer und kleinerer Code.

In der Assemblersprache sind solche Optimierungsmöglichkeiten sehr leicht zu erkennen und können durch einen sogenannten "Schlüsselloch-Optimierer" implementiert werden, der im Grunde nach kleinen Mustern sucht und diese durch etwas Schnelleres und / oder Kleineres ersetzt.

Länge 117 Schnipsel

#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;}

Oder:

#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;
}

Das Konzept eines universellen I / O, das konsequent auf jedes Gerät angewendet werden konnte, ob Konsole, Lochkarte, Band, Diskette oder Drucker, aber in echter C-Form, ermöglichte es dem Entwickler, zu erstellen sehr knappe aber kraftvolle aussagen.

Im obigen Snippet werden Befehlszeileneingaben verwendet, zwei durch Leerzeichen, Tabulatoren oder Kommas getrennte Ganzzahlen analysiert und ausgegeben. Es nutzt einen neueren scanfBezeichner, %*[\t ,]der: [\t ,]alle Tabulatoren, Leerzeichen und Kommas herauszieht und: sie *ignoriert.

Ich erinnere mich, dass ich einen C ++ - Code überarbeitet habe, mit dem der Entwickler alles auf "reine" Weise mit C ++ gemacht hat, <<und ein Arsenal von Methoden wie findund substr. Es waren mindestens ein Dutzend Zeilen, und Kommas konnten immer noch nicht als Begrenzer verwendet werden. Ich habe den ganzen klobigen Code durch eine einzige sscanfZeile wie oben ersetzt!

Länge 132 Schnipsel

#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;}

Oder:

#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;
}

Die Funktionen printf, sprintf, fprintfusw. Verwendung Formatbezeich die Breite und die Polsterung der Ausgabe zu definieren.

Kompilieren Sie die obigen Anweisungen und führen Sie sie mit Befehlszeilenargumenten aus, um die verschiedenen Ausgaben anzuzeigen:

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

Beachten Sie, dass die .5Ausgabe für den Bezeichner auf höchstens fünf Zeichen begrenzt ist, während der 5Zeilenabstand mindestens fünf Zeichen umfasst, wobei -die Ausrichtung nach links angegeben wird. Wenn Sie sie kombinieren, wird die Ausgabe auf genau fünf Zeichen festgelegt.


4
Ich glaube nicht, dass es erforderlich war, für jede Aufwertung ein neues Faktoid hinzuzufügen :)
Optimierer

28
Eine gängige Kultur in C ist das Ignorieren von Kompilierungswarnungen . Ich glaube nicht, dass dies der Wahrheit nahe kommt!
Shahbaz

4
Wenn Sie ein großes Projekt haben und mehrere Compiler in Betracht ziehen, kann es ziemlich sinnlos sein, zu versuchen, alle Warnungen zu beseitigen.
Feersum

5
Dies ist ausgezeichnet
Kik

4
Ich bin ein C-Programmierer und habe keine Angst vor Haskell.
Shahbaz

138

x86-Maschinencode

Factoid:

x86-Computercode ist die zusammengestellte Version von x86-Assembly, die der Prozessor tatsächlich ausführt. Es wurde entwickelt, als Speicher und Speicherplatz teuer waren, und wurde so konzipiert, dass es bis zum Intel 8008 einigermaßen abwärtskompatibel ist. Ausführbaren Code klein zu halten war eines der Ziele, und es verwendet Anweisungen variabler Länge und eine CISC-Architektur , um zu helfen Dies zu erreichen (was den Nachteil hatte, dass es komplizierter wurde, die Leistung auf modernen Prozessoren zu verbessern). Zusammen mit dem einfachen Aufbau und dem Maschinencode im Allgemeinen bieten x86-Programme die Möglichkeit, äußerst kompakt zu sein.

Länge 1:

Nun zum ersten Programm:

0xC3

Öffnen Sie einen Hex-Editor, geben Sie dieses Byte ein und speichern Sie es als test.com.

Sie haben jetzt ein gültiges MS-DOS-Programm, das sofort zurückkehrt, ohne etwas zu tun, da 0xC3 die Anweisung 'RET' ist. Dies zeigt jedoch einen weiteren interessanten Aspekt für das Golfen mit x86: das .com-Dateiformat. Dieses ausführbare Format hat absolut keinen Header - die Datei wird einfach ab Adresse 0x100 in den Speicher geladen, und die Ausführung wird dann bei 0x100 gestartet. Dies bedeutet, dass keine Bytes für Metadaten verschwendet werden!

Länge 2:

Unser nächstes Programm:

0x4D 0x5A

oder 'MZ' in ASCII.

Ok, ich habe ein bisschen geschummelt, das ist wirklich kein nützliches Programm, da es den Anweisungen entspricht

DEC     BP
POP     DX

Was eigentlich nicht nützlich ist, um ein .com-Programm zu starten. Tatsächlich ist das der springende Punkt dieser beiden Werte - mit ihnen sollte keine vernünftige .com-Datei beginnen! .com-Dateien waren auf eine Größe von 65280 Byte (64 KB - 0x100) beschränkt. Als größere Programme benötigt wurden, musste ein neues Format entwickelt werden. Dies war das EXE-Dateiformat, das einen Header enthält. MS-DOS musste jedoch die .com-Erweiterung für bestimmte Komponenten beibehalten, um die Abwärtskompatibilität zu gewährleisten. Daher musste ermittelt werden, ob es sich bei einer .com-Datei tatsächlich um eine EXE-Datei handelte. Sie wählten den Stich "MZ" als diese magische Zahl, und wenn Sie bis heute eine Windows-EXE-Datei (oder DLL-Datei) in einem Hex-Editor öffnen, werden Sie feststellen, dass sie mit diesen beiden Bytes beginnen. Es amüsiert mich, dass selbst das modernste Windows-Programm mit einer Kompatibilitätsbeschränkung aus den 70er Jahren beginnt.

Länge 3:

Nun zu einer Endlosschleife:

41 E2 FD

Welches übersetzt zu

start:
inc cx
loop start 

Dieses Programm erhöht den Wert von CX (zunächst> 0) und führt dann den Schleifenbefehl aus. Die Schleife ist ein hervorragendes Beispiel für einen CISC-Befehl, da sie drei einfache Operationen zu einer speziellen Operation kombiniert: Sie dekrementiert den Wert von CX, prüft, ob er 0 ist, und springt ansonsten zur Zielmarke. Es gibt auch Formen von Schleifen, die andere Flags prüfen und nicht nur enden, wenn CX 0 ist. Wir hätten einfach einen Sprungstart für eine 2-Byte-Endlosschleife machen können, aber das war interessanter.

Länge 4:

Ein Programm, das minimal nützlich ist:

40 CD 10 C3

Übersetzt in Baugruppe:

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

Dieses Programm setzt die Konsole auf 40x25 Zeichen, löscht den Bildschirm und kehrt zur Befehlszeile zurück. AX wird auf den gewünschten Videomodus eingestellt (1), dann wird der BIOS-Interrupt 10h aufgerufen, um den Videomodus tatsächlich einzustellen und das Fenster zu löschen, bevor zurückgekehrt wird. Erwarten Sie in Zukunft mehr von diesen BIOS-Interrupts.

Länge 5:

Wir können jetzt ein Pause-Programm implementieren:

B4 01 CD 21 C3

Übersetzt in Baugruppe:

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

Dieses Programm weist das BIOS an, auf das Drücken einer Taste zu warten und diese vor der Rückkehr auf dem Bildschirm anzuzeigen. Dies zeigt auch, wie auf dem x86 einige der Register teilweise gelesen oder geschrieben werden können. In diesem Fall setzen wir das oberste Byte von AX (AH) auf 1. Auf 32-Bit-Prozessoren können Sie auch die unteren 16 Bits bearbeiten, ohne die oberen 16 Bits zu beeinflussen. Diese Möglichkeit, Teilregister zu ändern, kann für Assembler-Programmierer nützlich sein, hat jedoch Nachteile für moderne Prozessoren, die versuchen, eine Ausführung außerhalb der Reihenfolge durchzuführen , da sie zu falschen Datenabhängigkeiten führen können.

Länge 9:

Nun zur eigentlichen Anzeige der Ausgabe:

68 00 B7 07 AB 40 79 FC C3

Übersetzt in Baugruppe:

; 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

Die Ausgabe ist der Standardzeichensatz, der in verschiedenen Farben wiederholt wird. Das Low-Byte von AX ist der Zeichencode, und das High-Byte gibt die zu verwendenden Farben an. Standardzeichensatz in verschiedenen Farben wiederholt

16-Bit-Programme konnten nur bis zu 64 KB direkt adressieren. Um dies zu umgehen, verwendete x86 "Segmente" - spezielle Register, die mit 16 multipliziert und allen Speicherzugriffen hinzugefügt wurden, um 20 Bits adressierbaren Speicher zu ergeben. Ein Programm könnte die Werte dieser Segmentregister ändern, um auf mehr Speicher zuzugreifen - oder auf spezielle Speicherbereiche: Dieses Programm ändert das zusätzliche Segment, um in den Videospeicher zu schreiben. Unterschiedliche Arten des Speicherzugriffs verwendeten unterschiedliche Segmentregister, sodass auf Code, Daten und den Stapel gleichzeitig in unterschiedlichen Speicherblöcken zugegriffen werden kann. Das Standardsegment könnte auch für viele Anweisungen überschrieben werden.

Länge 20:

Lassen Sie uns etwas erkennbar machen - wir werden "Regel 90" verwenden, um Sierpinski-Dreiecke zu zeichnen.

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

In Montage:

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

Beispielausgabe: Sierpinski-Dreiecke

Für dieses Programm verwenden wir den bekannten 'Mode 13' - einen Grafikmodus mit einer Auflösung von 320x200 bei 256 Farben. Es wurde von vielen beliebten DOS-Spielen wie Doom verwendet.

Länge 21

Mal sehen, wer die CPU hergestellt hat, auf der wir laufen.

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

Übersetzt in Baugruppe:

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

Beispielausgabe:

c:\misc>cpuid.com
GenuineIntel

Dieses Programm verwendet den CPUID-Befehl, um Informationen über den Prozessor abzurufen, auf dem es ausgeführt wird, insbesondere über die Herstelleridentifikationszeichenfolge. Die meisten Benutzer sehen "GenuineIntel" oder "AuthenticAMD", es sei denn, sie haben einen ungewöhnlichen CPU-Hersteller oder werden auf bestimmten virtuellen Maschinen ausgeführt.

Länge 26

Wir können jetzt interessante Animationen machen

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

In der Versammlung

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 

Und die Ausgabe wird so aussehen:

Marching XOR

Die Funktion X pos ^ Y pos erzeugt ein interessantes Fraktal, besonders wenn es animiert ist

Länge 27

In einem kleinen x86-Programm können Sie nicht nur Text und Grafiken erstellen, sondern auch Sound und Musik:

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

In Montage:

    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  

Dieses Programm verwendet die Midi-Karte, um die Tastatur in ein Klavier zu verwandeln. Dazu wird die Midi-Karte in den UART-Modus versetzt, in dem MIDI-Noten abgespielt werden, sobald sie empfangen werden. Als nächstes wartet das Programm auf das Drücken eines Zeichens und gibt den ASCII-Wert als Notiz auf die Midi-Karte aus. Das Programm wird solange ausgeführt, bis die Escape-Taste gedrückt wird.

Länge 29

Verwenden wir ein iteriertes Funktionssystem , um ein Dragon Curve-Fraktal zu generieren:

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

Übersetzt in Baugruppe:

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  

Ausgabe:

Drachenkurve

Durch Drücken einer Nicht-Steuertaste wird das Programm beendet. Dies basiert auf Fire Coral von Desire auf Pouet.net.

Länge 52

Bei diesem Programm handelt es sich um eine Art Doppelfunktion. Es zeigt einen Teil des x87-Gleitkomma-Co-Prozessors und selbstmodifizierenden Code.

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

Beim Ausführen gibt das Programm mehrere mathematische Konstanten aus:

1.00000000000000000
3.32192809488736235
1.44269504088896341
3.14159265358979324
0.30102999566398120
0.69314718055994531
0.00000000000000000

Dies sind Eins, Log2 (10), Log2 (e), Pi, Log10 (2), Loge (2) und Null.

In Montage:

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

Gleitkomma-Berechnungen auf x86-Systemen wurden ursprünglich vom optionalen x87-Coprozessor ausgeführt. Erst mit dem 486 wurde er auf denselben Chip verschoben. Das x87 hatte auch eine andere Architektur, es war stapelbasiert, mit 8 verfügbaren 80-Bit-Registern. Es gab auch eine Vielzahl von Rundungsmodi, Genauigkeit und maskierbaren Ausnahmen, die eingestellt werden konnten.

Dieses Programm druckt die Werte für sieben in die Prozessoren eingebrannte Konstanten. Es mag merkwürdig erscheinen, dass Befehlsspeicherplatz für einfache Konstanten wie 0 und 1 verschwendet wird. Beachten Sie jedoch, dass der Befehlssatz erstellt wurde, als der Speicher klein war, und diese Befehle normalerweise 2 Byte kleiner als entsprechende Operationen sind. Das Programm verwendet auch eine obskure Anweisung, FBSTP - "Store BCD Integer and Pop". Als der x86 entwickelt wurde, waren Operationen mit BCD- Nummern häufiger und der x86 / x87 verfügt über mehrere Anweisungen, um die BCD-Mathematik zu vereinfachen, wie beispielsweise die AAM-Anweisung 'ASCII Adjust for Multiple', die auch im Programm verwendet wird.

In dem ungeschützten Speichermodell, das von früheren x86-Programmen verwendet wird, gibt es keine Unterscheidung zwischen Daten und Code. Aus diesem Grund ist es einfach, die sequentiell codierten 'Load Constant'-Anweisungen zu durchlaufen, indem einfach der entsprechende Wert erhöht wird.

Länge 64

Wenn ich meinen Eintrag für die Mandelbrot-Herausforderung ankreuze , kann ein Programm geschrieben werden, das ein 320x200-Farb-Mandelbrot-Fraktal in nur 64 Bytes anzeigt.

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

In Montage:

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

Das Endergebnis ist dieses Bild:

Mandelbrot-Fraktal

Dieses Programm generiert das Fraktal mithilfe von Festkomma-Mathematik, da es weniger Bytes benötigt. Die untersten 6 Bits der 16-Bit-Register werden als Bruchteil der Zahl betrachtet, und die Werte werden nach der Multiplikation neu skaliert.


7
Von allen Sprachen, die auf PPCG zu sehen sind, habe ich das nicht erwartet.
Alex A.

23
Beeindruckend. Plus andere Zeichen, um dies zu kommentieren. Aber ernsthaft. Beeindruckend.
krs013

2
@Michael Edenfield Dafür ist DOSBox da!
Sir_Lagsalot

1
20 Byte Sierpinski ist sehr beeindruckend.
Qwr

1
Ich halte mich für einen guten Programmierer, aber wenn ich mir das ansehe, muss ich mich geschlagen geben.
Stephan Bijzitter

121

Haskell

Vielleicht möchten Sie von unten nach oben lesen. Manchmal beziehe ich mich auf niedrigere Schnipsel, aber niemals auf höhere, damit es das Verständnis erleichtert.

Leser, die Haskell nicht kennen: Bin ich klar? Wann bin ich nicht klar? Ich kann es nicht sagen.

Länge 86 Schnipsel

Eine faltbare Instanz für unsere Baumdatenstruktur (Snippet 23). Faltbar ist eine Typklasse - wie in einer Klasse (/ Gruppe) von Typen. Diese sind parallel zu Schnittstellen in Java. Sie verallgemeinern im Wesentlichen über Typen und vereinen Typen, die gemeinsame Eigenschaften haben. Zum Beispiel können sie zusammengefügt werden ( Monoid), Container ( Functor), als Text gedruckt werden ( Showwas wir bereits in der showFunktion kennengelernt haben ) und so weiter. Dieser vereinheitlicht Datentypen, die listenartig sind, indem sie über eine Liste iteriert oder zu einer Liste abgeflacht werden können.

In diesem Snippet definieren wir die Instanz durch Definieren foldr, wobei der Datentyp im Wesentlichen von rechts nach links durchlaufen wird. Jetzt können wir eine Reihe allgemeiner, vorab geschriebener Codes verwenden. Zuerst definieren wir eine Hilfsfunktion , einen Singleton Baum zu bekommen, die ganze Unordnung zu vermeiden: s a = N E a E. Jetzt:

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]

und so weiter.

Hier ist ein Bild von unserem Baum:

7
| \
3  5
    \
     8

Länge 70 Schnipsel

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

Dies ist ein Hauptsieb!

(Hinweis: /=ist was !=in anderen Sprachen)

Dies funktioniert, indem eine Funktion definiert wird, sievedie die Liste filtert und nur die Zahlen enthält, die nicht durch vorherige Primzahlen teilbar sind. Es wird rekursiv definiert - zu sievedefiniert als die Liste zu einem ersten Elemente zu trennen pund ein Schwanz, Filter aus der Schwanzvene beliebiger Zahl teilbar durch p, sievedas verbleibende Bit, befestigen pzu Beginn dieser, und zurück.

Auch hier arbeiten wir mit unendlichen Listen - aber die Berechnung wird mit der Zeit angehalten, solange Sie keine unendliche Anzahl von Primzahlen benötigen, um berechnet zu werden.

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

Länge 68 Schnipsel

Endlich ein Quin!

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

Wenn Sie dies zum ersten Mal lesen, denken Sie vielleicht, dass bei der Ausgabe dieses Quines die Anführungszeichen fehlen würden, und warum würden Sie einmal putStrund einmal schreiben print? Es klingt genauso.

In Haskell putStrist dies eine Funktion, die nur den Inhalt der Zeichenfolge ausgibt, die an stdout übergeben wird. printdruckt jedoch Dinge nach Standard. Ist print 4also gleichbedeutend mit putStr "4\n", ist aber putStr 4unsinnig - 4ist keine Zeichenfolge! Wenn also printein Wert abgerufen wird, wird er zuerst in eine Zeichenfolge konvertiert und anschließend gedruckt. Im Allgemeinen können Sie Dinge in Zeichenfolgen konvertieren, indem Sie die Art und Weise ermitteln, in der Sie sie in Code niederschreiben würden. Die Art und Weise, wie Sie die Zeichenfolge abcin eine Zeichenfolge in Haskell-Code schreiben würden, ist "abc"also print "abc"tatsächlich Ausdrucke "abc", nicht abc.

Wie glücklich ich bin, dass ich jetzt genug Stimmen habe, werde ich diese Dinge nicht spielen müssen

Länge 33 Schnipsel:

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

Das Wichtige ist, dass wir keine Schleife benutzt haben. Haskell macht keine Schleife. Haskell kehrt zurück. Haskell hat keine Loops. Es ist tiefer als das: Haskell hat nicht einmal Kontrollfluss . Wie, könnten Sie fragen? Nun, es braucht keine.

Weiter mit den Details. Dieses Programm gibt eine unendlich ansteigende Folge von Ganzzahlen aus, beginnend mit 0. goGibt sie beginnend mit ihrer Eingabe aus und mainruft sie dann auf 0.

doist eine spezielle syntaktische Kraft von Haskell. In diesem Szenario werden nur E / A-Aktionen kombiniert, genau wie in Beispiel >>22.

Länge 26 Snippet:

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

Dies definiert die mapFunktion, die wahrscheinlich jeder kennt foldr. Beachten Sie, dass mapder Computer , obwohl wir den Typ nicht deklariert haben , irgendwie weiß, dass der Typ ist (a -> b) -> [a] -> [b], dh eine Funktion von abis bund eine Liste von as geben eine Liste von bs zurück.

Woher wusste es das? ;-)

Länge 25 Schnipsel:

main=putStr"Hello World"

Die Standard Hallo Welt. Beachten Sie die Typen: mainhat Typ IO ()und putStrhat Typ String -> IO ()(eine Funktion von Zeichenfolgen bis zu E / A-Aktionen, die nichts zurückgeben).

Länge 23 Snippet:

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

Dies ist eine Standarddefinition eines Baums. Wie viel einfacher als all die Zeilen, die zum Definieren eines Baums in Java, C oder anderen Anwendungen erforderlich sind.

(siehe Snippet 10)

Lassen Sie es uns aufschlüsseln:

data- Diese Deklaration deklariert einen Datentyp. T a- Ein Baum, der Elemente vom Typ enthält a. Dies ist der Typ, den wir definieren. =- Jeder Wert von T aist einer der folgenden, durch ein Pipe getrennten Werte |. E- einer der möglichen Werte von T s- dem leeren Baum. N (T a) a (T a)- der andere mögliche Wert eines Baumes - ein Knoten. Jeder Knoten besteht aus dem linken Kind ( (T a)), dem Element ( a) und dem rechten Kind ( (T a)).

Länge 22 Schnipsel:

main=putStrLn"y">>main

Eine Haskell- yesFunktion. >>ist ein Operator, der zwei E / A-Aktionen kombiniert und sequenziert. Es hat Art von >> :: IO a -> IO b -> IO b.

mainwird von sich aus rekursiv definiert als die E / A-Aktion, die zuerst druckt "y"und dann tut, was auch immer sie mainselbst tut.

Länge 18 Schnipsel:

fix f=r where r=f r

Eine bessere Definition für fix. (Siehe Schnipsel 14.) Das Problem mit der ersten Definition, fix f = f(fix f)ist, dass jedes Mal , wenn wir nennen fix f fixRückrufe fix f, die erinnern fix f, endlose Kopien derselben Berechnung zu erzeugen. Diese Version behebt das Problem, indem r(result) als Ergebnis definiert wird. als solche f r = r,. Definieren wir also r = f r. Jetzt kehren wir zurück r.

Länge 17 Snippet:

f n=product[1..n]

Dies ist die funktionale Art, Fakultät zu definieren.

Länge 16 Snippet:

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

(\x -> x + x + x)ist ein Lambda (jemand dachte, er \ähnelt dem Buchstaben).

(\x -> x + x + x) nwird das Lambda angewendet n(das ist genau das gleiche wie n + n + n).

fist die Multiplikation mit drei (auch f = (*3))

Länge 15 Schnipsel:

sum=foldl (+) 0

Dies definiert die sumFunktion unter Verwendung einer Falte. Eine Falte ist im Grunde eine Schleife über die Elemente einer Liste mit einem Akkumulator.
foldlNimmt als Argumente eine Funktion fund einen Anfangswert xfür den Akkumulator und eine Liste xs. Die Funktion fsollte als Eingabe den vorherigen Akkumulatorwert und den aktuellen Wert der Liste erhalten und gibt den nächsten Akkumulator zurück.
Dann iteriert die Falte auf den Listenwerten, die fauf den vorherigen Akkumulator angewendet werden, und gibt dann den letzten Akkumulator zurück.

Eine andere Art, über Falten nachzudenken, ist wie das Einfügen von Falten fzwischen die Listenwerte und mit dem Anfangsakkumulator auf einer der Seiten. Wertet zum Beispiel foldl (*) 1 [4,2,5]zu aus 1 * 4 * 2 * 5.

Länge 14 Snippet:

fix f=f(fix f)

Der yKombinator. Es wird normalerweise benannt, fixweil es den Fixpunkt der Gleichung findet f x = x. Beachten Sie, dass x = infinite loopdies manchmal auch eine Lösung sein kann, sodass fix (\x -> x^2 + 5*x + 7)die Gleichung nicht gelöst wird, x^2 + 4*x + 7 = 0sondern stattdessen eine Endlosschleife zurückgegeben wird.

Möglicherweise stellen Sie auch fest, dass dies x = infinite loopaufgrund von Haskells Faulheit nicht immer eine Lösung ist.

Diese Version ist ein Zeit- und Raumleck; wir werden es in einem längeren Ausschnitt neu definieren.

Länge 13 Schnipsel:

f=sum.map(^2)

Dies definiert die Funktion f , mit der eine Liste die Summe ihrer Quadrate zurückgibt. Es ist die Funktion Zusammensetzung der Funktion sum und die Funktionmap(^2) , die wiederum die ist Funktion map der angelegte Funktion (^2) (die quadratische Funktion ), die wiederum ein Ausschnitt aus der Funktion ^ (Schnitte wurden eingeführt in Schnipsel 2, und die Zusammensetzung bei Schnipseln 3 ).

Wie Sie sehen, sind Funktionen in einer funktionalen Sprache wie Haskell sehr wichtig . Tatsächlich wurde gesagt, dass Haskell die Sprache mit den meisten Standardbibliotheksfunktionen ist, die Funktionen als Eingaben erhalten oder Funktionen als Ausgaben zurückgeben (dies ist allgemein als Funktion höherer Ordnung bekannt) .

Durch die Art und Weise, alle zwei oder mehr Argument-Technisch Funktion ist eine Funktion , die zurückgibt Funktionen als Ausgänge (dies wird currying genannt).

Länge 10 Schnipsel:

data B=T|F

Dies ist eine Definition von Haskell-Booleschen Werten mit unterschiedlichen Namen. Der Boolesche Typ heißt B.
Diese Definition führt zwei Konstruktoren ein: true ( T) und false ( F).
Dieser Code - Schnipsel sagt den Compiler , dass jeder boolean ( B) ist entweder wahr ( T) oder falsch ( F), oder in anderen Worten B=T|F.

Tatsächlich können alle Datentypen in Haskell definiert werden, wenn in anderen Sprachen die Datentypen number, references und array vom Compiler besonders unterstützt werden müssen. In der Praxis gibt es in Haskell eine spezielle Unterstützung, da dies ansonsten sehr unpraktisch wäre, der BoolDatentyp jedoch beispielsweise vollständig in der Sprache definiert ist.

Länge 9 Snippet:

main=main

Dieses unsinnige Programm wird mainals Hauptprogramm definiert . Da Haskell faul ist, können Werte, für deren Auswertung eine Endlosschleife erforderlich wäre, frei verwendet werden, wenn wir ihren tatsächlichen Wert nicht verwenden. Solche Werte, die wie unsere Endlosschleifen enthalten main, werden "Bottoms" genannt.

Eine lustige Tatsache ist, dass der GHC Haskell-Compiler diese Art von Endlosschleifen erkennen und beim Ausführen eine abfangbare (!) Ausnahme auslösen kann.

Länge 8 Schnipsel:

f(x:_)=x

Dies definiert die Funktion f, die bei einer nicht leeren Liste ihren Kopf zurückgibt.

Muster in Haskell ähneln der Python-Sequenz, die entpackt wird, sind jedoch für alle Typen verallgemeinert. Muster können einen Wert entweder ablehnen oder mit ihm übereinstimmen und, wenn sie übereinstimmen, Variablen an Werte binden.

Die Muster in diesem Snippet sind:

  • _: das Muster, das zu etwas passt und keine Variable bindet.
  • x: das Muster, das etwas bindet und an die Variable bindet x.
  • :: Dieses Muster wird zu Kindermustern, dh einem für den Kopf und einem für den Schwanz. Wenn die Liste nicht leer ist, werden sie mit dem Kopf und dem Schwanz abgeglichen.

Der Mustervergleich ist stark verallgemeinert. Wenn Sie nur neue Datentypen definieren, werden automatisch Muster für die Arbeit mit ihnen eingefügt.

Länge 5 Schnipsel:

x=2:x

Whoa, es gibt so viel zu erklären.

Erstens ist Haskell faul. Dies bedeutet, dass Unterausdrücke nur dann ausgewertet werden, wenn dies unbedingt erforderlich ist.

Hinweis: Dieses Code-Snippet zeigt keine Zuordnung, sondern eine Definition. Haskell hat keine Zuordnung.

Dieses Code-Snippet definiert xeine unendliche Liste, die vollständig aus besteht 2. Normalerweise müssen andere Sprachen xbewertet werden, bevor 2:xsie überhaupt bewertet werden können, aber in Haskell können wir dies tun.

Unendliche Haskell-Listen sind eine Art Mischung aus Iteratoren und regulären verknüpften Listen: Sie verhalten sich wie beides (eine Iteration über einen Bereich benötigt beispielsweise konstanten Speicher).

Länge 4 Schnipsel:

2:[]

Dieses Snippet codiert nur die Singleton-Liste [2]. :ist der Cons- Operator in Haskell. Tatsächlich ist die reguläre Listensyntax nur ein syntaktischer Zucker für den Cons-Operator und das leere Listenliteral. Dies ist eng verbunden mit dem Umgang von Haskell mit Pattern Matching und Datentypen (insbesondere dem Konstruktorkonzept).

Länge 3 Snippet:

f.g

.Steht in Haskell für Funktionskomposition. Haskell kann in einem "punktfreien" Stil geschrieben werden, der dadurch gekennzeichnet ist, dass Funktionsargumente nicht benannt werden und stattdessen der .Operator zum Manipulieren des Datenflusses verwendet wird.

Länge 2 Snippet:

1-

Wenn dieser Code (aus syntaktischen Gründen) in Klammern steht, wird er als "Abschnitt" bezeichnet. Es ist dann eine Funktion, die bei einer bestimmten Zahl die leere Stelle "ausfüllt" und eins minus dieser Zahl zurückgibt. Dieser Begriff ist manchmal in einer funktionalen Sprache wie Haskell nützlich, wo sonst ein Lambda benötigt würde.

Länge 1 Snippet:

1

In Haskell, 1kann sowohl eine sein Int, Float, Double, Wordund so weiter. Tatsächlich können Sie Code schreiben, um eine Version eines 1beliebigen Typs zu definieren und frei zu verwenden.
Dies geschieht auch in JavaScript, Python usw., im Gegensatz zu diesen jedoch mit vollständiger Typensicherheit.

factoid:

Ursprünglich beabsichtigte das Haskell-Komitee, die Sprache nach Haskell B. Currys Namen "Curry" zu nennen, beschloss jedoch, den Namen in Haskell zu ändern, da möglicherweise Wortspiele auftreten. Erst später bemerkten sie Haskells Ähnlichkeit mit "Pascal" und "Hassle"!


Ich weiß nicht, ob ich das Faktoid durch die Tatsache ersetzen soll, dass Haskell die meisten Funktionen / Operatoren in seiner Standardbibliothek hat, die Funktionen aus anderen Funktionen generieren (und das technisch jede zwei oder mehr Parameterfunktion eine solche ist). sollte ich?
stolzer Haskeller

Zeigen Sie es in einem Ausschnitt und fügen Sie es in die Erklärung ein.
Martin Ender

f=0:1:zipWith(+)f(tail f) -- 25 chars, eine Funktion, die eine träge berechnete Liste der Fibonacci-Zahlen zurückgibt.
Chamini2

ugh ich habe ein paar Schnipsel hinzugefügt und dann meinen Computer heruntergefahren
stolzer Haskeller 20.01.15

@ proudhaskeller Speichern op. Ich habe das noch nie persönlich gemacht, aber wenn Sie eine große Bearbeitung auf einmal vornehmen müssen, können Sie die Bearbeitung in einem externen Dokument mit Speichern ausführen und sie dann einfügen, wenn sie abgeschlossen ist.
mbomb007,

99

C #

C # ist eine unterhaltsame, verrückte Mischung aus Funktionen aus Java, C, Haskell, SQL und vielen anderen Sprachen und bietet eine Menge wirklich netter Funktionen und APIs. Es ist hier auch bekannt dafür, dass es ziemlich wortreich ist, aber wir werden sehen, was wir tun können!

Ich ignoriere das übliche erforderliche Boilerplate:

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

Länge 1:

;

Befehle werden in C # mit Semikolons abgeschlossen! Eine leere Zeile ist eine absolut gültige Syntax.

Länge 5:

x=5f;

Wenn Sie in C # Literalzahlen angeben, geht der Compiler davon aus, dass es sich um Ints oder Doubles handelt (je nachdem, ob sie einen Dezimalpunkt haben). Wenn Sie einen wörtlichen Gleitkommawert verwenden möchten, müssen Sie diesen durch Anhängen von 'f' an die Zahl angeben. Andernfalls wird er zur Laufzeit mit geringen Kosten umgewandelt.

Länge 7 (Bytes):

s=@"
";

Wenn Sie einem String-Literal ein @ -Zeichen voranstellen, wird es zu einem "wörtlichen" String-Literal. Normale String-Literale analysieren Escape-Sequenzen wie '\ n' in Sonderzeichen, wörtliche Literale hingegen nicht. So können Sie den umgekehrten Schrägstrich verwenden, ohne ihn zu maskieren. Sie können auch Zeilenumbrüche enthalten, wie gezeigt. Das könnte Ihnen ein paar Bytes im Golf ersparen oder Ihre mehrzeiligen String-Literale besser lesbar machen. Achten Sie einfach darauf, dass die Zeichenfolge Einrückungen enthält.

Länge 8:

()=>x=y;

Dieser Ausdruck ist eine anonyme Funktion. Es gibt ein Objekt vom Typ zurück Action, das umgangen und auch wie eine Funktion aufgerufen werden kann. Anonyme Funktionen erben den Gültigkeitsbereich, in dem sie deklariert wurden, und ziehen lokale Variablen in diesem Gültigkeitsbereich überall mit hin.

Länge 9:

(a)=>a.p;

Hier ist eine weitere anonyme Funktion, die einen Parameter und einen Rückgabewert verwendet. Der Ausdruck gibt ein Objekt vom Typ zurück Func(die Funktion selbst gibt den Typ von zurück a.p. Sie werden Funceine Menge verwenden, um eine Schnittstelle mit Linq herzustellen.

Länge 10:

enm.Any();

Dies ist unsere erste Einführung in Linq! Linq ist eine Reihe von Erweiterungsmethoden, die für jedes Objekt aufgerufen werden können, das eine Aufzählung enthält (Implementierung der IEnumerable-Schnittstelle) - wie Arrayund List. IEnumerable verwendet eine verzögerte Bewertung: Es geht die Sammlung einzeln durch, ohne etwas über die Sammlung als Ganzes zu wissen - es kann sogar unendlich sein!

Hier Anykommt es an - es wird zurückgegeben, truewenn die Aufzählung mindestens 1 Element enthält. Viel besser als die gesamte Länge zu berechnen.

Länge 11:

var a=1.5f;

Das varSchlüsselwort weist den Compiler an, den Typ von automatisch zu bestimmen a. aIn diesem Fall wird als eingegeben Single. Sehr praktisch für Code-Golf, da es bei weitem kürzer als fast jeder andere Typname ist, obwohl viele es nicht mögen, ihn im Seriencode zu verwenden.

Länge 15:

yield return 0;

Hier ist eine verrückte Aussage, mit der Sie vielleicht weniger vertraut sind. Sie wissen, dass Objekte durch Erben von IEnumerable aufgelistet werden können, aber wussten Sie, dass Funktionen aufgelistet werden können? Deklarieren Sie eine Funktion mit dem Rückgabetyp IEnumerableund geben Sie sie yield returnso oft ein, wie Sie möchten. Wenn Sie einen Enumerator für die Funktion erhalten, GetNextführt das Programm bei jedem Aufruf den gesamten Code bis zum nächsten aus yield return, gibt diesen Wert zurück und hält dann an, bis Sie ihn erneut erweitern. Mit yield breakbeenden Sie die Iteration.

Länge 16:

[Obsolete]int a;

Dieses Snippet zeigt ein Attribut. Ein Attribut ist eine Art Tag, mit dem Sie eine beliebige Deklaration in Ihrem Code versehen können. Einige weisen den Compiler an, bestimmte Dinge zu tun, z. B. diese, bei deren Aufruf eine veraltete Warnung ausgegeben wird a. Sie können Ihre eigenen erstellen, indem Sie erweitern Attribute, und Sie können sie mit Reflection abfragen (dazu später mehr). Sie können auf Meta gehen und einschränken, für welche Art von Deklarationen ein Attribut mit dem AttributeUsageAttribut verwendet werden kann.

Länge 17

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

Hier ist eine praktische Golfmethode. Wenn a Funcein Element der Aufzählung zuordnet c, boolgibt es die Anzahl der Elemente zurück, cfür die das Funczurückgegeben wird true. Viel schöner als eine Schleife zu schreiben.

Länge 18:

foreach(T t in c);

Dies ist eine For-Each-Schleife. Bei all dem Gerede über unzählige Dinge ist dies eine dringend benötigte Struktur. foreachist syntaktischer Zucker, der einen Enumerator für c(der aufzählbar sein muss) erstellt und jeweils ein Element durchläuft t. Sie können jedes einzelne Element ändern oder untersuchen. Wenn Sie jedoch die Auflistung selbst ändern, wird der Enumerator ungültig.

Länge 19

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

Dies ist Ihre Kartenfunktion für Fans der funktionalen Programmierung. Select ist eine praktische Möglichkeit, eine beliebige Konvertierung (definiert durch eine FuncÜbergabe) für jedes Element einer Aufzählung durchzuführen . Es gibt eine IEnumerable zurück, die die "konvertierten" Elemente ausspuckt, wenn Sie sie wiederholen.

Länge 21

Console.Write("Hi!");

Diese Zeile schreibt etwas Text in die Standardausgabe und ist wahrscheinlich einer der Hauptgründe, warum C # nicht oft zum Golfen verwendet wird!

Länge 23

typeof(T).GetMethods();

C # unterstützt eine sehr leistungsstarke Funktion namens Reflection. Mit Reflection können Sie die Struktur Ihres Codes zur Laufzeit untersuchen. Dieser Aufruf gibt beispielsweise ein Array aller Methoden des angegebenen Typs zurück. Sie können diese Methoden untersuchen, sie aufrufen oder sogar die Werte von Feldern und Eigenschaften ändern. Attribute (siehe Länge 16) sind eine gute Möglichkeit, Teile Ihres Codes für die Verwendung mit Reflection zu kennzeichnen.

Länge 25

from t in c select t.a/2;

Ist das SQL? Im C # -Code? Ziemlich knapp. Dieser Ausdruck macht dasselbe wie der bei Länge 19.

Länge 27

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

C # ist eine Garbage-Collected-Sprache. Dies bedeutet, dass jeder von Ihnen (mithilfe des newSchlüsselworts) zugewiesene Speicher automatisch freigegeben werden kann, solange keine Verweise darauf vorhanden sind. Dieser Code wird für immer glücklich ausgeführt, obwohl ich den erstellten Speicher niemals explizit freigebe. Die Müllabfuhr ist jedoch mit Kosten verbunden. Durchsuchen Sie das Internet, um weitere Informationen zu erhalten.

Länge 29

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

Enumerable.Rangeist eine potentiell nützliche Golffunktion. Es wird eine Struktur zurückgegeben, die aufgelistet werden kann, und jede Zahl wird in dem angegebenen Bereich in der angegebenen Reihenfolge ausgegeben. Der zweite Parameter ist eine Zählung, kein Index.

Länge 31

public int pr{get;private set;}

Hier können wir eine einfache 'Eigenschaft', ein OOP-Feature und ein weiteres Kennzeichen von C # zeigen. Wenn Sie jemals Java verwendet haben, haben Sie wahrscheinlich 'get'- und' set'-Methoden für ein Feld erstellt, um deren Zugriff zu trennen oder Code auszuführen, wenn er geändert wird. Nun, mit C # können Sie diesen Code direkt über dem Feld deklarieren und außerdem separate Zugriffsmodifikatoren für das Abrufen und Festlegen festlegen. Dieses spezielle Snippet erstellt automatisch einen Standard-Getter und Setter, macht den Setter jedoch privat.

Länge 32

public static void m(this T o){}

Dieses Snippet zeigt eine C # -Funktion, die sich gut für das API-Design eignet. Durch Anwenden des thisModifikators auf den ersten Parameter einer statischen Methode wird diese Methode zu einer "Erweiterungsmethode". Sobald dies deklariert ist, T.mkann es nun für jedes Objekt vom Typ T aufgerufen werden, als ob es tatsächlich eine Methode von T wäre. Dies kann verwendet werden, um einer vorhandenen Klasse neue Funktionen hinzuzufügen, ohne den Quellcode zu ändern oder sogar darauf zuzugreifen.

Länge 38

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

Diese Methode zeigt verschiedene Arten der Parameterübergabe, die Sie in C # haben können. Nicht geänderte Parameter werden als Wert übergeben . Mit Präfix versehene Parameter refwerden als Referenz übergeben: Sie können ihnen ein völlig neues Objekt zuweisen und sie werden es wieder aus der Methode entfernen. Parameter, denen das Präfix vorangestellt ist, outsind wie zusätzliche Rückgabewerte: Sie müssen ihnen in der Methode einen Wert zuweisen, und sie werden genau wie ref-Parameter zurückgegeben.

Länge 42

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

Mit dem neuen C # 6-Standard können Sie einige Zeichen einsparen, wenn Sie zusammengesetzte Zeichenfolgen mithilfe der Zeichenfolgeninterpolation ausgeben müssen. Mit dieser Funktion können Sie jeden Ausdruck in geschweiften Klammern in ein Zeichenfolgenliteral schreiben. Die Zeichenfolge wird zur Laufzeit automatisch mit den Werten dieser Ausdrücke zusammengesetzt.

Länge 48

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

Gerade genug Charaktere, um etwas mit einem tatsächlichen Zweck zu tun! Diese Methode verwendet einige der oben erläuterten Ideen, um eine unendliche Aufzählung zu erstellen, die einfach die ganzen Zahlen eins nach dem anderen zurückgibt, beginnend mit 0. Denken Sie daran, dass C # eine verzögerte Auswertung mit Aufzählungen verwendet, sodass eine unendliche Folge durchaus gültig ist - Sie können Iterieren Sie so viel von der Sequenz, wie Sie möchten, und brechen Sie jederzeit aus.

Länge 56

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

Hier ist ein weiteres Beispiel für eine 'Eigenschaft' (siehe Ausschnitt 31). Hier habe ich tatsächlich verschiedenes Code - Snippets für definiert getund setanstatt die automatisch diejenigen verwendet wie zuvor. In diesem Beispiel wird veranschaulicht, wie Sie eine Eigenschaft verwenden können, um den einer Variablen zugewiesenen Wert zu überprüfen. In diesem Fall darf der Wert nicht kleiner als 0 werden. Weitere nützliche Verwendungszwecke von Eigenschaften sind das Benachrichtigen eines Ereignisses, wenn ein Wert geändert wird, oder das Neuerstellen von zwischengespeicherten Werten das könnte auf diesem basieren.

Länge 65

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

Diese Funktion wird als implizite Besetzung bezeichnet. Es ist eine Art Erweiterungsmethode, da es sich um statischen Code handelt, der für eine bestimmte Klasse ausgeführt wird (siehe Snippet 32). Die implizite Umwandlung wird jedoch nicht durch Aufrufen verwendet - sie wird einfach durch Behandeln eines ProgramObjekts als Ganzzahl (z int i=new Program(). B. ) verwendet. Wenn Sie dies tun, wird das Objekt automatisch in den Typ konvertiert, als den Sie es verwenden, basierend auf dem Code in der impliziten Umwandlung. Nach der bewährten Methode sollten Sie dies nur tun, wenn durch die Konvertierung keine Informationen verloren gehen.


1
Mal sehen, was du mit diesen Charakteren
anfangen kannst

9
Ich würde sagen, es ist näher an Java als C, eigentlich
stolzer Haskeller

Zur Kenntnis genommen. Ich denke, wir haben fast genug, um ein bisschen Linq zu machen - heute Abend!
BMac

öffentlicher statischer impliziter Operator int (MyClass o) {return o.objVal;} // 65. Mit diesem Code ist diese Zeile gültig: MyClass o1 = new MyClass (10); int o2 = o1; // o2 ist jetzt 10. msdn.microsoft.com/en-us/library/85w54y0a.aspx
Zukki

Weitere Schnipsel bitte
Cyoce

98

Java


Länge 44 Schnipsel

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

Druck Hello, World!auf STDOUT.

Länge 43 Schnipsel

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

aenthält 10 Arrays, die jeweils 2 Arrays enthalten, die jeweils 7 Arrays enthalten, die jeweils 3 Arrays enthalten, die jeweils 5 floats enthalten .

Länge 42 Schnipsel

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

Ein komplettes Programm. Da alles in einem interfaceinhärent ist public, können wir das Wort publicaus der Hauptmethode weglassen .

Länge 36 Schnipsel

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

Ahat eine innere Klasse B. Dies bedeutet, dass wir eine Variable vom Typ deklarieren können A.B.

Aber Bist eine Unterklasse von A, was bedeutet, dass sie alle Methoden, Felder und inneren Klassen von hat A. Daher können wir uns auch auf den Typ beziehen B.B.

In diesem Code gehen wir noch einen Schritt weiter und geben Beine Instanzvariable vom Typ an B.B.B.

Die Moral: Das Befolgen heißer Fragen zu SO kann Ihnen viele interessante, wenn auch sinnlose Techniken beibringen.

Länge 35 Schnipsel

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

Wenn les sich um eine Liste von Zeichenfolgen handelt, gibt dies an, wie viele davon gleich sind "a".

Länge 34 Schnipsel

public static void main(String[]a)

Methodensignatur der Hauptmethode eines Programms. Nur noch 11 Zeichen und wir können ein komplettes Programm erstellen!

Länge 33 Schnipsel

enum D {NORTH, EAST, SOUTH, WEST}

NORTH, EAST, SOUTH, Und WESTsind alle Konstanten des Typs D.

Länge 32 Schnipsel

Files.readAllBytes("hello.txt");

Liest eine gesamte Datei und gibt einen byte[]Teil des Inhalts zurück.

Länge 31 Schnipsel

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

Entspricht "hi". Nützlich, wenn der "Schlüssel kaputt ist.

Länge 30 Schnipsel

new JFrame().setVisible(true);

Erstellt einen neuen sichtbaren Rahmen, in den Sie andere Komponenten einfügen können.

Länge 29 Schnipsel

throws ClassNotFoundException

Erzwingt, dass jede Methode, die dies aufruft, einen try- catchBlock verwendet oder den Fehler über den Stack weitergibt. Überprüfte Ausnahmen sind eine der umstrittensten Entscheidungen der Java-Designer.

Länge 28 Schnipsel

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

Diese Funktion wird nicht für immer ausgeführt. In der Tat dauert es auf einem typischen Computer weniger als eine Sekunde. Danke, Stapelüberlauf.

Länge 27 Schnipsel

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

Erstellt ein neues Array von Zeichenfolgen.

Länge 26 Schnipsel

Object.class.newInstance()

Erstellt eine neue Object.

Länge 25 Schnipsel

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

Vermeiden Sie am besten hartcodierte Konstanten. Dies ist eine objektorientierte Methode, um den Wert zu erhalten, 1ohne andere Konstanten als zu verwenden 0.

Länge 24 Schnipsel

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

Die Nachfolgerfunktion.

Länge 23 Schnipsel

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

Wenn les sich um eine Liste von Ganzzahlen handelt, werden alle durch 10 teilbaren Werte entfernt.

Länge 22 Schnipsel

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

Erstellt ein neues Array mit sieben Ganzzahlen und erhält das fünfte Element.

Länge 21 Schnipsel

Arrays.asList(2L,"a")

Erstellt eine ArrayList mit diesen Elementen.

Länge 20 Schnipsel

System.out.print(s);

Druckt s.

Länge 19 Schnipsel

import java.util.*;

Ermöglicht präzise Verwendung von Klassen wie List, Map, Scanner, Timer, und Random.

Länge 18 Schnipsel

Math.addExact(x,y)

Fügt zwei Ganzzahlen xund hinzu y. Wenn ein Überlauf auftritt, löst die Methode eine Ausnahme aus, anstatt eine falsche Antwort zu geben.

Länge 17 Schnipsel

Double.MIN_NORMAL

Der kleinste positive Wert von type double, wobei das führende Bit des Signifikanten 0 ist.

Länge 16 Schnipsel

System.in.read()

Liest ein einzelnes Zeichen von der Konsole.

Länge 15 Schnipsel

Long.reverse(x)

Kehrt die Bits in der Binärdarstellung von um x.

Länge 14 Schnipsel

int x=050+120;

xist jetzt 160, da alles, was mit beginnt, 0als oktal behandelt wird.

Länge 13 Schnipsel

private C(){}

Ein privater Konstruktor verhindert, dass andere Klassen ihn instanziieren. Dieses Muster wird unter anderem von den Klassen Systemund Mathverwendet. Ein privater Konstruktor kann auch verwendet werden, um das Singleton-Muster zu erzwingen.

Länge 12 Schnipsel

static class

Ermöglicht die Erstellung innerer Klassen ohne äußere Klasse - eine Lösung für ein Problem, mit dem viele Programmierer konfrontiert sind .

Länge 11 Schnipsel

throw null;

Es ist oft notwendig ein zu werfen NullPointerException, aber es ist auch ziemlich wortreich. Dies ist eine viel einfachere Alternative.

Länge 10 Schnipsel

int[]a,b[]

Definiert zwei Variablen: aund b. aist vom Typ int[]und bist vom Typ int[][].

Länge 9 Schnipsel

switch(x)

Geht an einen Ort, abhängig vom Wert von x.

Länge 8 Schnipsel

break a;

Bricht aus dem markierten Block aus a.

Länge 7 Schnipsel

goto x;

Das gotoSchlüsselwort ist in C, C ++ und Java reserviert. Wenn xes sich um ein Label handelt, sendet dieser Code das Programm an das entsprechende Label - in C und C ++. Aber es Java, es löst eine mysteriöse RuntimeException. Tatsächlich gibt es überhaupt keine Möglichkeit, das gotoSchlüsselwort in Java zu verwenden.

Länge 6 Schnipsel

\u003b

Beendet eine Anweisung. Java ist komisch .

Länge 5 Schnipsel

a-=-a

Verdoppelt sich adurch Subtrahieren der Negation.

Länge 4 Schnipsel

a&=b

Setzt den Wert von aauf bitweise und von aund b.

Länge 3 Schnipsel

...

Beliebige Anzahl von Argumenten, die in einem Array zusammengefasst sind.

Länge 2 Schnipsel

<>

Ermöglicht dem Compiler herauszufinden, welchen generischen Typ Sie wahrscheinlich meinen. Sehr un-Java-artig.

Länge 1 Snippet

@

Kennzeichnet eine Anmerkung, mit der zusätzliche Informationen zu Methoden und Klassen angezeigt werden können.

Factoid

In Java verursachen Endlosschleifen manchmal Compilerfehler. Beispielsweise kann die Schleife while(true);nicht beendet werden, ohne die Methode zu beenden, sodass jeder nachfolgende Code einen Fehler "Nicht erreichbare Anweisung" auslöst. Wie @Optimizer bereits sagte, werden nur einige Endlosschleifen auf diese Weise erfasst.


5
In Java verursachen Endlosschleifen keinen Compilerfehler. Es ist Ihre IDE, die sie erkennt und einen Fehler erzeugt. Java hat einfach ein Konzept für nicht erreichbare Anweisungen. Wenn Sie also etwas while(true);in Ihrem Code haben, wird bei jeder Eingabe nach dieser Zeile ein Kompilierungsfehler für die nicht erreichbare Anweisung ausgegeben. Die Logik hinter dem Erkennen solcher Anweisungen ist sehr streng, sodass nicht alle Endlosschleifen erkannt werden
Optimizer

4
Du wurdest gerade runtergestimmt, das heißt, du musst ein Snippet entfernen! ;) (Die Gegenstimme war für "Java is weird")
Simon Forsberg

1
Es scheint, dass das Snippet # 36 rekursiv ist und auf unbestimmte Zeit erweitert werden kann: Es wird class A{class B extends A{B.B.B.B.B.B.B b;}}immer noch kompiliert.
Natix

3
Upvoted, um Ihnen bei der Erstellung eines vollständigen Programms zu helfen;)
Durron597

1
But it Java, [goto] triggers a mysterious RuntimeExceptionFalsch. gotokompiliert nicht einmal.
Dorukayhan

93

Python

Beginnen Sie jetzt mit der neuesten Version! Um die Länge 30 beginnend mit der frühesten zuerst durchzulesen, gehen Sie zum Revisionsverlauf.

Wenn jemand Vorschläge hat, können Sie diese gerne kommentieren.

Länge 52:

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

Entnommen aus meinem Beitrag zur Fake Marquee Text Challenge. sund nmüssen vorab auf einen String und eine ganze Zahl gesetzt werden. Es ist eigentlich nicht gut funktioniert in dem freien Python 2 - Interpreter war ich mit, so dass ich hinzugefügt Klammern um (' '*n+s)[i:n+i], und Sie können es in dem Python - Interpreter 3 sehen laufen hier .

Länge 43:

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

In Python können Sie die Quelle mit einem bestimmten Codec codieren. Dies zeigt, wie die Quelle in Rot13 geschrieben werden kann. Die allgemeine Syntax ist dies: # -*- coding: <codec-name-goes-here> -*-.

Hier ist es übersetzt:

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

Das ugibt an, dass das folgende Zeichenfolgenliteral eine Unicode-Zeichenfolge ist. Dies ist erforderlich, wenn Sie möchten, dass sich Ihre Zeichenfolgen auch in Rot13 befinden. Andernfalls ist jede Zeichenfolge in der Quelle trotz der Verschlüsselung leicht lesbar. Alternativ können Sie auch .encode("Rot13")nach jeder Zeichenfolge verwenden (vergessen Sie nicht, auch hier Rot13 zu verwenden). Gemäß diesem Artikel lauten einige alternative Codierungen "base64", "uuencode", "zlib" oder "bz2".

Länge 33:

import cmath
print cmath.sqrt(-1)

Dies ist Pythons Modul für komplexe (imaginäre) Zahlen . Diese druckt 1j, da Python Standards Engineering entspricht und verwendet jals imaginäre Einheit, obwohl ich es vorziehen i, die häufiger in der Mathematik verwendet wird, und unter Verwendung von jund kzusätzlich zu iden Quaternionen , aber ich schweife ab. Lesen Sie den Bug / ändern , um hier (es wird nicht geändert werden).

Länge 30:

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

Jetzt definieren wir unsere eigene Fakultätsfunktion mit Hilfe der Rekursion und des ternären Wenn-Sonst! Soweit ich weiß, ist das in Python so gut wie nie zuvor. Es könnte auch so geschrieben werden: f=lambda n:n and f(n-1)*n or 1mit einigen booleschen Python-Operatoren (und auch mit 30 Zeichen). Weitere Informationen zur lambdaSyntax finden Sie im Länge-15-Snippet .

Länge 29:

import math
math.factorial(7)

Findet die Fakultät von 7 und gibt zurück 5040.

Länge 25:

import math
print math.pi

Pythons Mathematikmodul bietet viele nützliche Funktionen und Konstanten. Hier ist PI. Rückgabe 3.14159265359. (Im obigen Code habe ich die neue Zeile als Zeichen gezählt.)

Länge 24:

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

Dies ist ein Beispiel für einen Abschluss. Durch Aufrufen cube = f(3)wird eine kubische Funktion erstellt, mit der dann print cube(24)gedruckt werden kann 13824.

Länge 19:

print"Hello World!"

Endlich genug Platz, um eine Grundausgabe zu drucken! Das Leerzeichen ist hier nicht erforderlich, da Anführungszeichen und Klammern auch Trennzeichen sind. Dies funktioniert nur in Python 2, da Python 3 die aufzurufende printFunktion wie jede andere Funktion geändert hat . Verwenden Sie in Python 3 print("Hello World!"). Weitere Informationen zur Druckfunktion und zum Unterschied zwischen Python 2 und 3 finden Sie unter Neue Funktionen in Python 3.0 .

Länge 16:

[x*3 for x in l]

Angenommen, es lhandelt sich um eine Liste oder ein anderes iterierbares Objekt, z. B. eine Zeichenfolge oder einen Generator. Diese Aussage wird als Listenverständnis bezeichnet . Es ist viel kürzer als der Standard für die Schleifenstruktur. Hier wird eine Liste mit allen mit 3 multiplizierten Zahlen zurückgegeben. AUCH können Strings multipliziert werden! Daher wird jede Zeichenfolge in der Liste so oft hinzugefügt (mit sich selbst verknüpft).

Länge 15:

import this #:)

Dies ist eigentlich ein Ausschnitt aus Länge 11, aber mir wurde klar, dass ich vergessen hatte, Pythons (großartiges) Osterei zu präsentieren ! Beim Importieren dieses Moduls wird das Zen von Python gedruckt (siehe Factoid) this.py.

Länge 14:

lambda x:x**.5

Dies definiert eine Quadratwurzelfunktion unter Verwendung der Python- lambdaSyntax für ein Funktionsliteral. Funktionsliterale in Python können nur Ausdrücke und keine Anweisungen enthalten. Dieses Lambda kann einer Variablen zugewiesen, an eine Funktion übergeben oder in-line mit ausgeführt werden (lambda x:x**.5)(9), die es zurückgibt 3.0. Die Verwendung von Exponenten für eine Quadratwurzel ist eine Alternative zum Importieren der sqrtFunktion in das mathModul.

Länge 13:

1 if x else 0

Dies ist ein Beispiel für den ternären if-Operator von Python. Dies wurde in Python 2.5 hinzugefügt, um Codierer davon abzuhalten, es manuell mit Booleschen Operationen zu implementieren. Hier 1wird zurückgegeben, wenn auf xausgewertet True, andernfalls 0wird zurückgegeben.

Länge 12:

s=input(">")

Dadurch wird >der Aufforderungstext gedruckt, und der Benutzer kann einen Wert eingeben. Python 2 interpretiert jeden eingegebenen Wert, sodass für jeden String Anführungszeichen erforderlich sind. Python 3 hat dies geändert, sodass eingegebene Eingaben nicht automatisch interpretiert werden. Verwenden Sie, um Eingaben ohne Interpretation in Python 2 einzugeben raw_input(). In Python 2 input()entspricht eval(raw_input()).

Länge 11:

eval("2e3")

2e3ist eine wissenschaftliche Schreibweise für den Schwimmer 2 x 10³. Die evalFunktion interpretiert und wertet einen beliebigen String als Ausdruck aus. In diesem Fall hat es das gleiche Ergebnis wie die Verwendung des Literal 2e3oder float("2e3"). Es kehrt zurück 2000.0.

Länge 10:

range(013)

Diese Funktion gibt eine Liste von ganzen Zahlen von 0bis zum Oktalwert zurück 013, der 11(exklusiv) ist, was bedeutet, dass die Liste ist [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Die Funktion nimmt bis zu drei Parameter ähnlich der sliceFunktion , die wir früher überprüft: range(start, stop[, step]). Der Unterschied besteht darin, dass der Parameter bei nur einem Parameter den Stoppwert darstellt.

Beachten Sie, dass Python 3.x keine Entsprechung hat. Es rangeist ähnlich, aber es ist dasselbe wie in Python 2 xrange, wobei ein Generatorobjekt anstelle einer Liste zurückgegeben wird.

Länge 9:

a,b = b,a

Mehrfachzuweisung. Dies ist eine einfache, aber elegante Funktion, mit der Sie mehrere Werte gleichzeitig zuweisen können. Im Snippet zur Verfügung gestellt, es tauscht aund b. Was ist mit der Reihenfolge der Auswertung, fragen Sie? Alle Ausdrücke rechts vom Zuweisungsoperator werden ausgewertet, bevor eine der Zuweisungen vorgenommen wird. Dies schlägt viele Sprachen, die eine Zwischenzuweisung zu einer temporären Variablen erfordern.

Länge 8:

#comment

Weißt du was es ist? Wissen Sie, mit welchen Dingen Sie beliebigen Text eingeben können, um eine Codezeile zu beschreiben und das Verständnis zu erleichtern? Nein? Oh ok...

Länge 7:

l[::-1]

Wieder unter der Annahme, dass les sich um eine Liste handelt, wird die Liste in umgekehrter Reihenfolge zurückgegeben. Das dritte Argument gibt die Schrittgröße an. Da alle drei Argumente negative Werte sein können, bedeutet eine negative Schrittgröße die Iteration in umgekehrter Reihenfolge. Das leere erste und zweite Argument zeigen, dass wir die gesamte Liste durchlaufen.

Wir kommen zu dem Punkt, an dem wir mit der Verwendung weiterer interessanter Konstrukte beginnen können!

Länge 6:

l[-6:]

Dies wird als Slice- Operation bezeichnet. Wenn les sich um eine Liste handelt, wird eine neue Liste mit den letzten sechs Elementen lals Liste zurückgegeben. -6stellt den Startindex dar (6 vom Ende), und der Doppelpunkt bedeutet, bis zum darauf folgenden Endindex fortzufahren (den wir leer gelassen haben, also bis zum Ende). Wenn unsere Liste die Zahlen 1 bis 10 enthält, würde dies zurückkehren [5, 6, 7, 8, 9, 10].

Länge 5:

1<x<5

Eine der fantastischen Funktionen von Python ist, dass Sie Vergleichsoperatoren verketten können. In vielen anderen Sprachen würde dies wie folgt geschrieben werden 1 < x && x < 5. Noch besser wird es, wenn Sie mehrere Vergleiche in Betracht ziehen: 1 < x < y < 5ist absolut gültig!

Länge 4:

0256

Eine Ganzzahl mit einer führenden Null ist ein literaler Oktalwert. Dies ist auch ein guter Trick für die Codeverschleierung. Dies gibt den Dezimalwert zurück 174. In Python 3.x würde der Oktalwert wie folgt geschrieben 0o256.

Länge 3:

`3`

Das Umgeben eines Ausdrucks in Backticks entspricht dem Verwenden von repr(), das die Zeichenfolgendarstellung eines Objekts zurückgibt. Die Funktion versucht, die Zeichenfolge so zurückzugeben, dass sie evaldas ursprüngliche Objekt zurückgibt, wenn sie als Argument an die Funktion übergeben wird. Es ist nicht dasselbe wie das Verwenden str(), obwohl die Ergebnisse manchmal gleich sind. Für diese Eingabe '3'wird in beiden Fällen zurückgegeben. Dies ist einer meiner Favoriten für Codegolf!

Funktioniert nur in Python 2!

Länge 2:

[]

Eine leere Liste.

Länge 1:

_

Der Unterstrich ist ein häufig verwendeter Name für eine Wegwerfvariable. Wenn Sie eine Python-Shell (interaktiver Interpreter) verwenden, enthält sie jedoch das Ergebnis der zuletzt ausgeführten Anweisung (und würde es erneut zurückgeben.) Außerdem wird sie gemäß diesem Thread auch für die Übersetzungssuche in i18n verwendet.

Factoid : Python ist eine Sprache, die Java und C ähnlich ist. Sie wurde mit einer bestimmten Designphilosophie erstellt (entnommen aus " PEP 20 - The Zen of Python "):

  • Schön ist besser als hässlich
  • Explizit ist besser als implizit
  • Einfach ist besser als komplex
  • Komplex ist besser als kompliziert
  • Lesbarkeit zählt

Obwohl Semikolons als Anweisungsbegrenzer zulässig sind, werden sie aus Gründen der Lesbarkeit normalerweise weggelassen, um mehrere Zeilen zu verwenden. Auch Zeileneinzug ist sehr wichtig!


Jederzeit! Ich werde keine Schnipsel mehr hinzufügen (ich könnte der Länge 9 nicht widerstehen!), Da du damit schon einen tollen Job machst. Viel Glück!
nasser-sh

1
Länge 6: Es würde zurückkehren [5, 6, 7, 8, 9, 10](die letzten 6 Zahlen in der Liste)
Vincent

Länge 16: lmuss keine Liste sein, es kann sich um ein beliebiges iterierbares Objekt handeln; Tupel, Listen und Generatoren zum Beispiel funktionieren alle
nasser-sh

@ Sp3000: Ich habe es mit [Quellenbeschränkung] -Herausforderungen verwendet.
Robbie Wxyz

4
Keine Liebe für das gute alte import antigravity?
Chiffre

87

JavaScript

Dies geht vom neuesten zum ältesten. Link für mich: [ bearbeiten ]

Länge 51 Schnipsel:

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

Diesmal ein Node.JS-Quine, obwohl es keine "strengen Quine" -Anforderungen erfüllt, da es seinen eigenen Quellcode liest.

Länge 50 Schnipsel:

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

Endlich! Eine AJAX-Anfrage (mit Vanilla.JS ). Wir initialisieren, öffnen und senden die Anfrage, aber ich habe keinen Platz mehr, um Handler hinzuzufügen und tatsächlich alles mit dem Ergebnis zu tun .

Länge 49 Schnipsel:

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

Bereiten Sie einen Gesang "Hello World!" Vor. Es wird ein bisschen mehr Arbeit sein, es tatsächlich zu sprechen. Wir können auch Lautstärke, Tonhöhe, Rate und Akzent einstellen. Siehe Sprachsynthese-API in HTML5Rocks . Noch nicht von Firefox unterstützt, schon gar nicht vom IE .

Länge 48 Snippet:

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

Simulieren Sie setIntervaldurch rekursives setTimeouting.

Länge 47 Snippet:

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

Wieder NodeJS, aber das Prinzip ist überall in JS dasselbe. Dies ist eine sehr grundlegende Konstruktorfunktion, die ein Objekt mit einer Eigenschaft ( a) erstellt. Die Einstellung module.exportsexportiert die zu verwendende Funktion, indem sie require()gedrückt wird.

Länge 46 Snippet:

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

Dies erfordert ein <canvas id="canvas"></canvas>Element. Dabei wird die Tatsache ausgenutzt, dass Elemente mit IDs als globale Variablen ausgefüllt werden, sodass canvasab JS auf das Element zugegriffen werden kann. Dann füllen wir es mit einem 46x46 Quadrat bei x = 46, y = 46.

Länge 45 Schnipsel:

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

Zurück zum Knoten. Hier analysieren wir eine JSON-Datei, die jsnaus dem aktuellen Verzeichnis stammt.

Länge 44 Snippet:

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

Aufbauend auf # 39. Jetzt erstellen wir ein Element und weisen ein Attribut zu. Es ist immer noch nicht im DOM.

Länge 43 Schnipsel:

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

Erstellt mit ein Array der ersten 5 Quadrate map().

Länge 42 Schnipsel:

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

Dies funktioniert nach dem gleichen Prinzip wie dieses , aber es fehlt JS #defineund es wird hässlicher. Es gibt natürlich die Antwort auf das Leben, das Universum und alles zurück .

Länge 41 Schnipsel:

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

Der Beginn einer Schließung. cist jetzt eine Funktion (die interne) mit Zugriff auf die interne Variable i, aber sie macht nichts.

Länge 40 Schnipsel:

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

Wir löschen diese Absätze vollständig und verwenden jQuery.

Länge 39 Schnipsel:

script=document.createElement('script')

Dies ist der Beginn des Hinzufügens eines neuen externen Skripts. Erstellen Sie ein leeres <script>Element und behalten Sie einen Verweis darauf bei.

Länge 38 Schnipsel:

document.getElementsByClassName('abc')

Finden Sie alle .abcElemente im Dokument. Natürlich ist es mit jQuery nur $('.abc')...

Länge 37 Schnipsel:

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

Erstellt zwei identische, aber entkoppelte Objekte a, und b. Wenn du es tun würdest

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

Sie würden am Ende mit a=={a:3}, weil aund bauf das gleiche Objekt zeigen. Wir verwenden JSON, um sie zu entkoppeln.

Länge 36 Schnipsel:

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

Eine Quine . Es druckt seinen eigenen Quellcode.

Länge 35 Schnipsel:

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

Siehe # 32. Dieser versteckt nur das Dokument, ohne den Inhalt zu überschreiben.

Länge 34 Schnipsel:

Object.prototype.toString.call(34)

Das Aufrufen Object.prototype.toStringist eine gute Methode, um den Typ eines Objekts zu ermitteln. Während 34..toString()ist "34", ist das Snippet [object Number].

Länge 33 Snippet: (Gutschrift für diesen geht an einen anonymen Benutzer )

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

Denken Sie, dass dies kein gültiges JavaScript ist? Probiere es besser aus ... (benutze Chrome);)

Länge 32 Snippet:

document.body.innerHTML="hacked"

Halp! Hazxxors! Elf !! 11!

Länge 31 Snippet:

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

Kein Scherz, ich habe so lange darauf gewartet, eine forSchleife tatsächlich benutzen zu können ! Dieser erstellt ein Array von 0-30.

Länge 30 Schnipsel:

new Date().getDay()==1?"S":"E"

Zum ersten Mal mit dem ternären Operator. Ich könnte nicht mehr als das in 30 Zeichen passen, also wissen wir nur, ob heute Sonntag ist oder etwas anderes. : P

Länge 29 Schnipsel:

Object.keys(window).push('i')

Object.keys(window)wird ein Array der globalen Variablen (Eigenschaften von window) erhalten. .push()wird ein Element an dieses Array anhängen. Denken Sie, das ist das Äquivalent von window.i=undefined? Nee!

Länge 28 Snippet:

setTimeout("a=confirm()",28)

Das Warten von 28 Millisekunden ist nicht so nützlich, außer um einen neuen Thread zu erstellen.

Länge 27 Schnipsel:

document.querySelector('a')

Es ist eine Schande, dass DOM-Namen so lang sind. Ich konnte hier nur einen einzigen Link bekommen.

Länge 26 Snippet:

JSON.stringify({twenty:6})

Siehe # 16. Jetzt bekommen wir tatsächlich JSON - einen String.

Länge 25 Schnipsel:

new Badge("Good Answer");

Angenommen, es Badge()handelt sich um eine Konstruktorfunktion, die ein Argument übernimmt ... Es wurde gerade ein Good Answer- Badge erstellt!

Länge 24 Schnipsel:

do {alert(24)} while(!1)

Ich benutze eigentlich gar nicht so do..whileviel, aber manche tun es. Wenn dies eine gewöhnliche whileSchleife wäre, würde sie nichts alarmieren, da sie immer falsch ist. do..whilewird jedoch immer mindestens einmal ausgeführt, sodass wir 24 sehen können.

Länge 23 Snippet:

window.parent==self.top

Diese beziehen sich alle auf dasselbe Objekt, allgemein bekannt als window. Wenn Sie eine Funktion normal aufrufen, gibt es auch this. Das sind 5 Möglichkeiten, auf das globale Objekt zuzugreifen!

Länge 22 Schnipsel:

for(i in self)alert(i)

Warnen Sie alle globalen Variablen. Es ist so self==window. (Siehe den nächsten Ausschnitt.)

Länge 21 Snippet:

"2"+1==21 && 2+1=="3"

Oh, sieh mal, es sind wieder die Castingregeln von JS. Diese Aussage ist übrigens richtig.

Länge 20 Schnipsel:

Math.random()<.5?0:1

Wählen Sie eine Zufallszahl von 0-1 und runden Sie mit dem ternären Operator. Obwohl es einfacher zu bedienen wäre Math.round...

Länge 19 Schnipsel:

[1,2,3].map(i=>i*i)

Dieser ist neu. Wie wirklich neu. Es verwendet ES6-Pfeilfunktionen , um die Quadrate 1, 2 und 3 zu berechnen. Derzeit scheint es nur von Firefox unterstützt zu werden.

Länge 18 Schnipsel:

location.href="/";

Wie # 15, aber dieses Mal geht es zur PPCG-Homepage, nicht zu SE.

Länge 17 Snippet:

(function(){})()

Es ist das Snippet von 14, aber besser! Jetzt ist es eine IIFE.

Länge 16 Snippet:

obj={not:'json'}

Dies erklärt eines meiner Haustier ärgert. Dies ist ein Objekt , kein JSON ! JSON ist ein Datenaustauschformat, das auf JavaScript-Objekten basiert, jedoch ein strengeres Format verwendet.

Länge 15 Schnipsel:

open('//s.tk/')

Stell dir das vor. Öffnen Sie die SE-Homepage über die http://s.tk/-Weiterleitung .

Länge 14 Snippet:

function f(){}

W00t! Funktionen! Schade, dass es keinen Raum gibt, etwas zu tun .

Länge 13 Schnipsel:

Math.random()

Generieren Sie eine Zufallszahl von 0 bis 1. Möchten Sie Ihre eigenen Grenzen definieren? Pech. (Nicht wirklich, es ist einfach.)

Länge 12 Schnipsel:

new Date<=12

Diese Aussage war in JS noch nie wahr. JS wurde erst 1995 (siehe Faktoid) erstellt, lange nach dem 1.1.1970 00: 00: 00.012.

Länge 11 Schnipsel:

Math.PI*121

Die Fläche eines Kreises mit dem Radius 11.

Länge 10 Schnipsel:

if('j')9+1

Falls Sie es nicht bemerkt haben, mache ich gerne etwas mit der Snippet-Nummer im Code. Dieser gibt 10 zurück und verwendet j, den zehnten Buchstaben des Alphabets.

Länge 9 Snippet:

[9].pop()

Erstellen Sie ein Array mit einem Element. popgeht das wiesel 9.

Länge 8 Schnipsel:

document

Die Basis für alle DOM-Arbeiten. Aber wir können nichts machen, weil es zu lang ist. :( Go jQuery!

Länge 7 Snippet:

alert()

Oh Junge! Ein Funktionsaufruf! Endlich in der Lage sein, Sachen zu machen!

Länge 6 Schnipsel:

var x=6

Basierend auf # 3. Viel besser, denn jetzt ist das Globale explizit . : P

Länge 5 Schnipsel:

[][5]

Noch kürzer als void 0zu bekommen undefined. Übrigens: ''.aist noch kürzer; nur 4 Zeichen.

Länge 4 Schnipsel:

+"4"

Dadurch wird die Nummer 4aus der Zeichenfolge erstellt "4". Sie können genau dieselben 4 Zeichen in einer anderen Reihenfolge wiederverwenden, um das Gegenteil zu erreichen!

Länge 3 Snippet:

x=3

Oh, verdammt, wir haben gerade eine implizite globale Variable erstellt ...

Länge 2 Snippet:

{}

Was macht das? Wenn Sie gesagt haben, dass ein Objektliteral erstellt wird, liegen Sie falsch. Es ist eigentlich ein leerer Block. Öffne eine Konsole und probiere es aus! Es kehrt zurück undefined, nicht {}.

2018 gibt die {}Chrome-Konsole tatsächlich ein leeres Objekt zurück.

Länge 1 Snippet:

1

Das ist es. Jede Zahl ist ein gültiger JS-Ausdruck.

Faktoid: JavaScript hieß ursprünglich LiveScript. Es wurde zu JavaScript geändert, um von der Popularität von Java zu profitieren (1995). Persönlich hätten sie den alten Namen behalten sollen; JavaScript sorgt seitdem für Verwirrung. Fakt ist, Java und JavaScript sind ungefähr so ​​ähnlich wie "Auto" und "Teppich" .


1
Snippet 33 funktioniert nicht in Firefox. Ist es wirklich gültig, JS?
Oriol

Ich finde es so schmutzig, ein Objekt zu verketten und erneut zu analysieren, um es zu kopieren. ECMAScript 6 wird eingeführt Object.assign, so dass das Snippet 37 wird b = Object.assign({ }, a = {3 : 7}).
Oriol

@Oriol Ja, im Moment unterstützt nur Firefox das, also müssen wir uns erstmal an den schmutzigen Weg halten. Zumindest ist es besser als eval(uneval(a)), oder? ;)
Scimonster

Über # 38 gibt es immer document.querySelectorAll("element#id.classname[attribute]:not(somethingwedontwant)"). (Unterstützt alle gültigen CSS-Selektoren).
Mateon1

Das # 40-Snippet selbst ist nicht so interessant, aber der Kommentar ist von unschätzbarem Wert.
Scimonster

85

R

Factoid: Die Programmiersprache R begann als GNU-Implementierung der Programmiersprache S. Es wird hauptsächlich für Statistiken und verwandte Anwendungen verwendet.

Hinweis: Obwohl dies keine Wettbewerbsvoraussetzung ist, kann jedes Snippet in R für sich ausgeführt werden.


Länge 32:

`[.data.frame`(swiss,3,2,drop=F)

Das sieht ein bisschen mysteriös aus ... und sollte es auch sein! Es gibt einen viel besseren Weg, dies zu schreiben:

swiss[3, 2, drop = FALSE]

Das sollte etwas vertrauter aussehen. Folgendes passiert, wenn wir einen dieser Code-Teile ausführen:

> `[.data.frame`(swiss,3,2,drop=F)
             Agriculture
Franches-Mnt        39.7

Der swissDatenrahmen wird mit R geliefert, wie einige andere, die wir bisher gesehen haben. Es enthält Fertilitäts- und sozioökonomische Indikatoren für 47 französischsprachige Provinzen der Schweiz aus der Zeit um das Jahr 1888. Die dritte Zeile bezieht sich auf die Provinz Franches-Mnt, und die zweite Spalte gibt den Prozentsatz der Männer an, die in jeder Provinz als Beruf in der Landwirtschaft tätig sind. So arbeiteten 1888 39,7% der Männer in der Franches-Mnt-Provinz der Schweiz in der Landwirtschaft.

Wenn Sie mit der einfacheren Schreibweise Zeilen oder Spalten aus einem Datenrahmen extrahieren, wird tatsächlich R verwendet [.data.frame im Hintergrund verwendet. Wie wir in Snippet 24 gesehen haben, kann so ziemlich alles als Funktionsname definiert werden, solange es in Back Ticks eingeschlossen ist. Daher ist unser Snippet hier legitim, obwohl der Funktionsname technisch gesehen nicht übereinstimmende Klammern enthält.

Das drop=Argument teilt R mit, ob das Ergebnis nach Möglichkeit in eine niedrigere Dimension verschoben werden soll. In der Tat, wenn wir sagen drop=TRUE, bekommen wir Folgendes:

> `[.data.frame`(swiss,3,2,drop=T)
[1] 39.7

Wo früher ein Datenrahmen resultierte, ergibt R jetzt ein Doppel.


Länge 31:

print(fortune("hadleywickham"))

Die fortune()Funktion stammt aus dem allwissenden fortunesPaket, das verschiedene weise Zitate verschiedener weiser Leute enthält. Mit diesem Snippet erhalten Sie das folgende Juwel von Hadley Wickham (23), indem Sie auf die Konsole drucken:

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)

Länge 30:

pie(rep(1,12),col=rainbow(12))

Wer liebt ein gutes Tortendiagramm nicht? Mit dieser pie()Funktion können Sie ein frisch gebackenes Tortendiagramm erstellen, das auf einem Zahlenvektor basiert. rep()Erstellt einen Vektor, indem das erste Element r- mal wiederholt wird, wobei r das zweite Argument ist. Der col=Parameter gibt an, pie()wie die Scheiben gefärbt werden sollen. Die magische Funktionrainbow() erzeugt einen Vektor einer bestimmten Länge, der die Hex-Codes für "gleichmäßig verteilte" Farben des Regenbogens enthält.

Was Sie hier haben, ist Ihre grundlegende "Menge jeder Farbe in dieser Tabelle":

Bildbeschreibung hier eingeben


Länge 29:

summary(lm(mag~depth,quakes))

Hier sind ein paar Dinge im Gange, also lasst sie uns Schritt für Schritt machen.

quakesist ein Datensatz, der mit R geliefert wird. Er enthält Informationen zu 1000 seismischen Ereignissen mit einer Stärke von mehr als 4,0 auf der Richterskala in der Nähe von Fidschi seit 1964. Zwei der Spalten im Datensatz sind mag: die Stärke des Erdbebens unddepth , das ist die Tiefe des Epizentrums in Kilometern.

Die lm()Funktion passt, wie in Snippet 28 erwähnt, zu linearen Modellen. Es gibt ein lmObjekt oder genauer gesagt ein Objekt der Klasse zurück lm. Es gibt zwei Möglichkeiten, den Prädiktor (oder die unabhängige Variable) und die Antwort (oder die abhängige Variable) anzugeben , und ich habe die Formelmethode ausgewählt. Dies hat die Form response ~ predictor. Mehrere Prädiktoren werden als angegeben y ~ x1 + x2. Die Objekte in der Formel werden in dem Kontext ausgewertet, der im nächsten Argument angegeben ist.

Das lm(mag ~ depth, quakes)heißt, Sie passen ein lineares Modell mit gewöhnlicher Regression der kleinsten Quadrate an, wobei die Größe die Antwort und die Tiefe der Prädiktor ist. Es weiß was magund depthliegt daran, dass wir es gesagt haben, dass sie kommen quakes.

summary()ist eine generische Funktion, die hauptsächlich zum Zusammenfassen der Ergebnisse angepasster Modelle verwendet wird. Es ruft eine Methode auf, die für die Klasse seines Arguments spezifisch ist. Da wir ein lmObjekt übergeben haben, ruft es tatsächlich eine Funktion auf, die aufgerufen wird summary.lm().

Alles in allem erhalten wir eine Zusammenfassung des linearen Modells, das versucht, Erdbeben aus der Erdbebentiefe zu erklären. Im Einzelnen spuckt R Folgendes aus:

> 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

Beachten Sie, wie das erste, was es Ihnen sagt, der Funktionsaufruf ist? Das liegt daran, dass die lm()Funktion match.call()genau wie in Snippet 28 verwendet wird!


Länge 28:

f<-function(x,y)match.call()

R-Funktionen möchten häufig verfolgen, was Sie ihnen sagen. In der Tat wird Ihnen manchmal der von Ihnen übermittelte Befehl als Attribut des zurückgegebenen Objekts zurückgegeben. (Ein Beispiel dafür ist lm(), dass lineare Modelle erstellt werden.) Das Aufrufen der genauen Anweisungen erfolgt mithilfe match.call()der Funktion. Dies erfasst den interpretierten Funktionsaufruf oder stimmt mit ihm überein .

Hier haben wir eine Funktion definiert f(), die zwei Argumente verwendet und Ihnen dann sagt, was sie gesehen hat.

> f(1,2)
f(x = 1, y = 2)

Dies ist in erster Linie nützlich, wenn Sie Funktionen für den allgemeinen Gebrauch (und nicht nur für Sie) entwickeln, wie z. B. bei der Paketentwicklung. Wenn Sie ein Beispiel von match.call()in the wild sehen möchten , schauen Sie sich den Quellcode an, lm()indem Sie ihn einreichen stats:::lm. Als erstes wird der Funktionsaufruf mit erfasst match.call().


Länge 27:

install.packages("ggplot2")

Dies mag trivial erscheinen, zeigt aber einen der Gründe, warum R so beliebt ist: Es ist sehr leicht durch Pakete erweiterbar. Und jeder kann seine Pakete entwickeln und frei teilen!

install.packages()tut genau das, was sein Name andeutet. Pakete werden mit Ihrem CRAN-Standardspiegel (Comprehensive R Archive Network) gesucht und dann auf Ihrem System installiert, wo R sie finden kann. Sie können auch Pakete aus dem lokalen Quellcode installieren.

Erinnerst du dich an Snippet 23, in dem wir das ggplot2Paket benutzt haben? Dieses Paket wird nicht mit R geliefert, aber mit nur 27 Zeichen können Sie all Ihre ggplot2Träume verwirklichen, indem Sie es installieren.


Länge 26:

filled.contour(t(volcano))

Der volcanoDatensatz wird mit R geliefert. Es handelt sich um eine Matrix mit topografischen Informationen zum Vulkan Maungawhau (oder Mt. Eden) in Auckland, Neuseeland. Die Zeilen der Matrix entsprechen Rasterlinien, die von Ost nach West verlaufen, und die Spalten sind Rasterlinien, die von Süd nach Nord verlaufen.

Aus Gründen der Desorientierung tauschen wir die Richtungen aus, sodass die Spalten jetzt Ost-West und die Zeilen Süd-Nord sind. Wir können dies mit einer Matrixtransponierung tun, die über ausgeführt wird t(). Und warum nicht eine Konturkarte erstellen, während wir gerade dabei sind? filled.contour()macht genau das.

Bildbeschreibung hier eingeben


Länge 25:

pmatch("s",c("n","size"))

Die pmatch()Funktion bietet die Magie hinter all den partiellen Übereinstimmungen, die wir bisher gesehen haben. Das erste Argument ist eine Zeichenfolge, die mit jedem Element des zweiten Arguments, einem Vektor, verglichen wird. Wenn es eine eindeutige Übereinstimmung gibt, wird der Index des übereinstimmenden Elements zurückgegeben, andernfalls erhalten Sie NA.

Das Snippet hier ist ein "reales" Beispiel für die Verwendung dieser Funktion. Denken Sie an Snippet 13 zurück, in dem wir die sample()Funktion verwendet haben. Er akzeptiert Argumente n, size, replace, und prob, aber nur die ersten beiden erfordert. In Snippet 13 verwendeten wir s=als Abkürzung für size=. Was tatsächlich im Hintergrund vor sich geht, ist so etwas wie dieses Snippet, in dem das, was wir bereitgestellt haben, mit dem verglichen wird, was erwartet wird. Da "s" eindeutig der "Größe" entspricht, ist die Verwendung s=als Kurzschrift absolut legitim .


Länge 24:

`(`=function(x)9;2*(3-1)

Ein perfektes Beispiel für etwas, das Sie nicht tun sollten! Je!

Sie können Zeichen als Funktionen zuweisen, solange Sie sie bei der Definition der Funktion mit einem Back-Tick umgeben. Hier haben wir R gesagt, dass dies (eine Funktion ist, die unabhängig von der Eingabe immer 9 zurückgibt. ;Kann wie in vielen anderen Sprachen zum Einfügen von zwei Befehlen in eine Zeile verwendet werden. Also, was wir R gesagt haben, ist, die Funktion zu definieren (und dann zu drucken 2*(3-1).

Nun würde fast jede Person Ihnen sagen, dass 2 * (3-1) 4 sein sollte, weil Sie 3-1 = 2, dann 2 * 2 = 4 tun. Aber wir haben R gesagt, dass alles in Klammern 9 ist. Während 3-1 = 2, haben wir jetzt (3-1) = 9. Dann erhalten wir 2 * (3-1) = 2 * 9 = 18.

Da solche furchtbaren Dinge möglich sind, sucht der R-Interpreter jedes Mal, wenn Sie Code einreichen, der Klammern in einem Ausdruck enthält (dh keinen Funktionsaufruf), nach aufgerufenen Funktionen, (unabhängig davon, ob Sie (eine Funktion definiert haben . Je mehr Sie schreiben, desto mehr Arbeit leistet der R-Interpreter.


Länge 23:

qplot(Na,y=RI,data=fgl)

Endlich genug Stimmen für ein (sehr) einfaches ggplot2Beispiel. Das ggplot2Paket ist eine R-Implementierung der Grammatik der Grafiken, die von der legendären R-Gottheit Hadley Wickham erstellt wurde . Im Allgemeinen unterscheidet sich die Syntax stark von der Basis-R-Grafik und ist gewöhnungsbedürftig. Es qplot()ist jedoch eine einfachere Schnittstelle zu einigen der Kernfunktionen des Pakets und hat eine Syntax, die der von plot()Base R ähnelt . Im Gegensatz zu vielen der Beispiele, die ich Ihnen gezeigt habe, unterstützt es qplot()jedoch keine teilweise Zuordnung von Funktionsparameternamen.

Der fglDatensatz stammt aus dem MASSPaket. Es enthält Messungen der Eigenschaften von forensischen Glasfragmenten. Hier verwenden wir die Variablen Na, die den Gewichtsprozentsatz von Natrium (Na) und RIden Brechungsindex des Glases angeben.

Bildbeschreibung hier eingeben


Länge 22:

unique(presidential$n)

Die unique()Funktion gibt einen Vektor zurück, der die eindeutigen Werte aus seinem Eingabevektor in der Reihenfolge enthält, in der sie in der Eingabe erscheinen. Der presidentialDatensatz wird mit dem ggplot2Paket (27) geliefert . (Danke an Jemus42 für die Korrektur!) Seine Beschreibung:

Die Namen der einzelnen Präsidenten, das Start- und Enddatum ihrer Amtszeit und die Partei der zehn US-Präsidenten von Eisenhower bis Bush W.

presidentialist ein Datenrahmen, und Datenrahmen enthalten Spalten, genau wie Listen Elemente enthalten. Spalten werden mit dem Namen referenziert $. Dieser bestimmte Datensatz enthält eine Spalte namemit dem Namen des Präsidenten. Aber warte, wir haben nur angegeben n! Tatsächlich ist dies ein weiteres Beispiel für eine teilweise Übereinstimmung (13, 16) und somit nabsolut legitim.

Das Abschicken hat ein interessantes Ergebnis:

[1] "Eisenhower"  "Kennedy"  "Johson"   "Nixon"  "Ford"  "Carter"
[7] "Reagan"      "Bush"     "Clinton"

Beachten Sie, wie der Name von Lyndon B. Johnson geschrieben ist ... Hoppla.

(Anmerkung: Über ein Jahr nach dem Posten ist mir aufgefallen, dass der Johnson-Tippfehler behoben wurde. RIP-Humor.)


Länge 21:

integrate(dexp,0,Inf)

R hat eine eingebaute Funktion zur adaptiven Quadratur von Funktionen einer einzelnen Variablen über ein endliches oder unendliches Intervall. In R wird unendlich als Inffür + unendlich und -Inffür-unendlich angegeben. Die dexp()Funktion ist die Wahrscheinlichkeitsverteilungsfunktion für die Exponentialverteilung. Da die Unterstützung der Exponentialverteilung [0, + unendlich] ist und Wahrscheinlichkeitsverteilungen zu 1 integriert werden, würden wir erwarten, dass das Ergebnis 1 ist. Siehe, ein erwartetes Ergebnis!

1 with absolute error < 5.7e-05

Länge 20:

deriv(~cos(x^3),"x")

R kann symbolische Ableitungen machen! Dies ergibt:

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

Wenn Sie das durchsehen, können Sie sehen, wie es die Funktion analysiert und die Kettenregel verwendet. Alles, was eine Funktion, die im ersten Jahr Kalkül nahm, in der Lage sein sollte, zu tun! Das erste Argument für die deriv()Funktion ist in diesem Fall ein R-Ausdruck (der ein tatsächlicher R-Typ ist) in Bezug auf eine Variable x. Das zweite Argument ist der Name der Variablen, für die die Ableitung verwendet wird "x".

Möchten Sie etwas wirklich Ordentliches sehen? Weisen Sie das Obige beispielsweise einer Variablen zu dx. Definieren Sie eine Variable xals numerischen Vektor. Dann abschicken eval(dx). R wertet die Ableitung bei aus x!


Länge 19:

c(matrix(1,3,3),"a")

In R, c()kurz für "kombinieren" oder "verketten", wird aus seinen Argumenten ein Vektor erstellt. Die Elemente von Vektoren müssen vom gleichen Typ sein und alle die Länge 1 haben. Aber anstatt sich darüber aufzuregen, wird R ein Element mit Struktur, in diesem Fall eine Matrix, abflachen und alles auf den gleichen Typ umwandeln.

Wenn die Argumente c()nur einen einzigen Typ enthalten, erfolgt keine Typumwandlung. Wenn z. B. alle Argumente logisch ( TRUEund FALSE) sind, sind alle Vektoren logisch. Wenn es logische Zeichen und Zahlen enthält, sind es alle Zahlen. Wenn es Zeichen und irgendetwas enthält, wird es alles Zeichen sein. Unser Snippet gibt uns also Folgendes:

> c(matrix(1,3,3),"a")
[1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "a"

Beachten Sie, dass die 3 x 3-Matrix abgeflacht wurde und das Hinzufügen von "a" alles zu Zeichen machte.


Länge 18:

(1-1/3-1/3-1/3)==0

Eine Lehre in Maschinenpräzision. Dies kehrt zurück FALSE.


Länge 17:

example(readline)

Die example()Funktion gibt Ihnen ein Beispiel für die Verwendung einer eingebauten Funktion. Wenn Sie herausfinden müssen, wie man es benutzt readline(), hat R eine selbstgefällige Antwort für Sie.

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

Weise, bescheiden zu sein, R.


Länge 16:

acf(lh,t="part")

Die acf()Funktion gibt die Autokorrelationsfunktion für eine Zeitreihe zurück. lhist ein Datensatz, der mit R geliefert wird. Seine Beschreibung:

Eine regelmäßige Zeitreihe, in der das Luteinzing-Hormon in Blutproben in Abständen von 10 Minuten von einer menschlichen Frau aus 48 Proben entnommen wird.

In diesem Beispiel wird die teilweise Übereinstimmung zweimal verwendet : einmal mit dem Funktionsparameter und einmal mit dem an den Parameter übergebenen Zeichenfolgenwert. Der vollständige Parametername ist typeund die erkannten Werte sind "correlation", "covariance"und "partial". Es muss nur genug von der Zeichenfolge bereitgestellt werden, um sie eindeutig zu identifizieren, sodass wir sie "part"für verwenden können "partial", wodurch wir die partielle Autokorrelationsfunktion (Partial Autocorrelation Function, PACF) erhalten.

Bildbeschreibung hier eingeben


Länge 15:

p3d(bunny,p=99)

Wieder sehen wir den berüchtigten Hasen (11). Das onionPaket bietet uns eine noch bessere Möglichkeit, den nützlichsten Datensatz aller Zeiten mithilfe der 3D-Plotterfunktion anzuzeigen p3d(). Dies ruft die Basisgrafikfunktion persp()im Hintergrund auf, die ein rotierendes Argument annimmt phi. Mit der teilweisen Übereinstimmung von Parameternamen (13) können wir nur p=anstelle von angeben phi=.

Bildbeschreibung hier eingeben


Länge 14:

stats:::rgamma

R ist Open Source, aber Sie müssen kein Assistent sein, um den Quellcode anzuzeigen. Sie können einfach den Paketnamen und die Funktion, deren Code Sie anzeigen möchten, durch drei Doppelpunkte ( :::) trennen . Dies gibt Ihnen den Code, der die rgamma()Funktion definiert , die zufällige Abweichungen von der Gamma-Verteilung erzeugt. Wenn Sie dies einreichen, erhalten Sie:

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>

Beachten Sie, dass eine Funktion verwendet wird .External(). Dies ruft Funktionen auf, die in anderen Sprachen geschrieben sind, typischerweise C und Fortran, die Sprachen, die einen Großteil der Grundlage von R bilden. Das Auffinden dieses Quellcodes erfordert ein wenig Zauberei. Edit: @Vlo wies darauf hin, dass bloße Sterbliche tatsächlich den zugrunde liegenden C-Code anzeigen können , der mit dem Paket aufgerufen .Internal()und .Primitive()verwendet wird pryr. Danke, @Vlo!


Länge 13:

sample(9,s=4)

Dies sieht nicht nach viel aus, veranschaulicht jedoch ein leistungsfähiges Konzept in R: Partielle Übereinstimmung von Funktionsparametern . Die benannten Parameter in der sample()Funktion lauten size, replaceund prob, Sie müssen jedoch nur genügend Buchstaben des benannten Parameters eingeben, um ihn eindeutig zu identifizieren. Somit sample()können Sie s=stattdessen verwenden, size=da keine anderen Parameternamen mit dem Buchstaben "s" beginnen. Der Code hier wählt eine Zufallsstichprobe der Größe 4 aus den ganzen Zahlen 1 bis 9 aus.


Länge 12:

LETTERS[-pi]

Es gibt einen eingebauten Vektor namens, LETTERSder alle englischen Großbuchstaben in alphabetischer Reihenfolge enthält. Im Gegensatz zu vielen anderen Sprachen können Sie einen Vektor mithilfe einer Gleitkommazahl indizieren. Nichts zu Aufregendes passiert; R nimmt nur den ganzzahligen Teil. Wenn Sie -den Index eines Vektors voranstellen, wird das Element mit diesem Index aus dem Vektor entfernt. piist eine eingebaute Konstante, die - Sie haben es erraten - die irrationale Zahl π enthält. Das entfernt also Element 3 aus dem Vektor und gibt "A" bis "Z" zurück, wobei "C" weggelassen wird.


Länge 11:

plot(bunny)

Im onionPaket befindet sich ein Datensatz mit dem Namen bunny. Wenn Sie es zeichnen, erhalten Sie die vielleicht nützlichste Grafik aller Zeiten:

Bildbeschreibung hier eingeben


Länge 10:

????sample

Angenommen, Sie sind wirklich verwirrt über die sample()Funktion und Sie brauchen dringend Hilfe. Anstatt wie üblich ?sampledie R-Handbuchseite aufzurufen, stoßen Sie vier Fragezeichen an. R hört deine Not und versucht zu helfen ...

Contacting Delphi...the oracle is unavailable.
We apologize for any inconvenience.

Ach.


Länge 9:

isTRUE(1)

Zunächst scheint dies der Konvention im Rest des R-Basispakets zu trotzen isund das folgende Wort im Funktionsnamen mit einem .. Dies gilt jedoch nur für eine logische Prüfung, ob das Argument von einem bestimmten Typ ist, wie unten (8). In diesem Fall testen wir, ob es sich TRUEum einen Typ handelt. Dies erfolgt nach einer strengen Definition von TRUE, dh 1 ist nicht "wahr" im üblichen Sinne. isTRUE(1)kehrt zurück FALSE.


Länge 8:

is.na(8)

Im Gegensatz zu den meisten anderen Programmiersprachen .ist ein gültiges Zeichen in Funktions- und Variablennamen. Es bezeichnet keine Art von Methode oder Erbe; Es ist nur ein Teil des Namens. Die is.na()Funktion prüft, ob ihr Argument als NA(fehlend) ausgewertet wird und gibt TRUEoder zurück FALSE.


Länge 7:

stop(7)

Dies gibt einen Fehler mit der Eingabe als Fehlermeldung aus. Wenn die Funktion innerhalb einer Funktion aufgerufen wird, wird die Funktionsausführung gestoppt. Ein Aufruf außerhalb einer Funktion stoppt das Skript jedoch nicht. In diesem Fall ist die Ausgabe Error: 7.


Länge 6:

x < -1

Dies mag trivial erscheinen, zeigt jedoch eine große Kritik am Zuweisungsoperator <-: Die Bedeutung ändert sich abhängig von der Platzierung der Leerzeichen. x <- 1Weist wie erwähnt 1 zu x. Das Trennen <und -mit einem einzelnen Leerzeichen wie oben ändert es in einen logischen Test, ob xkleiner als -1 ist. Aus diesem Grund bevorzugen viele die =Zuordnung.


Länge 5:

x<<-1

Ähnlich wie bei <-except wird <<-die Variable unabhängig vom aktuellen Gültigkeitsbereich immer dem globalen Gültigkeitsbereich zugewiesen.


Länge 4:

x<-1

R verwendet <-, um Variablen im aktuellen Bereich zuzuweisen. Dieses Snippet weist den Wert 1 zu x.


Länge 3:

!0i

Der !Operator ist R für "nicht" und 0iist die komplexe Zahl 0+0iAKA 0 in der komplexen Ebene. Das Senden dieser Anweisung gibt zurück, TRUEda 0 falsch ist.


Länge 2:

NA

Dies gibt den speziellen R-Wert zurück NA, der für "nicht verfügbar" steht und einen fehlenden Wert angibt.


Länge 1:

T

Dies kehrt zurück TRUE. In R, Tund Fsind Synonyme für die Boolesche Werte TRUEund FALSE, respectively.


Yay R "!"(T)!
Vlo

@Vlo: "!"(T)ausgewertet FALSE. Die Aussage "Yay R" ist jedoch niemals falsch. ;)
Alex A.

Wie stimme ich mehr für mehr Einträge? "Das Auffinden dieses Quellcodes erfordert ein wenig Zauberei" ist trivial für .Internalund .Primitive->pryr::show_c_source(.Primitive("sum"))
Vlo

@ Vlo: Ich hatte noch nichts von dem pryrPaket gehört. Sehr cool! Vielen Dank für den Hinweis. Ich bin froh, dass dir die Einträge bisher gefallen haben, danke für die Unterstützung. :)
Alex A.

2
@ Jemus42 Ah, sieht so aus, als müsstest du das data(bunny)zuerst tun .
Alex A.

75

Brainfuck

Factoid: Brainfuck (auch bekannt als brainf * ck) war eine experimentelle esoterische Sprache, mit der der kleinste Sprachinterpreter aller Zeiten geschaffen wurde. Er wurde von Urban Müller entwickelt und ist derzeit die bekannteste Sprache ihrer Art. Es hat nur acht Befehle, ist leicht zu erlernen, aber schwer zu bedienen.

Brainf * ck verfügt über einen Tape Base Memory mit 30000 Zellen und einem beweglichen Zeiger und kann folgendermaßen visualisiert werden:

0 0 0 0 0 0
    ^

Mit dem ^Zeichen, das den Zeiger darstellt, und den Nullen, die die Werte für jede Zelle darstellen.

Brainfuck hat acht Anweisungen:

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 zu 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;
}

Länge 1 Snippet

Lesen Sie ein Zeichen und setzen Sie es in die aktuelle Zelle.

,

Speicher (mit Eingang: abc)

0 0 97 0 0 0
    ^

Länge 2 Snippet

Fügen Sie der aktuellen Zelle eine hinzu, und verschieben Sie den Zeiger nach rechts.

+>

Erinnerung

0 0 1 0 0 0
      ^

Länge 3 Snippet

Entfernen Sie eine aus der aktuellen Zelle, bis sie Null ist. Setzen Sie die aktuelle Zelle auf Null

[-]

Möglicher Speicher:

Speicher: (Vorher)

0 0 100 0 0 0
    ^

Speicher: (Nachher)

0 0 0 0 0 0
    ^

Länge 4 Snippet

Kommentar: Beim Brainfuck wird alles, was keine Anweisung ist, ignoriert. Aus diesem Grund ist das folgende Programm ein vollständig gültiges (aber leeres) Brainfuck-Programm:

Hey!

Länge 5 Snippet

Ein einfaches Katzenprogramm (Eingabe in Ausgabe schreiben)

,[.,]

Danke an tomsmede für seinen Kommentar

Länge 6 Snippet

Verschieben Sie den Wert der aktuellen Zelle in die Zelle nach rechts (Angenommen, die Zelle nach rechts ist 0, andernfalls würde der Wert der aktuellen Zelle zum Wert der Zelle nach rechts addiert):

[>+<-]

Im Allgemeinen wird dieser Code jedoch zum Verschieben einer Variablen verwendet.

Speicher: (Vorher)

10 0 100 0 0 0
     ^

Speicher: (Nachher)

10 0 0 100 0 0
     ^

Länge 25 Snippet

Kehren Sie eine Eingabe mit sechs Zeichen um und drucken Sie sie aus, gefolgt von jedem ASCII-Zeichen (N-1) .. 1 (wobei N der Wert des ersten eingegebenen Zeichens ist).

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

Länge 53 Snippet

main(){i=0;j=0;if(i>=0){if(j<=i)i+=1;i-=1;}return 0;}

Dieses minimierte C-Programm ist auch ein verstecktes Brainfuck-Programm und umgekehrt! Tatsächlich machen sie (fast) dasselbe. Hier ist der Brainfuck-Code ohne die "Kommentare" (C-Code).

><+-

Lassen Sie mich den Brainfuck-Code (und den C-Code) erklären. Wie Sie sehen, werden zwei Zellen ( iund j) verwendet. Es erhöht die erste Zelle (inkrementiert ium 1). Dann dekrementiert es dieselbe Zelle (Dekrement ium 1).

Dies ist nur ein albernes Beispiel dafür, dass Quellcode in zwei verschiedenen Sprachen kompiliert und (praktisch) gleich ausgeführt werden kann.


2
,[.,]- 5 Zeichen, Katzenprogramm
Tomsmeding

13
Dies ist vielleicht das beste "Brainfuck 101", das ich je gesehen habe.
hoosierEE

Länge 6: Das würde die Summe in die rechte Zelle und die linke auf Null setzen. Nicht bewegen, richtig?
Filip Haglund

Der Länge 6 wurde eine Dummy-Variable hinzugefügt, um das Konzept besser zu erläutern. Das Programm fügt tatsächlich Zelle 3 zu Zelle 4 hinzu und macht Zelle 3 zu 0.
YoYoYonnY

58 Stimmen - könnten Sie aktualisieren? :)
Conor O'Brien

65

C ++

Mit seinem Präprozessor, Vorlagen, Lambdas, Typmerkmalen und unzähligen anderen komplexen Funktionen, von denen niemand jemals hoffen kann, dass sie vollständig verstanden werden, wird C ++ von jeder neuen Generation seines Standards neu entdeckt. Seine zahlreichen Möglichkeiten , durch die Ausnutzung Dinge bei der Kompilierung zu tun, eine Null - Overhead Abstraktionen wie eine Bibliothek schreiben kann , die auf numerische Datentypen , um zu werden angebracht physikalische Einheiten erlaubt , ihre Solidität bei der Kompilierung zu überprüfen (zB Sie das Ergebnis nicht zuordnen können kg* mzu N)

Länge 1

#

In der Regel wird eine Präprozessor-Anweisung eingeführt, #die in einer eigenen Zeile stehen kann. Es bedeutet im Wesentlichen nichts und scheint so unbekannt zu sein, dass die meisten Syntax-Highlighter, die ich sehe, es nicht wissen.

Länge 2

%:

Natürlich hat nicht jeder einen #Schlüssel, deshalb ist C ++ (nun, es hat ihn wirklich von C geerbt) großzügig, damit Sie ihn mit diesem alternativen Token (auch bekannt als Digraph ) schreiben können.

Länge 3

??=

Dies ist ein historischer Kurs über C ++. Diese Tage sind nicht mehr unbedingt gültig, obwohl Implementierungen sie unterstützen können, sind Trigraphen. Diese Sequenz wird #auf den Systemen übersetzt, die sie unterstützen. Um jedoch die unformatierten Zeichenfolgenliterale nicht zu beeinträchtigen, ist sie in diesen nicht zulässig. Die Implementierungen haben möglicherweise beschlossen, die Unterstützung insgesamt einzustellen.

Länge 4

auto

Ist eine der neueren (seit C ++ 11) Erfindungen, die das Arbeiten mit generischem Code erleichtert. Es dient zum Ableiten des Typs eines Ausdrucks und kann seit C ++ 14 sogar zum Ableiten von Lambda-Parametern und des Rückgabetyps von Funktionen verwendet werden.

Länge 5

 catch

Ist ein Schlüsselwort, das auch aus vielen anderen Sprachen bekannt ist und in C ++ vorhanden ist, aber der gute idiomatische C ++ - Programmierer verwendet es fast nie. Mit seinen Konstruktoren und Destruktoren verwendet idiomatic C ++ ein weit verbreitetes Prinzip namens RAII (Resource Acquisition is Initialization) oder wie ich es manchmal angemessener nennen möchte: SBRM (Scope Bound Resource Management). Aufgrund von Klassen wie intelligenten Zeigern kann man die Lebensdauer von dynamisch zugewiesenen Ressourcen (das ist nicht nur Speicher!) An andere Objekte binden. Wenn diese den Gültigkeitsbereich verlassen (z. B. durch eine ausgelöste Ausnahme), bereinigen diese Objekte automatisch Ressourcen. Dies ermöglicht einen ausnahmesicheren und einfach zu verwendenden Code, der nicht verwendet werden muss catch.

Länge 6

[](){}

[]{}()

Wie Stefan in den Kommentaren erwähnte, können Sie []{}als kürzestes Lambda-Objekt verwenden, daher ist dies die kürzeste Form, um ein Lambda zu nennen . Der folgende Text ist für die alte Version:

ist wahrscheinlich die kürzeste Form eines Lambda. Lambdas in C ++ sind Objekte (vom implementierungsdefinierten Typ), die einen Teil des Bereichs erfassen können, in dem sie erstellt wurden (die [] -Syntax steuert dies) und aufrufbar sind (die () -Syntax steuert dies). Ihr Code (The {} part) hat Zugriff auf diese Variablen, als ob sie in ihrem Gültigkeitsbereich wären. Mit ihren optionalen Rückgabetypen und der in C ++ 14 eingeführten automatischen Parameterableitung sind sie das Werkzeug für alle Standard-Bibliotheksalgorithmen, die einen aufrufbaren Wert erwarten (z. B. der dritte std :: sort-Parameter).

Länge 7

virtual

Ist das Schlüsselwort für die Verwendung des Laufzeitpolymorphismus in C ++, einem der Grundbausteine ​​der objektorientierten Programmierung. Dies folgt dem Prinzip "Zahlen Sie nicht für das, was Sie nicht verwenden", wobei in anderen Sprachen alle Funktionen standardmäßig virtuell sind. Da es sich um eine Sprache mit mehreren Paradigmen handelt, ist es möglicherweise eine Überraschung für Leute, die denken, dass "C ++ objektorientiert" ist, Programme oder Bibliotheken zu sehen, die dieses Schlüsselwort fast nicht verwenden, z. B. weil sie dem Prinzip der generischen Programmierung folgen.

Länge 8

override

Die Zusammenarbeit mit dem Schlüsselwort virtual overrideist eine der späteren Ergänzungen von C ++, damit der Compiler mehr Arbeit für Sie leistet. Indem Sie es verwenden, drücken Sie die Absicht aus, eine virtuelle Funktion in der Basisklasse zu überschreiben, und der Compiler gibt einen Fehler aus, wenn Sie einen Fehler gemacht haben und diese Klasse nicht über die angegebene Funktion verfügt. Im Allgemeinen wird es als guter Stil angesehen, wenn Ihr Code die Absicht ausdrückt, anstatt mit Bits zu fummeln.

Länge 9

constexpr

Da es auch eine spätere Ergänzung zu C ++ ist, constexprkann der Programmierer für Funktionen oder Variablen ausdrücken, dass sie zur Kompilierzeit bekannt sind und zur Kompilierzeit compilierbar sein sollten. Auf diese Weise können diese Funktionen in Kontexten verwendet werden, in denen Zeitausdrücke zum Kompilieren erforderlich sind (z. B. als Vorlagenparameter oder Arraygrößen). Viele Standard-Bibliotheksfunktionen (falls möglich) sind bereits in constexpr enthalten, sodass sie hier verwendet werden können.

Länge 10

for(i:c){}

Ist eine vollständige Schleife über einen Container oder ein containerähnliches Konstrukt, das Iteratoren unterstützt std::beginund std::endabruft (einschließlich Arrays im C-Stil). Es ist im Grunde gleichbedeutend mit for(auto __i = std::begin(c); __i != std::end(c); ++__i){ auto& i = *__i; }. Dies ermöglicht ein einfaches Durchlaufen von generischem Code.

Länge 11

void f()&&;

Dies ist eine neue Methode, um Elementfunktionen und die Eigenschaften für das Objekt zu deklarieren, für das sie aufgerufen werden können. In früheren Versionen von C ++ hatten wir nur die Möglichkeit void f() const;, den Compiler anzuweisen, die Funktion für const-Objekte aufzurufen (ohne die const können Sie sie also nicht für Nicht-const-Objekte aufrufen). Genauso haben wir jetzt die &&Syntax für r-Wert-Referenzen, die verwendet werden, um diese Funktionen für r-Werte aufrufen zu können.

Länge 12

int main(){}

Dies ist wahrscheinlich das kürzeste vollständige Programm, das Sie kompilieren und ausführen können. Es wird nichts tun und 0 zurückgeben. Diese Rückgabe ist einer der vielen Sonderfälle, denen Sie in C ++ begegnen können. Normalerweise ist das Zurückgeben von nichts undefiniertes Verhalten, aber für die Einstiegspunktfunktion main bedeutet das Zurückgeben von nichts das Zurückgeben von 0.

Länge 13

auto f()->int

ist eine ziemlich neue Methode, um den Rückgabetyp einer Funktion zu deklarieren. Normalerweise würden Sie dies nicht tun, wenn Sie den Typ bereits kennen, aber es gibt viele Situationen in der generischen Programmierung, in denen der Typ von Vorlagenparametern und den von Ihnen verwendeten Variablen abhängt. Doing es auf diese Weise ermöglicht eine etwas einfacher Zugriff auf diese Parameter wie in template<class T> auto f( const T& t ) -> decltype(t.foo())statttemplate<class T> decltype(std::declval<T>().foo()) g( const T& t ) { return t.foo(); }


2
Ich würde vorschlagen, ;ein alternatives 1-Zeichen-Snippet zu verwenden, da es sich nicht um ein Präprozessor-Makro handelt und die Tatsache, dass in C ++ überhaupt eine 1-Zeichen-Anweisung möglich ist, verwirrend erscheint.
Joe Z.

1
[](){}ist nicht die kürzeste Form eines Lambdas: Da die Liste der Parameter leer ist, kann sie weggelassen werden. Daher []{}ist das kürzeste Lambda. Trivialerweise []{}()ist die kürzeste Ausführung eines Lambda ;-) ideone.com/k8fAvs
stefan

@stefan: ja, ich vergesse es immer, da es dann nicht so aussieht;) Ich habe es der Antwort hinzugefügt.
PlasmaHH

@PlasmaHH Ich hasse es absolut, weil es in der Tat nicht wie eine Funktion aussieht .. ;-)
Stefan

59

Regex

Länge 2 Schnipsel

[]

JavaScript : Eine leere Zeichenklasse, die mit nichts übereinstimmt.

PCRE , Java , Pythonre , Ruby (getestet auf Version 2.0): Syntaxfehler.

Länge 1 Snippet

.

., genannt Dot-All, ist in allen Geschmacksrichtungen erhältlich, die ich mir ansehen durfte.

Was passt dazu?

I̧ņ g͟ę͜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͝ .͟ņ̸

JavaPattern : Im Standardmodus entspricht dot-all jedem Codepunkt mit Ausnahme dieser 5 Codepunkte \r\n\u0085\u2028\u2029. Wenn der UNIX_LINESModus aktiviert ist (aber nicht DOTALL), entspricht der Punkt-All-Befehl einem beliebigen Codepunkt, mit Ausnahme von \n. Wenn der DOTALLModus aktiviert ist, entspricht "Alles punktieren" einem beliebigen Codepunkt. Arbeitet ab Java 5 Patternmit Codepunkten, sodass Astralzeichen mit Punkt-zu-Punkt abgeglichen werden.

Pythonre (getestet unter 2.7.8 und 3.2.5, möglicherweise ab Version 3.3): Im Standardmodus entspricht dot-all jeder UTF-16-Codeeinheit (einschließlich 0000 bis einschließlich FFFF), mit Ausnahme von \n. re.DOTALLHebt die Ausnahme auf und erstellt .Übereinstimmungen mit jeder UTF-16-Codeeinheit. Funktioniert in diesen Versionen remit UTF-16-Codeeinheiten, sodass .nur eine Codeeinheit von Zeichen in der Astralebene abgeglichen werden kann.

.NET : Wie Python. Der Dot-All-Modus in .NET wird aufgerufen Singleline.

JavaScript (C ++ 11 <regex>) : Im Standardmodus entspricht dot-all jeder UTF-16-Codeeinheit mit Ausnahme dieser 4 Codepunkte \n\r\u2028\u2029. Wenn das sFlag aktiviert ist, entspricht der Punkt allen UTF-16-Codeeinheiten. JavaScript funktioniert auch mit UTF-16-Codeeinheiten.

PCRE : Je nach Build - Option, alle Punkt kann ausschließen \r, \noder \r\noder alle 3 CR LF - Sequenzen oder über Unicode Neue - Zeile - Sequenz in Standardmodus. Im Standardmodus arbeitet die Engine mit Code-Einheiten (8-, 16- oder 32-Bit-Code-Einheiten), sodass mit Ausnahme der Newline-Sequenzen alle Code-Einheiten mit allen Punkten übereinstimmen. Im UTF-Modus arbeitet die Engine mit Codepunkten, sodass alle Punkte mit Ausnahme von Zeilenumbrüchen mit allen Codepunkten übereinstimmen. Der Punkt-alle-Modus wird aufgerufen PCRE_DOTALL.

PHP (auf ideone getestet): PCRE, als UTF-8-Bibliothek kompiliert und \nstandardmäßig die einzige Newline-Sequenz. Der Dot-All-Modus ist über das sFlag erreichbar.

Postgres : Im Standardmodus entspricht dot-all ausnahmslos jedem Codepunkt.

Ruby (getestet auf Version 2.0.0): Entspricht im Standardmodus .jedem Codepunkt mit Ausnahme von \n. Der Dot-All-Modus ist über das mFlag (!) Erreichbar .

s Mit dem Flag wird die Windows-31J-Codierung in Ruby angegeben.


Factoid

Ŗ͞eŖ͞e̡͟҉ǵ͟͢x̴̢͘͡ ̛̀҉҉̢c̛̀҉҉̢a҉̷̨n̸̛͞ ̷̸̀p̷̸̀ą̴͠͡҉̵ŗ͜͢s̸̸̷̢͝è̢͡ ̨̧̀H̨̧̀T̨̧͜͜M̷͞L̷̛͜.̴̡́ Wiederholen Sie nach mir R̶̶̢̧̰̞̻̮̳̦̥ͭͯ̓̈ͯͤ̇͊͊͟ĕ̹̩̪͈͈͍̗͎̝͚̽̈ͨ̐̽ͪͮ̍͐ͮͧ̔̏̓ͣĝ̵̢̢̖̤̜̭͔͊͒ͦ͛ͤ͗ͬͧͪ̾͘͟eͦ̄ͭ̑̾҉̨̨̝̬̹̘̭͔͟͢x̣̻͓̠͈͕̥̜͚̝̫͚̳̾̍ͦ̑̈̋̌̉͊ͮ͗̄̆̒̚̚ ̸̦͈̥̬̺͇ͧͧ͐ͮ̌ͤ̈̒̆ͣ̈̏̔͊̐ç̨̬̪̳̦͎̖͕̦͔ͨ̿̓̈ȁ̸̳̺̠̭ͮ̓̐͘̕͜͡ņ̨̫͔͍̬̤̘͎͚̣̟̦͍̜ͭͭ̈ͦ̈̽͗ͥ̑͝͡ Parse ͉̭̫̰͔̝͓̼̮͚̻͎͎͉̐͗͗͊̇ͣ͒͗͑̆͐̐ͬ͛ͮ͝H̢̥͕̼͓̫͙̺̼̮ͣͦ̍ͨ͒̔̌T̪̦̻̦͖̞̤͒̑ͭ̐̑ͭͣ͐̒̉͊͜͜M̞̪͇͕̩͉͗ͧ̌ͯ͋̉̍ͭ̓̇̐̌͜͠Ĺ̷̨̳̘̯͚͓͛͌ͭ̉̍.ͯ͆̊ ͯ̇̓̏͐ͪ̋̈͑̕҉̷̠̰̼̤


35
Ich fühle mich schlecht für jemanden, der den Hinweis des Faktoiden nicht versteht.
Robobenklein

6
@robobenklein Ich kenne eine Geheimmedizin für deine Schmerzen: Erleuchte uns einfach!
Fehler

24
@flawr Für diejenigen, die die berühmte Frage nicht kennen: Die erste Antwort auf stackoverflow.com/questions/1732348/… ist, wonach Sie suchen.
Robobenklein,

1
Sie können den Zalgo'ed-Text lesen, aber nehmen Sie ihn in beide Richtungen nicht zu ernst. Es ist einfach falsch, blind dem Weg von Zalgo zu folgen, aber der Zalgo-Text ist nicht immer falsch.
n̴̖̋h̴̖̋a̷̭̿h̷̭̿d̸̡̅ẗ̵̨́

12
@ n̴̖̋h̴̖̋ã̷͉h̷̭̿d̷̰̀ĥ̷̳, werden Sie nicht all diese Stimmen verwenden, um uns zu zeigen, wie man HTML analysiert?
mbomb007

57

J

PS: Mit tryJ.tk verknüpfte Snippets, mit denen Sie in Ihrem Browser in JavaScript herumspielen können, ohne J. zu installieren.

PPS: Ich habe die Bestellung getauscht. dies ist sinnvoller für mitwirkende und für zukünftige referenzen.

PPS: Ich denke, aus Zeitgründen werde ich jeden Tag einen Ausschnitt hinzufügen

factoid:

J ist ein Nachkomme von APL (siehe hier für die Familiengeschichte) abzüglich des lustigen Zeichensatzes.

Länge 1 Snippet

_

J verwendet _sowohl als Unendlichkeitsindikator als auch als Negativindikator , wenn es an Zahlenliterale angehängt ist (im Gegensatz zum Verb -).

Länge 2 Schnipsel

a.

a.heißt Alphabet und enthält alle 1-Byte-Zeichen. Daher enthält J keine Funktionen wie atoi:a. i. 'z' =122

Länge 3 Schnipsel

i.9

i.ist für ganze Zahlen, wenn sie monadisch verwendet werden (dh nur ein Argument, das richtige, normalerweise y genannt). Bei dyadischer Verwendung dient es wie im obigen Beispiel als Index für .

Länge 4 Schnipsel

!!6x

J unterstützt ganzzahlige und rationale Zahlen mit beliebiger Genauigkeit . Dies berechnet die Fakultät der Fakultät von 6 (eine 1747-stellige Zahl).

Länge 5 Schnipsel

^.^:_ 

Eine dichte ... Erstens sind Verben (als J-Call-Funktionen) nach Themen geordnet. Alle ^ Verben sind an die Potenzierung gebunden. ^für Potenzierung (und expwenn monadisch, verwendet ^.für die Logarithmen . ^:eine besondere ist, die Strom Verbindung (a Funktion höherer Ordnung), die eine Funktion einer Anzahl von Malen angewendet wird . Wenn rechts das Argument Unendlichen ( _) führt er seine linke Argument (in das Beispiel ^.) auf seine eigene Ausgabe, bis es konvergiert. In der Tat ^.^:_ist ein Verb zu lösen, x = ln(x)wenn auf ein Argument angewendet, aber 1, ergeben 0.318132j1.33724.

Länge 6 Schnipsel

^0j1p1

oder äquivalent

^o.0j1

Eulers Identität in J. Wie oben zitiert, ^ist exp(). Neben willkürlichen Genauigkeitszahlen und -rationalen unterstützt es auch Potenzen von pi und komplexen Zahlen sowie Kombinationen davon als Literale. 0j1p1bedeutet (0 + j) * pi ^ 1.

Länge 7 Schnipsel

+/&.:*:

Ein Verb, das die 2-Norm eines beliebigen Vektors nimmt. Dies zeigt zwei Dinge:

  • Das Insert- Adverb verwandelt das Add-Verb +in eine Summe, indem es zwischen die einzelnen Elemente seines Arguments eingefügt wird. Daher (0+1+2+3) = +/ i.4.

  • Die Konjunktion Unter bei Verwendung als v &.: u yentspricht vi u v y, wo viist die Vorderseite (in der Regel die Umkehrung).

Ja, J kennt sich mit funktionellen Inversen aus. Wenn Sie diese kombinieren, entspricht das Verb im Snippet %: @: (+/) @: *:oder beispielsweise sqrt(sum(y.^2))in Matlab.

Länge 8 Schnipsel

$#:I.@:,

Eine Gabelung besteht aus 3 Verben ohne Hinweis auf Argumente. Dies ermöglicht das, was in J als implizite (punktfreie) Programmierung bezeichnet wird. Eine Gabel f g hist im monadischen Fall (wie in diesem Beispiel) äquivalent zu (f y) g (h y). Als Gabeln sind mehrdimensionale Arrays ein wesentlicher Bestandteil von J. "Indizes" gibt die Indizes der Einsen in einem Vektor zurück, erstreckt sich jedoch nicht auf höhere Dimensionen als solche. In diesem Beispiel werden Shape , Antibase und I.@:,als die drei Zinken der Gabel verwendet, die I. für höherdimensionale Arrays implementieren. Beispiel:

 ($#:I.@:,) 5 = i. 5 5 NB. indices of 5 in i. 5 5

Länge 9 Schnipsel

<"1 i.4 6 

Boxed Arrays sind ein Datentyp in J, mit dem heterogene Inhalte (sowohl Typ als auch Größe) zu einem Wert kombiniert werden können. Monadic < Boxen ist das Argument. Rank ist ein zentrales Konzept in J und ermöglicht es, Verben automatisch auf Arrays höherer Dimensionen auszudehnen. Sowohl Nomen als auch Verben haben einen Rang.

Der Substantivrang ist die Anzahl der Dimensionen eines beliebigen Substantivs, die das Verb $@$Ihnen mitteilen kann. Zum Beispiel i. 2 3 4ist ein Array von Rang 3.

Verbrang ist der Rang, auf den sich ein Verb bezieht. Jedes Verb hat einen inneren Rang, der mit der Basis- Konjunktion abgefragt werden kann . v b. 0gibt 3 Zahlen für den monadischen, dyadischen linken und dyadischen rechten Rang des Verbs v zurück.

Ein Verb bearbeitet Substantivzellen mit einem Rang, der dem Rang des Verbs entspricht, und ersetzt die Ergebnisse in einem Substantivrahmen rank-verb rank. Der Rang eines Verbs kann mithilfe der Rang-Konjunktion begrenzt werden , wie hier, indem Zellen (Zeilen) des Rangs 1 in Boxen angeordnet werden, anstatt an Rang _ zu arbeiten, d. H. Boxen das gesamte Array. Weitere Informationen zum Rang finden Sie hier .

Länge 10 Schnipsel

<./ .+~^:_

Dieses Snippet ist ein Verb, das den kürzesten Weg über gewichteten Digraphen berechnet . Es führt minimum ( <./) und die Dot-Konjunktion ein . Die Punktkonjunktion ist eine Verallgemeinerung des Matrixprodukts, das als geschrieben werden kann +/ . *. Im Allgemeinen u . vist äquivalent zu u@(v"(1+lv,_))wobei lv der linke Rang des Verbs v ist. Oder in Worten "u wird auf das Ergebnis von v in Listen von" linken Argumentzellen "und dem rechten Argument in Summe" angewendet. (Siehe oben für Ränge)

Als solches ersetzt das innere Verb <./ .+~item y(i,j)mit dem Minimum von y(i,k)+y(k,j)für alle k.

^:_ iteriert diesen Schritt bis zur Konvergenz.

Beispiel für die Anzeige von Original- und kürzesten Wegstrecken:

(]; <./ .+~^:_ ) wtm=: _6]\0 2 5 _ _ _ _ 0 4 1 3 _ _ _ 0 _ _2 _ _ _ 4 0 _ 5 _ _ _ _1 0 6 _ _ _ _ _ 0

Länge 11 Schnipsel

<.@o.10x^99

Dieses Snippet führt speziellen Code ein : Einige J-Codes werden von speziell für einen bestimmten Anwendungsfall geschriebenem Code unterstützt, der zum Zeitpunkt der Analyse erkannt und optimiert wird. entweder für höhere Genauigkeit (wie hier der Fall) oder höhere Leistung (siehe Spezialkombinationen )

Diese Phrase gibt 99 Stellen pi (obwohl 99 Dezimalstellen verschoben). Spezialcode hängt von der exakten Phrasierung ab. Was normalerweise äquivalent wäre, ist nicht so genau wie der Snippet-Code: <.o.10x^99 Verliert die erweiterte Genauigkeit.

Länge 12 Schnipsel

($-.1:)($,)]

Von Zeit zu Zeit geraten Sie in Situationen, in denen aufgrund von in Daten vorgenommenen Auswahlen Singleton-Dimensionen im Weg stehen. Dieses praktische Dienstprogramm, in Matlab Squeeze genannt, komprimiert alle Singleton-Dimensionen. Der linke Zinken der Gabel ($-.1:)ergibt alle Dimensionen ohne die einen, während der mittlere Zinken ($,) das raveled Array in die beibehaltenen Dimensionen umformt. Der richtige Zinken ]dient nur dazu, dies zu einer Gabelung zu machen, und verweist auf das richtige Argument.

Länge 13 Schnipsel

1 :'-u%u d.1'

Newtons Methode findet eine Approximation einer Wurzel einer differenzierbaren Funktion. Dieses explizite Adverb ist auf die Funktion anzuwenden, deren Wurzel gesucht wird, und stellt einen Schritt des iterativen Verfahrens dar. uist das Argument, das auf die Funktion verweist und in dem Moment ersetzt wird, in dem das Adverb angewendet wird. d. ist eine Konjunktion, die symbolisch Funktionen ableitet und hier möglicherweise durch eine solche ersetzt wird D., die numerisch dasselbe bewirkt (unterscheidet sich jedoch, wenn sie auf höherrangige Funktionen angewendet wird). Das Ergebnis ist ein Haken, der die Gabel ( ugeteilt durch ihre Ableitung) vom Argument subtrahiert .

Zum Beispiel:

(_2 + *:) (1 :'-u%u d. 1')^:_ ] 1 NB. root of x^2-1; ] is there to avoid combining _ and 1 into an array.

Länge 14 Schnipsel

(%-.-*:)t.i.10

Erste 10 Nummern der Fibonacci-Serie von Taylor Erweiterung von x / (1 - x - x^2). Das Analysieren des Hakens %-.-*:ergibt (y % (-.-*:) y) = (y % ( (1 - y) - *: y).

Länge 15 Schnipsel

(#{.+//.)!/~i.9

Eine weitere Version der Fibonacci-Serie. Diesmal aus einem anderen Blickwinkel; ausgehend von Pascales Dreieck '! /~i.9'.

/Bei dyadischer Verwendung bedeutet " Tabelle" , dass das Verb, an das es gebunden ist, zwischen den einzelnen Zellen der Argumente angewendet wird. Auf diese Weise wird eine Tabelle der Operationen zwischen den Argumenten x und y erstellt. In diesem Fall !dyadisch, als Kombination (oder Out of) . ~macht das Verb reflexiv , dh. benutze das rechte Argument auch als das linke.

Das Adverb /.ist ein seltsames, es wendet es entlang der Antidiagonalen eines Arrays an (dh versuchen Sie es </.!/~i.5hier )

Dieses Snippet nimmt also die Summe der 9 ersten Antidiagonalen des Pascalschen Dreiecks, was zufällig eine weitere Fibonacci-Serie ist.

Länge 16 Schnipsel

;/@~.,. <"0@#/.~:

Ok, ich habe ein Leerzeichen hinzugefügt, um auf 16 zu kommen :). Dieses Snippet demonstriert eine Verzweigung mit Key : Auflisten aller Elemente im Argument und ihrer Häufigkeiten.

x u/. ygilt u in Chunks zu y , wobei x einmaligen oder in J ist: (=x) u@# ywo =ist Selbst Klassifizieren , das eine Boolesche Array mit 1'en in Positionen erzeugt , wo sie in dem erscheinen nub ~. Hier wird es reflexiv angewendet, wodurch Tally für jedes einzelne Element in y ausgeführt wird, wobei die Anzahl der Auftritte gezählt wird.

Da die meisten Verben in J die Knotenreihenfolge (Reihenfolge des Auftretens neuer eindeutiger Elemente, im Gegensatz zu beispielsweise uniquein Matlab, bei dem das Argument sortiert wird) beibehalten, können die Elemente wie hier beschrieben nach ihrer Häufigkeit gestickt werden. ;/@~.wird verwendet, um eine Box-Liste aller Elemente zu erstellen.

Beachten Sie, dass dieser Code aufgrund des vorherrschenden Rank- Konzepts für jede Dimension geeignet ist .

Länge 17 Schnipsel

*./ @:(#&>)@C.@A.

J unterstützt einige Grundelemente speziell zu Permutationen:

  • Anagramm A. Monadisch findet es den Anagramm-Index, dyadisch wendet es die Permutation an, die durch den Anagramm-Index im linken Argument auf das rechte Argument angegeben wird.
  • Cycle - Permute C. konvertiert zwischen direkter und zyklischer Darstellung von Permutationen.

Bei diesem Snippet handelt es sich um ein Verb, das einen Anagrammindex links (zwischen 0 und !#y) und rechts als Argument für ein zu permutierendes Array verwendet. Danach berechnet es die LCM *./ der Zykluslängen #&>, d.h. Der Zeitraum, nach dem Sie das ursprüngliche Array zurückerhalten:

]n=: (p=:?!9) *./ @:(#&>)@C.@A. i.9 NB. period of a random permutation
p&A.^:n i.9 NB. applies permutation n times.

Länge 21

<:@(#/.~)@(i.@#@[,I.)

Dieses kleine Verb stammt aus dem Add-On "stats / base" und wird als Histogramm bezeichnet . Bei einer Liste von Bin-Starts werden alle Vorkommen von Daten in dem Intervall summiert, in dem ]bn-1,bn]bn der Start der Bin-Nummer n ist.

Er nutzt den IntervallindexI. , um das Intervall zu ermitteln von:

Wenn y die Form eines Elements von x hat, dann ist x I y das am wenigsten negative j, so dass j {x in der Reihenfolge y folgt, oder #x, wenn y in der Reihenfolge {: x folgt oder x hat keine Gegenstände.

Die Gesamtsummen für jedes Intervall werden mit der Taste erstellt , die in Ausschnitt 16 hervorgehoben ist.

Das auf tryj.tk verlinkte Snippet demonstriert den zentralen Grenzwertsatz anhand des folgenden Histogramms:

(bins=:(%~>:@i.)10) ( [ (graph=:(,&":"0 1 '#'#"0 1~])) (histogram=:<:@(#/.~)@(i.@#@[,I.)) ) (+/%#) ?5 200 $ 0

Länge 22

=,&(+/)(~:#[)e.&~.~:#]

Fun in J. Hiermit wird eine Mastermind-Engine implementiert, bei der ein geheimes Array als linkes Argument und eine Vermutung als rechtes Argument verwendet werden. Die zurückgegebenen Werte sind die Anzahl der weißen und schwarzen Stifte. Auseinander genommen:

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

Wie benutzt werden

secret (=,&(+/)(~:#[)e.&~.~:#]) guess

Wo secretund wo guessgibt es ein Array? Es funktioniert tatsächlich mit jedem Datentyp.


17
Nun, entweder erhalten Sie einen unlesbaren Haufen seltsamer Symbole, oder Sie erhalten einen unlesbaren Haufen ASCII-Symbole. Wähle dein Gift.
John Dvorak

16
@JanDvorak Alle Sprachen sind unlesbar, bis Sie sie lernen. ;-)
Gareth

5
Früher habe ich lange nachgedacht, beschreibende Namen helfen beim Codeverständnis. Dann habe ich wurde erleuchtet .
hoosierEE

@Gareth Aber nicht alle sind nicht lesbar , auch nachdem Sie sie gelernt haben. Ich werde keine Namen nennen.
Fehler

45

RPL (Redstone Programming Language) [und Minecraft]

Dies ist eine große Frage, ob wir dies als echte Programmiersprache betrachten können oder nicht, aber wir werden es trotzdem versuchen. Und da diese beiden "Sprachen" praktisch gleich sind, werde ich sie kombinieren, manchmal Snippets in "Minecraft" -Sprache (Redstone usw.) und manchmal in RPL posten. Da viele Snippets in Minecraft enthalten sein werden, werde ich Links zu den Bildern und nicht zu den Bildern selbst posten, um Platz zu sparen. Zusätzlich werden alle Schnipsel von Programmierkonzepten in Minecraft sein, nicht von allgemeinem Redstone (dh es werden keine Redstone-Türen angezeigt). Zeichen werden in Bytes gezählt (in RPL) oder als entsprechend dieser (in Mine).

Factoid:

RPL ist eine Programmiersprache von Tossha the Inventor , die Code in Minecraft Redstone- und Befehlsblöcke konvertiert. Es kann Eingaben und Ausgaben, Schleifen, ganzzahlige Manipulationen, Triggerfunktionen, Wurzeln und mehr ausführen.

Länge 1:

Eine Schaltfläche (1 Byte) ist die einfachste Form der Eingabe in Minecraft. Es kann auch ein "Programm" starten oder stoppen. In ähnlicher Weise ist ein Hebel (ebenfalls 1 Byte) eine andere Form der Eingabe und kann auch verwendet werden, um das Programm zu starten und zu stoppen, da es einen "Ein" - und "Aus" -Zustand aufweist. Zu beachten ist, dass Minecraft im wahrsten Sinne des Wortes eine 3D-Programmiersprache ist. Daher kann es einen großen Unterschied machen, wo sich der Knopf / Hebel im Programm befindet.

Länge 2:

Ein Knopf an einer Redstone-Lampe ist so ziemlich Ihr grundlegendes Katzenprogramm. Es nimmt den Eingang (mit einem Knopf oder Hebel, entweder 0oder 1( offoder on)) und gibt ihn in der Form als Licht von der Lampe als entweder 0oder 1( offoder on) aus.

Bildbeschreibung hier eingeben

Länge 3:

Wie unten zu sehen, ist dies eines der kürzesten Programme zur Änderung des Quellcodes (da Sie die Quelle zur Laufzeit mit Minecraft ändern können!). Nun, dieses spezielle Programm hat wirklich keinen Sinn, aber das Konzept kann mit anderen kombiniert werden, um einige großartige Programme zu erstellen (um mehr Upvotes zu erhalten). Wenn dieses Programm ausgeführt wird, wird die Eingabequelle entfernt und es kann nicht mehr ausgeführt werden. Bildbeschreibung hier eingeben

Länge 4

Dieses "Snippet" zeigt tatsächlich zwei Konzepte: Verzögerung und das NICHT-Gatter. Die Verzögerung wird mit bestimmten Redstone-Elementen durchgeführt, die eine Redstone-Tick- Verzögerung aufweisen. Eine Redstone-Zecke entspricht einer Zehntelsekunde. Verschiedene Redstone-Komponenten haben unterschiedliche Verzögerungen: Eine Fackel hat eine Verzögerung von 1 Sekunde (1 Redstone-Tick), ein Komparator eine Verzögerung von 1 Sekunde, ein Repeater kann je nach Einstellung eine Verzögerung von 1, 2, 3 oder 4 Sekunden haben. In diesem Beispiel ist der Redstone-Repeater auf eine 4-t-Verzögerung eingestellt.

Als nächstes ist das NICHT-Tor. Das NOT-Gatter nimmt einen Eingang auf und invertiert ihn. In dieser Konfiguration ist der Ausgang eingeschaltet, wenn der Eingang ausgeschaltet ist, und der Ausgang ist ausgeschaltet, wenn der Eingang eingeschaltet ist.

Länge 5

Das OP-Tor ist in Minecraft sehr einfach zu erreichen. Zwei Eingänge sind mit demselben Ausgang verbunden. Das ist es. Keine lustigen Tricks oder so, es ist ziemlich einfach.

Bildbeschreibung hier eingeben

Länge 6

Hier ist ein Tipp zum Komprimieren Ihres "Codes". Wenn Sie wissen, dass die Signalstärke von zwei Eingängen klein genug ist, um die entsprechenden Ausgänge nicht zu stören, können Sie den Redstone Right Nect miteinander verbinden. Im folgenden Beispiel gibt es einen einfachen Hopper-Timer, der die Elemente in jedem Hopper in ca. 0,5 s vor und zurück überträgt und mit Komparatoren verbunden ist, die eine Signalstärke von 1 ausgeben. Dies bedeutet, dass sich die beiden Ausgänge nicht gegenseitig stören. In diesem Beispiel dienen die Lampen nur zu Demonstrationszwecken und werden nicht für die Gesamtblockanzahl gezählt.

Bildbeschreibung hier eingeben


7
Sie haben 13 Upvotes, ich kann 10 Moar-Programme erstellen?
31.

4
Keines Ihrer Programme ist tatsächlich in RPL geschrieben, geben Sie es also nicht als solches weiter. Dies ist rein Minecraft "Code".
mbomb007

2
Sie haben ein Defizit von 14 Programmen m8. Ich würde gerne sehen, was du vorhast;)
Conor O'Brien

4
Du hasst 21 Upvotes, ich kann 15 Moar-Programme hassen?
wizzwizz4

1
Du hasst 29 Upvotes, ich kann 23 Moar-Programme hassen?
bb010g

42

TI-BASIC

[Die Sprache hängt davon ab, auf welchem ​​Rechner sie verwendet wird. Sofern nicht anders angegeben, wird der TI-84 verwendet.]

Länge 31 Schnipsel

Menu("","1",A,"2",B
Lbl A
Lbl B

Dies demonstriert die Verwendung von Menüs. Das obige ist ziemlich nutzlos, da es nichts bewirkt, aber es kann verwendet werden, um durch die verschiedenen Teile eines Programms zu navigieren. Das erste Argument ist der Menütitel, gefolgt von Optionspaaren (die angezeigte Zeichenfolge gefolgt von einer Beschriftung mit 1 oder 2 Buchstaben). Hier ist ein intuitiveres Beispiel:

Menu("CHOOSE VALUE","AREA",A,"CIRCUMFERENCE",C
Lbl A
Disp πR²
Stop
Lbl C
2πR

Lblkann auch zum Verzweigen mit verwendet werden Goto. Die Verwendung von Menüs ist jedoch aufgrund einiger Einschränkungen ärgerlich: Es können nur sieben Menüelemente vorhanden sein, und jeder Titel darf höchstens vierzehn Zeichen lang sein, sodass das Ganze auf einen Bildschirm passt.

Länge 29 Schnipsel

Real
√(-16
a+bi
Ans
re^θi
Ans

Real(standardmäßig aktiviert) versetzt den Taschenrechner in den Modus für reelle Zahlen, sodass Berechnungen mit komplexen Zahlen einen NONREAL ANSFehler auslösen. Wenn a+bider Taschenrechner in den Modus versetzt wird, werden die Antworten, falls zutreffend, als komplexe Zahlen angezeigt, sodass das zweite Beispiel zurückkehrt4i . re^θiDer Modus verwendet Polarkoordinaten anstelle von Rechteckkoordinaten und gibt diese aus 4e^(1.570796327i).

Länge 23 Schnipsel

If A≥9
Then
1→X
7→Y
End

Dies ist nur eine einfache Bedingung, obwohl es eine ElseAussage geben kann .Thenund Endsind nicht erforderlich, wenn es sich nur um eine Anweisung handelt.

Länge 21 Schnipsel

(-B+√(B²-4AC))/(2A)→X

Jedermanns Liebling, die quadratische Formel. Speichert die erste Lösung in einer quadratischen Gleichung unter der XAnnahme, dass a, b und c in ihren jeweiligen Variablen gespeichert sind, wie in ax 2 + bx + c .

Länge 20 Schnipsel

Shade(|X/2|-3,5-X²,0

Dadurch wird der Schnittpunkt der beiden Funktionen mit mehreren optionalen Parametern abgeschattet: Minimal- und Maximalwerte von x sowie Richtung und Abstand zwischen den Schattierungslinien.

Länge 18 Schnipsel

LinReg(ax+b) L1,L2

Hier berechnen wir die lineare Regressionsgleichung oder die lineare Gleichung, die am besten zu einer Gruppe von Punkten passt, wobei die x-Werte als Liste in L1und die y-Werte in gespeichert werden L2. Es gibt viele andere Regressionsoptionen, einschließlich quadratisch, kubisch und exponentiell.

Länge 17 Schnipsel

dbd(1.2711,1.2115

Hiermit wird die Anzahl der Tage zwischen zwei Daten berechnet, in diesem Fall der 27. Januar 2011, der Tag, an dem diese Website gestartet wurde, und der 21. Januar 2015, der Tag, an dem diese Website erstellt wurde. (Das sind 1455 Tage für die Faulen.) Die Art und Weise, Daten zu codieren, ist etwas seltsam: entweder DDMM.YY oder MM.DDYY, wobei Nullen optional vorangestellt werden.

Länge 16 Schnipsel

For(A,0,5
Disp A

Dies zeigt zwei Teile der Programmierseite der Sprache. Die erste ist eine typische forSchleife, ähnlich wie for(var A=0;a<5;a++)in anderen Sprachen. (Sie sollten den EndBefehl auch verwenden , um aus der Schleife auszubrechen.) Der zweite Befehl ist selbsterklärend: Er wird angezeigtA wird in diesem Fall aufgrund der Schleife fünfmal .

Länge 15 Schnipsel

Y1=|X³-4|
Y2=3X

Hier sind zwei Beispiele für eine bekannte Funktion von Grafikrechnern : Grafikgleichungen. Sie können 10 verschiedene Gleichungen in einer Ebene grafisch darstellen lassen. Es gibt viele nützliche Befehle zum Auffinden von Schnittpunkten, Maxima, Werten von x usw. Diese Gleichungen sehen in einem Standardfenster folgendermaßen aus:

Graph

Länge 14 Schnipsel

[[1,2][34,5]]T

Die Klammern werden verwendet, um Matrizen zu erstellen, und die Ttransponiert die Matrix:

[[1 34]
 [2 5]]

Länge 13 Schnipsel

dayOfWk(9,1,6

Dies findet den Wochentag des 6. Januar 9 n. Chr. Die Ausgabe ist eine Zahl, bei der 1 Sonntag, 2 Montag usw. ist. Dieses besondere Datum war ein Dienstag, die Ausgabe ist also3 .

Länge 12 Schnipsel

Circle(1,3,5

Das erste der grundlegenden Zeichenwerkzeuge zeichnet einen Kreis im Diagramm mit einem Mittelpunkt bei (1,3) und einem Radius von 5.

Länge 11 Schnipsel

randInt(0,8

Dies erzeugt eine (Pseudo-) Zufallszahl zwischen 0 und 8 einschließlich. Es gibt ein optionales drittes Argument, das angibt, wie viele Ganzzahlen generiert werden sollen. Es gibt mehrere andere Zufallsfunktionen, darunter eine für Normal- und Binomialverteilungen, eine für eine Zufallsmatrix und eine für eine zufällig geordnete Liste ohne Wiederholungen. randIntkann ausgesät werden, indem eine Zahl gespeichert wird als rand:2→rand .

Länge 10 Schnipsel

4>5 or 2≠7

Hier haben wir die (In-) Gleichheits- und Logikoperatoren von TI-BASIC. Die Ungleichungsanweisungen werden zuerst mit " true" ausgewertet 0 or 1und geben " ortrue" zurück, wenn eine der beiden Seiten "true" ist. Dies wird also angezeigt1 .

Länge 9 Schnipsel

.656▶F◀▶D

Dies kann von Dezimal in Bruch umwandeln und umgekehrt, was sehr nützlich ist. Es gibt auch dedizierte ▶Fracund ▶DecFunktionen, die nur in eine Richtung funktionieren. Druckt82/125 in diesem Fall.

Länge 8 Schnipsel

lcm(14,6

Dies gibt das am wenigsten verbreitete Vielfache aus von 14 und 6 aus, nämlich 42.

Länge 7 Schnipsel

getDate

Ziemlich selbsterklärend, druckt in diesem Fall nur das aktuelle Systemdatum als Liste {2015 1 19} .

Länge 6 Schnipsel

√({4,9

Arrays (oder Listen) sind von geschweiften Klammern umgeben und durch Kommas getrennt. Dies ähnelt der mapFunktion vieler Sprachen, bei der jedes Element der Liste durchlaufen und die Operation außerhalb der geschweiften Klammern angewendet wird, in diesem Fall Quadratwurzel. Das Ergebnis ist also {2 3}. Beachten Sie, dass schließende Klammern optional sind und daher von nun an weggelassen werden.

Länge 5 Schnipsel

4iii6

Wir haben hier ein paar coole Dinge im Gange. Zuerst werden die Realteile 4 und 6 multipliziert, und dann werden die Imaginärteile multipliziert:, i^3oder -i. Diese multipliziert geben -24i. Dies zeigt funky aussehende Nebeneinander-Multiplikation und TI-BASICs Umgang mit imaginären Zahlen.

Länge 4 Schnipsel

8°5′

Dies sind 8 Grad, 5 Bogenminuten, die in Grad umgerechnet werden, wenn 8.0333...

Länge 3 Schnipsel

8→T

Dies zeigt, wie Zahlen als Variablen gespeichert werden können, was etwas ungewöhnlich ist, da zuerst die Zahl, dann der Speicherpfeil und dann der Variablenname stehen. Wie im Faktoid erwähnt,θ (Theta) auch als Variable verwendet werden, und Variablen können nur einen Großbuchstaben enthalten.

Länge 2 Schnipsel

4M

Ähnlich wie bei Mathematica können Sie mit Nebeneinander multiplizieren, ohne dass dies *erforderlich ist. Standardmäßig werden alle Variablen mit 0 initialisiert, sodass 0 ausgegeben wird, sofern Sie für diese Variable nichts anderes gespeichert haben (siehe Snippet 3).

Länge 1 Snippet

e

Dies ist die Konstante für Eulers Nummer , die als angezeigt wird 2.718281828.

Factoid

Variablen können nur bestimmte Datentypen speichern. Zum Beispiel A- Z(und θ) speichern numerische Werte, str0- str9speichern Strings und [A]- [J]speichern Matrizen (zweidimensionale Arrays).


Übrigens kann der Kleinbuchstabe n(nicht n) auch als Variable verwendet werden.
Ypnypn

Interessant. Ich habe diese Variable noch nie benutzt.
NinjaBearMonkey

3
Man kann darüber streiten, str0ob man 1 Zeichen oder 4 Zeichen hat. Alle Anweisungen in TI-BASIC sind 1 Zeichen lang.
Ismael Miguel

@IsmaelMiguel Ich habe darüber nachgedacht, aber es sind 1 oder 2 Bytes , und ich habe beschlossen, die Zeichen normal zu zählen.
NinjaBearMonkey

1
Ich respektiere deine Entscheidung. In diesem Fall hilft es sehr. Ich habe es wirklich genossen, auf meinem Oldie TI-83 zu programmieren. (Ich habe sogar ein Malprogramm darin entworfen!)
Ismael Miguel

41

GNU Sed

Ich setze mir selbst eine restriktivere Anforderung auf - alle Schnipsel werden vollständig sein sed Programme sein.

Factoid

sed ist eine vollkommene Sprache. Hier ist ein Beweis.

Länge 0 Snippet

Ich glaube nicht, dass ein Snippet der Länge 0 unbedingt erforderlich ist, aber da es tatsächlich etwas in sed tut, ist es hier:

Sed ist der "Stream EDitor", dh er liest den Stream (zeilenweise) aus STDIN, bearbeitet ihn und gibt ihn an STDOUT aus. Das Programm sed mit der Länge Null kopiert einfach STDIN nach STDOUT. Somit kann das catDienstprogramm von sed emuliert werden. Folgendes ist äquivalent:

cat a.txt b.txt > c.txt

und

sed '' a.txt b.txt > c.txt

Länge 1 Snippet

=

Dieses sed-Programm gibt die Zeilennummer jeder Zeile an STDOUT aus. Dies entspricht ungefähr:

nl

oder

cat -n

obwohl die sed-version die zeilennummer in eine eigene zeile setzt.

Länge 2 Snippet

5q

Kopiert STDIN nach STOUT und qbeendet nach Zeile 5. Dies entspricht:

head -n5

Möglicherweise wird hier ein Muster sedangezeigt, mit dem viele der Standard-Tools von core-utils emuliert werden können.

Länge 3 Snippet

iHi

iVor jeder Zeile wird "Hi \ n" eingefügt. Meh.

Länge 4 Snippet

/a/d

Ein Großteil der Macht von sed liegt in seiner Regex-Fähigkeit. Dieses Programm bewirkt, dass alle Zeilen, die amit dem dregulären Ausdruck übereinstimmen, aus dem Stream gelöscht werden. Alle anderen Zeilen werden weiterhin an STDOUT ausgegeben. Dies ist äquivalent zu:

grep -v "a"

Länge 5 Snippet

:l;bl

Dies ist eine Endlosschleife. Wir alle lieben CPU-hogging Endlosschleifen. Definiert ein Label lund bspringt dorthin. Ad infinitum.

Länge 7 Snippet

s/a/A/g

Standardmäßig wendet sed sBefehle so an, dass sie nur dem ersten Vorkommen in jeder Zeile entsprechen. Wenn Sie es benötigen, um jedes Vorkommen in einer Zeile abzugleichen (und zu ersetzen), markieren Sie das gFlag am Ende der Zeiles Befehls dies aus.

Länge 8 Snippet

y/01/10/

Der wenig verwendete yBefehl ähnelt dem trShell-Dienstprogramm (wenn auch nicht ganz so flexibel). Dieses Programm schaltet alle 0s mit 1s und umgekehrt.

Länge 9 Snippet

1!G;$p;h

Dieses Snippet hat eigentlich 8 Bytes, erfordert aber, dass der Parameter -n gesetzt ist, um die Standardausgabe zu unterdrücken. Gemäß den Standardregeln für Code-Golf zähle ich dies als 9. Dieses Programm kehrt die Zeilen im Stream um. Damit:

sed -n '1!G;$p;h'

ist genau gleichbedeutend mit:

tac

Länge 10 Snippet

s/[ <TAB>]+$//

Dies ist eine Wiederholung des (falschen) Länge-6-Snippets. Dadurch werden Leerzeichen (Leerzeichen und Tabulatoren) aus den Zeilen entfernt.


2
Siehe auch NÜTZLICHE ON-LINE-SCRIPTS FÜR SED , wie ich es im Grunde gelernt habesed
Adam Katz

Du hast mehr Stimmen. Können wir noch mehr haben?
Luser Droog

2
Dein Faktoid ist verloren.
Wauzl

1
Schön, aber bitte beachten Sie, dass viele von diesen GNU-Erweiterungen verwenden und nicht dem Standard entsprechen - insbesondere Länge 3 (Standard wäre i\<newline>Hi<newline>), Länge 5 (Standard wäre sed -e :l -e bloder :l<newline>bl<newline) und Länge 10 (für die +sich ein *drehen muss, um überhaupt zu funktionieren). Man beachte , daß die Länge 9 Schnipsel -n '1!G;$p;h' ist Standard, wohingegen tacist nicht . :)
Wildcard

1
@Wildcard Ja - ich habe dies auf GNU sed beschränkt.
Digitales Trauma

39

Python

( mbomb007s Post enthält bereits eine Fülle von Python-Snippets, aber ich dachte, ich würde mit ein paar skurrileren Fakten aufwarten.)

Factoid

Python ist eine dynamisch typisierte Sprache mit Schwerpunkt auf Lesbarkeit.

Länge 1 Snippet

1

In Python 3 ist das oben Genannte Truein dem Sinne äquivalent, dass 1 == True(und auch 0 == False). Beachten Sie, dass dies in Python 2, wo Sie den Wert von neu definierenTrue können, nicht unbedingt zutrifft .

Länge 2 Schnipsel

<>

<>ist ein veralteter Vergleichsoperator, der äquivalent zu ist !=. Es funktioniert immer noch in Python 2 (obwohl von seiner Verwendung abgeraten wird) und wurde vollständig aus Python 3 entfernt.

Länge 3 Schnipsel

...

Python verfügt über eine Reihe von Funktionen, die nicht integriert sind, sondern nur für Bibliotheken von Drittanbietern zur Verfügung stehen. Dieses EllipsisObjekt ist eines von ihnen und wird normalerweise zum Schneiden verwendet. Wenn wir zum Beispiel das folgende 3D Numpy Array haben:

array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

dann gibt a[..., 0](äquivalent zu a[:,:,0]) alle ersten Elemente:

array([[1, 4], [7, 10]])

In Python 3 kann das ...Literal außerhalb der Slicing-Syntax verwendet werden. Auf diese Weise können Sie es auf unterhaltsame Weise als "To-Do" -Marker anstelle von passoder verwenden NotImplemented:

def f(x):
    ... # TODO

Länge 4 Schnipsel

(1,)

Ein Ein-Element-Tupel in Python.

Python hat Listen (z [1, 2, 3, 4]) , die veränderlich sind, und Tupel (z (1, 2, 3, 4)), die im wandelbar. Tupel werden häufig als Wörterbuchschlüssel verwendet, da Listen nicht hashbar sind.

Ein häufiger Anfängerfehler besteht darin, das Komma oben wegzulassen (1), das heißt , es ist nur die Nummer 1, die in Klammern eingeschlossen ist. Das Ein-Element-Tupel ist das einzige Mal, dass Sie ein Komma vor den schließenden Parens benötigen - es löst ein aus, SyntaxErrorwenn Sie versuchen, eines in das leere Tupel einzufügen (), und ist optional für Tupel mit einer Länge von mindestens 2.

Länge 5 Schnipsel

0or x

In diesem Snippet sind einige Dinge im Gange, also lasst uns einen Blick darauf werfen!

orist wie ||in vielen Sprachen. In Python wird A or Bkurzgeschlossen, und es wird zurückgegeben A(ohne zu bewerten B), ob Aes wahr ist, andernfalls wird zurückgegeben B. Zum Beispiel, 1 or xkehrt immer zurück 1, wie 1es immer wahr ist, und funktioniert sogar, wenn xes nicht definiert ist. Auf der anderen Seite wird 0 or xentweder zurückgegeben, xwenn xdefiniert ist, oder NameErrores wird ein ausgelöst, wenn dies nicht der Fall ist.

Beim Golfen können wir normalerweise das Leerzeichen zwischen einer Zahl und einer fallen lassen or, z. B. 1 or xWerden 1or x. Dies ist möglich, da die 1orZahl mit einer Ziffer beginnt und somit eine ungültige Python-ID ist.

Es gibt jedoch eine Ausnahme - 0or, die auf mysteriöse Weise eine SyntaxError. Warum? Weil oktale Literale in Python mit 0o(zB 0o20 == 16) beginnen und der Parser erstickt, wenn er das erreicht r!

Hinweis: In Python 2 können oktale Literale auch mit einer führenden Null beginnen, z 020.

Länge 6 Schnipsel

*x,y=L

Dieses Snippet demonstriert eine spezielle Art der Zuweisung in Python, bei der Les sich um eine Liste, ein Tupel oder eine andere Art von Iteration handelt.

In Python können Sie Tupel und Listen wie folgt "entpacken":

a,b = [1,2]

Dies weist 1 bis aund 2 bis zu b. Diese Syntax wird auch für Mehrfachzuweisungen verwendet, z

a,b = b,a+b

Dies ist nützlich, wenn Sie ein Programm schreiben, das die Fibonacci-Reihe berechnet.

Stimmen die Längen auf beiden Seiten nicht überein, ValueErrorwird a geworfen. In Python 3 wurde jedoch eine neue Syntax eingeführt, die das wiederholbare Entpacken (oder umgangssprachlich "Zuweisung mit Sternchen") erweitert, mit der Sie Folgendes ausführen können:

*x,y = [1, 2, 3, 4, 5]

Dies weist yauf das letzte Element, 5 und xauf den Rest der Liste , das heißt [1, 2, 3, 4]. Sie können sogar so etwas tun:

a,b,*c,d,e = [1, 2, 3, 4, 5, 6, 7]

welche zuordnet 1 bis a, 2 bis b, [3, 4, 5]bis c, 6 dund 7 zu e.

Länge 7 Schnipsel

zip(*x)

zip ist eine Funktion, die eine Reihe von Listen aufnimmt und diese komprimiert:

>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

Hinweis: In Python 3 zipwird stattdessen ein Objekt zurückgegeben. Wenn Sie also eine Liste wie oben wünschen, müssen Sie den Anruf einschließenlist()

Wenn Sie zwei oder mehr Themenlisten haben und die entsprechenden Einträge verknüpfen möchten, ist dies eine praktische Funktion.

Sagen Sie nun, Sie möchten die Liste entpacken - wie würden Sie das tun? Wir können versuchen, es ziperneut zu verwenden , aber dies gibt leider:

>>> zip([(1, 4), (2, 5), (3, 6)])
[((1, 4),), ((2, 5),), ((3, 6),)]

Das Problem ist, dass sich alles in einer Liste befindet, zipdie einzelnen Listen jedoch als separate Funktionsargumente verwendet werden. Um dies zu beheben, führen wir den *splat-Operator ein, der eine Liste / tuple / etc. und entpackt sie als Funktionsargumente:

f(*[1,2]) ==> f(1, 2)

Und das Ergebnis ist:

>>> zip(*[(1, 4), (2, 5), (3, 6)])
[(1, 2, 3), (4, 5, 6)]

Länge 8 Schnipsel

x='a''b'

Als ich das zum ersten Mal sah, wurde ich ein wenig zurückgenommen - was bedeutet es, zwei Saiten nebeneinander zu haben? Die Antwort war einfach:

>>> x
'ab'

Python verkettet lediglich die beiden Zeichenfolgen! Dies ist äußerst nützlich für die Lesbarkeit, da Sie so lange Zeichenfolgen aufteilen können (beachten Sie die umgebenden Klammern):

x = ('This is a very long sentence, which would not look very nice '
     'if you tried to fit it all on a single line.')

Länge 9 Schnipsel

0!=2 is 2

Möglicherweise wissen Sie bereits, dass Python die Verkettung von Vergleichsoperatoren zulässt. Dies 5 < x <= 7gilt nur für 5 < xund x <= 7. Wenn Sie das nicht wussten ... dann überraschen Sie!

Wie auch immer, weniger bekannt ist die Tatsache , dass, da is/ is not/ in/ not insind auch Vergleichsoperatoren, können sie auch verkettet werden. Mit anderen Worten ist der obige Code entspricht (0 != 2) and (2 is 2), das ist True.

Hinweis: Es gibt ein paar Feinheiten mit der 2 is 2Hälfte, da isüberprüft wird, ob zwei Dinge dasselbe Objekt sind , und nicht, ob zwei Dinge denselben Wert haben . Python speichert kleine ganze Zahlen so wie es 1+1 is 2ist True, aber es 999+1 is 1000ist False!

Länge 10 Schnipsel

x=[];x+=x,

Was passiert, wenn Sie sich eine Liste hinzufügen? Wenn wir versuchen zu drucken x, erhalten wir:

[[...]]

Glücklicherweise ist Python printso intelligent, dass er nicht explodiert, wenn er versucht, rekursive Listen zu drucken. Wir können dann ein paar lustige Dinge machen, wie:

>>> x[0][0][0][0][0]
[[...]]
>>> x[0] == x
True

Diese Funktion funktioniert auch mit Wörterbüchern und ist eine Möglichkeit, Datenstrukturen mit Zyklen, z. B. einem Diagramm, zu erstellen.

Länge 11 Schnipsel

help(slice)

Die helpFunktion ist sehr nützlich für das Debuggen in Python. Wenn REPL ohne Argumente aufgerufen wird, wird help()eine Hilfesitzung gestartet, in der Sie die Dokumentation für Funktionen / Datentypen / etc. Nachschlagen können. Wenn Sie mit einem bestimmten Argument aufgerufen helpwerden, erhalten Sie Informationen zum entsprechenden Element.

Gibt zum Beispiel help(slice)die folgenden Informationen aus (abgeschnitten, da sie ziemlich lang sind):

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

Wie slicewir sehen können, können wir sliceObjekte für die Indizierung erstellen . Zum Beispiel:

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

Eine weitere nützliche Funktion zum Debuggen ist dir(), die beim Aufrufen ohne Argument alle Namen im aktuellen Bereich und beim Aufrufen mit Argument alle Attribute eines bestimmten Objekts zurückgibt.

Länge 12 Schnipsel

round(5.0/2)

Was wertet dies aus? Die Antwort hängt von Ihrer Python-Version ab!

In Python 2 ergibt die Division zwischen zwei ganzen Zahlen eine ganzzahlige Division (dh 5/2 == 2), während in Python 3 eine float-Division (dh 5/2 == 2.5) erfolgt. Dies ist jedoch eine Aufteilung zwischen Float und Integer, was immer zu Float führen sollte. Warum würden wir dann unterschiedliche Ergebnisse erhalten?

Wenn wir uns die Dokumentation für roundbeide Python-Versionen ansehen , finden wir die Antwort:

  • In Python 2 wird der roundZug durch Abrunden von 0 unterbrochen.
  • In Python 3 wird ein roundTiebreak ausgeführt, indem auf die nächste gerade Ganzzahl gerundet wird .

Mit anderen Worten, 5.0/2 = 2.5Runden auf 3in Python 2, aber Runden auf 2in Python 3. Das Runden auf die nächste gerade Ganzzahl mag seltsam klingen, wird jedoch als Bankerrundung bezeichnet und versucht, positive und negative Werte ähnlich zu behandeln, um die Verzerrung zu verringern.

Länge 13 Schnipsel

class C:__x=1

Da Python objektorientiert ist, verfügt es über Klassen. Das Obige ist eine Klasse, Cderen einzelnes Attribut __xauf 1 gesetzt ist.

Wir können mit der Punktnotation auf Klassenattribute zugreifen. Zum Beispiel, wenn wir die Klasse haben

class MyClass(): my_attr = 42

dann MyClass.my_attrwürde der Druck erwartungsgemäß 42 ergeben.

Wenn wir jedoch dasselbe tun und versuchen, C.__xwie oben definiert zuzugreifen , erhalten wir:

AttributeError: type object 'C' has no attribute '__x'

Was ist los? Chat eindeutig ein __xAttribut!

Der Grund dafür ist, dass Attribute, die mit __"privaten" Variablen beginnen, etwas sind, was Python nicht hat . Python zerlegt den Namen aller Attribute, beginnend mit __dem Klassennamen, um Konflikte bei der Wiederverwendung von Namen zu vermeiden. Wenn wir im obigen Beispiel wirklich fest entschlossen 1wären , darauf zuzugreifen , müssten wir dies stattdessen tun

>>> C._C__x
1

Länge 14 Schnipsel

NotImplemented

Python verfügt nicht nur über Klassen, sondern auch über eine Überladung von Operatoren. Zum Beispiel können Sie eine Klasse haben

class Tiny():
    def __lt__(self, other):
        return True

Wo __lt__ist der Kleiner-als-Operator? Wenn wir nun eine Instanz von Tinyerstellen, können wir dies tun

>>> t = Tiny()
>>> t < 1
True
>>> t < "abc"
True

da haben wir uns vorgenommen __lt__immer wieder zurückzukehren True. Beachten Sie, dass wir auch tun können

>>> 42 > t
True

aber die folgenden Pausen:

>>> t > 42
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    t > 42
TypeError: unorderable types: Tiny() > int()

Warten Sie, wie funktioniert das? Wir haben kein Verhalten für "Größer als mit" angegeben Tiny, daher ist es nicht verwunderlich, dass der letzte Fall unterbrochen wird. Aber woher weiß ein int(42), dass es größer ist als unser TinyObjekt?

Python hat eine eingebaute Konstante NotImplemented, die durch eine spezielle Vergleichsmethode zurückgegeben werden kann. Probieren wir es aus:

class Unknown():
    def __gt__(self, other):
        # __gt__ for greater-than
        print("Called me first!")
        return NotImplemented

Wenn wir nun eine Instanz unserer neuen Klasse erstellen:

>>> u = Unknown()

Wir können das schaffen:

>>> t < u
True
>>> u > t
Called me first!
True

Wie wir sehen können, ist es passiert, u > tdass Python zuerst versucht hat, die Methode "major-than" aufzurufen Unknown, festgestellt hat, dass sie nicht implementiert wurde, und Tinystattdessen die Methode "less-than" für die andere class ( ) ausprobiert hat !

Länge 15 Schnipsel

x=[],;x[0]+=[1]

Das ist ein bisschen lustig. Zuerst weisen wir xzu, [],welches eine leere Liste innerhalb eines Tupels ist, dh ([],). Dann x[0]+=[1]versuchen wir , die leere Liste um die zweite Liste zu erweitern [1].

Nun, denkt daran , dass die Listen sind wandelbar und Tupel sind im wandelbar - was passiert , wenn Sie versuchen , ein veränderliches Objekt innerhalb eines unveränderliches Objekt zu ändern?

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

Ach so, es gibt einen Fehler, ich denke, das ist zu erwarten. Aber was ist, wenn wir versuchen zu drucken x?

>>> x
([1],)

Huh? Die Liste hat sich geändert!

Wenn Sie neugierig sind, was hier passiert, lesen Sie unbedingt diesen Blog-Beitrag .

Länge 16 Schnipsel

@lru_cache(None)

Einfach Cache hinzufügen! Dies ist ein einfaches Beispiel für einen in Python 3 verfügbaren Dekorator .

Angenommen, wir haben die folgende naive Fibonacci-Implementierung:

def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Wie die meisten Einführungen in Programmierkurse zeigen, ist dies eine sehr schlechte Methode zur Implementierung von Fibonacci, was zu einer exponentiellen Laufzeit führt, da wir im Grunde genommen nur eine Menge Einsen in den Basisfall einfügen. f(10)? Läuft in Sekundenbruchteilen. f(32)? Nehmen Sie sich etwas Zeit, aber es kommt an. f(100)? Nee.

Aber wenn wir die Ergebnisse zwischenspeichern, sollten die Dinge viel schneller werden. Wir könnten immer ein Wörterbuch für den Cache verwenden, aber versuchen wir stattdessen etwas anderes:

from functools import lru_cache

@lru_cache(None)
def f(n):
    if n < 2: return 1
    return f(n-1) + f(n-2)

Wie wir sehen können, ist alles, was ich getan habe, lru_cacheaus dem functoolsModul zu importieren und @lru_cache(None)vor meiner Funktion hinzuzufügen . @bezeichnet einen Dekorateur, der eine Funktion umschließt, in diesem Fall zum Merken. lru_cacheDas erste Argument ist maxsizedie maximale Größe des Caches - hier haben wir festgelegt None, dass keine maximale Größe angegeben wird.

Nun, wenn wir versuchen, es zu benutzen:

>>> f(100)
573147844013817084101

Und es dauerte nicht einmal eine Sekunde!

Hinweis: f(1000)Führt zu einem Rekursionstiefenfehler, aber das ist eine Geschichte für ein anderes Mal


Welchen Bereich kleiner Ganzzahlen "fängt" Python für den isOperator ab?
mbomb007

@ mbomb007 Aus dieser Frage geht hervor , dass es sich um -5 bis 256 handelt. Sie können es versuchen -5-1 is -6und 255+2 is 257testen.
Sp3000

37

Jot

Factoid: Ich kann Jot mit 2 Upvotes definieren und beweisen, dass es Turing mit 8 ist (ohne Längen 4, 6 oder 7).

Länge 1

1

Dies ist ein Beispiel für zwei Funktionen in Jot. Die erste ist die leere Zeichenfolge, die als Identitätsfunktion ausgewertet wird. Der zweite ist 1der Gruppierungsoperator von Jot. 1ausgewertet λxy.[F](xy)( Kalkül Lambda - Notation), wo [F]das Programm , bevor das ist 1(hier die leere Zeichenkette). Also, dieses Programm ist die Funktion, λxy.(λz.z)(xy)die sich vereinfacht λxy.xy.

Länge 2

10

Jetzt führen wir das andere Symbol in Jot: 0. Wieder [F]stellt if den Wert des Programms dar, der bisher 0ausgewertet wurde [F]SK, woher Sund Kvon woher die kombinatorische Logik stammt . Ich habe jetzt die gesamte Sprache definiert.

Länge 5

11100

Ich werde jetzt beweisen, dass Jot vollständig ist, indem ich eine Zuordnung von kombinatorischer Logik zu Jot definiere. Dieses Jot-Programm ist der K-Kombinator .

Länge 8

11111000

Dies ist der S-Kombinator.

Länge 3

1AB

Hier Aund Bnicht Teil von Jot, sondern Platzhalter für einen beliebigen Ausdruck. Der Ausdruck ABin der kombinatorischen Logik entspricht 1ABin Jot Aund wird Bdurch diese drei Regeln rekursiv transformiert. QED

Länge N

1
10
11
100
101
110
[...]

Jede natürliche Zahl, die binär ausgedrückt wird, ist ein gültiges Jot-Programm. Folglich kann ich algorithmisch mehr Schnipsel beliebiger Länge erzeugen. Mit genügend Gegenstimmen kann ich das Halteproblem lösen .


2
Zwei Upvotes gegeben. Definieren Sie nun die Sprache.
John Dvorak

@ JanDvorak daran zu arbeiten ... es ist so lange her, dass ich dieses Ding recherchiert habe, dass ich alles vergessen habe :)
Phil Frost

1
Ich verstehe nicht, warum dies weiterhin zu höheren Stimmen führen sollte. Sie werden einfach zufällige Binärzahlen mit zunehmender Länge erzeugen: |
Optimierer

1
Sie sagten dies für die Upvote-Nummer 4. Aber hier sehen wir eine "Zufallszahl, die Sie gerade generiert haben"
Optimierer

1
Wie können Sie das Halteproblem lösen? Ich vermute, es hat etwas mit der Verwendung eines unendlichen (Anzahl der unendlichen) Programms zu tun?
Filip Haglund

37

Bash

Factoid:

Der äußerst schwerwiegende ShellShock-Fehler war seit 1989 in Bash vorhanden und blieb ein Vierteljahrhundert lang unentdeckt. Ein Großteil der Freude am Schreiben von Bash setzt sich mit seinen vielen Eigenheiten und Inkonsistenzen auseinander.

Länge 1 Snippet:

[

Ein Alias ​​für den testeingebauten Code, der das Format zulässt if [ a == b ]; then- in Wirklichkeit [handelt es sich um einen eigenständigen Befehl, kein syntaktisches Element, und er ]ist rein dekorativ (obwohl er von [verlangt wird, ist seine Anforderung willkürlich und Sie können ihn mit Hilfe von beseitigen alias [=test).

Länge 2 Snippet:

||

Wie logisch orin den meisten Sprachen, aber für Prozesse. Führt den Befehl erst nach dem aus ||, wenn der Befehl zuvor einen Wert ungleich Null zurückgibt.

Länge 3 Snippet:

x=y

Zuordnung. Schön und vorhersehbar ... aber im Gegensatz zu den meisten anderen Sprachen sind keine zusätzlichen Leerzeichen zulässig. Was irgendwie lustig ist, weil man zwischen den Dingen in bash so ziemlich überall zusätzliche Leerzeichen einfügen kann, nur nicht um das= .

Länge 4 Schnipsel:

$IFS

Internes Feldtrennzeichen - Diese Variable wirkt sich darauf aus, wie Bash Daten für viele integrierte Aktionen aufteilt, z. Bei richtiger Anwendung kann es sehr mächtig sein; aber häufiger ist es die Ursache für subtile und unvorhersehbare Fehler.

Länge 5 Schnipsel:

${x^}

Ersetzen Sie die Zeichenfolge durch x, wobei das erste Zeichen in Großbuchstaben geschrieben wird! Ein so häufig verwendetes Feature, dass es über eine eigene Sprachsyntax verfügt.

Länge 6 Schnipsel:

x=($y)

Füllen Sie ein Array, x, aus einer Zeichenfolge oder Liste von Elementen, y, und teilen Sie es auf, wie auch immer das IFS derzeit eingestellt ist - standardmäßig Leerzeichen. Eine sehr nützliche Funktion für die erweiterte Bash-Programmierung.

Länge 7 Snippet:

${x[y]}

Arrays! Aber warte, was ist das ... y ist ein String, kein numerischer Index? Ja, Bash unterstützt assoziative Arrays! Viele Leute wissen das nicht. Sie müssen nur declare -A xzuerst.

Länge 8 Schnipsel:

${x##*,}

Ersetze x, alles bis zum letzten ,Zeichen (oder was auch immer du angibst). Nützlich, um das letzte Feld einer CSV zu erhalten - das ist etwas, mit dem Sie nicht so einfach umgehen könnencut , da nur Felder von links gezählt werden. % und %% erlauben dasselbe von rechts zu schneiden; % und # wurden für ihre Position auf der US-Tastatur ausgewählt, damit klar ist, was links und was rechts bedeutet, aber das ist nicht sehr wertvoll für alle, die keine US-Tastatur verwenden :)

Länge 9 Snippet:

[ a = b ]

In den meisten anderen Sprachen würde eine einzige Entsprechung in einer Vergleichsoperation ein unbeabsichtigtes Verhalten in Form einer Zuweisung hervorrufen. Allerdings nicht in Bash. Lassen Sie einfach keines der Leerzeichen aus, was auch immer Sie tun!

Länge 10 Schnipsel:

if [ a=b ]

Dies passiert, wenn Sie die obligatorischen Leerzeichen vergessen. Wirft keinen Fehler. Gibt immer true zurück - auch wenn aund bsind Variablen, die nicht gesetzt sind, oder was auch immer sie gesetzt sind, egal - es wird immer true zurückgegeben. Denken Sie an Code if [ "$password"="$correctpass" ], um das Spaßpotential dieser "Funktion" zu sehen.

Länge 11 Schnipsel:

x=${y//a/b}

Regex-artiger Teilstringaustausch! Setzen Sie x auf den Wert von y, wobei jedoch jedes Vorkommen von a durch b ersetzt wird.

Länge 12 Schnipsel:

[[:upper:]]*

Pattern - Matching - Sie sind nicht darauf beschränkt, nur die mit * als Platzhalter in der Schale, können Sie ein beliebiges POSIX - Standard Spiel verwenden wie alnum, alpha, digitusw.

Länge 13 Schnipsel:

function x(){

Ein bisschen C-Syntax hat sich auf mysteriöse Weise eingeschlichen! Eine von vielen völlig unterschiedlichen Verwendungsmöglichkeiten für geschweifte Klammern und ein weiteres Beispiel für optionale dekorative Elemente, mit denen Bash mehr wie andere Sprachen aussieht - entweder ()oder Sie functionkönnen hier darauf verzichten (aber nicht beide). Auch mehr Spaß mit inkonsistenten Leerzeichen - ein Leerzeichen nach dem {ist obligatorisch, aber nicht vor dem Schließen }, wie infunction x { y;}

Länge 14 Snippet:

echo {Z..A..3}

Noch eine völlig verwandte Verwendung von geschweiften Klammern. Erweitert einen Bereich um einen bestimmten Schritt. In diesem Fall wird jeder 3. Buchstabe von Z bis A erzeugt. Nützlich zum Erzeugen von Sequenzen ohne Verwendung von seq, kann aber nicht mit Variablen verwendet werden, hat also eine eingeschränkte Funktionalität.

Länge 15 Schnipsel:

echo {a,b,c,d}x

Eine weitere ähnliche, aber nicht identische Verwendung für geschweifte Klammern bei der Sequenzgenerierung. druckt ax bx cx dxund ist nützlich, um eine Liste von Zeichenfolgen aus einer Sequenz oder Liste in einem einzigen Befehl zu generieren. Auch dies ist jedoch von begrenztem Nutzen, da es nicht mit Variablen innerhalb der geschweiften Klammern verwendet werden kann.


Eigentlich ]ist es nicht rein dekorativ. [weigert sich zu funktionieren, wenn sein letztes Argument nicht ist ].
FUZxxl

Ja, aber es dient keinem anderen Zweck als der Kosmetik. und wenn Sie [durch die andere Form ersetzen test, ]kann die weggelassen werden, ohne dass etwas anderes im Aufruf geändert wird. Ich möchte lediglich darauf hinweisen, dass es sich nicht um die tatsächliche Bash-Syntax handelt, sondern nur um visuellen Zucker.
Aufstand

Du hast Recht, dass es nicht bash Syntax ist, aber der Hinter ]ist [Syntax und haben Sie es zu schaffen , genau wie , wie Sie mit einem Semikolon einer Erklärung in C zu beenden haben.
FUZxxl

Es ist wahr, dass es obligatorisch ist, aber überhaupt nicht so wie das C-Semikolon. Die Voraussetzung dafür ist völlig willkürlich, wie man sieht, wenn man einfach alias [=testund dann schreibt if [ 1 = 1; thenusw. Aber ich werde meinen Wortlaut klarstellen, um deinen Standpunkt zu berücksichtigen :)
Aufruhr

1
Was die function x(){Syntax betrifft: Sie können die Parens löschen, wie Sie sagen, aber Sie können auch nur den functionTeil löschen . Tatsächlich definiert die POSIX-Shell auf diese Weise Funktionen, sodass sie auf diese Weise portabler ist. Sie können eine vollständige Funktion in 13 Zeichen definieren. Zum Beispiel:x(){ startx;}
Kojiro

37

APL

Factoid

APL ( A P rogramming L anguage) gestartet , indem erdacht für eine Formelschreibweise als Dolmetscher aus Ken Iverson . Als die Sprache entworfen wurde, benutzten die Leute Teletypschreiber, um mit Computern zu kommunizieren. Der Zeichensatz dieser Zeichen war begrenzt, aber aufgrund ihrer Konstruktion konnte man mehrere Zeichen an die gleiche Position bringen, um komplexe Zeichen zu erstellen. Diese Funktion wird von APL in hohem Maße genutzt und trägt zu seinem berüchtigten Ruf als Nur-Lese-Sprache bei.

Sie können die meisten Beispiele auf http://www.tryapl.org ausprobieren .

Länge 1

Der Charakter , der Lampenschirm genannt wird, führt einen Kommentar ein, sowohl wegen seiner Form als auch wegen der Erleuchtung, die man durch seine Anwesenheit erhält. Historisch gesehen wurde es durch Überstreichen eines (Jot) und eines (Up Shoe) erzeugt.

Länge 2

⍳3

Die monadische (ein Argument) Funktion (iota) erzeugt einen Vektor der ersten natürlichen Zahlen. Zum Beispiel ⍳3würde das Vorgenannte 1 2 3den Vektor der ersten drei natürlichen Zahlen ergeben. Bei einigen Implementierungen von APL würde es 0 1 2stattdessen zu Ergebnissen führen. Dies hängt vom Wert ⎕IOder i ota o rigin ab.

Länge 3

5\3

Im Gegensatz zur Monade kopiert die dyadische \(expand) Funktion das Argument rechts so oft wie das Argument links; somit 5\3ergibt sich 3 3 3 3 3. Vielleicht möchten Sie mit Vektorargumenten (wie 1 2 3\4 5 6) herumspielen, um zu sehen, was es dann tut.

Länge 4

A←⍳3

Dies wird Adem Wert von zugewiesen ⍳3. (linker Pfeil) ist der Zuweisungsoperator. Eine Aufgabe muss nicht das äußerste links in einer Anweisung sein. Zuweisungen werden wie Funktionsaufrufe analysiert und ergeben den zugewiesenen Wert für die weitere Verwendung.

Länge 5

∘.×⍨A

Eine Drei-mal-Drei-Multiplikationstabelle, das heißt,

1 2 3
2 4 6
3 6 9

Das ist ein bisschen kompliziert, also lass es mich erklären. ⍺∘.f⍵(lese: alpha jot dot f omega) ist das äußere Produkt von und über f. Das äußere Produkt ist eine Tabelle des Ergebnisses der Anwendung fauf jedes mögliche Elementpaar von und . In diesem Beispiel fist ×(multiplizieren), was eine Multiplikationstabelle ergibt. Der Bediener (tilde diaeresis) pendelt ihre Argumente, das heißt, ⍺f⍨⍵gleich ⍺f⍵und f⍨⍵ohne einen linken Operanden gleich ⍵f⍵. Ohne den Pendler wäre dieses Snippet a∘.×a. Der äußere Produktbediener ist sehr vielseitig; prüfen, was passiert , wenn Sie ersetzen =für ×!

Länge 6

{×/⍳⍵}

Eine Fakultätsfunktion. Ein Paar geschweifte Klammern umschließt eine dfn (dynamische Funktion), also eine anonyme Funktion (vgl. Lambda-Ausdrücke). Die Argumente zu einer dfn sind an die Variablen gebunden und oder nur, wenn die dfn als monadische Funktion (einzelnes Argument im Gegensatz zu dyadisch, zwei Argumente) aufgerufen wird. Wir wenden das richtige Argument an und ergeben ganze Zahlen von 1bis . Der /(Schrägstrich) -Operator reduziert, das heißt, f/⍵Einfügungen fzwischen den Elementen von . Zum Beispiel +/⍳5ist gerecht 1+2+3+4+5. In diesem Fall reduzieren wir mit ×, was das Produkt der Artikel von ⍳⍵ergibt, das nur die Fakultät von ist .

Länge 7

2×3*4+5

Ausbeuten 39366. ⍺*⍵(Alpha Star Omega) wird zur Macht erhoben von . APL hat eine sehr einfache Vorrangregel: Alles wird von rechts nach links ausgewertet, alle Funktionen sind rechtsassoziativ. Operatoren binden stärker als Funktionen und werden von links nach rechts ausgewertet. Somit würde der obige Ausdruck mit expliziten Klammern 2×(3*(4+5))im Gegensatz zum Üblichen geschrieben (2×(3*4))+5.

Länge 8

¯1+3 3⍴A

Dieser Ausschnitt ergibt

0 1 2
3 4 5
6 7 8

und demonstriert zwei wichtige Konzepte: Das erste Konzept ist die (rho) -Funktion, die ihr rechtes Argument in die in ihrem linken Argument angegebene Form umformt . Die Form eines Arrays ist ein Vektor der Längen jeder Achse im Array. Die Form eines Skalars ist der leere Vektor. Somit 3 3⍴Aumformt Ain eine drei mal drei Matrix. Das zweite Konzept ist, wie Addition hier verwendet wird: Wir addieren ¯1(überstrichenes), dh negatives ( ¯ist ein Präfix zur Angabe negativer Zahlen und -ein Operator) zu einem Array. Die beiden Operanden haben unterschiedliche Formen, sodass der Operand mit der kleineren Form auf den anderen Operanden verteilt wird, wobei von jedem Element in der generierten Matrix eines subtrahiert wird.

Länge 9

+.×⍨3 3⍴A

A, zu einer 3 mal 3 Matrix umgeformt, multipliziert mit sich selbst. Der .(Punkt-) Operator übernimmt zwei Funktionen und konstruiert ein inneres Produkt , wobei die erste Funktion die Addition und die zweite die Funktionsmultiplikation darstellt . Eine einfache, alte Matrixmultiplikation ist +.×, eine übliche Variante ist ≠.∧(wo nicht gleich ist und (up caret) logisch ist und) für boolesche Matrizen; Viele interessante Dinge können als inneres Produkt mit bestimmten Operatoren anstelle von +und modelliert werden ×.

Länge 10

(.5×⊢+÷)⍣≡

(Lesen Sie: Linke Klammer Punkt fünf multiplizieren Sie Rechtsdrehung und dividieren Sie die rechte Klammer Stern-Diæresis gleich.) Berechnen Sie die Quadratwurzel eines Real mithilfe der babylonischen Methode . Das linke Argument ist die Zahl, deren Quadratwurzel Sie berechnen möchten, das rechte Argument ist die erste Schätzung für die Quadratwurzel. Ursprünglich wollte ich eine aussagekräftige erste Vermutung anstellen, aber mir gingen die Zeichen aus (anhängen , um die Zahl selbst als erste Vermutung zu verwenden).

Wie funktioniert das? Beginnen wir zuerst mit dem linken Teil (.5×⊢+÷). Dieser Ausdruck verwendet eine implizite Notation mit Ursprung in J, die später auf Dyalog APL zurückportiert wurde. Die implizite Notation ist für Anfänger etwas schwierig. Lesen Sie diesen Abschnitt daher sorgfältig durch. Eine isolierte Sequenz, wie sie +/÷≢die „normalen“ Analyseregeln nicht in einen einzelnen Teil der Sprache auflösen, wird als Zug bezeichnet. Ein Zug von zwei oder drei Funktionen erzeugt eine Funktion und (durch wiederholte Auflösung) ein beliebiger Funktionszug erzeugt auch eine Funktion. Ein Zug von drei Funktionen fghverhält sich so {(⍺f⍵)g⍺h⍵}, das heißt, fund hwird auf die Argumente der resultierenden Funktion angewendet und das Ergebnis davon wird auf angewendet g. Ein Zug aus einem Array und zwei Funktionen wieAfgverhält sich so {Af⍺g⍵}, dass diesgwird auf die Argumente der resultierenden Funktion Aangewendet und dieses Ergebnis wird auf angewendet f. Ein Zug aus zwei Funktionen hat auch eine Semantik, die in der Dokumentation erklärt, in diesem Beispiel aber nicht verwendet wird.

In diesem speziellen Zug wird eine neue Funktion (Rechtsdrehung) verwendet. Es verhält sich so {⍵}, als würde es das richtige Argument liefern. Somit ist der gesamte Ausdruck gleich {.5×⍵+⍺÷⍵}, was nur der Iterationsschritt der babylonischen Formel ist. Es ist leicht zu erkennen, welchen Nutzen die implizite Schreibweise für den Golfer hat. es ermöglicht Ihnen, sich von einigen wertvollen Charakteren zu rasieren, wo dies zutreffend ist.

Das letzte Puzzlestück ist der (Sterndiärese), Power Operator. Wenn das richtige Argument ein Array ist, f⍣A⍵gilt es ffür insgesamt AMale. Zum Beispiel f⍣3⍵ist gleich fff⍵. Die Zählung kann negativ sein. In diesem Fall versucht APL, auf eine inverse Funktion von zu schließen, fund wendet diese an. Wenn das richtige Argument eine Funktion auch ist, f⍣g⍵gilt fauf bis (fY)gYwo Yist das Ergebnis der wiederholten Anwendung fzu . Bemerkenswert ist , wenn gist =(gleich) oder (gleich), f⍣≡berechnet einen Fixpunkt vonf. Genau das brauchen wir für die babylonische Methode! Wir wollen iterieren, bis das Ergebnis konvergiert. Schließlich, wenn auf ein Paar von Dingen angewendet als dyadische Funktion aufgerufen wird, wird das linke Argument fauf der linken Seite gebunden , dh ⍺f⍣g⍵ist gleich (⍺∘f)⍣g⍵wo A∘fverhält sich wie {Af⍵}.


Du hast mehr Stimmen! Können wir noch mehr haben?
Luser Droog

@luserdroog Klar, lass mich noch etwas überlegen.
FUZxxl

Darf ich das bearbeiten und erweitern?
Adám

@Adam Ja, bitte.
FUZxxl

∘.×⍨a gibt mir einen Wertfehler . Benutze ich es richtig?
Cyoce

37

Matlab

Snippet 26 - Iteriere über Matrizen

Das habe ich erst kürzlich entdeckt. Normalerweise iterieren Sie über einen bestimmten Vektor in for-Schleifen. Anstelle von Vektoren können Sie auch Matrizen verwenden ( rand(10)erzeugt eine 10x10-Matrix mit gleichmäßig verteilten Zahlen zwischen 0 und 1).

for k=rand(10);disp(k);end

Dies zeigt dann einen Spaltenvektor der Zufallsmatrix pro Iteration an.

Snippet 25 - einfaches Plotten

Wir wissen, dass das Zeichnen in Matlab einfach ist, aber es gibt eine super einfache Funktion ezplot(verstanden E-Z? Es hat eine ganze Weile gedauert, bis ich es endlich verstanden habe, da ich Zimmer sedstattdessen geschrieben habe c...) Jeder mag elliptische Kurven:

ezplot('y^2-x^3+9*x-10.3')

elliptische Kurve

Snippet 24 - Integration

Das altmodische Wort (das in der numerischen Berechnung noch verwendet wird) für Integration ist "Quadratur". Können Sie sich vorstellen, was das Ergebnis des folgenden ist?

quad(@(x)4./(1+x.^2),0,1)

Ausschnitt 23 - Bilder

Natürlich ist Matlab auch bei Wissenschaftlern sehr beliebt, die mit Bildern arbeiten müssen (z. B. medizinische Bildanalyse). Hier ist also eine sehr praktische Funktion. Das erste Argument ist das Bild, das zweite der Winkel und das dritte optionale Argument weist die Funktion an, es auf die ursprüngliche Größe zuzuschneiden.

imrotate(rand(99),9,'c')

Hier

Ausschnitt 22 - Musik

load handel;sound(y,Fs)

Es wird ungefähr so ​​klingen (youtube link)

Snippet 21 - Differenzieren & Integrieren

polyint(polyder(p),c)

Mit diesen beiden Funktionen können Sie Polynome einfach unterscheiden und integrieren. Bei der Integration können Sie ein zweites Argument übergeben, das die Konstante ist.

Snippet 20 - zurück zu den Polynomen

p=poly(r);cp=poly(A)

Willst du das Polynom mit den Wurzeln in r? Ganz einfach: p=poly(r). Willst du das charakteristische Polynom einer Matrix A? Ganz einfach: cp=poly(A). So roots(p)ist genau r(oder eine Permutation von r).

Snippet 19 - ein weiterer Zaubertrick

fminsearch(fun,x0);

Es gibt Menschen, die diese Funktion absolut lieben. Dies sucht im Grunde nur ein Minimum funmit einem Anfangswert x0(kann ein Vektor sein) ohne Bedingungen an fun. Dies ist ideal für die Anpassung kleiner Modelle, bei denen Sie die Fehler- / Straf- / Zielfunktion nicht unterscheiden können (oder zu faul sind). Es verwendet den Nelder-Mead-Simplex-Algorithmus, der für Funktionen ziemlich schnell ist, bei denen Sie keine Annahmen treffen können.

Snippet 18 - Einführung in Polynome

p=polyfit(x,y,deg)

Matlab hat eine gute Lösung, um mit Polynomen umzugehen. Mit erhalten polyfitSie ein Polynom der kleinsten Quadrate des Grades deg, das sich den Punkten in annähert x,y. Sie erhalten einen Vektor p, der die Koeffizienten der Polynome speichert, denn das ist das einzige, was Sie zur Darstellung eines Polynoms benötigen. Wenn Sie zu Snippet 15 zurückkehren, können Sie dasselbe tun, indem Sie schreiben c = polyfit(x,y,2). So [1,-2,3]repräsentiert zB das Polynom x^2 - 2*x+3. Natürlich gibt es auch Funktionen zum Anpassen anderer elementarer oder beliebiger Funktionen.

Snippet 17 - Winkel und Diskontinuitäten

unwrap(angle(c))

Wenn Sie das Argument eines 'kontinuierlichen' Vektors komplexer Zahlen erhalten möchten, erhalten Sie häufig Werte, die eine Diskontinuität zu haben scheinen. ZB angle([-1-0.2i,-1-0.1i,-1,-1+0.1i,-1+0.2i])bekommst du [-2.94,-3.04,3.14,3.04,2.94]da anglenur Winkel zwischen -piund zurück pi. Die Funktion unwrapkümmert sich darum! Wenn Sie eine Diskontinuität wie diese erhalten, wird nur ein Vielfaches von 2*pihinzugefügt, um diese zu entfernen: '[-2.94, -3.04, -3.14, -3.24, -3.34]' Dies funktioniert sogar für 2d-Matrizen! Wenn Sie nur das Argument komplexer Zahlen mit einem negativen Realteil zeichnen, erhalten Sie die ersten Grafiken und das erste Bild, wenn Sie es auspacken, erhalten Sie das zweite:

ohne auspacken mit auspacken

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

[1;2;3]'*[4;5;6]

Natürlich gibt es eingebaute Methoden (wie dot), aber mit dem Matrixtransformationsoperator 'ist es so einfach. Wenn Sie nicht wissen, ob Sie Zeilen- oder Spaltenvektoren haben, können Sie einfach verwenden, a(:)'*b(:)wo a(:)immer ein Spaltenvektor zurückgegeben wird.

Snippet 15 - lineare kleinste Quadrate, die hässliche Methode mit dem Zauberstab

[x.^2,x,x.^0]\y

xist der (Spalten-) Vektor mit den Werten auf der x-Achse, yden verrauschten y-Werten. Geben c=[x.^2,x,x.^0]\ySie ein und Sie erhalten die Koeffizienten des Polynoms 2. Grades. Natürlich können Sie eine der milliardenfach eingebauten Fit-Funktionen von matlab nutzen (wie langweilig), warum nicht den Zauberstab benutzen? =)

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

gplot(graph,x)

So zeichnen Sie ein Diagramm. graphsollte eine quadratische Adjazenzmatrix enthalten und xsollte eine nx2-Matrix sein, die die Koordinaten jedes Knotens enthält. Lassen Sie graph = triu( rand(8)>.7)uns ein zufälliges Diagramm erstellen : (Erstellen Sie eine Matrix, die 0s und 1s enthält, und erhalten Sie für ein interessantes Diagramm nur das obere Dreieck.) x = rand(8,2)Plotten Sie dann mit einigen ausgefallenen Stylesgplot(graph,x,'k-.d')

Graph (Ich erkläre dies als moderne Kunst.)

Snippet 13 - Meshgrid

meshgrid(a,b)

Dies ist eine der beeindruckendsten Funktionen, einfach, aber nützlich. Wenn Sie eine reelle Wertfunktion in Abhängigkeit von zwei Variablen zeichnen möchten, können Sie einfach einen Wertevektor für die x-Achse und einen für die y-Achse (a und b) definieren. Dann können Sie mit meshgrid zwei Matrizen der Größe len (a) x len (b) erstellen, wobei eine nur den Vektor aals Spalte und die andere nur die Spalte nur die Vektoren bals Zeilen enthält. Anwendungsbeispiel: a = -3:0.2:3;[x,y]=meshgrid(a)(Wenn beide Vektoren gleich sind, reicht es aus, nur einen zu übergeben.) Dann können Sie einfach eingebenz=x.^2+-y.^2 und zmesh(x,y,z). Dies funktioniert für eine beliebige Anzahl von Dimensionen! Dies ist also nicht nur ideal zum Zeichnen, sondern auch zum Abrufen aller möglichen Kombinationen verschiedener Vektoren usw. (Wenn Sie also eine neue Code-Golf-Sprache erstellen möchten, sollten Sie eine kürzere verwenden.) Funktionsname...)

Gittergewebe

Snippet 12 - Zeichnen

plot(x,x.^2)

Nehmen Sie einen Vektor x=-3:0.5:3und lassen plotSie den Rest erledigen. Es gibt viel mehr Funktionen zum Zeichnen. Dies ist nur eine sehr grundlegende Funktion, die Sie jederzeit verwenden können. Es würde bereits ausreichen, zu schreiben, plot(v)und die Daten vwerden gegen die Array-Indizes geplottet. Wie einfach ist das Wenn Sie Ihren Plot stylen möchten, fügen Sie einfach einen String als drittes Argument hinzu: ZB 'r:o'wird eine rote, gepunktete Linie mit Kreisen um die Datenpunkte erstellt. Wenn Sie mehrere Diagramme erstellen möchten, fügen Sie einfach weitere Argumente hinzu oder verwenden Sie Matrizen anstelle von Vektoren. Narrensicher.Handlung

Snippet 11 - Funktionsgriffe

f=@(x,y)x+y

Dies ist ein Beispiel für ein Funktionshandle, das in gespeichert wird f. Jetzt können Sie anrufen f(1,2)und erhalten 3. Funktionsgriffe in matlab sind sehr nützlich für mathematische Funktionen (z. B. Zeichnen) und Sie können sie in einer Zeile definieren. Ein Nachteil ist jedoch, dass Sie keine Bedingungen oder stückweise (und daher keine Rekursion) haben können. Wenn Sie dies möchten, müssen Sie die functionAnweisung verwenden und eine neue Funktion deklarieren, und jede dieser Funktionen muss in einer separaten Datei gespeichert werden ... (WHYYYYYY ????)

PS: Sie werden ein weiteres lustiges Osterei bekommen, wenn Sie whyin die Konsole tippen : Sie haben eine riesige Funktion erstellt, die zufällige Nachrichten erzeugt wie:

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.

... das ist sehr beruhigend, wenn Sie verzweifelt genug sind, um die Konsole zu fragen why...

Snippet 10 - Wie sieht meine Matrix aus?

spy(eye(9))

Wie Sie bereits wissen, eye(9)wird eine 9x9-Identitätsmatrix erstellt. spyErstellt einfach eine, die die Null- / Nicht-Null-Einträge der Matrix anzeigt. Sie können es aber auch zum Anzeigen von binären 2D-Daten verwenden. Wenn du spyohne Argument anrufst, bekommst du ein nettes kleines Osterei =)

Identität ausspionieren spionieren Sie easteregg aus

Snippet 9

kron(a,b)

Die kronFunktion wertet das Kronecker-Produkt zweier Matrizen aus. Dies ist sehr nützlich für diskretisierte mehrdimensionale lineare Operatoren. Ich habe es auch ab und zu zum Code-Golfen benutzt. Sie möchten alle möglichen Produkte der Einträge von aund b? kron(a,b), Bitte schön.

Snippet 8

5*a\b.*b

Ok hier habe ich 3 verschiedene Operatoren vertauscht. Sie können jede Matrix mit einem Skalar multiplizieren, indem Sie einfach verwenden *. (Dann wird jeder Eintrag der Matrix mit diesem Skalar multipliziert). Führt aber *auch Matrixmultiplikationen durch. Wenn Sie einen Punkt voranstellen, erhalten Sie den .*Operator, der zwei Matrizen der gleichen Größe multipliziert, jedoch eingabeweise . (Dies kann auch mit Divisionsoperatoren wie /und durchgeführt werden \.)

Als nächstes kann der Backslash-Operator als linke Division verwendet werden (im Gegensatz zu /der gewohnten rechten Division), aber er ist auch der mächtigste und charakteristischste Operator von matlab: Er führt eine 'Matrixdivision' durch. Nehmen wir an, Sie haben das System der linearen Gleichungen A*x=bund möchten es lösen x, dann können Sie einfach tippen x=A\b. Und \(Sie können auch verwenden /, was bei Matrizen weniger häufig ist): Analysieren Sie zuerst schnell die Matrix und verwenden Sie die Ergebnisse, um den schnellsten Algorithmus für diese Inversionsmultiplikation zu finden! (Siehe zB hier )

Sie können es aber auch für unter- oder überdefinierte Systeme verwenden (wo es kein Invers gibt oder wo die Matrix nicht einmal quadratisch ist, z. B. für die Methode der kleinsten Quadrate). Das ist wirklich der Zauberstab von Matlab.

Snippet 7

[a,b;c]

Ok, das sieht nicht nach viel aus, ist aber ein sehr praktisches Tool: Matrix-Verkettung. Ein Komma zwischen zwei Ausdrücken bedeutet, dass sie horizontal verkettet werden (das heißt, sie müssen dieselbe Höhe haben) und ein Semikolon bedeutet, dass die vorherige 'Zeile' über der nächsten 'Zeile' liegt (mit Zeile meine ich alles zwischen zwei Semikolons). Nur ein einfaches Beispiel: a = [1,2;3,4]; b = [5;6]; c =[7,8,9]; d=[a,b;c];ergibt dasselbe dwie d=[1,2,5; 3,5,6; 7,8,9]. (Get it?)

6 geschnippt

eye(7)

Diese Funktion erzeugt eine vollständige 7x7-Identitätsmatrix. So einfach ist das. Es gibt andere Funktionen wie diese nan,inf,ones,zeros,rand,randi,randn, die genauso funktionieren . (Wenn Sie zwei Argumente übergeben, können Sie die Höhe / Breite der resultierenden Matrix festlegen.) Wie ich später zeigen werde, können Sie Matrizen (2d-Arrays) leicht erstellen und (auf sehr visuelle Weise) verketten, was sooo nützlich ist und einfach, wenn Sie partielle Differentialgleichungen numerisch lösen müssen. (Wenn Sie PDEs lösen, liegt der allgemeine Ansatz in der Diskretisierung der Ableitungsoperatoren. Grundsätzlich erhalten Sie nur ein riesiges System linearer Gleichungen, das gelöst werden muss. Diese Matrizen sind normalerweise dünn (nur sehr wenige Nicht-Null-Elemente) und haben eine Art von Symmetrie: Aus diesem Grund können Sie die von Ihnen benötigte Matrix ganz einfach zusammenstellen.

Snippet 5

a(a>0.5)

Ich hoffe, Sie werden nicht müde, wenn Sie auf Arrays zugreifen. Dies zeigt eine einfache Möglichkeit, alle Elemente eines Arrays abzurufen, die bestimmte Bedingungen erfüllen. In diesem Fall erhalten Sie einen Vektor aller Elemente a, die größer als 0,5 sind. Der Ausdruck gibt a>0.5nur afür jedes Element, das die Bedingung erfüllt, eine Matrix mit der gleichen Größe zurück wie für jedes Element, 0für das dies nicht der Fall ist.

Snippet 4

a(:)

Dies gibt wiederum nur den Inhalt aeines Spaltenvektors (nx1-Matrix) zurück. Dies ist hilfreich, wenn Sie nicht wissen, ob Sie Ihre Daten als Spalten- oder Zeilenvektor gespeichert haben oder ob Ihre Daten zweidimensional sind (z. B. für 2D-Finite-Differenzen-Methoden).

Snippet 3

1:9

Mit dem Semikolonoperator können Sie ganz einfach Vektoren (in diesem Fall 1xn-Matrizen) erstellen. In diesem Fall erhalten Sie den Vektor [1,2,3,4,5,6,7,8,9]. Dies ist auch besonders nützlich, um auf Slices anderer Vektoren zuzugreifen, z. B. um a(2:4)auf das zweite, dritte und vierte Element des Vektors zuzugreifen a. Sie können es auch mit einer Schrittgröße wie 0:0.5:10oder so verwenden.

Snippet 2

i;

Ein Semikolon unterdrückt die Ausgabe an die Konsole. Sie können es als eine gute oder eine schlechte Sache sehen, aber ich mag es für das Debuggen von Sachen. Jede Berechnungszeile usw. gibt das Ergebnis automatisch an die Konsole aus, sofern Sie die Ausgabe nicht durch ein Semikolon unterdrücken.

Snippet 1

i

Komplexe Zahlen sind ein grundlegender Zahlentyp. (Schade, dass viele Leute ials Zählvariable in for-Schleifen verwenden. In diesem Fall wird sie überschrieben.)

Intro

Für diejenigen, die es nicht wissen, ist MatLab eine Programmiersprache (mit netter IDE, die auch MatLab genannt wird?), Die in erster Linie für numerische Berechnungen * und Datenmanipulation gedacht ist. (Es gibt ein Open-Source-Gegenstück namens "Octave") Da es nur ** interpretiert wird, ist es nicht sehr schnell, aber es ist die Stärke, dass Sie Matrizen leicht manipulieren können und viele Algorithmen auf eine optimierte Weise implementiert sind, so dass sie ziemlich schnell laufen wenn auf Matrizen angewendet. Es ist auch eine sehr leicht zu erlernende Sprache, aber ich empfehle sie nicht als Einstiegssprache, da Sie ziemlich schlechte Programmiergewohnheiten annehmen werden.

* Da es sich um eine interpretierte Sprache handelt, kann sie für teure Projekte sehr langsam sein. Sie verfügen jedoch über integrierte Parallelisierungsmethoden und können auch mehrere Computer gleichzeitig zum Ausführen eines Programms verwenden. Aber wenn du wirklich schnell werden willst, bist du immer noch auf C oder Fortran oder solche verrückten Sachen angewiesen. Dennoch sind viele implementierte Algorithmen (Matrixmultiplikation, Lösungssysteme für lineare Gleichungen usw.) stark optimiert und arbeiten recht gut. Wenn Sie jedoch dieselben Algorithmen in Matlab selbst programmieren, müssen Sie warten =) (Wenn Sie aus anderen Sprachen stammen und Ihre Operationen nicht für Schleifen verwenden, können Sie in Matlab viel Zeit sparen, wenn Sie sie vektorisieren .)

** Sie können Ihre Programme sozusagen kompilieren, aber das konvertiert hauptsächlich den Quellcode in eine nicht lesbare Datei (für Menschen), was bei der Ausführung nicht viel schneller ist.


1
Ich habe dieses Problem sehr oft ... iwenn ich mich auf etwas einstelle und dann ein unerwartetes Verhalten erfahre, wenn es sich nicht um die komplexe Einheit handelt.
Feersum

3
Schönes Osterei! Wenn Sie 'edit spy' eingeben, finden Sie ein Beispiel für Code-Verschleierung :-)
Abulafia

1
Ich habe das positiv bewertet und dann gemerkt, dass ich es bereits getan habe. Ach, wenn ich es nur noch einmal verbessern könnte. Lass sie kommen, @flawr!
Alex A.

2
Wenn Ihnen die Inspiration für die zu zeigenden Dinge ausgeht , kann ich das Mathworks-Blog empfehlen : Auf der Art of MATLAB von Loren Vershure Oft beschreiben sie Best Practices, die innerhalb der Zeichenbegrenzung gezeigt werden können. Für Kuriositäten sollten Sie Abandon Matlab in Betracht ziehen , und für undokumentierte Funktionen und Features können Sie Undokumentiertes Matlab von Yair Altman
Dennis Jaheruddin am

1
@flawr - Für das Faktoid mag es auch cool sein, die Tatsache zu erwähnen, dass MATLAB ursprünglich für Studenten der Informatik an der Universität von New Mexico (Cleve Moler war zu der Zeit Vorsitzender) als eine einfache Schnittstelle zu den LINPACK und EISPACK (... werden jetzt von LAPACK abgelöst ), ohne dass Sie FORTRAN lernen müssen ... und aufgrund der einfachen Bedienung schnell auf andere akademische Einrichtungen
übergegangen sind

35

CJam

Probieren Sie die folgenden Schnipsel hier aus

Länge 20 Schnipsel:

q~{]__~z\z<=\~*0>*}*

Ein Min-Mod-Rechner . Ein Auszug aus der Frage:

Die minmod- Funktion ist eine Variante der bekannten min , die in hangbegrenzenden hochauflösenden Schemata für partielle Differentialgleichungen vorkommt. Bei einer bestimmten Anzahl von Pisten wird die flachste Piste ausgewählt, wobei auf die relativen Zeichen zwischen den Pisten geachtet wird.

Die Funktion akzeptiert eine beliebige Anzahl von Parametern. Dann ist minmod (x 1 , x 2 , ..., x n ) definiert als:

  • min (x 1 , x 2 , ..., x n ) , wenn alle x i streng positiv sind
  • max (x 1 , x 2 , ..., x n ) , wenn alle x i streng negativ sind
  • 0 , sonst.

Länge 18 Schnipsel:

l'[,65>Dm>_el+_$er

Ein ROT13-Encoder. Verschiebt nur a-zA-ZZeichen aus der Eingabezeichenfolge über STDIN

Länge 15 Schnipsel:

T1{_2$+}ri2-*]p

Ein vollständiges Programm zum Drucken der ersten NZahlen aus einer Fibonacci-Reihe, bei dem NSTDIN als Eingabe dient.

Länge 12 Schnipsel:

{{_@\%}h;}:G

Eine einfache GCD-Funktion. Dies kann verwendet werden 2706 410 G, um die GCD auf Stapel zu bringen.

Länge 11 Schnipsel:

123456 789#

#ist der Netzbetreiber. Dieses Snippet zeigt eine coole Funktion von CJam, die BigInts für fast alle mathematischen Operationen unterstützt. Die Ausgabe des obigen Codes ist also

1596346205622537943703716803040694151242100030904924074732295184521676912291137885341977590649991707684635184329980991487148618486236239062505001539322685142817506810040361209550544146292158784625519911512640361780862459268161619223326802388689703997604303632605734938879647069477372395799326590488746599202521617640394227957532720581758771344616555153473551874187964029973716015080326283503474062024803237072761129557356772954771383125420283743787215768524095651476398918270831514362626616089349128838080859262141293069421199363839940462244772673481244848208112002212957221705577938865719802035511067875502253218277834350725436729497351901219311577128600087062378434520948898301738545267825952998284599001356281260973911216650526574435975050678439968995805415462116669892745933523276658479456263859786003695570642598885206779863730608803831608206418317758451327165760242416052588688579435998154295782751455020445483571514197850814391880423853968520336337963918534259580183058727377932419280412466915889059399591196961188841001024998633317094826403760131868252088477018937989608302521450181593409274231460335072324865982559395114735391976545471553525054490202974741119144469523879456646833238659929705233941114530149037245274032070536718197592615630616792756562341411027203615235147973615347081993563361626845258162606172599728677944001956482301240050182368840648532697569098833480384074404562991348377266778603059081932412368912313845464302833428950934701568958836851009236647605585910687215977468114323293396641238344799575626940766355697576957869656153567798618227770961980620119004224798449940378878601283741944503399682599666873704888519152796472231721010884561046439019823540214190109829183178504573391524533915085342799888899681052113605127068137552531204917650779012455136663716975904242872042805633443567570913936237754642040107392687168596924804730637819953463737212774674563401663682370631910559669378413063684132477269578881395521544729393136204246705936061735379354437327940116154383441927197123218522827575163913310005036963663583344508839784971260123709283218409462028161021477446586507813599051643059982983426688872855309396405653159417356549291603532443699350168178837164682957610433456205211423600319694496115159970718912091395232327389520091646132878609779171226748990343349416763319432268713023302555895744813731889452605219001900815755497209921418814092923394321459962373890912709775151652200071533644718727513889263907829300496554849544461628702471995210369421320165755673222520834013956492183306187393652197405863508709529644837118590847002900783148394313160749018413291215958936871830666201928218294362550829287373305552379418641499562597137520153409556227576809855521876196531587454478159211299517511047868125975115347272184123454929507976958328038242400918390689757262398695703472270927183494613959476164389143107240083171566284628032072645081703351075328092783401422849512230275075331561337345714881104575020436358133210849231625973013523497330004645467493618279226202227586584610761439335895760888873155403816627190368675397978355381544497413492223577022267403347927237298551052219150516984577176643706356698282552857754120841266435149587248192704898338826251727748499150285409036076919533685800933215325289882260771526293167171975367192287689881199864600661035143522211647660445960687046757311913589429739868592726372013684511683081229044622752191694278221303073075505531920922815724661725685493922212700535444400760813940151761980008355835574184921854364539924999643954874549857103642483664109073938527328920827803218865362851320233433429604394590974694396314165313743853607609394553133883545319222169958204731303672940856293527174545435349105954532301106962634516087237739490953930886293289854731305112253177512851251930821765454042415085420000484369355605183062368648992392499663861508991984554431113080399485470268940148600970493633737364443822752829774334511729579419931500217970224646496435527826186627011323464848141074486509849545954714213290443775688291020289759390171236344528896

Länge 10 Schnipsel:

"`%W_"_W%`

Wir haben es schon geschafft, lasst es uns umkehren! Dies ist eine der kürzesten Reverse Quines in CJam. Reverse Quine ist ein Quine, der seinen Quellcode in umgekehrter Reihenfolge ausgibt.

Länge 9 Snippet:

5,K,+_&S*

Dieses Snippet zeigt viele Funktionen von 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"

Länge 8 Schnipsel:

"`_~"`_~

Eine der kleinstmöglichen Quinen in CJam. Dies ist eine echte Quine in dem Sinne, dass sie den Quellcode in keiner Weise liest. (Lesen des Quellcodes ist in CJam nicht möglich)

Länge 7 Snippet:

"AB"_m*

m*Erstellt alle kartesischen Produkte der beiden obersten Stapelelemente. Zum Beispiel wird der obige Code ["AA" "AB" "BA" "BB"]gestapelt, der das kartesische Produkt von "AB"und ist "AB".

Länge 6 Schnipsel:

"_~"_~

Ein gut aussehender wiederholter Code. NICHT ausführen :). Diese Darstellung von Code ist die Basis für das einfachste Quine in CJam. Sie legen eine Zeichenfolge "_~"auf den Stapel, erstellen eine Kopie ( _) und werten sie aus. Was wiederum das Gleiche tut (und wieder ..), bis Sie die maximale Rekursionsausnahme erreichen.

Länge 5 Schnipsel:

{A}:F

So funktioniert eine Grundfunktion in CJam. Der obige Ausdruck weist den Codeblock {A}der Variablen zu F. Jetzt können Sie in Ihrem Code Füberall den Code-Block ausführen (und 10in diesem Fall erhalten)

Länge 4 Schnipsel:

"A"~

Sie können einen beliebigen Codeblock oder eine Zeichenfolge oder sogar ein einzelnes Zeichen mit auswerten ~. Der obige Ausdruck ergibt10

Länge 3 Snippet:

Kmr

Ein typischer Zufallsgenerator von 0 bis K20.

Länge 2 Snippet:

es

Dies gibt den aktuellen Zeitstempel (Millisekunden ab der Epoche) an. CJam hat auch etfür die lokale Zeit ein besser verwendbares Format, das ein Array mit den verschiedenen Teilen der aktuellen Zeit (Tag, Stunde usw.) zurückgibt.

Länge 1 Snippet:

A

CJam hat fast alle Großbuchstaben als vordefinierte Variablen. Aist 10, Bist 11 und bis Kist 20. Pist pi (3.141592653589793), Nist neue Linie und viele andere . Dies kann sehr praktisch sein, wenn Sie Anfangswerte in Variablen benötigen oder wenn Sie eine zweistellige Zahl in 1 Byte benötigen.

Factoid

CJam ist von GolfScript inspiriert, bietet aber darüber hinaus zahlreiche Funktionen, einschließlich der Unterstützung eines Netzwerk-GET-Aufrufs: D

PS: Ich werde versuchen, die Antwort alle 5 Upvotes oder alle 2 Stunden (je nachdem, was früher ist) zu aktualisieren.


Es gibt einige Probleme mit Ihrem ROT13-Beispiel: p Aber ich bin beeindruckt von dem Quine, ich glaube, ich werde es ausleihen :)
aditsu

@Aditsu, was ist das Problem?
Optimierer

Es ändert den Fall von nz Buchstaben. Es hat auch ein @ ohne Grund, Sie können das D dort stattdessen setzen.
Aditsu

@aditsu Ziemlich sicher, dass es sich um eine ROT 13 im a-zA-Z-Bereich handelt, und das ist der Grund für die Änderung der Groß- und Kleinschreibung. Kannst du es nicht lesen es ist nur deine eigene Sprache: P @ ist für 18 Zeichen da, denke ich: D
Optimizer

Das ist nicht das, was ROT13 normalerweise macht. Ich verstehe nicht, warum Sie fragen, ob ich meine eigene Sprache lesen kann. Es geht nicht darum, zu verstehen, was das Programm tut, sondern darum, dass es nicht das tut, was erwartet wird.
Aditsu

34

Common Lisp

Lisp (von LISt Processing) ist eine der ältesten heute noch verwendeten Sprachen (nur FORTRAN ist älter). Es ist bemerkenswert, dass es die erste Sprache ist, in der Code Daten und Daten Code sind. Homoikonizität genannt. Es war auch die erste Sprache, in der Müll gesammelt wurde. Ursprünglich von John McCarthy in einem Artikel von 1958 als eine vollständig theoretische Sprache entworfen, wurde sie zu einer echten Sprache, als Steve Russel erkannte, dass die Bewertungsfunktion auf einem Computer implementiert werden konnte. Es ist in der künstlichen Intelligenz am weitesten verbreitet und lässt sich sofort daran erkennen, dass Klammern überwiegen. Common Lisp wurde entwickelt, um viele der älteren Lisp-Dialekte in einer standardisierteren Form zu vereinheitlichen.

Ich werde versuchen, dass jedes Snippet für sich alleine lauffähig ist, aber nicht unbedingt etwas Wertvolles. Da ich Common Lisp verwende, gelten die grundlegenden Konzepte und die Syntax auch in anderen Dialekten, aber bestimmte Funktionen funktionieren beispielsweise in Scheme nicht.

Länge 1

*

Aufgrund der Betonung der Verwendung von S-Ausdrücken und Listen für die Codierung gibt es in Lisp nur sehr wenige gültige Ausdrücke, die keine Klammern, so genannte Atome, enthalten. Alles, was direkt in die REPL (Read-Eval-Print-Schleife) eingegeben wird, wird als Variable behandelt und als solche ausgewertet. *enthält den vorherigen Wert, der von der REPL gedruckt wurde.

Länge 2

()

Dies ist die leere Liste, eines der wichtigsten Symbole in Lisp. Jede richtige Liste in Lisp wird mit einer leeren Liste abgeschlossen, ähnlich wie jede richtige Zeichenfolge in C mit endet \0.

Länge 3

(*)

Dies ist ein grundlegender Funktionsaufruf, der aus einem in Klammern gesetzten Symbol besteht. Lisp enthält keine Operatoren, sondern nur Funktionen. Ich habe die Multiplikation speziell ausgewählt, weil sie eigentlich keine Binärfunktion ist. Der Multiplikationsoperator in Lisp verwendet eine unbestimmte Anzahl von Argumenten. Wenn es keine Argumente gibt 1, gibt es den Identitätsoperator für die Multiplikation zurück.

Länge 4

`(1)

Dies ist eine Nachteile-Zelle, die nur eine andere Art zu sagen ist, es ist ein Paar von Elementen. In Lisp besteht jede Liste aus Cons-Zellen, die mit Cons-Zellen verbunden sind, wobei das erste Element (das car) der Wert ist und das zweite Element (das cdr) auf die nächste Cons-Zelle zeigt. Dies ist die Grundlage dafür, dass Lisp auf verknüpften Listen basiert. Diese bestimmte Zelle hat 1als Auto und die leere Liste als CDR.

Länge 7

(not t)

Ich möchte auf die Wahrheitswerte in Lisp eingehen. Dies würde zurückkehren nil. In Common Lisp tist dies das Symbol für true while nilund steht ()für false und sind einander gleich. Beachten Sie jedoch, dass diese Definition nicht für alle Lisp-Dialekte Standard ist. Schema unterscheidet zum Beispiel zwischen #ffalsch und '()für die leere Liste.

Länge 9

(cdr ())

Wie ich bereits sagte, ist der cdr das Tail-Element einer Liste, die Sie mit der Funktion erhalten können cdr. Ebenso können Sie das Kopfelement, das Auto, mit der Funktion erhalten car. Ziemlich einfach, oder? Das Auto und die CDR der leeren Liste sind beide nil.

Länge 10

(cons 1 2)

Endlich genug Zeit, um mit Listen zu arbeiten. consErstellt eine Cons-Zelle mit dem ersten Parameter als Auto und dem zweiten als CDR. Aber anstatt auszudrucken (1 2), gibt es (1 . 2). Um auf das Snippet der Länge 2 zurückzukommen, sollte eine richtige Liste mit der leeren Liste enden, sodass die CDR der letzten Cons-Zelle auf die leere Liste zeigen sollte. In diesem Fall zeigt die letzte Nachteile-Zelle auf 2, so dass Lisp uns mitteilt, dass wir eine unzulässige Liste haben, dies aber dennoch zulassen, wie Sie eine C-Zeichenfolge ohne eine erstellen können \0.

Länge 11

(cons 1 ())

Jetzt haben wir unsere erste ordnungsgemäß erstellte Liste erstellt. Es ist eine Single-Cons-Zelle mit einem Auto von 1und einer CDR von (). Sie werden feststellen, dass ich jede andere Liste mit einem Backquote / Tick anführe. Jede andere richtige Liste würde versuchen, ihr erstes Argument als eine Funktion mit den verbleibenden Elementen als Parametern auszuwerten. Eigentlich ()ist es keine Liste. Es ist ein Symbol aus a (und a ), das die leere Liste darstellt. Mit Lisp können Sie fast jedes druckbare Zeichen in einem Symbolnamen verwenden und jedes Symbol nach Belieben neu definieren.

Länge 12

(cdr `(1 2))

Dies würde ausgeben (2), nicht 2wie manche Leute vermuten würden. Denken Sie daran, dass jede CDR entweder auf eine andere Nachteile-Zelle oder auf die leere Liste verweisen soll. Offensichtlich 2ist es nicht die leere Liste, also muss es sich um ein weiteres Problem handeln, bei dem es sich um ein Auto 2und eine CD-ROM handelt ().

Länge 13

'#1=(1 . #1#)

Dies würde eine zirkuläre Liste mit nur dem Einzelwert 1 erzeugen. Wenn sie gedruckt wird, würde sie "(1 1 1 1 ..." für immer drucken, so dass sie in der Praxis als unendliche Liste betrachtet werden kann (auf der Sie cdrunendliche Zeiten ausführen können um immer das gleiche Ergebnis zu erhalten, sich selbst!). Es sei denn, man weist Tder globalen Variablen zu *print-circle*, und in diesem Fall wird sie als ausgegeben #1=(1 . #1#).


Die letzte Änderung! Schnell, jemand macht einen Esolang mit Beatles-Thema: D
fede s.

1
@fedes. John McCarthy, Paul McCartney ... die Sprache soll CarthyCartney heißen.
Katze

33

GNU Make

Ich werde auf diesem einen Ast gehen. Ich denke, dies könnte das erste Mal sein, dass makein PPCG gezeigt wird.

Factoid

Make kann als funktionale Sprache betrachtet werden.

Länge 0 Snippet

Ich glaube nicht, dass Snippets der Länge 0 erforderlich sind, aber hier ist sowieso einer. Ich denke, dies ist möglicherweise das nützlichste aller Programme der Länge 0. Mit einem leeren Makefile (oder überhaupt keinem Makefile) verfügt make noch über eine Reihe integrierter Regeln. Beispielsweise gibt es integrierte Standardregeln zum Kompilieren einer C-Datei in eine O- oder Binärdatei, vorausgesetzt, die C-Datei befindet sich im aktuellen Verzeichnis. Wenn wir das tun:

make hello.o

make findet die Regel .c to .o und kompiliert hello.c, um hello.o zu geben

Ebenso, wenn wir tun:

make goodbye

Befindet sich im aktuellen Verzeichnis eine goodbye.c-Datei, wird diese in die goodbye-Binärdatei kompiliert.

Länge 1 Snippet

TAB

Ja, das TAB-Zeichen. Dies allein macht zwar nicht viel, hat jedoch eine große Bedeutung in Make. Insbesondere MÜSSEN alle Rezeptzeilen, die einer Zieldefinition in einer Regel folgen, mit einem Tabulator beginnen. Dies führt zu allerlei Frustrationen beim Debuggen von Makefiles, wenn TABs und Leerzeichen verwechselt werden.

Länge 2 Snippet

$@

Dies ist eine automatische Variable zur Verwendung in Rezepten. Es wird auf den Dateinamen des Ziels der Regel erweitert. Es gibt andere nützliche automatische Variablen .

Länge 3 Snippet

a:=

Kürzeste einfach erweiterte Variablenbelegung. Die Variable a wird sofort auf "" gesetzt, wenn das Makefile zum ersten Mal analysiert wird. Wenn wir dies tun a=, wird die Zuweisung rekursiv erweitert, dh die Erweiterung wird verschoben, bis auf die Variable tatsächlich verwiesen wird.

Länge 4 Snippet

W:;w

Kürzeste geringfügig nützliche vollständige Regelspezifikation. Dies definiert ein Ziel Wmit einer Regel, die einfach den wShell-Befehl ausführt. Somit

make W

ist äquivalent zu:

w

Dies ist eine alternative Regelsyntax, bei der das Rezept dem Ziel in derselben Zeile folgt, die durch eine neue Zeile getrennt ist. Üblicherweise folgen die Rezeptzeilen unmittelbar auf eine separate Zielzeile, wobei die TABZeichen jede Rezeptzeile beginnen.

Länge 5 Snippet

$(@D)

Eine weitere automatische Variable. Ähnlich wie $@, aber dies wird auf den Verzeichnisabschnitt des Pfads erweitert, wobei der Dateiname und das nachfolgende / entfernte Verzeichnis angegeben werden.


Vielleicht funktionieren einige Zeichenfolgen wie $(basename )oder $(patsubst )? ( zB )
luser droog

32

Marbelous

Länge 14 Schnipsel

}0}1
Mulx
HxHx

Dieses Snippet zeigt einige weitere Marbelous-Bibliotheken und führt ein neues Konzept ein, nämlich Multi-Cell-Boards. Die MulxKarte nimmt zwei Murmeln als Eingang und gibt zwei Murmeln aus. Murmeln, die in die Zelle ganz links der Karte gelangen, Mulxentsprechen den }0Geräten auf der Karte und der Zelle ganz rechts der Karte }1. Analog kommen die Ausgänge auch aus verschiedenen Zellen. Die Breite einer Tafel kann so berechnet MAX(1, highest output device + 1, highest input device + 1)werden, dass Zellen, die keinem Eingabegerät entsprechen, jeglichen Marmor, der auf sie fällt, wegwerfen.

Länge 13 Schnipsel

7E
??
>Y!!
{0

Dies ist eine Tafel, die bei jedem Tick ein zufälliges druckbares ASCII-Zeichen ausstößt. Marbelous hat zwei Möglichkeiten, Zufallswerte zu generieren. Es ??gibt einen Zufallswert zwischen 0 und der Eingabemurmel, die es erhält, einschließlich und ?n: ?0bis zu ?Z. Welches handeln sehr ähnlich ??. Wir haben auch !!welche die Platine terminiert, auch wenn nicht alle Ausgänge belegt sind. Können Sie herausfinden, wie die ?nGeräte mit Marbelous als Boards implementiert werden könnten ???

Länge 12 Schnipsel

}0}1
Fb//
Dp

Hier sehen wir einige Bibliotheksfunktionen von Marbelous in Aktion. Fbgibt die n-te Fibonacci-Zahl aus, wobei n die Eingabemurmel ist. Dpdruckt die Eingabemurmel als Dezimalzahl nach STDOUT. Diese sind beide in Marbelous implementiert und können aufgerufen werden, wenn Sie Include-Bibliotheken im Online-Interpreter überprüfen. Für den Python-Interpreter müssen Sie jede Datei explizit einschließen. Die Implementierung dieser Boards kann auf Github gefunden werden . Beachten Sie, dass dieses spezielle Programm zwei Eingänge benötigt und die Fibonacci-Karte zweimal aufruft. Boards, die aufgerufen werden, werden innerhalb eines Ticks des Boards, das sie aufgerufen hat, zurückgegeben.

Länge 11 Schnipsel

}0}0
{<{0{>

Dieser braucht eine Erklärung. Die }0Geräte sind Eingaben, da sie die gleiche Nummer (0) haben, enthalten sie den gleichen Wert, wenn diese Karte aufgerufen wird. Die drei Geräte in der unteren Reihe sind Ausgänge. {<Ausgänge auf der linken Seite der Karte, {0Ausgänge unter der ersten Zelle der Karte und {>Ausgänge auf der rechten Seite. Die Ausgabe wird nur übertragen, wenn alle unterschiedlichen Ausgabegeräte gefüllt sind. In diesem Fall wird jedoch nie das richtige Ausgabegerät erreicht. Die Karte wird wegen mangelnder Aktivität verlassen und die beiden Werte ausgeben, die sie sowieso hat. Können Sie sich vorstellen, wie man es /\als Marbelous Board umsetzen könnte?

Länge 10 Schnipsel

..40
FF
\\

In Marbelous spielen einige Dinge eine wichtige Rolle. Erstens gibt es eine Ergänzung. Wenn Sie den Pfad der beiden Murmeln auf dem Brett verfolgen, werden Sie feststellen, dass sie zur gleichen Zeit in derselben Zelle landen. In diesem Fall werden sie addiert. (Unterhaltsame Tatsache: Irgendwann wurde angenommen, dass die Murmeln keinen Stapel bilden, sondern zusammengefügt werden sollten.) Marbelous ist jedoch eine 8-Bit-Sprache FF.

Länge 9 Schnipsel

00
\\/\]]

Dies ist der kürzeste Weg, um eine rudimentäre Version von cat in Marbelous zu implementieren. 00 \ / \ ist eine Schleife, die 00dem ]]Gerät jede Sekunde einen Marmorwert verleiht. Dies ist ein STDIN-Gerät. Wenn ein Marmor auf diesem Gerät landet, versucht es, das erste Zeichen von STDIN zu lesen. Wenn es eines gibt, wird es nach unten gedrückt (und in diesem Fall erneut gedruckt). Wenn es keinen gibt, wird der Original-Amrble nach rechts geschoben. (und in diesem Fall weggeworfen)

Länge 8 Schnipsel

}0
~~
{0

Dieses Snippet zeigt einige Funktionen. Erstens werden Eingaben über} 0 vorgenommen. In diesem Fall ist dies die Hauptplatine, die durch die Befehlszeileneingabe ersetzt wird. Sie können diese Funktion auch aufrufen. In diesem Fall wird das Argument anstelle der Befehlszeileneingabe verwendet. Dann gibt ~~es noch einen bitweisen Nicht-Operator. Danach kommen wir zu }0: Wenn alle }nGeräte gefüllt sind, werden diese Werte als Rückgabewerte der Funktionen zurückgegeben. (Marbelous unterstützt mehr als einen Rückgabewert pro Funktion.)

Länge 7 Schnipsel

00
\\/\

Dies ist die kompakteste Endlosschleife, die Sie in Marbelous erstellen können. Das \\Gerät schiebt einen beliebigen Marmor nach rechts, /\kopiert einen Marmor und schiebt eine Kopie nach links und eine nach rechts. Da das Brett nur zwei Zellen breit ist, wird der Marmor auf der rechten Seite jedoch weggeworfen.

Länge 6 Schnipsel

46MB75

Hier ist ein Beispiel für eine Rekursion MB(die implizit benannte Hauptplatine wird bei jedem Tick aufgerufen, jedoch nicht vor dem Drucken Fuauf STDOUT bei jedem Aufruf FuFuFuFuFuFu....)

Länge 5 Schnipsel

2A
++

Etwas arithmetisch fällt der Marmor mit Wert 2Aauf den ersten Tick und der findet sich auf der ++Zelle wieder. Dies ist ein Operator. Dieser spezielle Operator erhöht jeden Marmor, der darauf landet, und lässt ihn fallen. Der Marmor hat jetzt Wert 2Bund fällt vom Brett. Dies wird +auf STDOUT gedruckt.

Länge 4 Schnipsel

:
24

Die beiden Interpreten sind sich hier nicht einig. In diesem Beispiel habe ich dem ersten Board der Datei einen Namen gegeben (Der Name ist eine leere Zeichenfolge). Der Python-Interpreter geht davon aus, dass dies die Hauptplatine ist, und ruft diese beim Ausführen des Programms (das druckt $) auf. Der Javascript-Interpreter findet das Mainboard nicht und somit keinen Einstiegspunkt. Dies kann nützlich sein, wenn Sie eine Bibliotheksdatei für Marbelous schreiben.

Länge 3 Schnipsel

:Bo

Dies ist eine benannte Tafel ohne Körper. Wir können diese Tafel durch Schreiben Boin eine Zelle einer beliebigen Tafel (einschließlich sich Boselbst) aufrufen.

Länge 2 Schnipsel

3A

Dieser Code ist der Hauptteil einer 1x1-Zellen-Karte (jede Zelle ist zwei Zeichen breit) mit implizitem Namen MB(für die Hauptkarte). Es gibt den Ascii-Wert des Hexadezimalwerts aus, 3Awenn der Marmor vom Brett fällt. Die Ausgabe dieses Programms ist zufällig der Quellcode von:

Länge 1 Snippet

:

Zusammen mit #ist dies eines der beiden einzigen gültigen 1-Zeichen-Programme in Marbelous. #ist ein Indikator für einen Kommentar und daher nicht sehr interessant. :sagt Marbelous, dass Sie im Begriff sind, eine Tafel zu deklarieren. Keiner der beiden Compiler kümmert sich darum, dass Sie das Board nicht wirklich benennen oder definieren. Das Programm macht nichts.

factoid:

Marbelous wurde von Leuten auf dieser Seite entwickelt. Einige Namen, die für diese Sprache in Frage kamen, waren Rube und einfach Marbles .


2
schlag mich dazu. schöne schnipsel!
Sparr

Ihr 12er-Snippet scheint zwei Eingaben zu nehmen und zwei verschiedene Fibonacci-Zahlen auszudrucken. war das beabsichtigt?
Sparr

@Sparr, ja, es sollte zeigen, wie Funktionen in Marbelous funktionieren.
Overactor

vielleicht das zur erklärung hinzufügen? Nach dem, was Sie geschrieben haben, würde ich erwarten, dass das Snippet eine Eingabe und eine Fib-Nummer ausgibt.
Sparr

Ich hoffe wirklich, dass Sie 40 Punkte erreichen, damit meine Fibonacci-Funktion passt ...
Sparr

31

Forth

Forth hat nur zwei Typen, ints und floats (und die floats sind optional!), Aber es können immer noch Zeichen, Strings, long long ints, Zeiger, Funktionszeiger, Strukturen und mehr verwendet werden. es hängt alles davon ab, wie Sie es benutzen!

Länge 1

.

Der .Befehl (oder "Wort", wie wir ihn nennen) gibt den ganzzahligen Wert über dem Datenstapel aus. Wenn der Stack leer ist, erhalten Sie einen Laufzeitfehler. Es entfernt auch den Wert vom Stapel - upvote, um zu sehen, wie wir ihn behalten können!

Länge 2

.s

Das .sWort zeigt die aktuell auf dem Stapel befindlichen Werte an, ohne sie zu entfernen. Außerdem wird die Gesamtzahl der Werte angezeigt. In Gforth .swird standardmäßig nur die obersten 9 Werte angezeigt. Vielleicht finden wir heraus, wie wir mehr zeigen können.

Länge 3

see

Geben Sie seegefolgt von einem beliebigen vierten Wort ein, um den Quellcode dieses Wortes anzuzeigen. Die meisten Forth-Wörter werden in Forth selbst definiert, und nur wenige Primitive werden in der Assemblierung definiert.

Länge 4

1 0=

Habe ich erwähnt, dass Forth eine Stack-basierte Sprache mit Postfix-Operatoren ist? Tippen 1 0=drückt 1auf den Stapel und führt dann das 0=Wort, das den obersten Wert vom Stapel erscheint und drückt , truewenn es gleich 0 ist, falsewenn dies nicht der Fall. 0=ist ein Bequemlichkeitswort für 0 =; Es gibt mehrere ähnliche Abkürzungen für gemeinsame Werte + Wortkombinationen, wie 1+und 0<>. Außerdem währendfalse in Forth 0 ist und jeder Wert ungleich Null wahr ist, werden die eingebauten Testwörter truefür wahre Ergebnisse zurückgegeben und truegehen den ganzen Weg - es ist der Wert, bei dem alle Bits gesetzt sind, dh -1!

Länge 5

-1 u.

Schieben Sie es -1auf den Stapel, und drucken Sie es als Ganzzahl ohne Vorzeichen. Dies kann verwendet werden, um schnell den Maximalwert für ein nicht vorzeichenbehaftetes int in Ihrer Version von Forth zu sehen (aber nicht den von Haus aus unterstützten maximalen Integralwert!). Sie fragen sich vielleicht: "Woher wissen wir, wann ein Int mit .und wann mit gedruckt werden soll u.?" Antwort: .Wenn es signiert ist, u.wenn es nicht signiert ist. "Das habe ich nicht gemeint", sagst du. "Woher wissen wir, wann der Wert oben auf dem Stapel signiert und wann er nicht signiert ist?" Antwort: Sie sind der Programmierer - das ist Ihre Aufgabe! Sie müssen wissen, ob jede Ganzzahl auf dem Stapel ein int, ein vorzeichenloses int, ein int*, ein darstelltchar*, ein Funktionszeiger oder anderes, sonst kriegt man die Dämonen in die Nase. Forth wird das nicht für Sie nachverfolgen. Was ist das, C?

Länge 6

." Hi"

Druckt Hi. ."ist ein Forth-Wort (auf das wie auf alle Forth-Wörter ein Whitespace oder EOF folgen muss), das den Eingabestream durch den nächsten liest "und alle dazwischen liegenden Bytes ausgibt. Wenn Sie mehr als ein Leerzeichen nach dem einfügen .", werden alle bis auf das Leerzeichen unmittelbar nach dem ."gedruckt. Escape-Sequenzen werden nicht unterstützt (Sie können also keine Zeichenfolge mit einem "darin drucken ."), aber Gforth fügt .\"der Sprache hinzu, die sie unterstützt.

Länge 7

: + - ;

Sie definieren Ihre eigenen Wörter in Forth, indem Sie einen Doppelpunkt, den Namen des Wortes, die Wörter, die Ihr Wort ausführen soll, und ein Semikolon schreiben. Ein Wort kann eine beliebige Folge von Nicht-Leerzeichen sein (Leerzeichen ist, wie Forth sagt, wo ein Wort endet und ein anderes schließlich beginnt), sogar Satzzeichen und sogar Operatoren (die schließlich nur Wörter sind). Das obige Snippet wird neu definiert +und bedeutet -, dass Sie stattdessen immer dann subtrahieren, wenn Sie versuchen, es zu addieren. Bereits vorhandene Wörter, die verwendet +werden, bleiben davon unberührt, da sie einen Verweis auf die ursprüngliche Definition von enthalten +.

Hinweis: Einige Wörter tun in Definitionen andere Dinge als außerhalb, aber abgesehen von Kontrollstrukturen sind sie alle ziemlich esoterisch. Die meisten Wörter tun innerhalb einer Definition das Gleiche wie außerhalb, aber manchmal ist das Ding nicht offensichtlich -: show-see see see ; tun nicht, was Sie denken!

Länge 8

: 42 - ;

Wenn ich sagte, ein Wort könnte eine beliebige Folge von Leerzeichen sein, dann meinte ich eine beliebige Folge. Nein, Forth hat kein Wort für jede einzelne Nummer. Zahlen sind nur etwas Besonderes. Wenn Forth auf eine Nicht-Whitespace-Sequenz trifft, wird zuerst geprüft, ob es sich um ein bekanntes Wort handelt. Wenn dies nicht der Fall ist, wird versucht, es als Zahl zu analysieren. Wenn dies fehlschlägt, erhalten Sie nur dann eine Fehlermeldung. Wenn Sie ein Wort definieren, das genauso geschrieben ist wie eine Zahl, können Sie diese Schreibweise der Zahl nicht mehr direkt eingeben, ohne stattdessen das Wort zu erhalten. Gforth und verschiedene andere Forths bieten Ihnen jedoch mehrere Möglichkeiten, Zahlen zu buchstabieren .

Länge 9

IF 1 THEN

Endlich etwas Bekanntes! Offensichtlich testet dieser Code, ob sein Argument 1wahr ist, und führt, wenn ja, alles aus, was nach dem steht THEN, richtig? Falsch. Wenn die Ausführung den erreicht IF, wird der Wert oben auf dem Stapel entfernt, und wenn dieser Wert wahr ist (dh ungleich Null), wird die Ausführung mit dem fortgesetzt, was sich innerhalb des Stapels befindet, und dann mit dem, was IF ... THENnach dem steht THEN. Wenn der Wert Null ist, überspringen wir direkt danach THEN. Beachten Sie, dass aufgrund der internen Implementierung dieser Wörter (was in Bezug auf andere Forth-Wörter gilt!) IFUndTHEN kann nur innerhalb einer Wortdefinition verwendet werden, nicht in „Zustand interpretieren.“

Länge 12

( x y -- y )

Dies ist ein Kommentar. Es geht von dem (zum nächsten )gleich danach. (Im Interpreter kann eine neue Zeile diese auch beenden.) Dies ist in Forths Syntax nicht "eingebaut" (Ist irgendetwas?); (ist nur ein anderes Wort, das alles im Eingabestream bis zum nächsten verwirft ). (Das ist richtig - Forth kann das Lesen des Quellcodes manipulieren. Perl ist nicht die einzige Sprache, die nicht ohne Ausführung analysiert werden kann!) Da es sich um ein Wort handelt, müssen Sie ein Leerzeichen nachstellen, sonst wird Forth dies beanstanden (xist nicht definiert. Wir können uns auch (im Rahmen unserer fortlaufenden Kampagne, uns in den Fuß zu schießen, neu definieren .

Der Inhalt des Kommentars ist jedoch interessanter. Dieser Kommentar gibt den Stapeleffekt für ein Wort an. Der Teil links neben dem --Stapel listet auf, was sich oben auf dem Stapel befinden sollte, bevor Sie das Wort ausführen (der obere Teil befindet sich rechts). Auf der rechten Seite des --Stapels wird beschrieben, wie der obere Teil des Stapels danach aussehen wird (erneut) oben rechts). Die übliche Konvention besteht darin, einen solchen Kommentar direkt nach dem : nameBit in die Quelle eines von Ihnen definierten Wortes einzufügen. Außerdem gibt es eine sehr strenge Konvention zur Benennung von Stapelelementen, um den Typ anzugeben , dem sogar der Standard folgt .

Übrigens gilt der gezeigte Stapeleffekt für das nipWort. Sie sollten in der Lage sein, anhand des Kommentars zu erkennen, was es tut.

Länge 13

1 2 3 4 d+ d.

Wie bereits erwähnt, hängt der Typ eines Forth-Werts ausschließlich davon ab, wie Sie ihn verwenden. Wenn Sie einen Wert als Zeiger behandeln, handelt es sich um einen Zeiger. Wenn dieser Wert kein guter Zeiger ist, liegt es an Ihnen, ihn als einen Zeiger zu behandeln. Unabhängig davon, für welchen Typ Sie einen Wert behandeln, nimmt er immer eine Zelle im Datenstapel ein. Ausnahmen sind Ganzzahlen mit doppelter Zelle oder doppelter Genauigkeit . Hierbei handelt es sich um Ganzzahlen, die durch zwei Werte im Stapel dargestellt werden. Auf diese Weise können Sie Arithmetik mit doppelt so vielen Bits wie üblich ausführen. Die höherwertige oder höherbitige Zelle wird über die niederwertigere oder niederbitigere Zelle gelegt, so dass 1 0die Doppelzellendarstellung von 1, und0 1beträgt entweder 2 ^ 32 oder 2 ^ 64, je nachdem, wie groß die regulären Zellen Ihres Forth sind. Um einen Doppelzellenwert als solchen zu behandeln, müssen wir natürlich Wörter verwenden, die explizit auf Doppelzellenwerte angewendet werden. Diese sind in der Regel nur d(oder udvorzeichenlos) gefolgt vom Namen des entsprechenden Einzelzellenworts: d+zum Hinzufügen, d<zum Vergleichen, d.zum Drucken usw.


+1 für Forth. Ich fing an, nach Sprachen zu suchen, die noch nicht fertig waren. Freut mich, es hier schon zu sehen.
mbomb007

2
Auch wenn Sie jemals auf +1675 kommen, muss ich ein schönes ASCII-Bild ausgeben. : D
mbomb007

31

Pyth

Für weitere Auszüge werde ich Lösungen für Golfherausforderungen und einen Link zum Problem veröffentlichen.

Länge 17:

<ussC,cG\_GUQ*zQQ

Suchen Sie die ersten nZeichen der unendlichen Folge, indem Sie die Eingabezeichenfolge für immer wiederholen, dann die Unterstriche mit der Folge selbst ausfüllen und diese dann für immer wiederholen.

Fülle die Lücken aus

Länge 14:

#QX=Qhf>FT.:Q2

Sortieren Sie die Liste anhand einer Liste eindeutiger Elemente, indem Sie Paare benachbarter Elemente austauschen und alle Zwischenergebnisse ausdrucken.

Ordnen Sie eine Reihe von Zahlen neu an

Länge 13:

?hu]+HG_UQYQY

Erstellen Sie die folgende Struktur: [0, [1, [2, [3]]]].

Heimat auf der Liste

Länge 12:

uxyG*HQjvz2Z

XOR-Multiplikation.

XOR-Multiplikation

Länge 11:

lfqSzST.:wz

Zählen Sie, wie viele Teilzeichenfolgen des ersten Wortes Anagramme des zweiten Wortes sind.

Erkennen von Anagrammen in einer übergeordneten Zeichenfolge

Länge 9:

fqJjQT_J2

Finden Sie die unterste Basis, in der die Eingabe ein Palindrom ist.

Palindrom der niedrigsten Basis

Länge 5:

!%lQ1

Überprüfen Sie, ob der Eingang eine Potenz von 2 ist. Nehmen Sie die Log-Basis 2, nehmen Sie das Ergebnis mod 1 und nehmen Sie das logische nicht.

Überprüfen Sie, ob eine Ganzzahl eine Potenz von 2 ist, ohne +, - -Operationen zu verwenden

Länge 4:

sjQ2

Berechnet das Hamming-Gewicht der Eingabe durch Addition der Basis-2-Darstellung der Eingabe.

Zählen Sie die Anzahl der Einsen in vorzeichenlosen 16-Bit-Ganzzahlen

Länge 3:

^G2

^ on sequence, int, gibt das kartesische Produkt des ersten Arguments mit sich selbst n-mal an, wobei n das zweite Argument ist.

In diesem Fall gibt da Gdas Alphabet ( abcdefghijklmnopqrstuvwxyz) ^G2alle 2 Buchstabenfolgen aadurchzz .

Länge 2:

lT

llen()kann auch als Protokollbasis 2 verwendet werden. Da Tdie Variable auf initialisiert 10ist 3.3219280948873626, wird Protokollbasis 2 von 10 ausgegeben .

Länge 1:

H

Hist das leere Wörterbuch (Hash-Tabelle) in Pyth und die einzige Möglichkeit, ein Wörterbuch in Pyth zu erhalten, ohne v(eval) oder $(Python-Literal) zu verwenden.

Factoid:

Pyth hat keine anderen Konstrukte mit mehreren Zeichen als Literale. Außerdem kompiliert Pyth im Wesentlichen eins zu eins in Python.


Wurde Ihr Faktoid hinzugefügt, bevor Sie Befehle haben, die mit beginnen .?
Undichte Nonne

@LeakyNun Ja ..
Isaacg
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.