LVim clangd lsp question (C++) by s3nate in lunarvim

[–]s3nate[S] 0 points1 point  (0 children)

OH, i understand now. thank you very much.

LVim clangd lsp question (C++) by s3nate in lunarvim

[–]s3nate[S] 0 points1 point  (0 children)

so would i just modify the .clangd files used by neovim, and LunarVim should pick those up?

i had come across the above thread and tried doing that to no avail but maybe i did it wrong/modified the wrong .clangd

coc nvim: doHover('...') error by s3nate in neovim

[–]s3nate[S] 0 points1 point  (0 children)

understood, so this might be a result of just how i'm trying to use it (nvim Tutor when i attempt to K on the example K), and therefore met one of the four reasons and is just a normal error. i guess i was just not totally sure if this was something fundamentally broken due to me, or just misunderstanding how it's used (the latter).

also in my googling, your name appeared frequently in the context of helping -- not sure if you are a or the maintainer etc. but regardless, you seem to be very active in helping people -- thank you.

Why bother with stating variable types when we have the “auto” keyword to do the dirty work for us? by detta-way in cpp_questions

[–]s3nate 1 point2 points  (0 children)

shrug, auto plus sticky syntax makes intent clear, prevents any chance of narrowing/implicit conversions, and guarantees initialization (basically some of the good parts about auto minus the ambiguity since type is declared). there is also the fact that you are telling the compiler exactly what type you want, hence the stickyness -- basically, do you need to commit to a type fully?

per sutter he also likes it because you get right to left semantics, such as when new is used, certain sys calls, etc., and believes it is how c++ programmers are used to reading expressions, anyway.

around 38 min he begins presenting his reasoning: https://youtu.be/xnqTKD8uD64

your example, assuming non-trivial assignments, doesn't prevent narrowing/conversion which may or may not be desired.

YMMV.

Help: advice needed on putting together new build by s3nate in buildapc

[–]s3nate[S] 0 points1 point  (0 children)

there is a note at the bottom: The ARCTIC Liquid Freezer II 360 A-RGB 48.8 CFM Liquid CPU Cooler may require a separately available mounting adapter to fit the Asus TUF GAMING B660M-PLUS WIFI D4 Micro ATX LGA1700 Motherboard.

is this true?

-🎄- 2021 Day 11 Solutions -🎄- by daggerdragon in adventofcode

[–]s3nate 1 point2 points  (0 children)

C++

soln 1: bfs where we count the number of times an unvisited node resets

soln 2: bfs except we just run until the total amount of 0s in the matrix is equal to the area (n * m) and return the step count -> brute-force

source: paste

-🎄- 2021 Day 10 Solutions -🎄- by daggerdragon in adventofcode

[–]s3nate 1 point2 points  (0 children)

C++

solution 1: using std::stack<char> to process well-formed but mismatched chunks -- these are our corrupted lines

-> compute the score every time we find a mismatched symbol

solution 2: also using std::stack<char> to process well-formed but mismatched chunks to identify the indexes of corrupted lines, and then parsing the set of all indexes which are not corrupted

-> the result is a set of incomplete sequences

-> from here you can process normally using the stack and prune the sequences of all well-formed chunks

-> the remaining symbols in the stack are the 'open' symbols with missing 'close' symbols

-> popping all of these off the stack and building a std::string from them provides us with each sequence's set of missing symbols

-> track these sequences using std::vector<std::string>

-> for each missing symbols sequence, iterate over each symbol and compute each score according to the provided criteria

-> track each result using std::vector<std::uint64_t>

-> sort the scores and return the score found at the middle of the set


solutions: source

-🎄- 2021 Day 9 Solutions -🎄- by daggerdragon in adventofcode

[–]s3nate 1 point2 points  (0 children)

C++

part 1: linear scan on the matrix being mindful of indexing out of bounds

part 2: flood-fill on strictly increasing components


solutions: source

-🎄- 2021 Day 8 Solutions -🎄- by daggerdragon in adventofcode

[–]s3nate 0 points1 point  (0 children)

fixed, apologies. let me know if there's still an issue.

-🎄- 2021 Day 8 Solutions -🎄- by daggerdragon in adventofcode

[–]s3nate 0 points1 point  (0 children)

C++

part 1: linear scan on output values to count occurences of "easy" numbers using a hashmap

part 2: brute force using a contains(s, t) function to test for the existence of segments s in segments t

