83 lines
No EOL
1.8 KiB
C++
83 lines
No EOL
1.8 KiB
C++
#include <fstream>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <vector>
|
|
using namespace std;
|
|
|
|
bool checkSequence(vector<int> nums) {
|
|
// signals whether we are checking for greater or lower numbers
|
|
// -1 - lower
|
|
// 0 - no order yet
|
|
// 1 - greater
|
|
int greater = 0;
|
|
int drag = nums[0];
|
|
|
|
for (int i = 1; i < nums.size(); i++) {
|
|
// check difference first
|
|
if (drag == nums[i] || drag - nums[i] > 3 || drag - nums[i] < -3) {
|
|
return false;
|
|
}
|
|
|
|
// check order
|
|
if (greater == 0) {
|
|
if (drag < nums[i]) greater = 1;
|
|
else if (drag > nums[i]) greater = -1;
|
|
}
|
|
else if (greater > 0) {
|
|
if (drag >= nums[i]) return false;
|
|
}
|
|
else if (greater < 0) {
|
|
if (drag <= nums[i]) return false;
|
|
}
|
|
|
|
drag = nums[i];
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void lineToVector(string line, vector<int> &nums) {
|
|
// stream for convenience
|
|
stringstream line_stream;
|
|
line_stream << line;
|
|
|
|
int a;
|
|
|
|
while (line_stream >> a) {
|
|
nums.push_back(a);
|
|
}
|
|
}
|
|
|
|
bool checkSequenceDampened(vector<int> nums) {
|
|
if (checkSequence(nums)) return true;
|
|
|
|
for (int i = 0; i < nums.size(); i++) {
|
|
int temp = nums[i];
|
|
|
|
nums.erase(nums.begin() + i);
|
|
if (checkSequence(nums)) return true;
|
|
nums.insert(nums.begin() + i , temp);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
ifstream input_stream("input");
|
|
string line;
|
|
int sum = 0;
|
|
int dampened_sum = 0;
|
|
|
|
while (getline(input_stream, line)) {
|
|
// convert line to int sequence
|
|
vector<int> nums;
|
|
lineToVector(line, nums);
|
|
|
|
if (checkSequence(nums)) sum++;
|
|
if (checkSequenceDampened(nums)) dampened_sum++;
|
|
}
|
|
|
|
cout << "number of safe lines is: " << sum << endl;
|
|
cout << "number of safe lines (dampened) is: " << dampened_sum << endl;
|
|
return 0;
|
|
} |