স্বয়ং-মেটা-কোড-গলফ


13

আপনি কোডগোল্ফের সমস্ত চ্যালেঞ্জের দ্বারা অসুস্থ। সুতরাং আপনি এমন একটি প্রোগ্রাম লেখার সিদ্ধান্ত নিয়েছেন যা স্বয়ংক্রিয়ভাবে আপনার জন্য কিছু পাইথন কোড গল্ফ করবে। এখানে 3 টি পরীক্ষার মামলা রয়েছে:

print quickSort([0,7,3,-1,8,10,57,2])
def quickSort(arr):
    less = []
    pivotList = []
    more = []
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr[0]
        for i in arr:
            if i < pivot:
                less.append(i)
            elif i > pivot:
                more.append(i)
            else:
                pivotList.append(i)
        less = quickSort(less)
        more = quickSort(more)
        return less + pivotList + more

for i in xrange(1, 101):
    if i % 15 == 0:
        print "FizzBuzz"
    elif i % 3 == 0:
        print "Fizz"
    elif i % 5 == 0:
        print "Buzz"
    else:
        print i

from sys import argv

def randomGenerator(seed=1):
    max_int32 = (1 << 31) - 1
    seed = seed & max_int32

    while True:
        seed = (seed * 214013 + 2531011) & max_int32
        yield seed >> 16

def deal(seed):
    nc = 52
    cards = range(nc - 1, -1, -1)
    rnd = randomGenerator(seed)
    for i, r in zip(range(nc), rnd):
        j = (nc - 1) - r % (nc - i)
        cards[i], cards[j] = cards[j], cards[i]
    return cards

def show(cards):
    l = ["A23456789TJQK"[c / 4] + "CDHS"[c % 4] for c in cards]
    for i in range(0, len(cards), 8):
        print " ", " ".join(l[i : i+8])

if __name__ == '__main__':
    seed = int(argv[1]) if len(argv) == 2 else 11982
    print "Hand", seed
    deck = deal(seed)
    show(deck)

নিয়মাবলী:

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

  2. আপনার প্রোগ্রামের আউটপুটটি মূল উত্স কোড হিসাবে একটি অভিন্ন পদ্ধতিতে চলতে হবে। (যথা, এটি অবশ্যই একই আউটপুট উত্পাদন করতে পারে V পরিবর্তনশীল নাম এবং ভাষার গঠনগুলি পরিবর্তন করা যেতে পারে, যতক্ষণ না আউটপুট একই থাকে)

  3. আপনি উত্স কোডের ইনপুট / আউটপুট করতে আপনি STDIO বা একটি ফাইল ব্যবহার করতে পারেন।

আপনার স্কোরটি আপনার প্রোগ্রামের আউটপুটটির বাইটের যোগফল হবে।

