Panoramica
Data un'immagine in formato PPM (P3) semplice come input, per ciascun pixel pnell'immagine, sostituisci ciascuno dei seguenti 4 pixel in rosso, verde e blu con il valore medio pavimentato dei rispettivi canali di tutti e 4 i pixel:
psiIl pixel situato nella
pposizione dell 'immagine quando l'immagine viene capovolta verticalmenteIl pixel situato nella
pposizione dell 'immagine quando l'immagine viene capovolta orizzontalmenteIl pixel situato nella
pposizione dell 'immagine quando l'immagine viene capovolta sia in verticale che in orizzontale
Stampa l'immagine risultante in formato PPM (P3) semplice.
Per ulteriori spiegazioni, considera questa immagine 8x8, ingrandita a 128x128:

Lascia che psia il pixel rosso. Per calcolare il nuovo valore per p(e i 3 pixel blu), i valori di pe dei 3 pixel blu saranno calcolati insieme in media:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Esempi




Implementazione di riferimento
#!/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])
Questo programma utilizza un singolo nome file come input, formattato come l'output di pngtopnm <pngfile> -plaine genera una singola riga di dati PPM separati da spazi.
Una breve descrizione del formato P3
Un file in testo semplice PPM generato da pngtopnm <pngfile> -plainsarà simile al seguente:
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>
<...>
Questo è il formato utilizzato dai file di input e output di esempio. Tuttavia, PNM è molto libero riguardo alla sua formattazione: qualsiasi spazio bianco può separare i valori. È possibile sostituire tutte le nuove righe nel file sopra con un singolo spazio ciascuna e avere comunque un file valido. Ad esempio, questo file e questo file sono entrambi validi e rappresentano la stessa immagine. Gli unici altri requisiti sono che il file deve terminare con una nuova riga finale e che devono essere presenti width*heightterzine RGB 255.
Regole
- Questo è code-golf , quindi vince la soluzione valida più breve.
- È possibile immettere e produrre dati PPM formattati in qualsiasi modo conveniente e coerente, purché sia valido secondo il formato PPM sopra descritto. L'unica eccezione è che è necessario utilizzare il formato normale (P3) e non il formato binario (P6).
- È necessario fornire la verifica che la soluzione fornisca le immagini corrette per le immagini di prova sopra riportate.
- Tutte le immagini avranno una profondità di 8 bit.
Letture extra: pagina Wikipedia in formato Netpbm











