-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path25.cs
72 lines (64 loc) · 1.27 KB
/
25.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
var sum = 0L;
while (Console.ReadLine() is { } line)
{
var d = FromSnafu(line);
sum += d;
}
var conv = ToSnafu(sum);
Console.WriteLine($"Sum: {sum} => {conv}");
long FromSnafu(string snafu)
{
long d = 0L, scale = 1;
for (var i = 0; i < snafu.Length; ++i)
{
d += scale * snafu[^(i + 1)] switch
{
'0' => 0,
'1' => 1,
'2' => 2,
'-' => -1,
_ => -2
};
scale *= 5;
}
return d;
}
//
// Example: 4890
//
// 5^5 5^4 5^3 5^2 5^1 5^0
// 1 2 4 0 3 0
// 1 2 4 1 -2 0
// 1 3 -1 1 -2 0
// 2 -2 -1 1 -2 0 : 2=-1=0
//
string ToSnafu(long d)
{
List<long> rem = new();
do
{
var r = d % 5;
d /= 5;
rem.Add(r);
} while (d > 0);
rem.Add(0);
for (var i = 0; i < rem.Count - 1; ++i)
{
while (rem[i] < -2)
{
rem[i] += 5;
rem[i + 1] -= 1;
}
while (rem[i] > 2)
{
rem[i] -= 5;
rem[i + 1] += 1;
}
}
return string.Join("", rem.Select(r => r switch
{
-2 => "=",
-1 => "-",
_ => r.ToString()
}).Reverse()).TrimStart('0');
}