mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-05-28 18:26:54 +00:00
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:
@@ -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": [
|
||||
|
||||
+10
@@ -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.
|
||||
+157
@@ -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"
|
||||
}
|
||||
+54
@@ -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--
|
||||
```
|
||||
+50
@@ -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--
|
||||
```
|
||||
+65
@@ -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--
|
||||
```
|
||||
+61
@@ -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--
|
||||
```
|
||||
+40
@@ -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--
|
||||
```
|
||||
+40
@@ -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--
|
||||
```
|
||||
+46
@@ -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()
|
||||
```
|
||||
+78
@@ -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()
|
||||
```
|
||||
+59
@@ -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()
|
||||
```
|
||||
+50
@@ -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()
|
||||
```
|
||||
+49
@@ -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()
|
||||
```
|
||||
+47
@@ -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()
|
||||
```
|
||||
+48
@@ -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()
|
||||
```
|
||||
+68
@@ -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()
|
||||
```
|
||||
+47
@@ -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()
|
||||
```
|
||||
+89
@@ -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()
|
||||
```
|
||||
+52
@@ -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()
|
||||
```
|
||||
+54
@@ -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()
|
||||
```
|
||||
+75
@@ -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()
|
||||
```
|
||||
+56
@@ -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()
|
||||
```
|
||||
+73
@@ -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()
|
||||
```
|
||||
+72
@@ -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()
|
||||
```
|
||||
+73
@@ -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()
|
||||
```
|
||||
+61
@@ -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()
|
||||
```
|
||||
+89
@@ -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()
|
||||
```
|
||||
+77
@@ -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()
|
||||
```
|
||||
+70
@@ -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()
|
||||
```
|
||||
+90
@@ -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()
|
||||
```
|
||||
+62
@@ -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()
|
||||
```
|
||||
+115
@@ -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()
|
||||
```
|
||||
+59
@@ -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()
|
||||
```
|
||||
+49
@@ -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()
|
||||
```
|
||||
+50
@@ -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()
|
||||
```
|
||||
+58
@@ -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()
|
||||
```
|
||||
+57
@@ -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()
|
||||
```
|
||||
Reference in New Issue
Block a user