অ-আদর্শহীন পাইথন [বন্ধ]


10

পাইথন কোডের কয়েকটি লাইন লিখুন X, এটি কোনও বিশ্বব্যাপী ভেরিয়েবলের উল্লেখ করে না

def method():
    X
    print(a)

method()

প্রিন্ট 1কিন্তু

def method():
    X
    X
    print(a)

method()

কপি করে প্রিন্ট 2


সুতরাং, আমি স্টিকারর হিসাবে ঘৃণা করি তবে এটি পাইথনের মতো মনে হয় varsএবং localsএটি আসলে বৈশ্বিক পরিবর্তনশীল:

def test_global_1():
    global vars, locals
    vars = lambda: 2
    locals = lambda: 3

def test_global_2():
    print(vars())
    print(locals())

test_global_1()
test_global_2()

এছাড়াও, দেখে মনে হচ্ছে যে লোকেরা এই ধরণের ধাঁধাগুলির জন্য উদ্দেশ্যমূলক জয়ের মানদণ্ড দেখতে চায়। কোডের দৈর্ঘ্যটি এখানে সঠিকভাবে অনুভব করে না তাই সম্ভবত আমরা কোডের বিভিন্ন অভিনব বৈশিষ্ট্যগুলির জন্য ব্রাউন পয়েন্টগুলির একটি সিস্টেম তৈরি করতে পারি? এগুলি ঠিক কী হতে পারে আমি নিশ্চিত নই তবে এখানে একটি সূচনা:

  • সত্যিকার অর্থে কোনও গ্লোবালগুলির জন্য +1 (না varsবা locals)
  • নির্দিষ্ট কৌশল পোস্ট করার ক্ষেত্রে প্রথম হওয়ার জন্য +1
  • সংক্ষিপ্ততম সমাধান পোস্ট করার জন্য +1
  • কেবলমাত্র একক পাইথন বিবৃতি জড়িত সমাধানের জন্য +1
  • আকর্ষণীয় "হ্যাকস" এর জন্য লেক্সিকাল অ-সীমানায় যোগদানের মতো +1
  • ব্যতিক্রম ব্যবহার না করার জন্য +1

এবং যদি আপনি আরও কিছু ভাবতে পারেন তবে আপনি এই প্রশ্নটিকে তালিকায় যুক্ত করতে সম্পাদনা করতে পারেন।

ব্যতিক্রমগুলি ব্যবহার না করে এবং পছন্দসই varsএবং বিশ্বব্যাপী ব্যবহার না করেই কি এই সমস্যার সমাধান করা যাবে locals? আমি সন্দেহ করতে পারি এটি পারে, যদিও আমি এখনও ঠিক কীভাবে বুঝতে পারি নি ...


ভাল ধাঁধা! আমি নিচে স্ক্রোল না করার বিষয়টি নিশ্চিত করেছিলাম যাতে কারও জবাব না দেখে আমি নিজেই এটি সমাধান করতে পারি। : ডি
mbomb007

1
ধাঁধা ওভেনের জন্য ধন্যবাদ, এবং সাইটে আপনাকে স্বাগতম। সাইটে একটি নিয়ম রয়েছে যে সমস্ত প্রশ্নের অবশ্যই একটি উদ্দেশ্যমূলক বিজয়ী শর্ত থাকতে হবে, সুতরাং আপনার সম্ভবত একটি যুক্ত করা উচিত। একটি সম্ভাবনার সংক্ষিপ্ত দৈর্ঘ্য X, তবে অন্যান্য বিকল্প রয়েছে।
isaacg

3
"সমস্ত প্রশ্নের অবশ্যই একটি উদ্দেশ্যমূলক বিজয়ী শর্ত থাকতে হবে" - বোকা নিয়ম imho। যখন আমরা সবাই বেশিরভাগই বিভিন্ন উত্তর থেকে চমকপ্রদ এবং শেখার উপভোগ করি তখন কে "বিজয়ী" সম্পর্কে চিন্তা করে।
জিমিবি

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

2
আপনি একটি স্কোরিং সিস্টেম যুক্ত করেছেন, তবে জনপ্রিয়তা প্রতিযোগিতা ট্যাগও যুক্ত করেছেন, যার অর্থ বিজয়ী ভোট দ্বারা সিদ্ধান্ত নেওয়া হয়। আপনি এখানে কি বলতে চাচ্ছেন? আপনি সম্ভবত টাইব্রেক হিসাবে ভোট চান?
xnor

উত্তর:


12
def method():
    if 'a' not in vars():a=0
    a+=1
    if 'a' not in vars():a=0
    a+=1
    print(a)

পরিবর্তনশীল সূচনা aকরতে 0শুধুমাত্র যদি এটি ইতিমধ্যেই ভেরিয়েবল টেবিলে সক্রিয়া না। তারপরে, এটি বৃদ্ধি করে।

আরও সংক্ষেপে (এর জন্য হিস্টোক্র্যাটকে ধন্যবাদ len):

def method():
    a=len(vars())+1
    a=len(vars())+1
    print(a)

দুটি অনুলিপি Xএকই লাইনে থাকতে পারে, আমরা করতে পারে

a=0;a+=1;a

