Skip to main content
Loading...

More C++ Posts

/*
this program will simulate the spreading of a disease through a 
grid of people, starting from a user-defined person. It will count
the number of turns taken before everyone on the grid is immunized
to the disease after having caught it once.
This program will user the SIR model (Susceptible, Infectious, Recovered)
 and cellular automata to simulate the people in the grid.
*/
#include <iostream>
using namespace std;

/* Any and all global variables */
const int SIZE = 8; //Size of the square person array

/* Any and all functions */
void gridDefaultify(char[][SIZE], int);
	//Purpose: Sets each item in the person array to 's'
	//Parameters: A square, two-dimensional array
	//            The size of that array's bounds
void gridDisplay(char[][SIZE], int);
	//Purpose: Formats and prints the information in the person grid
	//Parameters: A square, two-dimensional array
	//            The value of the current day
void nextTurn(char[][SIZE], char[][SIZE], int&);
	//Purpose: Updates the grid of people, and the current day
	//Parameters: Two square, two-dimensional arrays
	//            A reference to the current day (so that it can be updated)
int countInfected(char[][SIZE], int);
	//Purpose: Counts the number of infectious people on the grid
	//Parameters: A square, two-dimensional array
	//            The size of that array's bounds


int main(){
	int currentDay = 0; //Infection begins on day 0, and ends one day after the last person is Recovered
	char gridCurrent[SIZE][SIZE]; //Grid of all people
	char gridUpdate[SIZE][SIZE]; //Where the user chooses to start the infection
	int xToInfect;
	int yToInfect; //Set of coordinates for the initial infection position, given by user
	
	//Initializes the grids to all 's'
	gridDefaultify(gridCurrent, SIZE);
	gridDefaultify(gridUpdate, SIZE);
	
	//The below block gets the initial infection coordinates from the user
	cout << "Please enter a location to infect: ";
	while(true){
		cin >> xToInfect >> yToInfect;

		xToInfect--;
		yToInfect--;
		
		if(xToInfect < 0 || yToInfect < 0 || xToInfect >= SIZE || yToInfect >= SIZE){
			cout << "Those coordinates are outside the bounds of this region." << endl;
			cout << "Please enter another location to infect: ";
			continue;
		} else {
			gridCurrent[xToInfect][yToInfect] = 'i';
			break;
		}
	}
	
	//Displays the initial state of the grid
	gridDisplay(gridCurrent, currentDay);
	
	//The below block will display and update the grid until the infection is done.
	while(true){
		nextTurn(gridCurrent, gridUpdate, currentDay);
		gridDisplay(gridCurrent, currentDay);
		if(countInfected(gridCurrent, SIZE) == 0) break; //Once there are no more infected, the game is done
	}
	
	//Displays the number of days taken for the infection to end
	cout << "It took " << currentDay + 1 << " days for the outbreak to end";
	
	cout << endl;
	return 0;
}

void gridDefaultify(char arr[][SIZE], int arrSize){
	for(int x = 0; x < arrSize; x++){
		for(int y = 0; y < arrSize; y++){
			arr[x][y] = 's'; //Sets all items in the passed-in array to 's'
		}
	}
	return;
}

void gridDisplay(char arr[][SIZE], int day){
	cout << "Day " << day << endl; //Prints the current day
	for(int x = 0; x < SIZE; x++){
		for(int y = 0; y < SIZE; y++){
			cout << arr[x][y] <<" "; //Prints the array's contents
		}
		cout << endl; //Formats with newlines
	}
	cout << endl; //Some spacing
	return;
}

void nextTurn(char today[][SIZE], char update[][SIZE], int& day){
	day++; //Updates the day
	int xCheck; //X coordinate to be checked
	int yCheck; //Y coordinate to be checked
	
	for(int x = 0; x < SIZE; x++){
		for(int y = 0; y < SIZE; y++){
			//Sets all 'i' to 'r' in the new grid
			if(today[x][y] == 'i' || today[x][y] == 'r'){
				update[x][y] = 'r'; //Updates all infectious to recovered, and keeps current recovered
			}
			if(today[x][y] == 's'){									// If the person is susceptible...
				for(int xCheck = x-1; xCheck <= x+1; xCheck++){		// Check all x coordinates around the person
					for(int yCheck = y-1; yCheck <= y+1; yCheck++){	// Check all y coordinates around the person
						if(xCheck == x && yCheck == y){
																	// Don't check at the person because there is no need to check there
						} else {
							if(xCheck >= 0 && yCheck >= 0 && xCheck < SIZE && yCheck < SIZE){ // Make sure the checked coordinates are in bounds
								if(today[xCheck][yCheck] == 'i'){	//Is the person at the checked coordinates infected?
									update[x][y] = 'i';				//If so, update the 's' to 'i' in the new grid
								}
							}
						}
					}
				}
			}
		}
	}
	
	for(int x = 0; x < SIZE; x++){
		for(int y = 0; y < SIZE; y++){
			today[x][y] = update[x][y]; //Updates today's grid with the new values
		}
	}
}

int countInfected(char arr[][SIZE], int arrSize){
	int count = 0;
	
	for(int x = 0; x < arrSize; x++){
		for(int y = 0; y < arrSize; y++){
			if(arr[x][y] == 'i') count++; //Increments count for each infected person in the grid
		}
	}
	
	return count;
}
//Leif Messinger
//Compile with C++ 20
#include <iostream>
#include <ranges>
#include <vector>
#include <functional>
#include <cctype> //toupper
#include <cxxabi.h>

template <typename T>
void printType(){
    std::cout << abi::__cxa_demangle(typeid(T).name(), NULL, NULL, NULL) << std::endl;
}

template <typename T>
class Slicer{
    public:
        T begin_;
        T end_;
        T trueEnd;
        Slicer(T begin, T end): begin_(begin), end_(begin), trueEnd(end){}
        template<typename U>
        Slicer(U&& vec) : begin_(vec.begin()), end_(vec.begin()), trueEnd(vec.end()){}
        Slicer& finish(){
            begin_ = end_;
            end_ = trueEnd;
            return (*this);
        }
        Slicer& to(long int index){
            begin_ = end_;
            if(index > 0){
                end_ = (begin_ + index);
            }else{
                index *= -1;
                end_ = (trueEnd - index);
            }
            return (*this);
        }
        Slicer& operator[](long int index){
            return to(index);
        }
        T begin(){
            return this->begin_;
        }
        T end(){
            return this->end_;
        }
        Slicer& operator()(std::function<void(decltype(*begin_))> func) {
            for(decltype(*begin_) thing : (*this)){
                func(thing);
            }
            return (*this);
        }
};
static_assert(std::ranges::range< Slicer<std::vector<int>::const_iterator> >);

int main(){
    std::string vec = "abcdefghijklmnopqrstuvwxyz";
    Slicer<std::string::const_iterator> bruh(vec);
    
    //printType<decltype(bruh)>();

    bruh.to(3)([](char yeet){
        std::cout << yeet;
    })
    .to(-1)([](char yeet){
        std::cout << char(std::toupper(yeet));
    }).finish()([](char yeet){
        std::cout << yeet << yeet << yeet << yeet << yeet;
    });
    
    std::cout << std::endl << std::endl;
    
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
    Slicer<int*> arrSlicer(arr, arr + (sizeof(arr)/sizeof(int)));
    
    std::cout << "[";
    arrSlicer.to(-1)([](int yeet){
        std::cout << yeet << ", ";
    }).finish()([](int yeet){
        std::cout << yeet << "]" << std::endl;
    });

    return 0;
}