return (int)(((n - 1) % 15)/3);
アルゴリズムの話なので、上記は概要的なコードです。使用言語に合わせた記述にしてください。
###解説
入力値が自然数nですから、
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,...
という数値に対する計算のはずです。数式を利用してアレコレするにはゼロスタートが都合がいいので、まず1を引きます。
これで、数値は
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,...
を返すようになります。
次に、15で割ったあまりを求めます。質問では12を基準にされてますが、よく数えてみましょう。15個ずつのループですよね?
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0,1,2,3,4,5,6,7,8,...
最後に、3で割って切り捨てとなる整数値を求めます。
0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,0,0,0,1,1,1,2,2,2,...
これで目的の数値を返す計算になります。
- 15ずつループしてるから、15で割った余り
- 3個同じ数字が続いてるから、3で割った切り捨ての整数値
- ゼロスタートじゃないならゼロスタートになるように、初期値分の数字を引く
このあたりが数値計算のセオリーとして浮かんで、あとはそれをどの順番でやればうまくいきそうかなーと考えていけばいいのです。