Bagaimana saya bisa mempersingkat kode python ini?

12

Berikut adalah kode yang ingin saya perpendek.

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

Input: 3

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

Keluaran:

black
yellow
black
Ranvijay Singh
sumber
2
Pikiran menjelaskan apa sebenarnya ini untuk apa, dan apa yang Anda lakukan?
Okx
Ini diluar topik imo. Tidak ada "pemenang" dan tip lebih umum.
Christopher
8
@ Christopher2EZ4RTZ kami punya banyak pertanyaan seperti itu sebelumnya. mereka bukan di luar topik, ini sudah lama dibahas
Uriel
13
Untuk para pemilih dekat, pertanyaan kiat bermain golf benar-benar menjadi topik pembicaraan di sini, sebagaimana diputuskan pada meta
caird coinheringaahing
1
Bisakah Anda memberi kami pernyataan masalah?
xnor

Jawaban:

18

Alih-alih ((a*10+c)*10)+dbisa kita gunakan ((a*2+c)*2)+duntuk membedakan warna.

 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, tapi sekarang kita hanya membedakan antara nilai 0ke 7, jadi kita bisa mengindeks ke dalam array sebagai gantinya!

 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]

Menggabungkan dengan perubahan Uriel kita turun ke 136 byte (164 byte disimpan) .

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

Cobalah online!

Lynn
sumber
@RanvijaySingh Jika Anda tidak keberatan menempatkan ,(koma) di antara bilangan bulat, maka Anda dapat mencapai 115 byte
Tn. Xcoder
5

Untuk pengulangan gunakan execpernyataan,

map(int, untuk konversi input string menjadi angka,

mempersingkat menghitung rdengan r=a*100+c*10+d, kemudian menempatkan perhitungan masing-masing variabel ( a, c, d) bukan variabel,

dan untuk kondisi gunakan kamus dengan getkueri.

Akhirnya, tumbuk semuanya menjadi satu baris.

Hasil akhir (memperbarui):

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

Uriel
sumber
Bisakah Anda menambahkan tautan tio? Terima kasih!
Tn. Xcoder
1
@ Mr.Xcoder Saya tidak tahu tipe input OP apa yang diharapkan, jadi saya tidak bisa memberikan contoh sampai dia melakukannya
Uriel
1
Btw Anda dapat menyimpan beberapa byte menggunakanexec"..."*input()
Tn. Xcoder
1
Anda memiliki beberapa tanda kurung yang berlebihan di sana (sekitar print, dan (x/r%2)*100x/r%2*100dll.)
Lynn
2
@ Lynn ya, Anda membahasnya dengan lebih baik. Saya baru saja menerapkan teknik golf - dan saya sudah terbiasa dengan python 3
Uriel