¿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

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!


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


¿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)*100→ x/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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.