Deadfish ist eine der bekanntesten nicht Turing-vollständigen Programmiersprachen. Es gibt nur einen Akkumulator (der bei 0 beginnt) zum Speichern von Daten und nur vier Befehle:
i - Increment the accumulator
s - Square the accumulator
d - Decrement the accumulator
o - Output the accumulator
Ein Deadfish-Programm könnte so aussehen:
iiisdo
Und das würde drucken:
8
Die Herausforderung
Erstellen Sie ein Programm, das eine Zahl eingibt und Deadfish-Code ausgibt, um die Zahl anzuzeigen. (Oder erstellen Sie eine Funktion, die die Zahl als Parameter verwendet und den Code zurückgibt.) Sie muss für jede Ganzzahl von funktionieren 0
bis255
Tor
Versuchen Sie, Ihren Code so kurz wie möglich zu machen, um die angegebene Nummer zu generieren. Beispielsweise:
iiiiiiiiio
und
iiiso
jeder Druck 9
, aber der zweite ist kürzer.
Wertung
Dein Ergebnis ist:
The number of characters in your source code +
The sum of the lengths of your output for all numbers from 1-255
-100 if the language you chose is Deadfish :)
Die niedrigste Punktzahl gewinnt!
In der ursprünglichen Herausforderung hatte ich nur die Summe von 6 Zahlen (9,17,99,100 und 123). Ich wollte nicht, dass jeder für jede Zahl einen Test durchführt, und ich wollte, dass der kürzeste Code relevant ist. Dann wurde mir klar, dass Programmierer gut darin sind, Skripte zu erstellen, um solche Dinge zu testen, und ich würde es vorziehen, wenn dies ein Wettbewerb für den besten Algorithmus mit Golf als Tiebreaker wäre.
Deshalb habe ich das geändert, wie von Martin Büttner vorgeschlagen.
quelle
16^2 = 0
oder16^2 = 256
oder16^2 = error
?-1
OR drücken256
, wird es auf zurückgesetzt0
. Wenn Sie jedoch eine größere Zahl als256
durch Quadrieren treffen, bleibt diese unverändert, z17^2 = 289
. (siehe esolang Seite)Antworten:
Perl,
132131 Bytes + 2036 Bytes = 2167Beinhaltet +2 für
-lp
Führen Sie mit der Zielnummer auf STDIN aus, z
deadfish.pl:
Das grep ist ein Filter, um die exponentielle Explosion ein wenig einzuschränken (obwohl dieses Programm für die harten Fälle immer noch 2 GB benötigt). Es funktioniert auch ohne, aber ich kann es mit Ausnahme der einfachen Fälle nicht auf meiner Hardware so ausführen. Prinzipiell
110=108+2
funktioniert dieses Byte-Programm aber auch:Ausgabeliste:
quelle
ES6 JavaScript 2126 + 311 = 2437 Punkte
Halbkommentiert:
Dies nutzt die Tatsache aus, dass Sie in Deadfish mehr als ein Zeichen drucken können.
Beispiel:
10
Kompiliert, aufiodo
das "Eins drucken, dekrementieren, Null drucken" lautet.Verwendung:
Hier sind die JSON-Ausgabedaten:
Das wurde von diesem Code generiert:
welche druckt
result = (the result)
undc =
das ding oben.Dies wird eine bemerkenswert hohe Punktzahl, obwohl es ziemlich einfach ist. Es sucht nach dem nächsten perfekten Quadrat, berechnet die Quadratwurzel dieses perfekten Quadrats, addiert 's' und erhöht / verringert sich entsprechend.
Alte Version, die nicht die Tatsache verwendet hat, dass "10" = "print one, print zero"
quelle
d
Operation falsch verstanden zu haben - wenn sie auf dekrementiert,-1
wird sie auf zurückgesetzt0
, nicht auf255
.o
tut; es gibt den akku und eine newline aus.iodo
Ausgänge1\n0\n
, nicht10
.o
. Ebenso wenig drucken viele Compiler (in verschiedenen Sprachen) eine neue Zeile mito
Mathematica,
254165 Zeichen + 3455 = 3620Weniger Golf:
Ich glaube, die resultierenden Zahlen sind optimal. Dies führt eine Breitensuche über alle 256 Nummern durch und verfolgt dabei den kürzesten Weg, den es gefunden hat, um jede Nummer darzustellen. Die Suche erstellt eine Art Nachschlagetabelle in der Funktion
g
die dann auf die Eingabe angewendet wird.Als Referenz sind hier alle 255 Ergebnisse:
quelle
n > 256
nichtn ≥ 256
. Und das stimmt auch mit der esolang-Seite überein: "Obwohl der Kommentar in der C-Implementierung besagt/* Make sure x is not greater then [sic] 256 */
, setzt die Implementierung den Wert genau dann auf Null, wennvalue == -1 || value == 256
."d
, damit sollte 0 gedruckt werden.C, 433 Code + 3455 Ausgabe = 3888
C ++, 430 Code + 3455 Ausgabe = 3885
Und jetzt etwas ganz anderes.
Ich habe die Ausgabe von Martins Mathematica-Antwort verwendet (aktualisiert am 23. Oktober, da sie für 240+ zuvor falsch war). Meine Ausgabe ist die gleiche 3455 Zeichen. Ich habe Muster in der Ausgabe analysiert und festgestellt, dass [0,255] durch diese Sequenz dargestellt werden kann:
i
ss
si
s oderd
ss
si
oder 0-16d
so
Der nächste Schritt bestand darin, diese fünf Spalten sorgfältig zu konstruieren (
c
bisg
in den folgenden Code). Ich habe negative Zahlend
anstelle voni
in Spaltene
und angegebeng
. Dann stellt sich heraus, dass die Ergebnisse meistens wie ein Zähler in derg
Spalte funktionieren , da jede Zeileu
normalerweise eine entferntd
oder einei
relativ zur vorherigen Zeile hinzufügt (v
). Es gibt 15 Ausnahmen, die inx
(den Indizes) und gespeichert sindb
(den fünf Spalten in eine Ganzzahl gepackt sind, die nur 14 Bits benötigt, um das Maximum zu speichern10832
) .Zum Beispiel ist die erste "Ausnahme" die allererste Zeile, in der neben dem Abschlusszeichen Null Zeichen stehen sollen
o
. Sox[0]
ist0
, undb[0]
ist544
, was beim Auspacken ist ("Little Endian" -Stil, dag
ist die Zählspalte){ 32, 0, 4, 0, 0 }
. Wir subtrahieren immer 32 vong
und 4 vone
, damit die vorzeichenlosen Bitfelder funktionieren (dh diese beiden Spalten stehen konzeptionell für negative Zahlen, wennd
dies anstelle von erforderlich isti
, aber in der Implementierung werden die Werte versetzt, um tatsächliche negative Zahlen zu vermeiden).Hier ist eine Tabelle, die zeigt, wie die ersten zehn Zahlen funktionieren (Leerzeichen sind Nullen):
Sie können sehen, dass
g
meistens nur ein Inkrement für jede neue Zeile, aber einige Zeilen (0, 4, 8, ..., die ich kurz in OEIS zu finden hoffte) die Sequenz "zurücksetzen", was bedeutetg
einen neuen Wert annimmt und Mindestens eine weitere Spalte wird ebenfalls geändert.Die Anzahl der Codezeichen schließt Leerzeichen mit Ausnahme der obligatorischen Zeilenumbrüche vor
#
und Leerzeichen nachunsigned
und ausint
. Sie können 3 Zeichen speichern, indem Sie als C ++ anstelle von C kompilieren und<stdio.h>
durch<cstdio>
und*(int*)&u
durch ersetzen(int&)u
.Eine lustige Tatsache zu diesem Code: Eine frühere Version verwendete ein Array von 256 Gewerkschaften anstelle von nur
u
undv
. Diese Version führte dazu, dass GCC 4.7.2 einen internen Compilerfehler erzeugte! GCC 4.9 hat dies jedoch behoben und der obige Code funktioniert mit beiden Versionen.quelle
for(...)
mitscanf
- diese Zeichenzahl verringern würde).#include
, und Sie könnten möglicherweisestruct
dasunion
Unbenannte ins Spiel bringen.for
Schleife wird weiterhin benötigt, da ich das Ergebnis berechnet habe. Dadurch und durch Aufheben der Benennung der Struktur wurden 5 Zeichen gespeichert. weitere 2 wurden durch Änderung gespeichert==
zu>
und Entfernen der hinteren Newline. :) Das Programm ist nur in C99 vollständig gültig, damain
es keinen expliziten Wert zurückgibt. Entfernen der#include
Ergebnisse in einem Fehler wegenscanf()
jetzt.256
.Haskell,
220021772171 = 2036 + 135Dies funktioniert, indem eine unendliche Liste aller Deadfish-Programme, sortiert nach ihrer Länge, zusammen mit dem internen Status und der Ausgabe erstellt wird. die Funktion
f
durchsucht die Liste und gibt den ersten passenden Eintrag zurück.Dieser Ansatz ermöglicht mehrere
o
Codes in jedem resultierenden Code, beschränkt sich jedoch nicht darauf, entweder alle Ziffern einzeln oder die ganze Zahl auf einmal zu drucken. Beispielsweise hat hier 216 den Code voniiosso
.Bearbeiten:
Nach der Spezifikation, wenn der Zustand 256 (aber nicht 257) ist, wird es in eine 0 gemacht. Jetzt berücksichtigt mein Code dies. zum Beispiel ist 160
iissoso
.dies hat einige Effizienzprobleme; weil
l
ist eine Top-Level-Liste, alle Elemente vonl
ausgewerteten im Speicher verbleiben und die Laufzeit möglicherweise irgendwann nicht mehr ausreicht.Um die Punktzahl zu berechnen, habe ich eine äquivalente, aber weniger speicherintensive Version erstellt.
Mein effizienterer Code berechnet die Liste bei jeder Anwendung von neu
f
, sodass der Garbage Collector den bereits durchsuchten Teil der Liste wegwerfen kann. In gewisser Hinsicht ist dies eine Breitensuche mit Faulheit.Der effizientere Code fügt den Elementen der Liste noch einige Einschränkungen hinzu. Er filtert alle Codes heraus, die einen
id
oder enthaltendi
,s
wenn der Status kleiner als 2 ist.Bearbeiten:
Ich habe die
g
Funktion von der obersten Ebene zu einer Hilfsfunktion verschobenf'
, also jetztg
Codes zu filtern, die etwas drucken, das kein Präfix unserer gewünschten Nummer ist. jetzt ist der Code viel schneller.der effizientere Code:
Beachten Sie, dass der effizientere Code nicht die gleichen Ergebnisse liefert, da die Programme alle möglichen Codes in unterschiedlicher Reihenfolge durchlaufen. Sie geben jedoch Codes mit derselben Länge aus. auch schalten
c:x
mitx++[c]
die Programme gleichwertig.Mit diesem Code konnte ich alle Programme in
520,81 Sekunden berechnen .Bearbeiten:
anscheinend ist das die beste Antwort! Ich bemerkte es gerade jetzt, so weit, als dies gefragt wurde ...
die Ergebnisse:
quelle
Picat 516 + 2060 = 2576
Es ist etwas abgewandelte Version von Sergey Dymchenko Programm. Diese Version gibt kompaktere Deadfish-Programme aus.
Soweit ich den Satz "Länge der Ausgaben" verstanden habe, bedeutet dies, dass ich die Ausgabe ohne Zeilenumbrüche summieren soll.
Verwenden:
1-255 Codes:
Performance:
Programmversion zur Zeitmessung:
Ergebnis:
Volle Leistung:
quelle
ioio
würde also drucken"12"
und nicht"11"
JavaScript (E6) 141 + 3455 = 3596
Die rekursive Funktion, die nach der nächsten Quadratwurzel sucht, aber 16 als 16 * 16 = 256 vermeidet, wird in 0 geändert. Viele andere Antworten erhalten diesen Punkt nicht.
Test In FireFox / Firebug - Konsole
Ausgabe
quelle
Picat, 242 Code + 3455 Ausgabe = 3697
Informationen zu Picat finden Sie unter http://picat-lang.org/ .
Weniger Golf:
quelle
Python 3 - 4286 + 168 = 4454
Nicht zu ernst, aber extrem einfach. Findet einfach das Beste aus dem Addieren zu 0, einem Quadrat, einem Vierten Macht
und ein 8 th Macht.EDIT: golfed 75 Bytes, die 8 th Macht tat nichts
EDIT 2: Einige Bytes entfernt, um korrekt zu implementieren
d
. Die Punktzahl wurde jedoch erhöht.Python 3 - 2594 + 201 = 2795
Dieser verwendet eine Art Tiefensuche, um das kürzeste Programm zu finden. Ich habe einige (unnötige?) Optimierungen hinzugefügt, um das Ergebnis zu erhalten. auf diese Weise muss es nicht so viele Pfade laufen. Könnte versuchen, einige von ihnen zu entfernen. Schlägt den JS nicht, da er clevere Tricks wie Multiple verwendet
o
.BEARBEITEN: Mit 93 Bytes hatte ich offenbar einen Crapton nutzlosen Codes, der von der Entwicklung übrig geblieben war. Auch alles, was ich bisher für unnötig hielt, wurde entfernt. Hier komme ich, JS.
BEARBEITEN 2: Golf von weiteren 8 Bytes. Das
return
war unnötigEDIT 3: Golf zusätzliche 5 Bytes. Jetzt, wo wir diesen einen losgeworden sind, konnten wir einfach einen
elif
anstelle des anderen setzenreturn
.EDIT 4: Die Funktionalität von wurde korrigiert
d
. Größe um 1 Byte erhöht, Score um einige Bytes.quelle
APL: 80 + 3456 = 3536
Erläuterung: (korrigiert nach Anmerkung von edc65, danke)
⍵ <4: ⍵⍴'i 'Wenn das Argument kleiner als 3 ist, wiederholen Sie "i" so oft
(⌈, ⌊) ⍵ * .5 ⍵ ist das Argument, nimm die Quadratwurzel und nimm die Decke und den Boden
| ⍵-2 * ⍨ Erhöhe die Decke und den Boden, um 2 zu machen, entferne das Argument und mache positiv
b ← ⊃ (>, <, =) / erhalte einen booleschen Vektor mit a> b, a
(⍵> 240) ⌽ Um zu vermeiden, dass Sie zu 256 wechseln, verwenden Sie "i" für Zahlen über 240 anstelle von ^ 2
b / 'ids' verwenden diesen Booleschen Wert, um entweder i, d oder s zu nehmen und an die Lösung anzuhängen mit,
, ∇ (-⊃b) + b [2] + ⍵ * ÷ 1 + 3⊃b Rufe die Funktion rekursiv mit dem Argument -b 1 + b [2] auf, das zur Potenz erhöht ist (Inverse von b [3] +1)
Kann die Ausgabe zählen mit:
¨ Wendet die Funktion auf jede Nummer von 0 bis 255 an
+ / ⊃, / ⍴¨ zählt die Gesamtzahl der Elemente
Auf TryApl.org können Sie all das versuchen
Übrigens: Es ist 3456 und nicht 3455, weil ich auch über 0 nachdenke, da ich denke, dass das Problem gefragt hat. Wenn es 1-255 ist, ist die Kerbe 80 + 3455 = 3535
quelle
Python 2712 = 2608 + 104
Code:
Verwenden:
0-255 Code:
quelle
CJam,
2436 2392 22962173 ( 74 Zeichen + 2099)Was bedeutet:
Versucht, die Deadfish-Codelänge zu optimieren, indem der kürzeste Pfad ausgewählt wird, um jede Ziffer der Zahl zu erreichen.
Vielen Dank an Martin für die Unicode-Übersetzung
Hier ist die vollständige Liste der Codes
Probieren Sie es hier online aus:
quelle
o
Zeilenvorschub druckt. Alle Compiler druckten auch einfach ohne neue Zeile.C printf("%d\n",x);
C# Console.WriteLine(x)
GO fmt.Println(x)
pascal WRITELN(val);
python print accumulator (no comma)
bash echo $no;; (no -n)