আমি কি সঠিকভাবে কোড গল্ফ করছি?


12

আমি যদি কোড গল্ফিং সঠিকভাবে করি তবে আমি আগ্রহী। আমি পাইথনের একটি একক বিবৃতিতে একটি ছোট হ্যাশিং প্রোগ্রাম করার জন্য চ্যালেঞ্জটি সেট করেছিলাম। আমি প্রথম দিয়ে শুরু করেছি:

from itertools import permutations
from string import ascii_lowercase
from random import sample

def test():
    chars = sample(ascii_lowercase, 9)
    sums = list(map(h, permutations(chars)))
    if len(set(sums)) == len(sums):
       print("unique results for permutations of given string")
    else:
       print("duplicate entries present in test results")

def h(s):
    r = 0
    for i in range(len(s)):
        r += ord(s[i]) << (i * len(s))
    return r

test()

আমি তখন ফাংশনটি পুনরাবৃত্ত করে:

def h(s, i=0):
    if i < len(s) - 1: return h(s, i+1) + ord(s[i]) << (i * len(s))
    else: return ord(s[i]) << (i * len(s))

কোডটি পুনরাবৃত্তি করার জন্য আমি এটি একটি ল্যাম্বডা দিয়ে ছোট করার চেষ্টা করেছি (এটি কার্যকর হয়নি):

def h(s, i=0, f=lambda s,i: ord(s[i]) << (i * len(s))):
    if i < len(s) - 1: return h(s, i+1) + f(s,i)
    else: return f(s,i)

অবশেষে আমি একটি ল্যাম্বডা দিয়ে শেষ করেছি:

h=lambda s,i=0:h(s,i+1)+ord(s[i])<<(i*len(s))if i<len(s)-1 else ord(s[i])<<(i*len(s))

আমি চেয়েছিলাম প্রোগ্রামটি একটি বিবৃতি হোক, তাই প্রথমে আমি এলাম:

def test():
    chars = sample(ascii_lowercase, 9)
    sums = list(map((lambda s,i=0,f=lambda s,i,f:f(s,i+1,f)+ord(s[i])<<(i*len(s))if i<len(s)-1 else ord(s[i])<<(i*len(s)):f(s,i,f)), permutations(chars)))
    if len(set(sums)) == len(sums):
       print("unique results for permutations of given string")
    else:
       print("duplicate entries present in test results")

এবং সর্বশেষে আমি এখানে দিয়ে শেষ করেছি:

print((lambda x=list(map((lambda s,i=0,f=lambda s,i,f:f(s,i+1,f)+ord(s[i])<<(i*len(s))if i<len(s)-1 else ord(s[i])<<(i*len(s)):f(s,i,f)), permutations(sample(ascii_lowercase, 9)))): "unique results for permutations of given string" if len(set(x)) == len(x) else "duplicate entries present in test results")())

কোডগলফের সমস্যাগুলি কী এভাবে কাজ করা হয়? আমি সত্যিই এই ধরণের জিনিসটি কখনও করি নি, এখনই আমি কেবল এটি সঠিকভাবে করছি কিনা তা জানতে চাই।

সংশোধন: এই প্রোগ্রামটি আপনার জন্য সমস্ত কাজ করে; সুতরাং আমি এখানে ফাংশনটি উল্লেখ করব: ইনপুট হিসাবে, প্রোগ্রামটি একটি প্রদত্ত স্ট্রিংয়ের সমস্ত অনুমতি গ্রহণ করে; এখানে স্ট্রিংটি এলোমেলোভাবে বেছে নেওয়া নয়টি অক্ষর ascii_lowercase। আউটপুট হ'ল একটি মানব-পঠনযোগ্য স্ট্রিং যা প্রদত্ত স্ট্রিংয়ের প্রতিটি অনুক্রমের ফলাফলটি ভিন্ন স্ট্রিংয়ের জন্য অন্য ফলাফলের নকল কিনা তা নির্ধারণ করে। যদি সমস্ত আদেশের জন্য কোনও সদৃশ না থাকে তবে প্রোগ্রামটি সাফল্যের ইঙ্গিত দেয়। আমার বাক্সে বারবার সহজেই গণনা করা অক্ষরের বৃহত্তম দৈর্ঘ্য হিসাবে নয়টি অক্ষর বাছাই করা হয়েছিল।

দ্বিতীয় সংশোধনী একজন অধ্যয়নরত পাঠকের দ্বারা উল্লেখ করা হয়েছে যে বর্ণিত উদ্দেশ্যটি সংযুক্ত কোডের মাধ্যমে পাওয়া যায় না। পরীক্ষার কেসটি স্পষ্টতই অপর্যাপ্ত।


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

@ এক্সনর কি যথেষ্ট?
মোতোকু

কোড গল্ফের জন্য, অবশ্যই এই optionচ্ছিক জায়গাগুলির মধ্যে আরও কিছু সরিয়ে ফেলতে হবে। এছাড়াও, পরিবর্তে পাইথন 2 ব্যবহার করুন, যেহেতু মুদ্রণটি সংক্ষিপ্ত। print"x"পরিবর্তেprint("x")
mbomb007

