ฉันจะย่อรหัสหลามนี้ได้อย่างไร


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

นี่เป็นหัวข้อ imo ไม่มี "ผู้ชนะ" และเคล็ดลับทั่วไปมากขึ้น
Christopher

8
@ Christopher2EZ4RTZ เรามีคำถามมากมายเช่นนั้นมาก่อน พวกเขาไม่ได้อยู่นอกหัวข้อนี้ได้มีการพูดคุยกันเป็นเวลานาน
Uriel

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 ไบต์
Mr. Xcoder

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 ได้ไหม? ขอบคุณ!
Mr. Xcoder

1
@ Mr.Xcoder ฉันไม่รู้ประเภทของอินพุต OP ที่คาดหวังดังนั้นฉันไม่สามารถยกตัวอย่างได้จนกว่าเขาจะทำ
Uriel

1
Btw คุณสามารถบันทึกได้ไม่กี่ไบต์โดยใช้exec"..."*input()
Mr. Xcoder

1
คุณมีวงเล็บที่ซ้ำซ้อนอยู่ในนั้น (รอบ ๆprintและ(x/r%2)*100x/r%2*100ฯลฯ )
ลินน์

2
@ ลินน์ใช่คุณครอบคลุมมันได้ดีขึ้น ฉันเพิ่งใช้เทคนิคการตีกอล์ฟ - และฉันคุ้นเคยกับ python 3
Uriel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.