mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
[pre-commit.ci] pre-commit autoupdate (#9543)
* [pre-commit.ci] pre-commit autoupdate updates: - [github.com/astral-sh/ruff-pre-commit: v0.0.291 → v0.0.292](https://github.com/astral-sh/ruff-pre-commit/compare/v0.0.291...v0.0.292) - [github.com/codespell-project/codespell: v2.2.5 → v2.2.6](https://github.com/codespell-project/codespell/compare/v2.2.5...v2.2.6) - [github.com/tox-dev/pyproject-fmt: 1.1.0 → 1.2.0](https://github.com/tox-dev/pyproject-fmt/compare/1.1.0...1.2.0) * updating DIRECTORY.md * Fix typos in test_min_spanning_tree_prim.py * Fix typos * codespell --ignore-words-list=manuel --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Co-authored-by: Tianyi Zheng <tianyizheng02@gmail.com> Co-authored-by: Christian Clauss <cclauss@me.com>
This commit is contained in:
parent
60291738d2
commit
895dffb412
|
@ -26,7 +26,7 @@ repos:
|
||||||
- id: black
|
- id: black
|
||||||
|
|
||||||
- repo: https://github.com/codespell-project/codespell
|
- repo: https://github.com/codespell-project/codespell
|
||||||
rev: v2.2.5
|
rev: v2.2.6
|
||||||
hooks:
|
hooks:
|
||||||
- id: codespell
|
- id: codespell
|
||||||
additional_dependencies:
|
additional_dependencies:
|
||||||
|
|
|
@ -11,10 +11,10 @@ Download dataset from :
|
||||||
https://lhncbc.nlm.nih.gov/LHC-publications/pubs/TuberculosisChestXrayImageDataSets.html
|
https://lhncbc.nlm.nih.gov/LHC-publications/pubs/TuberculosisChestXrayImageDataSets.html
|
||||||
|
|
||||||
1. Download the dataset folder and create two folder training set and test set
|
1. Download the dataset folder and create two folder training set and test set
|
||||||
in the parent dataste folder
|
in the parent dataset folder
|
||||||
2. Move 30-40 image from both TB positive and TB Negative folder
|
2. Move 30-40 image from both TB positive and TB Negative folder
|
||||||
in the test set folder
|
in the test set folder
|
||||||
3. The labels of the iamges will be extracted from the folder name
|
3. The labels of the images will be extracted from the folder name
|
||||||
the image is present in.
|
the image is present in.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -8,7 +8,7 @@ from string import ascii_lowercase, digits
|
||||||
import cv2
|
import cv2
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
# Parrameters
|
# Parameters
|
||||||
OUTPUT_SIZE = (720, 1280) # Height, Width
|
OUTPUT_SIZE = (720, 1280) # Height, Width
|
||||||
SCALE_RANGE = (0.4, 0.6) # if height or width lower than this scale, drop it.
|
SCALE_RANGE = (0.4, 0.6) # if height or width lower than this scale, drop it.
|
||||||
FILTER_TINY_SCALE = 1 / 100
|
FILTER_TINY_SCALE = 1 / 100
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
"""
|
"""
|
||||||
Author : Alexander Pantyukhin
|
Author : Alexander Pantyukhin
|
||||||
Date : October 14, 2022
|
Date : October 14, 2022
|
||||||
This is implementation Dynamic Programming up bottom approach
|
This is an implementation of the up-bottom approach to find edit distance.
|
||||||
to find edit distance.
|
The implementation was tested on Leetcode: https://leetcode.com/problems/edit-distance/
|
||||||
The aim is to demonstate up bottom approach for solving the task.
|
|
||||||
The implementation was tested on the
|
|
||||||
leetcode: https://leetcode.com/problems/edit-distance/
|
|
||||||
|
|
||||||
Levinstein distance
|
Levinstein distance
|
||||||
Dynamic Programming: up -> down.
|
Dynamic Programming: up -> down.
|
||||||
|
@ -30,10 +27,10 @@ def min_distance_up_bottom(word1: str, word2: str) -> int:
|
||||||
|
|
||||||
@functools.cache
|
@functools.cache
|
||||||
def min_distance(index1: int, index2: int) -> int:
|
def min_distance(index1: int, index2: int) -> int:
|
||||||
# if first word index is overflow - delete all from the second word
|
# if first word index overflows - delete all from the second word
|
||||||
if index1 >= len_word1:
|
if index1 >= len_word1:
|
||||||
return len_word2 - index2
|
return len_word2 - index2
|
||||||
# if second word index is overflow - delete all from the first word
|
# if second word index overflows - delete all from the first word
|
||||||
if index2 >= len_word2:
|
if index2 >= len_word2:
|
||||||
return len_word1 - index1
|
return len_word1 - index1
|
||||||
diff = int(word1[index1] != word2[index2]) # current letters not identical
|
diff = int(word1[index1] != word2[index2]) # current letters not identical
|
||||||
|
|
|
@ -22,12 +22,12 @@ def test_prim_successful_result():
|
||||||
[1, 7, 11],
|
[1, 7, 11],
|
||||||
]
|
]
|
||||||
|
|
||||||
adjancency = defaultdict(list)
|
adjacency = defaultdict(list)
|
||||||
for node1, node2, cost in edges:
|
for node1, node2, cost in edges:
|
||||||
adjancency[node1].append([node2, cost])
|
adjacency[node1].append([node2, cost])
|
||||||
adjancency[node2].append([node1, cost])
|
adjacency[node2].append([node1, cost])
|
||||||
|
|
||||||
result = mst(adjancency)
|
result = mst(adjacency)
|
||||||
|
|
||||||
expected = [
|
expected = [
|
||||||
[7, 6, 1],
|
[7, 6, 1],
|
||||||
|
|
|
@ -1,26 +1,28 @@
|
||||||
"""
|
"""
|
||||||
Demonstrates implementation of SHA1 Hash function in a Python class and gives utilities
|
Implementation of the SHA1 hash function and gives utilities to find hash of string or
|
||||||
to find hash of string or hash of text from a file.
|
hash of text from a file. Also contains a Test class to verify that the generated hash
|
||||||
|
matches what is returned by the hashlib library
|
||||||
|
|
||||||
Usage: python sha1.py --string "Hello World!!"
|
Usage: python sha1.py --string "Hello World!!"
|
||||||
python sha1.py --file "hello_world.txt"
|
python sha1.py --file "hello_world.txt"
|
||||||
When run without any arguments, it prints the hash of the string "Hello World!!
|
When run without any arguments, it prints the hash of the string "Hello World!!
|
||||||
Welcome to Cryptography"
|
Welcome to Cryptography"
|
||||||
Also contains a Test class to verify that the generated Hash is same as that
|
|
||||||
returned by the hashlib library
|
|
||||||
|
|
||||||
SHA1 hash or SHA1 sum of a string is a cryptographic function which means it is easy
|
SHA1 hash or SHA1 sum of a string is a cryptographic function, which means it is easy
|
||||||
to calculate forwards but extremely difficult to calculate backwards. What this means
|
to calculate forwards but extremely difficult to calculate backwards. What this means
|
||||||
is, you can easily calculate the hash of a string, but it is extremely difficult to
|
is you can easily calculate the hash of a string, but it is extremely difficult to know
|
||||||
know the original string if you have its hash. This property is useful to communicate
|
the original string if you have its hash. This property is useful for communicating
|
||||||
securely, send encrypted messages and is very useful in payment systems, blockchain
|
securely, send encrypted messages and is very useful in payment systems, blockchain and
|
||||||
and cryptocurrency etc.
|
cryptocurrency etc.
|
||||||
The Algorithm as described in the reference:
|
|
||||||
|
The algorithm as described in the reference:
|
||||||
First we start with a message. The message is padded and the length of the message
|
First we start with a message. The message is padded and the length of the message
|
||||||
is added to the end. It is then split into blocks of 512 bits or 64 bytes. The blocks
|
is added to the end. It is then split into blocks of 512 bits or 64 bytes. The blocks
|
||||||
are then processed one at a time. Each block must be expanded and compressed.
|
are then processed one at a time. Each block must be expanded and compressed.
|
||||||
The value after each compression is added to a 160bit buffer called the current hash
|
The value after each compression is added to a 160-bit buffer called the current hash
|
||||||
state. After the last block is processed the current hash state is returned as
|
state. After the last block is processed, the current hash state is returned as
|
||||||
the final hash.
|
the final hash.
|
||||||
|
|
||||||
Reference: https://deadhacker.com/2006/02/21/sha-1-illustrated/
|
Reference: https://deadhacker.com/2006/02/21/sha-1-illustrated/
|
||||||
"""
|
"""
|
||||||
import argparse
|
import argparse
|
||||||
|
@ -30,18 +32,18 @@ import struct
|
||||||
|
|
||||||
class SHA1Hash:
|
class SHA1Hash:
|
||||||
"""
|
"""
|
||||||
Class to contain the entire pipeline for SHA1 Hashing Algorithm
|
Class to contain the entire pipeline for SHA1 hashing algorithm
|
||||||
>>> SHA1Hash(bytes('Allan', 'utf-8')).final_hash()
|
>>> SHA1Hash(bytes('Allan', 'utf-8')).final_hash()
|
||||||
'872af2d8ac3d8695387e7c804bf0e02c18df9e6e'
|
'872af2d8ac3d8695387e7c804bf0e02c18df9e6e'
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, data):
|
def __init__(self, data):
|
||||||
"""
|
"""
|
||||||
Inititates the variables data and h. h is a list of 5 8-digit Hexadecimal
|
Initiates the variables data and h. h is a list of 5 8-digit hexadecimal
|
||||||
numbers corresponding to
|
numbers corresponding to
|
||||||
(1732584193, 4023233417, 2562383102, 271733878, 3285377520)
|
(1732584193, 4023233417, 2562383102, 271733878, 3285377520)
|
||||||
respectively. We will start with this as a message digest. 0x is how you write
|
respectively. We will start with this as a message digest. 0x is how you write
|
||||||
Hexadecimal numbers in Python
|
hexadecimal numbers in Python
|
||||||
"""
|
"""
|
||||||
self.data = data
|
self.data = data
|
||||||
self.h = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]
|
self.h = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]
|
||||||
|
@ -90,7 +92,7 @@ class SHA1Hash:
|
||||||
For each block, the variable h that was initialized is copied to a,b,c,d,e
|
For each block, the variable h that was initialized is copied to a,b,c,d,e
|
||||||
and these 5 variables a,b,c,d,e undergo several changes. After all the blocks
|
and these 5 variables a,b,c,d,e undergo several changes. After all the blocks
|
||||||
are processed, these 5 variables are pairwise added to h ie a to h[0], b to h[1]
|
are processed, these 5 variables are pairwise added to h ie a to h[0], b to h[1]
|
||||||
and so on. This h becomes our final hash which is returned.
|
and so on. This h becomes our final hash which is returned.
|
||||||
"""
|
"""
|
||||||
self.padded_data = self.padding()
|
self.padded_data = self.padding()
|
||||||
self.blocks = self.split_blocks()
|
self.blocks = self.split_blocks()
|
||||||
|
@ -135,7 +137,7 @@ def test_sha1_hash():
|
||||||
def main():
|
def main():
|
||||||
"""
|
"""
|
||||||
Provides option 'string' or 'file' to take input and prints the calculated SHA1
|
Provides option 'string' or 'file' to take input and prints the calculated SHA1
|
||||||
hash. unittest.main() has been commented because we probably don't want to run
|
hash. unittest.main() has been commented out because we probably don't want to run
|
||||||
the test each time.
|
the test each time.
|
||||||
"""
|
"""
|
||||||
# unittest.main()
|
# unittest.main()
|
||||||
|
|
|
@ -3,60 +3,53 @@ def calculate_pi(limit: int) -> str:
|
||||||
https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80
|
https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80
|
||||||
Leibniz Formula for Pi
|
Leibniz Formula for Pi
|
||||||
|
|
||||||
The Leibniz formula is the special case arctan 1 = 1/4 Pi .
|
The Leibniz formula is the special case arctan(1) = pi / 4.
|
||||||
Leibniz's formula converges extremely slowly: it exhibits sublinear convergence.
|
Leibniz's formula converges extremely slowly: it exhibits sublinear convergence.
|
||||||
|
|
||||||
Convergence (https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80#Convergence)
|
Convergence (https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80#Convergence)
|
||||||
|
|
||||||
We cannot try to prove against an interrupted, uncompleted generation.
|
We cannot try to prove against an interrupted, uncompleted generation.
|
||||||
https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80#Unusual_behaviour
|
https://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80#Unusual_behaviour
|
||||||
The errors can in fact be predicted;
|
The errors can in fact be predicted, but those calculations also approach infinity
|
||||||
but those calculations also approach infinity for accuracy.
|
for accuracy.
|
||||||
|
|
||||||
Our output will always be a string since we can defintely store all digits in there.
|
Our output will be a string so that we can definitely store all digits.
|
||||||
For simplicity' sake, let's just compare against known values and since our outpit
|
|
||||||
is a string, we need to convert to float.
|
|
||||||
|
|
||||||
>>> import math
|
>>> import math
|
||||||
>>> float(calculate_pi(15)) == math.pi
|
>>> float(calculate_pi(15)) == math.pi
|
||||||
True
|
True
|
||||||
|
|
||||||
Since we cannot predict errors or interrupt any infinite alternating
|
Since we cannot predict errors or interrupt any infinite alternating series
|
||||||
series generation since they approach infinity,
|
generation since they approach infinity, or interrupt any alternating series, we'll
|
||||||
or interrupt any alternating series, we are going to need math.isclose()
|
need math.isclose()
|
||||||
|
|
||||||
>>> math.isclose(float(calculate_pi(50)), math.pi)
|
>>> math.isclose(float(calculate_pi(50)), math.pi)
|
||||||
True
|
True
|
||||||
|
|
||||||
>>> math.isclose(float(calculate_pi(100)), math.pi)
|
>>> math.isclose(float(calculate_pi(100)), math.pi)
|
||||||
True
|
True
|
||||||
|
|
||||||
Since math.pi-constant contains only 16 digits, here some test with preknown values:
|
Since math.pi contains only 16 digits, here are some tests with known values:
|
||||||
|
|
||||||
>>> calculate_pi(50)
|
>>> calculate_pi(50)
|
||||||
'3.14159265358979323846264338327950288419716939937510'
|
'3.14159265358979323846264338327950288419716939937510'
|
||||||
>>> calculate_pi(80)
|
>>> calculate_pi(80)
|
||||||
'3.14159265358979323846264338327950288419716939937510582097494459230781640628620899'
|
'3.14159265358979323846264338327950288419716939937510582097494459230781640628620899'
|
||||||
|
|
||||||
To apply the Leibniz formula for calculating pi,
|
|
||||||
the variables q, r, t, k, n, and l are used for the iteration process.
|
|
||||||
"""
|
"""
|
||||||
|
# Variables used for the iteration process
|
||||||
q = 1
|
q = 1
|
||||||
r = 0
|
r = 0
|
||||||
t = 1
|
t = 1
|
||||||
k = 1
|
k = 1
|
||||||
n = 3
|
n = 3
|
||||||
l = 3
|
l = 3
|
||||||
|
|
||||||
decimal = limit
|
decimal = limit
|
||||||
counter = 0
|
counter = 0
|
||||||
|
|
||||||
result = ""
|
result = ""
|
||||||
|
|
||||||
"""
|
# We can't compare against anything if we make a generator,
|
||||||
We will avoid using yield since we otherwise get a Generator-Object,
|
# so we'll stick with plain return logic
|
||||||
which we can't just compare against anything. We would have to make a list out of it
|
|
||||||
after the generation, so we will just stick to plain return logic:
|
|
||||||
"""
|
|
||||||
while counter != decimal + 1:
|
while counter != decimal + 1:
|
||||||
if 4 * q + r - t < n * t:
|
if 4 * q + r - t < n * t:
|
||||||
result += str(n)
|
result += str(n)
|
||||||
|
|
|
@ -3,7 +3,7 @@ from math import pi
|
||||||
|
|
||||||
def radians(degree: float) -> float:
|
def radians(degree: float) -> float:
|
||||||
"""
|
"""
|
||||||
Coverts the given angle from degrees to radians
|
Converts the given angle from degrees to radians
|
||||||
https://en.wikipedia.org/wiki/Radian
|
https://en.wikipedia.org/wiki/Radian
|
||||||
|
|
||||||
>>> radians(180)
|
>>> radians(180)
|
||||||
|
@ -16,7 +16,7 @@ def radians(degree: float) -> float:
|
||||||
1.9167205845401725
|
1.9167205845401725
|
||||||
|
|
||||||
>>> from math import radians as math_radians
|
>>> from math import radians as math_radians
|
||||||
>>> all(abs(radians(i)-math_radians(i)) <= 0.00000001 for i in range(-2, 361))
|
>>> all(abs(radians(i) - math_radians(i)) <= 1e-8 for i in range(-2, 361))
|
||||||
True
|
True
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
@ -19,14 +19,13 @@ def get_initial_point(a: float) -> float:
|
||||||
|
|
||||||
|
|
||||||
def square_root_iterative(
|
def square_root_iterative(
|
||||||
a: float, max_iter: int = 9999, tolerance: float = 0.00000000000001
|
a: float, max_iter: int = 9999, tolerance: float = 1e-14
|
||||||
) -> float:
|
) -> float:
|
||||||
"""
|
"""
|
||||||
Square root is aproximated using Newtons method.
|
Square root approximated using Newton's method.
|
||||||
https://en.wikipedia.org/wiki/Newton%27s_method
|
https://en.wikipedia.org/wiki/Newton%27s_method
|
||||||
|
|
||||||
>>> all(abs(square_root_iterative(i)-math.sqrt(i)) <= .00000000000001
|
>>> all(abs(square_root_iterative(i) - math.sqrt(i)) <= 1e-14 for i in range(500))
|
||||||
... for i in range(500))
|
|
||||||
True
|
True
|
||||||
|
|
||||||
>>> square_root_iterative(-1)
|
>>> square_root_iterative(-1)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
- - - - - -- - - - - - - - - - - - - - - - - - - - - - -
|
- - - - - -- - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Name - - CNN - Convolution Neural Network For Photo Recognizing
|
Name - - CNN - Convolution Neural Network For Photo Recognizing
|
||||||
Goal - - Recognize Handing Writing Word Photo
|
Goal - - Recognize Handing Writing Word Photo
|
||||||
Detail:Total 5 layers neural network
|
Detail: Total 5 layers neural network
|
||||||
* Convolution layer
|
* Convolution layer
|
||||||
* Pooling layer
|
* Pooling layer
|
||||||
* Input layer layer of BP
|
* Input layer layer of BP
|
||||||
|
@ -24,7 +24,7 @@ class CNN:
|
||||||
self, conv1_get, size_p1, bp_num1, bp_num2, bp_num3, rate_w=0.2, rate_t=0.2
|
self, conv1_get, size_p1, bp_num1, bp_num2, bp_num3, rate_w=0.2, rate_t=0.2
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
:param conv1_get: [a,c,d],size, number, step of convolution kernel
|
:param conv1_get: [a,c,d], size, number, step of convolution kernel
|
||||||
:param size_p1: pooling size
|
:param size_p1: pooling size
|
||||||
:param bp_num1: units number of flatten layer
|
:param bp_num1: units number of flatten layer
|
||||||
:param bp_num2: units number of hidden layer
|
:param bp_num2: units number of hidden layer
|
||||||
|
@ -71,7 +71,7 @@ class CNN:
|
||||||
with open(save_path, "wb") as f:
|
with open(save_path, "wb") as f:
|
||||||
pickle.dump(model_dic, f)
|
pickle.dump(model_dic, f)
|
||||||
|
|
||||||
print(f"Model saved: {save_path}")
|
print(f"Model saved: {save_path}")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def read_model(cls, model_path):
|
def read_model(cls, model_path):
|
||||||
|
@ -210,7 +210,7 @@ class CNN:
|
||||||
def train(
|
def train(
|
||||||
self, patterns, datas_train, datas_teach, n_repeat, error_accuracy, draw_e=bool
|
self, patterns, datas_train, datas_teach, n_repeat, error_accuracy, draw_e=bool
|
||||||
):
|
):
|
||||||
# model traning
|
# model training
|
||||||
print("----------------------Start Training-------------------------")
|
print("----------------------Start Training-------------------------")
|
||||||
print((" - - Shape: Train_Data ", np.shape(datas_train)))
|
print((" - - Shape: Train_Data ", np.shape(datas_train)))
|
||||||
print((" - - Shape: Teach_Data ", np.shape(datas_teach)))
|
print((" - - Shape: Teach_Data ", np.shape(datas_teach)))
|
||||||
|
|
|
@ -158,7 +158,7 @@ if __name__ == "__main__":
|
||||||
# G_b2 = np.random.normal(size=(784),scale=(1. / np.sqrt(784 / 2.))) *0.002
|
# G_b2 = np.random.normal(size=(784),scale=(1. / np.sqrt(784 / 2.))) *0.002
|
||||||
G_b7 = np.zeros(784)
|
G_b7 = np.zeros(784)
|
||||||
|
|
||||||
# 3. For Adam Optimzier
|
# 3. For Adam Optimizer
|
||||||
v1, m1 = 0, 0
|
v1, m1 = 0, 0
|
||||||
v2, m2 = 0, 0
|
v2, m2 = 0, 0
|
||||||
v3, m3 = 0, 0
|
v3, m3 = 0, 0
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
"""
|
"""
|
||||||
This is a pure Python implementation of the merge-insertion sort algorithm
|
This is a pure Python implementation of the Graham scan algorithm
|
||||||
Source: https://en.wikipedia.org/wiki/Graham_scan
|
Source: https://en.wikipedia.org/wiki/Graham_scan
|
||||||
|
|
||||||
For doctests run following command:
|
For doctests run following command:
|
||||||
|
@ -142,8 +142,8 @@ def graham_scan(points: list[tuple[int, int]]) -> list[tuple[int, int]]:
|
||||||
stack.append(sorted_points[0])
|
stack.append(sorted_points[0])
|
||||||
stack.append(sorted_points[1])
|
stack.append(sorted_points[1])
|
||||||
stack.append(sorted_points[2])
|
stack.append(sorted_points[2])
|
||||||
# In any ways, the first 3 points line are towards left.
|
# The first 3 points lines are towards the left because we sort them by their angle
|
||||||
# Because we sort them the angle from minx, miny.
|
# from minx, miny.
|
||||||
current_direction = Direction.left
|
current_direction = Direction.left
|
||||||
|
|
||||||
for i in range(3, len(sorted_points)):
|
for i in range(3, len(sorted_points)):
|
||||||
|
@ -164,7 +164,7 @@ def graham_scan(points: list[tuple[int, int]]) -> list[tuple[int, int]]:
|
||||||
break
|
break
|
||||||
elif current_direction == Direction.right:
|
elif current_direction == Direction.right:
|
||||||
# If the straight line is towards right,
|
# If the straight line is towards right,
|
||||||
# every previous points on those straigh line is not convex hull.
|
# every previous points on that straight line is not convex hull.
|
||||||
stack.pop()
|
stack.pop()
|
||||||
if next_direction == Direction.right:
|
if next_direction == Direction.right:
|
||||||
stack.pop()
|
stack.pop()
|
||||||
|
|
|
@ -8,9 +8,9 @@ class LinearCongruentialGenerator:
|
||||||
A pseudorandom number generator.
|
A pseudorandom number generator.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# The default value for **seed** is the result of a function call which is not
|
# The default value for **seed** is the result of a function call, which is not
|
||||||
# normally recommended and causes ruff to raise a B008 error. However, in this case,
|
# normally recommended and causes ruff to raise a B008 error. However, in this case,
|
||||||
# it is accptable because `LinearCongruentialGenerator.__init__()` will only be
|
# it is acceptable because `LinearCongruentialGenerator.__init__()` will only be
|
||||||
# called once per instance and it ensures that each instance will generate a unique
|
# called once per instance and it ensures that each instance will generate a unique
|
||||||
# sequence of numbers.
|
# sequence of numbers.
|
||||||
|
|
||||||
|
|
|
@ -63,11 +63,12 @@ def random_characters(chars_incl, i):
|
||||||
pass # Put your code here...
|
pass # Put your code here...
|
||||||
|
|
||||||
|
|
||||||
# This Will Check Whether A Given Password Is Strong Or Not
|
|
||||||
# It Follows The Rule that Length Of Password Should Be At Least 8 Characters
|
|
||||||
# And At Least 1 Lower, 1 Upper, 1 Number And 1 Special Character
|
|
||||||
def is_strong_password(password: str, min_length: int = 8) -> bool:
|
def is_strong_password(password: str, min_length: int = 8) -> bool:
|
||||||
"""
|
"""
|
||||||
|
This will check whether a given password is strong or not. The password must be at
|
||||||
|
least as long as the provided minimum length, and it must contain at least 1
|
||||||
|
lowercase letter, 1 uppercase letter, 1 number and 1 special character.
|
||||||
|
|
||||||
>>> is_strong_password('Hwea7$2!')
|
>>> is_strong_password('Hwea7$2!')
|
||||||
True
|
True
|
||||||
>>> is_strong_password('Sh0r1')
|
>>> is_strong_password('Sh0r1')
|
||||||
|
@ -81,7 +82,6 @@ def is_strong_password(password: str, min_length: int = 8) -> bool:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if len(password) < min_length:
|
if len(password) < min_length:
|
||||||
# Your Password must be at least 8 characters long
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
upper = any(char in ascii_uppercase for char in password)
|
upper = any(char in ascii_uppercase for char in password)
|
||||||
|
@ -90,8 +90,6 @@ def is_strong_password(password: str, min_length: int = 8) -> bool:
|
||||||
spec_char = any(char in punctuation for char in password)
|
spec_char = any(char in punctuation for char in password)
|
||||||
|
|
||||||
return upper and lower and num and spec_char
|
return upper and lower and num and spec_char
|
||||||
# Passwords should contain UPPERCASE, lowerase
|
|
||||||
# numbers, and special characters
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
@ -104,7 +102,7 @@ def main():
|
||||||
"Alternative Password generated:",
|
"Alternative Password generated:",
|
||||||
alternative_password_generator(chars_incl, length),
|
alternative_password_generator(chars_incl, length),
|
||||||
)
|
)
|
||||||
print("[If you are thinking of using this passsword, You better save it.]")
|
print("[If you are thinking of using this password, You better save it.]")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -2,39 +2,35 @@
|
||||||
Title : Calculating the speed of sound
|
Title : Calculating the speed of sound
|
||||||
|
|
||||||
Description :
|
Description :
|
||||||
The speed of sound (c) is the speed that a sound wave travels
|
The speed of sound (c) is the speed that a sound wave travels per unit time (m/s).
|
||||||
per unit time (m/s). During propagation, the sound wave propagates
|
During propagation, the sound wave propagates through an elastic medium.
|
||||||
through an elastic medium. Its SI unit is meter per second (m/s).
|
|
||||||
|
|
||||||
Only longitudinal waves can propagate in liquids and gas other then
|
Sound propagates as longitudinal waves in liquids and gases and as transverse waves
|
||||||
solid where they also travel in transverse wave. The following Algo-
|
in solids. This file calculates the speed of sound in a fluid based on its bulk
|
||||||
rithem calculates the speed of sound in fluid depanding on the bulk
|
module and density.
|
||||||
module and the density of the fluid.
|
|
||||||
|
|
||||||
Equation for calculating speed od sound in fluid:
|
Equation for the speed of sound in a fluid:
|
||||||
c_fluid = (K_s*p)**0.5
|
c_fluid = sqrt(K_s / p)
|
||||||
|
|
||||||
c_fluid: speed of sound in fluid
|
c_fluid: speed of sound in fluid
|
||||||
K_s: isentropic bulk modulus
|
K_s: isentropic bulk modulus
|
||||||
p: density of fluid
|
p: density of fluid
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Source : https://en.wikipedia.org/wiki/Speed_of_sound
|
Source : https://en.wikipedia.org/wiki/Speed_of_sound
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def speed_of_sound_in_a_fluid(density: float, bulk_modulus: float) -> float:
|
def speed_of_sound_in_a_fluid(density: float, bulk_modulus: float) -> float:
|
||||||
"""
|
"""
|
||||||
This method calculates the speed of sound in fluid -
|
Calculates the speed of sound in a fluid from its density and bulk modulus
|
||||||
This is calculated from the other two provided values
|
|
||||||
Examples:
|
|
||||||
Example 1 --> Water 20°C: bulk_moduls= 2.15MPa, density=998kg/m³
|
|
||||||
Example 2 --> Murcery 20°: bulk_moduls= 28.5MPa, density=13600kg/m³
|
|
||||||
|
|
||||||
>>> speed_of_sound_in_a_fluid(bulk_modulus=2.15*10**9, density=998)
|
Examples:
|
||||||
|
Example 1 --> Water 20°C: bulk_modulus= 2.15MPa, density=998kg/m³
|
||||||
|
Example 2 --> Mercury 20°C: bulk_modulus= 28.5MPa, density=13600kg/m³
|
||||||
|
|
||||||
|
>>> speed_of_sound_in_a_fluid(bulk_modulus=2.15e9, density=998)
|
||||||
1467.7563207952705
|
1467.7563207952705
|
||||||
>>> speed_of_sound_in_a_fluid(bulk_modulus=28.5*10**9, density=13600)
|
>>> speed_of_sound_in_a_fluid(bulk_modulus=28.5e9, density=13600)
|
||||||
1447.614670861731
|
1447.614670861731
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
@ -11,18 +11,18 @@ There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73
|
||||||
How many circular primes are there below one million?
|
How many circular primes are there below one million?
|
||||||
|
|
||||||
To solve this problem in an efficient manner, we will first mark all the primes
|
To solve this problem in an efficient manner, we will first mark all the primes
|
||||||
below 1 million using the Seive of Eratosthenes. Then, out of all these primes,
|
below 1 million using the Sieve of Eratosthenes. Then, out of all these primes,
|
||||||
we will rule out the numbers which contain an even digit. After this we will
|
we will rule out the numbers which contain an even digit. After this we will
|
||||||
generate each circular combination of the number and check if all are prime.
|
generate each circular combination of the number and check if all are prime.
|
||||||
"""
|
"""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
seive = [True] * 1000001
|
sieve = [True] * 1000001
|
||||||
i = 2
|
i = 2
|
||||||
while i * i <= 1000000:
|
while i * i <= 1000000:
|
||||||
if seive[i]:
|
if sieve[i]:
|
||||||
for j in range(i * i, 1000001, i):
|
for j in range(i * i, 1000001, i):
|
||||||
seive[j] = False
|
sieve[j] = False
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ def is_prime(n: int) -> bool:
|
||||||
>>> is_prime(25363)
|
>>> is_prime(25363)
|
||||||
False
|
False
|
||||||
"""
|
"""
|
||||||
return seive[n]
|
return sieve[n]
|
||||||
|
|
||||||
|
|
||||||
def contains_an_even_digit(n: int) -> bool:
|
def contains_an_even_digit(n: int) -> bool:
|
||||||
|
|
|
@ -1,28 +1,22 @@
|
||||||
"""
|
"""
|
||||||
Project Euler Problem 135: https://projecteuler.net/problem=135
|
Project Euler Problem 135: https://projecteuler.net/problem=135
|
||||||
|
|
||||||
Given the positive integers, x, y, and z,
|
Given the positive integers, x, y, and z, are consecutive terms of an arithmetic
|
||||||
are consecutive terms of an arithmetic progression,
|
progression, the least value of the positive integer, n, for which the equation,
|
||||||
the least value of the positive integer, n,
|
|
||||||
for which the equation,
|
|
||||||
x2 − y2 − z2 = n, has exactly two solutions is n = 27:
|
x2 − y2 − z2 = n, has exactly two solutions is n = 27:
|
||||||
|
|
||||||
342 − 272 − 202 = 122 − 92 − 62 = 27
|
342 − 272 − 202 = 122 − 92 − 62 = 27
|
||||||
|
|
||||||
It turns out that n = 1155 is the least value
|
It turns out that n = 1155 is the least value which has exactly ten solutions.
|
||||||
which has exactly ten solutions.
|
|
||||||
|
|
||||||
How many values of n less than one million
|
How many values of n less than one million have exactly ten distinct solutions?
|
||||||
have exactly ten distinct solutions?
|
|
||||||
|
|
||||||
|
|
||||||
Taking x,y,z of the form a+d,a,a-d respectively,
|
Taking x, y, z of the form a + d, a, a - d respectively, the given equation reduces to
|
||||||
the given equation reduces to a*(4d-a)=n.
|
a * (4d - a) = n.
|
||||||
Calculating no of solutions for every n till 1 million by fixing a
|
Calculating no of solutions for every n till 1 million by fixing a, and n must be a
|
||||||
,and n must be multiple of a.
|
multiple of a. Total no of steps = n * (1/1 + 1/2 + 1/3 + 1/4 + ... + 1/n), so roughly
|
||||||
Total no of steps=n*(1/1+1/2+1/3+1/4..+1/n)
|
O(nlogn) time complexity.
|
||||||
,so roughly O(nlogn) time complexity.
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,15 +36,15 @@ def solution(limit: int = 1000000) -> int:
|
||||||
for first_term in range(1, limit):
|
for first_term in range(1, limit):
|
||||||
for n in range(first_term, limit, first_term):
|
for n in range(first_term, limit, first_term):
|
||||||
common_difference = first_term + n / first_term
|
common_difference = first_term + n / first_term
|
||||||
if common_difference % 4: # d must be divisble by 4
|
if common_difference % 4: # d must be divisible by 4
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
common_difference /= 4
|
common_difference /= 4
|
||||||
if (
|
if (
|
||||||
first_term > common_difference
|
first_term > common_difference
|
||||||
and first_term < 4 * common_difference
|
and first_term < 4 * common_difference
|
||||||
): # since x,y,z are positive integers
|
): # since x, y, z are positive integers
|
||||||
frequency[n] += 1 # so z>0 and a>d ,also 4d<a
|
frequency[n] += 1 # so z > 0, a > d and 4d < a
|
||||||
|
|
||||||
count = sum(1 for x in frequency[1:limit] if x == 10)
|
count = sum(1 for x in frequency[1:limit] if x == 10)
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ Give your answer with nine digits after the decimal point (a.bcdefghij).
|
||||||
|
|
||||||
This combinatorial problem can be solved by decomposing the problem into the
|
This combinatorial problem can be solved by decomposing the problem into the
|
||||||
following steps:
|
following steps:
|
||||||
1. Calculate the total number of possible picking cominations
|
1. Calculate the total number of possible picking combinations
|
||||||
[combinations := binom_coeff(70, 20)]
|
[combinations := binom_coeff(70, 20)]
|
||||||
2. Calculate the number of combinations with one colour missing
|
2. Calculate the number of combinations with one colour missing
|
||||||
[missing := binom_coeff(60, 20)]
|
[missing := binom_coeff(60, 20)]
|
||||||
|
|
|
@ -130,5 +130,5 @@ omit = [".env/*"]
|
||||||
sort = "Cover"
|
sort = "Cover"
|
||||||
|
|
||||||
[tool.codespell]
|
[tool.codespell]
|
||||||
ignore-words-list = "3rt,ans,crate,damon,fo,followings,hist,iff,kwanza,mater,secant,som,sur,tim,zar"
|
ignore-words-list = "3rt,ans,crate,damon,fo,followings,hist,iff,kwanza,manuel,mater,secant,som,sur,tim,zar"
|
||||||
skip = "./.*,*.json,ciphers/prehistoric_men.txt,project_euler/problem_022/p022_names.txt,pyproject.toml,strings/dictionary.txt,strings/words.txt"
|
skip = "./.*,*.json,ciphers/prehistoric_men.txt,project_euler/problem_022/p022_names.txt,pyproject.toml,strings/dictionary.txt,strings/words.txt"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user