From c15583c7baa565672758115b0c21b0402b858c9b Mon Sep 17 00:00:00 2001 From: Abhishek Date: Mon, 22 Apr 2024 01:06:04 +0530 Subject: [PATCH 1/4] bowling-first commit --- .../__pycache__/bowling.cpython-38.pyc | Bin 0 -> 1921 bytes .../bowling_test.cpython-38-pytest-6.2.4.pyc | Bin 0 -> 11070 bytes practice/bowling/bowling.py | 45 +++++++++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 practice/bowling/__pycache__/bowling.cpython-38.pyc create mode 100644 practice/bowling/__pycache__/bowling_test.cpython-38-pytest-6.2.4.pyc diff --git a/practice/bowling/__pycache__/bowling.cpython-38.pyc b/practice/bowling/__pycache__/bowling.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..514fd570898fb40ef978bcc03ccebdc2ee5db3f8 GIT binary patch literal 1921 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 K?X)t^Q0hPFsDGXS literal 0 HcmV?d00001 diff --git a/practice/bowling/bowling.py b/practice/bowling/bowling.py index de2dbb0..c038cd5 100644 --- a/practice/bowling/bowling.py +++ b/practice/bowling/bowling.py @@ -1,9 +1,50 @@ class BowlingGame: + def __init__(self): - pass + self.rolls = [] + self.current_roll = 0 def roll(self, pins): - pass + if pins < 0 or pins > 10: + raise ValueError('Invalid roll') + + if self.current_roll > 20 or (self.current_roll == 20 and not self.is_last_frame_strike_or_spare()): + raise Exception('Game already has 10 frames') + + self.rolls.append(pins) + self.current_roll += 1 def score(self): + score = 0 + roll_index = 0 + + for frame in range(10): + if self.is_strike(roll_index): + score += 10 + self.strike_bonus(roll_index) + roll_index += 1 + elif self.is_spare(roll_index): + score += 10 + self.spare_bonus(roll_index) + roll_index += 2 + else: + score += self.rolls[roll_index] + self.rolls[roll_index + 1] + roll_index += 2 + + return score + + def is_strike(self, roll_index): + return self.rolls[roll_index] == 10 + + def is_spare(self, roll_index): + return self.rolls[roll_index] + self.rolls[roll_index + 1] == 10 + + def strike_bonus(self, roll_index): + return self.rolls[roll_index + 1] + self.rolls[roll_index + 2] + + def spare_bonus(self, roll_index): + return self.rolls[roll_index + 2] + + def is_last_frame_strike_or_spare(self): + return self.is_strike(18) or self.is_spare(18) + + pass From 2da64f2cddaa45913f6373f5205721b3c1a0183a Mon Sep 17 00:00:00 2001 From: Abhishek Date: Mon, 22 Apr 2024 02:11:34 +0530 Subject: [PATCH 2/4] run only impacted tests in github actions --- .github/workflows/python-app.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index 48d1bde..a4e04c8 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -30,7 +30,8 @@ jobs: if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Test with pytest run: | - pytest --continue-on-collection-errors + git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/* + git diff origin/main HEAD --name-only -- practice | xargs dirname | sort | uniq | xargs pytest - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names From 3c485ada30db4339aebda0b57d5491edb5d32206 Mon Sep 17 00:00:00 2001 From: Abhishek Date: Mon, 22 Apr 2024 02:42:20 +0530 Subject: [PATCH 3/4] resolved conflicts --- .github/workflows/python-app.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index a4e04c8..e1ba390 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -30,11 +30,11 @@ jobs: if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Test with pytest run: | - git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/* - git diff origin/main HEAD --name-only -- practice | xargs dirname | sort | uniq | xargs pytest + git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/* + git diff origin/main HEAD --name-only -- practice | xargs dirname | sort | uniq | xargs pytest - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics \ No newline at end of file From 9a44888a6c64232f66bf0310768f80ae75d294b1 Mon Sep 17 00:00:00 2001 From: Abhishek Date: Mon, 22 Apr 2024 03:14:06 +0530 Subject: [PATCH 4/4] deleted cache folder to resolve failing builds --- .../bowling/__pycache__/bowling.cpython-38.pyc | Bin 1921 -> 0 bytes .../bowling_test.cpython-38-pytest-6.2.4.pyc | Bin 11070 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 practice/bowling/__pycache__/bowling.cpython-38.pyc delete mode 100644 practice/bowling/__pycache__/bowling_test.cpython-38-pytest-6.2.4.pyc diff --git a/practice/bowling/__pycache__/bowling.cpython-38.pyc b/practice/bowling/__pycache__/bowling.cpython-38.pyc deleted file mode 100644 index 514fd570898fb40ef978bcc03ccebdc2ee5db3f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1921 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 K?X)t^Q0hPFsDGXS