Es ist sehr einfach: Ihr Programm oder Ihre Funktion sollte den folgenden Text generieren:
Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look.
Kleingedrucktes
Sie können ein Programm oder eine Funktion schreiben , die die Ausgabe als Zeichenfolge zurückgibt, oder sie an STDOUT (oder die nächstgelegene Alternative) ausgeben. Optional können Sie eine einzelne nachgestellte Newline in die Ausgabe aufnehmen.
Wertung
Die Anzahl der Bytes in Ihrem Code multipliziert mit der Anzahl der eindeutigen Bytes in Ihrem Code
Die niedrigste Punktzahl gewinnt.
Ein Brainfuck oder eine Whitespace-Antwort wären hier von großem Vorteil, da der Multiplikator sehr niedrig wäre (8 bzw. 3). Im Allgemeinen führt das Schreiben von Programmen in diesen Sprachen jedoch zu viel längerem Code, wodurch dieser Vorteil möglicherweise zunichte gemacht wird.
Standardlücken, die nicht mehr lustig sind, sind verboten .
quelle
bytecount~Log(X,unique)
, wobei X eine Konstante für dieses Problem ist. Also einmalige Anzahl ~ Konstante. Berechnung dieser Punktzahl (log2) ergibtpython2_mbomb007 728, python2_carpetpython 744, ruby 756, Fish 825, Insomnia 1148, cjam 1277, whitespace 1484, brainfuck 3546
. Abgesehen von der Antwort auf das Brainfucking ist es also relativ konstant ...Antworten:
Schlaflosigkeit , 575 Bytes * 4 = 2300
Verwendet 4 Zeichen
dye=
.Lösung 1b (unveröffentlicht): 783 Byte * 3 = 2349
Verwendet nur 3 Zeichen
ey=
.Lösung 1: 826 Bytes * 3 = 2478
Verwendet nur 3 Zeichen:
yo~
. Ein Programm wird verwendet, um dies zu generieren.Derzeit verwenden alle Programme nur die Anweisungen 0, 1, 2, 6. Mit anderen Worten, sie manipulieren die Bits in einem einzelnen Byte und drucken das Ergebnis aus.
quelle
CJam,
266281456 Bytes *14127 unique =372433723192Probieren Sie es online aus.
Erläuterung
Die Strategie, die ich angewendet habe, besteht darin, jedes Zeichen in der Zeichenfolge als Basisziffer 123 zu behandeln und diese im Programm als Dezimalzahl zu codieren. Das Programm konvertiert diese Zahl dann zurück in die Basis 123 und ordnet jede Basis-123-Ziffer einem Zeichen zu. Da es schwierig ist zu erklären, warum sich das Programm im aktuellen Zustand befindet, erkläre ich jede Version.
So sah das Ende des Programms in der ersten Version aus:
Dadurch wird die Strategie so einfach wie möglich umgesetzt. Die normalerweise in Basis 10 codierte Zahl wird zurück in Basis 123 konvertiert, und jede Basis-123-Ziffer wird zurück auf ein Zeichen abgebildet. Es werden jedoch 4 eindeutige nicht-stellige Zeichen verwendet, und die Möglichkeit, eines dieser Zeichen zu entfernen, ist wahrscheinlich den Größenunterschied wert, da weniger einfacher Code verwendet werden muss.
Zuerst wurde mir klar, dass ich die
b
und die:
Operatoren loswerden könnte, indem ich sie zur Laufzeit als ASCII-Zeichenwerte erstelle, die zurück in ein Zeichen konvertiert werden (mit dem bereits vorhandenenc
Operator), und sie mit dem~
Operator auswerte . Es stellte sich als etwas schwierig heraus, dies mit dem:
Operator zu tun , da es zusammen mit dem folgendenc
Operator analysiert werden muss. Ich habe dieses Problem gelöst, indem ich die Zeichen erstellt:
undc
dann das Zeichen erstellt und ausgewertet habe+
, wodurch die beiden vorherigen Zeichen zu einer Zeichenfolge verknüpft wurden,:c
die dann ordnungsgemäß ausgewertet werden kann.Zweitens wurde mir klar, dass der
~
Operator , den ich gerade vorgestellt habe, eine praktische neue überladene Variante hat: Wenn er eine Zahl erhält, wird das bitweise Komplement erzeugt. Indem ich dies zweimal hintereinander nach einer Zahl verwende, kann ich eine Token-Unterbrechung in der Quelle einführen, ohne dass sich daraus ein rechnerischer Effekt ergibt. Dadurch kann ich die Leerzeichen ersetzen, mit denen Zahlen voneinander getrennt werden~~
.Das Endergebnis ist 15 weitere Byte Code am Ende, aber diese Kosten werden durch den Vorteil der Eliminierung von 2 eindeutigen Zeichen von 14 bei weitem aufgewogen. Hier ist ein Vergleich des Endes der ersten Version mit dem Ende der zweiten Version:
Es wäre unmöglich, weniger als die zwei Operatoren zu verwenden, die ich verwendet habe, aber ich wollte immer noch weniger eindeutige Zeichen. Der nächste Schritt war also die Beseitigung von Ziffern. Durch Ändern der Codierung der Zahl, sodass jede Dezimalstelle wirklich eine 5-stellige Basisstelle ist, könnte ich möglicherweise die Ziffern 6 bis 9 eliminieren. Bevor irgendetwas vom Ende des Programms entfernt wurde, sah es so aus:
Wie bereits erwähnt, ist das Beseitigen des Platzes einfach. Aber das
b
,:
undc
wäre nicht so einfach sein, da ihre Zeichencodes sind98
,58
und99
jeweils. Diese enthielten alle Ziffern, die zur Eliminierung markiert waren, daher musste ich Wege finden, sie alle abzuleiten. Die einzigen nützlichen numerischen Operatoren mit Zeichenwerten, die 5-9 nicht enthalten, waren Dekrementieren, Inkrementieren, Multiplizieren und Addieren.Denn
98
ich habe anfangs verwendet100~~40c~40c~
, was100
zweimal dekrementiert . Aber dann wurde mir klar, dass ich den~
Operator noch einmal verwenden könnte, da ich durch bitweise Ergänzung negative Zahlen erhalte, die, wenn sie hinzugefügt werden, die Subtraktion emulieren. Also habe ich dann verwendet100~~1~43c~
, was addiert100
und-2
und 2 Bytes kleiner ist. Denn58
ich habe verwendet44~~14~~43c~
, was44
und hinzufügt14
. Und dafür habe99
ich verwendet100~~40c~
, was dekrementiert100
.Das Endergebnis ist ziemlich groß und verschleiert, aber die Kosten für die erheblich größere Anzahl und den Verarbeitungscode wurden durch den großen Vorteil der Eliminierung von 5 von 12 eindeutigen Zeichen leicht aufgewogen Eliminierungen:
quelle
98
,58
, und99
) sind noch außer Reichweite. Und eine Erhöhung der Basis verringert die Gesamtgröße des Programms nur um 8-10%, was nicht ausreicht, um die 10-15% -Punktzahl auszugleichen, die durch einen neuen einzigartigen Charakter erzielt wurde. Das erneute Einbeziehen desb
Betreibers lohnt sich ebenfalls nicht.floor(log_b(x)+1)
und es wirdb
verschiedene Symbole enthalten . Die Punktzahl ist alsob*floor(log_b(x)+1)
. x ist eine gegebene große Zahl, und wenn Sie dies für b zeichnen, werden Sie feststellen, dass das Minimum ziemlich genau bei b = 3 liegt. Dh die Länge verringert sich geringfügig, wenn Sie höhere Basen (log) verwenden, aber die Größe des Zeichensatzes nimmt linear zu, sodass es sich nicht lohnt. Hat ein einfaches Whitespace-Programm erstellt, aber es erhält nur eine Punktzahl von 4134.Leerzeichen,
1157937 Bytes * 3 eindeutig =34712811Auf vielfachen Wunsch veröffentliche ich meine Whitespace-Lösung.
Um den benötigten Code zu reduzieren, habe ich die gesamte Zeichenfolge als eine Binärzahl (7 Bits für jedes Byte) fest codiert. Eine einfache Schleife extrahiert die Zeichen und druckt sie aus.
Quellcode auf filebin.ca.
HINWEIS: In den Spezifikationen sind beliebige große Ganzzahlen zulässig , der Haskell-Interpreter auf der offiziellen Seite ist jedoch auf 20 Bit beschränkt. Verwenden Sie diesen Ruby-Interpreter beispielsweise für Github / Hostilefork / Whitespaces.
Das Ruby-Skript zum Erstellen des Whitespace-Programms (l = WHITESPACE, t = TAB, u = NEWLINE, alles nach // ignoriert, schreibt in eine Datei
prog.h
):Zur Veranschaulichung das Whitespace-Programm in lesbarer Form. Im Folgenden finden Sie ein einfaches Skript zum Konvertieren in ein tatsächliches Whitespace-Programm.
Grundsätzlich ist die auszugebende Zeichenfolge eine lange Ganzzahl, und Sie müssen ihre Punktzahl reduzieren.
Also habe ich nach einer Sprache mit nur 0/1 gesucht, aber keine gefunden, und dann habe ich mich daran erinnert, dass es Whitespace gibt, und es ausprobiert. In Leerzeichen können Sie Binärzahlen mit 0 und 1 direkt eingeben.
Alter Code, schlechteres Ergebnis, aber interessanter
Alter Code in der Ablage .
Das Ruby-Skript, mit dem ich das Programm erstellt habe (l = WHITESPACE, t = TAB, u = NEWLINE, alles, was
//
ignoriert wurde, wird in eine Datei geschriebenprog.h
):Zur Veranschaulichung das Whitespace-Programm in lesbarer Form. Im Folgenden finden Sie ein einfaches Skript zum Konvertieren in ein tatsächliches Whitespace-Programm.
Dieses Whitespace-Programm selbst ist recht einfach, es gibt jedoch drei Optimierungen beim Golfen:
lul
diese Option, um den Stapel zu klonen, wenn ein doppeltes Zeichen vorhanden istltl
diese Option, um den n-ten Eintrag des Stapels zu klonen, wenn er kürzer ist als das direkte Drücken des ZeichensEin einfaches Ruby-Skript zum Konvertieren meines lesbaren Whitespace-Codes in ein tatsächliches Whitespace-Programm (eine Datei lesen
prog.h
und in eine Datei schreibenprog.ws
):quelle
Ruby 144 Bytes * 39 Unique = 5616
Manchmal ist das Einfachste das Beste.
quelle
Brainfuck, 1264 Bytes * 7 eindeutig = 8848
Ja, es ist eine schreckliche Bilanz.
quelle
+.
nicht sicher wären, ob es kleiner wäre.+
und.
ich bekomme 15018 * 2 =30,036
.> <> (Fisch) - 578 Byte * 8 eindeutig = 4624
Mein Punktestand ist nicht so wettbewerbsfähig wie ich es mir erhofft hatte, aber ich fand diese Lösung immer noch interessant genug, um zu posten.
Erläuterung
Der erste Codeabschnitt ist eine lange Zeichenfolge mit den Ziffern 0-4, die eine dreistellige Basis-5-Darstellung für jedes Zeichen in der Zeichenfolge darstellt. Der verbleibende Code nutzt den
p
Operator in Fish, mit dem Sie den Quellcode des Programms bearbeiten können, während das Programm ausgeführt wird. Mit diesem Operator konnte ich den für die Konvertierung der Zeichen der Basis 5 in die Basis 10 erforderlichen Fischcode generieren und ausgeben und diesen Code dann wieder in den Quellcode am Anfang der Datei einfügen, bevor der Interpreter das Ende erreichte der Linie und umwickelt. Wenn der Interpreter das Ende der Zeile erreicht, wurde der Code folgendermaßen geändert:Wenn der Code den
v
Operator umschließt und trifft , geht er in die zweite Zeile, trifft den>
Operator und geht zur Schleife über, wobei jedes Mal die Codierung der Basis 5 zurück in einen ASCII-Wert der Basis 10 konvertiert und dann dieser Wert ausgegeben wird. Wenn sich keine weiteren Werte auf dem Stapel befinden, springt der?
Bediener zum;
und das Programm wird beendet.quelle
7 , 273 Bytes × 7 eindeutige Bytes = 1911, nicht konkurrierend
Probieren Sie es online!
Leider ist dies eine alte Herausforderung, was bedeutet, dass ich mit einer meiner neuesten Sprachen nicht gewinnen kann. Die Sprache wurde jedoch ohne Kenntnis der Herausforderung erstellt (ich bin nur zufällig in "verwandten Fragen" darauf gestoßen), aber es stellte sich dennoch heraus, dass sie perfekt zu mir passte.
7 Programme auf PPCG werden normalerweise im gepackten Format gesendet, wobei acht Befehle in drei Bytes gepackt werden (die Sprache hat zwölf Befehle, aber in einer Quelldatei können nur acht erscheinen, was bedeutet, dass drei Bits ausreichen). Die Sprache unterstützt jedoch auch ein oktales Format, in dem jeder Befehl als ASCII-Ziffer geschrieben ist, und das habe ich hier verwendet, was bedeutet, dass nur sieben verschiedene Bytes verwendet werden (der
6
Befehl ist in einem Programm, das nur druckt, nicht erforderlich) eine einfache Zeichenfolge).Das Programm ist sehr einfach; Es besteht aus zwei Stack-Elementen, einer langen Zeichenfolge, die nur wörtlich gedruckt wird
7
, um die Elemente zu trennen (leider unvermeidlich). Dies403
ist eine einfache Methode, um eine konstante Zeichenfolge in 7 zu drucken (40
das zweite Stack-Element wird ausgeblendet, während es verschoben wird) oben auf dem Stapel,3
druckt ihn dann aus und verwirft das alte erste Stapelelement (dh das Element403
selbst).Wie habe ich die Zeichenfolge auf 269 Byte gekürzt? 7 unterstützt mehrere E / A-Formate. Eines der Formate ist US-TTY , ein Zeichensatz (insbesondere eine Variante von Baudot), der vor der Erfindung von ASCII häufig verwendet wurde. (Am
5
Anfang des zweiten Stack-Elements, dh am Anfang des Programms, wird die Codierung des Strings angegeben. Der Rest ist der String-Inhalt selbst.) Es handelt sich um einen Fünf-Bit-Zeichensatz und die Befehle0
an5
können sicher in Strings gespeichert werden, während sie konsistent entkapselt sind (so dass das einmalige Entkoppeln das Original exakt wiedergibt). Daher verwendet die Sprache Befehlspaare (36 Optionen), um US-TTY-Zeichen zu kodieren (32 Optionen, wobei 4 für verwendet werden) Direktiven zum 7-Interpreter selbst). Natürlich gibt es mehr als 32 eindeutige Zeichen, die möglicherweise ausgegeben werden sollen (und es werden mehr als 32 Zeichen in der Zeichenfolge angezeigt), sodass zwei der Zeichen "Shift-Codes" sind, die zwischen vier Zeichensätzen (Großbuchstaben, Kleinbuchstaben) wechseln , figures und eine benutzerdefinierte "figures extension", die 7 für die verbleibenden ASCII-Zeichen verwendet, die nicht in den anderen Zeichensätzen enthalten sind, wobei jedoch alle Zeichen in der Zeichenfolge in US-TTY "nativ" sind die erweiterung spielte keine rolle). Hier'Ich zähle zehn Schichten, die zu 124 Zeichen der Eingabe hinzugefügt werden, ein ziemlich vernachlässigbares Verhältnis. Die Fähigkeit, nur etwas mehr als zwei Bytes Eingabe pro Eingabezeichen zu verwenden, mal 7 eindeutige Bytes, bedeutet, dass die Punktzahl bei dieser Herausforderung unglaublich gut ist. (Ich denke, eine Sprache, die speziell für diese Herausforderung entwickelt wurde, würde eine Art String-Komprimierung anstelle eines bereits vorhandenen Zeichensatzes verwenden. Obwohl Baudot und US-TTY nicht für das Golfen entwickelt wurden, sind sie immer noch ziemlich prägnant .)
quelle
Python 2,
163147145143 Bytes *353635 unique =5705529252205005Das ist wahrscheinlich ungefähr so gut, wie ich es bekommen werde.
Bearbeitungen:
.capitalize()
Verwendung entferntE
.'
Anführungszeichen anstelle von Backslash zu verwenden .+
und einige Leerzeichen, um Kommas in derprint
Anweisung zu verwenden.quelle
Python 2,
14508 11700 11088 10164 9486 9746 7860145 Bytes * 36 unique = 5220Ich habe den Titel gesehen und fand, dass dies eine interessante Herausforderung für den eher wortreichen Python war. Dies sind meine Notizen, als ich dieses Problem anging.
Mein erster Versuch reduzierte die Unikate auf 31:
Ich dachte, ich könnte es besser machen. Unter Verwendung von
map
kam es zu 26 Unikaten:Ungefähr zu dieser Zeit bemerkte ich im Fragetext, dass die Punktzahl
uniques * bytes
nicht nur einzigartig war! Das bedeutete, dass ich für die oben genannten Punkte 14508 und 11700 Punkte erhielt. Nicht sehr konkurrenzfähig. Deshalb reduziere ich jetzt die Bytes, indem ich den Text als Hex-Zeichenfolge speichere:Die Größe wurde reduziert, aber mehr eindeutige Zeichen. Aber wenn ich eine gepackte 2-stellige Dezimalzeichenfolge mit einem Versatz von 32 verwendet habe:
Dies hat die gleiche Anzahl von Bytes, speichert aber 3 Unikate.
Ich habe einen neuen Plan. Wenn ich eine lange Python-Ganzzahl mit 7-Bit-Zeichen packe, könnte ich jedes durch Verschieben extrahieren:
Nun, das reduzierte die Punktzahl auf 9486. Ein interessantes Experiment, aber bei weitem nicht gut genug. Was ist nun, wenn ich die Funktionsnamen loswird und mich auf die Formatierung von Zeichenfolgen verlasse?
Ich habe jetzt nur 22 Unikate, aber die Punktzahl verbessert sich nicht.
Ok, was ist, wenn ich den offensichtlichen Weg eingeschlagen habe und nur die Zeichenfolge ausgedruckt habe:
Score von 7860. Ich hätte das zuerst tun sollen. Aber ich hätte nicht so viel gelernt.
Ich denke, ich könnte Uniques um 26 reduzieren, wenn ich die Großbuchstaben dynamisch produziere. Also:
Ich denke, Python wird nicht viel besser als 5220. Die Aufgabe, die eindeutigen Zeichen in Python zu minimieren, war allerdings aufschlussreich.
Update: mbomb007 hat eine bessere Python-Lösung mit 5005. Gute Arbeit.
quelle
> <> (Fisch) - 138 Bytes * 65 Unique = 8970
Die einfache Route, dh Hallo Welt:
Nun, für meinen ersten Ausflug in> <> war dies eine Herausforderung. Ich denke, ich sehe einige Verbesserungen, aber es hat Spaß gemacht, es zu lernen :)
Oder um es zu kompliziert zu machen - 1567 Bytes * 27 Unique = 42309
quelle
r
Stapel in umgekehrter Reihenfolge ablegen :) Außerdem können Sie das Finaleo
an die leere Stelle am Anfang der zweiten Zeile verschieben.f f + 2 + o
so viele Male im komplizierten zu haben?05AB1E , 380 Byte * 11 Zeichen = 4180 Punkte
Dies ist möglicherweise nicht konkurrierend
Probieren Sie es online!
Schiebt die Basis 5-Darstellung von zusammengefügten ASCII-Zeichen.
Teilt sich in 3er-Teile, konvertiert zurück in Dezimalzahl.
Konvertiert ASCII-Ganzzahlen zurück in Zeichen.
Schließt sich wieder zusammen.
quelle
Perl 6, 139 Bytes * 36 unique = 5004
quelle
Java 8, 141 Bytes * 64 eindeutige Zeichen = 9.024
141 Bytes, 64 eindeutige Zeichen. Andere Ansätze als das einfache "return the string" erhöhen die Byteanzahl, ohne viel an verwendeten Zeichen zu sparen.
quelle
Perl 5 , 137 Bytes * 35 unique = 4795
Probieren Sie es online!
quelle
Tcl , 345 Bytes, 345 × 13 = 4485
Probieren Sie es online!
Tcl , 337 Bytes, 337 × 15 = 5055
Probieren Sie es online!
Tcl , 329 Bytes, 329 × 16 = 5264
Probieren Sie es online!
Tcl , 333 Bytes, 333 × 16 = 5328
Probieren Sie es online!
Tcl , 148 Bytes, 148 × 37 = 5476
Probieren Sie es online!
Tcl , 277 Bytes, 277 × 21 = 5817
Probieren Sie es online!
Tcl , 371 Bytes, 371 × 16 = 5936
Probieren Sie es online!
Tcl , 401 Bytes, 401 × 16 = 6416
Probieren Sie es online!
Tcl , 403 Bytes, 403 × 16 = 6448
Probieren Sie es online!
Tcl , 433 Bytes, 433 × 15 = 6495
Probieren Sie es online!
Tcl , 473 Bytes, 473 × 14 = 6622
Probieren Sie es online!
Tcl , 133 Bytes, 133 × 60 = 7980
Probieren Sie es online!
quelle