Отображение шкалы для диапазона значений в консоли

В этом рецепте, на который меня вдохновил RosettaCode, я покажу простой пример того, как нарисовать «графическую» школу из столбиков для некоторого массива значений прямо в консоли и без всяких сторонних библиотек (окромя, стандартной) !

Данный рецепт представляет собой функцию, которая для заданного массива числовых значений (их тип может быть любым, лишь бы для него поддерживались операции сравнения), дает строку, состояющую из нескольких символов Unicode (эти символы представляют собой простые столбики). Столбики из символов (символов — 8 штук, соотвественно, будет 8 разных уровней по высоте на диаграмме) являются основой диаграммы и могут быть выведены как в эмулятор терминала, так и в файл (например, с помощью функции writeln из std.stdio).

Вот код функции и небольшого примера использования:

import std.stdio;

auto showSparkLine(T)(T[] series)
{
	import std.algorithm : min, max, reduce;
	
	enum string[] BAR = ["\u2581", "\u2582", "\u2583", "\u2584", "\u2585", "\u2586", "\u2587", "\u2588"]; 

	auto minimum = reduce!min(series);
	auto maximum = reduce!max(series);
	
	string sparkLine;

	real div = (maximum - minimum) / (BAR.length - 1.0);

	foreach (elem; series)
	{
		if (minimum == maximum)
		{
			sparkLine ~= BAR[$-1];
		}
		else
		{
			auto index = cast(int) ((elem - minimum) / div);
			sparkLine ~= BAR[index];
		}
	}

	return sparkLine;
}

void main()
{
	showSparkLine([1,2,3,4,5]).writeln;
	writeln;
	showSparkLine([-1,0,1,0,-1, 0, 0, 1]).writeln;
}

Выглядит это примерно так:

Честно говоря, сложно придумать, как это применить, однако, я использую это в небольшом скрипте на D, который выводит шкалу громкости в панель XMobar для тайлингового менеджера XMonad.

Добавить комментарий