निर्विवाद पायथन [बंद]


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? मुझे संदेह है, हालांकि मुझे यह पता नहीं चला है कि अभी तक कैसे ...


अच्छी पहेली! मैंने यह सुनिश्चित किया कि मैं नीचे स्क्रॉल न करूं, इसलिए मैं किसी के उत्तर को देखे बिना इसे स्वयं हल कर सकता हूं। : D
mbomb007

1
ओवेन पहेली के लिए धन्यवाद, और साइट पर आपका स्वागत है। साइट पर एक नियम है कि सभी प्रश्नों में एक उद्देश्य जीतने की स्थिति होनी चाहिए, इसलिए आपको संभवतः एक जोड़ना चाहिए। एक संभावना सबसे कम लंबाई है X, लेकिन अन्य विकल्प भी हैं।
ईसैक

3
"सभी सवालों का एक उद्देश्य जीतने की स्थिति होना चाहिए" - बेवकूफ नियम इम्हो। "विजेता" की परवाह कौन करता है जब हम सभी वास्तव में सबसे अलग-अलग उत्तरों से चर्चा और सीखने का आनंद लेते हैं।
जिमीबी

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
histocrat

@histocrat एक अच्छा, धन्यवाद!
21

9

अजगर

इस समाधान के बारे में सोचा, चूंकि tryऔर exceptपहले तरीके से मैंने यह निर्धारित करने के लिए सोचा था कि एक चर अभी तक मौजूद है या नहीं।

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

5

अजगर २

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?
विंसेंट

@Vincent मैं तिवारी था। : ओ निश्चित।
kirbyfan64sos

उस मामले में आपको exec''किसी और की आवश्यकता नहीं है ;)
विंसेंट

@Vincent एह, शायद मैं अब लंबे संस्करण के साथ रहना चाहिए। यह अधिक रचनात्मक लगा। अब यह सिर्फ शीर्ष-वोट किए गए उत्तर के क्लोन की तरह लगता है ...: /
kirbyfan64sos

2

मेरा पहला विचार था (और फिर इसे सूंघना):

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

लेकिन हिस्टोक्रेट का जवाब इष्टतम लगता है।


1

मेरा प्रयास। यदि X एक या दो बार चलाया जाता है तो ट्रैक करने के लिए गणित मॉड्यूल का उपयोग करता है।

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 की खाली सूची की एक सूची है, जहां n समय की संख्या है जिसे आपने विधि कहा है। इस विधि को दो बार प्रिंट करता है 1 फिर 2।


7
लाना a=[]एक पैरामीटर के रूप इस चुनौती के लिए मानकों के बाहर है।
mbomb007

क्षमा करें, यह मेरा उत्तर है, और यह बहुत अच्छा नहीं है। यह (यकीनन) अजगर में एक आश्चर्यजनक रूप से गैर-बेरोज़गार ऑपरेशन है, लेकिन चुनौती को तुच्छ बनाने के बिना चुनौती के लिए प्रदान किए गए प्रारूप में इसे स्लॉट करने का कोई तरीका नहीं है।
WithScience

इसके अलावा, चुनौती केवल दो अलग-अलग चीजों को नहीं, बल्कि 1 या 2 प्रिंट करने के लिए कहती है।
xnor

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

tryब्लॉक चेकों चर एक परिभाषित किया गया है यदि।
यदि चर को परिभाषित नहीं किया गया है, (यह केवल तब होता है जब एक्स-ब्लॉक एक बार मौजूद होता है) तो NameErrorअपवाद उठाया जाता है।
यदि चर परिभाषित किया गया है, (यह तब है जब एक्स-ब्लॉक दो बार मौजूद है) तो elseदर्ज किया जाएगा।


हाँ, यह वह उपाय है जो मैंने Google पर खोजा है। फिर मैंने अपना वर्तमान समाधान बनाया, जो छोटा है।
mbomb007

@ mbomb007 हाँ: पी। आपका रास्ता उपयोग करने से कम हैelse
कमेहामे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.