1

この関数 (便宜上 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;
}

この種のループを算術演算に変換するための一般的でばかげた手法があれば、それは理想的な答えです。それができない場合、このインスタンスの解決策は問題ありません。

4

2 に答える 2

0

nmclean の回答とこの質問の概念を組み合わせることで、次のようになりました。

function overlap(min1, max1, min2, max2) {
  return Math.max(0, Math.min(max1, max2) - Math.max(min1, min2));
}
size = (overlap(from, from+len, 0x000000, 0x00D800) +
        overlap(from, from+len, 0x00E000, 0x010000) +
        overlap(from, from+len, 0x010000, 0x110000)*2);

オリジナルと常に同じ結果が得られるように徹底的にテストしており、一般的なケースでこの種のことを行う方法を明確に示しています。

于 2014-01-25T04:07:33.860 に答える