Herausforderung
Wenn Sie eine Zeichenfolge als Eingabe angeben, spielen Sie das Fourier-Programm ab, das diese Zeichenfolge ausgibt.
In Fourier gibt es keine einfache Möglichkeit, einen String auszugeben: Sie müssen jeden Zeichencode durchgehen und diesen als Zeichen ausgeben.
Fourier
Die Sprache basiert auf einem Akkumulator, einer globalen Variablen, die zu Beginn des Programms auf 0 initialisiert wird. Dies wird von fast jedem Operator in der Sprache verwendet. Nur einige ändern den Wert des Akkus nicht.
Charakter aus
a
Nimmt den Wert des Akkus als ASCII-Code und gibt das Zeichen aus. Ändert den Wert des Akkus nicht.
Wenn der Akku größer als 255 ist, gibt das Programm einen Fehler zurück. Ebenso, wenn der Akku kleiner als 0 ist.
Nummer raus
o
Gibt den Wert des Akkus aus. Ändert den Wert des Akkus nicht.
Erhöhen, ansteigen
^
Erhöhen Sie den Akku um eins.
Verringern
v
Verringern Sie den Akku um eins.
Hinzufügen
+x
Setzt den Akku auf den Wert des Akkus plus den Wert von x.
Subtrahieren
-x
Setzt den Akku auf den Wert des Akkus minus dem Wert von x.
Multiplizieren
*x
Setzt den Akku auf den Wert des Akkus multipliziert mit dem Wert von x.
Teilen
/x
Setzt den Akku auf den Wert des Akkus geteilt durch den Wert von x. (Beachten Sie, dass dies eine Ganzzahldivision ist. Dies 1/6
führt zu 0
)
Nummer
n
Stellen Sie den Akku auf die ganze Zahl n.
Hinweis
Hier x
und n
kann eine beliebige ganze Zahl von 0
bis 2^32-1
einschließlich sein.
Mehr Informationen
Sie dürfen nur die oben beschriebenen Operatoren verwenden. Daher ist Ihr ausgegebenes Fourier-Programm ungültig, wenn eines der folgenden Elemente verwendet wird (beachten Sie, dass die folgenden Operatoren für die Prämie zulässig sind):
- Wiederholen Sie die Schleifen
- If-Anweisungen
- Variablen
- Zufällig
- Modulo
- Benutzereingabe
- Größer / Kleiner als Operatoren
- Gleichstellungsoperatoren
- Bildschirm löschen
- Zeitverzögerung
- Datumsfunktionen
Ihr Programm kann entweder ein vollständiges Programm oder eine Funktion sein, die Eingaben über STDIN, eine Datei oder Funktionsargumente aufnimmt. Sie können Eingaben auch direkt aus dem Internet vornehmen.
Beachten Sie, dass vv
Sie den Code durch einen ersetzen sollten , wenn er einen enthält -2
. Das gleiche gilt für das ^^
Ersetzen durch +2
.
Beispiele
Wenn die Eingabe lautet 7n
, lautet das erwartete Programm:
55a110a
Mit können Sie aber ein Byte sparen
55a*2a
Ein anderer Weg ist
7o110a
Nummer raus verwenden.
In ähnlicher Weise lautet Hello
das erwartete Programm, wenn die Eingabe lautet:
72a101a108a108a111a
Sie können es um 3 Bytes reduzieren (da die Ausgabe den Akku nicht verändert):
72a101a108aa111a
Aber warte, wir können den Additionsoperator verwenden und 2 Bytes sparen:
72a101a+7aa+3a
Formatierung
Da ich die Stack Snippet-Bestenliste von Martin Büttner verwende, können Sie den Titel folgendermaßen formatieren:
# <Language name>, <length of total output> bytes
Dann können Sie alles, was Sie wollen, unter den Titel setzen.
Gewinnen
Sie sollten die Länge der Fourier-Programme (von Ihrem Code erstellt) angeben, um diese Textdatei und diese Textdatei auszugeben . Ihre Punktzahl ist die kombinierte Länge der beiden Fourier-Programme in Bytes (Nicht-ASCII-Zeichen werden in Fourier nicht verwendet, es macht also keinen wirklichen Unterschied).
Die Person mit den niedrigsten Punktzahlen gewinnt. Bei Gleichstand gewinnt das kürzeste Programm in Bytes.
Kopfgeld
Diese Prämie von 500 Wiederholungen ist für eine neue Antwort gedacht, bei der die Saiten mit einer der Fourier-Funktionen gespielt werden. Dazu gehören Variablen, Schleifen und if-Anweisungen usw. Diese neue Antwort wird nicht akzeptiert.
Bestenliste
Siehe Formatierungsabschnitt oben:
var QUESTION_ID=55384;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}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="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><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> <tbody id="languages"> </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>
quelle
Antworten:
Python, 14307118 Bytes
601216 für Hamlet + 13705902 für Genesis = 14307118
Es gibt definitiv einige Szenarien, in denen diese Lösung nicht optimal ist, wie zum Beispiel für
1111
, wo sie1111o
im Gegensatz zu ausgegeben wird11oo
. Ich denke jedoch, dass es fast optimal ist.Bearbeiten: Ein paar Bytes durch Verbesserung
0o0o
auf gespeichert0oo
.Der Name der Datei, die die Eingabe enthält, wird auf STDIN empfangen und auf STDOUT ausgegeben.
Ergebnisse mit dem offiziellen Dolmetscher verifiziert.
quelle
> <> 14310665 Bytes
601398 für Weiler + 13709267 für Genesis
Dies ist noch in Arbeit und erfordert viel Zeit.
quelle
Java, 14307140 Bytes
Hamlet - 601,218
Genesis - 13.705.922
Hier geht es darum, die gesamte Arbeit im Voraus zu erledigen, indem Sie eine Charakter-> Charakterkarte erstellen. Dann können Sie einfach durchlaufen und die kürzesten Saiten greifen.
Für Zahlen muss eine kleine Ausnahme gemacht werden, also überprüfe ich sie in der Hauptschleife. Es ist jedoch immer noch schnell und erledigt den größeren Testfall in wenigen Sekunden. Vielleicht kann ich diesen Abschnitt noch ein paar Bytes weiter optimieren, aber ich bin mir ziemlich sicher, dass er sich dem Optimum nähert.
Eingabe ist ein Dateiname als Argument. Die Ausgabe wird in eine Datei geschrieben
inputFilename_out.4
und die Anzahl der Zeichen an STDOUT gesendet.Dies sind 1737 Bytes für den völlig ungolften Tiebreaker. Ich kann viel Golf spielen, wenn es nötig ist, aber es wird immer noch ein bisschen groß.
quelle
01
glaube ich, dass es bei der Eingabe Ausgaben gibt01o
, was nicht korrekt ist.else
Klausel der Hauptschleife können Sie zwischen dem tatsächlichen Wert des Akkumulators und dem Zeichenwert des vorherigen Zeichens wählen. Sie können die letztere Auswahl nicht treffen, wenn die beiden unterschiedlich sind, da Sieo
die Zeit zuvor verwendet haben und der Akku den Wert des vorherigen Zeichens nicht enthält.PHP, 14307118 Bytes
601 216 (Weiler) + 13 705 902 (Bibel)
Fourier-Ausgabe für Hamlet
Es funktioniert wie folgt:
quelle