Как я могу сократить этот код 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
Для близких избирателей вопросы о
совете по гольфу здесь совершенно уместны

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 байтов
Mr. 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 Я не знаю, какой тип ввода ОП ожидает, поэтому я не могу привести пример, пока он этого не сделает
Уриэль

1
Кстати, вы можете сохранить довольно много байтов, используяexec"..."*input()
Mr. Xcoder

1
Там есть несколько лишних скобок (вокруг printи (x/r%2)*100x/r%2*100и т. Д.)
Линн

2
@ Линн, да, ты лучше это объяснил. Я просто применил технику игры в гольф - и я привык к питону 3
Уриэль
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.