Paeth変換配列


8

PNGの圧縮アルゴリズムの重要な部分の1つはPaeth変換です。これは、(通常)より適切に圧縮されるように画像を変換します。この課題の課題は、ペース変換を計算するプログラムを作成することです。ペース変換の操作を以下に説明します。

ペースの変容

Paeth変換Xは、2次元配列の各メンバーから予測子を差し引きます。予測は、左(のアレイメンバーの元素であるA)、上部(B)、および左上(C)のXその値に対して最小の差を有しますA + B - C

┼─┼─┼
│C│B│
┼─┼─┼
│A│X│
┼─┼─┼

いずれかがABまたはがC、範囲外となり、その値はここでは0に置き換えられてからの擬似コードであるPNGの仕様この予測値を計算する方法を概説:

function PaethPredictor (a, b, c)
begin
     ; a = left, b = above, c = upper left
     p := a + b - c        ; initial estimate
     pa := abs(p - a)      ; distances to a, b, c
     pb := abs(p - b)
     pc := abs(p - c)
     ; return nearest of a,b,c,
     ; breaking ties in order a,b,c.
     if pa <= pb AND pa <= pc then return a
     else if pb <= pc then return b
     else return c
end

この課題では、配列のメンバーは0〜255の範囲の自然数です。Paeth変換の結果がその範囲外の値になる場合は、256を法としてその範囲の値に削減されます。

入出力

入力は、2から1023の範囲の2つの整数xyで、変換する行列の幅と高さ、およびx × y要素の配列を示します。入力は、改行で終了する1つの空白文字で区切られた10進数としてフォーマットされます。この入力は次のようになります。

2 3 4 5 6 7 8 9

これは、エントリを持つ2 x 3の行列を表します。

4 5
6 7
8 9

出力は、数字が任意のゼロ以外の量の空白文字(スペース、水平または垂直タブ、ラインまたはフォームフィード)で区切られ、任意の量の空白文字。

入力はから受信されstdin、出力はに送信されstdoutます。これが不可能な場合は、入力のハードコーディングではない、入力の受信と出力の書き込みの別の方法を選択してください。

無効な入力が提示されたときのプログラムの動作は、この課題の一部ではありません。

審査と参照の実装

ANSI Cプログラム、サンプル入力を生成し、インスタンスを解決し、ソリューションを検証するために提供されています。プログラム呼び出しgGと、enerate入力s入力インスタンスをOLVEととvV液の正確さをerify。

参照実装に問題があると思われる場合は、できるだけ早く修正できるようにお知らせください。

入力と出力の例

ご要望によります。

10 5 166 156 108 96 63 227 122 99 117 135 125 46 169 247 116 55 151 1 232 114 214 254 6 127 217 88 206 102 252 237 75 250 202 145 86 198 172 84 68 114 58 228 66 224 186 217 210 108 11 179

配列を表す

166 156 108  96  63 227 122  99 117 135
125  46 169 247 116  55 151   1 232 114
214 254   6 127 217  88 206 102 252 237
 75 250 202 145  86 198 172  84  68 114
 58 228  66 224 186 217 210 108  11 179

に変換されます

166 246 208 244 223 164 151 233  18  18
215 177 123  78 125  84  96 135 231 138
 89 129   8 121 101 228  55 101  20 123
117 175 196 199 125 112 222 238  72  46
239 234 120 158  41  19  12  24 183 111

これは次のようにエンコードされます

10 5 166 246 208 244 223 164 151 233 18 18 215 177 123 78 125 84 96 135 231 138 89 129 8 121 101 228 55 101 20 123 117 175 196 199 125 112 222 238 72 46 239 234 120 158 41 19 12 24 183 111

勝利条件

この課題のために、入力の正しいPaeth変換を生成してそれらを書き出すプログラムを作成します。これはコードゴルフであり、ソースコードの文字数が最も少ないプログラムが勝ちます。他の人がそれが何をするかを見ることができるように、あなたの提出物に説明とあなたのコードの読みやすいバージョンを添付してみてください。


1
ペース変換がその範囲外の値になる場合」とはどういう意味ですか?結果は常に範囲内にある3つの要素のセットから取得されるため、これは不可能な場合をカバーしているようです。
Peter Taylor

@PeterTaylor Paeth変換は、各配列メンバーについて、そのメンバーの値とそのメンバーの予測子との差であり、負になる場合があります。
FUZxxl 2015

@MartinBüttnerコピー編集をすり抜けたに違いない。
FUZxxl 2015

1
@FUZxxl:真実。ほんの少し前まで、それについての普遍的な合意がないことに気づかなかった。しかし、それは余談でした。いい挑戦だ。
Alex A.

3
ところで、質問を投稿していただきありがとうございます。3000!(削除およびロックされた質問は含まれません。)
マーティンエンダー

回答:


3

J-77文字

FUZxxlの答えとは異なるように見えますが、実際には非常によく似たアプローチをとっています。

1!:2&4":2({.,|.@{.,@(256|$-0(0{[/:+`-/|@-])"1@|:(-#:1 2 3)|.!.0$)}.)0".1!:1]3

興味深い部分についてのいくつかのコメント。

  • 1!:2&4":(...)0".1!:1]3-JがI / Oと解析についてひどくなかった場合、これを使用してリファクタリングし&.".&.stdin''、3文字を節約できます。しかし、そうすることはできません。大切なキャラクターたち、安らかに眠れ。
  • 2 ({.,|.@{.,@( ... stuff using $ ... )}.)-これは入力を逆アセンブルし、出力を再アセンブルします。$の入力への参照と、入力stuff using $を実行する前に入力に対して実行する必要がある操作の両方を使用stuffします。
  • 0( blah )"1@|:-はい、これは2項転置です。3つの回転結果を最も内側の配列軸として再グループ化し、Paethロジックがで各セットに個別に適用できるようにし"1ます。
  • 0{[/:+`-/|@-]-Paethロジック:(それぞれのマイナス)のa,b,c大きさで並べ替え、最初のものを使用します。pa,b,c

これは本当にすてきです。
FUZxxl 2015

2

J、97 91 88 87文字

これを始めましょう。欠席に注意してくださいexit。Jは、すべての出力が書き込まれた後にプロンプ​​ト(3つのブランク)を出力しますが、EOFをオンstdinにして終了させます。

このコードではかなりの数の改善が可能だと思います。

1!:2&4":(|.@$,,)256|((-+`-/+[:(>&|{,)"0/]-"2+`-/)(3 2$-*i.3)|.!.0])2(|.@{.$}.)0".1!:1]3

ゴルフ前のコードは次のとおりです。ほとんどは現在のコードと同じです。

NB. A, B, and C values
abc =: (0 _1 , _1 0 ,: _1 _1)&(|.!.0)
p =: +`-/@abc
NB. minimum of magnitudes
mmin =: (>&| { ,)"0
pred =: p + [: mmin/ abc -"2 2 p
paeth =: 256 | ] - pred
input =: [: (2&}. $~ 2 |.@{. ]) 0 ". 1!:1
output =: [: 1!:2&4 LF ,~ [: ": |.@$ , ,
output paeth input 3
exit 0

このコードは誤った出力を提供します:3 2$-*i:3と同等ではありません0 _1,_1 0,:_1 _1
algorithmhark

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