Como posso encurtar esse código python?

12

Aqui está o código que eu quero encurtar.

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

Entrada: 3

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

Resultado:

black
yellow
black
Ranvijay Singh
fonte
2
Se importa em explicar exatamente para que serve isso e o que você está fazendo?
Okx 15/10
Isso está fora do tópico imo. Não há "vencedor" e as dicas são mais gerais.
Christopher
8
@ Christopher2EZ4RTZ, tivemos muitas perguntas como essa antes. eles não estão fora de tópico, isso foi discutido por um longo tempo
Uriel
13
Para os eleitores próximos, dicas de golfe perguntas são perfeitamente on-topic aqui, tal como decidido na meta
caird coinheringaahing
1
Você pode nos dar a declaração do problema?
Xnor

Respostas:

18

Em vez de ((a*10+c)*10)+dusarmos ((a*2+c)*2)+dpara distinguir as cores.

 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"

Ah, mas agora estamos apenas distinguindo entre valores de 0para 7, para que possamos indexar em uma matriz!

 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]

Combinando com as mudanças de Uriel, chegamos a 136 bytes (164 bytes salvos) .

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

Experimente online!

Lynn
fonte
@RanvijaySingh Se você não se importa colocar ,(vírgulas) entre os inteiros, então você pode chegar a 115 bytes
Mr. Xcoder
5

Para a repetição, use uma execdeclaração,

map(int, para a conversão da entrada de string em numerais,

encurtar o cálculo rcom r=a*100+c*10+d, em seguida, colocar os cálculos de cada variável ( a, c, d) em vez da variável,

e para as condições, use um dicionário com uma getconsulta.

Finalmente, amasse tudo em uma linha.

Resultado final (atualização):

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

Bytes salvos: 121 .

Uriel
fonte
Você pode adicionar um link tio? Obrigado!
Sr. Xcoder 15/10
1
@ Mr.Xcoder Eu não sei que tipo de OP entrada de espera, por isso não posso dar um exemplo até que ele faz
Uriel
1
Btw você pode economizar muito poucos bytes utilizandoexec"..."*input()
Mr. Xcoder
1
Você tem alguns parênteses redundantes lá (em torno de print, e (x/r%2)*100x/r%2*100etc.) #
Lynn
2
@ Lynn sim, você cobriu melhor. Eu só aplicou técnicas de golfe - e eu estou acostumado a python 3
Uriel