Skip to content

horizontal motion code physics #4710

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 30 commits into from
Apr 4, 2022
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
a565258
Add files via upload
avivfaraj Sep 3, 2021
4951686
Changed print to f-string
avivfaraj Sep 4, 2021
ff2a162
Add files via upload
avivfaraj Sep 4, 2021
6550183
Fixes: #4710 provided return type
avivfaraj Sep 4, 2021
552546f
File exists in another pull request
avivfaraj Sep 4, 2021
bc31e3f
imported radians from math
avivfaraj Sep 5, 2021
974e0a6
Updated file according to pre-commit test
avivfaraj Sep 6, 2021
1d4fc81
Updated file
avivfaraj Sep 6, 2021
7bd84b4
Updated gamma
avivfaraj Sep 6, 2021
2841c11
Deleted duplicate file
avivfaraj Sep 6, 2021
cea2deb
removed pi
avivfaraj Sep 6, 2021
db7db3b
reversed tests
avivfaraj Sep 7, 2021
132e495
Fixed angle condition
avivfaraj Sep 7, 2021
c0e5071
Modified prints to f-string
avivfaraj Sep 7, 2021
894fa7f
Update horizontal_projectile_motion.py
avivfaraj Sep 7, 2021
ee49ce7
Merge branch 'TheAlgorithms:master' into master
avivfaraj Sep 7, 2021
07646ac
Update horizontal_projectile_motion.py
avivfaraj Sep 7, 2021
4e2fcaf
Fixes #4710 added exceptions and tests
avivfaraj Sep 7, 2021
dcacc95
Added float tests
avivfaraj Sep 7, 2021
3f2b238
Fixed type annotations
avivfaraj Sep 14, 2021
e3678fd
Fixed last annotation
avivfaraj Sep 14, 2021
c37bb95
Fixed annotations
avivfaraj Sep 14, 2021
5b0249a
fixed format
avivfaraj Sep 14, 2021
ec790c6
Revert "fixed format"
avivfaraj Sep 14, 2021
e865929
Revert "Fixed annotations"
avivfaraj Sep 14, 2021
82b4e0d
Revert "Fixed last annotation"
avivfaraj Sep 14, 2021
63c7c6a
Revert "Fixed type annotations"
avivfaraj Sep 14, 2021
0527866
Merge branch 'TheAlgorithms:master' into master
avivfaraj Apr 4, 2022
805050e
Revert to 4e2fcaf6fb
avivfaraj Apr 4, 2022
5f3486c
Fixing errors found during pre-commit
avivfaraj Apr 4, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions ciphers/a1z26.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,18 @@
"""


def encode(plain: str) -> list[int]:
from typing import List


def encode(plain: str) -> List[int]:
"""
>>> encode("myname")
[13, 25, 14, 1, 13, 5]
"""
return [ord(elem) - 96 for elem in plain]


def decode(encoded: list[int]) -> str:
def decode(encoded: List[int]) -> str:
"""
>>> decode([13, 25, 14, 1, 13, 5])
'myname'
Expand Down
9 changes: 5 additions & 4 deletions ciphers/enigma_machine2.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@

Created by TrapinchO
"""
from typing import Dict, Tuple

RotorPositionT = tuple[int, int, int]
RotorSelectionT = tuple[str, str, str]
RotorPositionT = Tuple[int, int, int]
RotorSelectionT = Tuple[str, str, str]


# used alphabet --------------------------
Expand Down Expand Up @@ -69,7 +70,7 @@

def _validator(
rotpos: RotorPositionT, rotsel: RotorSelectionT, pb: str
) -> tuple[RotorPositionT, RotorSelectionT, dict[str, str]]:
) -> Tuple[RotorPositionT, RotorSelectionT, Dict[str, str]]:
"""
Checks if the values can be used for the 'enigma' function

