<commit_before># euler
This repository will contain projects related to the Euler Project

=====================================
LYCHREL - Problem 55
=====================================

class Lychrel :

Lychrel.py defines a class called Lychrel which will generate Lychrel numbers as defined in the Euler Project #55

--------
INSTANTIATION : 
--------

lychrelInstance = Lychrel(number)

lychrelInstance = Lychrel(number, debug=True) 

setting debug=True as shown above will output additional details as the Lychrel methods are executed

--------
STATIC METHODS
--------
isLychrelCount(fromNumber, toNumber)

returns the number of Lychrel numbers between fromNumber and toNumber inclusive

example : print 'Lychrel numbers from 5 to 10 : ', Lychrel.isLychrelCount(5, 10)

example : print 'Lychrel numbers 10 to 10 : ', Lychrel.isLychrelCount(10, 10)

--------
CLASS METHODS
--------

validNumber() : returns true if instance number is >= 1

isPalindrome() : returns true if the instance number is a palindrome.  

isLychrelAndPalindrome() : returns true if instance number is both a Lychrel number and additionally a palindrome

isLychrel() returns true if the instance number is a Lychrel number

----------

ADDITIONAL CLASSES and/or Functions

----------

class ReverseSum :

This class will store a number in the instance, store it's reverse, and store the sum of the number and it's reverse

Example : revInstance = ReverseSum(1234) will create an instance where by the instance stores the number 1234, it's reverse 4321 and their sum of 5555

instantiation : revInstance = ReverseSum(number)

method : getReverseSum() will return the reverseSum that is stored in the instance

example : print 'The reverse sum of 1234 is : ', revInstance.getReverseSum(1234)
> The reverse sum of 1234 is : 5555

----------

FUNCTION 

----------

isPalindrome(number) : 

returns True/False as to whether or not the argument number is a palindrome

example : print '123321 is a palindrome : ', isPalindrome(123321)
> 123321 is a palindrome ; True

----------

RUNNING LYCHREL

----------

MainLychrel.py contains the Main program that will run the stated problem as defined in the Euler Project
It will also test and show the 3 palindromes < 10,000 that are also Lychrel numbers and some misc samples

python MainLychrel.py

OUTPUT : 

Palindrome 4994 is also a Lychrel number     :  True

Palindrome 8778 is also a Lychrel number     :  True

Palindrome 9999 is also a Lychrel number     :  True

Palindrome 1551 is NOT also a Lychrel number :  True

Palindrome 1551 is NOT also a Lychrel number (debug on) 

Non Lychrel Number : 1551, Palindrome : 5115, Iterations : 2

978 is Lychrel number shown two ways :  True

Number of Lychrel numbers below 10,0000 :  249

=====================================

ReflexivePosition - Problem 305

=====================================

class ReflexivePosition : 

ReflexivePosition.py defines a class called ReflexivePosition which will generate Reflexive Positions as defined in the Euler Project #305

--------
INSTANTIATION : 
--------

refPoslInstance = ReflexivePosition()
refPosInstance = ReflexivePosition(debug=True) 

setting debug=True as shown above will output additional details as the ReflexivePosition methods are executed

--------
CLASS METHODS
--------

f(number) : returns the reflexive position of number

----------

ADDITIONAL CLASSES and/or Functions

----------

class InfiniteString :

This class will create a window into an infinite string.  The infinite string is composed of the integers from 1 to n concatenated into a string.
The window starts at the left of the string 1234...
Once you start searching through the infinite string, you no longer need the characters to the left, so they slide out of the window.
As you need more numbers/characters to the right, you can add more.  The purpose of such a class is to conserve memory because technically, you 
cannot really have an infinite string without running out of memory.

--------
INSTANTIATION : 
--------

bigString = InfiniteString()

bigString = InfiniteString(howmany)

bigString = InfiniteString(howmany, debug=True)

howmany will default to 10 if it is not in the argument list
debug will default to false if it is not in the argument list

howmany determines how many characters the string starts with.  It is also used to determine how many digits to add to the right of the string window.
setting debug=True as shown above will output additional details as the InfiniteString methods are executed

--------
CLASS METHODS
--------

toString() : returns the current window of integer characters as a string

keepLast(number) : keeps the last 'number' of characters in the infiniteString window.  Effectively, removing from the left
example : keelLast(6) with a string of 123456789101112 will update the bigString to 101112

