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


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)*100x/r%2*100आदि) में कुछ निरर्थक कोष्ठक हैं
लिन

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