এবং পরিবর্তে একটি তালিকা বোধগম্য ব্যবহার করবেন list()?
mbomb007

3
আপনার প্রক্রিয়াটি ঠিক আছে বলে মনে হচ্ছে। একটি প্রোগ্রাম দিয়ে শুরু করুন, পরীক্ষা / ত্রুটি দ্বারা সংক্ষিপ্ত করে। আরও অভিজ্ঞতা পান এবং অজগর টিপস ব্রাউজ করুন এবং আপনি অল্প সময়ে দুর্দান্ত কাজ করবেন।
জিওবিটস

উত্তর:


11

গল্ফ যাওয়ার কোনও 'সঠিক' উপায় নেই। আপনি ভাল করেছেন এবং আপনি যে প্রক্রিয়াটি ব্যবহার করেছেন তা মোটামুটি মানক। একটি বিবৃতিতে প্রোগ্রাম তৈরি করা সাধারণত যদিও প্রয়োজন হয় না।

যদি এটি সহায়তা করে, আমি এখানে আপনার প্রোগ্রামটি গলফ করার জন্য কীভাবে এগিয়ে যাব তা এখানে ...

হ্যাশিং ফাংশনে, স্টেটমেন্টের জন্য একটি যোগফল দিয়ে প্রতিস্থাপন করা যেতে পারে:

def h(s):
    r = 0
    r = sum(ord(s[i]) << (i * len(s)) for i in range(len(s)))
    return r

এটি তখন ল্যাম্বডা ফাংশন হিসাবে সংজ্ঞায়িত করা যেতে পারে:

h = lambda s: sum(ord(s[i]) << (i * len(s)) for i in range(len(s)))

এবং এখন আমরা অপ্রয়োজনীয় স্থান এবং বন্ধনী অপসারণ:

h=lambda s:sum(ord(s[i])<<i*len(s)for i in range(len(s)))

Sp3000 হিসাবে নির্দেশিত হিসাবে, এটি গণনার মাধ্যমে আরও সংক্ষিপ্ত করা যেতে পারে:

h=lambda s:sum(ord(x)<<i*len(s)for i,x in enumerate(s))

পরীক্ষার কার্যক্রমে এগিয়ে চলার সাথে সাথে আমরা এর প্রথম দুটি লাইন একীভূত করি:

def test():
    sums = list(map(h, permutations(sample(ascii_lowercase, 9))))
    ...

যেহেতু উভয় ফাংশন কেবল একবার ব্যবহার করা হয়, তাই আমরা সমস্ত কিছু ইনলাইন স্থানান্তর করতে পারি:

sums = list(map(lambda s:sum(ord(x)<<i*len(s)for i,x in enumerate(s)), permutations(sample(ascii_lowercase, 9))))
...

এটি তালিকা অনুধাবন হিসাবে সংক্ষিপ্ত:

sums = [sum(ord(x)<<i*len(s)for i,x in enumerate(s)) for s in permutations(sample(ascii_lowercase, 9))]

এরপরে, আমরা এটিকে একটি ছোট নাম দিই এবং আবার অযথা শূন্যস্থানগুলি সরিয়ে ফেলব:

x=[sum(ord(x)<<i*len(s)for i,x in enumerate(s))for s in permutations(sample(ascii_lowercase,9))]

যদি বিবৃতিটি মুদ্রণ ফাংশনের অভ্যন্তরে সরানো যায়:

print('unique...' if len(set(x)) == len(x) else 'duplicate...')

তবে এটি সাধারণত ব্যবহারের চেয়ে ছোট এবং / অথবা:

print(len(set(x)) == len(x) and 'unique...' or 'duplicate...')

যেহেতু len(x)পরিবর্তন হয় না, তাই আমরা এর মান গণনা এবং হার্ডকোড করতে পারি:

print(len(set(x)) == 362880 and 'unique...' or 'duplicate...')

অপ্রয়োজনীয় স্পেসগুলি সরিয়ে এবং তুলনাটি স্যুইচ করার পরে, আমরা পাই:

print(len(set(x))<362880and'duplicate...'or'unique...')

এটি আমাদের সবকিছুকে একটি বিবৃতিতে স্থানান্তরিত করতে দেয়:

print(len(set([sum(ord(x)<<i*len(s)for i,x in enumerate(s))for s in permutations(sample(ascii_lowercase,9))]))<362880and'duplicate...'or'unique...')

এবং এখন আমরা পরিবর্তে একটি সেট বোধগম্যতা ব্যবহার করতে পারি:

print(len({sum(ord(x)<<i*len(s)for i,x in enumerate(s))for s in permutations(sample(ascii_lowercase,9))})<362880and'duplicate...'or'unique...')

আমদানি বাদ দিয়ে ফলাফলটি 210 বাইট। পরবর্তী পদক্ষেপটি সম্ভবত আমদানি বা দীর্ঘ স্ট্রিংগুলি গল্ফ করা হবে।


7
যথেষ্ট enumerateh=lambda s:sum(ord(x)<<i*len(s)for i,x in enumerate(s))
মজাদার

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