Як я можу скоротити цей код python?


12

Ось код, який я хочу скоротити.

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

Вхід: 3

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

Вихід:

black
yellow
black

2
Розумійте, для чого саме це і що ви робите?
Okx

Це поза темою imo. Немає "переможця", а поради більш загальні.
Крістофер

8
@ Christopher2EZ4RTZ у нас було багато таких питань, як раніше. вони не поза темою, це обговорювалося давно
Уріель

13
Для близьких виборців питання гольфу з питань гольфу є ідеально актуальними тут, як вирішили мета
caird coinheringaahing

1
Чи можете ви дати нам проблему?
xnor

Відповіді:


18

Замість цього ((a*10+c)*10)+dми можемо використовувати ((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"

Ах, але тепер ми просто розрізняємо значення від 0до 7, тому ми можемо замість цього індексувати масив!

 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]

Поєднуючись зі змінами Уріеля, ми знижуємось до 136 байт (164 байти збережено) .

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

Спробуйте в Інтернеті!


@RanvijaySingh Якщо ви не заперечуєте над тим, щоб ставити ,(коми) між цілими числами, ви можете досягти 115 байт
містер Xcoder

5

Для повторення використовуйте execвислів,

map(int, для перетворення рядкового вводу в цифри,

скоротити обчислення rз r=a*100+c*10+d, а потім покласти розрахунки кожної змінної ( a, c, d) замість змінної,

а для умов використовуйте словник із getзапитом.

Нарешті, збийте все в один рядок.

Кінцевий результат (оновлення):

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

Байтів збережено: 121 .


Ви можете додати посилання на tio? Дякую!
Містер Xcoder

1
@ Mr.Xcoder Я не знаю, якого типу вхідного плану очікує, тому я не можу навести приклад, поки він цього не зробить
Uriel

1
До речі, ви можете зберегти небагато байтів, використовуючиexec"..."*input()
містер Xcoder

1
У вас є кілька зайвих дужок (навколо printта (x/r%2)*100x/r%2*100тощо)
Lynn

2
@Lynn так, ти краще це покрив. Я щойно застосував техніку гольфу - і звик до пітона 3
Уріель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.