Also ... äh ... das ist ein bisschen peinlich. Aber wir haben kein einfaches "Hallo, Welt!" Herausforderung noch (trotz 35 Varianten mit hallo-Welt getaggt und zu zählen). Während dies nicht das interessanteste Codegolf in den gängigen Sprachen ist, kann es eine ernsthafte Herausforderung sein, in bestimmten Esolangs die kürzeste Lösung zu finden. Zum Beispiel ist meines Wissens noch nicht bekannt, ob die kürzestmögliche Brainfuck-Lösung gefunden wurde.
Während die gesamte Wikipedia (der Wikipedia-Eintrag wurde gelöscht , es gibt jedoch eine Kopie bei archive.org
), haben esolangs und Rosetta Code Listen mit "Hello, World!" Keines dieser Programme ist daran interessiert, das kürzeste für jede Sprache zu haben (es gibt auch dieses GitHub-Repository ). Wenn wir eine bedeutende Site in der Code-Golf-Community sein wollen, sollten wir versuchen, den ultimativen Katalog der kürzesten "Hallo, Welt!" Programme (ähnlich wie unsere grundlegende Quine-Herausforderung einige der kürzesten bekannten Quines in verschiedenen Sprachen enthält). Also lass uns das machen!
Die Regeln
- Jede Einreichung muss ein vollständiges Programm sein.
- Das Programm muss keine Eingaben
Hello, World!
vornehmen und auf STDOUT (genau dieser Byte-Stream, einschließlich Groß- und Kleinschreibung und Interpunktion) plus optionalem abschließendem Zeilenumbruch und sonst nichts drucken.
- Das Programm darf nichts nach STDERR schreiben.
Wenn jemand dies missbrauchen will, indem er eine Sprache erstellt, in der das leere Programm gedruckt wird Hello, World!
, dann herzlichen Glückwunsch, dann hat er gerade den Weg für eine sehr langweilige Antwort geebnet.
Beachten Sie, dass ein Dolmetscher vorhanden sein muss, damit die Einreichung getestet werden kann. Es ist erlaubt (und sogar empfohlen), diesen Dolmetscher für eine zuvor nicht implementierte Sprache selbst zu schreiben.
- Einsendungen werden in Bytes in einer geeigneten (bereits vorhandenen) Codierung bewertet, normalerweise (aber nicht unbedingt) in UTF-8. Einige Sprachen, wie Ordner , sind etwas schwierig zu bewerten - im Zweifelsfall fragen Sie bitte bei Meta nach .
- Es geht nicht darum, die Sprache mit dem kürzesten "Hallo Welt!" Programm. Hier geht es darum, die kürzeste "Hallo, Welt!" Programm in jeder Sprache. Daher werde ich keine Antwort als "akzeptiert" markieren.
- Wenn Ihre gewählte Sprache eine triviale Variante einer anderen (möglicherweise populäreren) Sprache ist, die bereits eine Antwort enthält (denken Sie an BASIC- oder SQL-Dialekte, Unix-Shells oder triviale Brainfuck-Derivate wie Alphuck), sollten Sie der vorhandenen Antwort eine Anmerkung hinzufügen, die die gleiche oder sehr ähnliche Lösung ist auch die kürzeste in der anderen Sprache.
Nebenbei bemerkt, stimmen Sie langweiligen (aber gültigen) Antworten in Sprachen, in denen es nicht viel zu Golf gibt, nicht ab - diese sind für diese Frage nach wie vor hilfreich, da versucht wird, einen Katalog so vollständig wie möglich zusammenzustellen. Allerdings tun in erster Linie upvote Antworten in Sprachen , in denen die tatsächlich hatten Autoren Mühe in den Code Golf spielen.
Inspiration finden Sie in der Hello World Collection .
Der Katalog
Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:
## [><>](https://esolangs.org/wiki/Fish), 121 bytes
/* Configuration */
var QUESTION_ID = 55422; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 8478; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
else console.log(body);
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
lang = jQuery('<a>'+lang+'</a>').text();
languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body {
text-align: left !important;
display: block !important;
}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 500px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=ffb5d0584c5f">
<div id="language-list">
<h2>Shortest Solution by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
"Hello, World!"
das kürzeste, in vielen verschiedenen und nicht verwandten Sprachen verfügbar ist, sollte es separat veröffentlicht werden?Antworten:
Feststecken, 0 Bytes
Naja, kann nicht kürzer werden ... Ein leeres Programm wird
Hello, World!
in Stuck ausgegeben .quelle
Hello, World!
Ding war nur etwas, das ich als Platzhalter in der frühen Entwicklungsphase eingefügt hatte. Ich hatte nicht die Absicht, es so lange zu belassen, bin einfach nie dazu gekommen, es zu entfernen.PHP, 13 Bytes
Ja. Es klappt.
quelle
<?php
der Code keine enthält, was dazu führt, dass er überhaupt nicht von PHP interpretiert wird :)Brainfuck, 78 Bytes
Unbefristetes Kopfgeld: Wenn jemand diese Punktzahl verbessern kann, werde ich das Kopfgeld (+500) an ihn weitergeben.@KSabhat eine gefunden7672 Byte Lösung!Probieren Sie es online!
Die ersten 28 Bytes
--<-<<+[+[<+>--->->->-<<<]>]
initialisieren das Band mit der folgenden Wiederholungsrelation (Mod 256):f n = 171 · (-f n-1 - f n-2 - f n-3 + 1) mit f 0 = 57 , f 1 = 123 und f 2 = 167 .
Der Faktor 171 ergibt sich aus 3 -1 ≡ 171 (mod 256) . Wenn der aktuelle Wert übersetzt wird,
<+>---
multipliziert eine Zelle (über ), die jedes Mal 3 subtrahiert, den Wert effektiv mit 171.Bei n = 220 ist der zu übersetzende Wert Null und die Iteration stoppt. Die zehn Bytes vor dem Stoppunkt lauten wie folgt:
Dieser enthält alle Komponenten, die für die Produktion
Hello, World!
mit nur geringfügigen Anpassungen im Handumdrehen erforderlich sind .Ich habe auch eine alternative 78-Byte-Lösung gefunden:
Probieren Sie es online!
Ich halte diesen aus mehreren Gründen für besser als den ersten: Er verwendet weniger Zellen, die noch zu Hause sind, ändert insgesamt weniger Zellen und endet schneller.
Mehr Details
Wiederholungsrelationen sind in Brainfuck überraschend knapp dargestellt. Das allgemeine Layout ist das folgende:
welcher ... repräsentiert:
f n = c 1 · f n-1 + c 2 · f n-2 + c 3 · f n-3 + ... + k
mit
f 0 = s 1 , f 1 = s 2 + c 1 · f 0 + k , f 2 = s 3 + c 2 · f 0 + c 1 · f 1 + k usw.
Zusätzlich kann der
<+>
Wert geändert werden, um den Bereich mit einer Konstanten zu multiplizieren, ohne den Stoppunkt zu beeinflussen, und ein Term kann vor dem>{k}
Wert hinzugefügt werden , um den Bereich um eine Konstante zu verschieben, wiederum ohne den Stoppunkt zu beeinflussen.Andere Beispiele
Fibonacci-Folge
N-gonale Zahlen
Dreieckige Zahlen
Definiert als f n = 2 · f n-1 - f n-2 + 1 mit f 0 = 0 , f 1 = 1 .
Quadratzahl
Fünfeckige Zahlen
usw.
BF Crunch
Ich habe den Code veröffentlicht, mit dem ich einige dieser Lösungen auf github gefunden habe . Benötigt .NET 4.0 oder höher.
Die Ausgabe erfolgt in drei Zeilen:
Das Endergebnis für
bfcrunch "hello world" 70 -r -i23
lautet beispielsweise:Dies entspricht dem vollen Programm:
Andere Aufzeichnungen
Hallo Welt!
Umbruch, 78 Bytes :
oder
Nicht umlaufend , 87 Bytes (vorher 92 Bytes (Mitchs) ):
Hallo Welt!
Umbruch, 80 Bytes :
Nicht umhüllend, 81 Bytes (vorher 92 Bytes (Hirose) ):
Hallo Welt!
Umbruch, 74 Bytes :
Nicht umhüllend, 84 Bytes :
Esolangs Version
Hallo Welt! \ N
Umbruch, 76 Bytes :
Dies verwendet eine Zelle, die noch zu Hause ist, und würde daher als 77 betrachtet werden.
Nicht umhüllend, 83 Bytes :
Rdebath genehmigt . Profilebf-Ausgabe:
inversed.ru (Peter Karpov)
Hallo Welt!
Umbruch, 70 Bytes (vorher 78 1 ):
Nicht umlaufend, 77 Bytes (vorher 89?):
Der Autor behauptet, dass die kürzeste handcodierte "Hallo Welt!" ist 89 Bytes, bietet aber keine Referenz. Hiermit beanspruche ich auch den Rekord.
Hallo Welt!
Umbruch, 65 Bytes (vorher 66 Bytes):
Dies ist tatsächlich auch handcodiert (das Beste, was ich durch Knirschen finden konnte, sind 68 Bytes ). Die erste Zelle wird auf 259 (3) initialisiert und bei jeder Iteration um 7 dekrementiert, wobei eine 37-fache Schleife durchgeführt wird. Die nächste Zelle wird um 6 dekrementiert, was zu 256 - 6 · 37 = 34 führt . Die restlichen Zellen werden jedes Mal um 4 dekrementiert, wobei jede Iteration eine Zelle hinzufügt und jede neue Zelle auf 252 (-4) initialisiert wird. Das Ergebnis ist das Folgende:
1 Die angegebene Lösung (79 Bytes) kann trivial um eins reduziert werden:
quelle
interface a{static void main(String[]A){System.out.print("No!");}}
ArnoldC , 71 Bytes
Nur für lols ..
quelle
IT'S SHOWTIME
undTALK TO THE HAND
sollte in der ersten und letzten Zeile sein.Seed ,
601642344203 BytesDas resultierende Befunge-98-Programm (basierend auf diesem ) ist
quelle
Mornington Crescent ,
36143568 BytesDank an NieDzejkob für die Einsparung von 46 Bytes durch Verwendung kürzerer Zeilennamen.
Probieren Sie es online!
Dies ist sicherlich nicht optimal, aber es ist halb so groß wie die Lösung für Esolangs.
Hello, World
wird erstellt, indem die folgenden Stationsnamen aufgeschnitten und die Ergebnisse verkettet werden:Schließlich berechne ich den Zeichencode von
!
as(2<<4)+1 == 33
. Alle diese Teile werden in Paddington verkettet und schließlich in Mornington Crescent gedruckt.Hinweis: Die Sprache gibt nicht an, ob es möglich ist, zweimal hintereinander zum gleichen Bahnhof zu fahren, aber der Dolmetscher lässt dies zu, sodass ich davon Gebrauch gemacht habe.
quelle
böse , 70 Bytes
Es werden die folgenden vier Befehle verwendet:
quelle
Brainfuck, 72 Bytes
Probieren Sie es online!
Und die ursprüngliche nicht umhüllende 76-Byte- Lösung:
Probieren Sie es online!
Andere kürzeste bekannte (meines Wissens) Lösungen, die ich gefunden habe
'Hallo Welt!' 77 Bytes:
Probieren Sie es online!
'Hallo Welt!' 70 Bytes:
Probieren Sie es online!
Diese wurden mit einem C ++ - Programm gefunden, das ich hier geschrieben habe: https://github.com/ksabry/bfbrute
Hinweis: Ich wollte diesen Code ursprünglich bereinigen, bevor ich ihn veröffentlichte, damit er tatsächlich einigermaßen lesbar und verwendbar ist. Da ich mich jedoch seit über einem Jahr nicht darum gekümmert habe, werde ich ihn einfach so veröffentlichen, wie er ist. Es nutzt Vorlagen und Kompilierzeitkonstanten stark für mögliche Optimierungen und es enthält eine Reihe von auskommentiertem Code aus meinen Tests, aber keine hilfreichen Kommentare. Tut mir leid, aber es ist ein bisschen schrecklich.
Der Code hat nichts Schreckliches an sich, er ist im Kern ein Brute Forcer, aber er ist ziemlich optimiert. Die Hauptoptimierung besteht darin, dass zuerst alle Programme ohne Schleifen (no
[
oder]
) bis zu einer festgelegten Länge (derzeit 16) durchlaufen werden und ein Array aller Änderungen zwischengespeichert wird, die am Datenarray vorgenommen werden. Es wird nur ein einziges Programm pro eindeutigem Array von Änderungen gespeichert, also beispielsweise nur eines von>+<<->
und<->>+<
. Es durchläuft dann alle möglichen Programme, die aus einem beliebigen Programm in diesem Cache bestehen, mit einer beliebigen Kombination von Schleifen zwischen diesen. Nach dem Ausführen jedes Programms macht es eine einfache gierige Suche und sucht nach den Zeichen und hängt diese an das Ende des Programms an.Nachdem ich dies durch den Raum aller Programme gelaufen war, bemerkte ich, dass fast alle kürzesten Programme (bis zu einer Länge von ~ 19) von der Form waren
*[*[*]*]
. Die Einschränkung der Suche auf Programme dieses Formats hat die Suche erheblich beschleunigt. Der aktuelle Rekordhalter wurde bei Länge 27 gefunden. Dieser wurde tatsächlich mit Länge 74 berechnet, aber ich bemerkte eine bestimmte Sequenz,.>.>.>.
die das Glück hatte, eine 0 in der Datenzelle zu haben, damit sie vereinfacht[.>]<
und heruntergefahren werden konnte bis 72.Ich habe es eine Weile laufen lassen und die Suche mit den aktuellen Parametern bis zur Länge 29 abgeschlossen. Ich vermute, dass es schwierig sein wird, die aktuelle zu übertreffen, wenn man einfach höher geht. Ich denke, der vielversprechendste Ansatz wäre wahrscheinlich, den Suchraum in zu vergrößern eine intelligente Art und Weise.
quelle
Piet, 90 Codels
Dies ist ein 30 mal 3 Bild. Alternativ bei Codelgröße 10:
Das verwendet ein 3-Hoch-Layout, so dass ich nur einmal auf etwas zeigen muss. Wenn das noch golffähig ist, könnte ich wahrscheinlich höchstens eine andere Kolumne rasieren, da dort ein Push-Pop-No-Op drin ist.
Edit: @primos 84 Codelösung .
quelle
Heuhaufen , 17 Bytes
Haystack ist eine 2D-Programmiersprache, die ausgeführt wird, bis die Nadel im Heuhaufen gefunden ist
|
, während stapelbasierte Operationen ausgeführt werden. Alle Programme beginnen in der oberen linken Ecke und können mithilfe der Richtungszeichen><^v
im Programm navigieren. Die Richtung wird vererbt, sodass Sie nicht weiter verwenden müssen, um>
nach rechts zu gehen. Die Richtung ändert sich nur, wenn ein anderes Richtungszeichen getroffen wird.Standardmäßig liest der Interpreter von links oben nach rechts oben, also können wir einfach "Hallo Welt!" Auf den Stapel
o
legen , zum Drucken verwenden und die Nadel platzieren, um die Ausführung zu beenden.Bonus: Eine aufregendere Version:
quelle
o
Ausgabe als Zahl. Sollte es nichtc
am Ende sein? Gibt es irgendwo eine ordnungsgemäße Dokumentation? Das ist super interessant!o
gibt das oberste Stapelelement so aus, wie es ist, dh wenn eine Zahl vorhanden ist, wird diese gedruckt.c
würde das einfach auf einen char werfen. Wenn Sie also eine Zeichenfolge oder ein Zeichen oben auf dem Stapel haben, isto
dies genau das, was Sie wollen. Schließlich werden diese Dokumente aktualisiert.Hilfe, WarDoq! 1 Byte
Nicht nur , dass Hilfe, WarDoq! Mit der für die meisten gängigen Schreibweisen des Ausdrucks integrierten Funktion wird sogar unsere übliche Definition der Programmiersprache erfüllt.
Probieren Sie es im offiziellen Online-Dolmetscher aus (Code geht in die Eingabe ).
quelle
"Space: Begin a comment. The next non-space character ends the comment and is interpreted as usual."
Also kann man dann nur Kommentare aus Leerzeichen machen ??? Ich nehme an, selbst die nützlichste Sprache der Welt muss ein ungewöhnliches Feature haben +1,MarioLANG ,
259249242240235 BytesDies wurde in der Ruby-Implementierung getestet .
Nach der Verschleierung "Hallo, Welt!" in MarioLANG habe ich mich ein bisschen mit dem Golfen beschäftigt. Das obige ist das kürzeste, das ich bisher gefunden habe.
Wie zuvor bin ich von einer Brainfuck-Lösung ausgegangen, bei der vier Zellen auf das nächste Vielfache von 10 für die Zeichen
He,
und das Leerzeichen gesetzt und in MarioLANG konvertiert wurden . Sie können den Code dann ein wenig verkürzen, indem Sie den Zusatzboden in der Schleife verwenden, der die Breite der Schleife fast halbiert. Beachten Sie, dass der untere Teil nur einmal weniger ausgeführt wird als der obere Teil, sodass Sie nicht mehr in allen 4 Zellen exakte Vielfache des anfänglichen Zählers erhalten.Schließlich wollte ich den verschwendeten Raum vor der Schleife nutzen, also fügte ich eine Reihe von Aufzügen hinzu, um den vertikalen Raum dort zu nutzen. Und dann wurde mir klar, dass ich den Code nach der Schleife (siehe vorherige Überarbeitung) unterhalb der Schleife falten konnte , um etwas mehr vertikalen Platz zu nutzen, wodurch fünf weitere Bytes gespart wurden.
Dies ist wahrscheinlich noch lange nicht perfekt, aber es ist eine anständige Verbesserung gegenüber der naiven Lösung, denke ich.
Metagolf
Zeit für etwas Automatisierung ...
Ich habe begonnen, einen Solver in Mathematica einzurichten, um eine optimale Lösung zu finden. Derzeit wird davon ausgegangen, dass die Struktur des Codes fest ist: Zähler auf 12 gesetzt, 4 Zellen zum Drucken, mit der festen Zuordnung zu
He,<space>
und derselben Reihenfolge dieser Zellen. Was variiert ist die Anzahl der+
s in der Schleife sowie die notwendigen Korrekturen danach:Es stellt sich heraus, dass für einen ersten Zähler von 12 meine handgefertigte Lösung bereits optimal ist. Die Verwendung von 11 spart jedoch zwei Bytes. Ich habe alle Zählerwerte von 6 bis 20 (einschließlich) mit den folgenden Ergebnissen ausprobiert:
Hinweis: Bei diesem Solver wird davon ausgegangen, dass sich der lineare Code nach der Schleife in der obersten Zeile befindet und der obige Code die zusammengefaltete Lösung ist. Es könnte eine kürzere Gesamtlösung geben, indem der Löser auf die Faltung aufmerksam gemacht wird, da ich jetzt 3 weitere
+
s im ersten Teil kostenlos bekomme und die nächsten 4 Anweisungen nur 1 Byte statt 2 kosten würden.quelle
Dunkel , 106 Bytes
Ich werde nur einige Zitate aus der Sprachspezifikation für die Brillanz dieses Esolangs sprechen lassen:
quelle
Chef , 465 Bytes
Getestet mit dem Ruby-Interpreter. Macht Buchstabensuppe.
Ich habe versucht, so weit wie möglich mit der ursprünglichen Spezifikation übereinzustimmen. Obwohl Sie mit dem von mir verwendeten Interpreter das
the
s in derPour contents
Anweisung löschen können, habe ich dies nicht getan.Die Rührschüssel ist ziemlich teuer, es könnte also einen besseren Ansatz geben. Ich habe versucht, die Nachricht mit der Basiskonvertierung zu codieren, aber leider wird in der Spezifikation nicht klargestellt, ob
Divide
eine Ganzzahl- oder eine Gleitkommadivision verwendet wird, und der von mir verwendete Interpreter verwendet die letztere. Es gibt auch keinen Modulo-Operator, der auch nicht hilft.quelle
Homespring , 58 Bytes
Der nachgestellte Abstand ist erheblich.
Lass mich dir eine Geschichte erzählen. Es gab einmal ein Kraftwerk, das eine nahe gelegene Lachsbrüterei mit Strom versorgte. In der Lachsbrüterei schlüpfte ein junger obdachloser Lachs, der flussaufwärts unterwegs war, um eine Quelle zu finden. Es hat eine solche Quelle gefunden, mit dem poetischen Namen "Hallo Welt!", Wo es gereift ist und einen neuen jungen Lachs hervorgebracht hat. Beide Fische schwammen jetzt stromabwärts auf der Suche nach dem weiten Ozean. Doch kurz vor der Flussmündung befand sich ein Netz im Fluss - der reife Fisch wurde gefangen und nur der junge gelang es, durch den Ozean und den Rest des Universums zu schlüpfen. In der Zwischenzeit hatte die Brüterei mehr Lachse geschlüpft, die ebenfalls flussaufwärts gereist waren und aufgetaucht waren und so weiter und so fort.
Riesige Mengen schmelzenden Schnees waren jedoch über einen anderen Flussarm gefahren. Und gleich nach unserem ersten jungen Lachs aus den Quellen von "Hello, World!" hat den Ozean erreicht, die Schneeschmelze hat das Universum getroffen und ... äh ... es zerstört. Und sie lebten glücklich bis ans Ende ihrer Tage ... oder ich denke, sie haben es nicht getan.
Das war eigentlich die Semantik des obigen Programms. Homespring ist komisch.
quelle
Piet, 84 Codels
28x3, hier mit Codelbreite 10 dargestellt.
Erstellt mit PietDev , getestet mit npiet . Das Layout des Programms ist wie folgt:
Gelbe Füllung kennzeichnet Codels, bei denen sich der Pfad überlappt, orange Füllung kennzeichnet Codels, die zum Zwecke des Kontrollflusses dieselbe Farbe haben müssen.
Um dies zu unterstützen, habe ich einen rudimentären Interpreter für eine stapelbasierte Sprache mit piet-ähnlichen Befehlen geschrieben, den ich "pasm" ( Quelle ) getauft habe . Die Ausgabe dieses Interpreters (mit dieser Eingabe ) lautet wie folgt:
Es werden keine Zeiger-, Schalter- oder Rollbefehle verwendet. Es werden auch keine Codels verschwendet. Tatsächlich werden zwei wiederverwendet.
quelle
Whitespace ,
192150146 BytesLeerzeichen benötigen nur Leerzeichen, Tabulatoren und Zeilenumbrüche, während andere Zeichen ignoriert werden.
Was schwierig sein kann, hier anzuzeigen.
Daher wurden im Code unten die Leerzeichen und Tabulatoren ersetzt.
Und ein ';' wurde der Übersichtlichkeit halber vor die Zeilenvorschübe gestellt.
Ersetzen Sie zuerst, um den Code auszuführen. und> durch Leerzeichen und Tabulatoren.
Hexdump des Codes
Whitespace-Assemblycode:
Bemerkungen:
Ich musste ein Programm schreiben, um zu berechnen, dass das Hinzufügen von 107 das optimale Golf für den Satz ergibt. Da sich die Bytesize ändert, die eine Ganzzahl im Code aufnimmt. : 4 + int (abs (log2 ($ n)))
Der Code wird weiterhin ohne das Label "e:" und den Exit-Teil auf whitespace.kauaveel.ee ausgeführt . Dies könnte jedoch dazu führen, dass der Whitespace-Code auf anderen Whitespace-Compilern ungültig wird. Diese Bytes wurden also nicht aus der Lösung entfernt.
Es ist darauf hinzuweisen, dass
Wie Kevin Cruijssen in den Kommentaren betonte, kann der Whitespace durch Erlauben eines "Exit by Error" gemäß Meta mit mehr als 126 Zeichen golfcodiert werden .
Versammlung:
quelle
SSN
(Fehlerwert) anstelle vonSSSN
(0 drücken ), was laut Meta erlaubt ist . Probieren Sie es online aus (mit zusätzlichen Hervorhebungen und Erklärungen) , oder probieren Sie es online aus .dup jumpz e
und dere: exit
entfernten. Aber zumindest auf whitespace.kauaveel.ee wiederholt sich die Schleife, bis sich der Browser beschwert. Ich möchte meine Version lieber nicht ändern, obwohl der untere Bereich des Golfs und das Meta "Exit by Error" zulassen. Es steht Ihnen jedoch frei, Ihre Version als neue Antwort einzureichen.SSN
am Anfang entferne. In diesem Fall tritt ein Fehler mit Can't do Infix Plus auf, wenn es nur ein einzelnes Element auf dem Stapel hat (das 107). ( Probieren Sie es online aus. ) Ich werde hier nur meinen Kommentar hinterlassen, wenn jemand den gleichen Vorschlag hat. Und ich habe Ihre Antwort bereits vor ungefähr einem Jahr +1 gegeben, denke ich. ;)Java, 79
In früheren Versionen von Java können Sie möglicherweise einen statischen Block (51 Byte) verwenden, aber ich kenne derzeit keine Möglichkeit, die
main
Methode zu umgehen .quelle
enum
anstelle vonclass
.interface
undpublic
nicht mehr verwendet wird. Ich habe die Richtlinie zum Bearbeiten der folgenden Elemente abgelehnt, aber da sie keinen Kommentar abgeben können, möchte ich Sie informieren, damit Sie sie verwenden können, wenn Sie möchten.CSS, 30 Bytes
Cascading Style Sheets (CSS) ist keine typische Programmiersprache, kann aber ziemlich gut feste Ausgaben machen. Dies wird durch die Schaffung eines getan Pseudoelement nach jedem Element mit dem Inhalt
Hello, World!
. Wenn also nur ein Element (<html>
) ausgewählt ist, wird davon ausgegangen, dass wir das grundlegendste HTML-Dokument verwenden, d. HDies funktioniert in den meisten gängigen Browsern, mit Ausnahme von Firefox, das den Selektor auf die Elemente
<html>
und anwendet<body>
. Dies ist auch der Grund, warum Stapel-Snippets nicht funktionieren, da immer ein Körperelement mitgestaltet wird. Unten ist eine leicht modifizierte Version zum Testen.quelle
* *
um auszuwählenbody
.* :after
auch immer schien es zu funktionieren.HTML, 13 Bytes
Der Text wird automatisch in das eingefügt
<body>
und angezeigt.quelle
x86_64-Maschinencode für Linux, 32 Byte
Wenn Linux einen neuen Prozess startet, sind alle Register (mit Ausnahme von RSP) Null, sodass wir RAX = 1 erhalten können, indem wir nur das niedrige Byte ändern. Das x86-64 System V ABI garantiert dies nicht, aber es ist das, was Linux tatsächlich tut. Dieser Code funktioniert nur wie
_start
in einer statischen ausführbaren Datei.Der Aufrufbefehl schiebt die nächste Adresse, die den Hallo-Welt-String enthält, auf den Stapel. Wir geben die Adresse des Strings ein
rsi
.Dann werden die anderen Argumente für a
syscall
bis eingerichtetsys_write
, wodurch die Zeichenfolge gedruckt wird.Das Programm endet mit einem
syscall
bissys_exit
.sys_write
Gibt die Anzahl der geschriebenen Bytes zurück, sodass die oberen Bytes von RAX nach dem ersten null sindsyscall
(es sei denn, es wurde ein Fehler zurückgegeben).mov al, 60
Geben Sie also RAX =__NR_exit
in nur 2 Bytes an.Sie können dieses Programm zum Segfault machen, indem Sie stdout (
./a.out >&-
) schließen. Es wird alsosys_write()
zurückgegeben-EBADF
, das zweitesyscall
wird zurückgegeben-ENOSYS
, und die Ausführung wird am Ende unterbrochen . Aber wir müssenwrite()
Fehler nicht mit Sorgfalt behandeln.quelle
__NR_write
1 gilt. Dies ist auf verschiedenen x86-64-Unix-Systemen kein Standard. Sie sind auch in Abhängigkeit von dem Linux - Verhalten alle Register außer RSP vor dem Eintritt in einen neuen Prozess Nullstellung (so funktioniert dies nur , wenn Sie es als eine statische ausführbare bauen, sonst wird der dynamische Linker Müll in den oberen Bytes verlassen wirdrax
und Sie‘ werde bekommen-ENOSYS
). Das x86-64 System V ABI besagt, dass Register bei der Eingabe beliebige Garbage-Werte enthalten können_start
, der Linux-Kernel selbst wählt Null, um Informationslecks zu vermeiden.mov al, 1
/mov edi, eax
(2 Bytes) speichern , anstatt ein REX-Präfix für DIL zu benötigen, weil__NR_write == STDOUT_FILENO = 1
mov esi, msg
(NASM) akamov esi, OFFSET msg
(GAS.intel_syntax
) verwenden . Lege deine Saite nach der letztensyscall
.call/pop
ist 1 Byte kürzer als der 64-Bit-RIP-relative LEA, aber am besten ist mov.Hexagony ,
3732 BytesProbieren Sie es online!
Ich bin stolz darauf, meine zweite 2D-Programmiersprache und meines Wissens die erste 2D-Sprache auf einem hexagonalen Raster präsentieren zu können.
Der Quellcode sieht nicht sehr 2D aus, oder? Nun, Leerzeichen sind in Hexagony optional. Zunächst wird der Quellcode mit no-ops ( ) zur nächsten zentrierten hexagonalen Zahl aufgefüllt
.
. Die nächste solche Zahl ist 37, also fügen wir am Ende fünf No-Ops ein. Dann wird der Quellcode in ein reguläres Sechseck umgewandelt:Dies ist auch lauffähig. Probieren Sie es online!
Hexagony verfügt über eine Reihe von interessanten Funktionen, darunter 6 verschiedene Befehlszeiger und ein Speicherlayout, bei dem es sich um das Liniendiagramm eines hexagonalen Gitters handelt. Dieser Code verwendet jedoch nur eine IP-Adresse und eine Speicherkante.
Hier eine Übersicht über die relevanten Befehle:
;
Gibt den aktuellen Wert (Modulo 256) als Byte an STDOUT aus./
ist ein Spiegel, der sich so verhält, wie Sie es erwarten würden (wodurch die IP um 120 Grad gedreht wird).@
Beendet das Programm.Der letzte Haken ist, dass die Quelle alle drei Kantenpaare umschließt. Wenn die IP das Raster durch eine der sechs Ecken verlässt, gibt es außerdem zwei mögliche Zeilen, zu denen gesprungen werden kann. Welche ausgewählt wird, hängt davon ab, ob der aktuelle Wert positiv oder nicht positiv ist. Die folgende kommentierte Version zeigt, wo die IP-Adresse bei jedem Verlassen des Rasters erneut eingegeben wird:
Wenn wir also alle Richtungsänderungen entfernen, läuft dieses Programm auf den folgenden linearen Code hinaus:
Was ist mit
Q2
,P0
undP1
? Buchstaben lassen sich leicht drucken, da wir die Kante einfach auf den entsprechenden Wert einstellen können. Für das Komma, das Leerzeichen und das Ausrufezeichen funktioniert das nicht. Wir können auch nicht gesetzt nur ihren Wert mit44
,32
,33
bzw. weil die Speicherkante nicht Null ist , mit zu beginnen, und aufgrund der Semantik der einzelnen Ziffern , die alle möglichen verheerenden Schaden anrichten würde. Wenn wir das tun wollten, würden wir den Rand Wert auf Null mit so etwas wie zurückgesetzt haben*
,+
,-
,&
oder^
zuerst. Da der Wert jedoch vor dem Ausdruck modulo 256 genommen wird, müssen die Werte nicht exakt auf 44, 32 oder 33 eingestellt werden. BeispielsweiseQ2
wird der Kantenwert auf gesetzt81*10 + 2 = 812
, d. H44
wenn Sie modulo genommen werden256
. Auf diese Weise können wir für jedes dieser drei Zeichen ein Byte speichern. (Leider ist es nie möglich , dass es aus dem Wert mit einer einzelnen Ziffer erhalten die Zelle bereits hat. Komisch, wo es nicht Arbeit ist dieo
inWorld
, denn das kann auch angefordert werdenW9
.)Mit diesem CJam-Skript können Sie alle Buchstaben-Ziffern-Kombinationen suchen, die zu einem bestimmten Zeichen führen.
Ich bin mir nicht sicher, ob das optimal ist. Ich bezweifle, dass dies in einem Sechseck der Seitenlänge 3 möglich ist (wo nur 19 Zeichen verfügbar sind), aber es ist möglicherweise möglich, es in einem Sechseck der Seitenlänge 4 mit weniger als 32 Befehlen, z dass es am Ende des Gitters mehr No-Ops gibt.
quelle
Q2
,P0
undP1
ist sehr klug. Ich kannte den Modulo-256-Teil nicht.M8;
(oderg4;
) gedruckt werden könnten , was ich seitdem ein paar Mal verwendet habe. Es ist mir bis jetzt noch nie in den Sinn gekommen, diese Antwort noch einmal zu wiederholen, nachdem ich diese Änderung vorgenommen habe.H;e;P;2Q/d;l;r/l;$@;o];o;W;03&;
Malbolge, 112 Bytes
Ich werde sehen, ob es eine kürzere gibt. Ich habe seit dem letzten Mal einen besseren Computer, damit ich einiges schneller generieren kann.
Für die Show, hier ist "Hallo Welt!" ohne Komma.
quelle
('<;_#"~6Z|{y1UTvt,PrpMo,llj"Fgge{A??P=^t:8&7YtFVqjSQ@PNM)u(I8%$#"D2AA/[TYXQu88MLp3n1Gk.D-ge
(92 bytes)Fourier , 15 Bytes
GROSSE ÄNDERUNGEN zu Fourier!
Probieren Sie es auf FourIDE!
Ja, die Tage der Eingabe des ASCII - Codes der einzelnen Zeichen aus sind für immer verschwunden: Fourier jetzt Art unterstützt Saiten. Wenn Sie einen String in Backticks einschließen, wird dieser String ausgegeben.
Beachten Sie, dass Sie nichts anderes tun können, als diese Zeichenfolge auszugeben: Sie können sie nicht in einer Variablen speichern, sie wird nicht im Akkumulator gespeichert, und es gibt keine Zeichenfolgenmanipulationswerkzeuge.
Hier finden Sie das Zugunglück des alten Fourier. ;)
Probieren Sie es online!
Nun, einige von Ihnen werden Fourier wahrscheinlich schon einmal getroffen haben und mit der Sprache ziemlich vertraut sein. Die gesamte Sprache basiert auf einem Akkumulator: einer globalen Variablen, die so gut wie alle Operatoren verwenden.
Der wichtigste Teil des Codes ist der
a
Operator. Dies nimmt den numerischen Wert des Akkumulators und wandelt ihn unter Verwendung des Python-Codes in ein Zeichen umchr(accumulator)
. Dies wird dann auf STDOUT gedruckt.Leider hatte ich noch keine Gelegenheit, Fourier ( Nudge Nudge , Wink Wink ) zu verwenden, hauptsächlich wegen des Fehlens von Strings und String-Operatoren. Trotzdem kann es für viele andere Herausforderungen verwendet werden (siehe den Abschnitt mit Beispielen auf der EsoLangs-Seite).
Beachten Sie, dass dies kürzer ist als mein Eintrag in die Esolangs-Liste, da ich nicht wirklich dachte, dass ich mehr Golf spielen könnte. Und als ich dann die Fourier-Saiten-Golf-Challenge schrieb, wurde mir klar, dass ich einiges kürzer gehen könnte.
Hinweis
Wenn Sie sich über die Variablensyntax wunderten, schrieb Geobits ein Programm, das Variablen verwendet und dieselbe Länge hat:
Probieren Sie es online!
quelle
C - 155 Bytes
Leider wird der einzige bekannte C-- Compiler, Quick C--, nicht mehr gepflegt. Es ist ein Schmerz im Nacken zu bauen, aber es ist möglich ...
quelle
C 30 Bytes
Ziemlich Vanille, aber ich kann mir keinen allgemein kompilierbaren Weg vorstellen, es kürzer zu machen (es sei denn, vielleicht könnte ein roher asm-Trick funktionieren?). Trotzdem schlägt die meisten Esolangs!
quelle
main(){puts("Hello, World!");return 0;}
bzw. 53#include <stdio.h> int main(){puts("Hello, World!");}
Bytes. Etwas mehr, wenn Sie denken, dass main (void) erforderlich ist.main(){return!puts("Hello, World!");}
sind zwei Bytes kürzer.h
ist 29 Bytes kürzer. Hinweis: Sie müssen es kompilieren, indem-Dh='main(){puts("Hello, World!");}'
ich mich halb mit Trolling, halb mit Compiler-Missbrauch amüsiere.__FILE__
(8 Byte) enthalten und die Datei benennenmain(){puts("Hello, World!");}
. Dann schummelt es total nicht;)Nicht lesbar ,
843755732666645629577 BytesNicht lesbare Programme sollen mit einer Schriftart variabler Breite angezeigt werden, sodass sie den Namen der Sprache berücksichtigen. Ich bin ein wenig enttäuscht, dass sich herausgestellt hat, dass meine ausgefeilteren Ansätze viel länger sind. Loops sind unglaublich teuer in Unreadable ...
Probieren Sie es online!
Wie es funktioniert
Unlesbar hat nur zehn Funktionen; Sechs davon werden in diesem Code verwendet:
Nach der Verwendung meiner Einzelzeichen-Notation und dem Hinzufügen von Leerzeichen und Kommentaren sieht der obige Code wie folgt aus. Mehrzeilige Anweisungen werden von unten nach oben ausgeführt.
Ich habe den eigentlichen Quellcode generiert, indem ich die unkommentierte Version des obigen Pseudocodes über dieses CJam-Programm ausgeführt habe .
quelle
Befunge 98 ,
1918 BytesNeue Antwort (von undergroundmonorail)
Erläuterung
"
Startet den String-ModusHello, World!@,kc
"
wieder auf und beendet den String-Modusc
)k
Nimmt den obersten Wert von stack und führt den nächsten Befehl aus, den der Befehlszeiger so oft sehen kann,
holt einen Wert aus dem Stack und gibt ihn als Zeichen aus. Es wurde 12 Mal durch die letztek
Anweisung ausgeführt und ein weiteres Mal, wenn der Interpreter die,
Anweisung tatsächlich liest@
beendet das ProgrammDer Unterschied zur alten Antwort besteht darin, dass wir das
"
Zeichen geschickt wiederverwenden , indem wir Befunges Schleifenverhalten verwenden, wenn es das Zeilenende erreicht. Da es vielleicht weniger intuitiv ist, lasse ich auch das alte. Möglicherweise haben Sie auch bemerkt, dass der Stapelck,@
aufgrund dieses netten Tricks noch einige Zeichen ( ) enthält , was zu Verwirrung führt, wenn wir danach jemals etwas tun wollten.Alte Antwort
Dies funktioniert für Funge und Befunge 98
Erläuterung
""
wird auf den Stapel geschoben. ('H'
ist jetzt oben.)c
(12) wird auf den Stapel geschobenk
Nimmt den obersten Wert von stack und führt den nächsten Befehl aus, den der Befehlszeiger so oft sehen kann.,
holt einen Wert aus dem Stack und gibt ihn als Zeichen aus. Es wurde 12 Mal durch die letztek
Anweisung ausgeführt und ein weiteres Mal, wenn der Interpreter die,
Anweisung tatsächlich liest@
beendet das Programmquelle
k
c
für verwenden93+
."ck,@!dlroW ,olleH
"
, um die Zeichenfolge zu starten, fügt den gesamten Rest der Zeile zu dieser Zeichenfolge hinzu, umläuft die Zeichenfolge und drückt dieselbe Taste, um"
die Zeichenfolge zu beenden. Jetzt wurde das gesamte Programm mit Ausnahme des Programms"
mit!dlroW ,olleH
oben auf den Stapel geschoben . Dann werden die Top-12-Zeichen genauso gedruckt wie bei Ihnen und es wird bei angehalten@
.JSFuck ,
629362896277 BytesDies wird möglicherweise als eines der längsten "kürzesten Hello, World! -Programme" erwähnt (eigentlich weiß ich nicht, ob dies optimal ist, aber es ist das kürzeste, das ich bekommen habe).
Achtung: Funktioniert nur in Firefox und Safari
Es gibt auch eine etwas längere Version (+4 Byte), die auch in Chrome und Microsoft Edge funktioniert:
Code-Snippet anzeigen
Für diejenigen, die mit JSFuck nicht vertraut sind, geht es darum, JavaScript so zu schreiben, als gäbe es nur sechs Zeichen, und es kann manchmal ziemlich verrückt werden.
Diese Tabelle zeigt, wie die in Hello, World! Programm sind in JSFuck codiert. Der Klartextcode ist einfach
alert("Hello, World!")
.Hier die Saiten
"fill"
,"fontcolor"
usw. müssen geschrieben werden"f"+"i"+"l"+"l"
,"f"+"o"+"n"+"t"+"c"+"o"+"l"+"o"+"r"
zu codieren.Die globalen Bezeichner
self
,atob
wiebtoa
folgt geschriebenFunction("return self")()
.Function
selbst sollte sein[]["fill"]["constructor"]
.Das Komma
","
ist schwierig, ich bin nicht 100% sicher, wie es funktioniert, aber es verwendet die[]["concat"]
Funktion, um ein Array zu erstellen. Ich werde ein Update veröffentlichen, wenn ich Zeit habe, weitere Tests durchzuführen.Ich habe dies mit JScrewIt - Credits für GOTO 0 kodiert , um ein so ausgeklügeltes Tool zu erstellen:
alert("Hello, World!")
Dies unterscheidet sich von meiner Antwort auf diese Frage für das Vorhandensein des Kommas nach "Hallo".
Interessanterweise ist die ES6-Syntax
Die Codierung nimmt noch mehr Bytes in Anspruch (etwa +1500), da die Codierung von zwei Backticks und nicht von
("
und komplexer ist")
.quelle
Pada ,
83-68BytesIch glaube, dies ist optimal für ein lineares Programm (dh eines, das die Kontrollflussoperatoren
?
und nicht verwendet)*
). Es mag insgesamt optimal sein, aber ich weiß nicht, wie ich diese zusätzlichen Operatoren in einer so kleinen Menge Code verwenden soll (oder wie ich die Möglichkeiten programmgesteuert ausloten soll).Die Sprache hat kürzlich einige Änderungen erfahren, nachdem ich mit dem Autor per E-Mail darüber gesprochen habe. Allerdings habe ich eine Referenzimplementierung geschrieben für den aktuellen Zustand der Sprache spec letzte Woche, so dass der obige Code tatsächlich runnable ist.
Metagolf
Ursprünglich hatte ich die Ausgabe meiner Referenzimplementierung für diese Herausforderung verwendet und daraus eine handgefertigte Lösung erstellt. Dies war jedoch nur ein heuristischer Ansatz.
Stattdessen habe ich einen Solver in Mathematica geschrieben, der die Pada-Datenstrukturen und -Operatoren kennt, um eine optimale Lösung zu finden. Im Durchschnitt wächst es linear mit der Länge der Zeichenfolge (obwohl einige Zeichenkombinationen etwas langsamer sind als andere) und dauerte etwa 1,5 Stunden
Hello, World!
.Wie habe ich den Solver geschrieben? Zunächst stellen wir fest, dass wir nur 6 Operatoren berücksichtigen müssen:
~.oOqQ
(zuzüglich derw
für jedes der gedruckten Zeichen erforderlichen ). Das Verwenden der Stapel oder der Bit-Sperren ist im linearen Code nicht nützlich, und ich glaube nicht, dass?
und*
effektiv in weniger als 68 Bytes verwendet werden kann.Padas Status (ohne Berücksichtigung der Stapel und Sperren) besteht aus 7 Schaltern und 8 Bits, die wie folgt angeordnet sind:
So das ist
215 = 32768
mögliche Zustände. Mein erster Vorverarbeitungsschritt war die Erstellung eines gerichteten Zustandsgraphen, bei dem jede Kante einer einzelnen Operation entspricht. Das heißt, der Graph hat 32768 Scheitelpunkte mit jeweils 6 Out-Graden (eine Out-Flanke für jede der 6 betrachteten Operationen). Wir können dieses Diagramm verwenden, um den kürzesten Weg zwischen zwei Zuständen zu finden (dieses Diagramm allein kann für das Golfen von Pada sehr nützlich sein).Nun wollen wir für jedes Zeichen einen Zustand erreichen, in dem
w
dieses Zeichen gedruckt wird. Wie viele solcher Staaten gibt es?w
Liest das Byte von dem Bit, auf dem es abgelegt wurde (zyklisch). Es gibt also 8 mögliche Rotationen der Bits des Zeichens, die alle dieses Zeichen drucken können. Für jede dieser Umdrehungen sind drei Schalter fixiert (um einw
Absenken in die richtige Position zu ermöglichen). Dies lässt 4 beliebige Schalter. Wir haben also mögliche Zustände für jeden in unserem Code.8 * 24 = 128
w
Mit diesen können wir ein anderes Graphproblem lösen: Konstruieren Sie einen Graphen, der einen Quellscheitelpunkt, dann eine "Ebene" für jedes Zeichen und einen Senkscheitelpunkt hat. Die Schichten bestehen aus den 128 Zuständen für jeden Scheitelpunkt, der Quellknoten entspricht dem Anfangszustand des Programms (alle Schalter nach links und alle Bits sind Null). Der Senkenknoten entspricht insbesondere keinem Zustand. Wir haben Kanten von jedem Scheitelpunkt in einer Ebene zu jedem Scheitelpunkt in der nächsten Ebene gerichtet, wobei das Kantengewicht der Abstand zwischen den beiden Zuständen in unserem vorherigen Diagramm ist. Die Kantengewichte von der letzten Schicht bis zum Waschbecken sind alle 0. Das heißt, wir können alle diese Kantengewichte vorberechnen. Dies ist der teuerste Schritt der Berechnung und dauerte 1,5 Stunden
Hello, World!
.Mit diesem Diagramm können wir den kürzesten Weg von der Quelle zur Senke ziemlich schnell finden (es dauerte 0,05 Sekunden auf meinem Computer). Für
Hello, World!
die gewünschten Zustände sind:Dabei entsprechen die niedrigstwertigen 7 Bits den Schaltern und die höchstwertigen 8 Bits den Pada-Bits.
Jetzt kehren wir zum ersten Graphen zurück und finden die tatsächlichen Kanten (dh Operationen), die dem kürzesten Pfad zwischen jedem Paar nachfolgender Zustände entsprechen, und beenden jeden von ihnen mit einem
w
. Voilà, eine optimale Lösung (basierend auf den obigen Annahmen).Hier ist die vollständige Mathematica, falls jemand jemals eine andere Saite in Pada metagolfing möchte:
quelle