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

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!


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


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)*100→ x/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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.