init
This commit is contained in:
commit
2d399a8e8e
5 changed files with 96 additions and 0 deletions
2
.clang-format
Normal file
2
.clang-format
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
BasedOnStyle: LLVM
|
||||||
|
IndentWidth: 4
|
2
.clangd
Normal file
2
.clangd
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
CompileFlags:
|
||||||
|
Add: [-std=c++23]
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
main
|
8
Makefile
Normal file
8
Makefile
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
CFLAGS = -Wall -Wextra
|
||||||
|
|
||||||
|
main: main.cc
|
||||||
|
g++ -std=c++23 $(CFLAGS) -o $@ $^
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
-rm main
|
83
main.cc
Normal file
83
main.cc
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstdlib>
|
||||||
|
// #include <format>
|
||||||
|
#include <fstream>
|
||||||
|
#include <print>
|
||||||
|
#include <regex>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
auto parse_line(std::string line) -> std::tuple<double_t, double_t> {
|
||||||
|
auto is = std::stringstream{line};
|
||||||
|
double_t time, high, low;
|
||||||
|
is >> time >> high >> low;
|
||||||
|
return std::tuple{time, high};
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
if (argc != 2) {
|
||||||
|
// std::println("Usage: {} <file>", argv[0]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
auto file = std::ifstream{argv[1]};
|
||||||
|
|
||||||
|
// main logic
|
||||||
|
|
||||||
|
auto re = std::regex{"^\\d+\\.\\d+ \\d+\\.\\d+ \\d+\\.\\d+$"};
|
||||||
|
std::string expectedFirst = "10.000000000000000 0.000000 0.000000";
|
||||||
|
std::string expectedLast = "16.000000000000000 1000.000000 0.000000";
|
||||||
|
|
||||||
|
bool is_in_high = false;
|
||||||
|
bool is_first_line = true;
|
||||||
|
bool is_valid_last_line = false;
|
||||||
|
double_t last_low_time = 0;
|
||||||
|
double_t riseup_time = 0;
|
||||||
|
int32_t rise_count = 0;
|
||||||
|
std::string line;
|
||||||
|
while (std::getline(file, line)) {
|
||||||
|
if (is_first_line) {
|
||||||
|
if (line != expectedFirst) {
|
||||||
|
std::println("Invalid first line: {}", line);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
is_first_line = false;
|
||||||
|
}
|
||||||
|
if (!std::regex_match(line, re)) {
|
||||||
|
std::println("Invalid line!: {}", line);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
is_valid_last_line = (line == expectedLast);
|
||||||
|
|
||||||
|
auto temp = parse_line(line);
|
||||||
|
auto time = std::get<0>(temp);
|
||||||
|
auto high = std::get<1>(temp);
|
||||||
|
|
||||||
|
if (high == 0) {
|
||||||
|
last_low_time = time;
|
||||||
|
} else if (!is_in_high && high > 500) {
|
||||||
|
riseup_time = time;
|
||||||
|
rise_count++;
|
||||||
|
is_in_high = true;
|
||||||
|
} else if (is_in_high && high < 500) {
|
||||||
|
is_in_high = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!is_valid_last_line) {
|
||||||
|
std::println("Invalid last line: {}", line);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
if (rise_count > 1) {
|
||||||
|
std::println("Too many rise counts: {}", rise_count);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto transition_is_too_long = (riseup_time - last_low_time) > (1. / 57 * 6);
|
||||||
|
if (transition_is_too_long) {
|
||||||
|
std::println("Too long transition: {} ns", riseup_time - last_low_time);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
Loading…
Reference in a new issue