मैं इस अजगर कोड को कैसे छोटा कर सकता हूं?


12

यहां वह कोड है जिसे मैं छोटा करना चाहता हूं।

n=input()
while n:
 s=raw_input()
 x,r,g,b=(int(x) for x in s.split())
 a=x/r%2
 c=x/g%2
 d=x/b%2
 r=((a*10+c)*10)+d
 if r==0:e="black"
 elif r==100:e="red"
 elif r==1:e="blue"
 elif r==10:e="green"
 elif r==101:e="magenta"
 elif r==11:e="cyan"
 elif r==110:e="yellow"
 else:e="white"
 print(e)
 n-=1

इनपुट: ३

4643 5913 4827 9752
5583 5357 5120 9400
2025 5475 4339 8392

आउटपुट:

black
yellow
black

2
मन समझा रहा है कि वास्तव में यह क्या है, और आप क्या कर रहे हैं?
— ओकेक्स

यह विषय imo है। कोई "विजेता" नहीं है और युक्तियां अधिक सामान्य हैं।
— क्रिस्टोफर

8
@ क्रिस्टोफर 2 ईज़ेड 4 आरटीजेड में हमारे सामने पहले जैसे कई सवाल थे। वे विषय से दूर है, यह एक लंबे समय के लिए विचार विमर्श नहीं किया था कर रहे हैं किया गया
— ऊरीएल

13
करीबी मतदाताओं के लिए, गोल्फिंग टिप्स सवाल पूरी तरह से विषय पर हैं, जैसा कि मेटा
— caird coinheringaahing

1
क्या आप हमें समस्या कथन दे सकते हैं?
— xnor

जवाबों:


18

इसके बजाय ((a*10+c)*10)+dहम ((a*2+c)*2)+dरंगों को अलग करने के लिए उपयोग कर सकते हैं ।

 r=((a*2+c)*2)+d
 if r==0:e="black"
 elif r==4:e="red"
 elif r==1:e="blue"
 elif r==2:e="green"
 elif r==5:e="magenta"
 elif r==3:e="cyan"
 elif r==6:e="yellow"
 else:e="white"

आह, लेकिन अब हम सिर्फ से मूल्यों के बीच भेद कर रहे हैं 0करने के लिए 7है, तो हम एक सरणी में सूचकांक के बजाय कर सकते हैं!

 r=a*4+c*2+d
 e=["black","blue","green","cyan","red","magenta","yellow","white"][r]
 # or even shorter:
 e="black blue green cyan red magenta yellow white".split()[r]

यूरिल के परिवर्तनों के साथ संयोजन करके हम 136 बाइट्स (164 बाइट्स बचाए गए) के लिए नीचे आते हैं ।

exec'x,r,g,b=map(int,raw_input().split());print"black blue green cyan red magenta yellow white".split()[x/r%2*4+x/g%2*2+x/b%2];'*input()

इसे ऑनलाइन आज़माएं!


@RanvijaySingh यदि आप ,पूर्णांक के बीच (कोमा) डालने में कोई आपत्ति नहीं करते हैं, तो आप 115 बाइट्स
— मिस्टर एक्सकोडर

5

पुनरावृत्ति के लिए एक execकथन का उपयोग करें ,

map(int, स्ट्रिंग इनपुट को अंकों में बदलने के लिए,

की गणना छोटा rसाथ r=a*100+c*10+dहै, तो प्रत्येक चर की गणना डाल ( a, c, d) अलग-अलग करने के बजाय,

और शर्तों के लिए एक getक्वेरी के साथ एक शब्दकोश का उपयोग करें ।

अंत में, सब कुछ एक पंक्ति में मैश करें।

अंतिम परिणाम (अद्यतन):

exec'x,r,g,b=map(int,raw_input().split());print({0:"black",100:"red",1:"blue",10:"green",101:"magenta",11:"cyan",110:"yellow"}.get((x/r%2)*100+(x/g%2)*10+x/b%2,"white"));'*input()

बाइट्स सहेजे गए: 121 ।


क्या आप कृपया एक tio लिंक जोड़ सकते हैं? धन्यवाद!
— श्री एक्सकोडर

1
@ Mr.Xcoder मुझे नहीं पता कि ओपी किस प्रकार के इनपुट की उम्मीद कर रहा है, इसलिए मैं एक उदाहरण नहीं दे सकता जब तक कि वह नहीं करता है
— उरियल

1
Btw आप का उपयोग कर काफी कुछ बाइट्स बचा सकते हैंexec"..."*input()
— श्री Xcoder

1
आपके पास वहाँ (आस-पास print, और (x/r%2)*100→ x/r%2*100आदि) में कुछ निरर्थक कोष्ठक हैं
— लिन

2
@ लियन हाँ, आपने इसे बेहतर तरीके से कवर किया। मैंने सिर्फ गोल्फिंग तकनीक लागू की है - और मुझे अजगर 14
— यूरिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.