आइये एक Minifier लिखते हैं


14

पृष्ठभूमि

सामान्य रूप से, आपके वेब ब्राउज़र में जावास्क्रिप्ट की सेवा करते समय, मिनिरल्स का उपयोग किया जाता है। यह आमतौर पर बाइट्स की संख्या को कम करने के लिए उपयोग किया जाता है जिन्हें भेजा जाना है। बचत बैंडविड्थ स्पष्ट कारणों के लिए उपयोगी है। कुछ लोग obfuscaters का उपयोग करते हैं (जो जानबूझकर कोड को पढ़ने में कठिन बनाते हैं), मैं उन लोगों के बारे में बात नहीं कर रहा हूं।

हम पायथन 2 को छोटा करेंगे

मैं इस बात पर बहस कर रहा था कि मीनिंगफुल एक्सपीरियंस के लिए जावास्क्रिप्ट या पाइथन का उपयोग करें या नहीं और मैंने दो कारणों से पायथन पर फैसला किया: व्हाइट स्पेस मायने रखता है और मुझे लगता है कि इससे एक दिलचस्प डायनामिक प्रॉब्लम जुड़ेगी। इसके अतिरिक्त, पायथन 2.7 का उपयोग करना एक और गतिशील प्रदान करेगा, जैसे ()कि एक प्रिंट (यानी print("Hello world")बनाम print"Hello world") के दौरान शानदार को हटा दें । मैं व्यक्तिगत रूप से इसे किसी भी भाषा में खोलना पसंद करूंगा, लेकिन कुछ भाषाओं के लिए यह प्रक्रिया बहुत मायने नहीं रखेगी। और, जिस भाषा को आप छोटा करने का निर्णय लेते हैं, वह सीधे आपके स्कोर को प्रभावित करेगी (और यदि भाषा को छोटा भी किया जा सकता है)।

ऐनक

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

स्कोर : कार्यक्रम की लंबाई के बाद आप इसे छोटा करते हैं।

इनपुट : कोई पायथन 2.7 प्रोग्राम (जिसमें कोई त्रुटि नहीं है)

आउटपुट : एक छोटा संस्करण।

यद्यपि आपका कोड सभी वैध पायथन 2.7 इनपुट को समायोजित करने में सक्षम होना चाहिए, लेकिन प्रभावशीलता साबित करने के लिए किसी चीज़ के खिलाफ आपकी स्क्रिप्ट का परीक्षण करना आवश्यक है।

उदाहरण कार्यक्रम देखने के लिए यहां क्लिक करें

समस्या को और अधिक स्वीकार्य बनाते हुए

मेरे समाधान के अंदर पाए गए किसी भी कोड का उपयोग करने या संशोधित करने के लिए बेझिझक (सूचीबद्ध bellow)। मैंने यह करने के लिए आपको उद्धरण मूल उद्धरण हैंडलिंग के साथ शुरू किया; हालाँकि, आप इसे इंडेंटेशन और इत्यादि तक बढ़ा सकते हैं।

उदाहरण पायथन को छोटा करने के तरीके

सभी सफेद स्थान को न्यूनतम संभव राशि से बदला जा सकता है (मैं स्वीकार करता हूं कि पायथन में आप टैब के साथ कुछ मुश्किल सामान कर सकते हैं , लेकिन मैं इसे लागू करने या नहीं करने का फैसला करने के लिए आपको छोड़ दूंगा)।

उदाहरण

निम्नलिखित:

def print_a_range(a):
    for i in range(a):
        print(i)

हो सकता है:

def print_a_range(a):
 for i in range(a):
  print(i)

तकनीकी रूप से, यदि लूप के अंदर केवल एक ही रेखा है, तो आप इसे और भी अधिक संकुचित कर सकते हैं:

def print_a_range(a):
 for i in range(a):print(i)  #Note, you can also remove the `()` here.

हालाँकि, एक और तरीका है जिससे आप पाइथन में सफेद स्थान को छोटा कर सकते हैं:

