12
\$\begingroup\$

Here is the code which I want to shorten.

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

Input: 3

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

Output:

black
yellow
black
\$\endgroup\$
7
  • 2
    \$\begingroup\$ Mind explaining what exactly what this is for, and what you're doing? \$\endgroup\$
    – Okx
    Oct 15, 2017 at 18:47
  • \$\begingroup\$ This is off topic imo. There is no "winner" and tips are more general. \$\endgroup\$
    – user63187
    Oct 15, 2017 at 19:04
  • 8
    \$\begingroup\$ @Christopher2EZ4RTZ we had many questions like that one before. they are not off topic, this had been discussed for a long time \$\endgroup\$
    – Uriel
    Oct 15, 2017 at 19:05
  • 13
    \$\begingroup\$ For the close voters, golfing tips questions are perfectly on-topic here, as decided on meta \$\endgroup\$ Oct 15, 2017 at 19:07
  • 1
    \$\begingroup\$ Can you give us the problem statement? \$\endgroup\$
    – xnor
    Oct 15, 2017 at 19:12

2 Answers 2

18
\$\begingroup\$

Instead of ((a*10+c)*10)+d we can use ((a*2+c)*2)+d to distinguish the colors.

 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, but now we're just distinguishing between values from 0 to 7, so we can index into an array instead!

 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]

Combining with Uriel's changes we get down to 136 bytes (164 bytes saved).

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

Try it online!

\$\endgroup\$
1
  • \$\begingroup\$ @RanvijaySingh If you don't mind putting , (commas) between the integers, then you can reach 115 bytes \$\endgroup\$
    – Mr. Xcoder
    Oct 15, 2017 at 19:51
5
\$\begingroup\$

For the repetition use an exec statement,

map(int, for the conversion of string input into numerals,

shorten calculating r with r=a*100+c*10+d, then put the calculations of each variable (a, c, d) instead of the variable,

and for the conditions use a dictionary with a get query.

Finally, mash everything into one line.

Final result (updating):

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

Bytes saved: 121.

\$\endgroup\$
7
  • \$\begingroup\$ Can you please add a tio link? Thanks! \$\endgroup\$
    – Mr. Xcoder
    Oct 15, 2017 at 18:57
  • 1
    \$\begingroup\$ @Mr.Xcoder I don't know what type of input OP is expecting, so I can't give an example until he does \$\endgroup\$
    – Uriel
    Oct 15, 2017 at 18:58
  • 1
    \$\begingroup\$ Btw you can save quite a few bytes using exec"..."*input() \$\endgroup\$
    – Mr. Xcoder
    Oct 15, 2017 at 18:59
  • 1
    \$\begingroup\$ You have some redundant parentheses in there (around print, and (x/r%2)*100x/r%2*100 etc.) \$\endgroup\$
    – Lynn
    Oct 15, 2017 at 19:11
  • 2
    \$\begingroup\$ @Lynn yea, you covered it better. I just applied golfing techniques - and I'm used to python 3 \$\endgroup\$
    – Uriel
    Oct 15, 2017 at 19:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.