addMoreDigits() : will concatenate 'howmany' integer digits onto the right of the string, increasing the window to the right.
example addMoreDigits() with a string of 101112 (assume howmany = 5) will expand the bigString window to 1011121314151617

----------

RUNNING REFLEXIVE POSITION

----------

MainReflexivePosition.py contains the Main program that will run the stated problem as defined in the Euler Project
It will also test and show various misc hint examples that were provided with the problem

python MainReflexivePosition.py

OUTPUT : 

reflexive position of 1, should equal 1            :  True
reflexive position of 5, should equal 81           :  True
reflexive position of 12, should equal 271         :  True
reflexive position of 7780, should equal 111111365 :  True
sum of reflexive positions of 3^k 1<=k<=13, after k =  1 , total =  37
sum of reflexive positions of 3^k 1<=k<=13, after k =  2 , total =  206
sum of reflexive positions of 3^k 1<=k<=13, after k =  3 , total =  2414
sum of reflexive positions of 3^k 1<=k<=13, after k =  4 , total =  7139
sum of reflexive positions of 3^k 1<=k<=13, after k =  5 , total =  168152
sum of reflexive positions of 3^k 1<=k<=13, after k =  6 , total =  1094821
sum of reflexive positions of 3^k 1<=k<=13, after k =  7 , total =  15294209
sum of reflexive positions of 3^k 1<=k<=13, after k =  8 , total =  67775814
sum of reflexive positions of 3^k 1<=k<=13, after k =  9 , total =  1728200395
sum of reflexive positions of 3^k 1<=k<=13, after k =  10 , total =  9632403779
sum of reflexive positions of 3^k 1<=k<=13, after k =  11 , total =  160686572624
sum of reflexive positions of 3^k 1<=k<=13, after k =  12 , total =  538034026086

----------

TESTING REFLEXIVE POSITION

----------

There are 2 tests where each test tests many different scenarios

Test1 focus is testing ReflexivePosition
Test2 focus is testing InfiniteString

python test_reflexive_position.py

OUTPUT : 

..
----------------------------------------------------------------------
Ran 2 tests in 13.535s

OK

<commit_msg>cleanup documentation and add additional software comments<commit_after># euler
This repository will contain projects related to the Euler Project

=====================================
LYCHREL - Problem 55
=====================================

class Lychrel :

Lychrel.py defines a class called Lychrel which will generate Lychrel numbers as defined in the Euler Project #55

--------
INSTANTIATION : 
--------

lychrelInstance = Lychrel(number)

lychrelInstance = Lychrel(number, debug=True) 

setting debug=True as shown above will output additional details as the Lychrel methods are executed

--------
STATIC METHODS
--------
isLychrelCount(fromNumber, toNumber)

returns the number of Lychrel numbers between fromNumber and toNumber inclusive

example : print 'Lychrel numbers from 5 to 10 : ', Lychrel.isLychrelCount(5, 10)

example : print 'Lychrel numbers 10 to 10 : ', Lychrel.isLychrelCount(10, 10)

--------
CLASS METHODS
--------

validNumber() : returns true if instance number is >= 1

isPalindrome() : returns true if the instance number is a palindrome.  

isLychrelAndPalindrome() : returns true if instance number is both a Lychrel number and additionally a palindrome

isLychrel() returns true if the instance number is a Lychrel number

----------

ADDITIONAL CLASSES and/or Functions

----------

class ReverseSum :

This class will store a number in the instance, store it's reverse, and store the sum of the number and it's reverse

Example : revInstance = ReverseSum(1234) will create an instance where by the instance stores the number 1234, it's reverse 4321 and their sum of 5555

instantiation : revInstance = ReverseSum(number)

method : getReverseSum() will return the reverseSum that is stored in the instance

example : print 'The reverse sum of 1234 is : ', revInstance.getReverseSum(1234)
> The reverse sum of 1234 is : 5555

----------

FUNCTION 

----------

isPalindrome(number) : 

returns True/False as to whether or not the argument number is a palindrome

example : print '123321 is a palindrome : ', isPalindrome(123321)
> 123321 is a palindrome ; True

----------

RUNNING LYCHREL

----------

MainLychrel.py contains the Main program that will run the stated problem as defined in the Euler Project
It will also test and show the 3 palindromes < 10,000 that are also Lychrel numbers and some misc samples

python MainLychrel.py

OUTPUT : 

Palindrome 4994 is also a Lychrel number     :  True

Palindrome 8778 is also a Lychrel number     :  True

Palindrome 9999 is also a Lychrel number     :  True