Expand Down Expand Up @@ -110,7 +111,7 @@ def _validator(
return rotpos, rotsel, pbdict


def _plugboard(pbstring: str) -> dict[str, str]:
def _plugboard(pbstring: str) -> Dict[str, str]:
"""
https://en.wikipedia.org/wiki/Enigma_machine#Plugboard

Expand Down
11 changes: 7 additions & 4 deletions ciphers/trafid_cipher.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
# https://en.wikipedia.org/wiki/Trifid_cipher


def __encryptPart(messagePart: str, character2Number: dict[str, str]) -> str:
from typing import Dict, Tuple


def __encryptPart(messagePart: str, character2Number: Dict[str, str]) -> str:
one, two, three = "", "", ""
tmp = []

Expand All @@ -17,8 +20,8 @@ def __encryptPart(messagePart: str, character2Number: dict[str, str]) -> str:


def __decryptPart(
messagePart: str, character2Number: dict[str, str]
) -> tuple[str, str, str]:
messagePart: str, character2Number: Dict[str, str]
) -> Tuple[str, str, str]:
tmp, thisPart = "", ""
result = []

Expand All @@ -36,7 +39,7 @@ def __decryptPart(

def __prepare(
message: str, alphabet: str
) -> tuple[str, str, dict[str, str], dict[str, str]]:
) -> Tuple[str, str, Dict[str, str], Dict[str, str]]:
# Validate message and alphabet, set to upper and remove spaces
alphabet = alphabet.replace(" ", "").upper()
message = message.replace(" ", "").upper()
Expand Down
7 changes: 5 additions & 2 deletions ciphers/xor_cipher.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
"""


from typing import List


class XORCipher:
def __init__(self, key: int = 0):
"""
Expand All @@ -28,7 +31,7 @@ def __init__(self, key: int = 0):
# private field
self.__key = key

def encrypt(self, content: str, key: int) -> list[str]:
def encrypt(self, content: str, key: int) -> List[str]:
"""
input: 'content' of type string and 'key' of type int
output: encrypted string 'content' as a list of chars
Expand All @@ -53,7 +56,7 @@ def encrypt(self, content: str, key: int) -> list[str]:

return ans

def decrypt(self, content: str, key: int) -> list[str]:
def decrypt(self, content: str, key: int) -> List[str]:
"""
input: 'content' of type list and 'key' of type int
output: decrypted string 'content' as a list of chars
Expand Down
168 changes: 168 additions & 0 deletions physics/horizontal_projectile_motion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
"""
Horizontal Projectile Motion problem in physics.
This algorithm solves a specific problem in which
the motion starts from the ground as can be seen below:
(v = 0)
**
* *
* *
* *
* *
* *
GROUND GROUND

For more info: https://en.wikipedia.org/wiki/Projectile_motion
"""

# Importing packages
from math import radians as angle_to_radians
from math import sin

# Acceleration Constant on hearth (unit m/s^2)
g = 9.80665


def check_args(init_velocity: float, angle: float) -> None:
"""
Check that the arguments are valid
"""

# Ensure valid instance
if not isinstance(init_velocity, (int, float)):
raise TypeError("Invalid velocity. Should be a positive number.")

if not isinstance(angle, (int, float)):
raise TypeError("Invalid angle. Range is 1-90 degrees.")

# Ensure valid angle
if angle > 90 or angle < 1:
raise ValueError("Invalid angle. Range is 1-90 degrees.")

# Ensure valid velocity
if init_velocity < 0:
raise ValueError("Invalid velocity. Should be a positive number.")


def horizontal_distance(init_velocity: float, angle: float) -> float:
"""
Returns the horizontal distance that the object cover

Formula:
v_0^2 * sin(2 * alpha)
---------------------
g

v_0 - initial velocity
alpha - angle

>>> horizontal_distance(30, 45)
91.77
>>> horizontal_distance(100, 78)
414.76
>>> horizontal_distance(4.5, 5.5)
0.39
>>> horizontal_distance(-1, 20)
Traceback (most recent call last):
...
ValueError: Invalid velocity. Should be a positive number.
>>> horizontal_distance(30, -20)
Traceback (most recent call last):
...
ValueError: Invalid angle. Range is 1-90 degrees.
"""
check_args(init_velocity, angle)
radians = angle_to_radians(2 * angle)
return round(init_velocity ** 2 * sin(radians) / g, 2)


def max_height(init_velocity: float, angle: float) -> float:
"""
Returns the maximum height that the object reach

Formula:
v_0^2 * sin^2(alpha)
--------------------
2g

v_0 - initial velocity
alpha - angle

>>> max_height(30, 45)
22.94
>>> max_height(100, 78)
487.82
>>> max_height(4.5, 5.5)
0.01
>>> max_height("a", 20)
Traceback (most recent call last):
...
TypeError: Invalid velocity. Should be a positive number.
>>> horizontal_distance(30, "b")
Traceback (most recent call last):
...
TypeError: Invalid angle. Range is 1-90 degrees.
"""
check_args(init_velocity, angle)
radians = angle_to_radians(angle)
return round(init_velocity ** 2 * sin(radians) ** 2 / (2 * g), 2)


def total_time(init_velocity: float, angle: float) -> float:
"""
Returns total time of the motion

Formula:
2 * v_0 * sin(alpha)
--------------------
g

v_0 - initial velocity
alpha - angle

>>> total_time(30, 45)
4.33
>>> total_time(100, 78)
19.95
>>> total_time(4.5, 5.5)
0.09
>>> total_time(-10, 40)
Traceback (most recent call last):
...
ValueError: Invalid velocity. Should be a positive number.
>>> total_time(30, "b")
Traceback (most recent call last):
...
TypeError: Invalid angle. Range is 1-90 degrees.
"""
check_args(init_velocity, angle)
radians = angle_to_radians(angle)
return round(2 * init_velocity * sin(radians) / g, 2)


def test_motion() -> None:
"""
>>> test_motion()
"""
v0, angle = 25, 20
assert horizontal_distance(v0, angle) == 40.97
assert max_height(v0, angle) == 3.73
assert total_time(v0, angle) == 1.74


if __name__ == "__main__":
from doctest import testmod

testmod()

# Get input from user
init_vel = float(input("Initial Velocity: ").strip())

# Get input from user
angle = float(input("angle: ").strip())

# Print results
print()
print("Results: ")
print(f"Horizontal Distance: {str(horizontal_distance(init_vel, angle))} [m]")
print(f"Maximum Height: {str(max_height(init_vel, angle))} [m]")
print(f"Total Time: {str(total_time(init_vel, angle))} [s]")