Présentation
Étant donné une image au format PPM (P3) ordinaire en entrée, pour chaque pixel p
de l'image, remplacez chacun des 4 pixels suivants rouge, vert et bleu par la valeur moyenne plancher des canaux respectifs des 4 pixels:
p
lui-mêmeLe pixel situé à
p
l'emplacement de lorsque l'image est retournée verticalementLe pixel situé à
p
l'emplacement de lorsque l'image est retournée horizontalementLe pixel situé à
p
l'emplacement de lorsque l'image est retournée verticalement et horizontalement
Sortez l'image résultante au format PPM (P3).
Pour plus d'explications, considérez cette image 8x8, agrandie à 128x128:
Soit p
le pixel rouge. Pour calculer la nouvelle valeur pour p
(et les 3 pixels bleus), les valeurs de p
et les 3 pixels bleus seront moyennées ensemble:
p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)
Exemples
Implémentation de référence
#!/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])
Ce programme prend un seul nom de fichier en entrée, formaté comme la sortie de pngtopnm <pngfile> -plain
, et génère une seule ligne de données PPM séparées par des espaces.
Une brève description du format P3
Un fichier texte en clair PPM généré à partir de pngtopnm <pngfile> -plain
ressemblera à ceci:
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>
<...>
Il s'agit du format utilisé par les exemples de fichiers d'entrée et de sortie. Cependant, PNM est très vague quant à sa mise en forme - tout espace peut séparer les valeurs. Vous pouvez remplacer tous les retours à la ligne du fichier ci-dessus par un seul espace chacun et conserver un fichier valide. Par exemple, ce fichier et ce fichier sont tous deux valides et représentent la même image. Les seules autres exigences sont que le fichier doit se terminer par un retour à la ligne de fin et qu'il doit y avoir width*height
des triplets RVB après le 255
.
Règles
- C'est le code-golf , donc la solution valide la plus courte l'emporte.
- Vous pouvez entrer et sortir des données PPM formatées de toute manière pratique et cohérente, tant qu'elles sont valides selon le format PPM décrit ci-dessus. La seule exception est que vous devez utiliser le format ordinaire (P3) et non le format binaire (P6).
- Vous devez vérifier que votre solution génère les images correctes pour les images de test ci-dessus.
- Toutes les images auront une profondeur de 8 bits.
Lecture supplémentaire: page wikipedia au format Netpbm