Jak mogę skrócić ten kod python?

12

Oto kod, który chcę skrócić.

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

Wejście: 3

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

Wynik:

black
yellow
black
Ranvijay Singh
źródło
2
Wyjaśnij, do czego dokładnie to służy i co robisz?
Okx,
To jest poza tematem imo. Nie ma „zwycięzcy”, a wskazówki są bardziej ogólne.
Christopher
8
@ Christopher2EZ4RTZ mieliśmy już wiele takich pytań. nie są poza tematem, było to omawiane od dawna
Uriel
13
Dla bliskich wyborców pytania dotyczące golfa są tutaj idealnie na ten temat, jak zdecydowano na meta
caird coinheringaahing
1
Czy możesz podać nam opis problemu?
xnor

Odpowiedzi:

18

Zamiast tego ((a*10+c)*10)+dmożemy użyć ((a*2+c)*2)+ddo rozróżnienia kolorów.

 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"

Ach, ale teraz rozróżniamy tylko wartości od 0do 7, więc zamiast tego możemy indeksować do tablicy!

 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]

W połączeniu ze zmianami Uriela uzyskujemy 136 bajtów (zapisane 164 bajty) .

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

Wypróbuj online!

Lynn
źródło
@RanvijaySingh Jeśli nie masz nic przeciwko wstawianiu ,(przecinków) między liczbami całkowitymi, możesz osiągnąć 115 bajtów
Mr. Xcoder
5

Do powtórzenia użyj exec instrukcji,

map(int, do konwersji ciągów znaków na cyfry,

skrócić obliczenia rz r=a*100+c*10+d, a następnie umieścić na obliczenia każdej zmiennej ( a, c,d ) zamiast zmiennej,

a dla warunków użyj słownika z get zapytaniem.

Na koniec zetrzyj wszystko w jedną linię.

Wynik końcowy (aktualizacja):

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

Zapisane bajty: 121 .

Uriel
źródło
Czy możesz dodać link tio? Dzięki!
Pan Xcoder,
1
@ Mr.Xcoder Nie wiem, jakiego rodzaju danych wejściowych oczekuje OP, więc nie mogę podać przykładu, dopóki nie zrobi tego
Uriel
1
Przy okazji możesz zaoszczędzić sporo bajtów przy użyciuexec"..."*input()
Mr. Xcoder
1
Masz tam trochę zbędnych nawiasów (wokół printi (x/r%2)*100x/r%2*100itd.)
Lynn
2
@ Lynn tak, lepiej to opisałeś. Właśnie zastosowałem techniki gry w golfa - i przywykłem do pytona 3
Uriel