pechkin: (Default)
pechkin ([personal profile] pechkin) wrote2006-04-03 01:57 pm
Entry tags:

Будет сидеть! Я сказал!

Вдогонку


Безусловно, правильный алгоритм включает в себя вычисление по такой формуле (формулы напишу дома в OOO, на работе нечем, даже в здешнем M$ Wordе математика не установлена):

my @letters = sort('_', 'A' .. 'Z', 'a' .. 'z', '0' .. '9');
#Можно, конечно, пользоваться значениями самих букв в ASCII; 
#может быть, это даже будет немножко легче -- 
#больше значения, заметнее разница.
my $index = 0;
my %letters = map({$_ => 
		       0xFFFFFF * 
		       $index++} 
		  @letters);

foreach my $word (sort(@words))
{
    my $wordcolor = 0;
    my $index = 0;
   
   foreach my $letter (split(//, $word))
    {
	my $addition = $letters{$letter};
	$addition /= scalar(@letters) ** ($index++);
        $wordcolor += $addition ;
    }
}

Проблема только в том, что для достаточно длинных (точнее сказать, сколько-нибудь интересной длины) слов $addition очень быстро сбегает к нулю. Видимо, нужно $index делить на некоторый коэффициент, поправочный.




update: Эксперименты показали, что прикольно, что очень неплохие значения дает коэффициент 2π. А еще лучше -- 1.5π. Разумного объяснения нету.




Update: Тут только такая проблема: если данные расположены несколькими достаточно удаленными друг от друга, но кучными блоками -- как это в моем случае и происходит. Тогда цвета получаются практически неразличимыми.

Тут надо, видимо, тесные интервалы искусственно раздвигать, а слишком большие искусственно же уменьшать. Надо только подумать, как это грамотно делать.




А вот как (ох, не крякнуть бы -- столько умища в такую пустяковую задачу вложено!) Берется некоторое значение $TOO_NARROW -- скажем, 5% всего диапазона значений. Все значения разделяются на блоки: между краями блоков разница больше, чем $TOO_NARROW, а внутри меньше. Потом весь диапазон значений делится на количество блоков, и блокам выдаются новые диапазоны значений -- не от минимума до максимума в блоке, а от нижнего края верхней трети проема, который снизу от блока, до верхнего края нижней трети проема, который сверху от него. Например, трети, на самом деле это тоже играбельное значение.