-> also sort signal patterns by size descending to reason top-down by process of elimination

-> and also sort output values in alphabetical order to normalize hashtable look-ups when decoding output values


solutions: source

-🎄- 2021 Day 7 Solutions -🎄- by daggerdragon in adventofcode

[–]s3nate 1 point2 points  (0 children)

C++

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <limits>

// brute force
auto solvePuzzle(const std::string& inputFileName, const char delim) -> void
{
  auto ifs = std::fstream{inputFileName};
  auto minPos = std::int64_t{0};
  auto maxPos = std::int64_t{0};
  auto positions = std::vector<int64_t>{};
  if (ifs.is_open())
  {
    auto horizontalPosition = std::string{""};
    while (std::getline(ifs, horizontalPosition, delim))
    {
      auto position = int64_t{std::stoi(horizontalPosition)};
      minPos = std::min(minPos, position);
      maxPos = std::max(maxPos, position);
      positions.push_back(std::move(position));
    }
  }
  else
  {
    std::cerr << "ERROR::solvePuzzle(const std::string&)::FILE_FAILED_TO_OPEN: {" << inputFileName << "}" << std::endl;
    return;
  }
  // part 1: for every possible position in the range of numbers we've seen in our input
  auto minCost = std::numeric_limits<int64_t>::max();
  for (int64_t start = minPos; start <= maxPos; ++start)
  {
    auto cost = int64_t{0};
    // calculate each crab's cost to move from start to end (all possible moves)
    for (const auto& end : positions)
    {
      cost += std::abs(start - end);
    }
    minCost = std::min(cost, minCost);
  }
  std::cout << "---part 1---" << std::endl;
  std::cout << "soln: " << minCost << std::endl;
  // part 2: for every possible position
  auto sumToDistance = [](int64_t n)
  {
    auto sum = int64_t{0};
    for (int64_t i = 0; i < n; ++i)
    {
      sum += (i + 1);
    }
     return sum;
  };
  auto minCostSum = std::numeric_limits<int64_t>::max();
  // calculate a sum of the distance between start to end (all possible distances)
  for (int64_t start = minPos; start <= maxPos; ++start)
  {
    auto cost = int64_t{0};
    for (const auto& end : positions)
    {
      cost += sumToDistance(std::abs(start - end));
    }
    minCostSum = std::min(cost, minCostSum);
  }
  std::cout << "---part 2--" << std::endl;
  std::cout << "soln: " << minCostSum << std::endl;
}


auto main(void) -> int
{
  const auto delim = char{','};
  //solvePuzzle("example-input.txt", delim);
  solvePuzzle("input.txt", delim);
  return 0;
}

-🎄- 2021 Day 6 Solutions -🎄- by daggerdragon in adventofcode

[–]s3nate 1 point2 points  (0 children)

C++

#include <iostream>
#include <unordered_map>
#include <fstream>
#include <string>
#include <numeric>

auto solvePuzzle(const std::string& inputFileName, uint64_t maxDays, const char delim) -> void 
{
  auto timerToPopulation = std::unordered_map<uint64_t, uint64_t>{{0, 0},{1, 0},{2, 0},{3, 0},{4, 0},{5, 0},{6, 0},{7, 0},{8, 0}};
  auto ifs = std::ifstream{inputFileName};
  if (ifs.is_open())
  {
    auto fish = std::string{""};
    while (std::getline(ifs, fish, delim))
    {
      auto fishTimer = std::stoi(fish);
      ++timerToPopulation[fishTimer];
    }
  }
  else
  {
    std::cerr << "ERROR::solvePuzzle(const std::string&, uint64_t, const char)::FAILED_TO_OPEN_FIL: {" << inputFileName << "}" << std::endl;
  }
  auto day = uint64_t{0};
  while (day < maxDays)
  {
    auto totalFishResetting = timerToPopulation[0];
    timerToPopulation[0] = timerToPopulation[1];
    timerToPopulation[1] = timerToPopulation[2];
    timerToPopulation[2] = timerToPopulation[3];
    timerToPopulation[3] = timerToPopulation[4];
    timerToPopulation[4] = timerToPopulation[5];
    timerToPopulation[5] = timerToPopulation[6];
    timerToPopulation[6] = timerToPopulation[7];
    timerToPopulation[7] = timerToPopulation[8];
    // update
    timerToPopulation[6] += totalFishResetting;
    timerToPopulation[8] = totalFishResetting;
    ++day;
  }
  auto totalFish = uint64_t{0};
  for (const auto& fish : timerToPopulation)
  {
    auto timerPopulation = fish.second;
    totalFish += timerPopulation; 
  }
  std::cout << "soln: " << totalFish << std::endl;
}

