Ad
Code
Diff
  • #include <numeric>
    
    double Mean(double x[], int n){
      return std::accumulate(x, x + n, 0) / n;
    }
    • #include <iostream>
    • #include <numeric>
    • double Mean(double x[], int n){
    • double sum = 0;
    • for(int i = 0; i < n; i++){
    • sum += x[i];
    • }
    • return sum / n;
    • return std::accumulate(x, x + n, 0) / n;
    • }

Remove the character 'a' or 'A' from strings.

Updated test cases to be... possible.

Code
Diff
  • #include <algorithm>
    std::string remove_a (std::string s)
    {
        s.erase(std::remove_if(s.begin(), s.end(), [](char c){return c == 'a' || c == 'A';}), s.end());
        return s;
    }
    • #include <bits/stdc++.h>
    • #include <algorithm>
    • std::string remove_a (std::string s)
    • {
    • s.erase(std::remove_if(s.begin(), s.end(), [](char c){return c == 'a' || c == 'A';}), s.end());
    • return s;
    • }
Code
Diff
  • #include <string>
    using namespace std;
    string even_numbers_from_interval(int a, int b) {
      string r;
      for (a % 2 ? ++a : a; a <= b; a += 2) r += to_string(a) + " ";
      if (r.size()) r.pop_back();
      return r;
    }
    • #include <string>
    • using namespace std;
    • string even_numbers_from_interval(int a, int b) {
    • //
    • string r;
    • for (a % 2 ? ++a : a; a <= b; a += 2) r += to_string(a) + " ";
    • if (r.size()) r.pop_back();
    • return r;
    • }

Probably would be considered less clean than the parent,
but also faster by avoiding streams.

Code
Diff
  • #include <string>
    #include <vector>
    
    auto split(const std::string& str, char sep) {
      auto result = std::vector<std::string>{};
      std::string::size_type pos = 0, pos2 = 0;
      
      while ((pos2 = str.find(sep, pos)) != std::string::npos) {
        result.push_back(str.substr(pos, pos2 - pos));
        pos = pos2 + 1;
      }
      result.push_back(str.substr(pos));
      return result;
    }
    
    
    • #include <string>
    • #include <sstream>
    • #include <vector>
    • auto split(const std::string& str, char sep) {
    • auto result = std::vector<std::string>{};
    • auto stream = std::stringstream(str);
    • auto buffer = std::string{};
    • while (std::getline(stream, buffer, sep)) result.emplace_back(buffer);
    • std::string::size_type pos = 0, pos2 = 0;
    • while ((pos2 = str.find(sep, pos)) != std::string::npos) {
    • result.push_back(str.substr(pos, pos2 - pos));
    • pos = pos2 + 1;
    • }
    • result.push_back(str.substr(pos));
    • return result;
    • }

Given an array of n distinct integers in the range [0, n], find the missing integer.

Code
Diff
  • #include <vector>
    #include <numeric>
    using namespace std;
    int missingNumber(vector<int> nums) {
      return (nums.size() * (nums.size() + 1))/2 - accumulate(nums.begin(), nums.end(), 0);
    }
    • #include <vector>
    • #include <algorithm>
    • #include <numeric>
    • using namespace std;
    • int missingNumber(vector<int> nums) {
    • nums.push_back(nums.size());
    • for (int i = 0; i < static_cast<int>(nums.size()); i++) {
    • if (find(nums.begin(), nums.end(), i) == nums.end()) return i;
    • }
    • return nums.size() - 1;
    • return (nums.size() * (nums.size() + 1))/2 - accumulate(nums.begin(), nums.end(), 0);
    • }

Given an array (vector, for C++) of n distinct integers in the range [0, n], find the one that is missing.

First C++ solution; fixed up the test cases that were missing 0 (so those in the parent description wouldn't have worked), reworked to a vector for simplicity (could do the same op on an array + length combo, but it's just less idiomatic), simplified structure for the tests, and finally implemented an actual solution.

Code
Diff
  • #include <vector>
    #include <algorithm>
    using namespace std;
    int missingNumber(vector<int> nums) {
      nums.push_back(nums.size());
      for (int i = 0; i < static_cast<int>(nums.size()); i++) {
        if (find(nums.begin(), nums.end(), i) == nums.end()) return i;
      }
      return nums.size() - 1;
    }
    • class Solution {
    • public:
    • int missingNumber(vector<int>& nums) {
    • }
    • };
    • #include <vector>
    • #include <algorithm>
    • using namespace std;
    • int missingNumber(vector<int> nums) {
    • nums.push_back(nums.size());
    • for (int i = 0; i < static_cast<int>(nums.size()); i++) {
    • if (find(nums.begin(), nums.end(), i) == nums.end()) return i;
    • }
    • return nums.size() - 1;
    • }

General cleanup

generating a 4-digit code stored as an int, you run the risk of the first digit being 0. On its own, this is fine, but validating the user's (integer-stored) input for length makes a 0-starting random number unguessable. Could make the whole thing play nicely with ints, but no real reason not to use strings here - they were getting converted to int for comparison, so clearly the memory is available. Given this swap to strings, also added isNumeric for further input validation.

random_shuffle on a vector of unique items will return a random permutation. There's no need to check it for duplicate numbers, because it's a permutation, not 4 random guesses.

Updated to structured binding to read checkGuess results - just feels cleaner here. I assume previous code was written under C++11, which one cannot fault; this is just nice to have when available.

On EOF, would loop infinitely - while (cin) to stop when stdin disappears.

Renamed main to _main so this can compile as a kumite, but obviously needs some form of test to actually be useful. Implementing a guesser (and a verifier of the guesser?) in Preloaded could do the trick, but would take time.

