Zum Beeindrucken komprimieren

8

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 0s und 1s 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 ( 0s und 1s) 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 0s und 1s, 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 0oder ausgeben 1(daher ist ein leeres catProgramm sowohl für das Komprimierungs- als auch für das Dekomprimierungsprogramm nicht möglich).
  • Ihr Quellcode enthält möglicherweise nicht nur bereits 0s und 1s, ausgenommen No-Ops (um zu verhindern, dass Programmiersprachen standardmäßig ihren eigenen Quellcode drucken, wobei sowohl das Komprimierungs- als auch das Dekomprimierungsprogramm ein einzelnes 0oder sein 1können und der No-Ops-Teil ist um dieses Verhalten mit einem nicht verwendeten Kommentar zu verhindern (sorry, binärbasierte Programmiersprachen, die nur 0s und 1s 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 DecompressionProgramCompressionProgramanstelle der Eingabe erfolgt CompressionProgramDecompressionProgram, können Sie für Ihre Partitur eine der beiden Reihenfolge der Verkettung Ihrer Programme / Funktionen auswählen.

Beispiel:

Angenommen, das Komprimierungsprogramm ist ABCund 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 0s und 1s zu komprimieren und diese 0s und 1s 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')))

Probieren Sie es online aus.

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)));}

Probieren Sie es online aus.

Kevin Cruijssen
quelle
Dies ist kein Quine-Test. Kann ich meinen Quellcode lesen?
Weijun Zhou
@WeijunZhou Kommt darauf an, wofür du es verwendest, aber ich erlaube es wahrscheinlich in den meisten Fällen. Ich denke, Sie möchten Ihren Quellcode lesen und dann die Zeichen einfach mit einer Nachschlagetabelle abbilden, oder so ähnlich?
Kevin Cruijssen
Ja, etwas Ähnliches ist in meinem Kopf.
Weijun Zhou
1
Ich habe vielleicht etwas verpasst, aber hier ist eine mögliche Lücke in den Regeln: Kompressor-> 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.
Leo
@Leo Hmm, Sie haben in der Tat Recht, dass die aktuellen Regeln eine solche Antwort zulassen (natürlich ungewollt). Ich bin mir jedoch nicht sicher, wie ich das Problem beheben soll. Ich könnte sagen, dass Sie die Zuordnung angeben müssen, die Sie für jedes einzelne Zeichen verwendet haben. Diese muss für die Eingabe von Kompressor + Dekomprimierer sowie für jede zufällige Konfiguration dieser Zeichen gleich sein. Aber in diesem Fall könnte ich mögliche Antworten einschränken, die Zeichenpaare komprimieren möchten, oder was auch immer sie sich einfallen lassen. Irgendwelche Vorschläge zu einer Regel, um diese Lücke zu schließen, aber dennoch etwas Flexibilität für Kreativität zu lassen? ..
Kevin Cruijssen

Antworten:

2

Gelee, Punktzahl 350, 39 + 30 = 69 Bytes

Kompressor: Gelee , 39 Bytes

“iЀ;⁴⁾¤8Bz0ZUṖFs5Ḅị”;⁾“”¤iЀ;⁴BUz0ZUṖF

Probieren Sie es online aus!

Dekompressor: Gelee , 30 Bytes

s5Ḅị“iЀ;⁴⁾¤8Bz0ZUṖFs5Ḅị”;⁾“”¤

Probieren Sie es online aus!

HyperNeutrino
quelle
@ KevinCruijssen whoops. behoben, danke
HyperNeutrino
1
@ KevinCruijssen oh ich bin schlecht lol. danke für die Fehlerbehebung!
HyperNeutrino
2

Java (OpenJDK 9) , Punktzahl 702 Bit, 88 (42 + 46) Bytes

Kompressor, 42 Bytes

$->new java.math.BigInteger($).toString(2)

Probieren Sie es online aus!

Dekomprimierer, 46 Bytes

$->new java.math.BigInteger($,2).toByteArray()

Probieren Sie es online aus!

Olivier Grégoire
quelle
Entschuldigung, ich spiele eher die niedrigen Bytekosten ( Brummen , für Java meine ich) als die harte Komprimierung: S
Olivier Grégoire
Ich wusste nicht einmal, dass es möglich ist, irgendetwas Stringin den BigIntegerKonstruktor einzufügen. Ich dachte, es würde eine NumberFormatException oder so etwas geben. Ich wusste über das Bescheid .toString(2). Nettes Golf meiner Beispielantwort, denke ich. ;)
Kevin Cruijssen
@ KevinCruijssen In der Tat ist es, wie es derzeit ist, mehr ein Golf Ihres Beispiels als alles andere. 703 Bit bedeuten 88 Bytes. Ich konnte bisher nichts in weniger als 88 Bytes komprimieren, aber ich versuche es immer noch ;-)
Olivier Grégoire