যা দ্বিগুণ হয়

a=0;a+=1;aa=0;a+=1;a

"কোরবানির ভেড়া" aaদ্বিতীয় ভেরিয়েবল অ্যাসাইনমেন্ট খাওয়ার সাথে।


3
আমি এতো তাড়াতাড়ি পোস্ট করে কোনও ছদ্মবেশী হতে চাই না, তাহলে আমরা কীভাবে সংক্ষিপ্ততম কোডটির জন্য চেষ্টা করব?
xnor

3
সামান্য খাটো বৈকল্পিক:a=len(vars())+1
হিস্টোক্র্যাট

@ হিস্টোক্র্যাট ভাল লাগল, ধন্যবাদ!
xnor

9

পাইথন

এই সমাধান চিন্তার, যেহেতু tryএবং exceptএকটি পরিবর্তনশীল এখনো বা না অস্তিত্ব প্রথম আমি চিন্তা নির্ধারণ ছিল।

def method():
    try:a+=1
    except:a=1
    print(a)

5

পাইথন 2

def method():
    exec'';locals()['a']=locals().get('a',0)+1
    exec'';locals()['a']=locals().get('a',0)+1
    print a

method()

মূলত, execপাইথন 2-এ মুখোমুখি হওয়ার পরে এটি একটি বিশেষ পতাকা ( 0x01) অপসারণ করে method.func_code.co_flagsযার ফলে localsঅ্যাসাইনমেন্টগুলির প্রভাব রয়েছে। nonlocalপাইথন 2 এ সমর্থন বাস্তবায়নের জন্য আমি এটি কাজে লাগিয়েছি (পতাকাটি সংশোধনকারী জোরের জন্য 43 লাইন দেখুন)।


না কেন a = locals().get('a', 0) + 1?
ভিনসেন্ট

@ ভিনসেন্ট আমি তিরি ছিলাম। : হে স্থির।
kirbyfan64sos


@ ভিনসেন্ট এহ, সম্ভবত আমার দীর্ঘতর সংস্করণটি থাকা উচিত। এটি আরও সৃজনশীল অনুভূত হয়েছিল। এখন এটি বেশিরভাগের কাছে শীর্ষ-ভোট দেওয়া উত্তরের
ক্লোনির

2

আমার প্রথম ধারণাটি (এবং তারপরে এটি স্মুশ করা) ছিল:

def method():
    a=2if'a'in vars()else 1 
    a=2if'a'in vars()else 1 
    print(a)

তবে হিস্ট্রোকের উত্তরটি সর্বোত্তম বলে মনে হয়।


1

আমার চেষ্টা এক্স একবার বা দুবার চালিত হয়েছে তা ট্র্যাক করতে গণিতের মডিউল ব্যবহার করে।

def module():
  import sys
  if 'math' in sys.modules:
    a+=1
  else:
    a=1
  import math

  import sys
  if 'math' in sys.modules:
    a+=1
  else:
    a=1
  import math

  print(a)

module()

1
def method(a=[]):  
  a.append(a)  
  print len(a)

মন্তব্যের জবাবে সম্পাদিত: এ হ'ল দৈর্ঘ্যের খালি তালিকার একটি তালিকা, যেখানে n পদ্ধতিটি আপনি যে সময়টি কল করেছেন তার সংখ্যা। এই পদ্ধতিটি কল করে 2 বার 1 টি প্রিন্ট করে।


7
ফেলে a=[]একটি প্যারামিটার হিসেবে এই চ্যালেঞ্জের জন্য পরামিতি বাইরে আছে।
mbomb007

দুঃখিত, এটি আমার উত্তর, এবং এটি খুব ভাল নয়। এটি (তর্কযোগ্যভাবে) অজগরটিতে একটি আশ্চর্যজনকভাবে অ-আদর্শহীন অভিযান, তবে চ্যালেঞ্জকেও তুচ্ছ না করে এটিকে চ্যালেঞ্জের জন্য দেওয়া বিন্যাসে স্লট করার কোনও উপায় নেই।
বিজ্ঞান

এছাড়াও, চ্যালেঞ্জটি কেবল দুটি ভিন্ন জিনিস নয়, 1 বা 2 মুদ্রণ করতে বলে।
xnor

0
def method():
    #### X-block
    try:a
    except NameError:a=1
    else:a=2
    ####
    print(a)

tryব্লক চেক পরিবর্তনশীল একটি সংজ্ঞায়িত করা হয় পারেন।
যদি ভেরিয়েবল সংজ্ঞায়িত না করা হয়, (এটি কেবলমাত্র এক্স-ব্লক একবার উপস্থিত হলে) NameErrorব্যতিক্রম উত্থাপিত হয়।
যদি ভেরিয়েবল সংজ্ঞায়িত করা হয়, (এটি যখন এক্স-ব্লক দুইবার উপস্থিত থাকে) তখন elseপ্রবেশ করা হবে।


হ্যাঁ, গুগল অনুসন্ধান করে এটিই আমি সমাধান পেয়েছি। তারপরে আমি আমার বর্তমান সমাধানটি তৈরি করেছি, যা সংক্ষিপ্ত।
mbomb007

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