निम्नलिखित:

print ([a * 2 for a in range(20) if a % 2 == 0])

हो सकता है:

print([a*2for a in range(20)if a%2==0])

ध्यान दें, कि 2और बीच की जगह की कोई आवश्यकता नहीं है for। चर, कार्य और कीवर्ड एक संख्या के साथ शुरू नहीं हो सकते । तो, पायथन दुभाषिया ठीक है <num><keyword>, कोई स्थान नहीं है। आप यह भी ध्यान देना चाहिए वहाँ के बीच एक रिक्ति की जरूरत नहीं है )और if

ध्यान दें, आपको प्रोग्राम का आउटपुट नहीं बदलना चाहिए! इसलिए:

print"f(x)=x*2 is a great equation!"

इसके बाद के संस्करण प्रिंट बयान क्योंकि बीच की जगह को हटाने के लिए एक ही रहना चाहिए 2और isउत्पादन को संशोधित करेगा।



सिडेनोट: ऐसा कोई भी कार्यक्रम नहीं है जो इस चर्चा के अनुसार किसी भी मनमाने इनपुट प्रोग्राम के सबसे छोटे समकक्ष का उत्पादन कर सके
लीक नून

पहले से ही कुछ अजगर minifier उपकरण हैं । मुझे नहीं लगता कि यह प्रश्न पहले से ही बाहर निकलने वाले उपकरणों की तुलना में बेहतर समाधान प्राप्त कर सकता है।
tsh

अनुमति '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'में बदल रहा है '1'*100? व्यवहार वैसा ही करने की आवश्यकता है?
l4m2

जवाबों:


2

पायथन 2.7, 2013 स्कोर

इस कार्यक्रम को संदर्भ के रूप में इस्तेमाल किया जा सकता है, और आपको निम्नलिखित कोड लेने और इसे संशोधित करने और फिर इसे अपने समाधान में पोस्ट करने की अनुमति है।

हेंडसाइट में, मुझे शायद बोली से निपटने के लिए भी रेगेक्स का उपयोग करना चाहिए था, लेकिन मुझे लगता है कि इसकी वर्तमान स्थिति में लोगों को समस्या में कूदना शुरू करने के लिए पर्याप्त हो सकता है।

मैंने पायथन 2.7 क्यों चुना: मुझे लगा कि यह देखने के लिए परीक्षण करना आसान होगा कि क्या मैंने execकीवर्ड के माध्यम से प्रोग्राम क्रैश किया है ।

इस कोड के रूप में कार्यक्रम intakes in.txt

मुझे लगा कि मुझे कम से कम बॉल रोलिंग मिलनी चाहिए, जो कोई भी उद्धरण पार्सर (वह भी टिप्पणियों को संभालने के लिए होता है) लिखकर भाग लेना चाहता है और कैसे रेगेक्स पर एक संक्षिप्त उदाहरण, जब उद्धरण पार्सर के साथ संयुक्त रूप से खेल को बदल सकते हैं इस समस्या की जटिलता।

नोट: इस मिनीफ़ायर में सुधार के लिए अभी भी बहुत जगह है। जैसे आप इंडेंटेशन, वैरिएबल नामों के साथ खेल सकते हैं, और जब वे मेरे कीवर्ड्स का उपयोग कर रहे हैं, printया तब कोष्ठक हटा रहे हैं, जैसे या yield

import re

with open("in.txt","r") as fi:
    code = fi.read()

