¿Cómo puedo acortar este código de Python?

12

Aquí está el código que quiero acortar.

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

Salida:

black
yellow
black
Ranvijay Singh
fuente
2
¿Te importaría explicar para qué es exactamente esto y qué estás haciendo?
Okx
Esto está fuera del tema de la OMI. No hay "ganador" y las propinas son más generales.
Christopher
8
@ Christopher2EZ4RTZ tuvimos muchas preguntas como esa antes. no están fuera de tema, esto había sido discutido durante mucho tiempo
Uriel
13
Para los votantes cercanos, consejos de golf preguntas son perfectamente en el tema aquí, tal como se decidió en la meta
caird coinheringaahing
1
¿Nos puede dar la declaración del problema?
xnor

Respuestas:

18

En lugar de ((a*10+c)*10)+dpodemos usar ((a*2+c)*2)+dpara distinguir los colores.

 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, pero ahora solo estamos distinguiendo entre valores de 0a 7, por lo que podemos indexarlos en una 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]

En combinación con los cambios de Uriel, llegamos a 136 bytes (164 bytes guardados) .

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

Pruébalo en línea!

Lynn
fuente
@RanvijaySingh Si no te importa poner ,(comas) entre los enteros, entonces puedes alcanzar 115 bytes
Sr. Xcoder
5

Para la repetición use una execdeclaración,

map(int, para la conversión de la entrada de cadena en números,

acortar el cálculo rcon r=a*100+c*10+d, a continuación, poner los cálculos de cada variable ( a, c, d) en lugar de la variable,

y para las condiciones, use un diccionario con una getconsulta.

Finalmente, machaca todo en una línea.

Resultado final (actualización):

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 guardados: 121 .

Uriel
fuente
¿Pueden agregar un enlace tio? ¡Gracias!
Sr. Xcoder
1
@ Mr.Xcoder No sé qué tipo de entrada espera OP, así que no puedo dar un ejemplo hasta que lo haga
Uriel
1
Por cierto, puede guardar bastantes bytes usandoexec"..."*input()
Mr. Xcoder
1
Tiene algunos paréntesis redundantes allí (alrededor print, y (x/r%2)*100x/r%2*100etc.)
Lynn
2
@ Lynn sí, lo cubriste mejor. Acabo de aplicar técnicas de golf, y estoy acostumbrado a Python 3
Uriel el