আমি কীভাবে এই অজগর কোডটি সংক্ষিপ্ত করতে পারি?


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

ইনপুট: 3

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

আউটপুট:

black
yellow
black

2
এটি ঠিক কী জন্য, এবং আপনি কী করছেন তা বুঝিয়ে দেওয়ার মন?
Okx

এটি ইমো অফ অফ বিষয়। কোনও "বিজয়ী" নেই এবং টিপস আরও সাধারণ।
ক্রিস্টোফার

8
@ ক্রিস্টোফার 2 ই জেড 4 আরটিজেড এর আগে আমাদের মতো অনেক প্রশ্ন ছিল। তারা বিষয়
উরিয়েল

13
ঘনিষ্ঠ ভোটারদের জন্য, golfing টিপস প্রশ্ন এখানে সিদ্ধান্ত অন বিষয় পুরোপুরি হয়, মেটা
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]

উরিলের পরিবর্তনের সাথে একত্রিত হয়ে আমরা ১৩6 বাইটে (১4৪ বাইট সংরক্ষিত) এ নামি

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()

এটি অনলাইন চেষ্টা করুন!


@ রণভিজয়সিংহ যদি আপনি ,পূর্ণসংখ্যার মধ্যে (কমা) স্থাপন করতে আপত্তি না করেন, তবে আপনি 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


আপনি কি একটি টিও লিঙ্ক যুক্ত করতে পারেন? ধন্যবাদ!
মিস্টার এক্সকোডার 18

1
@ মিঃ এক্সকোডার আমি জানি না ওপি কী ধরণের ইনপুট আশা করে, তাই তিনি না করা পর্যন্ত আমি উদাহরণ দিতে পারি না
উরিয়েল

1
বিটিডব্লিউ আপনি ব্যবহার করে বেশ কয়েকটি বাইট সংরক্ষণ করতে পারেনexec"..."*input()
মিস্টার এক্সকোডার

1
আপনার কাছে সেখানে কিছু অপ্রয়োজনীয় প্রথম বন্ধনী রয়েছে (চারপাশে print, এবং (x/r%2)*100x/r%2*100ইত্যাদি)
লিন

2
@ লিন হ্যাঁ, আপনি এটি আরও ভালভাবে কভার করেছেন। আমি সবেমাত্র গল্ফিং কৌশল প্রয়োগ করেছি - এবং আমি অজগর 3
ইউরিয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.