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

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!


@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 .


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)*100→ x/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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.