class QuoteHandler():
    def __init__(self):
        pass
    def loadCode(self,code):
        quoteFlag = False
        currentQuoteChar = ""
        ignoreNext = False
        inEndLineComment=False
        startLocation = 0

        self.reAddStrings = []

        outStr = ""

        for i, character in enumerate(code):
            if ignoreNext:
                ignoreNext = False
            elif inEndLineComment:
                if character in "\r\n":
                    inEndLineComment=False
            elif character == "#" and not quoteFlag:
                inEndLineComment = True
            elif character in "'\"" and (currentQuoteChar == character or not quoteFlag):
                if quoteFlag:
                    self.reAddStrings.append(code[startLocation+1:i])
                else:
                    currentQuoteChar = character
                    startLocation = i
                quoteFlag = not quoteFlag
            elif character == "\\":
                ignoreNext = True

            if not inEndLineComment and not quoteFlag:
                outStr+=character                
        return outStr

    def find_all_locations(self,substr,code):
        return [m.start() for m in re.finditer(substr, code)]

    def unloadCode(self,code):
        temp = self.reAddStrings[::-1]
        for i, location in enumerate(list(self.find_all_locations('"',code))[::-1]):
            code = code[:location] + "\"" + temp[i] + code[location:]
        return code

def applyRegexes(code):#\w here?
    operatorRegexCleaner = ["([\d\/*\-\"=,'+{}:[\](\)])","[ \t]+","(\w)"]
    regexes = [
        [''.join(operatorRegexCleaner),r"\1\2"],
        [''.join(operatorRegexCleaner[::-1]),r"\1\2"],#removes whitespace between operators
        ["\n\s*\n","\n"]#removes empty lines
    ]
    for regex in regexes:
        code = re.sub(regex[0],regex[1],code)
    return code

qh = QuoteHandler()
code = qh.loadCode(code)
code = applyRegexes(code)
code = qh.unloadCode(code)
print(code)
exec(code)

कार्यक्रम का आउटपुट:

def factor(factor_number):
    for n in range(2,factor_number):
        if factor_number % n==0:    
            yield(n)
def gcd(a,b):
    """Calculate the Greatest Common Divisor of a and b.

    Unless b==0, the result will have the same sign as b (so that when
    b is divided by it, the result comes out positive).
    """
    while b:
         a,b=b,a%b 
    return a
class Apricot:
    def __init__(self):
        self.mold=False
    def get(self):
        return self.mold
    def update(self):
        self.mold=not self.mold
    def blue(self):return5
def tell_me_about_these_numbers(*a):
    print("%d is the first number!" % a[0])
    print("{} / 3 is {}".format(a[0],a[0]/3.))
    myFavorate=Apricot()
    for number in a:
        print list(factor(number))
        myFavorate.update()
    print[gcd(a,b)for a,b in zip(a[:-1],a[1:])]
    print(myFavorate.get())
tell_me_about_these_numbers(5,6,9,45,200)
print"Let's play with scope!"
a,b=10,9
def randomFunction(a):
    print(a)
randomFunction(b)
print(a)
for a in range(100):
    b+=a
print(a)
print(b)
li=[]
for i in range(10):
 li.append(i*2)
print(li)
print([i*2for i in range(10)])
a=c=b=d=e=f=g=h=i=j=k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z=5
print(a)
a-=1
print(a)
g=10
print(str(10**g+5)[::-1])
def blue_fish(a):
    def blue_fish(a):
        def blue_fish(a):
            return a
        a+=1
        return blue_fish(a)
    a-=1
    return blue_fish(a)
print(blue_fish(10))
def blue_fish(a):
    if a==0:
        return"0"
    return"1" +blue_fish(a-1)
print(blue_fish(5))
blue_fish=lambda a,b,c:a*b*c
print(blue_fish(1,2,3))
blue_fish=lambda*a:reduce(lambda a,b:a*b,a)
print(blue_fish(1,2,3))
print(max([[6,1],[5,2],[4,3],[3,4],[2,5],[1,6]],key=lambda a:a[1]))
print(zip(*[[1],[2],[3],[4],[5]]))
print"Now let's test to see if you handle quotes correctly:"
print"test \'many diffent\' \"types of \" quotes, even with \' \" trailing quotes"
print"""

Multi line quotes are great too!

"""
a=""" ::
one more multi-line quote won't hurt
"""
print a
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.