本日の問題はこちら(要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 件のコメント:
コメントを投稿