Palindrome 1551 is NOT also a Lychrel number :  True

Palindrome 1551 is NOT also a Lychrel number (debug on) 

Non Lychrel Number : 1551, Palindrome : 5115, Iterations : 2

978 is Lychrel number shown two ways :  True

Number of Lychrel numbers below 10,0000 :  249

=====================================

ReflexivePosition - Problem 305

=====================================

class ReflexivePosition : 

ReflexivePosition.py defines a class called ReflexivePosition which will generate Reflexive Positions as defined in the Euler Project #305

--------
INSTANTIATION : 
--------

refPoslInstance = ReflexivePosition()
refPosInstance = ReflexivePosition(debug=True) 

setting debug=True as shown above will output additional details as the ReflexivePosition methods are executed

--------
CLASS METHODS
--------

f(number) : returns the reflexive position of number

----------

ADDITIONAL CLASSES and/or Functions

----------

class InfiniteString :

This class will create a window into an infinite string.  The infinite string is composed of the integers from 1 to n concatenated into a string.
The window starts at the left of the string 1234...
Once you start searching through the infinite string, you no longer need the characters to the left, so they slide out of the window.
As you need more numbers/characters to the right, you can add more.  The purpose of such a class is to conserve memory because technically, you 
cannot really have an infinite string without running out of memory.

--------
INSTANTIATION : 
--------

bigString = InfiniteString()

bigString = InfiniteString(howmany)

bigString = InfiniteString(howmany, debug=True)

howmany will default to 10 if it is not in the argument list
debug will default to false if it is not in the argument list

howmany determines how many characters the string starts with.  It is also used to determine how many digits to add to the right of the string window.
setting debug=True as shown above will output additional details as the InfiniteString methods are executed

--------
CLASS METHODS
--------

toString() : returns the current window of integer characters as a string

keepLast(number) : keeps the last 'number' of characters in the infiniteString window.  Effectively, removing from the left
example : keelLast(6) with a string of 123456789101112 will update the bigString to 101112

addMoreDigits() : will concatenate 'howmany' integer digits onto the right of the string, increasing the window to the right.
example addMoreDigits() with a string of 101112 (assume howmany = 5) will expand the bigString window to 1011121314151617

----------

RUNNING REFLEXIVE POSITION

----------

MainReflexivePosition.py contains the Main program that will run the stated problem as defined in the Euler Project
It will also test and show various misc hint examples that were provided with the problem

python MainReflexivePosition.py

OUTPUT : 

reflexive position of 1, should equal 1            :  True

reflexive position of 5, should equal 81           :  True

reflexive position of 12, should equal 271         :  True

reflexive position of 7780, should equal 111111365 :  True

sum of reflexive positions of 3^k 1<=k<=13, after k =  1 , total =  37

sum of reflexive positions of 3^k 1<=k<=13, after k =  2 , total =  206

sum of reflexive positions of 3^k 1<=k<=13, after k =  3 , total =  2414

sum of reflexive positions of 3^k 1<=k<=13, after k =  4 , total =  7139

sum of reflexive positions of 3^k 1<=k<=13, after k =  5 , total =  168152

sum of reflexive positions of 3^k 1<=k<=13, after k =  6 , total =  1094821

sum of reflexive positions of 3^k 1<=k<=13, after k =  7 , total =  15294209

sum of reflexive positions of 3^k 1<=k<=13, after k =  8 , total =  67775814

sum of reflexive positions of 3^k 1<=k<=13, after k =  9 , total =  1728200395

sum of reflexive positions of 3^k 1<=k<=13, after k =  10 , total =  9632403779

sum of reflexive positions of 3^k 1<=k<=13, after k =  11 , total =  160686572624

sum of reflexive positions of 3^k 1<=k<=13, after k =  12 , total =  538034026086

----------

TESTING REFLEXIVE POSITION

----------

There are 2 tests where each test tests many different scenarios

Test1 focus is testing ReflexivePosition
Test2 focus is testing InfiniteString

python test_reflexive_position.py

OUTPUT : 

..
----------------------------------------------------------------------
Ran 2 tests in 13.535s

OK


{'fraction_non_alphanumeric': 0.10927152317880795, 'fraction_numerical': 0.05110855168442269, 'mean_word_length': 3.435823754789272, 'pattern_counts': {'":': 0, '<': 53, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5115302', 'n_tokens_mistral': 4450, 'n_tokens_neox': 3808, 'n_words': 1822}