-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
43 lines (32 loc) · 1.29 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
string[] actualQueue = { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
string DoubleCola(int n) => actualQueue[DoubleColaAnyQueue(actualQueue, n) - 1];
int DoubleColaAnyQueue(IReadOnlyCollection<string> queue, int n)
{
if (n < 1) throw new ArgumentException("Position in queue must be in [1;+∞)", nameof(n));
var k = Math.Pow(2, (int)Math.Ceiling(Math.Log2(Math.Ceiling((double)n / queue.Count) + 1)) - 1);
return (int)Math.Ceiling((n - (k - 1) * queue.Count) / k);
}
//-----------------------
PrintStartupMessage();
while (true)
{
Console.Write("Position in queue: ");
try
{
var position = int.Parse(Console.ReadLine()!);
var personInQueue = DoubleCola(position);
Console.WriteLine($"Person: {personInQueue}");
}
catch (ArgumentNullException) { Console.WriteLine("It's not a number");}
catch (FormatException) { Console.WriteLine("It's not a number");}
catch (ArgumentException e) { Console.WriteLine(e.Message); }
Console.WriteLine();
}
//-----------------------
void PrintStartupMessage()
{
System.Text.StringBuilder builder = new("Initial queue: ");
builder.Append('[').AppendJoin(", ", actualQueue).Append(']');
builder.Append(" with length ").Append(actualQueue.Length);
Console.WriteLine(builder);
}