Ikhtisar
Diberikan gambar dalam format PPM (P3) polos sebagai input, untuk setiap piksel pdalam gambar, ganti masing-masing merah, hijau, dan biru 4 piksel berikut dengan nilai rata-rata lantai dari saluran masing-masing dari 4 piksel:
pdiriPixel terletak di
plokasi ketika gambar dibalik secara vertikalPixel terletak di
plokasi ketika gambar dibalik secara horizontalPixel terletak di
plokasi ketika gambar dibalik secara vertikal dan horizontal
Keluarkan gambar yang dihasilkan dalam format PPM (P3) polos.
Untuk penjelasan lebih lanjut, pertimbangkan gambar 8x8 ini, diperbesar menjadi 128x128:

Membiarkan pmenjadi piksel merah. Untuk menghitung nilai baru untuk p(dan 3 piksel biru), nilai pdan 3 piksel biru akan dirata-ratakan bersama-sama:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Contohnya




Implementasi Referensi
#!/usr/bin/python
import sys
from itertools import *
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return list(izip_longest(*args, fillvalue=fillvalue))
def flatten(lst):
return sum(([x] if not isinstance(x, list) else flatten(x) for x in lst), [])
def pnm_to_bin(p):
w,h = map(int,p[1].split(' '))
data = map(int, ' '.join(p[3:]).replace('\n', ' ').split())
bin = []
lines = grouper(data, w*3)
for line in lines:
data = []
for rgb in grouper(line, 3):
data.append(list(rgb))
bin.append(data)
return bin
def bin_to_pnm(b):
pnm = 'P3 {} {} 255 '.format(len(b[0]), len(b))
b = flatten(b)
pnm += ' '.join(map(str, b))
return pnm
def imageblender(img):
h = len(img)
w = len(img[0])
for y in range(w):
for x in range(h):
for i in range(3):
val = (img[x][y][i] + img[x][~y][i] + img[~x][y][i] + img[~x][~y][i])//4
img[x][y][i],img[x][~y][i],img[~x][y][i],img[~x][~y][i] = (val,)*4
return img
def main(fname):
bin = pnm_to_bin(open(fname).read().split('\n'))
bin = imageblender(bin)
return bin_to_pnm(bin)
if __name__ == '__main__':
print main(sys.argv[1])
Program ini mengambil nama file tunggal sebagai input, diformat seperti output pngtopnm <pngfile> -plain, dan output satu baris data PPM yang dipisahkan oleh spasi.
Penjelasan Singkat tentang Format P3
File plaintext PPM yang dihasilkan pngtopnm <pngfile> -plainakan terlihat seperti ini:
P3
<width in pixels> <height in pixels>
<maximum value as defined by the bit depth, always 255 for our purposes>
<leftmost 24 pixels of row 1, in RGB triples, space-separated; like (0 0 0 1 1 1 ...)>
<next 24 pixels of row 1>
<...>
<rightmost (up to) 24 pixels of row 1>
<leftmost 24 pixels of row 2>
<next 24 pixels of row 2>
<...>
<rightmost (up to) 24 pixels of row 2>
<...>
Ini adalah format yang digunakan oleh file input dan output contoh. Namun, PNM sangat longgar tentang pemformatannya - spasi apa pun dapat memisahkan nilai. Anda dapat mengganti semua baris baru dalam file di atas dengan masing-masing satu ruang, dan masih memiliki file yang valid. Misalnya, file ini dan file ini sama-sama valid, dan mewakili gambar yang sama. Satu-satunya persyaratan lain adalah bahwa file harus diakhiri dengan baris baru, dan harus ada width*heighttriplet RGB yang mengikuti 255.
Aturan
- Ini adalah kode-golf , sehingga solusi terpendek yang valid menang.
- Anda dapat memasukkan dan mengeluarkan data PPM yang diformat dengan cara apa pun yang nyaman dan konsisten, asalkan valid sesuai dengan format PPM yang dijelaskan di atas. Satu-satunya pengecualian adalah Anda harus menggunakan format biasa (P3), dan bukan format biner (P6).
- Anda harus memberikan verifikasi bahwa solusi Anda menghasilkan gambar yang benar untuk gambar uji di atas.
- Semua gambar akan memiliki kedalaman 8 bit.
Bacaan ekstra: halaman wikipedia format Netpbm











