Skip to content

Commit 6fa940a

Browse files
committed
feat: Add initial set of logic building problems
1 parent c79034c commit 6fa940a

File tree

5 files changed

+216
-0
lines changed

5 files changed

+216
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""
2+
The Collatz Conjecture (3n + 1 Problem)
3+
https://en.wikipedia.org/wiki/Collatz_conjecture
4+
"""
5+
6+
7+
def collatz_sequence(start_number: int) -> list[int]:
8+
"""
9+
Generates the Collatz sequence for a given starting number.
10+
>>> collatz_sequence(6)
11+
[6, 3, 10, 5, 16, 8, 4, 2, 1]
12+
>>> collatz_sequence(1)
13+
[1]
14+
"""
15+
if start_number <= 0:
16+
return []
17+
18+
number = start_number
19+
sequence = [number]
20+
while number != 1:
21+
if number % 2 == 0:
22+
number = number // 2
23+
else:
24+
number = 3 * number + 1
25+
sequence.append(number)
26+
return sequence
27+
28+
29+
if __name__ == "__main__":
30+
import doctest
31+
32+
doctest.testmod()
33+
try:
34+
num = int(input("Enter a positive integer to start the Collatz sequence: "))
35+
if num > 0:
36+
print(f"Sequence: {collatz_sequence(num)}")
37+
else:
38+
print("Please enter a positive integer.")
39+
except ValueError:
40+
print("Invalid input. Please enter an integer.")

logic_building_problems/hangman.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
"""
2+
A classic word-guessing game: Hangman.
3+
The computer picks a secret word, and the player tries to guess it letter by letter.
4+
"""
5+
6+
import random
7+
8+
9+
def play_hangman() -> None:
10+
"""
11+
Starts an interactive session of Hangman.
12+
This function is interactive and does not have a testable return value.
13+
"""
14+
words = ["python", "github", "algorithm", "developer", "computer"]
15+
secret_word = random.choice(words)
16+
guessed_letters = set()
17+
incorrect_guesses = 0
18+
max_attempts = 6
19+
20+
print("Welcome to Hangman!")
21+
22+
while incorrect_guesses < max_attempts:
23+
# Display the current state of the word
24+
display_word = "".join(
25+
letter if letter in guessed_letters else "_" for letter in secret_word
26+
)
27+
print(f"\nWord: {display_word}")
28+
print(f"Incorrect guesses left: {max_attempts - incorrect_guesses}")
29+
30+
if display_word == secret_word:
31+
print(f"Congratulations! You guessed the word: {secret_word}")
32+
return
33+
34+
guess = input("Guess a letter: ").lower()
35+
36+
if len(guess) != 1 or not guess.isalpha():
37+
print("Please enter a single letter.")
38+
continue
39+
40+
if guess in guessed_letters:
41+
print("You already guessed that letter.")
42+
elif guess in secret_word:
43+
print("Good guess!")
44+
guessed_letters.add(guess)
45+
else:
46+
print("Sorry, that letter is not in the word.")
47+
incorrect_guesses += 1
48+
guessed_letters.add(guess)
49+
50+
print(f"\nGame over! The word was: {secret_word}")
51+
52+
53+
if __name__ == "__main__":
54+
play_hangman()
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"""
2+
Kaprekar's Constant (6174)
3+
https://en.wikipedia.org/wiki/6174_(number)
4+
"""
5+
6+
KAPREKARS_CONSTANT = 6174
7+
8+
9+
def kaprekar_routine(four_digit_number: int) -> list[int]:
10+
"""
11+
Performs the Kaprekar routine and returns the sequence of numbers.
12+
>>> kaprekar_routine(3524)
13+
[3524, 3087, 8352, 6174]
14+
"""
15+
if not 1000 <= four_digit_number <= 9999:
16+
raise ValueError("Input must be a four-digit number.")
17+
if len(set(str(four_digit_number).zfill(4))) < 2:
18+
raise ValueError("Input must have at least two different digits.")
19+
20+
number = four_digit_number
21+
sequence = [number]
22+
while number != KAPREKARS_CONSTANT:
23+
s_num = str(number).zfill(4)
24+
desc_str = "".join(sorted(s_num, reverse=True))
25+
asc_str = "".join(sorted(s_num))
26+
number = int(desc_str) - int(asc_str)
27+
sequence.append(number)
28+
return sequence
29+
30+
31+
if __name__ == "__main__":
32+
import doctest
33+
34+
doctest.testmod()
35+
try:
36+
num = int(
37+
input("Enter a 4-digit number (with at least two different digits): ")
38+
)
39+
result_sequence = kaprekar_routine(num)
40+
print(f"Sequence: {' -> '.join(map(str, result_sequence))}")
41+
except ValueError as e:
42+
print(f"Error: {e}")
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"""
2+
A simple number guessing game.
3+
The program generates a random number and the user has to guess it.
4+
"""
5+
6+
import random
7+
8+
9+
def guessing_game(low: int, high: int) -> None:
10+
"""
11+
Starts an interactive number guessing game.
12+
This function is interactive and does not have a return value for doctests.
13+
"""
14+
secret_number = random.randint(low, high)
15+
attempts = 0
16+
print(f"I'm thinking of a number between {low} and {high}. Can you guess it?")
17+
18+
while True:
19+
try:
20+
guess = int(input("Enter your guess: "))
21+
attempts += 1
22+
if guess < secret_number:
23+
print("Too low! Try again.")
24+
elif guess > secret_number:
25+
print("Too high! Try again.")
26+
else:
27+
print(f"Congratulations! You guessed it in {attempts} attempts.")
28+
break
29+
except ValueError:
30+
print("Invalid input. Please enter an integer.")
31+
32+
33+
if __name__ == "__main__":
34+
guessing_game(1, 100)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"""
2+
A simple, interactive Rock, Paper, Scissors game.
3+
The user plays against the computer, which makes a random choice.
4+
"""
5+
6+
import random
7+
8+
9+
def play_rock_paper_scissors() -> None:
10+
"""
11+
Starts an interactive session of Rock, Paper, Scissors.
12+
This function is interactive and does not have a testable return value.
13+
"""
14+
options = ["rock", "paper", "scissors"]
15+
16+
while True:
17+
user_choice = input(
18+
"Choose rock, paper, or scissors (or 'quit' to exit): "
19+
).lower()
20+
21+
if user_choice == "quit":
22+
print("Thanks for playing!")
23+
break
24+
25+
if user_choice not in options:
26+
print("Invalid choice. Please try again.")
27+
continue
28+
29+
computer_choice = random.choice(options)
30+
print(f"Computer chose: {computer_choice}")
31+
32+
if user_choice == computer_choice:
33+
print("It's a tie!")
34+
elif (
35+
(user_choice == "rock" and computer_choice == "scissors")
36+
or (user_choice == "scissors" and computer_choice == "paper")
37+
or (user_choice == "paper" and computer_choice == "rock")
38+
):
39+
print("You win!")
40+
else:
41+
print("You lose!")
42+
print("-" * 20)
43+
44+
45+
if __name__ == "__main__":
46+
play_rock_paper_scissors()

0 commit comments

Comments
 (0)