-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDec20.cpp
More file actions
114 lines (87 loc) · 2.8 KB
/
Dec20.cpp
File metadata and controls
114 lines (87 loc) · 2.8 KB
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
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
constexpr long long key{811589153};
void shiftPositions(std::vector<int>& positions,size_t j){
//PUT THE CURRENT NUMBER AT POSITION 0
long long cur_pos = positions[j];
for (size_t i=0;i<positions.size();++i){
positions[i] -= cur_pos;
while (positions[i]<0){
positions[i] += positions.size();
}
}
}
void changePositions(std::vector<int>& positions,int number){
//CHANGE THE POSITIONS BASED ON THE NUMBER
for (size_t i=0;i<positions.size();++i){
if (positions[i]==0) positions[i] = number;
else if (positions[i]<=number) --positions[i];
}
}
void mixing(const std::vector<int>& numbers,std::vector<int>& positions){
for (size_t i=0;i<numbers.size();++i){
shiftPositions(positions,i);
changePositions(positions,numbers[i]);
}
}
int main(){
bool part_one{false};
std::ifstream file("data20.txt");
std::string str{};
std::vector<long long> numbers{};
std::vector<int> positions{};
std::vector<int> reduced{};
int index{};
long long factor{1};
if (!part_one) factor = key;
//READ DATA
while(getline(file,str)){
positions.push_back(index);
++index;
numbers.push_back(factor*stoi(str));
}
//REDUCE THE NUMBER BETWEEN 0 AND THE SIZE OF THE CIRCLE
for (size_t i=0;i<numbers.size();++i){
long long number = numbers[i];
if (number>0){
number = number % static_cast<long long>(positions.size()-1);
}
if (number<0){
number = number % static_cast<long long>(positions.size()-1);
if (number<0) number += (positions.size()-1);
}
reduced.push_back(number);
}
int iterations{1};
if (!part_one) iterations = 10;
//PERFORM ITERATIONS OF MIXING
for (size_t i=0;i<iterations;++i){
mixing(reduced,positions);
std::cout<<"Finished "<<i+1<<'\n';
}
//FIND POSITION OF ZERO
int pos0{};
for (size_t i=0;i<numbers.size();++i){
if (numbers[i] == 0){
pos0 = positions[i];
break;
}
}
int pos1000 = (1000%numbers.size() + pos0) % numbers.size();
int pos2000 = (2000%numbers.size() + pos0) % numbers.size();
int pos3000 = (3000%numbers.size() + pos0) % numbers.size();
long long num1000{};
long long num2000{};
long long num3000{};
//FIND 1000,2000,3000TH NUMBER
for (size_t i=0;i<numbers.size();++i){
if (positions[i]==pos1000) num1000 = numbers[i];
if (positions[i]==pos2000) num2000 = numbers[i];
if (positions[i]==pos3000) num3000 = numbers[i];
}
std::cout<<num1000<<' '<<num2000<<' '<<num3000<<'\n';
std::cout<<num1000+num2000+num3000<<'\n';
return 0;
}