Remove the character 'a' or 'A' from strings.
Updated test cases to be... possible.
#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;
- }
Describe(any_group_name_you_want) { It(should_do_something) { Assert::That(remove_a("codewars"), Equals("codewrs")); Assert::That(remove_a("aaaaaaaaaaa"), Equals("")); Assert::That(remove_a("Apple"), Equals("pple")); } };
- Describe(any_group_name_you_want)
- {
- It(should_do_something)
- {
Assert::That("codewars", Equals("codewrs"));Assert::That("aaaaaaaaaaa", Equals(""));Assert::That("Apple", Equals("pple"));- Assert::That(remove_a("codewars"), Equals("codewrs"));
- Assert::That(remove_a("aaaaaaaaaaa"), Equals(""));
- Assert::That(remove_a("Apple"), Equals("pple"));
- }
- };
#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.
#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.
#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.
#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;
- }
#include <criterion/criterion.h> int missingNumber(std::vector<int> nums); Test(findMissingNumber, should_return_5_for_given_array) { std::vector<int> arr{0, 1, 2, 3, 4, 6, 7, 8, 9, 10}; cr_assert_eq(missingNumber(arr), 5); } Test(findMissingNumber, should_return_2_for_given_array) { std::vector<int> arr{0, 1, 3, 4, 5}; cr_assert_eq(missingNumber(arr), 2); }
- #include <criterion/criterion.h>
// Function to find the missing number in an array of integersint findMissingNumber(int arr[], int n) {// Code to find the missing number}- int missingNumber(std::vector<int> nums);
- Test(findMissingNumber, should_return_5_for_given_array) {
int arr[] = {1, 2, 3, 4, 6, 7, 8, 9, 10};int n = sizeof(arr) / sizeof(arr[0]);cr_assert_eq(findMissingNumber(arr, n), 5);- std::vector<int> arr{0, 1, 2, 3, 4, 6, 7, 8, 9, 10};
- cr_assert_eq(missingNumber(arr), 5);
- }
- Test(findMissingNumber, should_return_2_for_given_array) {
int arr[] = {1, 3, 4, 5};int n = sizeof(arr) / sizeof(arr[0]);cr_assert_eq(findMissingNumber(arr, n), 2);- std::vector<int> arr{0, 1, 3, 4, 5};
- cr_assert_eq(missingNumber(arr), 2);
- }
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.
#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;
- }
// Your game should output as followed in the description // Not sure how to put a test case for these type of codes // this feels a lot like it might've been an interesting // homework assignment or something, given the presence of a main // function and the lack of main functions in how kata/kumite work. // I'm still for it for the half-interesting aspect, but definitely // a bit odd.
- // Your game should output as followed in the description
// Not sure how to put a test case for these type of codes- // Not sure how to put a test case for these type of codes
- // this feels a lot like it might've been an interesting
- // homework assignment or something, given the presence of a main
- // function and the lack of main functions in how kata/kumite work.
- // I'm still for it for the half-interesting aspect, but definitely
- // a bit odd.