如何缩短此python代码?


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
对于亲密的选民而言,高尔夫球技巧的问题在此处完全是话题,这取决于meta
caird coinheringaahing

1
能给我们问题陈述吗?
xnor

Answers:


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"

嗯,但是现在我们只是在0to的值之间进行区分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]

结合Uriel的更改,我们减少到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个字节
Xcoder先生,2017年

5

对于重复,请使用一条exec语句,

map(int, 用于将字符串输入转换为数字,

缩短计算rr=a*100+c*10+d,然后把每个变量的计算(acd)代替变量,

对于条件,请使用带有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链接吗?谢谢!
Xcoder先生17年

1
@ Mr.Xcoder我不知道输入OP期望什么类型,因此直到他做到之前我无法给出示例
Uriel

1
顺便说一句,您可以使用exec"..."*input()
Xcoder先生保存

1
您在其中有一些多余的括号(print,和(x/r%2)*100x/r%2*100等)
Lynn

2
@Lynn是的,您对此有所了解。我只是应用了高尔夫技术-我习惯了python 3
Uriel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.