(উপরে তালিকাভুক্ত কোডটি জিএনইউ ফ্রি ডকুমেন্টেশন লাইসেন্স ১.২ এর আওতায় http://rosettacode.org/ থেকে নেওয়া হয়েছে )



3
লোকেদের চেষ্টা করার, বিভ্রান্ত করার জন্য এখানে একটি বোনাস পরীক্ষার কেস
Sp3000

4
মূল উত্স কোড হিসাবে আউটপুট " [চালায়] অভিন্ন পদ্ধতিতে " কিনা তা নির্ধারণ করার জন্য আপনার মডেলটি কী ? উদাহরণস্বরূপ, দ্বিতীয় উদাহরণ হিসাবে, আমি বিশ্বাস করি যে অপসারণ if __name__ == '__main__':কিছু প্রসঙ্গে আচরণকে প্রভাবিত করবে কিন্তু অন্যকে নয়। অন্য একটি উদাহরণের জন্য, যদি অব্যক্ত ইনপুটটি ধরে নেয় যে এটি স্টিডিনের কাছ থেকে কোনও ইনট পড়ে এবং অন্য কোনও কিছু দেওয়া হলে এক ধরণের ব্যতিক্রম ছুঁড়ে মারে, গল্ফযুক্ত ইনপুট যদি একটি অ-পূর্ণসংখ্যা দেওয়া হয় তবে ভিন্ন ধরণের ব্যতিক্রম ছুঁড়ে ফেলতে পারে?
পিটার টেলর

2
কি এই মত একটি প্রোগ্রাম সম্পর্কে: random_long_variable=0;print locals()?
জাস্টিন

উত্তর:


4

পাইথন 2.7, 794

আমি পাইথনের জন্য কিছুক্ষণের জন্য একটি মিনিফায়ার তৈরির অর্থ করছি, তাই সমস্যাটি অনুসন্ধানের এটি একটি ভাল সুযোগ।

প্রোগ্রামটিতে নিয়মিত অভিব্যক্তি বিশ্লেষণ এবং পাইথন পার্সার অপারেশনগুলির মিশ্রণ ব্যবহৃত হয়। সাদা স্থান হ্রাস করা হয়। পরিবর্তনশীল যা ব্যবহারকারীর দ্বারা সংজ্ঞায়িত করা হয় একটি একক বর্ণের পরিবর্তনশীল দ্বারা পরিবর্তিত হয় (যা ব্যবহৃত হয় না!)। পরিশেষে while Trueবিবৃতিটি একটি ডায়েটে দেওয়া হয়।

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

ফলাফল

228 t1.py
128 t2.py
438 t3.py
794 total

আউটপুট

def c(a):
 b=[]
 d=[]
 f=[]
 if len(a)<=1:
  return a
 else:
  e=a[0]
  for i in a:
   if i<e:
    b.append(i)
   elif i>e:
    f.append(i)
   else:
    d.append(i)
  b=c(b)
  f=c(f)
  return b+d+f
print c([0,7,3,-1,8,10,57,2])


for i in xrange(1,101):
 if i%15==0:
  print"FizzBuzz"
 elif i%3==0:
  print"Fizz"
 elif i%5==0:
  print"Buzz"
 else:
  print i


from sys import argv
def a(k=1):
 b=(1<<31)-1
 k=k&b
 while 1:
  k=(k*214013+2531011)&b
  yield k>>16
def d(k):
 f=52
 h=range(f-1,-1,-1)
 g=a(k)
 for i,r in zip(range(f),g):
  j=(f-1)-r%(f-i)
  h[i],h[j]=h[j],h[i]
 return h
def m(h):
 l=["A23456789TJQK"[c/4]+"CDHS"[c%4]for c in h]
 for i in range(0,len(h),8):
  print" "," ".join(l[i:i+8])
if __name__=='__main__':
 k=int(argv[1])if len(argv)==2 else 11982
 print"Hand",k
 e=d(k)
 m(e)

কোড

import sys
import re
from tokenize import generate_tokens
from token import tok_name
from keyword import iskeyword

wr = sys.stdout.write

def pyparse(text):
    'Return [TYPE,TOKEN] pair list'
    # Use KEYWORD,NAME,NUMBER,OP,STRING,NL,NEWLINE,COMMENT,INDENT,DEDENT
    rawtokens = generate_tokens(text.readline)
    tokens = [[tok_name[n], t] for n,t,p1,p2,dx in rawtokens]
    for tpair in tokens:
        if tpair[0] == 'NAME' and iskeyword(tpair[1]):
            tpair[0] = 'KEYWORD'
    return tokens

def finduservars(filename):
    'Return a set of user variables that we can replace with a-zA-Z'
    varset = set()
    for line in open(filename):
        line = line.strip()
        match = re.match(r'def\s+(\w+)\s*\((.*)\)\s*:', line)
        if match:
            func, args = match.groups()
            varset.add(func)
            arglist = re.findall(r'(\w+|=)', args)
            for a in arglist:
                if a == '=':
                    break  # keyword args follow - too hard to parse
                varset.add(a)
            continue
        match = re.match(r'(\w+)\s*=.+', line)
        if match:
            assigned = match.group(1)
            varset.add(assigned)
            continue
    return set(v for v in list(varset) if len(v) > 1)

filename = sys.argv[1]
tokenlist = pyparse(open(filename))

# Build map for var->char conversion:
varset = finduservars(filename)
singles = [text for tok,text in tokenlist if tok=='NAME' and len(text)==1]
allvar = [chr(n) for n in range(97,123)+range(65,91)]
charvar = [c for c in allvar if c not in singles]
varreplaced = list(varset)[:len(charvar)]
varmap = dict((v, charvar.pop(0)) for v in varreplaced)

prev = 'NONE'
indent = ['']
output = []
add = output.append
for tok, text in tokenlist:
    if tok == 'NL':
        continue
    elif tok == 'INDENT':
        indent.append( text.replace('    ', ' ') )
        output[-1] = indent[-1]
    elif tok == 'DEDENT':
        indent.pop(-1)
        output[-1] = indent[-1]
    elif tok == 'NEWLINE':
        add(text)
        add(indent[-1])
    elif tok in 'KEYWORD,NAME,NUMBER':
        if prev in 'KEYWORD,NAME,NUMBER':
            add(' ')
        if tok == 'NAME':
            if output[-2] == 'while' and text == 'True':
                add('1') # common verbose idiom
            else:
                add(varmap.get(text, text))
        else:
            add(text)
    else:
        add(text)
    prev = tok

wr(''.join(output))

4

সেড, 1074 (1390 থেকে নীচে)

বলটি রোলিংয়ের জন্য খুব হালকা, কম-ঝুলন্ত-ফলের প্রকারের উত্তর:

/^$/d                  # Remove empty lines
/^[ <--TAB-->]*#/d     # Remove whole-line comments
s/    /<--TAB-->/g     # Replace 4 spaces with tabs
/^[^'"]*$/s/ *([|&:,<>=*/%+-]) */\1/g  # Remove spaces before/after operators

<--TAB-->বাস্তব TABঅক্ষর দিয়ে প্রতিস্থাপন করুন

স্পষ্টত ঘাটতি:

  • ইনডেটগুলি ইনপুট কোডের ঠিক 4 টি স্পেস বলে ধরে নিয়েছে।

যেহেতু আমরা কোনও মাল্টি-লাইন স্ট্রিং অনুমান করতে পারি না, তারপরে যদি আমরা প্রদত্ত লাইনে নেই 'বা না থাকে তবে কেবলমাত্র অপারেটরদের থেকে আমরা অগ্রণী / অগ্রবর্তী স্থানগুলি সরিয়ে ফেলি "। এই উন্নত পারে, কিন্তু <কয়েকটা সম্পর্কে sed Regex সবসময় লোভী হচ্ছে কিছু>

পরীক্ষা নিম্নরূপ:

$ cat qs.py fizzbuzz.py cards.py | wc -c
1390
$ sed -rf pygolf.sed qs.py fizzbuzz.py cards.py | wc -c
1074
$ sed -rf pygolf.sed qs.py fizzbuzz.py cards.py | python
[-1, 0, 2, 3, 7, 8, 10, 57]
1
2
Fizz
...
98
Fizz
Buzz
Hand 11982
  AH AS 4H AC 2D 6S TS JS
  3D 3H QS QC 8S 7H AD KS
  KD 6H 5S 4D 9H JH 9S 3C
  JC 5D 5C 8C 9D TD KH 7C
  6C 2C TH QH 6D TC 4S 7S
  JD 7D 8H 9C 2H QD 4C 5H
  KC 8D 2S 3S
$ 

আপনাকে মাল্টি-লাইন স্ট্রিংগুলি পরীক্ষা করার দরকার নেই, তবে আপনার শেষ দুটি অবশ্যই আপডেট হওয়া দরকার।
নাথান মেরিল

@ নাথানমিরিল আপ অপারেটরটির নেতৃত্বাধীন / চলমান স্থান এক এখন কিছুটা ভাল, তবে ইনডেন্টটি সাধারণীকরণ করা অনেক কঠিন হবে - এবং আমি লাভের প্রায় 2/3 পাই।
ডিজিটাল ট্রমা 21

3

পাইথন 3.4, 1134

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

import subprocess
from sys import argv

progamtext = open(argv[1]).read()

if 'argv' in progamtext or 'input' in progamtext or 'open' in programtext:#Make sure the program always produces the same results.
    exit(0)

program = subprocess.Popen(['C:\Python27\python', argv[1]], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
program.wait()
erroroutput1 = str(program.stderr.read())
output1 = str(program.stdout.read())
program = subprocess.Popen(['C:\Python27\python', argv[1]], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
program.wait()
erroroutput2 = str(program.stderr.read())
output2 = str(program.stdout.read())
if erroroutput1 != erroroutput2 or output1 != output2:#Make sure the program always produces the same results.
    exit(0)

newprog = ''
if erroroutput1:
    newprog += "import sys\n" + "sys.stderr.write("+ erroroutput1 + ')'
    if output1:
        newprog += "\n"
if output1:
    newprog += 'print ' + output1

if len(newprog) > len(progamtext):
    exit(0)

open(argv[1],mode='w').write(newprog)

কিভাবে এটা কাজ করে:

প্রথমত, এই প্রোগ্রামটি আপনার প্রোগ্রামটি ব্যবহারকারীর সাথে আদৌ ইন্টারেক্ট করে কিনা বা এলোমেলো ব্যবহার করে কিনা তা পরীক্ষা করে দেখুন। যদি এটি করে তবে প্রোগ্রামটি সংশোধিত নয়। এরপরে, প্রোগ্রামটি চালানো হয়। প্রোগ্রামটি এর পরে প্রতিস্থাপিত হয় print "output"। পরিশেষে, প্রোগ্রামটি যদি তার আউটপুটের চেয়ে কম হয় তবে এটি অবিস্মরণীয়।

Sp3000 এর প্রোগ্রাম, অনুকূলিত:

import sys
sys.stderr.write(b'')
print b'0.540377721372\r\n3\r\n1\r\n7\r\n99\r\nf\r\n[5, 5]\r\n53\r\n53\r\n53\r\n'

Sp3000 এর সুপার বোনাস প্রোগ্রাম, অনুকূলিতকরণ:

অপ্টিমাইজড সংস্করণটি সময়টির মাত্র .001% বন্ধ।

import sys
sys.stderr.write(b'')
print b'B\r\n'

1
আমি নিশ্চিত ছাড়া অন্য বাইরের প্রভাব আছে আছি argv, inputএবং random, যাতে আপনার কোডটি ভঙ্গ করবে। ;)
মার্টিন ইন্ডার

2
Hah। হতে পারে আমার কিছু অ-সংকল্পবাদ রাখা উচিত ছিল - print id(0)এটি ভাল one
Sp3000

@ মার্টিন ফিক্সড (বেশিরভাগ) :)
TheNumberOne


হেই, খুব সৃজনশীল।
নাথান মেরিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.