feat(curriculum): add luhn algorithm project (#52443)

Co-authored-by: Dario-DC <105294544+Dario-DC@users.noreply.github.com>
Co-authored-by: Krzysztof G <60067306+gikf@users.noreply.github.com>
This commit is contained in:
Shaun Hamilton
2023-12-19 23:18:02 +02:00
committed by GitHub
parent 8f579cdec6
commit 08b01d1499
38 changed files with 2354 additions and 0 deletions
+4
View File
@@ -1191,6 +1191,10 @@
"title": "Upcoming Python Project",
"intro": ["placeholder"]
},
"learn-how-to-work-with-numbers-and-strings-by-implementing-the-luhn-algorithm": {
"title": "Learn How to Work with Numbers and Strings by Implementing the Luhn Algorithm",
"intro": ["", ""]
},
"learn-classes-and-objects-by-building-a-sudoku-solver": {
"title": "Learn Classes and Objects by Building a Sudoku Solver",
"intro": [
@@ -0,0 +1,10 @@
---
title: Introduction to the Learn How to Work with Numbers and Strings by Implementing the Luhn Algorithm
block: learn-how-to-work-with-numbers-and-strings-by-implementing-the-luhn-algorithm
superBlock: upcoming-python
isBeta: true
---
## Introduction to the Learn How to Work with Numbers and Strings by Implementing the Luhn Algorithm
This is a test for the new project-based curriculum.
@@ -0,0 +1,157 @@
{
"name": "Learn How to Work with Numbers and Strings by Implementing the Luhn Algorithm",
"isUpcomingChange": true,
"usesMultifileEditor": true,
"hasEditableBoundaries": true,
"dashedName": "learn-how-to-work-with-numbers-and-strings-by-implementing-the-luhn-algorithm",
"order": 5,
"time": "5 hours",
"template": "",
"required": [],
"superBlock": "upcoming-python",
"superOrder": 20,
"isBeta": true,
"challengeOrder": [
{
"id": "6565a536ba1f9f25bd30e88b",
"title": "Step 1"
},
{
"id": "656877c202f44995ed952608",
"title": "Step 2"
},
{
"id": "656877f71bba2b97acedf9af",
"title": "Step 3"
},
{
"id": "656878585631369a6b2d2191",
"title": "Step 4"
},
{
"id": "6568789edf2ed39c81983cc4",
"title": "Step 5"
},
{
"id": "65687946130b0ea10aa19b75",
"title": "Step 6"
},
{
"id": "6569b831a07d7154c793301b",
"title": "Step 7"
},
{
"id": "656879613a96aba21cbe80b9",
"title": "Step 8"
},
{
"id": "656879a66338b2a461d5d307",
"title": "Step 9"
},
{
"id": "656879c6f35a85a59c06b3a7",
"title": "Step 10"
},
{
"id": "656b4638cb8bcf2729afe9a9",
"title": "Step 11"
},
{
"id": "656b475b394390334828eb12",
"title": "Step 12"
},
{
"id": "656b47dc2cf39e37025dc033",
"title": "Step 13"
},
{
"id": "656b481ec4976439565a78b2",
"title": "Step 14"
},
{
"id": "656879e1c749d7a6c5eba2d2",
"title": "Step 15"
},
{
"id": "65687a005aba3ea815b84e68",
"title": "Step 16"
},
{
"id": "65687a8253766cac4c99c57f",
"title": "Step 17"
},
{
"id": "65687a923dd792ad339f9c09",
"title": "Step 18"
},
{
"id": "65687ad86596e0af38640a84",
"title": "Step 19"
},
{
"id": "65687b182c2a8fb1470e0b97",
"title": "Step 20"
},
{
"id": "65687b48f2201ab32e06c37c",
"title": "Step 21"
},
{
"id": "65687b68003a61b46fe691f0",
"title": "Step 22"
},
{
"id": "65687b8eb0bbf7b5d41b610b",
"title": "Step 23"
},
{
"id": "65687bbfd9a7d6b78cd5b5cf",
"title": "Step 24"
},
{
"id": "65687c2fd0fec7ba9fb8af30",
"title": "Step 25"
},
{
"id": "65687c8d86e18cbd775a53c9",
"title": "Step 26"
},
{
"id": "65687da2e60409c45595bbe1",
"title": "Step 27"
},
{
"id": "65687db6a9fcf3c548a6c1b7",
"title": "Step 28"
},
{
"id": "65687dd4b641fdc67d7de487",
"title": "Step 29"
},
{
"id": "65687e069cf4e0c85b0a06b1",
"title": "Step 30"
},
{
"id": "65687e0ed12e20c91811a48d",
"title": "Step 31"
},
{
"id": "65687e294ef2bdca637fb213",
"title": "Step 32"
},
{
"id": "65687e457ab1c4cb8c3fe7c8",
"title": "Step 33"
},
{
"id": "65687f47f9001dd35bdcd5ab",
"title": "Step 34"
},
{
"id": "656880227dab4bd8fbc02d41",
"title": "Step 35"
}
],
"helpCategory": "Python"
}
@@ -0,0 +1,54 @@
---
id: 6565a536ba1f9f25bd30e88b
title: Step 1
challengeType: 20
dashedName: step-1
---
# --description--
In this project, you will implement the Luhn Algorithm. This algorithm is a formula to validate a variety of identification numbers.
<!-- TODO: Maybe cover `if __name__ == '__main__'` -->
<!-- Might not make sense, because import is not covered yet -->
<!-- https://docs.python.org/3/reference/import.html?highlight=__name__#import-related-module-attributes -->
Start by declaring a function called `main`. Use the `pass` keyword to avoid an error.
# --hints--
You should have `def main():` in your code.
```js
({
test: () => {
assert(__pyodide.runPython(`
import inspect
a = __locals.get("main")
inspect.isfunction(a)
`))
}
})
```
You should have `pass` in your code.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const pass = __helpers.python.getDef("\n"+transformedCode, "main");
assert.include(pass?.function_body, "pass");
}
})
```
# --seed--
## --seed-contents--
```python
--fcc-editable-region--
--fcc-editable-region--
```
@@ -0,0 +1,50 @@
---
id: 656877c202f44995ed952608
title: Step 2
challengeType: 20
dashedName: step-2
---
# --description--
Replace the `pass` statement with a variable named `card_number` and a value of `4111-1111-4555-1142`.
# --hints--
You should have `card_number = "4111-1111-4555-1142"` within the `main` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const main = __helpers.python.getDef("\n" + transformedCode, "main");
const { function_body } = main;
assert.match(function_body, / +card_number\s*=\s*('|")4111-1111-4555-1142\1/);
}
})
```
You should not have a `pass` in your code.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const no_comments = __helpers.python.removeComments(transformedCode);
assert.notInclude(no_comments, "pass");
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def main():
pass
--fcc-editable-region--
```
@@ -0,0 +1,65 @@
---
id: 656877f71bba2b97acedf9af
title: Step 3
challengeType: 20
dashedName: step-3
---
# --description--
Python comes with built-in classes that can help us with string manipulation. One of them is the `str` class. It has a method called `maketrans` that can help us create a translation table. This table can be used to replace characters in a string:
```python
str.maketrans({'t': 'c', 'l': 'b'})
```
The above, when called on a string, will replace all `t` characters with `c` and all `l` characters with `b`.
Create a variable called `card_translation` and assign it a translation table to replace all `-` and ` ` characters with an empty string.
# --hints--
You should create a `card_translation` variable within `main`.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const main = __helpers.python.getDef("\n" + transformedCode, "main");
const { function_body } = main;
assert.match(function_body, / +card_translation\s*=/);
}
})
```
You should assign `card_translation` a value of `str.maketrans({'-': '', ' ': ''})`.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const main = __helpers.python.getDef("\n" + transformedCode, "main");
const { function_body } = main;
const allowedMatches = [
/ +card_translation\s*=\s*str\.maketrans\(\s*\{\s*(['"])-\1\s*:\s*(['"])\2\s*,\s*(['"]) \3\s*:\s*(['"])\4\s*\}\s*\)/,
/ +card_translation\s*=\s*str\.maketrans\(\s*\{\s*(['"]) \1\s*:\s*(['"])\2\s*,\s*(['"])-\3\s*:\s*(['"])\4\s*\}\s*\)/,
];
const anyMatch = allowedMatches.some((match) => match.test(function_body));
assert.isTrue(anyMatch);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
--fcc-editable-region--
```
@@ -0,0 +1,61 @@
---
id: 656878585631369a6b2d2191
title: Step 4
challengeType: 20
dashedName: step-4
---
# --description--
Defining the translation does not in itself translate the string. The `translate` method must be called on the string to be translated with the translation table as an argument:
```py
my_string = "tamperlot"
translation_table = str.maketrans({'t': 'c', 'l': 'b'})
translated_string = my_string.translate(translation_table)
```
Create a variable called `translated_card_number` and assign it the result of calling the `translate` method on `card_number` with `card_translation` as an argument.
# --hints--
You should create a `translated_card_number` variable within `main`.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const main = __helpers.python.getDef("\n" + transformedCode, "main");
const { function_body } = main;
assert.match(function_body, / +translated_card_number\s*=/);
}
})
```
You should assign `translated_card_number` a value of `card_number.translate(card_translation)`.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const main = __helpers.python.getDef("\n" + transformedCode, "main");
const { function_body } = main;
assert.match(function_body, / +translated_card_number\s*=\s*card_number\.translate\(\s*card_translation\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
--fcc-editable-region--
```
@@ -0,0 +1,40 @@
---
id: 6568789edf2ed39c81983cc4
title: Step 5
challengeType: 20
dashedName: step-5
---
# --description--
Print the translated card number to the console.
# --hints--
You should print `translated_card_number` to the console.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const main = __helpers.python.getDef("\n" + transformedCode, "main");
const { function_body } = main;
assert.match(function_body, / +print\(\s*translated_card_number\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
--fcc-editable-region--
```
@@ -0,0 +1,40 @@
---
id: 65687946130b0ea10aa19b75
title: Step 6
challengeType: 20
dashedName: step-6
---
# --description--
Call the `main` function at the end of your script.
# --hints--
You should have `main()` outside of the `main` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
assert.match(transformedCode, /\nmain\(\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
print(translated_card_number)
--fcc-editable-region--
```
@@ -0,0 +1,46 @@
---
id: 656879613a96aba21cbe80b9
title: Step 8
challengeType: 20
dashedName: step-8
---
# --description--
Within your `main` function, call the `verify_card_number` function and pass in the `translated_card_number` variable as an argument.
# --hints--
You should have `verify_card_number(translated_card_number)` within the `main` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const main = __helpers.python.getDef("\n" + transformedCode, "main");
const { function_body } = main;
assert.match(function_body, / +verify_card_number\(\s*translated_card_number\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
pass
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
print(translated_card_number)
--fcc-editable-region--
main()
```
@@ -0,0 +1,78 @@
---
id: 656879a66338b2a461d5d307
title: Step 9
challengeType: 20
dashedName: step-9
---
# --description--
<!-- TODO: Find better places to split explanation up. -->
The Luhn algorithm is as follows:
1. From the right to left, double the value of every second digit; if the product is greater than 9, sum the digits of the products.
2. Take the sum of all the digits.
3. If the sum of all the digits is a multiple of `10`, then the number is valid; else it is not valid.
Assume an example of an account number "7992739871" that will have a check digit added, making it of the form 7992739871x:
```markdown
Account number 7 9 9 2 7 3 9 8 7 1 x
Double every other 7 18 9 4 7 6 9 16 7 2 x
Sum 2-char digits 7 9 9 4 7 6 9 7 7 2 x
```
Replace the `pass` statement with a variable `sum_of_odd_digits` and a value of `0`.
# --hints--
You should have `sum_of_odd_digits = 0` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /sum_of_odd_digits\s*=\s*0/);
}
})
```
You should not have `pass` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.notMatch(function_body, /pass/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
pass
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
print(translated_card_number)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,59 @@
---
id: 656879c6f35a85a59c06b3a7
title: Step 10
challengeType: 20
dashedName: step-10
---
# --description--
You have accessed elements (characters) of a string before, using the index operator `[]`. You can also use the index operator to access a range of characters in a string with `string[x:y:h]`:
```python
my_string = 'camperbot'
camper = my_string[0:6]
cp = my_string[0:6:3]
```
Where `x` is the starting index, `y` is the ending index, and `h` is the step (the amount of characters to skip over).
Create a variable named `card_number_reversed` and assign it the value of the first 4 characters of `card_number`.
# --hints--
You should have `card_number_reversed = card_number[0:4]` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /card_number_reversed\s*=\s*card_number\[0:4\]/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
print(translated_card_number)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,50 @@
---
id: 656879e1c749d7a6c5eba2d2
title: Step 15
challengeType: 20
dashedName: step-15
---
# --description--
Remove the `print` call from the `verify_card_number` function.
# --hints--
You should not have a `print` call within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
const no_comments = __helpers.python.removeComments(function_body);
assert.notMatch(no_comments, /print\(/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
print(card_number_reversed)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
print(translated_card_number)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,49 @@
---
id: 65687a005aba3ea815b84e68
title: Step 16
challengeType: 20
dashedName: step-16
---
# --description--
Remove the `print` call from the `main` function.
# --hints--
You should not have a `print` call within the `main` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const main = __helpers.python.getDef("\n" + transformedCode, "main");
const { function_body } = main;
const no_comments = __helpers.python.removeComments(function_body);
assert.notMatch(no_comments, /print\(/);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
print(translated_card_number)
verify_card_number(translated_card_number)
--fcc-editable-region--
main()
```
@@ -0,0 +1,47 @@
---
id: 65687a8253766cac4c99c57f
title: Step 17
challengeType: 20
dashedName: step-17
---
# --description--
Within the `verify_card_number` function, create a variable `odd_digits` that contains every other digit of the `card_number_reversed` string.
# --hints--
You should have `odd_digits = card_number_reversed[::2]` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /odd_digits\s*=\s*card_number_reversed\[::2\]/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,48 @@
---
id: 65687a923dd792ad339f9c09
title: Step 18
challengeType: 20
dashedName: step-18
---
# --description--
Print the value of the `odd_digits` variable to the console.
# --hints--
You should have `print(odd_digits)` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /print\(\s*odd_digits\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,68 @@
---
id: 65687ad86596e0af38640a84
title: Step 19
challengeType: 20
dashedName: step-19
---
# --description--
Use a `for` loop to iterate over each digit in the `odd_digits` list. Move your `print` call from the previous step into the `for` loop, and change it to print each digit.
# --hints--
You should use a `for` loop over `odd_digits`.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /for\s+\w+\s+in\s+odd_digits/);
}
})
```
You should have `--fcc-expected--` within the `for` loop.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
// Get variable name used in for loop
const for_loop_variable = function_body.match(/for\s+(\w+)\s+in\s+odd_digits/)?.[1];
assert.exists(for_loop_variable);
assert.equal(function_body.match(new RegExp(`print\\(\\s*${for_loop_variable}\\s*\\)`))?.[0], `print(${for_loop_variable})`);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
print(odd_digits)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,47 @@
---
id: 65687b182c2a8fb1470e0b97
title: Step 20
challengeType: 20
dashedName: step-20
---
# --description--
Within the `for` loop, use the `+=` operator to add the `digit` to the `sum_of_odd_digits` variable.
# --hints--
You should have `sum_of_odd_digits += digit` within the `for` loop.
```js
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /sum_of_odd_digits\s*\+=\s*digit/);
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
print(digit)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,89 @@
---
id: 65687b48f2201ab32e06c37c
title: Step 21
challengeType: 20
dashedName: step-21
---
# --description--
Currently, your script throws a `TypeError` because you are trying to add a string to an integer. You can fix this by converting the `digit` variable to an integer before adding it to `sum_of_odd_digits`, using the built-in `int` function:
```python
my_string = '123'
my_int = int(my_string)
```
Convert the `digit` variable to an integer before adding it to `sum_of_odd_digits`. Then, move the `print` call to the end of the `verify_card_number` function to print the value of `sum_of_odd_digits`.
# --hints--
You should have `sum_of_odd_digits += int(digit)` within the `for` loop.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /sum_of_odd_digits\s*\+=\s*int\(digit\)/);
}
})
```
You should have `print(sum_of_odd_digits)` at the end of the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /print\(\s*sum_of_odd_digits\s*\)/);
}
})
```
You should not have `print(digit)` anymore.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
const no_comments = __helpers.python.removeComments(function_body);
assert.notMatch(no_comments, /print\(\s*digit\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
--fcc-editable-region--
for digit in odd_digits:
print(digit)
sum_of_odd_digits += digit
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,52 @@
---
id: 65687b68003a61b46fe691f0
title: Step 22
challengeType: 20
dashedName: step-22
---
# --description--
Below your `print` call, create a variable named `sum_of_even_digits` and assign it a value of `0`.
# --hints--
You should have `sum_of_even_digits = 0` below your `print` call.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /sum_of_even_digits\s*=\s*0/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
print(sum_of_odd_digits)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,54 @@
---
id: 65687b8eb0bbf7b5d41b610b
title: Step 23
challengeType: 20
dashedName: step-23
---
# --description--
Create a variable `even_digits` and assign it the even digits of the reversed card number.
# --hints--
You should have `even_digits = card_number_reversed[1::2]` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /even_digits\s*=\s*card_number_reversed\[1::2\]/);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
print(sum_of_odd_digits)
--fcc-editable-region--
sum_of_even_digits = 0
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,75 @@
---
id: 65687bbfd9a7d6b78cd5b5cf
title: Step 24
challengeType: 20
dashedName: step-24
---
# --description--
Loop over the even digits and print each to the console.
# --hints--
You should have a `for` loop over `even_digits` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /for +(\w+) +in +even_digits:/);
}
})
```
You should have `--fcc-expected--` within the `for` loop.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
// Get the name of the variable used in the for loop
const for_loop_variable = function_body.match(/for +(\w+) +in +even_digits:/)?.[1];
assert.exists(for_loop_variable);
const [_,lower_function_body] = function_body.split("sum_of_even_digits");
assert.equal(lower_function_body.match(new RegExp(`print\\(\\s*${for_loop_variable}\\s*\\)`))?.[0], `print(${for_loop_variable})`);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
print(sum_of_odd_digits)
--fcc-editable-region--
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,56 @@
---
id: 65687c2fd0fec7ba9fb8af30
title: Step 25
challengeType: 20
dashedName: step-25
---
# --description--
Remove the `print` call for the sum of the odd digits.
# --hints--
You should not have `print(sum_of_odd_digits)` in your code.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
const no_comments = __helpers.python.removeComments(function_body);
assert.notMatch(no_comments, /print\(\s*sum_of_odd_digits\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
print(sum_of_odd_digits)
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
print(digit)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,73 @@
---
id: 65687c8d86e18cbd775a53c9
title: Step 26
challengeType: 20
dashedName: step-26
---
# --description--
The next part of the Luhn Algorithm is to multiply all the even digits by `2`.
Within the even digit `for` loop, replace the `print` call with a variable named `number` and assign it the value of `digit` multiplied by `2`.
# --hints--
You should have `number = int(digit) * 2` within the `for` loop.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /number\s*=\s*int\(digit\)\s*\*\s*2/);
}
})
```
You should not have `print(digit)` within the `for` loop.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
const no_comments = __helpers.python.removeComments(function_body);
assert.notMatch(no_comments, /print\s*\(\s*digit\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
--fcc-editable-region--
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
print(digit)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,72 @@
---
id: 65687da2e60409c45595bbe1
title: Step 27
challengeType: 20
dashedName: step-27
---
# --description--
To prevent the multiplication of one digit from being greater than `9`, within the even digit loop, add an `if` statement that checks if `number` is greater than or equal to `10`. If it is, print `number`.
# --hints--
You should have `if number >= 10:` within the `for` loop.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /if +number +>= +10:/);
}
})
```
You should have `print(number)` within the `if` statement.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
const [_,lower_function_body] = function_body.split("sum_of_even_digits");
assert.match(lower_function_body, /print\s*\(\s*number\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
--fcc-editable-region--
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
number = int(digit) * 2
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,73 @@
---
id: 65687db6a9fcf3c548a6c1b7
title: Step 28
challengeType: 20
dashedName: step-28
---
# --description--
Part of the algorithm is to double every second digit, starting from the right. If the result of doubling the number is greater than or equal to `10`, add the two digits together. For example, if the digit is `6`, double it to get `12`. Add `1` and `2` together to get `3`. You can do this by using _integer division_ to get the first digit and the modulus operator (`%`) to get the second digit:
```python
my_number = 12
first_digit = my_number // 10
second_digit = my_number % 10
```
Integer division results in the quotient of the division, rounded down to the nearest integer.
Within the `if` statement, assign `number` the result of `number // 10` (integer division) plus the modulus of `number` and `10`.
# --hints--
You should have `number = number // 10 + number % 10` within the `if` statement.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getBlock("\n" + transformedCode, "if number >= 10");
const { block_body } = verify_card_number;
const allowedMatches = [
/number *= *\(?number *\/\/ *10\)? *\+ *\(?number *% *10/,
/number *= *\(?number *% *10\)? *\+ *\(?number *\/\/ *10/
];
const someMatch = allowedMatches.some(allowedMatch => allowedMatch.test(block_body));
assert.isTrue(someMatch);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
--fcc-editable-region--
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
number = int(digit) * 2
if number >= 10:
print(number)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,61 @@
---
id: 65687dd4b641fdc67d7de487
title: Step 29
challengeType: 20
dashedName: step-29
---
# --description--
Move the `print` call below the `number` reassignment.
# --hints--
You should move `print(number)` below `number = (number // 10) + (number % 10)`.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const if_statement = __helpers.python.getBlock("\n" + transformedCode, "if number >= 10");
const { block_body } = if_statement;
const [number_assignment, print_pos] = block_body.split('\n').filter(line => line.trim().length > 0);
assert.match(number_assignment, /number *=/);
assert.match(print_pos, /print\s*\(\s*number\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
--fcc-editable-region--
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
number = int(digit) * 2
if number >= 10:
print(number)
number = (number // 10) + (number % 10)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,89 @@
---
id: 65687e069cf4e0c85b0a06b1
title: Step 30
challengeType: 20
dashedName: step-30
---
# --description--
Outside of the `if` statement, add `number` to `sum_of_even_digits`. Also, remove the `print` call.
# --hints--
You should have `sum_of_even_digits += number` within the `for` loop.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const for_loop = __helpers.python.getBlock("\n" + transformedCode, "for digit in even_digits");
const {block_body} = for_loop;
assert.match(block_body, /sum_of_even_digits\s*\+=\s*number/);
}
})
```
You should not have `print(number)` within the `for` loop.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
const no_comments = __helpers.python.removeComments(function_body);
assert.notMatch(no_comments, /print\s*\(\s*number\s*\)/);
}
})
```
You should not have `sum_of_even_digits += number` within the `if` statement.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const if_statement = __helpers.python.getBlock("\n" + transformedCode, "if number >= 10");
const {block_body} = if_statement;
assert.notMatch(block_body, /sum_of_even_digits *\+= *number/);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
--fcc-editable-region--
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
number = int(digit) * 2
if number >= 10:
number = (number // 10) + (number % 10)
print(number)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,77 @@
---
id: 65687e0ed12e20c91811a48d
title: Step 31
challengeType: 20
dashedName: step-31
---
# --description--
Below the second `for` loop of the `verify_card_number` function, create a variable named `total`, and assign it the value of the sum of the odd and even digits. Print `total` to the console.
# --hints--
You should have `total = sum_of_odd_digits + sum_of_even_digits` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
const function_body_indentation = function_body.match(/^\s*/)[0];
const total_re = new RegExp(`^${function_body_indentation}total\\s*=\\s*sum_of_odd_digits\\s*\\+\\s*sum_of_even_digits`, "m");
assert.match(function_body, total_re);
}
})
```
You should have `print(total)` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /print\(\s*total\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
--fcc-editable-region--
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
number = int(digit) * 2
if number >= 10:
number = (number // 10) + (number % 10)
sum_of_even_digits += number
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,70 @@
---
id: 65687e294ef2bdca637fb213
title: Step 32
challengeType: 20
dashedName: step-32
---
# --description--
Return the result of comparing `0` to `total` modulo `10`.
# --hints--
You should have `return 0 == total % 10` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
const acceptableMatches = [
/return +0 *== *total *% *10/,
/return +total *% *10 *== *0/
];
const someMatch = acceptableMatches.some((match) => {
return match.test(function_body);
});
assert.isTrue(someMatch);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
number = int(digit) * 2
if number >= 10:
number = (number // 10) + (number % 10)
sum_of_even_digits += number
--fcc-editable-region--
total = sum_of_odd_digits + sum_of_even_digits
print(total)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,90 @@
---
id: 65687e457ab1c4cb8c3fe7c8
title: Step 33
challengeType: 20
dashedName: step-33
---
# --description--
Adjust the `verify_card_number` call such that if it returns `True`, print `VALID!` to the console. Otherwise, print `INVALID!`.
# --hints--
You should have `if verify_card_number(translated_card_number):` within the `main` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const main = __helpers.python.getDef("\n" + transformedCode, "main");
const { function_body } = main;
const if_statement = __helpers.python.getBlock("\n" + function_body, "if verify_card_number(translated_card_number)");
assert.exists(if_statement);
}
})
```
You should have `print("VALID!")` within the `if` statement.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const if_statement = __helpers.python.getBlock("\n" + transformedCode, "if verify_card_number(translated_card_number)");
const {block_body} = if_statement;
assert.match(block_body, /print\(\s*('|")VALID!\1\s*\)/);
}
})
```
You should have `print("INVALID!")` within the `else` clause.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const else_statement = __helpers.python.getBlock("\n" + transformedCode, "else");
const {block_body} = else_statement;
assert.match(block_body, /print\(\s*('|")INVALID!\1\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
number = int(digit) * 2
if number >= 10:
number = (number // 10) + (number % 10)
sum_of_even_digits += number
total = sum_of_odd_digits + sum_of_even_digits
print(total)
return total % 10 == 0
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
verify_card_number(translated_card_number)
--fcc-editable-region--
main()
```
@@ -0,0 +1,62 @@
---
id: 65687f47f9001dd35bdcd5ab
title: Step 34
challengeType: 20
dashedName: step-34
---
# --description--
Change the value of `card_number` such that `INVALID!` is printed to the console.
# --hints--
You could have `card_number = '4111-1111-4555-1141'` within the main function.
```js
({
test: () => {
const spyCode = "a = ''\ndef printSpy(*x):\n global a\n a += str(x)\n" + code.replaceAll("print(", "printSpy(") + "\na";
const out = __pyodide.runPython(spyCode);
assert.include(out, "INVALID!");
}
})
```
# --seed--
## --seed-contents--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
number = int(digit) * 2
if number >= 10:
number = (number // 10) + (number % 10)
sum_of_even_digits += number
total = sum_of_odd_digits + sum_of_even_digits
print(total)
return total % 10 == 0
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
--fcc-editable-region--
if verify_card_number(translated_card_number):
print('VALID!')
else:
print('INVALID!')
main()
```
@@ -0,0 +1,115 @@
---
id: 656880227dab4bd8fbc02d41
title: Step 35
challengeType: 20
dashedName: step-35
---
# --description--
Well done on completing this project.
As a final step, remove the `print` call from the `verify_card_number` function, and change the `card_number` back to something valid.
# --hints--
You should not have a `print` call within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
const no_comments = __helpers.python.removeComments(function_body);
assert.notMatch(no_comments, /print\(/);
}
})
```
You should change `card_number` back to something valid.
```js
({
test: () => {
const spyCode = "a = ''\ndef printSpy(*x):\n global a\n a = str(x)\n" + code.replaceAll("print(", "printSpy(") + "\na";
const out = __pyodide.runPython(spyCode);
assert.notInclude(out, "INVALID!");
assert.include(out, "VALID!");
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
number = int(digit) * 2
if number >= 10:
number = (number // 10) + (number % 10)
sum_of_even_digits += number
total = sum_of_odd_digits + sum_of_even_digits
print(total)
return total % 10 == 0
def main():
card_number = '4111-1111-4555-1141'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
if verify_card_number(translated_card_number):
print('VALID!')
else:
print('INVALID!')
main()
--fcc-editable-region--
```
# --solutions--
```py
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[::-1]
odd_digits = card_number_reversed[::2]
for digit in odd_digits:
sum_of_odd_digits += int(digit)
sum_of_even_digits = 0
even_digits = card_number_reversed[1::2]
for digit in even_digits:
number = int(digit) * 2
if number >= 10:
number = (number // 10) + (number % 10)
sum_of_even_digits += number
total = sum_of_odd_digits + sum_of_even_digits
return total % 10 == 0
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
if verify_card_number(translated_card_number):
print('VALID!')
else:
print('INVALID!')
main()
```
@@ -0,0 +1,59 @@
---
id: 6569b831a07d7154c793301b
title: Step 7
challengeType: 20
dashedName: step-7
---
# --description--
Define a function `verify_card_number` with a parameter `card_number`, and use the `pass` keyword to make the function do nothing.
# --hints--
You should have a function called `verify_card_number` with a parameter called `card_number`.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
assert.exists(verify_card_number);
const { function_parameters } = verify_card_number;
assert.equal(function_parameters.trim(), "card_number");
}
})
```
You should use the `pass` keyword in the body of the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
assert.exists(verify_card_number);
const { function_body } = verify_card_number;
assert.match(function_body, / +pass/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
print(translated_card_number)
main()
```
@@ -0,0 +1,49 @@
---
id: 656b4638cb8bcf2729afe9a9
title: Step 11
challengeType: 20
dashedName: step-11
---
# --description--
Print the value of the `card_number_reversed` variable to the console.
# --hints--
You should have `print(card_number_reversed)` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /print\(\s*card_number_reversed\s*\)/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[0:4]
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
print(translated_card_number)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,50 @@
---
id: 656b475b394390334828eb12
title: Step 12
challengeType: 20
dashedName: step-12
---
# --description--
Change `card_number_reversed` to be every second digit of the first four digits of `card_number`.
# --hints--
You should have `card_number_reversed = card_number[0:4:2]` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /card_number_reversed\s*=\s*card_number\[0:4:2\]/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[0:4]
print(card_number_reversed)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
print(translated_card_number)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,58 @@
---
id: 656b47dc2cf39e37025dc033
title: Step 13
challengeType: 20
dashedName: step-13
---
# --description--
Reverse the order of the digits in the last four digits of `card_number`, by using a slice with a step of `-1`. You can use either negative or positive indices for the start and end indices.
# --hints--
You could have `card_number_reversed = card_number[-1:-5:-1]` within the `verify_card_number` function. Expected `--fcc-actual--` to equal `--fcc-expected--`.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body, def } = verify_card_number;
const pyCode = `
card_number = "4111111145551142"
${def}
${function_body.match(/ +/)[0]}return card_number_reversed
verify_card_number(card_number)
`;
const out = __pyodide.runPython(pyCode, {});
assert.equal(out, "2411");
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[0:4:2]
print(card_number_reversed)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
print(translated_card_number)
verify_card_number(translated_card_number)
main()
```
@@ -0,0 +1,57 @@
---
id: 656b481ec4976439565a78b2
title: Step 14
challengeType: 20
dashedName: step-14
---
# --description--
Just as the step is optional, a start at `0` and an end at the end of the slice are optional:
```python
my_string = 'camperbot'
camperbot = my_string[::]
```
Assign the reverse of the full `card_number` string to the `card_number_reversed` variable.
# --hints--
You should have `card_number_reversed = card_number[::-1]` within the `verify_card_number` function.
```js
({
test: () => {
const transformedCode = code.replace(/\r/g, "");
const verify_card_number = __helpers.python.getDef("\n" + transformedCode, "verify_card_number");
const { function_body } = verify_card_number;
assert.match(function_body, /card_number_reversed\s*=\s*card_number\[::-1\]/);
}
})
```
# --seed--
## --seed-contents--
```py
--fcc-editable-region--
def verify_card_number(card_number):
sum_of_odd_digits = 0
card_number_reversed = card_number[-1:-5:-1]
print(card_number_reversed)
--fcc-editable-region--
def main():
card_number = '4111-1111-4555-1142'
card_translation = str.maketrans({'-': '', ' ': ''})
translated_card_number = card_number.translate(card_translation)
print(translated_card_number)
verify_card_number(translated_card_number)
main()
```