Wie kann ich diesen Python-Code verkürzen?

12

Hier ist der Code, den ich kürzen möchte.

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

Eingabe: 3

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

Ausgabe:

black
yellow
black
Ranvijay Singh
quelle
2
Darf ich erklären, wofür genau das ist und was Sie tun?
Okx
Dies ist nicht zum Thema imo. Es gibt keinen "Gewinner" und die Tipps sind allgemeiner.
Christopher
8
@Christopher2EZ4RTZ wir hatten schon viele Fragen wie diese. Sie sind nicht ohne Thema, das war schon lange diskutiert worden
Uriel
13
Für die nahen Wähler sind Fragen zu
Golftipps hier genau das Richtige
1
Können Sie uns die Problemstellung mitteilen?
15.

Antworten:

18

Stattdessen ((a*10+c)*10)+dkönnen wir ((a*2+c)*2)+dzur Unterscheidung der Farben verwenden.

 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, aber jetzt unterscheiden wir nur zwischen Werten von 0bis 7, damit wir stattdessen in ein Array indexieren können!

 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]

In Kombination mit Uriels Änderungen werden 136 Bytes (164 Bytes gespart) erreicht .

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

Probieren Sie es online!

Lynn
quelle
@RanvijaySingh Wenn es Ihnen nichts ausmacht, ,(Kommas) zwischen die ganzen Zahlen zu setzen, können Sie 115 Bytes erreichen
Mr. Xcoder
5

Verwenden Sie für die Wiederholung eine execAussage,

map(int, für die Umwandlung von Zeichenketten in Ziffern,

verkürzen Berechnung rmit r=a*100+c*10+d, dann stellen die Berechnungen der einzelnen Variablen ( a, c, d) anstelle der Variablen,

Verwenden Sie für die Bedingungen ein Wörterbuch mit einer getAbfrage.

Zum Schluss wird alles in einer Zeile zusammengefasst.

Endergebnis (Aktualisierung):

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

Uriel
quelle
Können Sie bitte einen tio-Link hinzufügen? Vielen Dank!
Mr. Xcoder
1
@ Mr.Xcoder Ich weiß nicht, welche Art von Eingangs-OP erwartet, daher kann ich kein Beispiel nennen, bis er es tut
Uriel
1
Übrigens können Sie mitexec"..."*input()
Mr. Xcoder
1
Sie haben einige überflüssige Klammern (um printund (x/r%2)*100x/r%2*100usw.)
Lynn
2
@Lynn ja, du hast es besser abgedeckt. Ich habe gerade Golftechniken angewendet - und ich bin es gewohnt, Python 3
Uriel