C++ Range Slicer
0 likes • Oct 31, 2023 • 3 views
C++
Loading...
More C++ Posts
//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>#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;}
#include "stdio.h"#include <stdlib.h>int main (int argCount, char** args) {int a = atoi(args[1]);int b = atoi(args[2]);unsigned int sum = 0;unsigned int p = 1;for (unsigned int i = 1; i < b; i++) {p = p * i;}// (b!, (1 + b)!, (2 + b)!, ..., (n + b)!)for (unsigned int i = 0; i < a; i++) {p = p * (i + b);sum = sum + p;}printf("y: %u\n", sum);return 0;}
#include <iostream>#include <fstream>#include <string>#include <cstring>using namespace std;//This program makes a new text file that contains all combinations of two letters.// aa, ab, ..., zy, zzint main(){string filename = "two_letters.txt";ofstream outFile;outFile.open(filename.c_str());if(!outFile.is_open()){cout << "Something's wrong. Closing..." << endl;return 0;}for(char first = 'a'; first <= 'z'; first++){for(char second = 'a'; second <= 'z'; second++){outFile << first << second << " ";}outFile << endl;}return 0;}
// Iterative C++ program to// implement Stein's Algorithm//#include <bits/stdc++.h>#include <bitset>using namespace std;// Function to implement// Stein's Algorithmint gcd(int a, int b){/* GCD(0, b) == b; GCD(a, 0) == a,GCD(0, 0) == 0 */if (a == 0)return b;if (b == 0)return a;/*Finding K, where K is thegreatest power of 2that divides both a and b. */int k;for (k = 0; ((a | b) & 1) == 0; ++k){a >>= 1;b >>= 1;}/* Dividing a by 2 until a becomes odd */while ((a & 1) == 0)a >>= 1;/* From here on, 'a' is always odd. */do{/* If b is even, remove all factor of 2 in b */while ((b & 1) == 0)b >>= 1;/* Now a and b are both odd.Swap if necessary so a <= b,then set b = b - a (which is even).*/if (a > b)swap(a, b); // Swap u and v.b = (b - a);} while (b != 0);/* restore common factors of 2 */return a << k;}// Driver codeint main(){int a = 12, b = 780;printf("Gcd of given numbers is %d\n", gcd(a, b));return 0;}
#include <iostream>using namespace std;int main(){cout << "Hello, World!" << endl;return 0;}