Comment puis-je raccourcir ce code python?

12

Voici le code que je souhaite raccourcir.

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

Entrée: 3

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

Production:

black
yellow
black
Ranvijay Singh
la source
2
Voulez-vous expliquer à quoi cela sert exactement et ce que vous faites?
Okx
C'est hors sujet imo. Il n'y a pas de "gagnant" et les pourboires sont plus généraux.
Christopher
8
@ Christopher2EZ4RTZ nous avons eu beaucoup de questions comme celle-là auparavant. ils ne sont pas hors sujet, cela a été discuté depuis longtemps
Uriel
13
Pour les électeurs proches, les questions sur les astuces de golf sont parfaitement sur le sujet ici, comme décidé sur meta
caird coinheringaahing
1
Pouvez-vous nous donner l'énoncé du problème?
xnor

Réponses:

18

Au lieu de cela, ((a*10+c)*10)+dnous pouvons utiliser ((a*2+c)*2)+dpour distinguer les couleurs.

 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, mais maintenant nous faisons juste une distinction entre les valeurs de 0à 7, nous pouvons donc indexer dans un tableau à la place!

 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 combinant avec les changements d'Uriel, nous descendons à 136 octets (164 octets enregistrés) .

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

Essayez-le en ligne!

Lynn
la source
@RanvijaySingh Si cela ne vous dérange pas de mettre ,(virgules) entre les entiers, alors vous pouvez atteindre 115 octets
M. Xcoder
5

Pour la répétition, utilisez une execinstruction,

map(int, pour la conversion de l'entrée de chaîne en chiffres,

raccourcir le calcul ravec r=a*100+c*10+d, puis mettre les calculs de chaque variable ( a, c,d ) au lieu de la variable,

et pour les conditions, utilisez un dictionnaire avec un get requête.

Enfin, écrasez tout sur une seule ligne.

Résultat final (mise à jour):

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

Octets enregistrés: 121 .

Uriel
la source
Pouvez-vous s'il vous plaît ajouter un lien tio? Merci!
M. Xcoder
1
@ Mr.Xcoder Je ne sais pas quel type d'entrée OP attend, donc je ne peux pas donner d'exemple jusqu'à ce qu'il le fasse
Uriel
1
Btw vous pouvez économiser pas mal d'octets en utilisantexec"..."*input()
Mr. Xcoder
1
Vous avez des parenthèses redondantes là-dedans (autour print, et (x/r%2)*100x/r%2*100etc.)
Lynn
2
@Lynn oui, vous l'avez mieux couvert. Je viens d'appliquer des techniques de golf - et je suis habitué au python 3
Uriel