バックグラウンド
PICASCIIは、画像をASCIIアートに変換するきちんとしたツールです。
次の10個のASCII文字を使用して、さまざまな明るさを実現します。
@#+';:,.`
これらの文字(文字要素)の明るさは1(アットマーク)から10(スペース)までです。
以下に、正しいフォントで表示された小さなコード、ウェールズの旗、オーバーハンドフラクタル、大きなマス、小さなゴルフの変換結果を示します。
このフィドルの画像を表示して、Googleドライブからダウンロードできます。
仕事
PICASCIIの最終結果は視覚的には満足のいくものですが、合計5つの画像の重量は153,559バイトです。品質の一部を犠牲にする場合、これらの画像をどれだけ圧縮できますか?
あなたの仕事は、上記のようなASCIIアートイメージと最低品質を入力として受け入れ、完全なプログラムまたは単一の文字列を返す関数の形式で、イメージの非可逆圧縮を印刷するプログラムを作成することです。品質要件。
これは、別個の解凍プログラムを作成できないことを意味します。各圧縮イメージに組み込まれている必要があります。
元の画像は、1〜10の明るさの文字で構成され、同じ長さの行に改行で区切られます。圧縮されたイメージは同じサイズで、同じ文字セットを使用する必要があります。
n個の charxelsで構成される非圧縮画像の場合、画像の圧縮バージョンの品質は次のように定義されます。
ここで、cは私の輝度であるI 番目の圧縮された画像の出力のcharxel及びU Iの輝度I 番目の非圧縮の画像のcharxel。
得点
コードは、入力として上記の5つの画像を使用して実行され、各画像の最小品質設定は0.50、0.60、0.70、0.80、0.90です。
スコアは、すべての圧縮画像のサイズの幾何平均です。つまり、25個すべての圧縮画像の長さの積の25番目のルートです。
最低スコアが勝ちます!
追加のルール
コードは、スコアリングに使用される画像だけでなく、任意の画像に対して機能する必要があります。
テストケースに向けてコードを最適化することが期待されますが、任意の画像を圧縮しようとさえしないプログラムは、私から賛成を得ることはありません。
コンプレッサーは、組み込みのバイトストリームコンプレッサー(gzipなど)を使用する場合がありますが、圧縮イメージ用に自分で実装する必要があります。
通常、バイトストリームデコンプレッサ(ベース変換、ランレングスデコードなど)で使用されるブリットインが許可されます。
圧縮プログラムと圧縮イメージは同じ言語である必要はありません。
ただし、すべての圧縮画像に対して単一の言語を選択する必要があります。
各圧縮画像には、標準コードのゴルフ規則が適用されます。
検証
CJamスクリプトを作成して、すべての品質要件を簡単に検証し、提出のスコアを計算しました。
Javaインタープリターは、こちらまたはこちらからダウンロードできます。
e# URLs of the uncompressed images.
e# "%s" will get replaced by 1, 2, 3, 4, 5.
"file:///home/dennis/codegolf/53199/original/image%s.txt"
e# URLs of the compressed images (source code).
e# "%s-%s" will get replaced by "1-50", "1-60", ... "5-90".
"file:///home/dennis/codegolf/53199/code/image%s-%s.php"
e# URLs of the compressed images (output).
"file:///home/dennis/codegolf/53199/output/image%s-%s.txt"
e# Code
:O;:C;:U;5,:)
{
5,5f+Af*
{
C[IQ]e%g,X*:X;
ISQS
[U[I]e%O[IQ]e%]
{g_W=N&{W<}&}%
_Nf/::,:=
{
{N-"@#+';:,.` "f#}%z
_::m2f#:+\,81d*/mq1m8#
_"%04.4f"e%S
@100*iQ<"(too low)"*
}{
;"Dimension mismatch."
}?
N]o
}fQ
}fI
N"SCORE: %04.4f"X1d25/#e%N
例
Bash→PHP、スコア30344.0474
cat
すべての入力に対して100%の品質を実現します。
$ java -jar cjam-0.6.5.jar vrfy.cjam 1 50 1.0000 1 60 1.0000 1 70 1.0000 1 80 1.0000 1 90 1.0000 2 50 1.0000 2 60 1.0000 2 70 1.0000 2 80 1.0000 2 90 1.0000 3 50 1.0000 3 60 1.0000 3 70 1.0000 3 80 1.0000 3 90 1.0000 4 50 1.0000 4 60 1.0000 4 70 1.0000 4 80 1.0000 4 90 1.0000 5 50 1.0000 5 60 1.0000 5 70 1.0000 5 80 1.0000 5 90 1.0000 SCORE: 30344.0474