-
Notifications
You must be signed in to change notification settings - Fork 7
/
NumberClimber.cs
152 lines (117 loc) · 4.16 KB
/
NumberClimber.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
147
148
149
150
151
152
/*
https://www.codewars.com/kata/559760bae64c31556c00006b/csharp
7 kyu
Number climber
For every positive integer N, there exists a unique sequence starting with 1 and ending with N and such that every number in the sequence is either the double of the preceeding number or the double plus 1.
For example, given N = 13, the sequence is [1, 3, 6, 13], because . . . :
3 = 2*1 +1
6 = 2*3
13 = 2*6 +1
Write a function that returns this sequence given a number N.
Try generating the elements of the resulting list in ascending order, i.e.,
without resorting to a list reversal or prependig the elements to a list.
*/
using System;
using System.Collections.Generic;
using System.Linq;
namespace CodeWars
{
public class NumberClimber
{
public static int[] Climb(int n)
{
return new int[(int) Math.Log(n, 2)].Select(_ => n /= 2).Prepend(n).Reverse().ToArray();
//return new string(' ', (int) Math.Log(n, 2)).Select(_ => n /= 2).Prepend(n).Reverse().ToArray();
//return Enumerable.Range(0, (int) Math.Log(n, 2)).Select(_ => n /= 2).Prepend(n).Reverse().ToArray();
// var seq = new List<int> {n};
// while (n > 1) seq.Insert(0, n /= 2);
// return seq.ToArray();
// List<int> seq = new List<int> {n};
// while (n > 1)
// {
// seq.Insert(0, n /= 2);
// }
// return seq.ToArray();
// var numbers = new List<int> {n};
// while (numbers.Min() > 1)
// {
// numbers.Add(numbers.Last() / 2);
// }
// return numbers.ToArray().Reverse().ToArray();
// List<int> lista = new List<int>();
// while (n >= 1)
// {
// lista.Insert(0, n);
// n /= 2;
// }
// return lista.ToArray();
// var res = new List<int>();
// do
// {
// res.Add(n);
// n = n / 2;
// } while (n > 0);
// return res.Select(x => x).Reverse().ToArray();
// var res = new List<int>() {n};
// while (n > 1)
// {
// n /= 2;
// res.Add(n);
// }
//
// return res.OrderBy(e => e).ToArray();
// var num = n;
// var result = new List<int>();
// while (num >= 1)
// {
// result.Add(num);
// num /= 2;
// }
// return result.ToArray().Reverse().ToArray();
// List<int> lst = new List<int>() {n};
// while (n > 1) lst.Add((n /= 2));
// lst.Sort();
// return lst.ToArray();
// List<int> sequence = new List<int> { n };
// while(n != 1)
// {
// n = n%2 == 0 ? n/2 : (n - 1)/2;
//
// sequence.Add(n);
// }
// return sequence.OrderBy(e => e).ToArray();
// var list = new List<int> {n};
// while (n > 1)
// {
// n = n / 2;
// list.Add(n);
// }
// return list.OrderBy(y => y).ToArray();
// var result = new List<int>();
// while (n >= 1)
// {
// result.Add(n);
// n = n / 2;
// }
// result.Reverse();
// return result.ToArray();
// return Enumerable.Range(0, (int) Math.Log(n, 2) + 1)
// .Select(i => n / (int) Math.Pow(2, (int) Math.Log(n, 2) - i))
// .ToArray();
// List<int> numbers = new List<int>();
//
// for (int i = n; i >= 1; i = i / 2)
// {
// numbers.Insert(0, i);
// }
// return numbers.ToArray();
// var result = new List<int> {n};
// while (result.Last() > 1)
// {
// result.Add(result.Last() / 2);
// }
// result.Reverse();
// return result.ToArray();
}
}
}