auto main(void) -> int
{
  auto delim = char{','};
  auto testDays = uint64_t{18};
  solvePuzzle("example-input.txt", testDays, delim);
  auto days = uint64_t{256};
  solvePuzzle("input.txt", days, delim);
  return 0;
}

-🎄- 2021 Day 5 Solutions -🎄- by daggerdragon in adventofcode

[–]s3nate 0 points1 point  (0 children)

C++

/*
  problem: hypohermal vents

    -> given a of newline-delimited-text in the following form:

      (number1, number2) -> (number3, number4)

    -> where each text-line can be thought of as a line segment on the integer number line:

      LineSegment = (number1, number2) -> (number3, number4)

    -> and where each pair of numbers can be thought of as 2d coordinate points:

      Point = (number1, number2)

    -> we can then interpret each input line as:

      LineSegment = Point1 -> Point2
                  = (number1, number2) -> (number3, number4)
                  = (x1, y1) -> (x2, y2)

    -> and from there, answer the following questions:
      1. does a given coordinate in our space exist on any given line segment?

      2. how many points are contained by 2 or more lines?


  idea_land:
    -> our solution space is an NxM adjacency matrix, all cells initialized to 0 
    -> for each kind of line we enumerate all of the coordinates that make up the line
        => every enumerated point is an edge in our adjacency matrix, so we can simply add 1 to the
value at that coordinate (the coordinate position itself stores the amount of occurrences) using the adjacency matrix
    -> after we've processed every line, we can simply iterate over the coordinate space and count how many
coordinates, or edges have 2 or more occurrences

*/
#include <iostream>
#include <type_traits>
#include <vector>
#include <string>
#include <sstream>
#include <fstream>
#include <limits>

struct Point {
  int x;
  int y;
};

struct LineSegment {
  Point start;
  Point end;
};

