両方に触発挑戦「ユニークで安いです」によって@Laikoniスコアは挑戦そのものだけでなく、に基づいており、JavaScriptの(ES6)の回答の@ETHproductionsのための「回文圧縮」の挑戦彼はかなりクールを使用して、回文フラグ、大文字/小文字の表示、および文字の圧縮方法。
チャレンジ:
2つのプログラム/関数を作成します。圧縮プログラム/関数と解凍プログラム/関数です。
プログラム/関数の圧縮:
独自のソースコードで使用された文字(ソースコードの圧縮と解凍の両方)を可能な入力としてのみ与え、任意の種類のビット圧縮方法を使用して、この入力のビット圧縮の結果0
のsと1
sを出力します。 。
出力されるビット(0
sおよび1
s)の量は可能な限り短くする必要があり、この量が回答のスコアになります。
アイデアは、独自のソースコードで使用されるさまざまな種類の文字、プログラム/関数のサイズ、および使用したビット圧縮のタイプの間でバランスをとることです。または、このコメントで@RobertFraserを引用するには:
これはエンジニアリングの基本の優れた例です。問題の説明を取り、それを解決するためのさまざまな方法について考え、要件間のトレードオフ(つまり、さまざまなスタイルに割り当てるビット数)を作成するなど
チャレンジルール:
- 圧縮プログラムと解凍プログラム/関数は、同じプログラミング言語である必要があります。
- 入力はスコアになるため、圧縮と解凍の両方のプログラム/関数と、両方のプログラム/関数を組み合わせた(連結した)圧縮プログラムの出力の
0
sと1
sの量を提供する必要があります。 - 圧縮は、明らかに、圧縮プログラムと解凍プログラム/関数の両方のソースコードで使用されているすべての文字に対して、任意の順序または量で機能する必要があります。(ソースコードにない文字については、未定義の動作をする可能性があります。)
- 入力タイプは必ずしも文字列である必要はありません。文字のリスト/配列/ストリームにすることもでき、プログラムの引数やSTDINなどにすることもできます。呼び出し。
同じことが出力にも当てはまります。関数から返すか、STDOUTに出力できます。単一の文字列、整数配列などにすることができます。 - あなたの圧縮プログラムを出力しなければならない、少なくとも1
0
か1
(そう空のcat
圧縮と解凍プログラムの両方のためのプログラムはできません)。 - ソースコードには、
0
sと1
sがすでに含まれているだけでなく、no-ops が含まれていない場合があります(デフォルトで独自のソースコードを出力するプログラミング言語では、圧縮プログラムと解凍プログラムの両方を単一0
またはにでき1
、no-ops部分は未使用のコメントでこの動作を防止するには、ソースコードとして0
sと1
s のみを使用する、申し訳ありませんがバイナリベースのプログラミング言語)。 - プログラム/関数で使用される0以上の文字プールの入力をサポートする必要がありますが、空の入力をサポートする必要はありません。したがって、すべての入力が少なくとも1文字であると想定できます。
- 可能な入力は、圧縮サイズと解凍サイズの合計よりも大きくなる可能性があります。
- 何らかの理由で圧縮方法が順序に依存し、入力がの
DecompressionProgramCompressionProgram
代わりに出力が短い場合CompressionProgramDecompressionProgram
、スコアのプログラム/関数のコンカッティングのいずれかの順序を選択できます。
例:
圧縮プログラムがABC
であり、解凍プログラムがであるとしましょう123aBc
。0個以上のcharacter-poolを含む入力の場合、123ABCab
これらの文字を0
sおよび1
s に正しく圧縮し、これら0
のsおよび1
sを正しい文字に解凍できる必要があります。これら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)));}
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(最低)。プログラムを書くのは簡単ではありませんが、クインからのいくつかのトリックがあれば、確実に実行できます。