本日の問題はこちら(要TopCoder登録 & 問題文は英語)。
問題のおおまかな訳は以下のようになる。
視覚に訴えかけるメディアでは、特定の部分を引き立たせるため、ある色の補色を考えることがある。補色というのは、画像のRGB値が0-255の範囲で表される場合、RGBのそれぞれの値に対し、255から引き算した値に変換することによって得ることができる。
ただし、RGBの値が128に近いとあまり目立たせることができない。そこで、上記の変換の前後でRGB値の変化がすべて32以下であれば、128足すか引くということを0-255の範囲に収まるように行う。例えば(r,g,b)=(120,130,140)の補色の関係にある色は(r,g,b)=(135,125,115)となるが、いずれの色の変化も32以下なので、(r,g,b)=(120+128,130-128,140-128)=(248,2,12)という変換を行う。130や140に128を足すと255を超えるので、引くことにしなければならないことに注意。
入力rgb[]が与えられたときに、rgb[]の補色を返すようなメソッドgetComplementを作成せよ。クラス名はRGBColorとする。
public class RGBColor { public int[] getComplement(int[] rgb) { int[] myrgb = new int[rgb.length]; boolean flg = false; for( int i=0 ; i<rgb.length ; i++ ){ myrgb[i] = 255-rgb[i]; if( Math.abs(myrgb[i]-rgb[i])>32 ){ flg = true; } } if( flg == true ){ return myrgb; }else{ for( int i=0 ; i<rgb.length ;i++){ if( rgb[i]<=127 ){ myrgb[i] = rgb[i]+128; }else{ myrgb[i] = rgb[i]-128; } } return myrgb; } } }
点数は250点満点の205.14、正解率を考えればまずまずといったところ。最初はflg=trueと書いてバグが出ていたので、それがなければもう少し点数を稼げたかと。
0 件のコメント:
コメントを投稿