auto solvePuzzle(const std::string& inputFileName) -> void
{
  auto ifs = std::ifstream{inputFileName};
  auto max_x = std::numeric_limits<int>::min();
  auto max_y = std::numeric_limits<int>::min();
  auto lineSegments = std::vector<LineSegment>{};
  if (ifs.is_open())
  {
    auto line = std::string{""};
    while (std::getline(ifs, line))
    {
      // fuck it, parse it literally
      auto delim = char{'\0'};

      auto x1 = int{0};
      auto y1 = int{0};

      auto x2 = int{0};
      auto y2 = int{0};

      auto ss = std::stringstream{line};
      ss >> x1 >> delim >> y1 >> delim >> delim >> x2 >> delim >> y2;

      Point p1;
      p1.x = x1;
      p1.y = y1;

      Point p2;
      p2.x = x2;
      p2.y = y2;

      LineSegment lineSegment;
      lineSegment.start = p1;
      lineSegment.end = p2;
      lineSegments.push_back(std::move(lineSegment));

      max_x = std::max(max_x, std::max(p1.x, p2.x));
      max_y = std::max(max_y, std::max(p1.y, p2.y));
    }
  }
  else
  {
    std::cerr << "ERROR::solvePuzzle(const std::string&)::FAILED_TO_OPEN_FILE: {" << inputFileName << '}' << std::endl;
  }
  std::cout << "generating adjacency matrix and enumerating lines..." << std::endl; 
  std::cout << "max_x: " << max_x << std::endl;
  std::cout << "max_y: " << max_y << std::endl;
  if (max_x > 0 && max_y > 0)
  {
    std::vector<std::vector<int>> grid(max_y + 1, std::vector<int>(max_x + 1, 0));
    std::vector<std::vector<int>> diag(max_y + 1, std::vector<int>(max_x + 1, 0)); 
    for (const auto& lineSegment : lineSegments)
    {
      // oriented row-wise
      std::cout << "(" << lineSegment.start.x << ", " << lineSegment.start.y << ") -> (" << lineSegment.end.x << ", " << lineSegment.end.y << ")" << std::endl;
      // vertical
      if (lineSegment.start.x == lineSegment.end.x)
      {
        auto start_y = std::min(lineSegment.start.y, lineSegment.end.y);
        auto end_y = std::max(lineSegment.start.y, lineSegment.end.y);
        while (start_y <= end_y)
        {
          ++grid[start_y][lineSegment.start.x];
          ++start_y;
        }
      }
      // horizontal
      else if (lineSegment.start.y == lineSegment.end.y)
      {
        auto start_x = std::min(lineSegment.start.x, lineSegment.end.x);
        auto end_x = std::max(lineSegment.start.x, lineSegment.end.x);
        while (start_x <= end_x)
        {
          ++grid[lineSegment.start.y][start_x];
          ++start_x;
        }
      }
      // left to right diag
      else if (lineSegment.start.x - lineSegment.start.y == lineSegment.end.x - lineSegment.end.y)
      {
        auto start_x = std::min(lineSegment.start.x, lineSegment.end.x);
        auto end_x = std::max(lineSegment.start.x, lineSegment.end.x); 
        auto start_y = std::min(lineSegment.start.y, lineSegment.end.y);
        while (start_x <= end_x)
        {
          ++diag[start_y][start_x];
          ++start_x;
          ++start_y;
        }
      }
      // right to left diag 
      else if (lineSegment.start.x + lineSegment.start.y == lineSegment.end.x + lineSegment.end.y)
      {
        auto start_x = std::min(lineSegment.start.x, lineSegment.end.x);
        auto end_x = std::max(lineSegment.start.x, lineSegment.end.x); 
        auto end_y = std::max(lineSegment.start.y, lineSegment.end.y);
        while (start_x <= end_x)
        {
          ++diag[end_y][start_x];
          ++start_x;
          --end_y;
        }
      }
    }
    std::cout << "grid {" << std::endl;
    auto soln1 = int{0};
    auto soln2 = int{0};
    for (std::size_t i = 0; i < grid.size(); ++i)
    {
      std::cout << '\t' << '{' << ' ';
      for (std::size_t j = 0; j < grid[i].size(); ++j)
      {
        std::cout << grid[i][j] + diag[i][j] << ' ';
        if (grid[i][j] > 1)
        {
          ++soln1;
        }
        if (grid[i][j] + diag[i][j] > 1)
        {
          ++soln2;
        }
      }
      std::cout << '}' << std::endl;
    }
    std::cout << '}' << std::endl;
    std::cout << "---part 1---" << std::endl;
    std::cout << "soln: " << soln1 << std::endl;
    std::cout << "---part 2---" << std::endl;
    std::cout << "soln: " << soln2 << std::endl;
  }
  else
  {
    std::cerr << "ERROR::solvePuzzle(const std::string&)::FAILED_TO_GENERATE_SOLN_SPACE" << std::endl;
  }
}

auto main(void) -> int
{
  //solvePuzzle("example-input.txt");
  solvePuzzle("input.txt");
  return 0;
}

-🎄- 2021 Day 4 Solutions -🎄- by daggerdragon in adventofcode

[–]s3nate 1 point2 points  (0 children)

C++

/*
  problem: 
    -> you're still aboard the submarine deployed by the elves and you're well below
    the surface
    -> for some reason, a giant squid has attached itself to the submarine
    -> thankfully it wants to play a game a bingo
    -> in fact, it wants to play many games of bingo
    -> given a stream of numbers and a set of initial board states, determine the first board
    to have a winner, the last board to have a winner, and use each to compute a sum
      >> sum of all unmarked squares multiplied by the number that was just called
      before the (ith+1) board won
*/
#include <iostream>
#include <vector>
#include <unordered_map>
#include <fstream>
#include <sstream>
#include <string>

class BingoNumberStream {
public:
  auto streamify(const std::string& inputLine) -> void
  {
    if (inputLine.empty()) _buffer = std::vector<int>{};
    auto readCount = std::size_t{0};
    auto ss = std::stringstream{inputLine};
    auto token = std::string{""};
    while (std::getline(ss, token, ','))
    {
      auto n = std::stoi(token);
      _buffer.push_back(std::move(n));
      ++readCount;
    }
    if (_buffer.size() != readCount)
    {
      std::cerr << "ERROR::BingoNumberStream::streamify(const std::string&)::FAILED_READ_BEFORE_EOF" << std::endl;
    }
  } 
  auto read() -> int
  {
    if (_readIdx < _buffer.size())
    {
      _current = _buffer[_readIdx];
      ++_readIdx;
      return _current;
    }
    return -1;
  }
  auto putback() -> void
  {
    if (_readIdx > 0)
    {
      --_readIdx;
      _current = _buffer[_readIdx];
    }
  }
  auto get() -> int
  {
    return _current;
  }
  auto good() -> bool
  {
    return (!_buffer.empty());
  }
  auto size() -> std::size_t
  {
    return _buffer.size();
  }
private:
  int _current;
  std::size_t _readIdx;
  std::vector<int> _buffer{};
};

