- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
#include <IO/Stream.h>
#include "Algorithms/Range.h"
#include "Algorithms/RangeConstruct.h"
#include "Algorithms/RangeIteration.h"
#include "Algorithms/RangeMutation.h"
using namespace IO;
using namespace Range;
int main()
{
Console.PrintLine("Есть нормальная поддержка Юникода в консоли, даже на винде.");
Console.PrintLine("Тестируется текст с кириллицей, греческим алфавитом αβγδεζηθικλμνξο, а также с иероглифами ㈇㌤㈳㌛㉨.");
Console.PrintLine("Иероглифы не отображаются в консоли, потому что консольный шрифт их не содержит, но копируются оттуда нормально.");
StringView strs[] = {"hello", "world"};
StringView strs1[] = {"range", "testing", "program"};
StringView strs2[] = {"C++", "крут"};
Console.PrintLine("В тесте используются три массива:", endl, strs, endl, strs1, endl, strs2);
Console.PrintLine(endl, "Пример вывода initializer list:", endl, AsRange<double>({4353.435, 3243.23, 21.421, 12355.5, 64532}));
auto fib = Recurrence(Algo::Op::Add<int>, 1, 1);
Array<int> fibArr;
fibArr.SetCountUninitialized(15);
auto copyResult = fib.Take(15).Copy(fibArr());
Console.PrintLine(endl, "Последовательность Фибоначчи в массиве: ", endl, fibArr());
Console.PrintLine(endl, "Вторая половина того же массива задом наперёд: ", endl, fibArr($/2, $).Retro());
fib.Drop(5).Take(15).Copy(fibArr.Insert($));
Console.PrintLine(endl, "Добавляем 15 чисел Фибоначчи, начиная с пятого, в конец. Новое содержимое массива: ");
Console.PrintLine(fibArr());
Console.PrintLine(endl, "Объединяем элементы различных диапазонов в диапазоне кортежей: ", endl, ToString(
Zip(
fib.Take(30),
Chain(AsRange(strs), AsRange(strs1), AsRange(strs2)).Cycle().Take(20),
Recurrence([](int a, int b){return a*2+b;}, 1, 1).Take(17).Cycle().Drop(3).Take(22),
fib.Take(19).Cycle().Drop(5).Take(50).Stride(3),
Recurrence(Algo::Op::Mul<ulong64>, 2ull, 3ull).Take(9)
),
",\n ", "[\n ", "\n]"));
static const StringView pattern[] = {"pattern", "fills", "range"};
Chain(AsRange(strs), AsRange(strs1), AsRange(strs2)).FillPattern(AsRange(pattern));
Console.PrintLine(endl, "Поменяли сразу три массива одним вызовом FillPattern: ");
Console.PrintLine(strs, endl, strs1, endl, strs2, endl);
Console.PrintLine("11-й элемент зацикленного массива строк: ", endl, AsRange(strs).Cycle().Take(11).Tail(1), endl);
Console.PrintLine("Перевёрнутый массив строк: ", endl, AsRange(strs).Retro(), endl);
Console.PrintLine("Зациклили первые два элемента массива и взяли 10 из них:");
Console.PrintLine(AsRange(strs1).Take(2).Cycle().Take(10) );
Console.PrintLine("Между массивом строк и 5 числами Фибоначчи выбрали второе в рантайме: ");
Console.PrintLine(Choose(AsRange(strs1), fib.Take(5).Map([](int x){return ToString(x);}), true) );
static const size_t indices[] = {1,1,1,2,2,0,2,1,0};
Console.PrintLine(
RoundRobin(
AsRange(strs1).Indexed(AsRange(indices)),
Repeat(StringView("Test"), 5),
AsRange(strs1),
AsRange(strs2)
));
Console.PrintLine(endl, "Введите строки, которые войдут в диапазон строк. В конце введите \"end\".");
Console.PrintLine("Вы ввели следующие строки:", endl, ToString(Console.ByLine("end")) );
int arr[]={1, 4, 11, 6, 8};
Console.PrintLine("max{1, 4, 11, 6, 8} = ", AsRange(arr).Reduce(Algo::Op::Max<int>));
Console.PrintLine("Генерация 100 случайных чисел от 0 до 999 и вывод квадратов тех из них, которые делятся на 7: ", endl,
Generate([](){return math::urandom()%1000;}).Take(100)
.Filter([](uint x) {return x%7==0;})
.Map(math::sqr<uint>)
);
return 0;
}
Давно здесь не было моих велосипедов. А они с тех пор сильно эволюционировали, я даже многие фичи из языка D смог перенести в C++.
Вывод в консоль и обсуждение здесь: http://www.gamedev.ru/flame/forum/?id=216045&page=99#m1481