Code
Diff
  • #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <vector>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    string generateRandomNumber() {
        vector<int> digits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        random_shuffle(digits.begin(), digits.end());
        return string(digits.begin(), digits.begin() + 4);
    }
    
    bool hasDuplicateDigits(const string &number) {
        // limitation: invalid index if number isn't really numeric.
        vector<bool> seen(10, false);
        for (const auto c : number) {
          if (seen[c - '0']) return true;
          seen[c - '0'] = true;
        }
        return false;
    }
    
    bool isNumeric(const string &s) {
      return all_of(s.begin(), s.end(), [](char c){return isdigit(c);});
    }
    
    string getUserGuess() {
        string guess;
        cout << "Enter your guess (a 4-digit number with non-repeating digits): ";
        cin >> guess;
        return guess;
    }
    
    pair<int, int> checkGuess(const string &randomNumber, const string &userGuess) {
        int correctNumbers = 0;
        int correctPosition = 0;
    
        for (int i = 0; i < 4; ++i) {
            if (randomNumber[i] == userGuess[i]) {
                correctNumbers++;
                correctPosition++;
            } else if (count(randomNumber.begin(), randomNumber.end(), userGuess[i])) {
                correctNumbers++;
            }
        }
    
        return make_pair(correctNumbers, correctPosition);
    }
    
    int _main() {
        // seed rand since random_shuffle _probably_ uses it.
        srand(time(0));
    
        string randomNumber = generateRandomNumber();
    
        int attempts = 0;
    
        while (cin) {
            string userGuess = getUserGuess();
            if (userGuess.length() != 4 || hasDuplicateDigits(userGuess) || !isNumeric(userGuess)) {
                cout << "Invalid input. Please enter a 4-digit number with non-repeating digits." << endl;
                continue;
            }
    
            auto [corNum, corPos] = checkGuess(randomNumber, userGuess);
            cout << "Correct numbers: " << corNum << " Correct position: " << corPos << endl;
    
            attempts++;
    
            if (corPos == 4) {
                cout << "Congratulations! You guessed the number " << randomNumber << " correctly in " << attempts << " attempts!" << endl;
                break;
            }
        }
    
        return 0;
    }
    
    • #include <iostream>
    • #include <cstdlib>
    • #include <ctime>
    • #include <vector>
    • #include <algorithm>
    • #include <cmath>
    • using namespace std;
    • int generateRandomNumber() {
    • vector<int> digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    • string generateRandomNumber() {
    • vector<int> digits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    • random_shuffle(digits.begin(), digits.end());
    • int number = 0;
    • for (int i = 0; i < 4; ++i) {
    • number = number * 10 + digits[i];
    • }
    • return number;
    • return string(digits.begin(), digits.begin() + 4);
    • }
    • bool hasDuplicateDigits(int number) {
    • bool hasDuplicateDigits(const string &number) {
    • // limitation: invalid index if number isn't really numeric.
    • vector<bool> seen(10, false);
    • while (number > 0) {
    • int digit = number % 10;
    • if (seen[digit]) {
    • return true;
    • }
    • seen[digit] = true;
    • number /= 10;
    • for (const auto c : number) {
    • if (seen[c - '0']) return true;
    • seen[c - '0'] = true;
    • }
    • return false;
    • }
    • int getUserGuess() {
    • int guess;
    • bool isNumeric(const string &s) {
    • return all_of(s.begin(), s.end(), [](char c){return isdigit(c);});
    • }
    • string getUserGuess() {
    • string guess;
    • cout << "Enter your guess (a 4-digit number with non-repeating digits): ";
    • cin >> guess;
    • return guess;
    • }
    • pair<int, int> checkGuess(int randomNumber, int userGuess) {
    • pair<int, int> checkGuess(const string &randomNumber, const string &userGuess) {
    • int correctNumbers = 0;
    • int correctPosition = 0;
    • string randomStr = to_string(randomNumber);
    • string guessStr = to_string(userGuess);
    • for (int i = 0; i < 4; ++i) {
    • if (randomStr[i] == guessStr[i]) {
    • if (randomNumber[i] == userGuess[i]) {
    • correctNumbers++;
    • correctPosition++;
    • } else if (count(randomStr.begin(), randomStr.end(), guessStr[i]) > 0) {
    • } else if (count(randomNumber.begin(), randomNumber.end(), userGuess[i])) {
    • correctNumbers++;
    • }
    • }
    • return make_pair(correctNumbers, correctPosition);
    • }
    • int main() {
    • int _main() {
    • // seed rand since random_shuffle _probably_ uses it.
    • srand(time(0));
    • int randomNumber = generateRandomNumber();
    • while (hasDuplicateDigits(randomNumber)) {
    • randomNumber = generateRandomNumber();
    • }
    • string randomNumber = generateRandomNumber();
    • int attempts = 0;
    • while (true) {
    • int userGuess = getUserGuess();
    • if (to_string(userGuess).length() != 4 || hasDuplicateDigits(userGuess)) {
    • while (cin) {
    • string userGuess = getUserGuess();
    • if (userGuess.length() != 4 || hasDuplicateDigits(userGuess) || !isNumeric(userGuess)) {
    • cout << "Invalid input. Please enter a 4-digit number with non-repeating digits." << endl;
    • continue;
    • }
    • pair<int, int> result = checkGuess(randomNumber, userGuess);
    • cout << "Correct numbers: " << result.first << " Correct position: " << result.second << endl;
    • auto [corNum, corPos] = checkGuess(randomNumber, userGuess);
    • cout << "Correct numbers: " << corNum << " Correct position: " << corPos << endl;
    • attempts++;
    • if (result.second == 4) {
    • if (corPos == 4) {
    • cout << "Congratulations! You guessed the number " << randomNumber << " correctly in " << attempts << " attempts!" << endl;
    • break;
    • }
    • }
    • return 0;
    • }