Come posso abbreviare questo codice Python?


12

Ecco il codice che voglio abbreviare.

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

Ingresso: 3

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

Produzione:

black
yellow
black

2
Ti dispiace spiegare a cosa serve esattamente questo e cosa stai facendo?
Okx,

Questo è fuori tema. Non esiste un "vincitore" e i suggerimenti sono più generali.
Christopher,

8
@ Christopher2EZ4RTZ abbiamo avuto molte domande come questa prima. non sono fuori tema, questo è stato discusso a lungo
Uriel il

13
Per gli elettori vicini, le domande sui suggerimenti per il golf sono perfettamente in argomento qui, come deciso su meta
caird coinheringaahing il

1
Puoi darci la dichiarazione del problema?
xnor

Risposte:


18

Invece di ((a*10+c)*10)+dpossiamo usare ((a*2+c)*2)+dper distinguere i colori.

 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, ma ora stiamo solo distinguendo i valori da 0a 7, così possiamo invece indicizzarli in un array!

 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 combinazione con le modifiche di Uriel, arriviamo a 136 byte (164 byte salvati) .

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

Provalo online!


@RanvijaySingh Se non ti dispiace mettere ,(virgole) tra gli interi, puoi raggiungere 115 byte
Mr. Xcoder

5

Per la ripetizione usa execun'istruzione,

map(int, per la conversione dell'input di stringa in numeri,

accorciare calcolo rcon r=a*100+c*10+d, poi mettere i calcoli di ciascuna variabile ( a, c, d) invece della variabile,

e per le condizioni utilizzare un dizionario con una getquery.

Infine, schiaccia tutto in una riga.

Risultato finale (aggiornamento):

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

Byte salvati: 121 .


Potete per favore aggiungere un link tio? Grazie!
Mr. Xcoder,

1
@ Mr.Xcoder Non so che tipo di input OP si aspetti, quindi non posso fare un esempio fino a quando non lo fa
Uriel

1
A proposito, puoi risparmiare parecchi byte usandoexec"..."*input()
Mr. Xcoder,

1
Ci sono delle parentesi ridondanti (intorno print, e (x/r%2)*100x/r%2*100ecc.)
Lynn,

2
@ Lynn, l'hai coperta meglio. Ho appena applicato le tecniche del golf - e sono abituato a Python 3
Uriel il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.