圧縮して印象を与える


8

両方に触発挑戦「ユニークで安いです」によって@Laikoniスコアは挑戦そのものだけでなく、に基づいており、JavaScriptの(ES6)の回答@ETHproductionsのための「回文圧縮」の挑戦彼はかなりクールを使用して、回文フラグ、大文字/小文字の表示、および文字の圧縮方法。

チャレンジ:

2つのプログラム/関数を作成します。圧縮プログラム/関数と解凍プログラム/関数です。

プログラム/関数の圧縮:

独自のソースコードで使用された文字(ソースコードの圧縮と解凍の両方)を可能な入力としてのみ与え、任意の種類のビット圧縮方法を使用して、この入力のビット圧縮の結果0のsと1sを出力します。 。

出力されるビット(0sおよび1s)の量は可能な限り短くする必要があり、この量が回答のスコアになります

アイデアは、独自のソースコードで使用されるさまざまな種類の文字、プログラム/関数のサイズ、および使用したビット圧縮のタイプの間でバランスをとることです。または、このコメントで@RobertFraserを引用するには:

これはエンジニアリングの基本の優れた例です。問題の説明を取り、それを解決するためのさまざまな方法について考え、要件間のトレードオフ(つまり、さまざまなスタイルに割り当てるビット数)を作成するなど

チャレンジルール:

  • 圧縮プログラムと解凍プログラム/関数は、同じプログラミング言語である必要があります。
  • 入力はスコアになるため、圧縮と解凍の両方のプログラム/関数と、両方のプログラム/関数を組み合わせた(連結した)圧縮プログラムの出力の0sと1sの量を提供する必要があります。
  • 圧縮は、明らかに、圧縮プログラムと解凍プログラム/関数の両方のソースコードで使用されているすべての文字に対して、任意の順序または量で機能する必要があります。(ソースコードにない文字については、未定義の動作をする可能性があります。)
  • 入力タイプは必ずしも文字列である必要はありません。文字のリスト/配列/ストリームにすることもでき、プログラムの引数やSTDINなどにすることもできます。呼び出し。
    同じことが出力にも当てはまります。関数から返すか、STDOUTに出力できます。単一の文字列、整数配列などにすることができます。
  • あなたの圧縮プログラムを出力しなければならない、少なくとも1 01(そう空のcat圧縮と解凍プログラムの両方のためのプログラムはできません)。
  • ソースコードには、0sと1sがすでに含まれているだけでなく、no-ops が含まれていない場合があります(デフォルトで独自のソースコードを出力するプログラミング言語では、圧縮プログラムと解凍プログラムの両方を単一0またはにでき1、no-ops部分は未使用のコメントでこの動作を防止するには、ソースコードとして0sと1s のみを使用する、申し訳ありませんがバイナリベースのプログラミング言語)。
  • プログラム/関数で使用される0以上の文字プールの入力をサポートする必要がありますが、空の入力をサポートする必要はありません。したがって、すべての入力が少なくとも1文字であると想定できます。
  • 可能な入力は、圧縮サイズと解凍サイズの合計よりも大きくなる可能性があります。
  • 何らかの理由で圧縮方法が順序に依存し、入力がのDecompressionProgramCompressionProgram代わりに出力が短い場合CompressionProgramDecompressionProgram、スコアのプログラム/関数のコンカッティングのいずれかの順序を選択できます。

例:

圧縮プログラムがABCであり、解凍プログラムがであるとしましょう123aBc。0個以上のcharacter-poolを含む入力の場合、123ABCabこれらの文字を0sおよび1s に正しく圧縮し、これら0のsおよび1sを正しい文字に解凍できる必要があります。これら2つのプログラムの有効な入力例は次のとおりABC123aBcです。A; 1Ca; 22222b1121221b; 等

一般的なルール:

  • 回答には標準ルールが適用されるため、STDIN / STDOUT、関数/メソッド、適切なパラメーター、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストを含むリンクを追加してください。
  • また、必要に応じて説明を追加してください。

答えの例:

Java 8、スコア1440ビット、180(87 + 93)バイト

ここでは、Java 8の非常に悪い実装で、各文字は単に8ビットのバイナリ文字列として出力されます。

圧縮機能:

として提供される入力java.util.stream.IntStream

s->s.forEach(c->System.out.print("".format("%8s",Long.toString(c,2)).replace(' ','0')))

オンラインでお試しください。

減圧機能:

として提供される入力String

s->{for(Integer i=0;i<s.length();System.out.printf("%c",i.parseInt(s.substring(i,i+=8),2)));}

オンラインでお試しください。


これはクインテストではないので、ソースコードを読むことはできますか?
Weijun Zhou

@WeijunZhouは使用目的によって異なりますが、ほとんどの場合は許可します。ソースコードを読んで、その文字をルックアップテーブルなどで簡単にマッピングしたいと思いますか?
Kevin Cruijssen

はい、似たようなことが私の心にあります。
Weijun Zhou、2018

1
私は何かを見逃したかもしれませんが、ここにルールの抜け穴の可能性があります:コンプレッサー-> if input==compr_code+decompr_code then return 0 else return binary charcodes of input、デコンプレッサー-> if input==0 then return compr_code+decompr_code else convert binary codes to characters and return them。最終スコア:1(最低)。プログラムを書くのは簡単ではありませんが、クインからのいくつかのトリックがあれば、確実に実行できます。
レオ

@Leoうーん、あなたは確かにあなたは現在のルールがそのような答えを許可しているのは確かです(もちろん、意図せずに)。しかし、それを修正する方法がわからない..私は、個々の文字ごとに使用したマッピングを提供する必要があると述べることができます。これは、コンプレッサー+解凍器の入力とこれらの文字のランダム構成に対応/同じでなければなりません。しかし、その場合、文字のペア、またはそれらが思いつくものすべてを圧縮したい可能性のある回答を制限する可能性があります。このループホールを閉じるためのルールに関する提案はありますが、それでも創造性のために柔軟性を残しますか?..
Kevin Cruijssen

回答:


2

ゼリー、スコア350、39 + 30 = 69バイト

コンプレッサー:ゼリー、39バイト

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

オンラインでお試しください!

デコンプレッサ:ゼリー、30バイト

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

オンラインでお試しください!


@KevinCruijssenおっと。修正、ありがとう
HyperNeutrino 2018年

1
@KevinCruijssenああ、笑 修正してくれてありがとう!
HyperNeutrino 2018年

2

Java(OpenJDK 9)、スコア702ビット、88(42 + 46)バイト

コンプレッサー、42バイト

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

オンラインでお試しください!

圧縮解除プログラム、46バイト

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

オンラインでお試しください!


申し訳ありませんが、ハード圧縮ではなく低バイトコスト(Javaの場合はハム)を再生しています:S
OlivierGrégoireMar

でも、いずれかを置くことができた知っていませんでしたStringBigInteger、それはNumberFormatExceptionがまたは何かを与えると考えました..コンストラクタ..私は知っていました.toString(2)。私の例のいいゴルフは答えだと思います。;)
Kevin Cruijssen

@KevinCruijssen確かに、現在のように、それは他の何よりもあなたの模範のゴルフです。703ビットは88バイトを意味します。今のところ、88バイト未満の圧縮はできませんでしたが、それでも圧縮を試みています;-)
OlivierGrégoireMar

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.