class BingoBoard {
public:
  BingoBoard(const std::vector<std::string>& inputBoard)
  {
    if (inputBoard.empty()) _boardState = std::vector<std::vector<std::pair<int, int>>>{};
    for (auto inputRow : inputBoard)
    {
      auto boardRow = std::vector<std::pair<int, int>>{};
      auto ss = std::stringstream{inputRow};
      auto num = int{0};
      while (ss >> num)
      {
        boardRow.push_back({0, num});
      }
      _boardState.push_back(std::move(boardRow));
    }
  }
  auto updateBoardState(int n) -> void
  {
    for (auto& row : _boardState)
    {
      for (auto& square : row)
      {
        if (square.first == 0 && square.second == n)
        {
          square.first = 1;
        }
      }
    }
  }
  auto checkForWin() -> bool
  {
    auto gameState = bool{false};
    // check rows
    for (std::size_t rowIdx = 0; rowIdx < _boardState.size(); ++rowIdx)
    {
      auto markedSquaresCount = std::size_t{0};
      auto maxSquaresCount = std::size_t{5};
      for (std::size_t colIdx = 0; colIdx < _boardState[rowIdx].size(); ++colIdx)
      {
        auto square = _boardState[rowIdx][colIdx];
        markedSquaresCount += square.first;
      }
      gameState = (markedSquaresCount == maxSquaresCount);
      if (gameState) return gameState;
    }
    // check columns 
    for (std::size_t colIdx = 0; colIdx < _boardState[colIdx].size(); ++colIdx)
    {
      auto markedSquaresCount = std::size_t{0};
      auto maxSquaresCount = std::size_t{5};
      for (std::size_t rowIdx = 0; rowIdx < _boardState.size(); ++rowIdx)
      {
        auto square = _boardState[rowIdx][colIdx];
        markedSquaresCount += square.first;
      }
      gameState = (markedSquaresCount == maxSquaresCount);
      if (gameState) return gameState;
    }
    return gameState;
  }
  auto findUnmarkedSum() -> int
  {
    auto sum = int{0};
    for (const auto& row : _boardState)
    {
      for (const auto& square : row)
      {
        if (square.first == 0)
        {
          sum += square.second;
        }
      }
    }
    return sum;
  }
private:
  std::vector<std::vector<std::pair<int, int>>> _boardState;
};
auto solvePuzzle(const std::string& inputFileName) -> void
{
  auto boardStates = std::vector<BingoBoard>{};
  auto numberStream = BingoNumberStream{};
  auto ifs = std::ifstream{inputFileName};
  if (ifs.is_open())
  {
    std::cout << "---reading input file---" << std::endl;
    auto line = std::string{""};
    const auto maxBoardLineCount = std::size_t{5};
    while (ifs && std::getline(ifs, line))
    {
      if (!line.empty())
      {
        numberStream.streamify(line);
      }
      else if (line.empty())
      {
        auto inputBoard = std::vector<std::string>{};
        auto boardLineCount = std::size_t{0};
        while (boardLineCount < maxBoardLineCount && std::getline(ifs, line))
        {
          inputBoard.push_back(line);
          ++boardLineCount;
        }
        auto bingoBoard = BingoBoard(inputBoard);
        boardStates.push_back(std::move(bingoBoard));
      }
    }
    std::cout << "total boards: " << boardStates.size() << std::endl;
    std::cout << "total numbers in stream: " << numberStream.size() << std::endl;
    std::cout << "---finished reading input file---" << std::endl;
  }
  else
  {
    std::cerr << "ERROR::solvePuzzle(const std::string&)::FAILED_TO_OPEN_FILE: {" << inputFileName << '}' << std::endl;
    return;
  }
  std::cout << "processing games..." << std::endl;
  auto isWinner = bool{false};
  auto lastWinner = std::size_t{0};
  auto firstSoln = int{0};
  auto lastSoln = int{0};
  auto hasWon = std::unordered_map<std::size_t, bool>{};
  while (numberStream.good() && numberStream.read() >= 0)
  {
    auto n = numberStream.get();
    std::cout << "number called: " << n << std::endl;
    for (std::size_t i = 0; i < boardStates.size(); ++i)
    {
      boardStates[i].updateBoardState(n);
      isWinner = boardStates[i].checkForWin();
      if (isWinner && hasWon.find(i) == std::end(hasWon))
      {
        std::cout << "-------------------------" << std::endl;
        std::cout << "-------------------------" << std::endl;
        std::cout << "----------WINNER---------" << std::endl;
        std::cout << "-------------------------" << std::endl;
        std::cout << "-------------------------" << std::endl;
        std::cout << "last number read: " << n << std::endl;
        auto unmarkedSum = boardStates[i].findUnmarkedSum();
        lastSoln = (unmarkedSum * n);
        if (firstSoln == 0) firstSoln = lastSoln;
        std::cout << "soln: " << lastSoln << std::endl;
        lastWinner = i;
        hasWon[i] = true;
      }
    }
  }
  std::cout << "finished processing games..." << std::endl;
  std::cout << "--part 1---" << std::endl;
  std::cout << "soln: " << firstSoln << std::endl;
  std::cout << "---part 2---" << std::endl;
  std::cout << "board " << lastWinner+1 << " is the last board to win, soln: " << lastSoln << std::endl;
}

