Эта функция (написанная на C для удобства, но это не важно для вопроса) определяет размер массива. Я уверен, что он может быть преобразован в цепочку 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;
}
Если есть общий, idiotproof метод для преобразования такого рода петли арифметики, что было бы идеальным ответ , В противном случае решение для этого экземпляра будет в порядке.
На самом деле есть * четыре области: от 0 до 0xD7FF, от D800 до DFFF, от E000 до FFFF и от 10000 до 1, 0, 1 и 2 соответственно. Мне нравится идея * здесь, но дополнительный регион делает ее более грязной, чем я полностью доволен. Это часть автоматизированного теста, и тест слишком медленный, поэтому я пытался его оптимизировать, но меня можно было убедить в том, что его легче понять, и это более важно ... – zwol