Как определить наименьшее количество приращений Y, необходимое для построения кратного 5 на графике? - PullRequest
1 голос
/ 23 сентября 2019

Используя JavaScript, на графике будет построен массив чисел (для моих целей это сплайн-диаграмма ):

[12, 22, 25, 38, 47]

spline-1

Я хочу, чтобы все значения оси Y были кратны 5. У меня есть ось Y, ограниченная следующим кратным 5 , который происходит посленаибольшее число в массиве.Так как 47 является наибольшим числом, следующим кратным 5 будет 50 (назовите это значение "cap"), и это будет верхнее значение ("галочка") на оси Y диаграммы.После выяснения этого я знаю, что ось Y должна быть 0 внизу и 50 вверху, но я хочу переопределить поведение по умолчанию и точно сказать, сколько тиков между ними показывать, и чтозначения должны быть для этих тиков.

Вот где это становится сложным из-за следующих ограничений:

  1. Используйте наименьшее число возможных тиков (0, максимальное значение и, по крайней мере, один тик между ними)
  2. Нижнее значение всегда равно нулю
  3. Все значения тиков Y кратны 5
  4. Тики Y равномерно распределены по оси

В предыдущем примере пятьдесят - это ограничение, которое делится на два, поэтому оси Y потребуется только один тик вмежду нижней и верхней частями, в результате чего три значения тика 0, 25, 50.Функция, которую я пытаюсь построить, получит 50 в качестве аргумента и выдаст 3 в качестве результата.Тогда я бы знал, что графику нужно 3 тика, и я мог бы сгенерировать его следующим образом:

spline-2

У меня такой вопрос, учитывая, что отображаемое значение может бытьлюбое кратное 5, как вычислить наименьшее количество тиков, необходимое на оси Y, используя только приращения, кратные 5 ?Может быть проще всего показать первые несколько сценариев, чтобы проиллюстрировать, как шаблон не является (по крайней мере для меня) очевидным:

value = tick1, tick2, tick3, etc. >> return count of ticks

05 = 5, 4, 3, 2, 1, 0 >> return 6;// This case is an outlier and can be set manually
10 = 10, 5, 0 >> return 3;
15 = 15, 10, 5, 0 >> return 4;
20 = 20, 10, 0 >> return 3;
25 = 25, 20, 15, 10, 5, 0 >> return 6;
30 = 30, 15, 0 >> return 3;
35 = 35, 30, 25, 20, 15, 10, 5, 0 >> return 8;
40 = 40, 20, 0 >> return 3;
45 = 45, 30, 15, 0 >> return 4;
50 = 50, 25, 0 >> return 3;
55 = 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5, 0 >> return 12;

Именно в этот момент я понял, что, вероятно, существует уравнение или функциякоторая существует для решения этой дилеммы, может быть, даже что-то связанное с последовательностью Фибоначчи или Дэном БрауномЯ не смог найти связанных с этим вопросов SO, и мое использование "приращений 5" может сделать этот вариант использования слишком конкретным, чтобы возвращать результаты Google по общему принципу, поэтому любые советы приветствуются.

1 Ответ

1 голос
/ 23 сентября 2019

Вы можете использовать итеративный подход, используя пятую часть значения, проверяя способность для деления на 2, 3, 5, 7 и т. Д., И возвращать это значение, увеличенное на единицу.

const
    fn = v => {
        v /= 5;
        if (v === 1) return 6;
        if (v % 2 === 0) return 3;
        var i = 1;
        while ((i += 2) < v) if (v % i === 0) return i + 1;
        return v + 1;
    },
    format = s => s.toString().padStart(2);

var values = Array.from({ length: 12 }, (_, i) => (i + 1) * 5),
    data = values.map(fn);

console.log(...values.map(format));
console.log(...data.map(format));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...