Inspiriert sowohl von der Herausforderung "Unique is Cheap" von @Laikoni , bei der die Punktzahl auf der Herausforderung selbst basiert, als auch von der JavaScript (ES6) -Antwort von @ETHproductions für die Herausforderung "Palindrome Compression" , bei der er eine ziemlich coole verwendet Komprimierungsmethode für das Palindrom-Flag, die Groß- / Kleinschreibung und die Buchstaben.
Herausforderung:
Sie erstellen zwei Programme / Funktionen: ein Komprimierungsprogramm / eine Komprimierungsfunktion und ein Dekomprimierungsprogramm / eine Dekomprimierungsfunktion.
Programm / Funktion komprimieren:
Verwenden Sie eine beliebige Bitkomprimierungsmethode Ihrer Wahl und geben Sie die resultierenden 0
s und 1
s der Bitkomprimierung dieser Eingabe aus, da die in Ihrem eigenen Quellcode verwendeten Zeichen (sowohl der komprimierte als auch der dekomprimierte Quellcode zusammen) als mögliche Eingabe verwendet werden .
Die Anzahl der ausgegebenen Bits ( 0
s und 1
s) muss so kurz wie möglich sein. Diese Anzahl ist die Punktzahl Ihrer Antwort .
Die Idee ist, ein ausgewogenes Verhältnis zwischen den verschiedenen Arten von Zeichen, die in Ihrem eigenen Quellcode verwendet werden, der Größe Ihrer Programme / Funktionen und der Art der von Ihnen verwendeten Bitkomprimierung zu haben. Oder um @RobertFraser in diesem Kommentar zu zitieren :
Dies ist ein großartiges Beispiel für die Grundlagen des Ingenieurwesens. Nehmen Sie eine Problembeschreibung, überlegen Sie, wie Sie sie lösen können, und machen Sie Kompromisse zwischen den Anforderungen (dh wie viele Bits für verschiedene Stile verwendet werden sollen) usw.
Herausforderungsregeln:
- Das Programm / die Funktion des Kompressors und des Dekompressors sollte in derselben Programmiersprache sein.
- Sie müssen sowohl ein Komprimierungs- als auch ein Dekomprimierungsprogramm / eine Komprimierungsfunktion bereitstellen, und die Anzahl der
0
s und1
s, die Ihr Komprimierungsprogramm für beide Programme / Funktionen ausgibt, die als Eingabe kombiniert (verkettet) werden, ist Ihre Punktzahl. - Die Komprimierung muss natürlich für alle Zeichen funktionieren, die in Ihrem Quellcode sowohl Ihres Komprimierungs- als auch Ihres Dekomprimierungsprogramms / Ihrer Funktion verwendet werden, und zwar in beliebiger Reihenfolge oder Menge. (Es kann ein undefiniertes Verhalten für alle Zeichen haben, die nicht in Ihrem Quellcode enthalten sind.)
- Der Eingabetyp muss nicht unbedingt eine Zeichenfolge sein. Es kann sich auch um eine Liste / ein Array / einen Strom von Zeichen handeln, und es kann sich um ein Programmargument, STDIN usw. handeln. Ihr Aufruf.
Gleiches gilt für die Ausgabe. Kann von einer Funktion zurückgegeben oder an STDOUT gedruckt werden. Kann eine einzelne Zeichenfolge, ein Integer-Array usw. sein. - Ihr Komprimierungsprogramm muss mindestens ein
0
oder ausgeben1
(daher ist ein leerescat
Programm sowohl für das Komprimierungs- als auch für das Dekomprimierungsprogramm nicht möglich). - Ihr Quellcode enthält möglicherweise nicht nur bereits
0
s und1
s, ausgenommen No-Ops (um zu verhindern, dass Programmiersprachen standardmäßig ihren eigenen Quellcode drucken, wobei sowohl das Komprimierungs- als auch das Dekomprimierungsprogramm ein einzelnes0
oder sein1
können und der No-Ops-Teil ist um dieses Verhalten mit einem nicht verwendeten Kommentar zu verhindern (sorry, binärbasierte Programmiersprachen, die nur0
s und1
s als Quellcode verwenden). - Obwohl Sie eine Eingabe von 0 oder mehr des in Ihren Programmen / Funktionen verwendeten Zeichenpools unterstützen müssen, müssen Sie keine leere Eingabe unterstützen. Sie können also davon ausgehen, dass jede Eingabe mindestens 1 Zeichen umfasst.
- Eine mögliche Eingabe kann größer sein als Ihre Komprimierungs- und Dekomprimierungsgrößen zusammen.
- Wenn Ihre Komprimierungsmethode aus irgendeinem Grund von der Reihenfolge abhängt und eine kürzere Ausgabe aufweist, wenn Ihre Eingabe
DecompressionProgramCompressionProgram
anstelle der Eingabe erfolgtCompressionProgramDecompressionProgram
, können Sie für Ihre Partitur eine der beiden Reihenfolge der Verkettung Ihrer Programme / Funktionen auswählen.
Beispiel:
Angenommen, das Komprimierungsprogramm ist ABC
und das Dekomprimierungsprogramm ist 123aBc
. Für jede Eingabe, die null oder mehr des Zeichenpools enthält 123ABCab
, sollte es möglich sein, diese Zeichen korrekt auf 0
s und 1
s zu komprimieren und diese 0
s und 1
s wieder in die richtigen Zeichen zu dekomprimieren . Einige gültige Beispieleingaben für diese beiden Programme können sein: ABC123aBc
(natürlich); A
;; 1Ca
;; 22222b1121221b
;; usw.
Allgemeine Regeln:
- Für Ihre Antwort gelten Standardregeln , sodass Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme verwenden dürfen. Ihr Anruf.
- Standardschlupflöcher sind verboten.
- Wenn möglich, fügen Sie bitte einen Link mit einem Test für Ihren Code hinzu.
- Fügen Sie bei Bedarf auch eine Erklärung hinzu.
Beispiel einer Antwort:
Java 8, Punktzahl 1440 Bit, 180 (87 + 93) Bytes
Hier eine sehr schlechte Implementierung in Java 8, bei der jedes Zeichen einfach als 8-Bit-Binärzeichenfolge gedruckt wird.
Komprimierungsfunktion:
Eingabe bereitgestellt als
java.util.stream.IntStream
.s->s.forEach(c->System.out.print("".format("%8s",Long.toString(c,2)).replace(' ','0')))
Dekompressionsfunktion:
Eingabe bereitgestellt als
String
.s->{for(Integer i=0;i<s.length();System.out.printf("%c",i.parseInt(s.substring(i,i+=8),2)));}
if input==compr_code+decompr_code then return 0 else return binary charcodes of input
, Dekompressor-> if input==0 then return compr_code+decompr_code else convert binary codes to characters and return them
. Endergebnis: 1 (niedrigstmöglich). Die Programme werden nicht trivial zu schreiben sein, aber mit einigen Tricks von Quines sind sie sicherlich machbar.