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)*100→ x/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.