Bei dieser Herausforderung erledigen die Benutzer abwechselnd drei recht einfache Codierungsaufgaben in Programmiersprachen, die älter werden dürfen.
Für die erste Antwort muss eine Programmiersprache verwendet werden, die im Jahr 2015 erstellt wurde. Wenn mindestens eine Antwort aus einer 2015-Sprache vorliegt, können für die Antworten Programmiersprachen verwendet werden, die im Jahr 2014 erstellt wurden. Ebenso sind Antworten mit Sprachen aus 2013 nicht zulässig bis es mindestens eine Antwort für 2014 gibt.
Im Allgemeinen ist die Verwendung einer Programmiersprache aus dem Jahr Y erst zulässig, wenn eine Antwort in einer Sprache aus dem Jahr Y + 1 eingereicht wurde. Die einzige Ausnahme ist Y = 2015.
Das Jahr Ihrer Sprache finden
Um diese Frage zu beantworten, müssen Sie das Jahr kennen, in dem Ihre Programmiersprache erstellt wurde. Dies ist natürlich ein subjektiver Begriff; Einige Sprachen wurden über mehrere Jahre hinweg entwickelt, und viele Sprachen werden jedes Jahr aktualisiert. Lassen Sie das Jahr, in dem eine Sprache "hergestellt" wurde, das erste Jahr sein, in dem eine Implementierung für diese Sprache in der Öffentlichkeit erschien.
Zum Beispiel Python wurde „in gemacht“ 1991 , obwohl seine Entwicklung seit 1989 im Gang gewesen, und die Version 1.0 wurde erst 1994 veröffentlicht.
Wenn dieses Jahr immer noch subjektiv ist, verwenden Sie einfach Ihren gesunden Menschenverstand, um das am besten geeignete Jahr zu wählen. Lassen Sie sich nicht von leichten Meinungsverschiedenheiten über die Wahl des Jahres hinreißen. Bitte geben Sie einen Link zu einer Quelle an, aus der hervorgeht, wann Ihre Sprache erstellt wurde.
Verschiedene Versionen oder Standards einer Programmiersprache (z. B. Python 1, 2, 3) werden mit demselben Anfangsjahr als dieselbe Sprache gezählt.
Wenn das Jahr Ihrer Sprache also nicht 2015 ist, können Sie Ihre Antwort erst einreichen, wenn eine Antwort eingereicht wurde, deren Jahr das Jahr vor Ihrem ist.
Wenn bereits eine gültige Antwort mit demselben Jahr wie dem Ihren vorhanden ist, können Sie antworten. Es spielt keine Rolle, ob Ihre Sprache früher oder später im Jahr entwickelt wurde.
Aufgaben
Sie müssen die Aufgaben 1 bis 3 ausführen. Aufgabe 0 ist optional.
Diese Aufgaben wurden mehr oder weniger ausgewählt, um drei wichtigen Aspekten der Programmierung zu entsprechen: Ausgabe (Aufgabe 1), Schleifen (Aufgabe 2) und Rekursion (Aufgabe 3).
Aufgabe 0 - Sprachverlauf (optional)
Schreiben Sie mindestens einen Absatz, in dem die Geschichte der von Ihnen gewählten Programmiersprache erklärt wird: Wer hat sie entwickelt, warum, wie usw. Dies ist besonders empfehlenswert, wenn Sie persönlich dabei waren, als die Sprache entstand, und vielleicht sogar eine Rolle bei ihrer Entwicklung gespielt haben. Zögern Sie nicht, persönliche Anekdoten über die Auswirkung der Sprache auf Sie oder Ihre Arbeit oder ähnliches zu erzählen.
Wenn Sie zu jung sind, um ohne viel Recherche viel über die Geschichte Ihrer Sprache zu wissen, sollten Sie älteren Benutzern eine Notiz hinterlassen, in der Sie angeben, dass sie Ihren Beitrag bearbeiten und einen Verlauf aus erster Hand hinzufügen können.
Aufgabe 1 - "Hallo, Welt!" Variante
Schreiben Sie ein Programm, das gedruckt wird
[language name] was made in [year made]!
zum Standard-Ausgabebereich Ihrer Sprache (Standard für die neuesten Sprachen).
Wenn die Sprache beispielsweise Python wäre, wäre die Ausgabe:
Python was made in 1991!
Aufgabe 2 - ASCII Art N
Schreiben Sie ein Programm, mit dem der Benutzer eine ungerade positive Ganzzahl eingeben kann (Sie können davon ausgehen, dass die Eingabe immer gültig ist), und drucken Sie einen ASCII-Kunstbuchstaben N aus, der mit dem Zeichen erstellt wurde N
.
Wenn die Eingabe 1 ist, ist die Ausgabe:
N
Wenn die Eingabe 3 ist, ist die Ausgabe:
N N
NNN
N N
Wenn die Eingabe 5 ist, ist die Ausgabe:
N N
NN N
N N N
N NN
N N
Wenn die Eingabe 7 ist, ist die Ausgabe:
N N
NN N
N N N
N N N
N N N
N NN
N N
Das Muster geht so weiter. Die Ausgabe kann nachgestellte Leerzeichen enthalten.
Aufgabe 3 - GCD
Schreiben Sie ein Programm, mit dem der Benutzer zwei positive ganze Zahlen eingeben kann (Sie können davon ausgehen, dass die Eingabe immer gültig ist), und geben Sie den größten gemeinsamen Teiler aus . Dies ist definiert als die größte positive Ganzzahl, die beide Zahlen teilt, ohne einen Rest zu hinterlassen. Sie kann leicht mit dem Euklidischen Algorithmus berechnet werden .
Beispiele:
8
, 12
→ 4
12
, 8
→ 4
3
, 30
→ 3
5689
, 2
→ 1
234
, 876
→6
Sie können eine integrierte Funktion verwenden, aber versuchen herauszufinden, ob sie in der ersten Version Ihrer Sprache vorhanden war. Wenn nicht, versuchen Sie es nicht.
Regeln
- Sie können mehrmals antworten, aber für jede neue Antwort muss eine Sprache verwendet werden, die mindestens 5 Jahre vor der Sprache in Ihrer letzten Antwort erstellt wurde. Wenn Sie also mit einer Sprache von 2015 geantwortet haben, konnten Sie erst wieder antworten, wenn Sprachen für 2010 zulässig sind. Wenn Sie mit einer 2010-Antwort beginnen, können Sie keine 2015-Antwort als zweite Antwort festlegen, da 2015 nicht vor 2010 liegt.
- Wenn möglich, schreiben Sie Ihren Code so, dass er in der allerersten Version Ihrer Sprache (oder in einer möglichst alten Version) funktioniert hätte. (Dies ist keine Voraussetzung, da es schwierig sein kann, alte Compiler / Interpreter für einige Sprachen zu finden.)
- Stellen Sie das Posten einer bereits geposteten Sprache ein, es sei denn, die gepostete Antwort weist erhebliche Fehler auf oder Sie führen die Aufgaben auf eine ganz andere Weise aus.
- Golfen Sie Ihren Code ist in Ordnung, aber nicht erforderlich.
- Ein abschließender Zeilenumbruch in der Ausgabe eines Programms ist in Ordnung.
- Für die Aufgaben 2 und 3 sollten alle Eingabewerte unter einem vernünftigen Maximum wie 2 16 funktionieren (mindestens 256).
- Ihre Sprache muss vor dem Absenden dieser Frage existiert haben.
- Sehr alte Programmiersprachen können andere Ein- und Ausgabeformen haben als wir heute denken. Das ist okay. Führen Sie die Aufgaben so gut wie möglich im Kontext Ihrer Sprache aus.
Wertung
Die Punktzahl Ihrer Einreichung ist:
upvotes - downvotes + (2015 - languageYear) / 2
Somit wird die Stimmenzahl für jedes Jahr vor 2015 um 0,5 erhöht, was älteren Sprachen zugute kommt. Die Einsendung mit der höchsten Punktzahl gewinnt.
Antwortliste
Das folgende Stapel-Snippet listet alle gültigen Antworten nach ihrem Sprachjahr auf.
Sie müssen Ihren Beitrag mit dieser Markdown- Zeile beginnen, um sicherzustellen, dass er korrekt aufgelistet ist:
#[year] - [language name]
Zum Beispiel:
#1991 - Python
Der Name der Sprache kann sich in einem Link befinden (es wird derselbe Link in der Antwortliste sein):
#1991 - [Python](https://www.python.org/)
Antworten, die diesem Format nicht entsprechen oder ein Jahr haben, das noch nicht zulässig ist, oder von einem Benutzer stammen, der in den letzten 5 Jahren bereits geantwortet hat, werden als ungültig markiert.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>$(function(){function e(e,r){var a="https://api.stackexchange.com/2.2/questions/48476/answers?page="+e.toString()+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter=!YOKGPOBC5Yad160RQxGLP0r4rL";$.get(a,r)}function r(e){if(e.items.forEach(function(e){var r=e.link,a=e.owner.display_name,i=e.body.match(/<h1\b[^>]*>(\d{4}) - (.*?)<\/h1>/);if(i&&i.length>=3)var h=parseInt(i[1]),u=i[2];h&&u&&n>=h&&h>=t&&(!d.hasOwnProperty(e.owner.user_id)||d[e.owner.user_id]-h>=p)?(d[e.owner.user_id]=h,h==t&&--t,o.hasOwnProperty(h)||(o[h]=[]),o[h].push({language:u,user:a,link:r,score:e.score+(n-h)/2})):s.push(' <a href="'+r+'">'+a+"</a>")}),e.has_more)runQuery(++a,r);else{for(var i=n,h=[];o.hasOwnProperty(i);){for(var u=$("<tr>").append($("<td>").text(i.toString())),l=$("<td>"),c=$("<td>"),g=$("<td>"),f=0;f<o[i].length;f++){var v=o[i][f];l.append(v.language),c.append($("<a>").html(v.user).attr("href",v.link)),g.append(v.score),f+1<o[i].length&&(l.append("<br><br>"),c.append("<br><br>"),g.append("<br><br>"))}u.append(l).append(c).append(g),h.push(u),--i}$("#answers").find("tbody").append(h),s.length>0?$("#invalid").append(s):$("#invalid").remove()}}var a=1,n=2015,t=n-1,p=5,o={},s=[],d={};e(1,r)})</script><style>html *{font-family: Helvetica, Arial, sans-serif;}table{border: 4px solid #a4a; border-collapse: collapse;}th{background-color: #a4a; color: white; padding: 8px;}td{border: 1px solid #a4a; padding: 8px;}div{font-size: 75%;}</style><table id='answers'> <tr> <th>Year</th> <th>Language</th> <th>User (answer link)</th> <th>Score</th> </tr></table><div id='invalid'><br>Invalid Answers:</div>
quelle
Antworten:
2013 - Dogescript
Dogescript ist eine Sprache, die 2013 von Zach Bruggeman entwickelt wurde. Es ist nichts weiter als ein Syntaxersatz für Javascript, um es so zu lesen wie die internen Monologe des memetischen Shiba Inus.
Hallo doge
ASCII Art
GCD
quelle
s[i]
Bits freuen!2015 - Netzhaut
Retina ist eine auf Regex basierende Programmiersprache, die ich geschrieben habe, um bei PPCG-Herausforderungen mit regex-only-Antworten mithalten zu können, ohne den unnötigen Aufwand zu haben, die Regex in einer bestimmten Hostsprache aufzurufen. Netzhaut ist Turing-vollständig. Um dies zu beweisen, habe ich einen 2-Tag-Systemlöser sowie Regel 110 implementiert . Es ist in C # geschrieben und unterstützt daher sowohl die .NET-Variante (standardmäßig) als auch die ECMAScript-Variante (über ein Flag).
Die Netzhaut kann in mehreren Modi betrieben werden, aber der für Berechnungen relevanteste (und der für das vollständige Turing) ist der Ersetzungsmodus. Im Ersetzungsmodus geben Sie Retina eine gerade Anzahl von Quelldateien. Diese werden dann gepaart, wobei der erste von jedem Paar ein regulärer Ausdruck und der zweite ein Ersatz ist. Diese werden dann der Reihe nach ausgeführt, wobei die Eingabe schrittweise bearbeitet wird. Dem regulären Ausdruck kann auch eine Konfiguration vorangestellt werden (mit
`
). Die wichtigste Option (die Retina Turing vervollständigt) ist+
, dass Retina den Ersatz in einer Schleife anwendet, bis sich das Ergebnis nicht mehr ändert. In den folgenden Beispielen verwende ich auch;
, was die Ausgabe auf Zwischenstufen unterdrückt.In jeder der folgenden Übermittlungen wird jede Zeile in einer separaten Quelldatei abgelegt. (Alternativ können Sie die neue
-s
Option verwenden und alle Zeilen in eine einzelne Datei einfügen.) Leere Dateien / Zeilen werden als dargestellt<empty>
. Dateien / Zeilen, die ein einzelnes Leerzeichen enthalten, werden als dargestellt<space>
.Die Erklärungen sind ziemlich lang, deshalb habe ich sie an das Ende des Beitrags verschoben.
Die Programme
"Hallo Welt!" Variante
ASCII Art N
Dies setzt voraus, dass STDIN mit einem Zeilenumbruch abgeschlossen wird.
GCD
Dies setzt voraus, dass STDIN nicht mit einem Zeilenumbruch abgeschlossen wird.
Erklärungen
"Hallo Welt!" Variante
Das ist ziemlich trivial. Es braucht keine Eingabe (dh eine leere Zeichenkette), passt zu nichts und ersetzt es durch
Retina was made in 2015!
. Man kann es auch für willkürliche Eingaben verwenden, indem man das Muster[\s\S]*
zum Beispiel durch ersetzt . Das würde STDIN schlürfen und alles durch die Ausgabe ersetzen.ASCII Art N
Das hat ziemlich viele Stufen. Die Idee ist, die Eingabe in unär zu konvertieren, einen N x N-Block von
N
s zu erstellen und dann zwei Dreiecke "herauszuschneiden". Lassen Sie uns die einzelnen Phasen durchgehen. Denken Sie daran, dass;
nur Zwischenausgaben unterdrückt werden,+
der Ersatz jedoch in einer Schleife angewendet wird.Ganz einfach: Stellen Sie a
#
vor die Eingabe. Dies wird als Markierung bei der Konvertierung nach Unary verwendet.Dies wandelt eine Ziffer in eine unäre um. Es nimmt die bereits konvertierten Ziffern
(\d*)
und wiederholt sie 10 Mal. Dann wird die nächste Ziffer verwendet und die entsprechende Anzahl von Ziffern angehängt. Der tatsächliche Wert der Ziffern ist zu diesem Zeitpunkt unerheblich. Wenn das#
Ende der Zahl erreicht ist, stimmt der reguläre Ausdruck nicht mehr überein, und die Konvertierung wird durchgeführt. Als Beispiel wird die Nummer127
als verarbeitetDie letzte Zeile enthält genau 127 Ziffern.
Zwei einfache Stufen, die das beseitigen
#
und dann alle Ziffern in konvertierenN
. Im Folgenden werde ich die Eingabe7
als Beispiel verwenden. Jetzt haben wir alsoDie nächste Stufe
N
Ersetzt jede Zeichenfolge durch die gesamte Zeichenfolge (denken Sie daran, dass sie eine abschließende neue Zeile enthält) und entfernt auch die abschließende neue Zeile selbst. Somit wird die einzelne Zeile in ein quadratisches Gitter umgewandelt:Nun das obere Dreieck. Zuerst beginnen wir damit, das N in der unteren rechten Ecke in ein Leerzeichen zu verwandeln:
Der Lookahead stellt sicher, dass wir das richtige ändern
N
. Das gibtUnd nun
ist ein regulärer Ausdruck, der mit einem übereinstimmt,
N
der sich über oder in der oberen linken Ecke eines Leerzeichens befindet und dieses durch ein Leerzeichen ersetzt. Da das Ersetzen wiederholt wird, handelt es sich im Wesentlichen um eine Überflutung, die den 3. Oktanten vom Anfangsraum in mehr Räume verwandelt:Und schließlich wiederholen wir dasselbe mit dem unteren Dreieck, verwenden jedoch ein anderes Zeichen, damit die bereits vorhandenen Räume keine falsche Überflutung verursachen:
setzt den Samen:
Dann
macht die Flutfüllung.
Und schlussendlich
Wandelt diese
S
in Leerzeichen um und wir sind fertig:GCD
GCD in Unary ist eigentlich sehr trivial mit Regex. Das meiste davon besteht aus der Umwandlung von Dezimal nach Unär und von Unär nach Dezimal. Dies könnte kompakter gemacht werden, aber dies ist kein Code-Golf, also ...
Diese Stufen sind im Wesentlichen die gleichen wie oben, außer dass beide Eingabenummern konvertiert werden und das Ergebnis
1
s anstelle vonN
s verwendet (nicht, dass es wichtig ist). Wenn also die Eingabe18 24
wäre, würde dies produzierenJetzt
ist die gesamte GCD-Berechnung. Wir
1
gleichen einen gemeinsamen Divisor ab, indem wir eine Anzahl von s erfassen und dann Rückverweise verwenden, um sicherzustellen, dass beide Zahlen durch Wiederholen dieser Zeichenfolge (und sonst nichts) geschrieben werden können. Aufgrund der Funktionsweise von Backtracking in der Regex-Engine (dh das.+
ist gierig) ergibt sich automatisch immer der größte gemeinsame Divisor. Da die Übereinstimmung die gesamte Zeichenfolge abdeckt, schreiben wir einfach die erste Erfassungsgruppe zurück, um unsere GCD zu erhalten.Endlich die Umrechnung von Unär zu Dezimal ...
Fügen Sie der Zeichenfolge einen Marker
#
, einen Begrenzer:
und alle Ziffern hinzu. Dies ist erforderlich, da Sie in einer Regex-Ersetzung keine neuen Zeichen bedingt erzeugen können. Wenn Sie eine bedingte Ersetzung wünschen, müssen Sie die Zeichen aus der Zeichenfolge selbst ziehen, damit wir sie dort ablegen.Dies ist das Gegenteil der früheren unären Expansion. Wir finden das größte Vielfache von 10, das in die aktuelle Zeichenfolge passt. Dann wählen wir die nächste Ziffer basierend auf dem Rest und teilen das Vielfache durch 10, während wir den Marker durch die Ziffern bewegen.
Und zum Schluss noch ein Bereinigungsschritt, um den Marker, das Trennzeichen und die Hilfsziffern zu entfernen.
quelle
2013 - Schnapp !
Schnapp ! ist eine Sprache, die auf Scratch basiert und an der Berkeley University entwickelt wurde. Es ist ein Upgrade auf Scratch mit erstklassigen Daten und benutzerdefinierten Blöcken (Funktionen). Wie Scratch basiert es nicht auf Text, sondern auf visuellen "Blöcken", die zusammenpassen.
Schnapp ! , geschrieben in JavaScript, ist der Nachfolger von BYOB, das in Squeak Smalltalk geschrieben wurde. Schnapp ! wurde im März 2013 als Beta für den öffentlichen Verbrauch freigegeben .
Schnapp ! ist eigentlich keine esoterische Sprache. Es wird als Programmiersprache für den AP CS-Kurs von Beauty and Joy of Computing (BJC) in Berkeley und anderen verwendet.
Ich half beim Testen und so.
Variante "Hallo Welt"
ASCII Art "N"
Dies verwendet die Stdlib für einige der Blöcke.
Ziemlich einfaches Looping hier. Nimmt eine Eingabe entgegen. Dann addieren wir einfach alles und sagen es (Ergebnis für n = 5):
Ich habe mir hier die Freiheit genommen, nur 2 statt 1 Leerzeichen zu verwenden, weil Snap! sagt nichts in Monospace.
GCD
Der euklidische Algorithmus ist nicht sehr schnell, funktioniert aber und ist ziemlich einfach. (Entschuldigung, ich habe einen Tippfehler im Blocknamen gemacht. Jetzt habe ich die Registerkarte geschlossen, ohne zu speichern. Es muss nur bleiben.)
Diese Funktionsdefinition erzeugt dann diesen Block:
quelle
2007 - LOLCODE
Sprachgeschichte
LOLCODE wurde 2007 von Adam Lindsay, einem Forscher an der Lancaster University, entwickelt. Die Syntax basiert auf den von Cheezburger, Inc. verbreiteten lolcats-Memen.
"Hallo Welt!" Variante
ASCII Art N
Werte werden als Zeichenketten (YARNs) von stdin mit gelesen
GIMMEH
. Sie können durch Multiplizieren mit 1 in numerische Werte (NUMBRs) umgewandelt werden.Die Werte werden mit auf Standard gedruckt
VISIBLE
. Standardmäßig wird eine neue Zeile angehängt, die jedoch durch Hinzufügen eines Ausrufezeichens unterdrückt werden kann.GCD
SMOOSH
Führt eine String-Verkettung durch.quelle
IM IN YR toilet UPPIN YR butt
Schöne Variablennamenx1
,x2
etc.1982 - PostScript
PostScript ist eine Sprache zum Erstellen von Vektorgrafiken und Drucken.
Adobe wurde 1982 gegründet und ihr erstes Produkt war PostScript. Die Sprache wurde in Druckern verwendet: Die Befehle werden vom Drucker interpretiert, um ein Rasterbild zu erstellen, das dann auf die Seite gedruckt wird. Es war eine sehr verbreitete Komponente von Laserdruckern bis weit in die 1990er Jahre. Auf dem Drucker ist die CPU-Belastung offensichtlich recht hoch, und da Computerprozessoren immer leistungsfähiger wurden, war es sinnvoller, die Rasterung auf dem Computer durchzuführen als auf dem Drucker. PostScript ist auf Verbraucherdruckern weitgehend verschwunden, obwohl es auf vielen weiteren High-End-Druckern noch vorhanden ist.
Der Standard, der PostScript ersetzte, ist ein wenig bekanntes Format namens PDF.
Als ich mit dem Programmieren anfing, war PostScript aus der Mode gekommen, aber ich habe während meines Studiums ein wenig gelernt, um Dokumente für TeX zu erstellen. Es war ganz anders als in anderen Programmiersprachen, die ich verwendet hatte (Reverse-Infix-Notation, Stapeln, Drucken auf einer Seite anstelle einer Konsole), aber es war schön, diese alte Sprache für ein bisschen Spaß abzuwischen.
Da es sich bei PostScript um eine Drucksprache handelt, ist es sinnvoller, sie zum Drucken zu verwenden und dann eine Ausgabe an die Konsole zu senden.
Aufgabe 1
Die ersten Zeilen bilden eine Zeichenfläche. Anschließend
moveto
weist der Befehl PS an, an einer bestimmten Position zu zeichnen, undshow
druckt die Zeichenfolge auf der Seite aus. Beachten Sie, dass Klammern eine Zeichenfolge in PostScript und keine Anführungszeichen markieren.Aufgabe 2
Ich habe eine Funktion zum Zeichnen von "ASCII art" N geschrieben, aber PostScript-Funktionen können keine Argumente verwenden. Stattdessen legen Sie Ihre Argumente auf den Stapel und entfernen sie dann wieder. Das ist die
/x exch def
Linie.Ein Beispiel: Angenommen, der Stapel ist
8 9 2
. Zuerst geben wir den Namen/x
in den Stapel ein, der Stapel ist also8 9 2 /x
. Derexch
Operator tauscht die beiden Stapelwerte aus, der Stapel ist also jetzt8 9 /x 2
. Dann werdendef
die beiden obersten Stapelwerte eingefügt und definiert/x
, dass der Wert verwendet werden soll2
. Der Stapel ist jetzt8 9
.Als ich anfing, PostScript zu verwenden, fand ich das etwas verwirrend. Ich hatte über den Stapel als theoretisches Konzept gelesen, aber dies war das erste Mal, dass ich ihn in der Praxis verwendete.
Der Rest der Funktion ist ein Zeichencode: Beginnen Sie in der unteren rechten Ecke und füllen Sie jeweils eine Zeile von links nach rechts nach diagonal aus.
Aufgabe 3
Auch hier habe ich eine Form von Euclids Algorithmus verwendet, aber ich hatte vergessen, dass PostScript einen eingebauten Modulo-Operator hat, also musste ich meinen eigenen schreiben. Dies hat sich als nützliche Erinnerung an die Einschränkungen der Stack-basierten Programmierung erwiesen. Meine erste Implementierung von
modulo
basierte auf Rekursion:Das ist in Ordnung, bis Sie versuchen, dies auszuführen, wenn
x
es groß undy
klein ist (z. B. 5689 und 2). Sie können nur bis zu 250 Elemente auf dem Stapel haben, und so habe ich die Stapelgrenze weit überschritten. Hoppla. Ich musste an das Zeichenbrett zurückkehren.Der GCD-Code selbst ist ziemlich einfach. Aber genau wie Funktionen keine Argumente annehmen können, haben sie auch keine Rückgabewerte. Stattdessen müssen Sie das Ergebnis auf den Stapel verschieben, wo es später von einem anderen Benutzer abgelegt werden kann. Das ist, was die Zeilen
a
undb a gcd
tun: Wenn sie die Auswertung beendet haben, verschieben sie den Wert in den Stapel.Wenn Sie den gesamten Code in ein Dokument einfügen und drucken, sieht die Ausgabe folgendermaßen aus:
quelle
2009 - > <>
Inspiriert von Befunge ist> <> (Fisch) eine esoterische, stapelbasierte 2D-Sprache, dh der Programmfluss kann nach oben, unten, links oder rechts erfolgen. Die ursprüngliche Version von> <> enthielt Multithreading
[
und]
erstellte und beendete Threads. Aus Gründen der Einfachheit wurden diese Anweisungen jedoch dahingehend geändert, dass neue Stacks erstellt bzw. entfernt wurden.Den aktuellen offiziellen Dolmetscher für> <> finden Sie hier . Leider ist die Verbindung zum alten Interpreter im Esolang-Wiki unterbrochen.
"Hallo Welt!" Variante
Beachten Sie, wie die Zeichenfolge rückwärts geschrieben wird -> <> verfügt technisch gesehen nicht über Zeichenfolgen. Der einzige Datentyp ist eine seltsame Mischung aus char, int und float.
"
Schaltet die Zeichenfolgenanalyse um und schiebt jedes Zeichen auf den Stapel, bis ein Abschluss erreicht"
ist.Die zweite Hälfte des Codes schiebt dann die Länge des Stapels
l
, prüft, ob sie Null ist?!
und wenn ja, wird das Programm beendet;
. Andernfalls wird der Befehlszeiger weitergeht, mit der Oberseite des Stapels auszugeben ,o
bevor die Ausführungbb+0.
, die den Zeiger teleports zu positionieren ,(22, 0)
kurz bevor diel
, eine Schlaufe entsteht.ASCII Art N
Mit Abstand zur Klarheit. Sie können versuchen , diese auf die neuen Online - Interpreter heraus hier und sehen Sie den Zeiger Anweisung geht herum und herum - nur nicht vergessen , eine Nummer im „Initial Stack“ Textbox eingeben. Wenn Sie mit dem Python-Interpreter arbeiten, verwenden Sie das
-v
Flag, um den Stack zu initialisieren, zFür dieses Programm setzen wir die Eingabe
n
in das Register mit&
und drücken eine 0, die wiri
für "Iterationen" aufrufen . Der Rest des Programms besteht aus einer riesigen Schleife, die so abläuft:Dann wiederholen wir die Schleife von Anfang an.
Die Pfeile
^>v<
ändern die Richtung des Programmflusses und die Spiegel geben/\
die Richtung des Programmflusses wieder.GCD
Hier ist ein Beispiel, wie ein Golf> <> Programm aussehen könnte. Sie können dies erneut im Online-Interpreter versuchen (geben Sie z. B. zwei durch Kommas getrennte Werte in das Feld "Anfangsstapel" ein
111, 87
) oder indem Sie das-v
Flag des Python-Interpreters verwenden, zDieses Programm verwendet den euklidischen Algorithmus. Hier ist ein GIF, das ich zuvor vorbereitet habe:
Beachten Sie, dass> <> toroidal ist. Wenn der
v
Befehl unten links ausgeführt wird, bewegt sich der Befehlszeiger nach unten, umläuft ihn und wird oben wieder angezeigt.Bearbeiten: Durch die vollständige Ausführung des Codes von rechts nach links konnte @randomra drei Bytes mit rasieren
Ich schätze, ich habe nicht genug Golf gespielt :)
quelle
><>
ein Palindrom ist.2012 - Element
Dies ist eine Sprache, die ich Anfang 2012 erfunden habe, um eine einfache Golfsprache zu sein. Damit meine ich, dass es kaum bis gar keine Bedienerüberlastung gibt. Die Bediener sind auch einfacher und weniger zahlreich als die meisten modernen Golfsprachen.
Die interessantesten Merkmale dieser Sprache sind ihre Datenstrukturen. Es gibt zwei Stapel und einen Hash, die zum Speichern von Informationen verwendet werden.
Der m-Stapel ist der Hauptstapel, in dem arithmetische und die meisten anderen Operationen stattfinden. Wenn Daten eingegeben oder gedruckt werden, werden sie an dieser Stelle abgerufen oder abgerufen.
Der C-Stack ist der Kontrollstack. Hier findet die Boolesche Arithmetik statt. Die Spitzenwerte des C-Stacks werden von If- und While-Schleifen als Bedingung verwendet.
Im Hash werden Variablen gespeichert. Das
;
bzw.~
Speichern und Abrufen von Daten aus dem Hash.Element ist eine sehr schwach typisierte Sprache. Es nutzt Perls Fähigkeit, Zahlen frei als Zeichenfolgen zu interpretieren und umgekehrt.
Wenn ich schon dabei bin, kann ich auch die gesamte Dokumentation für die Sprache einbinden. Den originalen Interpreter für 2012, geschrieben in Perl, finden Sie hier . Update: Ich habe eine benutzerfreundlichere Version erstellt, die Sie hier finden .
Aufgabe 1 - Text drucken
Einer der schwierigeren Teile der Sprache ist das Fehlen von Zeichenkettenbegrenzern, weshalb in dieser Zeichenkette Escapezeichen erforderlich sind. Der
`
am Ende druckt den String.Aufgabe 2 - ASCII Art N
Hier werden Sie Zeuge einiger Stapelmanipulationen. Um die Formatierung der Erklärung zu vereinfachen, ersetze ich die Zeilenumbrüche durch ein
L
und das Leerzeichen durch einS
.Nachdem ich diese Antwort extrem getestet hatte, fand ich eine 39-Byte-Lösung, obwohl sie viel komplizierter ist.
Aufgabe 3 - GCD
Dies ist eine stapelbasierte Methode.
quelle
2012 - Julia
Sprachgeschichte
Julia wurde 2012 von Jeff Bezanson, Stefan Karpinski und Viral Shah entwickelt, während Jeff am Massachussets Institute of Technology (MIT) studierte und von Professor Alan Edelman beraten wurde. Sie waren motiviert von dem Wunsch nach einer Programmiersprache, die unter anderem Open Source, schnell und dynamisch war und gleichzeitig in einer Vielzahl von Anwendungen benutzerfreundlich war. Das Produkt war Julia, ein neuer Ansatz für das Hochleistungsrechnen in der Wissenschaft.
"Hallo Welt!" Variante
Das Drucken auf STDOUT in Julia ist ganz einfach!
ASCII Art N
Der Code ist aus Gründen der Lesbarkeit eingerückt, Julia legt jedoch keine Einschränkungen für Leerzeichen fest.
GCD
Das letzte, was in der Funktion aufgeführt ist, wird implizit zurückgegeben.
quelle
1988 - Mathematica
Oder soll ich es Wolfram-Sprache nennen ?
Aufgabe 0
Der Schöpfer von Mathematica ist Stephen Wolfram, der Gründer und CEO von Wolfram Research. Vor der Entwicklung von Mathematica war er Physiker. Da es in der Physik eine Menge algebraischer Berechnungen gab, wurde er ein Benutzer von Macsyma .
Wolfram promovierte 1979, als er 20 Jahre alt war. Er glaubte, er brauche ein besseres CAS als Macsyma, um Physik zu machen, und begann, SMP (das "Symbolische Manipulationsprogramm") zu schreiben . Die erste Version von SMP wurde 1981 veröffentlicht. SMP war der Vorgänger von Mathematica. Obwohl es einen tiefen Einfluss auf Mathematica hatte, wurde keiner seiner Codes jemals für Mathematica verwendet.
1986 beschloss Wolfram, ein "ultimatives Rechensystem" zu schreiben. Er begann 1986 mit dem Schreiben des Codes und gründete 1987 Wolfram Research. Schließlich wurde Mathematica 1.0 am 23. Juni 1988 veröffentlicht.
Ich habe Mathematica 1.0 nicht gefunden. Tatsächlich hatte Mathematica 1.0 weder eine Windows- noch eine Linux-Version. Aber ich habe Mathematica 2.0 auf einer chinesischen Website gefunden. Es kann weiterhin unter Windows XP ausgeführt werden.
Aufgabe 1
Oder einfach:
Aufgabe 2
In der heutigen Mathematica können wir schreiben:
Genau wie Julia und R ist dies eine Matrixlösung. In Mathematica können Sie eine dünne Matrix mithilfe des Mustervergleichs definieren.
Wurde
SparseArray
jedoch in Mathematica 5.0 eingeführt, sodass wir es in Mathematica 1.0 nicht verwenden können.Hier ist eine Lösung, die in Mathematica 1.0 funktioniert:
Wir können nicht schreiben,
f[i_, 1 | i_ | n] = "N"
weilAlternatives
es in Mathematica 2.0 eingeführt wurde.Aufgabe 3
Wir können nur die eingebaute Funktion verwenden:
Oder wir können die Definition der GCD verwenden:
Oder wir können das LCM verwenden , obwohl LCM üblicherweise aus GCD berechnet wird:
Oder wir können den euklidischen Algorithmus mit Pattern Matching verwenden:
Oder als anonyme Funktion:
Alle oben genannten Funktionen wurden in Mathematica 1.0 eingeführt.
quelle
1999 - XSLT
Das World Wide Web Consortium (W3C) hat XSLT zur Umwandlung von XML in HTML, Text usw. erstellt. In den folgenden Beispielen wird davon ausgegangen, dass die Eingabe in
<input>..</input>
Tags eingeschlossen ist.Aufgabe 1
Dieser ist einfach. Es entspricht einem
input
Tag auf der obersten Ebene und ersetzt es durch die gewünschte Ausgabe.Aufgabe 2
Dieser definiert 2 rekursive Vorlagen
loop
undspaces
.loop
mit Parameterni
undn
erzeugt die gewünschte Ausgabe fürn
, beginnend an der Positioni
.spaces
with parametern
erzeugtn
Leerzeichen.Aufgabe 3
Die Eingabe hierfür muss in
<input><num>..</num><num>..</num></input>
Tags erfolgen.Dies ist nur eine rekursive Vorlage
gcd
, die den euklidischen Algorithmus verwendet.quelle
2014 - CJam
CJam wurde von PPCG-Benutzer aditsu erstellt und wurde um April 2014 veröffentlicht .
"Hallo Welt!" Variante
CJam druckt den Inhalt des Stapels am Ende des Programms automatisch aus
ASCII Art N
Code Erklärung:
Nimmt die Höhe / Breite von N als Eingabe über STDIN. Probieren Sie es hier online aus
GCD
Übernimmt die beiden Zahlen als Eingabe über STDIN. Probieren Sie es hier online aus
quelle
ri_S*0'NtW'Nta1$*\,Sf*'Nf+..e>N*
in modernem CJam verkürzen.1990 - Haskell
Haskell ist eine beliebte (oder sollte ich sagen: die beliebteste ?) Reine Funktionssprache. Es hebt sich vom Mainstream ab durch sein ungewöhnliches Bewertungsmodell (standardmäßig ist alles faul oder technisch nicht streng) und durch sein auf Hindley-Milner basierendes Typensystem, das auch jetzt noch zu den leistungsstärksten auf dem Markt zählt.
Aufgabe 1
Aufgabe 2
Demo, drucke die ganze unendliche Liste (bis der Benutzer abbricht oder die Welt untergeht ...)
Natürlich können Sie leicht zu einem dieser Elemente gelangen, indem Sie auf nur ein Element der unendlichen Liste zugreifen:
Aufgabe 3
quelle
1972 - INTERCAL
Und Sie dachten, Fortran und Cobol wären komisch. Das ist verrückt!
Aufgabe 1
Ich werde nicht versuchen, das Ein- und Ausgabesystem von INTERCAL zu erklären. lesen gerade dies und hoffen , dass Sie nicht sterben.
Aufgabe 2
Gute Güte. Das hat mich ein bisschen gekostet. Die Beschriftungsnummern sind ein Durcheinander und spiegeln dies wider. Ich werde nicht versuchen, dies zu erklären, es sei denn, jemand fragt.
Aufgabe 3
Das ist ein bisschen einfacher. Wegen der ... Verrücktheit von INTERCAL müssen Sie die Zahlen folgendermaßen eingeben:
Um beispielsweise die GCD von 42 und 16 zu erhalten, würde ich Folgendes eingeben:
Es druckt auch die Zahl in römischen Ziffern ... denn das ist INTERCAL für Sie!
quelle
PLEASE GIVE UP
. Ich habe es schon gemacht .-.1967 - APL
1957 begann Ken Iverson an der Harvard University mit der Entwicklung einer mathematischen Notation für die Array-Manipulation. In den 1960er Jahren wurde seine Notation bei IBM zu einer Programmiersprache entwickelt. Die erste Teilimplementierung entstand 1963 und wurde sogar an einer High School verwendet, um Schüler über transzendentale Funktionen zu unterrichten. Eine vollständige, brauchbare Implementierung musste bis 1965 warten. Zwei Jahre lang wurde sie nur intern von IBM verwendet. 1967 veröffentlichte IBM einen APL-Interpreter für den IBM 1130-Computer, der 1966 fertiggestellt worden war. Sie können verstehen, wie schwierig es ist, ein Jahr dafür zu wählen, aber ich denke, es sollte 1967 sein. Da dies das erste Jahr ist, wurde der Öffentlichkeit eine vollständige Implementierung zur Verfügung gestellt. Wenn jemand wirklich anderer Meinung ist, könnte ich es ändern.
Der Quellcode für APL \ 360 ist online , ebenso wie ein Emulator. Dies ist, was ich verwendet habe, um diese Beispiele zu testen. Es stammt aus dem Jahr 1967 und ist zusammen mit APL \ 1130 (für die oben genannte IBM 1130) mehr oder weniger das wahre Original. Wie erwartet ist es sehr primitiv. Es fehlt die Unterstützung für Feinheiten wie Kleinbuchstaben, alle Operatoren arbeiten nur mit eingebauten Funktionen, und die Menge der eingebauten Funktionen ist sehr spärlich (insbesondere
∨
ist nuror
und nicht doppelt so großgcd
). Die vollständige Originalbeschreibung finden Sie hier . Mir ist jedoch aufgefallen, dass die Version, die ich hatte, in Bezug auf dieses Dokument nicht vollständig ist und⍎
unter anderem fehlt .Ich habe die Programme sowohl im Unicode-Format (damit Sie sie lesen können) als auch in der ursprünglichen Codierung (damit Sie sie ausschneiden und in das APL-Fenster des Emulators einfügen können) bereitgestellt.
Unglaublicherweise laufen diese Programme in modernen Versionen von Dyalog, NARS2000 und GNU APL korrekt und ohne Änderungen (mit Ausnahme der Codierung). Ich habe also den Weg gefunden, tragbare APL zu schreiben: Tu einfach so, als wäre es 1967!
Aufgabe 1:
Unicode:
APL \ 360:
Schritt 2:
Unicode:
APL \ 360:
Schritt 3:
Ich habe dies auf die übliche rekursive Weise gelöst. Theoretisch könnten Sie etwas Cleveres und Array-orientiertes tun, wie die Antwort J; In der Praxis hat dies jedoch eine Speichernutzung von O (N) und überfordert schnell die Hardware und Software der Flower-Power-Ära.
Unicode:
APL \ 360:
quelle
1996 - Ocaml
Ich habe mehr als einen Tag darauf gewartet, dass jemand 1996 füllt, damit ich Ruby ausfüllen kann. Nun, warum lernst du dann nicht OCaml?
Hallo Welt
ASCII
Veränderbare Saiten!
GCD
Nein
==
und Infixmod
, das ist süßquelle
2005 - Vorspiel
Prelude ist eine sehr unterhaltsame Sprache, deren Quellcode aus mehreren "Stimmen" besteht, die parallel ausgeführt werden und in denen ich sehr gerne Probleme löse . Es soll die ASCII-Darstellung der Schwestersprache Fugue sein , die tatsächlich MIDI-Dateien als Quellcode verwendet und die im Prelude enthaltenen Anweisungen als Intervalle in den Melodien der Stimmen codiert.
Das Präludium ist ziemlich minimalistisch und dennoch vollständig (vorausgesetzt, Sie verwenden mindestens 2 Stimmen). Wie gesagt, die Stimmen (Codezeilen) werden gleichzeitig Spalte für Spalte ausgeführt. Jede Stimme bearbeitet einen eigenen Stapel, der mit einer unendlichen Anzahl von Nullen initialisiert wird. Prelude unterstützt die folgenden Anweisungen:
Einige zusätzliche Hinweise:
^
die obere Stimme von der unteren Stimme kopiert wird (und umgekehrt).?
und!
in derselben Spalte werden von oben nach unten ausgeführt.?
und!
lesen und schreiben Zeichen mit dem entsprechenden Zeichencode. Der Python-Interpreter verfügt jedoch auch über einen Schalter im Code, mit dem die Zahlen selbst gedruckt werden können. Zu Testzwecken verwende ich tatsächlich eine modifizierte Version, die auch Zahlen anstelle von Zeichen lesen kann . Es besteht jedoch Einigkeit darüber, dass die numerische Eingabe / Ausgabe tatsächlich als Bytewert angegeben werden kann. Daher sind diese Änderungen nicht erforderlich, um gültige Programme für den Umgang mit Zahlen zu erstellen.(
und)
müssen nicht mit der gleichen Stimme sein. Die für die Bedingung verwendete Stimme ist immer diejenige, bei der die(
angezeigt wird. Die vertikale Position der)
ist daher völlig irrelevant.(
nur einmal ausgeführt, bevor die Schleife beginnt, und unabhängig davon, ob die Schleife betreten wird. Ebenso wird jede Anweisung in derselben Spalte wie a)
am Ende jeder Iteration ausgeführt, unabhängig davon, ob die Schleife nach dieser Iteration beendet wird.Ich werde Ihnen zuerst die drei Programme zeigen, ohne viel zu kommentieren. Nachfolgend finden Sie ausführliche Erläuterungen.
Die Programme
"Hallo Welt!" Variante
Wenn Sie den Python-Interpreter verwenden, stellen Sie dies sicher
NUMERIC_OUTPUT = False
.ASCII Art N
Zur Vereinfachung der Verwendung bietet dieses Programm die Möglichkeit, Eingaben als Zahlen zu lesen, die Ausgabe darf jedoch nicht numerisch sein. Wenn Sie also den modifizierten Python-Interpreter verwenden, legen Sie fest
GCD
Dies wird am besten mit allen numerischen Ein- / Ausgängen verwendet, z
Erklärungen
"Hallo Welt!" Variante
Das ist ziemlich einfach. Ich benutze 3 Stimmen, um nacheinander die Zeichencodes für alle Zeichen in zu generieren
Prelude was made in 2005!
. Ich beginne mit dem Rechnen8 + 9*8 = 80
, das ist der Zeichencode vonP
:Danach kopiere ich meistens nur den vorherigen Zeichencode und addiere oder subtrahiere die Differenz zum nächsten. Hier ist der Code, wobei jedoch jeder
!
durch das Zeichen ersetzt wird, das gedruckt wird (und_
für Leerzeichen und%
für die Ziffern):Das Finale
55+!
druckt eine abschließende Newline, nur weil es schöner ist.Als Randnotiz ist die Anzahl der Stimmen für diese Aufgabe ziemlich willkürlich, aber 3 ist ziemlich praktisch, weil es die größte Anzahl ist, bei der jede Stimme direkt auf die andere Stimme zugreifen kann.
ASCII Art N
Mit 5 Stimmen ist dies definitiv eines der komplexesten Programme, die ich bisher geschrieben habe. Die Stimmen haben ungefähr die folgenden Zwecke:
N-1
zur Verwendung in der inneren Schleife gespeichert wird.32
, um Leerzeichen bequem zu drucken.78
bequemN
s drucken .Lassen Sie uns den Code Teil für Teil durchgehen. Erstens bin ich die Schaffung der
32
so-4 + 9*4
und78
so6 + 9*8
:Jetzt drucke ich eine einzelne
N
(weil wir immer eine brauchen), während ich die EingabeN
und Speicherung leseN-1
undN-2
in den ersten beiden Stimmen:Als nächstes gibt es eine "Schleife", die auf konditioniert ist
N-1
. Am Ende der Schleife wird die zweite Stimme immer auf reduziert0
, und die Schleife wird nach der ersten Iteration beendet. Also im Wesentlichen nur dasif(N > 1){...}
. Nach der Schleife drucken wir eine einzelne abschließende Newline. Zusammenfassend haben wir jetzt das folgende Framework:Innerhalb dieser Bedingung werden die ersten
N-2
Leerzeichen und ein einzelnesN
für die Vervollständigung der ersten Zeile eingefügt undN-1
die erste Stimme für die zukünftige Verwendung gespeichert :Nun das wahre Fleisch des Codes. Erstens gibt es eine äußere Schleife, die
N-1
Zeilen druckt . Für jede Zeile drucken wir zuerst eine neue Zeile und eineN
. Dann wiederholen wir dieN-2
Zeiten und drucken entweder Leerzeichen oderN
s (dazu später mehr). Und zum Schluss drucken wir noch einenN
:Zum Schluss der lustige Teil: Drucken jeder Zeile (und Abrufen der
N
richtigen Position ). Im Prelude gibt es eigentlich kein Wenn und Aber, also muss ich es selbst mit zwei Loops auf verschiedenen Stimmen bauen. Die Bedingung kann leicht durch Subtrahieren der inneren und äußeren Schleifenvariablen erhalten werden - wir erhalten,0
wenn wir drucken möchten,N
und etwas ungleich Null, wenn wir ein Leerzeichen drucken möchten.Die Grundidee eines if / else im Prelude besteht darin, eine Schleife nach dem entsprechenden Wert (dem "if" - Code (oder einem Code ungleich Null)) zu setzen und ihn sofort durch Drücken von a zu beenden
0
. Bei einer anderen Stimme behalten Sie einen Wert ungleich Null und eine weitere Schleife nach der "if" -Schleife bei. Während der "if" -Schleife setzen Sie eine Null auf diese andere Stimme, um zu verhindern, dass das "else" ausgeführt wird. Es gibt eine gewisse Flexibilität, ob Sie Nullwerte auf Werte ungleich Null verschieben oder einfach den Wert ungleich Null verwerfen, wenn sich darunter eine Null befindet. Dies ist jedoch die allgemeine Idee. Möglicherweise müssen Sie auch nachträglich eine Bereinigung vornehmen, wenn Sie weiterhin die entsprechende Stimme verwenden möchten. So sieht der Code aus:Und das ist es!
GCD
Dies ist "nur" eine iterative Implementierung des euklidischen Algorithmus. Aber Modulo im Prelude ist ein bisschen nervig, vor allem, weil man nicht leicht überprüfen kann, ob eine Zahl positiv oder negativ ist. Dieser Code verwendet eine Signum- Implementierung, die ich vor einiger Zeit geschrieben habe . Dh ein großer Teil des Codes stellt sich nur eine Zahl in
-1
,0
oder1
. Dies kann dann leicht durch Addieren oder Subtrahieren in eine Bedingung für positive oder negative Zahlen umgewandelt werden1
.Wir haben dieses Mal also vier Stimmen. Die erste Stimme verfolgt einfach die Hauptbeendigungsbedingung
b
und enthält sie (dh die Schleifeb
wird beendet, wenn sie wird0
). Die zweite Stimme enthälta
und mit Hilfe der Stimmen drei und vier Berechnungena % b
, bevor das Ergebnis mit der vorherigen ausgetauscht wirdb
. Schließlich werden die!
Abzügea
wannb == 0
.Schauen wir uns zuerst den Signum- Teil an:
Die eingegebene Nummer
n
befindet sich auf der ersten dieser Stimmen (die zweite Stimme im vollständigen Programm). Das Ergebnis landet auf der untersten Stimme. Es wird erwartet, dass die anderen beiden Stimmen leer sind (dh mit Nullen gefüllt sind). Beachten Sie, dassn == 0
dann beide Loops übersprungen werden und die unterste Stimme immer noch0
genau das enthält , was wir wollen.Wenn
n
ungleich Null ist, wird die erste kleine Schleife eingegeben. Wir drücken eine Null, um es sofort zu verlassen, legen zwei Kopienn
auf die mittlere Stimme und eine1
auf die untere Stimme. Jetzt besteht die Grundidee darin, eine der Kopien von zun
erhöhen, während die andere vonn
zu verringern ist, bis eine von ihnen Null erreicht. Währenddessen1
kippt die Stimme auf der unteren Seite die ganze Zeit ihr Vorzeichen (was einfach durch Subtrahieren von0
darunter auf dem Stapel erfolgt). Dies ist so eingestellt, dass die unterste Stimme das richtige Vorzeichen enthält , wenn eine der Zahlen Null erreicht.Nun wird Modulo durch Subtrahieren
b
von implementiert,a
bis das Ergebnis negativ ist. Wenn das passiert, fügen wir noch einen hinzub
. Das ist das bisschen:Beachten Sie die if / else-Konstruktion unten, die der für Aufgabe 2 verwendeten ähnelt.
quelle
2007 - Kratzer
Scratch ist eine Sprache, die vom MIT für Bildungszwecke entwickelt wurde. Ich bin seit 5 Jahren sehr damit beschäftigt. dazu später mehr.
Alle diese können hier eingesehen werden .
Ich bin gerade sehr gehetzt und werde die Schnipsel später erklären. Hoffentlich sind sie selbsterklärend.
Aufgabe 1
Aufgabe 2
Aufgabe 3
quelle
1972 - C
Wir wissen alle über C Bescheid, nicht wahr? C wurde bei Bell Labs zusammen mit Unix erstellt. Unix wurde größtenteils in C geschrieben. Alle modernen Unix-Derivate sind noch größtenteils in C geschrieben. Die Syntax von C hat viele, viele Programmiersprachen beeinflusst. Es ist wahrscheinlich die älteste Programmiersprache, die für Neuentwicklungen noch immer weit verbreitet ist.
C selbst ist ein Nachkomme von B, von dem ich hoffe, dass es auch in dieser Liste auftaucht. Es gab keine Programmiersprache 'A': B ist eine Variante von BCPL, die wiederum eine reduzierte CPL ist. Keine dieser Sprachen war jemals sehr beliebt. BCPL war jedoch die Sprache, in der das erste "Hello World" -Programm geschrieben wurde. Eine andere interessante Tatsache ist, dass B sowohl
/* */
als auch//
Kommentare hatte, aber C die//
Kommentare fallen ließ . Sie wurden später mit dem C99-Standard wieder in C eingeführt.Die C-Programme hier wurden mit dem Unix V5 C-Compiler aus dem Jahr 1974 getestet. Dies war der älteste C-Compiler, den ich finden und zum Laufen bringen konnte, und diese Programme lassen sich auf einem modernen C-Compiler nicht kompilieren. (Eine der vorgenommenen Änderungen ist, dass früher Mutationsoperatoren
+=
geschrieben wurden=+
.)#include <
...>
existierte noch nicht. Viel von der Standardbibliothek auch nicht. Ich musste meine eigenen schreibenatoi
. Ich habe einen Teil des V5-Quellcodes durchgesehen, um herauszufinden, welche Dinge erlaubt waren und welche nicht. Die Version, die ich verwendetstruct
habe, enthielt zuerst s, aber da ich diese nicht verwendet habe und die Syntax sich bis V7 (als K & R C) offenbar nicht wesentlich geändert hat, funktioniert dies möglicherweise auch mit früheren Versionen.Ich habe mein Bestes getan, um meinen Code im selben Stil zu schreiben, den der V5-Quellcode verwendet. (Nicht, dass das schrecklich konsequent wäre.)
Schauen Sie sich hier für Links zu Unix V5, einem Emulator, und Anweisungen zu bekommen es auf einem modernen Computer ausgeführt wird .
Aufgabe 1
Aufgabe 2
Aufgabe 3
quelle
cat > file.c
. (Beenden Sie wie immer mit Strg-D). Außerdem hat sich C weniger verändert, als Sie vielleicht denken: Wenn Sie die=*
und=+
in denatoi
Funktionen gegen die modernen Äquivalente*=
und+=
austauschen, werden sie von einem modernen GCC einwandfrei kompiliert und auch ausgeführt. Selbst kaum Warnungen.2009 - Idris
Idris ist eine typabhängige, reine Funktionssprache, die neben den äußerst strengen Beweismöglichkeiten, die mit abhängigen Typen erreichbar sind, die praktische Verwendbarkeit für reale Anwendungen hervorhebt.
Aufgabe 1
Aufgabe 2
Dies ist kein Programm, sondern nur eine Funktion (genauer gesagt ein abhängiger Wert ), die den gewünschten Buchstaben N als zweidimensionales Array erzeugt.
Aufgabe 3
Beachten Sie, dass ich den Namen wählen musste,
gcd'
dagcd
er bereits im Idris-Vorspiel definiert ist.quelle
:
und::
, und geändert_
zuZ
.Z
ist eigentlich der Konstruktor von0 : Nat
. Der Unterstrich wird in Idris genauso verwendet wie in Haskell.:)
2014 - Pyth
Da wir CJam haben, könnten wir der Vollständigkeit halber auch Pyth haben :)
Pyth ist eine Golfsprache von @isaacg , die bis zu Python kompiliert wird. Es ist bemerkenswert, dass es prozedural ist und Präfixnotation verwendet. Pyth erschien erstmals im Juni 2014 .
"Hallo Welt!" Variante
Beachten Sie das Fehlen eines schließenden Anführungszeichens, das optional ist, wenn ein Pyth-Programm in einer Zeichenfolge endet.
ASCII Art N
Probieren Sie es online aus . Das äquivalente Python ist:
Oder erweitert (die erste und dritte Zeile sind implizit):
GCD
Dieses Programm verwendet den euklidischen Algorithmus und verwendet zwei durch eine neue Zeile getrennte Zahlen. Probieren Sie es online aus .
i.uQ
ist noch kürzer, wenn wir das eingebaute für GCD verwenden. Dies entsprichtprint(gcd(*eval(input())))
(Eingabe von zwei durch Kommas getrennten Zahlen).quelle
1964 - Dartmouth BASIC
BASIC ist eine Familie allgemeiner, übergeordneter Programmiersprachen, deren Designphilosophie die Benutzerfreundlichkeit betont. 1964 entwarfen John G. Kemeny und Thomas E. Kurtz die ursprüngliche BASIC-Sprache am Dartmouth College in New Hampshire. Sie wollten Studenten in anderen Bereichen als Naturwissenschaften und Mathematik die Verwendung von Computern ermöglichen.
Ich schaue mir dieses BASIC- Handbuch von 1964 an und diesen Emulator des Darthmouth Time Sharing Systems, auf dem es lief. Der Server ist immer noch aktiv, aber leider scheint es unmöglich zu sein, ein Konto zu registrieren. Im Moment sollten diese Programme theoretisch funktionieren:
Aufgabe 1
Aufgabe 2
So etwas ausgeben:
Beachten Sie, wie die Eingabe als Teil des Programms (
70 DATA 5
) eingegeben wird . DerREAD
Anweisungsweg oben holt Daten von dort. Es gibt keine Verkettung von Zeichenfolgen. In Abschnitt 3.1 des Handbuchs wird jedoch beschrieben, wiePRINT
Ergebnisse in tabellarische "Zonen" in der Ausgabe geschrieben werden.Aufgabe 3
Die langsame Version von Euclids Algorithmus:
Ausgabe:
quelle
2010 - WTFZOMFG
WTFZOMFG ist eine esoterische Sprache, die auf Brainfuck basiert. Es wurde von Jay Songdahl im Jahr 2010 gemacht. "WTFZOMFG" ist die Abkürzung für "What's That Function? Zen Optimized Malicious File Gophers!" .
Hier ist ein Compiler für * nix-Systeme .
Aufgabe 1
Aufgabe 2
Erläuterung:
Es tut uns leid. Ich kann keine Erklärungen schreiben.
Aufgabe 3
Euklidischer Algorithmus. WTFZOMFG hat keinen Befehl für mod, daher muss ich
d
(dividieren),m
(multiplizieren) unds
(subtrahieren) verwenden.quelle
2009 - Auf geht's
Go ist eine von Google entwickelte Programmiersprache. Die Entwicklung begann 2007, Go wurde jedoch im November 2009 angekündigt.
Go ist eine statisch typisierte Sprache, die von C beeinflusst wird und deren Schwerpunkt auf Prägnanz, Einfachheit und Sicherheit liegt.
Aufgabe 1:
Die erste Zeile deklariert das Paket des Codes. Selbst ein einfaches Beispiel wie das Drucken einer Zeile muss Teil eines Pakets sein. Und die ausführbare Datei wird immer aufgerufen
main
.Schritt 2:
Go hat eine recht präzise Variablendeklaration (
i := 0
ist dasselbe wievar i int = 0
), und der Compiler bestimmt den Typ. Dies ist in der Regel in dynamischen Sprachen häufiger der Fall. Mit dieser Kurznotation ist es auch sehr einfach, Variablen Funktionen zuzuweisen (f := func(x int) int {/* Code */}
) und Abschlüsse zu erstellen.Schritt 3:
Hier sehen Sie die
a, b = b, a%b
Syntax, die wirklich nett ist. Ich kenne den genauen Namen nicht, aber in Python heißt es Tupel auspacken. Auf die gleiche Weise können Sie mehrere Werte von einer Funktion zurückgeben (func f() (int, string) { return 42, "Hallo"}
) zurückgeben.Eine andere Sache, die in diesem Code passiert, ist die Schleife. Die for-Schleife ist die einzige Schleife in Go. Es gibt keine While-Schleifen oder Do-While-Schleifen. Sie können jedoch problemlos ein Äquivalent für die while-Schleife
for condition {}
oder eine Endlosschleife erstellenfor {}
.quelle
1991 - Python
Sprachgeschichte
In den späten 1980er Jahren begann Guido van Rossum, Python als Hobby zu erfinden. Der Name stammt von Monty Pythons Flying Circus, einer britischen Fernsehshow, deren Fan Rossum ist. Die erste Python-Implementierung begann 1989 und wurde 1991 veröffentlicht. Sie hat im Laufe der Jahre an Popularität zugenommen und ist die Sprache der Wahl für viele einführende Informatikkurse geworden.
"Hallo Welt!" Variante
Beachten Sie die Klammern um die Eingabe bis
print
. Obwohl diese Syntax in Python 2 funktioniert, lassen Sie diese Klammern normalerweise in Python 2 weg. Sie sind jedoch in Python 3 erforderlich. Wie von Zach Gates vorgeschlagen, werden durchgehend Klammern verwendet, um sicherzustellen, dass der hier vorgestellte Code versionsübergreifend funktioniert.ASCII Art N
Funktionen werden mit definiert
def
. Die Verkettung von+
Zeichenfolgen erfolgt mit und die Wiederholung von Zeichenfolgen mit*
.GCD
Beachten Sie, dass für Python strukturierte Leerzeichen erforderlich sind.
quelle
1968 - Algol 68
Algol 68 wurde von der IFIP-Arbeitsgruppe 2.1 als Nachfolger von Algol 60 definiert.
Es ist eine ausdrucksorientierte Sprache, in der alles einen Wert hat. Es ist auch orthogonal, in dem Sie ein beliebiges Konstrukt in beliebiger Weise verwenden können. Dies bedeutet, dass sich Ausdrücke beispielsweise auf der linken und rechten Seite einer Zuweisung befinden können.
Alle Kontrollstrukturen haben eine Kurzform sowie eine Langform mit Ausdrücken. Es erlaubt auch die Definition von Operatoren.
Die Ziele der Sprache werden angeführt als:
Diese Programme wurden mit dem Algol 68 Genie-Interpreter getestet , der eine vollständige Implementierung der Sprache darstellt.
Einige Merkmale, die moderne Programmierer möglicherweise anders finden, sind, dass leere Anweisungen nicht zulässig sind. Sie können nicht einfach
;
überall hinzufügen . Sie müssen dieSKIP
Anweisung verwenden, wenn Sie explizit nichts haben möchten. Es erlaubte auch das Codieren von gleichzeitigen Programmen sehr einfach. Algol 68 verwendete auch, insbesondere, Rückwärtsschlüsselwörter als Terminatoren wie esac , od , fi usw.Die Sprache hatte eine Darstellung, die zum Schreiben des Codes verwendet wurde, der viele Schriftarten verwendete, die beispielsweise Schlüsselwörter in Fettdruck und Bezeichner in Kursivschrift darstellten . Zu der Zeit, und wahrscheinlich immer noch, hat kein Compiler dieses Feature des Designs implementiert. Die Sprache erlaubte verschiedene konkrete Darstellungen von Programmen unter Verwendung von Stropping-Modi . Dies ermöglichte die Erstellung von Programmen mit begrenzten Zeichensätzen, wie sie in den 1960er Jahren auf Computern vorkamen. Betrachten Sie das kurze Programmfragment, das wie folgt dargestellt wird:
Dies könnte für einen Compiler im Prime- Stropping-Modus vorbereitet werden als:
In Punkt Abledern Modus wäre dies:
Im Falle eines Abbruchmodus wäre dies:
Ich habe eine große Vorliebe für diese Sprache, da ich an einer der Compiler-Implementierungen gearbeitet habe und viele Jahre ausschließlich darin programmiert habe.
Aufgabe 1
Der hier zu beachtende Punkt sind die doppelten Klammern. Dies liegt daran, dass print eine Funktion ist, die ein einzelnes Argument akzeptiert, das ein Array variabler Länge der Union aller Typen ist. Die innere Klammer ist der Array-Konstruktor. So wird Polymorphismus in dieser stark typisierten Sprache gehandhabt.
Im Fallstropping-Modus:
Aufgabe 2
Im Fallstropping-Modus:
Aufgabe 3
Im Fallstropping-Modus:
quelle
1962 - SNOBOL
Die "strengenorientierte und symboLische Sprache". Anfangs offenbar als "Symbolic Expression Interpreter" "SEXI" bezeichnet, das dann geändert werden musste, um zu verhindern, dass die Nerds der 1960er-Jahre rot werden, wenn sie ihre Jobs einreichen. Wahre Geschichte.
Dies war eine der ersten Sprachen, die von Haus aus mit Zeichenfolgen und Mustern umgehen konnte. In der ersten Version von SNOBOL war der String der einzige Datentyp. Mathe wurde dann durch Parsen durchgeführt. Die anfängliche Implementierung erfolgte auf der IBM 7090. Es scheint lange her zu sein, zumindest konnte ich es nicht finden. Was ich gefunden habe, war das Originalpapier, das es beschreibt, sowie ein SNOBOL3-Interpreter in Java, der auf einem modernen Computer ausgeführt werden kann .
Das erste SNOBOL hatte so ziemlich nur Pattern Matching und Grundrechenarten. SNOBOL 3 hat dann Funktionen hinzugefügt und die E / A geändert, scheint aber ansonsten abwärtskompatibel geblieben zu sein. SNOBOL 4 änderte die Syntax und entwickelte sich von dort zu Icon , das die Musterübereinstimmung beibehält, aber ansonsten fast wie eine "normale" Programmiersprache aussieht.
Die Programme, die ich geschrieben habe, verwenden nur die im Originaldokument beschriebenen Funktionen. Sie sollten daher mit dem Original-SNOBOL funktionieren, mit Ausnahme der E / A, die ich im SNOBOL3-Stil ausgeführt habe, damit der Java-Interpreter sie ausführen kann. Aus dem Papier geht hervor, dass der Unterschied darin besteht, dass SNOBOL1 den Mustervergleich mit einer speziellen
SYS
Variablen verwendet, während SNOBOL3 Eingabe- und Ausgabevariablen verwendet:SYS .READ *DATA*
DATA = SYSPPT
SYS .PRINT 'A STRING' AND VARIABLES
SYSPOT = 'A STRING' AND VARIABLES
Wenn Sie diese Ersetzungen vornehmen, erhalten Sie "echtes" SNOBOL 1. Dann können Sie es natürlich nicht ausführen.
Aufgabe 1
Aufgabe 2
Dies zeigt Mathematik, String-Handling und Flusskontrolle. SNOBOL3 hat nützliche Funktionen,
EQ
um die Gleichheit zu überprüfen. Das Original-SNOBOL tat es nicht, also habe ich sie nicht benutzt.Aufgabe 3
Erstens die langweilige. Das Einzige, was zu bemerken ist, ist der Kleiner-als-Check, der genau zeigt, wie stringorientiert SNOBOL wirklich war:
(B - A) '-'
bedeutet "Enthält das Ergebnis von BA ein Minus?". SNOBOL3 kann das auchLE(B,A)
, SNOBOL 1 nicht (zumindest wird es in der Zeitung nicht erwähnt).Natürlich wäre es eine Schande, wenn Sie eine Sprache haben, die sich ausschließlich auf Zeichenfolgen und Musterabgleich stützt, wenn Sie den Musterabgleich und das Ersetzen nicht verwenden würden. Hier ist also eine dieser unary-basierten GCDs, einschließlich Routinen zum Konvertieren von und nach unary.
quelle
2012 - TypeScript
TypeScript ist eine kostenlose Open Source-Programmiersprache, die von Microsoft entwickelt und verwaltet wird.
Hauptziel ist: Jeder Browser. Beliebiger Host. Beliebiges Betriebssystem. Open Source. Es wurde im Oktober 2012 veröffentlicht
Hallo TypeScript
ASCII Art
GCD
Probieren Sie es online aus und senden Sie es per Screencast .
quelle
2011 - Dart
Dart ist eine von Google entwickelte Open Source-Programmiersprache, die als Ersatz für Javascript entwickelt wurde (obwohl sie mit Javascript kompatibel ist). Es wurde von Google im Jahr 2011 während der GOTO-Konferenz vorgestellt.
"Hallo Welt!" Variante:
ASCII Art N:
Die Bruteforce-Methode wird mit 0 (n²) ausgeführt, aber es sollte eigentlich keine Rolle spielen, wenn Sie keine riesige Zahl verwenden.
GCD
einfache Euclid-Methode portiert aus dem Snap! Beispiel oben.
quelle
2010 - Rust
Rust ist eine universell einsetzbare, multiparadigmatische, kompilierte Programmiersprache, die von Mozilla Research entwickelt wurde. Es soll eine "sichere, gleichzeitige, praktische Sprache" sein, die rein funktionale, gleichzeitig handelnde, imperativ-prozedurale und objektorientierte Stile unterstützt. Wikipedia
Aufgabe 1
Task2
Erläuterung:
sorgt dafür, dass nur vertikal (links und rechts
|
) und diagonal (\
) gedruckt wirdAufgabe 3
einfache Implementierung von Euclidean_algorithm
quelle
2015 - Muffin MC
Muffin MC ist eine Turing-vollständige, witzige (aber seriöse), funktionale und minimalistische Makrosprache, die von Franck Porcher ( http://franckys.com ) Mitte Februar 2015 aus der Not heraus als (schnelles) Werkzeug zur Stärkung von a geschrieben wurde Kalkulationstabelle als einziges Controller-Frontend verwendet werden , um alle bestandsbezogenen Vorgänge mit Prestashop-basierter Händler - Website zugeordnet ist, um zu Pilot und Antrieb für eine neue Tahitian Modemarke: Mutiny Tahiti ( http://mutinytahiti.com - bald sein gestartet).
Muffin MC ist ein Akronym für MU winzige F unctional F lexible IN Linie M Acro C ommand Sprache.
Um unseren Anforderungen gerecht zu werden, wurden die Kernfunktionen von Muffin MC auf der Grundlage flexibler und effizienter, erstklassiger semantischer Konstrukte wie Iteratoren , Lazy-Evaluation , Multi-Funktoren und String-Produkt entwickelt .
Muffin MC hat seine Wurzeln in der (pragmatischen) funktionalen Programmierung von FLisp und Perl. Es unterstützt vollständig die Rekursivität (ohne Optimierung), ist dynamisch typisiert und verfügt über einen dynamischen Gültigkeitsbereich (flache Bindung). Es bietet seinen Benutzern nur eine Datenstruktur, abgesehen von den grundlegenden Datentypen Atome (Atome, Strings, Ziffern): Listen!
Muffin MC- Listensemantik (Art) leiht sich auf Power-Set- Semantik, das heißt:
Um sich damit abzustimmen, kann Folgendes helfen:
Wenn Sie also auf ein leeres Listenelement zugreifen, erhalten Sie die leere Liste und keinen Fehler! In der Tat versucht Muffin MC , so wenig Fehler wie möglich zu verursachen, indem die Semantik vieler traditioneller Operationen auf diese Weise erweitert wird.
Aufgabe 1
#(...)
ist der Muffin MC -Makrobefehl zum Anwenden einer Funktion auf eine nicht ausgewertete Argumentliste, hier diesay
von Perl ausgeliehene integrierte Funktion .#(say 1 2 3 ...)
ist funktional identisch mitmap {say $_} (1,2,3,...)
Aufgabe 2
Definieren Sie die Funktion
ascii-art()
:Ascii-art()
kürzeste Arbeitsform (88 Bytes):=(var val...)
ist der Muffin MC- Makrobefehl, mit dem eine Variable definiert oder neu zugewiesen werden kann.$(var)
ist der Muffin MC- Makrobefehl für den Zugriff auf den Wert einer Variablen. Es akzeptiert natürlich die Form$(v1 v2 ...)
, auf viele Variablen gleichzeitig zuzugreifen.=(* var1 val1 var2 val2 ...)
ist die Erweiterung des Muffin MC- Makrobefehls=(...)
für parallele Zuweisungen.Variablen
_1, _2
, ... werden dynamisch in den Gültigkeitsbereich eingeteilt (flacher Bindungsmechanismus) und automatisch so festgelegt, dass sie an die Argumente der Funktion binden. Aus Perl5 entliehene Systemvariablen#
(Anzahl der Argumente) und@
(Liste der Argumente) werden ebenfalls automatisch festgelegt.Funktionen sind einfach Variablen, die an eine beliebige Anzahl von Muffin MC- Anweisungen gebunden sind .
Diese interessante Lösung ergibt sich aus der Kombination von zwei integrierten Funktionen des natürlichen Muffin MC :
Der Muffin MC-
I(...)
Makrobefehl zum Definieren von Cycling-Iteratoren, der später mit der Funktionsform verwendet#(my-iterator want-number-of-values)
wird.Das Muffin MC- String-Produkt- Konstrukt, eine Erweiterung der natürlichen variablen Interpolation, die bei jedem String
"F1 F2 F3..."
, bei dem die F i entweder Muffin MC- String-Literale oder Muffin MC- Makrobefehle (auch als funktionale Formen bezeichnet) sind, so viele Strings wie möglich erzeugt gegeben durch das Produkt Kardinal (F1) x Kardinal (F2) x ....Wenn zum Beispiel xa eine Variable mit 2 Werten ist, sagt a und b, und y eine andere Variable mit 3 Werten, sagt 1 2 3, dann ergibt die Auswertung des Strings
"x=$(x) y=$(y))"
6 verschiedene Werte, und zwar in dieser Reihenfolge:Dies ist eine der begehrenswertesten Funktionen des MUTINY-Projekts, für die Muffin MC entwickelt wurde.
Starte es !
Wie funktioniert es
Unser Algorithmus basiert auf Folgendem:
Bei Aufruf von ascii-art (n) ist {n = 2p + 1 | p integer, p> = 0}, die zu erzeugende Kunst besteht aus n Zeichenfolgen mit n Zeichen, von denen zwei, die am weitesten links und rechts liegen, fest und immer gleich sind: 'N'. Dies ermöglicht es, das Problem bei der Herstellung nur der mittleren Saiten zu verringern. Zum Beispiel würden wir bei n = 5 die folgenden 5 mittleren Zeichenfolgen aus jeweils n-2 Zeichen erzeugen (wir haben das Leerzeichen zur besseren Visualisierung durch ein '_' ersetzt):
Solche mittleren Saiten können leicht hergestellt werden, indem die Sequenz mit 4 Elementen
('_' '_' '_' 'N')
in 5 Gruppen von 3 durchlaufen wird; Bei n, der Eingabe der Funktion, besteht diese Sequenz aus n - 2 Zeichen'_'
, gefolgt von dem Zeichen'N'
. Das Durchlaufen dieser Sequenz erfordert nichts anderes als das Einbetten der Sequenz in einen in Muffin MCI(sequence)
integrierten Iterator (ein Iterator, der für immer durch die ursprüngliche Folge von Werten läuft).Wir erzeugen dann einfach die mittleren Zeichenfolgen mit der Länge n-2, indem wir unseren Iterator bitten, uns die nächsten n-2-Werte (n - 2 Zeichen) mitzuteilen, die miteinander verkettet werden, um die erwartete mittlere Zeichenfolge zu erzeugen.
Die n mittleren Zeichenfolgen werden durch n-maliges Wiederholen des obigen Vorgangs unter Verwendung einer Karte erzeugt, um die n Ergebnisse (n Zeichenfolgen mit n-2 Zeichen) zu sammeln.
Wir verwenden eine andere leistungsstarke Muffin MC Einbau-Konstrukt, nämlich die Zeichenfolge Produkt , die n final Strings zu erzeugen:
"N#(map...)N"
.Und das ist es !
Aufgabe 3
Definieren Sie die Funktion
gcd()
:gcd()
‚s reale kürzeste Form (37 Bytes - 2bytes gewinnen dank Rodolvertice)Starte es !
ergibt 9.
Das ist es.
Vielen Dank für das schöne Spiel und möglicherweise für Ihr Interesse. Die Sprache steht jedem zur Verfügung, der damit spielen, sie verwenden oder sogar erweitern möchte. Fragen Sie einfach danach und ich schicke es Ihnen gerne zu.
Prost
Franck
PS. Die aktuelle Implementierung von Muffin MC ist Perl5. Der Quellcode besteht aus ca. 2000 Zeilen modernen Perl-Codes, einschließlich Kommentaren, und wird mit einer regressionsfreien Testsuite geliefert, die sich hervorragend zum Erlernen von praktischen Muffin- MC- Konstrukten und -Semantiken eignet .
quelle