私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「類似度測定器ルイージを開発せよ」(CodeIQ)を参照してください。
- 同じ座標に同じ文字があれば +2
- 同じ座標が両方空白ではなく、かつ同じ文字ではなければ +1
- 同じ座標が片方が空白、もう片方が空白以外であれば +-0
C言語で解答しています。
#include <stdio.h>
int main(int argc, char* argv[]){
char str[16] = {0};
while( fgets(str, sizeof(str), stdin) != NULL ){
int i=0;
int count = 0;
str[12] = 0; // 改行文字の位置を0にしておく
for(i=0; i<6; i++){
int j = i+6;
// 同じ座標の一方が空白でもう一方が空白以外
if((str[i] == ' ' && str[j] != ' ') || (str[i] != ' ' && str[j] == ' ')){
// 何もしない
}
// 両方が空白でなく、違う文字
else if((str[i] != ' ' && str[j] != ' ') && (str[i] != str[j])){
count += 1;
}
// それ以外(両方が同じ文字)
else{
count += 2;
}
}
printf("%d", count);
}
return 0;
}
特に解説するところがあるようなプログラムではありません。
わずかな工夫が13行目で、文字列の参照位置をこの計算だけで決定しています。わざわざ比較用にコピーなどしていないのが唯一の工夫ですが、C言語の経験があればこの程度のことは誰でも思いつきます。17行目はcontinueくらい書いておくべきだったかもしれません。(if - else if - elseの後に処理がないので書かなくても同じですが)
ちなみに10行目でstr[12]に0を入れているのはセンチネルを使ってforループをブレークしようかと思った名残です。