私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「類似度測定器ルイージを開発せよ」(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ループをブレークしようかと思った名残です。