-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.cs
146 lines (124 loc) · 4.53 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using AlgorithmVisualizer.Algorithms;
using AlgorithmVisualizer.Algorithms.Contract;
using Spectre.Console;
namespace AlgorithmVisualizer;
internal class Program
{
private static async Task Main(string[] args)
{
InitializeConsole();
while (true)
{
var size = PromptForSize().Result;
var algorithm = PromptForAlgorithm().Result;
var delay = PromptForDelay().Result;
var data = RandomizeData(size);
Canvas canvas = new(size, 100);
switch (algorithm)
{
case "Bubble Sort":
await VisualizeBubbleSort(data, canvas, delay);
break;
case "Quick Sort":
await VisualizeQuickSort(data, canvas, delay);
break;
case "Insertion Sort":
await VisualizeInsertionSort(data, canvas, delay);
break;
case "Merge Sort":
await VisualizeMergeSort(data, canvas, delay);
break;
case "Heap Sort":
await VisualizeHeapSort(data, canvas, delay);
break;
}
}
}
private static Task<int> PromptForSize()
{
var sizePrompt = new SelectionPrompt<int>()
.Title("Choose a size for the data set:")
.PageSize(10)
.AddChoices(10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
return Task.FromResult(AnsiConsole.Prompt(sizePrompt));
}
private static Task<string> PromptForAlgorithm()
{
var algorithmPrompt = new SelectionPrompt<string>()
.Title("Choose a sorting algorithm to visualize:")
.PageSize(10)
.AddChoices("Bubble Sort", "Quick Sort", "Insertion Sort", "Merge Sort", "Heap Sort");
return Task.FromResult(AnsiConsole.Prompt(algorithmPrompt));
}
private static Task<int> PromptForDelay()
{
var delayPrompt = new SelectionPrompt<int>()
.Title("Choose a delay for the visualization:")
.PageSize(10)
.AddChoices(10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
return Task.FromResult(AnsiConsole.Prompt(delayPrompt));
}
private static void InitializeConsole()
{
AnsiConsole.Console.Clear(true);
AnsiConsole.Write(
new FigletText("Algorithm Visualizer")
.Centered()
.Color(Color.Blue));
}
private static async Task VisualizeBubbleSort(int[] data, Canvas canvas, int delay)
{
var bubbleSort = new BubbleSort(data, canvas, delay);
await LoadVisualizer(bubbleSort);
await bubbleSort.ExecuteAsync();
}
private static async Task VisualizeQuickSort(int[] data, Canvas canvas, int delay)
{
var quickSort = new QuickSort(data, canvas, delay);
await LoadVisualizer(quickSort);
await quickSort.ExecuteAsync();
}
private static async Task VisualizeInsertionSort(int[] data, Canvas canvas, int delay)
{
var insertionSort = new InsertionSort(data, canvas, delay);
await LoadVisualizer(insertionSort);
await insertionSort.ExecuteAsync();
}
private static async Task VisualizeMergeSort(int[] data, Canvas canvas, int delay)
{
var mergeSort = new MergeSort(data, canvas, delay);
await LoadVisualizer(mergeSort);
await mergeSort.ExecuteAsync();
}
private static async Task VisualizeHeapSort(int[] data, Canvas canvas, int delay)
{
var heapSort = new HeapSort(data, canvas, delay);
await LoadVisualizer(heapSort);
await heapSort.ExecuteAsync();
}
private static async Task LoadVisualizer(IAlgorithm algorithm) =>
await AnsiConsole.Progress()
.StartAsync(ctx =>
{
var task1 = ctx.AddTask($"[green]Initializing {algorithm.Name}[/]");
var task2 = ctx.AddTask("[green]Initializing Canvas[/]");
while (!ctx.IsFinished)
{
Thread.Sleep(100);
task2.Increment(1.5);
task1.Increment(1.75);
}
Task.Delay(1000);
return Task.CompletedTask;
});
private static int[] RandomizeData(int size)
{
var data = new int[size];
Random random = new();
for (var i = 0; i < data.Length; i++)
{
data[i] = random.Next(0, 50);
}
return data;
}
}