फ्लिप इट, फ्लॉप इट, मीन इट


24

अवलोकन

इनपुट के रूप में सादे पीपीएम (पी 3) प्रारूप में एक छवि को देखते हुए, छवि में प्रत्येक पिक्सेल pके लिए, निम्नलिखित 4 पिक्सेल के लाल, हरे और नीले रंग में से प्रत्येक को 4 पिक्सेल के संबंधित चैनलों के फ्लोर्ड औसत मान से बदलें:

  1. p अपने आप

  2. pजब छवि लंबवत रूप से फ़्लिप की जाती है, तो पिक्सेल स्थित है

  3. pजब छवि क्षैतिज रूप से फ़्लिप की जाती है, तो पिक्सेल स्थित है

  4. pछवि के लंबवत और क्षैतिज रूप से फ़्लिप किए जाने पर पिक्सेल स्थित है

परिणामी छवि को सादे PPM (P3) प्रारूप में आउटपुट करें।

आगे की व्याख्या के लिए, इस 8x8 छवि पर विचार करें, जिसे 128x128 तक बढ़ाया गया है:

चरण 2 उदाहरण

pलाल पिक्सेल होने दें । p(और 3 ब्लू पिक्सल्स) के नए मूल्य की गणना करने के लिए, और 3 ब्लू पिक्सलों के मूल्यों को pएक साथ औसत किया जाएगा:

p1 = (255, 0, 0)
p2 = (0, 0, 255)
p3 = (0, 0, 255)
p4 = (0, 0, 255)
p_result = (63, 0, 191)

उदाहरण

पीपीएम: इनपुट , आउटपुट


पीपीएम: इनपुट , आउटपुट


पीपीएम: इनपुट , आउटपुट


पीपीएम: इनपुट , आउटपुट


संदर्भ कार्यान्वयन

#!/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])

यह प्रोग्राम इनपुट के रूप में एक एकल फ़ाइल नाम लेता है, के आउटपुट की तरह स्वरूपित pngtopnm <pngfile> -plain, और रिक्त स्थान से अलग पीपीएम डेटा की एक पंक्ति को आउटपुट करता है।


P3 प्रारूप का एक संक्षिप्त विवरण

इससे उत्पन्न एक PPM सादा फ़ाइल pngtopnm <pngfile> -plainइस तरह दिखाई देगी:

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>

<...>

यह वह प्रारूप है जिसका उदाहरण इनपुट और आउटपुट फाइल उपयोग करते हैं। हालांकि, पीएनएम अपने स्वरूपण के बारे में बहुत ढीला है - कोई भी व्हाट्सएप अलग-अलग मान हो सकता है। आप उपरोक्त फ़ाइल की सभी नई सूचियों को एक ही स्थान से बदल सकते हैं, और फिर भी एक मान्य फ़ाइल रख सकते हैं। उदाहरण के लिए, यह फ़ाइल और यह फ़ाइल दोनों मान्य हैं, और समान छवि का प्रतिनिधित्व करते हैं। केवल अन्य आवश्यकताएं हैं कि फ़ाइल एक अनुगामी न्यूलाइन के साथ समाप्त होनी चाहिए, और width*heightनिम्नलिखित के बाद RGB ट्रिपल होनी चाहिए 255


नियम

  • यह , इसलिए सबसे छोटा वैध समाधान जीतता है।
  • आप इनपुट और आउटपुट पीपीएम डेटा को किसी भी सुविधाजनक और सुसंगत तरीके से स्वरूपित कर सकते हैं, इसलिए जब तक यह ऊपर वर्णित पीपीएम प्रारूप के अनुसार मान्य है। एकमात्र अपवाद यह है कि आपको सादे (P3) प्रारूप का उपयोग करना चाहिए, न कि बाइनरी (P6) प्रारूप का।
  • आपको यह सत्यापित करना होगा कि आपका समाधान उपरोक्त परीक्षण छवियों के लिए सही छवियों को आउटपुट करता है।
  • सभी छवियों में 8 बिट की गहराई होगी।

अतिरिक्त पढ़ने: Netpbm प्रारूप विकिपीडिया पृष्ठ


परीक्षण स्निपेट (इसके लिए केल्विन के शौक के लिए धन्यवाद)


क्या इमेज लाइब्रेरी जो पीपीएम फाइलों को खोलने / सहेजने की अनुमति देती हैं?
केल्विन के शौक

