একটি মিনিফায়ার লিখি


14

পটভূমি

আপনার ওয়েব ব্রাউজারে জাভাস্ক্রিপ্ট পরিবেশনের সময়, মিনিফায়ারগুলি সাধারণত ব্যবহৃত হয়। এটি সাধারণত পাঠানো বাইটের সংখ্যা হ্রাস করতে ব্যবহৃত হয়। ব্যান্ডউইথ সংরক্ষণ করা সুস্পষ্ট কারণে কার্যকর। কিছু লোক obfuscaters ব্যবহার করে (যা উদ্দেশ্যমূলকভাবে কোডগুলি পড়া আরও কঠিন করে তোলে), আমি সেগুলি সম্পর্কে কথা বলছি না।

আমরা পাইথন 2 হ্রাস করব

আমি জাভাস্ক্রিপ্ট বা পাইথনটি ক্ষুদ্রতর অভিজ্ঞতার জন্য ব্যবহার করব কিনা তা নিয়ে আমি বিতর্ক করছিলাম এবং আমি দুটি কারণে পাইথনের বিষয়ে সিদ্ধান্ত নিয়েছিলাম: সাদা স্থানের বিষয়টি এবং আমি মনে করি যে এটি একটি আকর্ষণীয় গতিশীল সমস্যা যুক্ত করবে। অতিরিক্তভাবে, পাইথন ২.7 ব্যবহার করে অন্য একটি গতিশীল সরবরাহ করা হবে, যেমন ()একটি মুদ্রণের সময় অতিরিক্ত অতিরিক্ত অপসারণ (যেমন print("Hello world")বনাম print"Hello world")। আমি ব্যক্তিগতভাবে এটি যে কোনও ভাষায় খুলতে পছন্দ করতাম তবে কিছু ভাষার ক্ষেত্রে এই প্রক্রিয়াটি খুব একটা বোঝায় না। এবং, আপনি কোন ভাষাটি ছোট করার সিদ্ধান্ত নিয়েছেন তা সরাসরি আপনার স্কোরকে প্রভাবিত করবে (এবং ভাষাটি যদি ছোট করাও যায়)।

চশমা

আপনার লক্ষ্যটি কেবল কোডটি এমনভাবে সংশোধন করা যা কোনওভাবেই এটির কার্যকারিতা পরিবর্তন করবে না। আপনি অবশ্যই ভেরিয়েবলের নাম (আপনার মিনিফাইং প্রোগ্রামের অভ্যন্তরে) পরিবর্তন করতে পারবেন যতক্ষণ না এটি আউটপুটকে প্রভাবিত করে না ( সুযোগের সন্ধান করুন )। যদিও আমি আপনাকে একটি নির্দিষ্ট প্রোগ্রাম দিচ্ছি, দয়া করে পরীক্ষার কেসটির জন্য অনুকূলিত হবেন না কারণ সমস্ত স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।

স্কোর : আপনি প্রোগ্রামটি ছোট করার পরে দৈর্ঘ্য।

ইনপুট : যেকোন পাইথন ২.7 প্রোগ্রাম (এতে কোনও ত্রুটি নেই)

আউটপুট : একটি সংক্ষিপ্ত সংস্করণ।

যদিও আপনার কোডে সমস্ত বৈধ পাইথন ২.7 ইনপুট সমন্বিত করতে সক্ষম হওয়া উচিত, তবে আপনার স্ক্রিপ্টটির কার্যকরতার প্রমাণ দেওয়ার জন্য কোনও কিছুর বিরুদ্ধে এটি পরীক্ষা করা প্রয়োজন।

উদাহরণ প্রোগ্রামটি দেখতে এখানে ক্লিক করুন

সমস্যাটিকে আরও সহজলভ্য করে তোলা

আমার সমাধানের ভিতরে পাওয়া কোনও কোড ব্যবহার করতে বা পরিবর্তন করতে নির্দ্বিধায় (তালিকাভুক্ত বেলো)। আপনাকে উদ্ধৃতি বেসিক উদ্ধৃতি হ্যান্ডলিং দিয়ে শুরু করতে আমি এটি করেছি; তবে আপনি এটিকে ইন্ডেন্টেশন ইত্যাদিতে প্রসারিত করতে পারেন etc.

পাইথনকে খাটো করার উপায়

সমস্ত সাদা স্থান ন্যূনতম সম্ভাব্য পরিমাণের সাথে প্রতিস্থাপিত হতে পারে (আমি স্বীকার করি যে পাইথনে আপনি ট্যাবগুলি দিয়ে কিছু কৌশলপূর্ণ জিনিস করতে পারেন , তবে আমি এটি প্রয়োগ করব কিনা তা স্থির করার জন্য এটি আপনার উপর ছেড়ে দেব)।

উদাহরণ

পরবর্তী:

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আউটপুট সংশোধন হবে।


স্যান্ডবক্স: কোড golf.meta.stackexchange.com/a/14424/67929
নীল

সিডিনোট: এমন কোনও প্রোগ্রাম নেই যা এই আলোচনা অনুযায়ী কোনও যথেচ্ছ ইনপুট প্রোগ্রামের স্বল্পতম সমতুল্য আউটপুট করতে পারে
লিকি নুন

ইতিমধ্যে কিছু পাইথন মিনিফায়ার সরঞ্জাম রয়েছে । আমি মনে করি না যে এই প্রশ্নটি ইতিমধ্যে প্রস্থান করা সরঞ্জামগুলির চেয়ে ভাল সমাধান পেতে পারে।
tsh

পরিবর্তন করা হয় '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'মধ্যে '1'*100অনুমতি? আচরণ যেমন হয় তেমন করার দরকার?
l4m2

উত্তর:


2

পাইথন 2.7, 2013 স্কোর

এই প্রোগ্রামটি রেফারেন্স হিসাবে ব্যবহার করা যেতে পারে এবং আপনাকে নীচের কোডটি গ্রহণ এবং এটি সংশোধন করার এবং তারপরে এটি নিজের সমাধানগুলিতে পোস্ট করার অনুমতি দেওয়া হয়।

অন্ধকারে, আমার সম্ভবত উক্তিটি পরিচালনা করার জন্যও রেগেক্স ব্যবহার করা উচিত ছিল, তবে আমি মনে করি বর্তমান অবস্থাতেই লোকজনকে সমস্যায় ফেলার জন্য যথেষ্ট হতে পারে।

আমি পাইথন ২.7 কেন বেছে নিয়েছি: আমি ভেবেছিলাম execকীওয়ার্ডের মাধ্যমে প্রোগ্রামটি ক্র্যাশ করেছি কিনা তা পরীক্ষা করে নেওয়া আরও সহজ হবে ।

এই কোডটি প্রোগ্রামটি হিসাবে প্রবেশ করে 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.