この関数 (便宜上 C で記述されていますが、これは質問にとって重要ではありません) は、配列のサイズを決定します。if-else チェーンや方程式に変換できると確信していますが、その方法を理解できるほど賢くはありません。(明らかな if-else チェーンを書き留めようとしましたが、場合によっては行き詰まりました。)
// 0 <= from <= 0x10FFFF
// 1 <= len <= 0x10FFFF
unsigned int size_for_block(unsigned int from, unsigned int len)
{
unsigned int size = 0;
for (unsigned int i = 0; i < len; i++) {
unsigned int point = from + i;
if (0xD800 <= point && point <= 0xDFFF)
;
else if (point <= 0xFFFF)
size += 1;
else
size += 2;
}
return size;
}
この種のループを算術演算に変換するための一般的でばかげた手法があれば、それは理想的な答えです。それができない場合、このインスタンスの解決策は問題ありません。