@ केल्विन हॉबीज हां
मेगो

3
" इसे फ्लिप करें, इसे फ्लॉप करें, यह औसत है " youtube.com/watch?v=D8K90hX4PrE
लुइस मेंडो

3
शायद "इसे फ्लिप करें, इसे फ्लॉप करें, इसका मतलब है"?
कॉनर ओ'ब्रायन

2
@ C @O'Bʀɪᴇɴ जो किसी पार्टी की तरह लगता है- ओह, रुको, लुइस ने क्या पोस्ट किया।
Addison Crump

जवाबों:


4

अजगर, 30 29 बाइट्स

zjms.OdC.nM[JrR7.zKm_cd3J_J_K

मेरा कार्यक्रम पहली पंक्ति पर सभी मेटाडेटा, और स्टड के बाद लाइनों पर पंक्ति द्वारा छवि डेटा पंक्ति की अपेक्षा करता है। मदद करने के लिए, यह किसी भी छोटे PPM फाइल को PPM फाइल में बदलने के लिए एक छोटा पायथन प्रोग्राम है जिसे मेरा प्रोग्राम समझ सकता है:

import sys
p3, w, h, d, *data = sys.stdin.read().split()
print(p3, w, h, d)
for i in range(0, int(w) * int(h), int(w)):
    print(" ".join(data[i:i+int(w)]))

एक बार जब आप छवि डेटा पंक्ति को पंक्ति द्वारा संचालित करते हैं तो ऑपरेशन वास्तव में सरल होते हैं। पहले मैंने छवि डेटा को पूर्णांकों की सूची की सूची में पढ़ा ( JrR7.z), फिर मैं हर 3 पूर्णांकों को समूहीकृत करके और उन्हें प्रत्येक पंक्ति के लिए उल्टा करके क्षैतिज रूप से प्रतिबिंबित संस्करण बनाता हूं Km_cd3J। तब वर्टिकल मिरर किए गए वर्जन बस हैं _J_K, क्योंकि हम सिर्फ पंक्तियों को रिवर्स कर सकते हैं।

मैं उन सभी मैट्रिक्स को लेता हूं, उनमें से प्रत्येक को 1 डी सरणी में समतल करता हूं .nM, Cपिक्सेल घटकों में से प्रत्येक की सूची की सूची प्राप्त करने के लिए संक्रमण करता हूं, उन सूचियों में से प्रत्येक को औसत करने के लिए औसत और छंटनी करता हूं ( ms.Od), और अंत में नई सुर्खियों में शामिल हो जाता हूं j

ध्यान दें कि मेरा कार्यक्रम एक अलग प्रारूप में आउटपुट उत्पन्न करता है (लेकिन अभी भी वैध पीपीएम)। इस imgur एल्बम में डेमो इमेज देखी जा सकती हैं ।


13

बैश (+ इमेजमैजिक), 64 + 1 = 65 बाइट्स

C=convert;$C a -flip b;$C a -flop c;$C c -flip d;$C * -average e

नौकरी के लिए सही उपकरण।

एक निर्देशिका में चलाया जाना चाहिए जिसमें एक ऐसी फ़ाइल aहो जिसमें रूपांतरण के लिए PPM डेटा हो। चूंकि यह फ़ाइल नाम महत्वपूर्ण है, इसलिए मैंने एक बाइट को बाइट की संख्या में जोड़ा है।

PNG थंबनेल आउटपुट (निश्चित नहीं कि यह आवश्यक क्यों है क्योंकि वे वैसे भी सभी समान हैं, लेकिन प्रश्न ऐसा कहता है, इसलिए ...):

पेंगुइन quintopia पीटर minibits

2 बाइट्स बचाने के लिए nneonneo को धन्यवाद !


3
मुझे आउटपुट की आवश्यकता है क्योंकि लोगों को परीक्षण के बिना समाधान पोस्ट करने की बुरी आदत है। +1 के लिए -flop, मैं वास्तव में आश्चर्यचकित होना चाहता हूं कि यह एक ध्वज है।
मेघो

1
का उपयोग करके 2 बाइट्स बंद दाढ़ी C=convertऔर $Cके बजाय alias
nnonneo 18

12

मतलाब, 106 82 80 बाइट्स

i=imread(input(''))/4;for k=1:2;i=i+flipdim(i,k);end;imwrite(i,'p3.pnm','e','A')

छवि को n*m*3मैट्रिक्स के रूप में लोड किया गया है। फिर हम मैट्रिक्स को फ्लिप करते हैं और दोनों अक्ष के लिए खुद को जोड़ते हैं, और इसे फिर से एक फ़ाइल में लिखते हैं।


मुझे पाठ फ़ाइलों को अपलोड करने के लिए इतनी बड़ी जगह नहीं मिली, इसलिए यहां PNG संस्करण हैं:


ओमग, मुझे यह भी नहीं पता था कि आप <imgटैग का उपयोग कर सकते हैं !
१०:१६ में

1
MATLAB R2013b और नए में यह फ्लिपडिम के बजाय फ्लिप का उपयोग करना संभव है । जो आपको 3 और बाइट्स बचाए। फ़्लिप्डिम की मदद वास्तव में कहती है: "फ़्लिप्डिम को भविष्य के रिलीज़ में हटा दिया जाएगा। इसके बजाय फ़्लिप का उपयोग करें।"
slvrbld

10

गणितज्ञ, 86 84 बाइट्स

सलाह के लिए DavidC को धन्यवाद। (2 बाइट्स बचाता है)

Export[#2,⌊Mean@Join[#,(r=Reverse)/@#]&@{#,r/@#}&@Import[#,"Data"]⌋~Image~"Byte"]&

पहले और दूसरे पैरामीटर क्रमशः इनपुट और आउटपुट छवियों के पथ हैं।


परीक्षण के मामलों

f=%; (assign the function to symbol f)
f["penguin.pnm","penguin2.pnm"]
f["quintopia.pnm","quintopia2.pnm"]
f["peter.pnm","peter2.pnm"]

परिणाम

(छवियों के पीएनजी संस्करण नीचे अपलोड किए गए हैं)

Import["penguin2.pnm"]

Import["quintopia2.pnm"]

Import["peter2.pnm"]


Join[#,(r=Reverse)/@#]
डेविड जेएन

4

जूलिया, 157 बाइट्स

using FileIO
s->(a=load(s);b=deepcopy(a);d=a.data;(n,m)=size(d);for i=1:n,j=1:m b.data[i,j]=mean([d[i,j];d[n-i+1,j];d[i,m-j+1];d[n-i+1,m-j+1]])end;save(s,b))

यह एक लैम्ब्डा फ़ंक्शन है जो एक पीपीएम फ़ाइल के पूर्ण पथ वाले स्ट्रिंग को स्वीकार करता है और इसे रूपांतरित छवि के साथ अधिलेखित करता है। इसे कॉल करने के लिए, इसे किसी वैरिएबल पर असाइन करें।

Ungolfed:

using FileIO

function f(s::AbstractString)
    # Load the input image
    a = load(s)

    # Create a copy (overwriting does bad things)
    b = deepcopy(a)

    # Extract the matrix of RGB triples from the input
    d = a.data

    # Store the size of the matrix
    n, m = size(d)

    # Apply the transformation
    # Note that we don't floor the mean; this is because the RGB values
    # aren't stored as integers, they're fixed point values in [0,1].
    # Simply taking the mean produces the desired output.
    for i = 1:n, j = 1:m
        b.data[i,j] = mean([d[i,j]; d[n-i+1,j]; d[i,m-j+1]; d[n-i+1,m-j+1]])
    end

    # Overwrite the input
    save(s, b)
end

उदाहरण आउटपुट:

पेंगुइन quintopia पीटर minibits


4

अजगर 2 + पीआईएल, 268

अब मैं बड़े पैमाने पर PIL का उपयोग करता हूं, छवि flipping और अल्फा सम्मिश्रण का उपयोग करते हुए

from PIL import Image
I=Image
B,T=I.blend,I.FLIP_TOP_BOTTOM
a=I.open(raw_input()).convert('RGB')
exec'b=a@I.FLIP_LEFT_RIGHT);c=a@T);d=b@T)'.replace('@','.transpose(')
x,y=a.size
print'P3',x,y,255
for r,g,b in list(B(B(B(a,b,0.5),c,0.25),d,0.25).getdata()):print r,g,b

परिणामी छवियां यहां उपलब्ध हैं


1
नियमों द्वारा आवश्यक परीक्षण मामलों के लिए आउटपुट शामिल करें।
मेघो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.