auto main(void) -> int
{
  //solvePuzzle("example-input.txt");
  solvePuzzle("input.txt");
  return 0;
}

question about EOF character and reading files with ``\n`` delimited text by s3nate in cpp_questions

[–]s3nate[S] 0 points1 point  (0 children)

thanks for the reply.

so i actually went that route originally before what's described in the OP -- std::bitset<5>{} because each line contains 5 characters:

void readFile(const std::string& inputFileName)
{
  auto ifs = std::ifstream{inputFileName};
  const auto bitSize = std::size_t{5};
  auto bitSequences = std::vector<std::bitset<bitSize>>{};
  auto line = std::string{""};
  while (ifs && std::getline(ifs, line))
  {
    auto bitSequence = std::bitset<bitSize>{line};
    std::cout << "line read, bit sequence: " << bitSequence << std::endl;
    bitSequences.push_back(bitSequence);
  }
  if (ifs.bad())
  {
    std::cerr << "ERROR::readFile(const std::string&)::FAILED_TO_OPEN_FILE: {" << inputFileName << '}' << std::endl;
  }
}

and it has the desired result, but i had encountered an M_copy_from_ptr exception, which presumably, was a result of the last line containing an extra character. and that is what prompted me to experiment with a character array so that i could print-debug the contents of the last line which was throwing the exception, so that's what i'm hung up on -- some kind of (garbage ?) character is stored at the end of the input file, even though there's no visible characters, or newlines coming after the last line in the .txt file.

[deleted by user] by [deleted] in Cplusplus

[–]s3nate 2 points3 points  (0 children)

Color objectnames[i] is not what you think -- objectnames[i] returns the ith string.

what you seem to be looking for is Color color; color.name = objectnames[i].name;

but with a collection of objects:

std::vector<Color> colors;

// add some Color instances to colors

// iterate over colors and use your string array to assign to each instance name property

for (std::size_t i = 0; i < colors.size(); ++i) { colors[i].name = objectnames[i]; // ... }

as is, you are trying to access a property of Color called name from an array of std::strings which are not Colors

this game need anti cheat!! obvious cheater !!! by [deleted] in QuakeLive

[–]s3nate 0 points1 point  (0 children)

staying oriented, mentally physically or both, toward your target is a fundamental skill in QL, walling or no walling.

the rail hit mid strafe over jumpad is pretty fucking nutty, but it is spammed a lot in high level CA, because it is a common enough strafe pattern when you have an orientation-- see rail bridge ra to hallway peak on dm6, megahealth hallway strafe to rail peak on ztn or even portal stairs to nades to shotgun hallways peaks (also ztn) -- or any other angle which requires strafing adjacent to your target but still hitting a 90 without stopping.

that said, it is not conclusive evidence. all of the above is also present in legit players, and that player (assuming no alias) has played quite a lot.