Loading...
More C++ Posts
#include <iostream>#include <vector>#include <limits>#define DEBUG_TRIAL falseclass Trial{public:const size_t HEIGHT;std::string record;//Breaking height is the index of the floor, so 0 is the bottom floor, height-1 is the top floor.//Eggs is the eggs remaining.//Start is the bottom floor.//End is one above the top floor.const size_t BREAKING_HEIGHT;size_t eggs;size_t start;size_t end;size_t floorsLeft(){return (end-start);}size_t middle(){return start + (floorsLeft()/2UL);}size_t drops = 0;Trial(const size_t BREAKING_HEIGHT, size_t eggs, size_t start, size_t end): BREAKING_HEIGHT(BREAKING_HEIGHT), eggs(eggs), start(start), end(end), HEIGHT(end), record(end, '_'){record[BREAKING_HEIGHT] = 'B'; //Marking the breaking point}bool foundAnswer(){return ((record[0] == 'X') || (record.find("OX")!=std::string::npos));}//returns true if the egg broke.//height is the index of the floor, so 0 is the bottom floor, height-1 is the top floor.bool drop(size_t height){#if DEBUG_TRIALstd::cout << "Start: " << start << ". End: " << end << ". Floors Left: " << floorsLeft() << ". Middle Index: " << middle() << std::endl;#endifdrops++;bool cracked = height >= BREAKING_HEIGHT;if(cracked) --eggs;//Update the recordrecord[height] = (height >= BREAKING_HEIGHT)? 'X' : 'O';#if DEBUG_TRIAL//Print the recordstd::cout << record << std::endl;#endifreturn cracked;}size_t nowWhat(){if(foundAnswer()){return drops;}else if(eggs <= 0){ //Ran out of eggsthrow "Algorithm failed! No more eggs!";return 1UL;}else if(eggs > 1){return wrecklessSearch();}else{return safeSearch();}}size_t safeSearch(){if(drop(start)){--end;}else{++start;}return nowWhat();}size_t wrecklessSearch(){//If the egg breaksif(drop(middle())){end -= (floorsLeft()/2UL);}else{ //egg doesn't crackstart += (floorsLeft()/2UL);}return nowWhat();}//returns the amount of drops needed to find the answersize_t search(){return nowWhat();}};//Height is the height of the building in floors.//Breaking height is the index of the floor, so 0 is the bottom floor, height-1 is the top floor.//Eggs is the eggs given.//returns the amount of drops needed to find the answersize_t search(const size_t height, const size_t BREAKING_HEIGHT, size_t eggs){Trial trial(BREAKING_HEIGHT, eggs, 0, height);return trial.search();}class TrialStats {public:size_t min = std::numeric_limits<size_t>::max();size_t max = 0;double mean = -1.0;void printStats(){// Print the resultsstd::cout << "Minimum drops: " << min << std::endl;std::cout << "Maximum drops: " << max << std::endl;std::cout << "Mean drops: " << mean << std::endl;}};//Benchmarks all the possible breaking points of a single building height with a number of eggs.TrialStats trial(const size_t HEIGHT, const size_t eggs){TrialStats stats;int totaldrops = 0;//Test every possible breaking point//Breaking height is the index of the floor, so 0 is the bottom floor, height-1 is the top floor.for (int breakingHeight = 0; breakingHeight < HEIGHT; ++breakingHeight) {size_t drops = search(HEIGHT, breakingHeight, eggs);stats.min = std::min(stats.min, drops);stats.max = std::max(stats.max, drops);totaldrops += drops;}// Calculate the mean number of dropsstats.mean = static_cast<double>(totaldrops) / HEIGHT;return stats;}//Benchmarks a single building height from 1 egg to MAX_EGGSvoid testTower(const size_t height, const size_t MAX_EGGS){//Drop every amount of eggs that you'd need.for (int eggs = 1; eggs <= MAX_EGGS; ++eggs) {std::cout << "Building height: " << height << ". Num eggs: " << eggs << std::endl;TrialStats stats = trial(height, eggs);stats.printStats();std::cout << std::endl << std::endl;}}//Benchmarks all buildings from 0 to MAX_HEIGHTvoid benchmark(const size_t MAX_HEIGHT){const size_t MAX_EGGS = 2;//Test every buildingfor (size_t height = 1; height <= MAX_HEIGHT; ++height) {testTower(height, std::min(height, MAX_EGGS));}}int main() {constexpr size_t MAX_HEIGHT = 36;benchmark(MAX_HEIGHT);return 0;}
//Leif Messinger//Finds all sets of 5 5 letter words that don't have duplicate letters in either themselves or each other.//First it reads the words in and puts them in groups of their bitmasks//After that, we recurse on each group. Before doing that, we remove the group from the set of other groups to check it against.#include <cstdio> //getchar, printf#include <cassert> //assert#include <vector>#include <set>#include <algorithm> //std::copy_if#include <iterator> //std::back_inserter#define CHECK_FOR_CRLF true#define MIN_WORDS 5#define MAX_WORDS 5#define WORD_TOO_LONG(len) (len != 5)const unsigned int charToBitmask(const char bruh){assert(bruh >= 'a' && bruh <= 'z');return (1 << (bruh - 'a'));}void printBitmask(unsigned int bitmask){char start = 'a';while(bitmask != 0){if(bitmask & 1){putchar(start);}bitmask >>= 1;++start;}}//Pointer needs to be deletedconst std::set<unsigned int>* getBitmasks(){std::set<unsigned int>* bitmasksPointer = new std::set<unsigned int>;std::set<unsigned int>& bitmasks = (*bitmasksPointer);unsigned int bitmask = 0;unsigned int wordLength = 0;bool duplicateLetters = false;for(char c = getchar(); c >= 0; c = getchar()){if(CHECK_FOR_CRLF && c == '\r'){continue;}if(c == '\n'){if(!(WORD_TOO_LONG(wordLength) || duplicateLetters)) bitmasks.insert(bitmask);bitmask = 0;wordLength = 0;duplicateLetters = false;continue;}if((bitmask & charToBitmask(c)) != 0) duplicateLetters = true;bitmask |= charToBitmask(c);++wordLength;}return bitmasksPointer;}void printBitmasks(const std::vector<unsigned int>& bitmasks){for(unsigned int bruh : bitmasks){printBitmask(bruh);putchar(','); putchar(' ');}puts("");}//Just to be clear, when I mean "word", I mean a group of words with the same letters.void recurse(std::vector<unsigned int>& oldBitmasks, std::vector<unsigned int> history, const unsigned int currentBitmask){//If there's not enough words leftif(oldBitmasks.size() + (-(history.size())) + (-MIN_WORDS) <= 0){//If there's enough wordsif(history.size() >= MIN_WORDS){//Print the listprintBitmasks(history);}return;//To make it faster, we can stop it after 5 words too}else if(history.size() >= MAX_WORDS){//Print the listprintBitmasks(history);return;}//Thin out the array with only stuff that matches the currentBitmask.std::vector<unsigned int> newBitmasks;std::copy_if(oldBitmasks.begin(), oldBitmasks.end(), std::back_inserter(newBitmasks), [¤tBitmask](unsigned int bruh){return (bruh & currentBitmask) == 0;});while(newBitmasks.size() > 0){//I know this modifies 'oldBitmasks' too. It's intentional.//This makes it so that the word is never involved in any of the child serches or any of the later searches in this while loop.const unsigned int word = newBitmasks.back(); newBitmasks.pop_back();std::vector<unsigned int> newHistory = history;newHistory.push_back(word);recurse(newBitmasks, newHistory, currentBitmask | word);}}int main(){const std::set<unsigned int>* bitmasksSet = getBitmasks();std::vector<unsigned int> bitmasks(bitmasksSet->begin(), bitmasksSet->end());delete bitmasksSet;recurse(bitmasks, std::vector<unsigned int>(), 0);return 0;}
#include <iostream>using namespace std;int main {cout << 1;}
#include "goat.h" //include goat.hvoid Goat::setBreed(string breed) {this->breed = breed;}void Goat::setWeight(float weight) {this->weight = weight;}void Goat::setName(string name) {this->name = name;}void Goat::setGender(char gender) {this->gender = gender;}void Goat::setSpayed(bool goatIsSpayed) {this->goatIsSpayed = goatIsSpayed;}void Goat::setRegistrationID(string registrationID) {this->registrationID = registrationID;}void Goat::setColor(string color) {this->color = color;}void Goat::setOtherComments(string otherComments) {this->otherComments = otherComments;}string Goat::getBreed() {return breed;}float Goat::getWeight() {return weight;}string Goat::getName() {return name;}char Goat::getGender() {return gender;}bool Goat::getSpayed() {return goatIsSpayed;}string Goat::getRegistrationID() {return registrationID;}string Goat::getColor() {return color;}string Goat::getOtherComments() {return otherComments;}Goat::Goat() {breed = "";weight = 0.0;name = "";gender = '\0';goatIsSpayed = false;registrationID = "";color = "";otherComments = "";}Goat::Goat(string goatBreed, float goatWeight, string goatName, char goatGender, bool goatSpayedStatus, string goatRegistrationID, string goatColor, string goatOtherComments) {breed = goatBreed;weight = goatWeight;name = goatName;gender = goatGender;goatIsSpayed = goatSpayedStatus;registrationID = goatRegistrationID;color = goatColor;otherComments = goatOtherComments;}Goat::~Goat() {cout << "goat destroyed" << endl;}void Goat::printinfo() {cout << "Breed: " << breed << endl << "weight: " << weight << endl << "Name: " << name << endl << "Gender: " << gender << endl << "is Spayed: ";if(goatIsSpayed) { //here I do a logical test on boolean goatIsSpayed. if true cout << true else cout << falsecout << "True";} else {cout << "False";}cout << endl << "Registration ID: " << registrationID << endl << "Color Description: " << color << endl << "Other Comments: " << otherComments << endl << endl;}
#include <iostream>using namespace std;/* Function: get_coeffParameters: double& coeff, int pos passed from bb_4acReturn: type is void so no return, but does ask for user to input data that establishes what a b and c are.*/void get_coeff(double& coeff, int pos) {char position;if(pos == 1) {position = 'a';} else if(pos == 2) { //a simple system to determine what coefficient the program is asking for.position = 'b';} else {position = 'c';}cout << "Enter the co-efficient " << position << ":"; //prompt to input coeffcoeff = 5; //input coeff}/* Function: bb_4acParameters: no parameters passed from main, but 3 params established in function, double a, b, c.Return: b * b - 4 * a * c*/double bb_4ac() {double a, b, c; //coefficients of a quadratic equationget_coeff(a, 1); // call function 1st timeget_coeff(b, 2); // call function 2nd timeget_coeff(c, 3); // call function 3rd timereturn b * b - 4 * a * c; //return b * b - 4 * a * c}int main() {cout << "Function to calculate the discriminant of the equation. . . " << endl;double determinate = bb_4ac(); //assign double determinate to bb_4ac functioncout << "The discriminant for given values is: " << determinate << endl; //output the determinate!}
#include<iostream>using namespace std;const int rows = 8;const int cols = 8;char chessboard[rows][cols];void setBoard(char chessboard[][cols]);void printBoard(char chessboard[][cols]);void setBoard(char chessboard[][cols]) {for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {if(i % 2 == 0 && j % 2 == 0) {chessboard[i][j] = 'x';} else {if(i % 2 != 0 && j % 2 == 1) {chessboard[i][j] = 'x';} else {chessboard[i][j] = '-';}}}}return;}void printBoard(char chessboard[][cols]) {for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {cout << chessboard[i][j] << " ";}cout << endl;}return;}int main(int argc, char const *argv[]){setBoard(chessboard);printBoard(chessboard);return 0;}