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

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!


@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 .


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)*100→ x/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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.