Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
22 changes: 22 additions & 0 deletions dsa/d1/exercise_4.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
def main():
nums = [2, 7, 11, 15, 3, 4, 8, 1]
target = 11

print(two_sum(nums, target))

def two_sum(nums, target):
# value, index
num_map = {}
seen = set()
for i in range(len(nums)):
required_num = target - nums[i]

if required_num in num_map:
#return [nums[i], required_num]
seen.add((min(nums[i], required_num), max( nums[i], required_num)))
num_map[nums[i]] = i
#return None
return sorted(seen)

if __name__ == "__main__":
main()
21 changes: 21 additions & 0 deletions dsa/d2/exercise_4.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
def main():
s = "xyzxy"
print(longest_substring(s))

def longest_substring(s):
best_start=0
max_length=0
left = 0
seen = set()
for right in range(len(s)):
while s[right] in seen:
seen.remove(s[left])
left+=1
seen.add(s[right])
if right - left +1 >max_length:
max_length=right-left+1
best_start=left
return s[best_start:best_start+max_length]

if __name__ == "__main__":
main()
21 changes: 21 additions & 0 deletions dsa/d3/exercise_3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
def main():
s = "race a car"
print(palindrome(s))

def palindrome(s):
clean_s =""
for c in s:
if c.isdigit() or c.isalpha():
clean_s+=c

left = 0
right = len(clean_s)-1
while left < right:
if clean_s[left] != clean_s[right]:
return False
left+=1
right-=1
return True

if __name__ == "__main__":
main()
26 changes: 26 additions & 0 deletions dsa/d4/exercise_5.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
def main():
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] # → [4, -1, 2, 1]
print(kadane_algorithm(nums))

def kadane_algorithm(nums):
window_sum = nums[0]
max_sum = nums[0]
temp_start = 0
best_start = 0
best_end = 0
for i in range(1, len(nums)):

if window_sum + nums[i] > nums[i]:
window_sum = window_sum + nums[i]
else:
window_sum = nums[i]
temp_start = i
if window_sum > max_sum:
max_sum = window_sum
best_start = temp_start
best_end = i

return nums[best_start:best_end+1]

if __name__ == "__main__":
main()
17 changes: 17 additions & 0 deletions dsa/d5/exercise_4.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from collections import defaultdict


def main():
words = ["eat", "tea", "tan", "ate", "nat", "bat"]
print(algorithm(words))

def algorithm(words):
word_dict = defaultdict(list)
for word in words:
key = "".join(sorted(word))
word_dict[key].append(word)

return dict(word_dict)

if __name__ == "__main__":
main()
13 changes: 13 additions & 0 deletions hashing/task5/exercise_6.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
def main():
s = "rat"
t = "tar"
print(is_anagram(s,t))

def is_anagram(s,t):

if "".join(sorted(s)) != "".join(sorted(t)):
return False
return True

if __name__ == "__main__":
main()
33 changes: 33 additions & 0 deletions hashing/task5/exercise_7.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from collections import Counter


def main():
s = "rat"
t = "tar"
print(is_anagram_2(s,t))

def is_anagram(s,t):
if len(s) != len(t):
return False
char_count = {}
# value, count
for i in s:
char_count[i] = char_count.get(i, 0) + 1

for j in t:
if j not in char_count or char_count[j] == 0:
return False
char_count[j] = char_count.get(j, 0) - 1
return True

def is_anagram_2(s,t):
# count_s = Counter(c for c in s)
# count_t = Counter(c for c in t)
#
# if count_s==count_t:
# return True
# return False
return Counter(s)==Counter(t)

if __name__ == "__main__":
main()
1 change: 0 additions & 1 deletion oop/exercise_2/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,5 @@ def main():
print(len([(x, y) for x in log for y in log]) == 36) # nested loop → re-iterable



if __name__ == "__main__":
main()
43 changes: 43 additions & 0 deletions pig_game/exercise_1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import random

def main():
totals = [0,0]
current = 0
mode = input("Play against bot (b) or two players (h)? ")
while True:
print(f"\n--- Player {current}'s turn ---")
is_bot = (mode == "b" and current == 1)
totals[current] += play_turn(is_bot)
print(f"Player {current} total: {totals[current]}")
if totals[current] >= 100:
winner = "Bot" if is_bot else "Player"
print(f"{winner} {current} won!")
break
current = 1-current

def play_turn(is_bot):
turn_score = 0
while True:
die = roll_die()
if die == 1:
print("Rolled 1 Bust!")
return 0
turn_score += die
print(f"Rolled {die}, turn score: {turn_score}")

if is_bot:
choice = bot_decision(turn_score)
print(f"Bot {'holds' if choice == 'h' else 'rolls again'}")
else:
choice = input("roll again? (r/h)")

if choice == "h":
return turn_score

def roll_die():
return random.randint(1,6)

def bot_decision(turn_score):
return "h" if turn_score >= 20 else "r"
if __name__ == "__main__":
main()
70 changes: 70 additions & 0 deletions pig_game/exercise_2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import random
from abc import ABC, abstractmethod

class Player(ABC):
def __init__(self, name):
self.name = name
self.total = 0

@abstractmethod
def decide(self, turn_score):
pass

class HumanPlayer(Player):
def decide(self, turn_score):
return input("Hold or roll again (h/r) ")

class BotPlayer(Player):
def __init__(self, name, hold_at=20):
super().__init__(name)
self.hold_at=hold_at

def decide(self, turn_score):
choice = "h" if turn_score >= self.hold_at else "r"
print(f"{self.name} {'holds' if choice == 'h' else 'rolls again'}")
return choice

class Game:
def __init__(self, players, target=100):
self.players=players
self.target=target
self.current=0

def play_turn(self,player):
turn_score = 0

while True:
die = random.randint(1,6)
if die == 1:
print("Rolled 1 - Bust!")
return 0

turn_score += die
print(f"Die: {die} - Turn score: {turn_score}")

if player.decide(turn_score) == "h":
return turn_score

def play(self):
while True:
player = self.players[self.current]
print(f"\n--- {player.name}'s turn ---")
player.total += self.play_turn(player)
print(f"{player.name} total: {player.total}")
if player.total >= self.target:
print(f"\n{player.name} won!")
break
self.current = 1 - self.current

def main():
mode = input("Play against bot (b) or two players (p)? ")
if mode == "b":
players = [HumanPlayer("You"), BotPlayer("Bot")]
else:
players = [HumanPlayer("Player 1"), HumanPlayer("Player 2")]

game = Game(players)
game.play()

if __name__ == "__main__":
main()
46 changes: 46 additions & 0 deletions pig_game/exercise_3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import random

def main():
totals = [0, 0]
current = 0
mode = input("Play against player(p) or bot(b)")

while True:
print(f"\n--- Player {current} rolls ---")
is_bot = True if mode == "b" and current == 1 else False
totals[current]+=play(is_bot)
print(f"Player: {current}, score: {totals[current]}")

if totals[current] >= 100:
winner = "Bot" if is_bot else "Player"
print(f"{winner} won!")
break

current = 1 - current

def play(is_bot):
turn_score = 0

while True:
die = roll_dice()
if die == 1:
print("Rolled 1 - bust!")
return 0
turn_score+=die
print(f"Rolled {die}, turn score: {turn_score}")
if is_bot:
decision = bot_decision(turn_score)
else:
decision = input("Roll(r) again or hold(h)")
if decision == "h":
return turn_score


def roll_dice():
return random.randint(1,6)

def bot_decision(turn_score):
return "h" if turn_score >= 20 else "r"

if __name__ == "__main__":
main()
Loading
Loading