Add exercise 5
This commit is contained in:
parent
72478e8199
commit
0c07bfaf9d
15
Exercise 5/7 - Multiplikasjon/a.py
Normal file
15
Exercise 5/7 - Multiplikasjon/a.py
Normal file
@ -0,0 +1,15 @@
|
||||
def f(tol):
|
||||
g = lambda k: 1 + 1/k**2
|
||||
iterationCount = 2
|
||||
result = 2
|
||||
|
||||
while True:
|
||||
prevResult = result
|
||||
result *= g(iterationCount)
|
||||
if result - prevResult < tol:
|
||||
return (result, iterationCount)
|
||||
iterationCount += 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
result, iterationCount = f(0.01)
|
||||
print(f'Produktet ble {"{:.2f}".format(result)} etter {iterationCount} iterasjoner.')
|
14
Exercise 5/7 - Multiplikasjon/b.py
Normal file
14
Exercise 5/7 - Multiplikasjon/b.py
Normal file
@ -0,0 +1,14 @@
|
||||
def f(tol, count=0):
|
||||
g = lambda x: 1 + 1/x**2
|
||||
product = g(count+1)
|
||||
|
||||
# Base case
|
||||
if product < 1 + tol:
|
||||
return (product, count)
|
||||
|
||||
newProd, newCount = f(tol, count + 1)
|
||||
return (product * newProd, newCount) # Nest in the last count value without modification
|
||||
|
||||
if __name__ == "__main__":
|
||||
result, recursionCount = f(0.01)
|
||||
print(f'Rekursjonsdybden er {recursionCount}\nProduktet ble {"{:.2f}".format(result)}')
|
9
Exercise 5/9 - Arbeidsdager/a.py
Normal file
9
Exercise 5/9 - Arbeidsdager/a.py
Normal file
@ -0,0 +1,9 @@
|
||||
from local import is_leap_year
|
||||
|
||||
def weekday_newyear(year):
|
||||
daySum = sum([366 if is_leap_year(year) else 365 for year in range(year)])
|
||||
return (daySum - 2) % 7
|
||||
|
||||
if __name__ == "__main__":
|
||||
days = ['man', 'tir', 'ons', 'tor', 'fre', 'lor', 'son']
|
||||
_ = [ print(f'{year} {days[weekday_newyear(year)]}') for year in range(1900, 1920) ]
|
2
Exercise 5/9 - Arbeidsdager/b.py
Normal file
2
Exercise 5/9 - Arbeidsdager/b.py
Normal file
@ -0,0 +1,2 @@
|
||||
def is_workday(day):
|
||||
return day < 5
|
15
Exercise 5/9 - Arbeidsdager/c.py
Normal file
15
Exercise 5/9 - Arbeidsdager/c.py
Normal file
@ -0,0 +1,15 @@
|
||||
from itertools import islice, cycle
|
||||
|
||||
from local import is_leap_year
|
||||
from a import weekday_newyear
|
||||
from b import is_workday
|
||||
|
||||
def workdays_in_year(year):
|
||||
firstDay = weekday_newyear(year)
|
||||
cycler = islice( cycle(range(7)), firstDay, None)
|
||||
days = [next(cycler) for day in range((366 if is_leap_year(year) else 365))]
|
||||
workdays = [day for day in days if day < 5]
|
||||
return len(workdays)
|
||||
|
||||
if __name__ == "__main__":
|
||||
_ = [print(f'{year} har {workdays_in_year(year)} arbeidsdager') for year in range(1900, 1920)]
|
8
Exercise 5/9 - Arbeidsdager/local.py
Normal file
8
Exercise 5/9 - Arbeidsdager/local.py
Normal file
@ -0,0 +1,8 @@
|
||||
def is_leap_year ( year ):
|
||||
if year % 400 == 0:
|
||||
return True
|
||||
elif year % 100 == 0:
|
||||
return False
|
||||
elif year % 4 == 0:
|
||||
return True
|
||||
return False
|
@ -1,4 +1,4 @@
|
||||
# from common.inputChecking.choiceInput import choiceInput
|
||||
from common.inputChecking.boolInput import boolInput
|
||||
|
||||
from os import get_terminal_size, system
|
||||
from math import ceil
|
||||
@ -37,13 +37,6 @@ class Card:
|
||||
│ {' ' if self.id != 10 else ''}{self.num}│
|
||||
└─────────┘"""
|
||||
|
||||
def emptyCard():
|
||||
result = Card(1,'spade')
|
||||
result.num = '?'
|
||||
result.sym = '?'
|
||||
return result
|
||||
|
||||
|
||||
class CardHandler:
|
||||
def __init__(self, cards, printSep=5, aceValue = 1):
|
||||
self.cards = cards
|
||||
@ -53,6 +46,11 @@ class CardHandler:
|
||||
def addCard(self, card):
|
||||
self.cards.append(card)
|
||||
|
||||
def generateNewCard(self):
|
||||
cardTypes = range(1,14)
|
||||
cardColors = ['spade', 'heart', 'diamond', 'club']
|
||||
self.addCard(Card(random.choice(cardTypes), random.choice(cardColors)))
|
||||
|
||||
def _concatenateCards(self, cards):
|
||||
"""
|
||||
Concatenate several card objects into an list of sublists
|
||||
@ -71,7 +69,7 @@ class CardHandler:
|
||||
|
||||
def printCards(self, cardsPerLine):
|
||||
"""
|
||||
Print cardsPerLine cards per line, horizontally aligned
|
||||
Print <cardsPerLine> cards per line, horizontally aligned
|
||||
"""
|
||||
|
||||
splitCards =[[] for _ in range(ceil(len(self.cards)/cardsPerLine))]
|
||||
@ -100,7 +98,7 @@ class CardHandler:
|
||||
|
||||
@property
|
||||
def cardSum(self):
|
||||
values = {
|
||||
cardValues = {
|
||||
'A': self.aceValue,
|
||||
'2': 2,
|
||||
'3': 3,
|
||||
@ -115,46 +113,14 @@ class CardHandler:
|
||||
'Q': 10,
|
||||
'K': 10
|
||||
}
|
||||
return sum([values[card.num] for card in self.cards])
|
||||
return sum([cardValues[card.num] for card in self.cards])
|
||||
|
||||
def animator(self):
|
||||
while True:
|
||||
frame = 1
|
||||
yield frame
|
||||
|
||||
#
|
||||
# ┌─────────┐
|
||||
# │? │
|
||||
# │ │
|
||||
# │ │
|
||||
# │ ? │
|
||||
# │ │
|
||||
# │ │
|
||||
# │ ?│
|
||||
# └─────────┘
|
||||
#
|
||||
#
|
||||
# ┌────────┐
|
||||
# │? │
|
||||
# │ │
|
||||
# │ │
|
||||
# │ ? │
|
||||
# │ │
|
||||
# │ │
|
||||
# │ ?│
|
||||
# └────────┘
|
||||
#
|
||||
#
|
||||
# ┌───────┐
|
||||
# │? │
|
||||
# │ │
|
||||
# │ │
|
||||
# │ ? │
|
||||
# │ │
|
||||
# │ │
|
||||
# │ ?│
|
||||
# └───────┘
|
||||
#
|
||||
def emptyCard():
|
||||
result = Card(1,'spade')
|
||||
result.num = '?'
|
||||
result.sym = '?'
|
||||
return result
|
||||
|
||||
|
||||
class Blackjack:
|
||||
@ -162,31 +128,87 @@ class Blackjack:
|
||||
self.handler = CardHandler([])
|
||||
self.emptyHandler = CardHandler([emptyCard(), emptyCard()])
|
||||
self.dealerHandler = CardHandler([])
|
||||
self.gameResults = [0,0]
|
||||
self.reset()
|
||||
|
||||
def generateNewCard(self):
|
||||
cardTypes = range(1,14)
|
||||
cardColors = ['spade', 'heart', 'diamond', 'club']
|
||||
return Card(random.choice(cardTypes), random.choice(cardColors))
|
||||
|
||||
def generateNewCards(self):
|
||||
self.dealerHandler.cards = [ self.generateNewCard() for _ in range(2) ]
|
||||
self.handler.cards = [ self.generateNewCard() for _ in range(2) ]
|
||||
self.dealerHandler.cards = []
|
||||
self.handler.cards = []
|
||||
for _ in range(2):
|
||||
self.dealerHandler.generateNewCard()
|
||||
self.handler.generateNewCard()
|
||||
|
||||
def determineAceValue(self):
|
||||
if self.dealerHandler.cardSum <= 9:
|
||||
self.handler.aceValue = 13
|
||||
|
||||
containsAce = any([True for card in self.dealerHandler.cards if card.id == 1])
|
||||
if self.dealerHandler.cardSum < 10 and containsAce: # 9 + 1 = 10, 9 + 13 = 22
|
||||
self.dealerHandler.aceValue = self.handler.aceValue = 13
|
||||
else:
|
||||
self.dealerHandler.aceValue = self.handler.aceValue = 1
|
||||
|
||||
def reset(self):
|
||||
self.generateNewCards()
|
||||
self.determineAceValue()
|
||||
|
||||
def printCards(self):
|
||||
def youWin(self):
|
||||
self.gameResults[0] += 1
|
||||
print("""
|
||||
__ __
|
||||
/\ \ /\ \ __
|
||||
\ `\`\\\\/'/ ___ __ __ __ __ __/\_\ ___
|
||||
`\ `\ /' / __`\/\ \/\ \ /\ \/\ \/\ \/\ \ /' _ `\
|
||||
`\ \ \/\ \L\ \ \ \_\ \\ \\ \ \_/ \_/ \ \ \/\ \/\ \
|
||||
\ \_\ \____/\ \____/ \ \___x___/'\ \_\ \_\ \_\\
|
||||
\/_/\/___/ \/___/ \/__//__/ \/_/\/_/\/_/
|
||||
""")
|
||||
|
||||
def youLose(self):
|
||||
self.gameResults[1] += 1
|
||||
print("""
|
||||
__ __ ___
|
||||
/\ \ /\ \ /\_ \
|
||||
\ `\`\\\\/'/ ___ __ __ \//\ \ ___ ____ __
|
||||
`\ `\ /' / __`\/\ \/\ \ \ \ \ / __`\ /',__\ /'__`\
|
||||
`\ \ \/\ \L\ \ \ \_\ \ \_\ \_/\ \L\ \/\__, `\/\ __/
|
||||
\ \_\ \____/\ \____/ /\____\ \____/\/\____/\ \____\\
|
||||
\/_/\/___/ \/___/ \/____/\/___/ \/___/ \/____/
|
||||
""")
|
||||
|
||||
def gameOver(self):
|
||||
system('clear')
|
||||
|
||||
print('\nDEALERS CARDS\n')
|
||||
self.dealerHandler.safePrintCards()
|
||||
print('\nYOUR CARDS\n')
|
||||
self.handler.safePrintCards()
|
||||
print()
|
||||
print('Ace value is', self.handler.aceValue)
|
||||
|
||||
cardSumNotExceeds21 = self.handler.cardSum < 22
|
||||
playerSumBiggerThanDealer = self.handler.cardSum > self.dealerHandler.cardSum
|
||||
if cardSumNotExceeds21 and playerSumBiggerThanDealer:
|
||||
self.youWin()
|
||||
else:
|
||||
self.youLose()
|
||||
print()
|
||||
|
||||
print(f'Wins: {self.gameResults[0]} Losses: {self.gameResults[1]}')
|
||||
if boolInput(
|
||||
'Do you want to play again? [y/n]: ',
|
||||
yesNoLetters=['y','n'],
|
||||
error=''
|
||||
):
|
||||
self.reset()
|
||||
else:
|
||||
exit(0)
|
||||
|
||||
def checkIfLost(self):
|
||||
if self.handler.cardSum > 21:
|
||||
self.gameOver()
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def update(self):
|
||||
|
||||
system('clear')
|
||||
|
||||
print('\nDEALERS CARDS\n')
|
||||
@ -194,9 +216,14 @@ class Blackjack:
|
||||
print('\nYOUR CARDS\n')
|
||||
self.handler.safePrintCards()
|
||||
print()
|
||||
print('Ace value is', self.handler.aceValue)
|
||||
print()
|
||||
|
||||
input('Continue?')
|
||||
self.handler.addCard(self.generateNewCard())
|
||||
if not self.checkIfLost():
|
||||
if not boolInput('Continue? [y/n]: ', yesNoLetters=('y','n')):
|
||||
self.gameOver()
|
||||
return
|
||||
self.handler.generateNewCard()
|
||||
|
||||
def loop(self):
|
||||
while True:
|
131
Exercise 5/task8.py
Normal file
131
Exercise 5/task8.py
Normal file
@ -0,0 +1,131 @@
|
||||
from common.inputChecking.typeCheck import validateInput as validateTypeInput
|
||||
from common.inputChecking.boolInput import validateInput as validateBoolInput
|
||||
|
||||
from json import dumps as serialize
|
||||
from json import loads as unserialize
|
||||
from os.path import isfile
|
||||
|
||||
class ExitError(Exception):
|
||||
pass
|
||||
|
||||
def boolInput(question, yesNoLetters=('j','n'), exitKeyword='hade'):
|
||||
yesLetters = [yesNoLetters[0], yesNoLetters[0].capitalize()]
|
||||
while True:
|
||||
answer = input(question)
|
||||
if answer == exitKeyword:
|
||||
raise ExitError
|
||||
if validateBoolInput(answer, yesNoLetters):
|
||||
return answer in yesLetters
|
||||
|
||||
def inputTypeCheck(question, type, exitKeyword='hade'):
|
||||
while True:
|
||||
userInput = input(question)
|
||||
if userInput == exitKeyword:
|
||||
raise ExitError
|
||||
if validateTypeInput(userInput, type):
|
||||
return userInput
|
||||
|
||||
class DataSchema:
|
||||
def __init__(
|
||||
self,
|
||||
genderIsMale = None,
|
||||
age = None,
|
||||
hasMultipleSubjects = None,
|
||||
hasITGK = None,
|
||||
avgStudyTime = None
|
||||
):
|
||||
self.genderIsMale = genderIsMale
|
||||
self.age = age
|
||||
self.hasMultipleSubjects = hasMultipleSubjects
|
||||
self.hasITGK = hasITGK
|
||||
self.avgStudyTime = avgStudyTime
|
||||
|
||||
|
||||
class Survey:
|
||||
def __init__(self, savePath='./results.json', resultsPath=''):
|
||||
self.savePath = savePath
|
||||
if resultsPath != '':
|
||||
self.resultsPath = resultsPath
|
||||
self.loadResults()
|
||||
|
||||
results = []
|
||||
|
||||
def loadResults(self):
|
||||
try:
|
||||
file = open(self.resultsPath, 'r')
|
||||
dicts = unserialize(file.read())
|
||||
self.results = [DataSchema(**dict) for dict in dicts]
|
||||
except FileNotFoundError:
|
||||
print('Fant ikke undersøkelsesdata ved', self.resultsPath)
|
||||
except Exception as e:
|
||||
print('Noe gikk galt under lasting av undersøkelsesdata')
|
||||
print(e)
|
||||
|
||||
def printStats(self):
|
||||
print('Resultat av undersøkelse!')
|
||||
men = women = multipleChoice = itgk = studyHours = 0
|
||||
for result in self.results:
|
||||
if result.genderIsMale:
|
||||
men += 1
|
||||
else:
|
||||
women += 1
|
||||
multipleChoice += 1 if result.hasMultipleSubjects else 0
|
||||
itgk += 1 if result.hasITGK else 0
|
||||
studyHours += int(result.avgStudyTime)
|
||||
print("Antall kvinner:", women)
|
||||
print("Antall menn:", men)
|
||||
print("Antall personer som tar fag:", multipleChoice)
|
||||
print("Antall personer som tar ITGK:", itgk)
|
||||
print("Antall timer i snitt brukt på lekser:", studyHours/len(self.results))
|
||||
|
||||
def saveResults(self):
|
||||
serializedResults = serialize([result.__dict__ for result in self.results])
|
||||
|
||||
# Check whether file exists
|
||||
try:
|
||||
assert not isfile(self.savePath)
|
||||
except:
|
||||
if not boolInput(f'Det eksisterer allerede en fil ved {self.savePath}\nVil du overskrive filen? [j/n]: '):
|
||||
return
|
||||
|
||||
# Try to write data to file.
|
||||
try:
|
||||
file = open(self.savePath, "w")
|
||||
file.write(serializedResults)
|
||||
file.close()
|
||||
except:
|
||||
if boolInput('Noe gikk galt under lagring av data. Vil du prøve igjen? [j/n]: '):
|
||||
self.saveResults()
|
||||
|
||||
def end(self):
|
||||
if len(self.results) > 0:
|
||||
self.printStats()
|
||||
self.saveResults()
|
||||
exit(0)
|
||||
|
||||
def update(self):
|
||||
schema = DataSchema()
|
||||
|
||||
print('Velkommen til spørreundersøkelsen!\n')
|
||||
|
||||
try:
|
||||
schema.genderIsMale = boolInput('Hvilket kjønn er du? [f/m]: ', yesNoLetters=('m','f'))
|
||||
schema.age = inputTypeCheck('Hvor gammel er du?: ', int)
|
||||
schema.hasMultipleSubjects = boolInput('Tar du et eller flere fag? [j/n]: ')
|
||||
|
||||
hasITGKQuestion = 'Tar du ITGK? [j/n]: ' if int(schema.age) < 22 else 'Tar du virkelig ITGK? [j/n]: '
|
||||
schema.hasITGK = boolInput(hasITGKQuestion)
|
||||
schema.avgStudyTime = inputTypeCheck('Hvor mange timer bruker du daglig (i snitt) på lekser?: ', float)
|
||||
self.results.append(schema)
|
||||
except ExitError:
|
||||
self.end()
|
||||
print()
|
||||
|
||||
def loop(self):
|
||||
while True:
|
||||
self.update()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
survey = Survey(resultsPath='./results.json')
|
||||
survey.loop()
|
Loading…
Reference in New Issue
Block a user