Bu python kodunu nasıl kısaltabilirim?


12

İşte kısaltmak istediğim kod.

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

Giriş: 3

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

Çıktı:

black
yellow
black

2
Bunun ne için olduğunu ve ne yaptığınızı açıklamak ister misiniz?
Okx

Bu konu dışı imo. "Kazanan" yoktur ve ipuçları daha geneldir.
Christopher

8
@ Christopher2EZ4RTZ daha önce bunun gibi birçok sorumuz vardı. konu dışı değiller, bu uzun zamandır tartışıldı
Uriel

13
Yakın seçmenler için, golf ipuçları soruları burada mükemmel bir şekilde konuyla ilgili, meta
caird coinheringaahing

1
Bize sorun bildirisini verebilir misiniz?
xnor

Yanıtlar:


18

Bunun yerine renkleri ayırt etmek için ((a*10+c)*10)+dkullanabiliriz ((a*2+c)*2)+d.

 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, ama şimdi biz sadece alınan değerler arasında ayrım ediyoruz 0için 7, bu yüzden bir diziye endeksi yerine can!

 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]

Uriel'in değişiklikleriyle birlikte 136 bayta (164 bayt kaydedildi) iniyoruz .

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

Çevrimiçi deneyin!


@RanvijaySingh ,Tamsayıların arasına (virgül) koymak sakıncası yoksa , o zaman 115 bayta
Bay Xcoder

5

Tekrar için bir execifade kullanın ,

map(int, dize girdisinin sayılara dönüştürülmesi için,

hesaplama kısaltmak rile r=a*100+c*10+d, daha sonra her bir değişkenin hesaplamalar koyun ( a, c, d) kullanılarak değişken bölgesinin

ve koşullar için getsorgu içeren bir sözlük kullanın.

Son olarak, her şeyi tek bir hatta ezin.

Nihai sonuç (güncelleme):

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

Kaydedilen bayt: 121 .


Lütfen bir tio bağlantısı ekleyebilir misiniz? Teşekkürler!
Bay Xcoder

1
@ Mr.Xcoder OP'nin ne tür bir girdi beklediğini bilmiyorum, bu yüzden yapana kadar örnek veremem
Uriel

1
Btw kullanarak birkaç bayt kaydedebilirsinizexec"..."*input()
Bay Xcoder

1
Orada bazı parantezler var (etrafında printve (x/r%2)*100x/r%2*100vb.)
Lynn

2
@ Linyn yea, daha iyi kapattın. Sadece golf tekniklerini uyguladım - ve python 3'e alışkınım
Uriel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.