Làm thế nào tôi có thể rút ngắn mã trăn này?


12

Đây là đoạn mã mà tôi muốn rút ngắn.

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

Đầu vào: 3

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

Đầu ra:

black
yellow
black

2
Tâm trí giải thích chính xác những gì này là để làm gì, và bạn đang làm gì?
Okx

Đây là chủ đề imo. Không có "người chiến thắng" và lời khuyên chung chung hơn.
Christopher

8
@ Christopher2EZ4RTZ chúng tôi đã có nhiều câu hỏi như vậy trước đây. họ không lạc đề, điều này đã được thảo luận trong một thời gian dài
Uriel

13
Đối với các cử tri thân thiết, các câu hỏi về mẹo chơi gôn hoàn toàn thuộc chủ đề ở đây, như đã quyết định về meta
caird coinheringaahing

1
Bạn có thể cho chúng tôi báo cáo vấn đề?
xnor

Câu trả lời:


18

Thay vì ((a*10+c)*10)+dchúng ta có thể sử dụng ((a*2+c)*2)+dđể phân biệt màu sắc.

 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"

À, nhưng bây giờ chúng tôi chỉ phân biệt giữa các giá trị từ 0đến 7, vì vậy chúng tôi có thể lập chỉ mục thành một mảng thay thế!

 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]

Kết hợp với những thay đổi của Uriel, chúng tôi nhận được tới 136 byte (đã lưu 164 byte) .

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

Hãy thử trực tuyến!


@RanvijaySingh Nếu bạn không ngại đặt ,(dấu phẩy) giữa các số nguyên, thì bạn có thể đạt tới 115 byte
Ông Xcoder

5

Đối với sự lặp lại sử dụng một exectuyên bố,

map(int, để chuyển đổi đầu vào chuỗi thành số,

rút ngắn tính rbằng r=a*100+c*10+d, sau đó đặt các tính toán của mỗi biến ( a, c, d) thay vì các biến,

và cho các điều kiện sử dụng một từ điển với một gettruy vấn.

Cuối cùng, nghiền mọi thứ thành một dòng.

Kết quả cuối cùng (cập nhật):

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

Số byte đã lưu: 121 .


Bạn có thể vui lòng thêm một liên kết tio? Cảm ơn!
Ông Xcoder

1
@ Mr.Xcoder Tôi không biết OP đang mong đợi loại đầu vào nào, vì vậy tôi không thể đưa ra một ví dụ cho đến khi anh ấy làm vậy
Uriel

1
Btw bạn có thể tiết kiệm khá nhiều byte bằng cách sử dụngexec"..."*input()
Ông Xcoder

1
Bạn có một số dấu ngoặc đơn dư thừa ở đó (xung quanh print(x/r%2)*100x/r%2*100v.v.)
Lynn

2
@Lynn yea, bạn bảo hiểm nó tốt hơn. Tôi chỉ áp dụng các kỹ thuật chơi gôn - và tôi đã quen với python 3
Uriel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.