Überblick
Ersetzen Sie bei einem Bild im PPM-Format (P3) als Eingabe für jedes Pixel p
im Bild die folgenden 4 Pixel (rot, grün und blau) durch den bodenebenen Durchschnittswert der jeweiligen Kanäle aller 4 Pixel:
p
selbstDas Pixel an
p
der Position, an der sich das Bild befindet, wenn es vertikal gespiegelt wirdDas Pixel an
p
der Position, an der sich das Bild befindet, wenn es horizontal gespiegelt wirdDas Pixel an
p
der Position, an der sich das Bild befindet, wenn es vertikal und horizontal gespiegelt wird
Das resultierende Bild wird im PPM-Format (P3) ausgegeben.
Betrachten Sie zur weiteren Erläuterung das auf 128x128 vergrößerte 8x8-Bild:
Sei p
das rote Pixel. Um den neuen Wert für p
(und die 3 blauen Pixel) zu berechnen , werden die Werte von p
und die 3 blauen Pixel zusammen gemittelt:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Beispiele
Referenzimplementierung
#!/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])
Dieses Programm verwendet einen einzelnen Dateinamen als Eingabe, der wie die Ausgabe von formatiert ist pngtopnm <pngfile> -plain
, und gibt eine einzelne durch Leerzeichen getrennte Zeile mit PPM-Daten aus.
Eine kurze Beschreibung des P3-Formats
Eine PPM-Klartextdatei, die aus generiert wurde pngtopnm <pngfile> -plain
, sieht folgendermaßen aus:
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>
<...>
Dies ist das Format, das die Beispiel-Eingabe- und Ausgabedateien verwenden. Allerdings PNM ist sehr locker über seine Formatierung - jede Leerzeichen kann Werte trennen. Sie können alle Zeilenumbrüche in der obigen Datei durch jeweils ein Leerzeichen ersetzen und dennoch eine gültige Datei haben. Zum Beispiel diese Datei und diese Datei sind beide gültig und repräsentieren das gleiche Bild. Die einzige andere Voraussetzung ist, dass die Datei mit einem abschließenden Zeilenumbruch endet und dass nach dem Zeilenumbruch width*height
RGB-Triplets folgen 255
.
Regeln
- Dies ist Code-Golf , also gewinnt die kürzeste gültige Lösung.
- Sie können PPM-Daten eingeben und ausgeben, die auf eine bequeme und konsistente Weise formatiert sind, solange sie gemäß dem oben beschriebenen PPM-Format gültig sind. Die einzige Ausnahme ist, dass Sie das einfache Format (P3) und nicht das binäre Format (P6) verwenden müssen.
- Sie müssen überprüfen, ob Ihre Lösung die richtigen Bilder für die obigen Testbilder ausgibt.
- Alle Bilder haben eine Bittiefe von 8 Bit.
Zusätzliche Lektüre: Wikipedia-Seite im Netpbm-Format